diff options
Diffstat (limited to 'addressbook')
183 files changed, 0 insertions, 78151 deletions
diff --git a/addressbook/.cvsignore b/addressbook/.cvsignore deleted file mode 100644 index 09980ae6ba..0000000000 --- a/addressbook/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -.deps -.libs -Makefile -Makefile.in -*.lo -*.la diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog deleted file mode 100644 index 3a25efbec6..0000000000 --- a/addressbook/ChangeLog +++ /dev/null @@ -1,6759 +0,0 @@ -2004-10-15 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/widgets/e-addressbook-view.c : add EAB_POPUP_SELECT_ANY - mask instead of EAB_POPUP_SELECT_MANY, so that - all the options like Save as, Forward etc are enabled even - single contact is selected. - -2004-10-15 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/widgets/eab-contact-display.c : uncomment - HANDLE_MAILTO_INTERNALLY define so that we will - launch composer through bonobo instead of using - gnome_url_show - -2004-10-15 Not Zed <NotZed@Ximian.com> - - * gui/widgets/eab-popup.c: added an any select mask and updated - the hook maps. - - * gui/component/addressbook-component.c - (addressbook_component_init): register the addressbook hooks. - - * gui/component/addressbook-view.c (addressbook_view_init): setup - the menu manager. - (control_activate_cb): activate the menu manager. - (update_command_state): and update the menu manager. - - * gui/widgets/eab-menu.[ch]: Added menu manager class. - -2004-10-13 JP Rosevear <jpr@novell.com> - - * importers/evolution-vcard-importer.c: find source selector and - option menu in libedataserverui - - * importers/evolution-ldif-importer.c: ditto - - * gui/widgets/eab-popup.c: ditto - - * gui/widgets/eab-gui-util.c: ditto - - * gui/contact-list-editor/e-contact-list-editor.c: ditto - - * gui/contact-editor/e-contact-editor.c: ditto - - * gui/component/select-names/e-select-names.h: ditto - - * gui/component/autocompletion-config.c: ditto - - * gui/component/addressbook-view.c: ditto - -2004-10-11 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook-view.c (source_list_changed_cb): Don't - unref the view - removing it from the hash table will do this for us. - Remove from hash table after removing the notebook page. - (addressbook_view_init): Unref views when removed from the hash - table. - -2004-10-06 Not Zed <NotZed@Ximian.com> - - * gui/component/addressbook-view.c (popup_event_callback): - * gui/component/select-names/e-select-names.c (section_right_click_cb): - * gui/widgets/e-addressbook-view.c (do_popup_menu): fix for - e-popup api changes. Moved all mask specifiers to visible rather - than enable in the menu table. - -2004-10-06 Not Zed <NotZed@Ximian.com> - - * gui/contact-editor/e-contact-editor.c: removed - gnome-popup-menu.h (unused). - - * gui/widgets/e-addressbook-reflow-adapter.c: - * gui/widgets/eab-popup-control.c: remove e-popup-menu.h (unused). - - * gui/component/select-names/e-select-names.c - (section_right_click_cb): use e-popup. Somewhat overengineered - for this use ... - (remove_cb): api changes. - - * gui/widgets/eab-popup.c (eab_popup_target_new_select_names): - added pretty useless wrapper for the select names popup. Added to - hook maps. - -2004-10-01 Not Zed <NotZed@Ximian.com> - - * gui/widgets/e-addressbook-view.c (do_popup_menu): convert to - using EABPopup. - (sources): remove dead code. - (has_email_address_1, get_has_email_address): removed now - redundant code. - (save_as, send_as, send_to, print, copy, paste, cut, delete) - (copy_to_folder, move_to_folder, new_card, new_list): new api. - (free_popup_info): dead. - (print_envelope): not pining. - (get_contact_list): take a popup target instead, don't ref. - (get_contact_list_1): not required no more. - (contact_and_book_free): same. - (delete): call eab_view_delete_selection. - (eab_view_delete_selection): do the actual delete here. - - * gui/widgets/eab-popup.c (eab_popup_target_new_select): implement. - -2004-10-01 Not Zed <NotZed@Ximian.com> - - * gui/widgets/eab-popup.[ch]: addressbook popup driver. - - * gui/component/addressbook-view.c (delete_addressbook_cb): use - e-error for the message prompt. don't bother keeping it around, - it can never be re-sensitised anyway. - (book_removed): no longer destroy the original dialogue. - - * addressbook-errors.xml: add ask-delete for deleting - addressbooks. - - * gui/component/addressbook-view.c (addressbook_view_init): - connect to popup_event rather than fill_popup_menu now. - (fill_popup_menu_callback): renamed to popup_event_callback, - changed to use epopup. - (add_popup_menu_item): remove, no longer needed. - -2004-09-29 Not Zed <NotZed@Ximian.com> - - Fixes bug #66520. - - * gui/widgets/e-addressbook-view.c (eab_view_dispose): don't unref - the contact_display_window, it will be destroyed by being - parented. - -2004-09-29 Hans Petter Jansson <hpj@ximian.com> - - Fixes bug #66369. - - * util/eab-book-util.c (eab_contact_list_from_string): Make the - vcard splitter work with any amount of blank lines between vcards. - -2004-09-29 Hans Petter Jansson <hpj@ximian.com> - - Fixes bug #65537. - - * gui/merging/eab-contact-compare.c (query_cb): Protect against NULL - UIDs, and make fewer calls to e_contact_get_const () as a bonus. - -2004-09-24 Hao Sheng <hao.sheng@sun.com> - - Fix for #66523 - - * gui/contact-list-editor/e-contact-list-model.c: - (e_contact_list_model_add_email): estimate the same mail address - and popup a warning dialog. - * addressbook-errors.xml: add the question message for the warning - dialog. - -2004-09-23 Pamplona Hackers <gnome-desarrollo@es.gnome.org> - - Fixes #61978 - - * tools/evolution-addressbook-export.c (main): use more - meaningful error message. - -2004-09-23 Fazlu & Hannah <hannah_lins@yahoo.co.in> - - * tools/evolution-addressbook-export.c (main): - Changed the string into proper grammar 'In normal mode, there - should not need size option.' to 'In normal mode, there is no need - for the size option.' - -2004-09-23 JP Rosevear <jpr@novell.com> - - * conduit/address-conduit.c (ecard_from_remote_record): only set - the file as address to the company if no full name exists - (delete_record): don't bail out if the record simply isn't found - - Fixes #59725 - - * conduit/address-conduit.c (local_record_from_uid): remove - extraneous semicolon - -2004-09-21 William Jon McCann <mccann@jhu.edu> - - * gui/component/component-factory.c (factory): Quiet debug messages. - - * gui/widgets/e-addressbook-view.c (eab_view_new): Remove - unnecessary label widget placeholder. Make vertical scrollbar - policy automatic. Use gtk_paned_add2 instead of - gtk_container_add. - - * gui/component/apps_evolution_addressbook.schemas.in.in: Add - missing show_preview schema. Add missing long descriptions. - -2004-09-13 Rodney Dawes <dobey@novell.com> - - * gui/contact-editor/e-contact-editor.c (show_help_cb): - Point at the correct XML file for documentation - -2004-09-13 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/contact-editor/e-contact-editor.c - (sensitize_address) : check for _LABEL - type address fields also in supported fileds - while sensitizing the address fields - -2004-09-03 JP Rosevear <jpr@novell.com> - - Fixes #63191 - - * gui/contact-list-editor/contact-list-editor.glade: set the title - properly - -2004-09-08 Not Zed <NotZed@Ximian.com> - - ** See bug #64080. - - * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD): - link addressbook to camel. - -2004-09-04 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/widgets/e-addressbook-view.h : add - new widget variable contact_dsiplay_window to _EABView strcut - to store. Remove unused scrolled varible - * gui/widgets/e-addressbook-view.c (eab_view_init) - (eab_view_dispose) : initialize and unref the new widget - added - (eab_view_new) : remove the loca variable scrlled_window - instead use eav->contact_display_window - (eab_view_show_contact_preview) : show/hide contact_display_window - instead of contact_display - Fixes #64024 - - -2004-08-27 Not Zed <NotZed@Ximian.com> - - ** See bug #62856 (workaround). - - * gui/component/addressbook.c (addressbook_authenticate): add - online flag to password request. - - ** See bug #64011. - - * gui/component/addressbook-view.c (edit_addressbook_cb): Remove - double ;; in declaration section (c99 extension). From Vincent - Noel <vnoel@cox.net>. - -2004-08-26 Hans Petter Jansson <hpj@ximian.com> - - Really fixes #61833 and #63697. - - * gui/component/select-names/e-select-names.etspec: Fetch values from - column 86 (NAME_OR_ORG), instead of 2 (FILE_AS). - -2004-08-26 Chris Toshok <toshok@ximian.com> - - [ patch for the rest of 60889 ] - * gui/merging/eab-contact-merging.c (add_lookup): new function, - either start up the query or add it to the queue if we're over the - number of simultaneous queries. - (finished_lookup): start up enough pending queries to get us to - our limit again. - (free_lookup): free lookup->avoid. - (final_id_cb): call finished_lookup. - (eab_merging_book_add_contact): set lookup->avoid to NULL and - replace call to eab_contact_locate_match_full with add_lookup. - (eab_merging_book_commit_contact): set lookup->avoid to the - contact, and make the same - s/eab_contact_locate_match_full/add_lookup/ replacement. - -2004-08-26 Christian Neumair <chris@gnome-de.org> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: - Don't mark component menu accel for translation. - -2004-08-25 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/component/addressbook-config.c (source_to_dialog) : - disbale the display name widget in case of groupwise as we can not handle renames as - of now - (dialog_to_source) also copy "use_ssl" property to new source so that - new books also use ssl - -2004-08-25 Hans Petter Jansson <hpj@ximian.com> - - May fix #61833. - - * gui/component/select-names/e-select-names-table-model.c - (fill_in_info): Get E_CONTACT_NAME_OR_ORG (first found from File As, - Full Name, Organization, Email 1) for the "name" field. Hopefully - will prevent most cases of blank entries. - -2004-08-25 Frederic Crozat <fcrozat@mandrakesoft.com> - - * gui/component/addressbook-view.c: (delete_addressbook_cb): - Don't call gtk_dialog_set_has_separator on Gtk Message Dialog - with GTK+ >= 2.4.0. - -2004-08-20 Chris Toshok <toshok@ximian.com> - - * gui/component/component-factory.c (factory): remove the dead - ldap config control stuff. - -2004-08-20 Hans Petter Jansson <hpj@ximian.com> - - Fixes bug #62715. - - * gui/contact-editor/e-contact-editor.c - (fill_in_address_label_textview): Implement. - (fill_in_address_field): If structured address information is not - available, try putting the "label" blob in the free-form field. - -2004-08-19 Hans Petter Jansson <hpj@ximian.com> - - Makes the contact image selector use GtkFileChooser if available. - - * gui/contact-editor/e-contact-editor.c (image_selected_cb): Take just - the editor as an argument, so we can call from other places without - having to supply dummy args. Rename to image_selected, since it's no - longer strictly a callback. Include optional code to use the new - GtkFileChooser. - (image_cleared_cb): Ditto. Rename to image_cleared. - (file_chooser_response): Optional response handling for GtkFileChooser. - (image_clicked): Include optional code to use the new GtkFileChooser. - Move common strings to variables. For GtkFileSelection, swap callback - parameters for the modified image_selected () and image_cleared (). - -2004-08-19 Chris Toshok <toshok@ximian.com> - - [ likely fixes #61500 ] - * addressbook-errors.xml (remove-addressbook): remove the - secondary text, since we don't have the gerror text to supply it - anymore. - - * gui/component/addressbook-view.c (book_removed): new function, - move the error handling here. - (delete_addressbook_cb): create a closure with necessary data, and - call the e_book_async_remove instead of e_book_remove. - -2004-08-18 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/component/select-names/e-select-names.c (e_select_names_init) : - select names dialog can not be modal as password dialogs can come up while - user is in this dialog for address books which require authentication - like groupwise and LDAP - FIxes #63257 - -2004-08-11 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (app_delete_event_cb): - Remove the custom prompt-to-save dialogs from here - use - eab_prompt_save_dialog (), and then only if the contact actually - changed. - -2004-08-16 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-gui-util.c (eab_show_multiple_contacts): - reinstate the ngettext patch that was part of the #53464 commit of - 2004-03-24 by dsegan@gmx.net. - -2004-08-12 Carlos Garnacho Parro <carlosg@gnome.org> - - * gui/widgets/eab-gui-util.c: Optionally use GtkFileChooser if - compiled against Gtk+ >= 2.4.0 - -2004-08-10 Not Zed <NotZed@Ximian.com> - - * gui/component/addressbook.c (addressbook_authenticate): e - passwords api change/reprompt if we need to. - -2004-08-12 Sivaiah nallagatla <snallagatla@novell.com> - - * gui/compoent/addressbook.c : just revering a local change - gone in in the commit i just made - -2004-08-12 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/component/addresbook.c (load_source_auth_cb) : - when user cancels auth dialog send the anonoymous query - only in case of ldap - *gui/component/addresbook-view.c (book_open_cb) : no need to - display the error dialog when user cancels that - -2004-08-04 Rodney Dawes <dobey@novell.com> - - * gui/widgets/eab-popup-control.c: #include <gtk/gtkvbox.h> - -2004-08-02 Hans Petter Jansson <hpj@ximian.com> - - Fixes #60529. - - * gui/contact-list-editor/e-contact-list-editor.c - (table_drag_drop_cb): Make sure to get the text/x-vcard target. - -2004-08-02 Hans Petter Jansson <hpj@ximian.com> - - Fixes #62085. - - * gui/contact-list-editor/e-contact-list-editor.c - (e_contact_list_editor_class_init): Set the save_contact method. - (e_contact_list_editor_save_contact): Implement. - -2004-08-02 JP Rosevear <jpr@novell.com> - - * conduit/address-conduit.c (addrconduit_load_configuration): get - source uid - (addrconduit_dupe_configuration): copy source_uid - (addrconduit_destroy_configuration): free source_uid - (e_addr_context_new): get the source list - (e_addr_context_destroy): unref the source list - (pre_sync): open the source that was set earlier - (fill_widgets): set the source option menu value - (create_settings_window): pass source list to pilot settings - (save_settings): save source uid - - * conduit/Makefile.am: link to and include misc. widgets - -2004-08-02 Rodney Dawes <dobey@novell.com> - - * gui/component/ldap-config.glade: Make the main dialog here be - an actual GtkDialog instead of a GtkWindow - Fix up a few small spacing issues with the UI - Change "Contacts Group" to "Address Book" - - * gui/component/addressbook-config.c (query_for_supported_bases): - Use gtk_widget_ensure_style instead of gtk_widget_realize - (addressbook_add_server_dialog): - Use gtk_widget_ensure_style on the dialog and fix the spacing and - border width of the dialog containers - - Fixes #61365 - -2004-07-30 Chris Toshok <toshok@ximian.com> - - [ fixes #61365 and other misc issues with the addressbook source - editors ] - - * gui/component/ldap-config.glade: change the - supported-bases-dialog to be initially hidden. - - * gui/component/addressbook-view.c (editor_weak_notify): new - function, remove the editor from our hash. - (source_list_changed_cb): destroy the editors for given sources if - they're up when the source disappears. - (edit_addressbook_cb): add the editor (and some other misc info we - need) to our uid_to_editor hash so we can look it up later. only - create the editor if one doesn't exist for the given source. - (destroy_editor): GHFunc that destroys the widgets. - (addressbook_view_dispose): destroy uid_to_editor. - (addressbook_view_init): init uid_to_editor. - - * gui/component/addressbook-config.h: change return values for - _edit_source and _new_source - they both return GtkWidget*s now. - - * gui/component/addressbook-config.c (addressbook_ldap_init): - attempt set the protocol version to LDAPv3. This makes the - ldap_auth stuff work if the server requires v3. - (addressbook_root_dse_query): we don't need the separate window - arg, since all of this now happens *before* the supported bases - dialog is shown. we just use the source dialog's window for the - various error dialogs. - (do_ldap_root_dse_query): same. - (query_for_supported_bases): same, and set the supported bases - dialog as transient-for the source dialog, and make it modal. - Lastly, don't make the editor modal. - (addressbook_config_edit_source): return the editor's window. - (addressbook_config_create_new_source): same. - -2004-07-26 JP Rosevear <jpr@novell.com> - - * gui/component/ldap-config.glade: change contacts group to - address book - - * gui/component/addressbook-component.c - (impl__get_userCreatableItems): ditto - -2004-07-19 Radek Doulik <rodo@ximian.com> - - * gui/widgets/eab-vcard-control.c (eab_vcard_control_new): but - buttons to button box, use vbox instead of table - - * gui/widgets/eab-contact-display.c: base this widget directly on - gtkhtml - - * gui/widgets/e-addressbook-view.c (eab_view_new): put contact - display in scrolled window - -2004-07-20 Not Zed <NotZed@Ximian.com> - - * gui/widgets/eab-contact-display.c: - * gui/contact-editor/eab-editor.c: - * gui/component/addressbook-migrate.c: include config.h #61395. - -2004-07-21 Chris Toshok <toshok@ximian.com> - - [ fixes #60508 ] - - * gui/component/addressbook-config.h: reorder the Scopes so that - they match the option menu. - - * gui/component/ldap-config.glade: change the scope option menu to - only display One and Sub, and also set the Login field to Lo_gin - in both dialogs. Add accelerators for the details page as well. - -2004-07-21 Rodney Dawes <dobey@novell.com> - - * gui/contact-editor/contact-editor.glade: - Give a reasonable name to the widget for the _Where label - - * gui/contact-editor/e-contact-editor.c (e_contact_editor_init): - Set the mnemonic widget for the _Where label - - Fixes #61544 - -2004-07-20 JP Rosevear <jpr@novell.com> - - * gui/component/autocompletion-config.c - (autocompletion_config_control_new): don't set the toggle - selection - -2004-07-16 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (contact_added_cb) - (save_contact) - (app_delete_event_cb): Check source book writeability directly instead - of relying on stored state. - (e_contact_editor_init): Don't init source_editable. - (e_contact_editor_dispose): We don't listen for source writeability - anymore. - (writable_changed): Source writeability doesn't affect widget - status; remove code to check for it. - (e_contact_editor_set_property): Do nothing if book being set is - the same as currently set book; previously we would end up - unreffing then reffing it. Don't watch for source writeability, but - do so for target; fixes a warning. Only call sensitize_all() if - writeability on target changed. - - * gui/contact-editor/e-contact-editor.h (EContactEditor): We don't - need the source_editable and source_editable_id vars anymore. - -2004-07-14 Chris Toshok <toshok@ximian.com> - - [ fixes #60873, and possibly other crashes ] - - * gui/widgets/e-addressbook-model.c (get_view): don't call - free_data before potentially making an async call. Or rather, - don't call free_data without ensure we'll be emitting - MODEL_CHANGED shortly after. - -2004-07-14 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/.cvsignore: ignore - Evolution-Addressbook-SelectNames.h. - - * gui/contact-list-editor/e-contact-list-editor.c: include our - local (in this directory) generated - Evolution-Addressbook-SelectNames.h - - * gui/contact-list-editor/Makefile.am: add stuff to generate (and - clean up) the select names header we need to include. - -2004-07-13 Rodney Dawes <dobey@novell.com> - - [ fixes #56657 ] - - * gui/component/addressbook-migrate.c (get_source_by_uri): - Replace this call with get_source_by_name () - (migrate_completion_folders): Fix the non-local folder migration - to look up sources for the migrated folders based on name, instead - of using the URI - -2004-07-12 Chris Toshok <toshok@ximian.com> - - [ fixes #61299 ] - - * gui/component/addressbook.c (addressbook_load_default_book): - don't pass @closure to load_source_cb, since that expects to get a - LoadSourceData*. also, don't always call e_book_async_open. only - do that when the book is non-NULL. - -2004-07-12 Chris Toshok <toshok@ximian.com> - - [ part of fix for bug #56520 ] - - * gui/contact-list-editor/e-contact-list-editor.c - (e_contact_list_editor_init): init allows_contact_lists to TRUE. - (list_deleted_cb): nuke, it's unused. - (e_contact_list_editor_set_property): check if the book supports - contact lists, and desensitize things if it doesn't. - (select_names_ok_cb): this isn't valid C. declarations must come - before code. - (set_editable): the editable state of the dialog depends on - whether or not the backend supports contact lists. - (command_state_changed): the ok button needs to depend on - allows_contact_lists. - (extract_info): quiet compiler warning. - - * gui/contact-list-editor/e-contact-list-editor.h (struct - _EContactListEditor): add allow_contact_lists. - -2004-07-08 Frederic Crozat <fcrozat@mandrakesoft.com> - - * gui/component/Makefile.am: - tarball should ship .schemas.in.in files, not generated files. - - * gui/component/apps_evolution_addressbook.schemas.in.in: - Don't set empty default value on an int, this causes gconf warning. - (bug #60859) - -2004-09-04 Not Zed <NotZed@Ximian.com> - - * util/e-destination.c: include gnome-i18n.h since camel-object no - longer does(!). - -2004-07-02 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c - (command_state_changed): Set the source option menu sensitivity here. - -2004-06-30 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c - (e_contact_editor_dispose): disconnect source/target_editable - signal ids. - (e_contact_editor_set_property): disconnect/connect editable - signals. - (writable_changed): new function - we need this since writable - status is generally communicated asynchronously with the async - interface. - - * gui/contact-editor/e-contact-editor.h (struct _EContactEditor): - add source/target_editable_id slots. - -2004-06-29 Rodney Dawes <dobey@novell.com> - - * tools/Makefile.am (bin_PROGRAMS): Change to privlibexec_PROGRAMS - - Fixes #60832 - -2004-06-28 Not Zed <NotZed@Ximian.com> - - * gui/component/addressbook-component.c - (impl__get_userCreatableItems): fix shortcuts. #56746 - -2004-06-25 Hans Petter Jansson <hpj@ximian.com> - - * gui/meging/eab-contact-compare.[ch] (eab_contact_compare_file_as): - Implement. - (eab_contact_compare_name): Don't leak if only one of the strings is - NULL. - (use_common_book_cb): Include file_as in query. - -2004-06-25 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (fill_in_address_textview): Add - a newline between street line and rest of extended address. - (extract_address_textview): Omit the newline trailing the street line. - -2004-06-24 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (address_labels): Add table. - (append_to_address_label): Implement. - (set_address_label): Implement. - (extract_address_record): Set the address label fields. - -2004-06-24 Hans Petter Jansson <hpj@ximian.com> - - * util/eab-book-util.c (eab_contact_list_from_string): Don't accept - input that doesn't have at least a "BEGIN:VCARD" in it. - -2004-06-24 Radek Doulik <rodo@ximian.com> - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_get_textification): do not limit the text - len to 2047 characters - - See bug #60366 - -2004-06-23 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/contact-editor.glade: Set window to be invisible - initially. - - * gui/contact-editor/e-contact-editor.c (e_contact_editor_init): Set - the type hint to "normal", and show the window after init. - -2004-06-23 Not Zed <NotZed@Ximian.com> - - * gui/widgets/eab-gui-util.c - (eab_send_contact_list_as_attachment): use memcpy not strcpy to - copy to memory buffer. Fixes a UMW. See #60532. - -2004-06-23 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook-view.c: Add an x-source-vcard target entry - that includes the source book URI. - (destroy_merge_context): Implement. - (removed_contact_cb): Implement. - (merged_contact_cb): Implement. - (selector_tree_drag_data_received): Get the source and target books, - and see if we need to remove contacts from source after they're added - to target. Copy contacts sequentially, not in parallel, with a - callback. - - * gui/widgets/e-addressbook-view.c: Add an x-source-vcard target entry - that includes the source book URI. - (table_drag_data_delete): Remove. This is handled by the drag target. - (table_drag_data_get): Handle more than one contact. Supply source. - (create_table_view): Don't connect to the delete signal. - - * gui/widgets/e-minicard-view.c: Add an x-source-vcard target entry - that includes the source book URI. - (e_minicard_view_drag_data_delete): Remove. This is handled by the - drag target. - (e_minicard_view_drag_data_get): Handle x-source-vcard target. - (e_minicard_view_drag_begin): Don't connect to the delete signal. - (e_minicard_view_dispose): Don't disconnect from the delete signal. - (e_minicard_view_init): Don't init delete_id. - - * gui/widgets/e-minicard-view.h: Remove delete_id from struct. - - * util/eab-book-util.[ch] (eab_contact_list_from_string): Skip the - source URI if present. - (eab_book_and_contact_list_from_string): Create the source book from - the provided URI, if present. - (eab_book_and_contact_list_to_string): Include the book URI in - generated string. - -2004-06-23 Rodney Dawes <dobey@novell.com> - - * gui/component/select-names/select-names.glade: - Move the search bar to the top and add a label _Search so that the - entry has a mnemonic for keyboard accessibility - - Fixes #52914 and #58448 - -2004-06-22 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/contact-editor.glade: Name the labels. - - * gui/contact-editor/e-contact-editor.c (sensitize_email_record) - (sensitize_phone_record) - (sensitize_im_record) - (sensitize_address_textview) - (sensitize_address_field) - (simple_field_map) - (sensitize_simple_field): Make entries uneditable and labels - insensitive, if field is disabled or read-only. - -2004-06-22 Hans Petter Jansson <hpj@ximian.com> - - Fixes #59622. - - * gui/widgets/e-minicard-view.c (e_minicard_view_init): Clear drag_list - and canvas_drag_data_delete_id. - (e_minicard_view_dispose): Clear drag_list. Disconnect drag_data_delete - signal if connected. - (e_minicard_view_drag_begin): Set up drag_data_delete signal if - necessary. Clear old data before drag starts. - (clear_drag_data): Implement. - (e_minicard_view_drag_data_delete): Implement. - (e_minicard_view_drag_data_get): Don't clear drag_list here. - -2004-06-22 Chris Toshok <toshok@ximian.com> - - [ should fix #60495, #58635 ] - * gui/widgets/eab-popup-control.c (name_only_query_cb): don't free - the list of contacts - libebook still owns it. - (query_cb): same. - -2004-06-22 Larry Ewing <lewing@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c (add_email_cb): - don't set the changed flag unless we actually add something. - -2004-06-21 Federico Mena Quintero <federico@ximian.com> - - * gui/contact-editor/contact-editor.glade: Make the scrolled - windows around text views use GTK_SHADOW_IN, for consistency with - the GtkEntries. - -2004-06-21 Chris Toshok <toshok@ximian.com> - - * gui/component/ldap-config.glade: remove the auth-entry-notebook - in the edit dialog, and rename the auth entry to... auth-entry. - - * gui/component/addressbook-config.c (source_to_dialog_new): nuke - - it's identical to source_to_dialog. - (dialog_to_source): we only have one auth entry now. fill it in - properly. - (source_to_dialog): fill in the auth entry properly based on the - auth type, and remove auth_entry_notebook references. - (auth_optionmenu_activated): remove auth_entry_notebook - references. - (setup_general_tab): same, and use auth-entry instead of - email-entry/dn-entry. - (general_tab_check): use auth_principle instead of email/binddn. - (add_folder_modify): same. - (addressbook_add_server_dialog): put setup_connecting_tab inside - the ifdef HAVE_LDAP, and call source_to_dialog instead of - source_to_dialog_new. - (addressbook_config_edit_source): always call setup_general_tab. - - * gui/component/addressbook-config.h (AddressbookLDAPScopeType): - reorder to match order in option menu (we should really remove - BASE altogether.. it's useless for searching.) - - * gui/component/addressbook-view.c (update_command_state): - macroize this, annoying seeing the same 4 lines repeated 15 times. - -2004-06-21 Jeffrey Stedfast <fejj@novell.com> - - * conduit/address-conduit.c (local_record_from_uid): Make sure the - UIDs match. Should fix bug #59725. - -2004-06-19 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/component/addressbook-config.c (dialog_to_source) : - set auth-domain property on groupwise sources, so that - newly created contact groups can share remembered passwords - -2004-06-18 Jeffrey Stedfast <fejj@novell.com> - - * conduit/address-conduit.c (ecard_from_remote_record): Always set - the File_As attribute in case the pilot attrib changed. Fixes bug - #59723. - -2004-06-18 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_load_contacts): only go through the process - of creating/loading the EBook if the model has some data in it. - -2004-06-18 Chris Toshok <toshok@ximian.com> - - [ fixes bug #59376 ] - - * gui/component/addressbook-view.c (fill_popup_menu_callback): - make this work with absolute uris in sources. Thanks to Sushma - Rai for the initial patch to fix this. - -2004-06-17 Chris Toshok <toshok@ximian.com> - - [ fixes bug #58696 ] - - * gui/widgets/eab-gui-util.c (eab_transfer_contacts): use - addressbook_load instead of e_book_async_open, so we do auth stuff - for the destination book. - -2004-06-17 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (e_contact_editor_new): - EBookFieldsCallback -> EBookEListCallback. - (e_contact_editor_set_property): same. - -2004-06-17 Chris Toshok <toshok@ximian.com> - - * util/eab-book-util.c (eab_name_and_email_query): - EBookContactsCallback -> EBookListCallback. - (eab_nickname_query): same. - - * printing/e-contact-print.c: e-book-async.h -> e-book.h - - * gui/widgets/eab-vcard-control.c: e-book-async.h -> e-book.h. - - * gui/widgets/e-addressbook-model.h: e-book-async.h -> e-book.h. - - * gui/widgets/eab-popup-control.h: e-book-async.h -> e-book.h. - - * gui/widgets/eab-popup-control.c: remove e-book-async.h include. - - * gui/merging/eab-contact-merging.h: e-book-async.h -> e-book.h. - - * gui/contact-editor/e-contact-editor.h: e-book-async.h -> - e-book.h. - - * gui/contact-editor/e-contact-editor.h: same. - - * gui/contact-list-editor/e-contact-list-editor.h: same. - - * gui/contact-list-editor/e-contact-list-model.h: remove include - of e-book-async.h - - * gui/component/select-names/e-select-names-completion.h: include - e-book.h, not e-book-async.h - - * gui/component/select-names/e-select-names-model.c: same. - - * gui/component/select-names/e-select-names.c: same. - - * gui/component/addressbook-migrate.c: include e-book.h, not - e-book-async.h - - * gui/component/addressbook-view.c: same. - - * gui/component/addressbook.h: same. - - * gui/component/addressbook.c: remove include e-book-async.h. - -2004-06-17 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/widgets/e-addressbook-view.etspec : update - the model column numbers as new fields like E_CONTACT_EMAIL_4 - are added to EContact - Fixes #59621 - -2004-06-16 Not Zed <NotZed@Ximian.com> - - * gui/component/autocompletion-config.c - (autocompletion_config_control_new): set the source selector to be - able to toggle the current selection. Fix for #55614. - -2004-06-16 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/contact-editor/e-contact-editor.c (full_name_clicked) : - compare old and new full names and if it is different set the new - the name using gtk_entry_set_text instead of set_entry_text - as this function blocks siganls hence preventing ok button being - enabled - -2004-06-14 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (extract_im_record): set - things to HOME, since we don't offer TYPE=OTHER IM attributes - through the EContact api, and one choice is just as good as - another if we aren't displaying it anyway. - - * gui/widgets/eab-contact-display.c (render_contact): move the IM - stuff out of home/work, since we don't allow people to edit - location for them anymore. Also, change the IM accounts we look - up to "HOME", since that's what we hardcode them to in the contact - editor. - -2004-06-14 Not Zed <NotZed@Ximian.com> - - * importers/evolution-ldif-importer.c (parseLine): handle LIST - field types. - (ldif_fields[]): Add a list type. E_CONTACT_EMAIL is a list field - type. See #58855. - -2004-06-08 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-model.c (get_view_idle): new - function. do the get_view in an idle handler. - (eab_model_set_property): don't call get_view directly from any - setter block. instead just add the idle handler (if it's not - already added.) This keeps us from duplicating queries when both - "book" and "query" are set using the same g_object_set. - - * gui/widgets/e-addressbook-model.h: add book_view_idle_id. - -2004-06-07 Hans Petter Jansson <hpj@ximian.com> - - Fixes #58921. - - * gui/contact-editor/e-contact-editor.c (extract_address_record): - Also check if the po box field is non-empty. - -2004-06-07 Jon Oberheide <jon@focalhost.com> - - * gui/contact-list-editor/e-contact-list-model.c: disable editing - of cells in the contact table. - -2004-06-07 Hans Petter Jansson <hpj@ximian.com> - - Fixes #57795. - - * gui/component/addressbook-migrate.c (migrate_contacts): Change - the "POSTAL" address in 1.4 to "OTHER" in 1.5. - -2004-06-07 Hans Petter Jansson <hpj@ximian.com> - - * gui/Makefile.am (SUBDIRS): Fix order of dependencies. - -2004-06-07 H P Nadig <hpnadig@pacific.net.in> - - * gui/contact-list-editor/e-contact-list-editor.h: Added few - headers needed for select names dialog. - - * gui/contact-list-editor/e-contact-list-editor.c - (e_contact_list_editor_init): Added select button handler. - (select_cb): The callback function for Select Button. - (setup_corba): To setup corba for select names dialog. - (select_names_ok_cb): Handle Select names dialog entries. - (add_to_model): Adds cards to the model. - - * gui/contact-list-editor/contact-list-editor.glade: New 'Select' - Button. Tooltips added for buttons in button Box. - -2004-06-07 Dan Winship <danw@novell.com> - - * gui/component/addressbook-view.c: s/stock_save_as/stock_save-as/ - -2004-06-04 Larry Ewing <lewing@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c: remove bonobo - menus and cruft add ok/cancel buttons. - - * gui/contact-list-editor/e-contact-list-editor.h: add buttons for - ok/cancel. - - * gui/contact-list-editor/contact-list-editor.glade: add fields for - ok/cancel reparent to GtkDialog, other minor adjustments. - -2004-06-04 JP Rosevear <jpr@novell.com> - - Fixes #55945 - - * importers/*.server.in.in: ditto - - * importers/evolution-ldif-importer.c: fix OAFIIDs - - * importers/evolution-vcard-importer.c: ditto - -2004-06-04 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-model.c - (name_and_email_simple_query_cb): only resolve destinations - against persons, not contact lists. - -2004-06-03 Hans Petter Jansson <hpj@ximian.com> - - Fixes #53643 and #26903. - - * gui/search/addresstypes.xml: category -> category_list - - * gui/search/e-addressbook-search-dialog.c (get_widget): Get - filter rule from parent view. - (eab_search_dialog_set_property): Implement. - (eab_search_dialog_get_property): Impleent. - (eab_search_dialog_class_init): Set up property methods. - (get_query): Get filter rule from parent view. - (eab_search_dialog_init): Don't get the filter widget here, - wait until parent view property is set. - (eab_search_dialog_new): Don't poke the parent view in, set it - as a property instead. - (eab_search_dialog_dispose): No longer needs to unref rule. - - * gui/search/e-addressbook-search-dialog.c: EABSearchDialog no - longer needs to keep rule internally. - - * gui/widgets/Makefile.am: Set SEARCH_RULE_DIR define. - - * gui/widgets/e-addressbook-view.c (eab_view_new): Set up filter - rule and context. - (eab_view_peek_search_context): Implement. - (eab_view_peek_search_rule): Implement. - - * gui/widgets/e-addressbook-view.h: Keep track of filter rule - and context. Add protos for added API. - -2004-06-03 Jeffrey Stedfast <fejj@novell.com> - - * conduit/address-conduit.c (set_status_cleared): Protect against - a NULL uid. Fixes bug #57619. - (ecard_from_remote_record): Set the full_name of the contact so - that we can use that as the FILE_AS rather than the company name, - which sucked. Fixes a bug I may or may not have reported months - ago. Ahah, fixes bug #57620. - -2004-06-02 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook-migrate.c - (migrate_contact_folder_to_source): Add missing negation that caused - a crash. - -2004-06-02 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-migrate.c (addressbook_migrate): - remove hidden field migration, and add in a phase to clear the - absolute_uri properties on ESources. - -2004-06-02 Rodney Dawes <dobey@novell.com> - - * gui/component/addressbook-config.c (focus_help, add_focus_handler): - Don't need these two functions any more - (source_to_dialog, auth_optionmenu_func): - Don't try to change the notebook page or set the widget sensitive, - for a notebook that doesn't exist any more - (reparent_to_vbox): Don't need this function any more, as the - widgets are all contained in the same dialog in the glade now - (setup_general_tab, setup_connecting_tab, setup_searching_tab): - We don't need to do the focus-based "tooltip" stuff any more - We just use tooltips on the widgets now - (ssl_optionmenu_selected, add_ssl_activate_cb): - We don't need the ssl_optionmenu_selected callback any more, as the - tooltips are just set on the necessary widgets now - (query_for_supported_bases): Set the border widths on the dialog's - vbox and action_area to be compliant with the HIG - (addressbook_add_server_dialog): Unref the GConfClient object - (addressbook_config_edit_source): Create the source_list so that - we can actually save the changes that we make here - Create the GladeXML with only the widget subtree that we need to - use here, to avoid popping up other visible dialogs - Set the border widths on the dialog's vbox and action_area to be - compliant with the HIG - We don't need to reparent widgets to vboxes any more, as the widgets - are now part of the dialog's widget tree - If we are without LDAP or not in LDAP mode, then hide the notebook - borders, and change the border size of its child to appear as though - we are a normal non-LDAP dialog - We don't need to set the type hint on the window as we are no a - real GtkDialog - - * gui/component/ldap-config.glade: Update the properties dialogs to - be compliant with the HIG layout - Get rid of some of the extra windows and put their children in the - appropriate places in the properties dialog - Make the properties dialog be a real GtkDialog - - Fixes #41141 - -2004-06-01 Larry Ewing <lewing@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c: Add in a source - option menu to the dialog and make is sensitive only on new lists. - - * gui/contact-list-editor/e-contact-list-editor.h: add load_book - fields for async book loading. - - * gui/contact-list-editor/contact-list-editor.glade: add the new - source selector in a table reorder some of the other widgets. - -2004-05-28 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-contact-display.c (render_contact): render all - email addresses, not just the first 3. - (eab_contact_display_class_init): use a C comment, not C++. - -2004-05-28 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (entry_set_property_fn): call e_select_names_model_load_contacts - after setting text/addresses/destinations. - - * gui/component/select-names/e-select-names-model.c - (name_and_email_simple_query_cb): new function, ripped from the - 1.4 e-destination stuff. - (book_opened): new function, fire off eab_name_and_email_query for - each item in our model (that doesn't represent a contact already). - (e_select_names_model_load_contacts): new function, open the - default addressbook (yeah yeah, i know we should open something - different/more.) - (e_select_names_cancel_contacts_load): new (unimplemented, and how - do we implement it?) function. - - * gui/component/select-names/e-select-names-model.h: add - prototypes for e_select_names_model_load_contacts and - e_select_names_cancel_contacts_load. - - * gui/component/select-names/e-select-names.c (set_book): call - get_query_string and set the book and query in a single call to - g_object_set, just because we can/should. - (update_query): reimplement in terms of get_query_string. - (get_query_string): new function, build up the query string. - - * gui/component/select-names/Makefile.am (INCLUDES): add - $(top_srcdir)/addressbook/util to INCLUDES. - -2004-05-28 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/contact-editor.glade: Add back office, spouse, - web log fields. Allow for 8 phone numbers, of which 4 can be hidden. - - * gui/contact-editor/e-contact-editor.c (phones_default): Add more - defaults. - (im_service_default): Add more defaults. - (expand_phone): Implement. - (fill_in_phone_record): Expand if we have any records past 4. - (init_im_record_location) - (fill_in_im_record) - (extract_im_record) - (sensitize_im_record): Remove location. - (simple_field_map): Add spouse, office, web log. - (expand_phone_toggle): Implement. - (e_contact_editor_init): Hook up expander button. - -2004-05-28 Christophe Fergeau <teuf@gnome.org> - - * gui/component/addressbook-config.c: added missing #ifdef HAVE_LDAP - -2004-05-26 Radek Doulik <rodo@ximian.com> - - * gui/widgets/e-addressbook-view.c (e_contact_print_button): call - gnome_print_beginpage - (e_contact_print_button): call gnome_print_beginpage - - Fixes #58977 - -2004-05-25 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_activate_obj): reenable this function, - in a slightly broken manner. we don't have e_contact_get_book - anymore (well, we never had it really... but we lost - e_card_get_book). load the system addressbook and supply that to - the editors. shouldn't be a problem, since it's a read-only - editor anyway. - -2004-05-25 Chris Toshok <toshok@ximian.com> - - [ fixes #58654 ] - - * gui/component/select-names/e-select-names.c (update_query): - build up the query using e_book_query calls so we're insulated - from field name changes. also, conjoin if we have more than 1 - query element, not more than 2 (i *hope* this was an off by 1 - error...) - -2004-05-25 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/component/addressbook.c (load_source_auth_cb ) - (load_source_auth_cb ) : read the "auth-domain" property - from e-source and use it as the component name for e_password_* - calls if it exists - -2004-05-25 Jeffrey Stedfast <fejj@novell.com> - - * Makefile.am: Generate the addressbook-errors.xml.h file and - install the xml file and all that jazz. - - * addressbook-errors.xml: New error xml file. - - * gui/widgets/e-addressbook-view.c (backend_died): Use - e_error_run(). - - * gui/widgets/eab-gui-util.c (eab_error_dialog): Use - e_error_run(). - (eab_load_error_dialog): Same. - (eab_search_result_dialog): Same. - (eab_prompt_save_dialog): Same. - (save_it): Same. - - * gui/contact-editor/e-contact-editor.c (categories_clicked): Use - e_error_run(). - (e_contact_editor_is_valid): Same. - (save_contact): Same. - - * gui/component/addressbook-view.c (delete_addressbook_cb): Use - e_error_run(). - - * gui/component/addressbook-config.c (addressbook_ldap_init): Use - e_error_run(). - (addressbook_ldap_auth): Same. - (addressbook_root_dse_query): Same. - (do_ldap_root_dse_query): Same. - (do_schema_query): Same. - -2004-05-24 Chris Toshok <toshok@ximian.com> - - * Makefile.am (SUBDIRS): add tools back to the build. - -2004-05-24 Chris Toshok <toshok@ximian.com> - - * tools/Makefile.am: fix this for current build foo. - - * tools/evolution-addressbook-export-list-folders.c, - * tools/evolution-addressbook-export-list-cards.c, - * tools/evolution-addressbook-export.c: revive this. - -2004-05-24 Chris Toshok <toshok@ximian.com> - - [ fixes bug #32194 ] - - * importers/evolution-vcard-importer.c (process_item_fn): make - sure all ADR attributes have HOME/WORK/OTHER. - -2004-05-24 Chris Toshok <toshok@ximian.com> - - [ fixes bug #40013 ] - - * importers/evolution-vcard-importer.c (process_item_fn): for TEL - attribute that don't specify a location (HOME/WORK/OTHER), default - to "OTHER". For TEL attributes that *only* specify a location, - default to "VOICE". - -2004-05-21 H P Nadig <hpnadig@pacific.net.in> - - Fixes #58516. - - * gui/contact-editor/contact-editor.glade: 'Job Title' is now called - 'Title'. - -2004-05-20 Hans Petter Jansson <hpj@ximian.com> - - * importers/evolution-ldif-importer.c (add_to_notes): Add helper - func. - (process_item_fn): Add undisplayed fields to notes. - - * importers/evolution-vcard-importer.c (add_to_notes): Add helper - func. - (process_item_fn): Add undisplayed fields to notes. - -2004-05-20 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook-migrate.c (add_to_notes): Implement. - (migrate_contacts_hidden_fields): Implement. - (migrate_contacts): Copy fields that are now hidden in the UI, - to the notes field. - -2004-05-20 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c (impl_requestCreateItem): - use the new ebook api here. missed this one in my earlier commit. - -2004-05-20 Radek Doulik <rodo@ximian.com> - - * printing/e-contact-print.c (complete_sequence): finish pages - printing by gnome_print_job_close call before showing preview or - calling gnome_print_job_print - - See #54482 - - * gui/widgets/e-addressbook-view.c (eab_view_print_preview): added - call to begin page, ref printable and sink it to avoid finalizing of - floating object - (eab_view_print): ref and sink printable to avoid finalizing of - floating object - - Fixes #46658 - -2004-05-19 Chris Toshok <toshok@ximian.com> - - * importers/evolution-vcard-importer.c (load_file_fn): use the new - e_book_new and e_book_open apis. - - * importers/evolution-ldif-importer.c (load_file_fn): use the new - e_book_new and e_book_open apis. - - * gui/widgets/eab-gui-util.c (eab_transfer_contacts): use the new - e_book_new and e_book_async_open apis. - - * gui/contact-editor/e-contact-editor.c (cancel_load): - addressbook_load_source_cancel -> addressbook_load_cancel. - (source_selected): use the new e_book_new and addressbook_load. - - * gui/component/select-names/e-select-names.c - (addressbook_model_set_source): use the new e_book_new and - addressbook_load. - - * gui/component/select-names/e-select-names-manager.c - (update_completion_books): use the new e_book_new and - addressbook_load. - - * gui/component/addressbook.h: rename - addressbook_load_source{_cancel} to addressbook_load{_cancel}, and - remove the source arg. - - * gui/component/addressbook.c (addressbook_load): rename since we - aren't passing a source anymore. - (addressbook_load_cancel): same. - (addressbook_load_default_book): use the new e_book_new_* apis. - - * gui/component/addressbook-view.c (delete_addressbook_cb): just - use e_book_new, not e_book_load_source. - (selector_tree_drag_data_received): switch to new - e_book_new_*/e_book_open apis. - (activate_source): same, and addressbook_load_source -> - addressbook_load. - - * gui/component/addressbook-migrate.c - (migrate_contact_folder_to_source): switch to new - e_book_new_*/e_book_open apis. - (migrate_contact_lists_for_local_folders): same. - (migrate_company_phone_for_local_folders): same. - - * conduit/address-conduit.c (pre_sync): switch to new - e_book_new_*/e_book_open apis. - -2004-05-19 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (sensitize_email): Check - if individual email fields are supported. - -2004-05-19 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (extract_simple_field): - Remove debug output. - (real_save_contact): Separate out actual save logic from - save_contact (). - (save_contact): If the user wants to move the contact from one - address book to another, but the source is read-only, as to - save a copy instead. - (e_contact_editor_is_valid): The dialog should be an error dialog. - (app_delete_event_cb): If the target book is read-only, prompt - to discard. If the user wants to move but cannot, prompt to save - a copy. Also validate. - - * gui/contact-editor/eab-editor.c (eab_editor_prompt_to_save_changes): - Remove comment about invalid data dialog, it's not handled here - anymore. - -2004-05-19 Hans Petter Jansson <hpj@ximian.com> - - Fixes a number of bugs, adds some unimplemented functionality, and - makes code more structured. - - * gui/contact-editor/e-contact-editor.h: Eliminate company, - fullname_editable, address_editable fields from EContactEditor. - - * gui/contact-editor/e-contact-editor.c - (enable_writable_fields): Removed. - (set_editable): Removed. - (fill_in_info): Removed. - (extract_field): Removed. - (extract_info): Removed. - (set_fields): Removed. - (command_state_changed): Removed. - (widget_changed): Removed. - (enable_widget): Removed. - (nonempty): Invert and rename to STRING_IS_EMPTY(). - (STRING_MAKE_NON_NULL): Impl. - (is_field_supported): Implement. - (file_as_get_style): Eliminate editor->company. - (file_as_set_style): Ditto. Also don't set empty fields in combo. - (update_file_as_combo): Implement. - (sensitize_ok): Implement. - (object_changed): Implement. - (image_chooser_changed): Don't call widget_changed() from here. - (set_option_menu_history): Implement. - (init_email_record_location): Hook up signals after init. - (init_phone_record_type): Ditto. - (init_im_record_location): Ditto. - (init_im_record_service): Ditto. - (init_address_textview): widget_changed -> object_changed - (init_address_field): Ditto. - (fill_in_email_record): Use set_option_menu_history(), blocking - signals. - (fill_in_im_record): Ditto. - (fill_in_address_field): Use set_entry_text(), blocking signals. - (alloc_ui_slot): nonempty -> STRING_IS_EMPTY - (extract_email): Ditto. - (fill_in_phone_record): Ditto. - (extract_im): Ditto. - (extract_address_record): Ditto. - (sensitize_email_record): Implement. - (sensitize_email): Implement. - (sensitize_phone_types): Implement. - (sensitize_phone_record): Impleent. - (sensitize_phone): Implement. - (sensitize_im_record): Implement. - (sensitize_im): Implement. - (sensitize_address_textview): Implement. - (sensitize_address_field): Implement. - (sensitize_address_record): Implement. - (sensitize_address): Implement. - (simple_field_map): Add all simple fields/widgets to a table with - attributes saying how to handle sensitivity and data transfer. - (init_simple_field): Implement. - (fill_in_simple_field): Implement. - (extract_simple_field): Implement. - (sensitize_simple_field): Implement. - (init_simple): Implement. - (fill_in_simple): Implement. - (extract_simple): Implement. - (sensitize_simple): Implement. - (fill_in_all): Implement. - (extract_all): Implement. - (sensitize_all): Implement. - (set_entry_changed_signal_field): Removed. - (set_urlentry_changed_signal_field): Removed. - (set_entry_activate_signal_field): Removed. - (new_target_cb): Don't signal changes. - (set_entry_activate_signals): Removed. - (set_entry_changed_signals): Removed. - (full_name_clicked): Honor field_supported and target_editable. - Use set_entry_text() and block changed signals. - (image_selected_cb): widget_changed -> object_changed. Don't clear - pointer to file_selector. - (image_cleared_cb): Ditto. - (contact_moved_cb): command_state_chaned() -> sensitize_all(). - (contact_added_cb): Ditto. - (supported_fields_cb): Ditto. - (contact_modified_cb): Ditto. - (save_contact): extract_info() -> extract_all(). - (e_contact_editor_is_valid): Be more verbose. Make sure File As is - non-empty. - (e_contact_editor_init): Call init_all() in place of lots of setup - calls. Remove reference to editor->company. - (e_contact_editor_dispose): Remove reference to editor->company. - (command_state_changed): Removed. - (e_contact_editor_set_property): Axe unneeded complexity, now that - we have sensitize_all() and sensitize_ok(). - (set_fields): Removed. - (fill_in_field): Removed. - (field_mapping): Removed. - (disable_widget_foreach): Removed. - (widget_field_mapping): Removed. - (num_widget_field_mappings): Removed. - (enable_widget): Removed. - -2004-05-05 William Jon McCann <mccann@jhu.edu> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: - Add menu_label and menu_accelerator. - -2004-05-18 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c - (file_send_as_cb): pass 0 to eab_send_contact. - (file_send_to_cb): same. - -2004-05-18 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-gui-util.c - (eab_send_to_contact_and_email_num_list): split out the - DISPOSITION_AS_TO stuff here, and make it take a GList of - ContactAndEmailNum, so we can set it for the single contact case. - (eab_send_contact_list_as_attachment): split out the - DISPOSITION_AS_ATTACHMENT stuff here. - (eab_send_contact_list): call one or the other of the above, - munging the list if disposition is set to TO. - (eab_send_contact): call eab_send_to_contact_and_email_num_list - directly with the supplied email_num, instead of calling - eab_send_contact_list. - - * gui/widgets/eab-gui-util.h (eab_send_contact) add "email_num" - arg, so we can specify the email address we want to be selected. - - * gui/widgets/eab-contact-display.c (on_link_clicked): add - (ifdefed out at the moment) code to handle mailto: urls - internally, instead of farming them out to gnome_url_show. - (render_contact): same. - -2004-05-18 Jerome Lacoste <jerome@coffeebreaks.org> - - Fixes #57940 - - * gui/widgets/e-addressbook-view.c: "Save as VCard" -> - "Save as VCard..." - -2004-05-17 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (e_contact_editor_init): - Hook up image button. - (e_contact_editor_dispose): Dispose of file selector if it's around. - (image_clicked): Implement. - (file_selector_deleted): Implement. - (image_cleared_cb): Implement. - (image_selected_cb): Implement. - - * gui/contact-editor/contact-editor.glade: Make the contact image - be a button that lets you change or discard the image. - -2004-05-17 Jeffrey Stedfast <fejj@novell.com> - - * gui/contact-list-editor/e-contact-list-editor.c: Change E_PIXMAP - size args over to E_ICON_SIZE_* values. - - * gui/component/addressbook-view.c: Change E_PIXMAP size args over - to E_ICON_SIZE_* values. - - * gui/widgets/e-minicard.c (e_minicard_init): Use an E_ICON_SIZE - enum value for the icon_size argument to get_icon. - - * gui/widgets/eab-gui-util.c (eab_create_image_chooser_widget): - Use E_ICON_SIZE_DIALOG as the icon_size argument to - get_icon_filename. - - * gui/widgets/eab-contact-display.c (on_url_requested): Use an - E_ICON_SIZE enum as the icon_size argument to get_icon_filename. - - * gui/contact-editor/e-contact-editor-im.c - (setup_service_optmenu): Use E_ICON_SIZE_MENU here. - - * gui/component/select-names/e-select-names-popup.c - (populate_popup_contact): Use E_ICON_SIZE_MENU here instead of 16. - - * gui/component/addressbook-view.c (set_status_message): Use the - E_ICON_SIZE corresponding to 16x16 pixels. - -2004-05-12 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/contact-editor.glade: Add PO box entries. - - * gui/contact-editor/e-contact-editor.c (init_address_record): Hook - up PO box entry. - (fill_in_address_record): Ditto. - (extract_address_record): Ditto. - -2004-04-18 S N Tejasvi <tejasvi_sn@gawab.com> - - Fixes bug #55208. - - * gui/contact-editor/e-contact-editor.c (save_contact): - Do e_contact_editor_is_valid check to check the birth date and - anniversary date format when user wants to save and warn him. - -2004-05-11 Not Zed <NotZed@Ximian.com> - - * gui/component/addressbook-component.c (impl_upgradeFromVersion): - set exception properly on failure. - - * gui/component/addressbook-migrate.c (addressbook_migrate): take - a GError error return. Doesn't do anything with it ... but ... - -2004-05-11 Dan Winship <danw@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: Remove - the addressbook control - - * gui/component/component-factory.c (factory): Remove support for - the addressbook control - - * gui/component/addressbook-view.c: Remove all the property-bag - stuff. - -2004-05-11 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/component/addressbook-config.c (dialog_to_source) : see if the selected - group is groupwise one and setup the relative uri and other properties into - e-source - -2004-05-10 Suresh Chandrasekharan <suresh.chandrasekharan@sun.com> - - Fixes bug #44196 addressbook table view uses ASCII sort - - * addressbook/gui/widgets/e-addressbook-view.c (compare_subitems): - Uses g_utf8_collate for right UTF8 sort. Made faster using - g_utf8_collate_key. - - Also fixes a bug in - - * gui/component/select-names/e-select-names.c (select_entry_changed): - Changed g_utf8_collate for strcmp as we are already comparing keys - made from g_utf8_collate_key. - -2004-05-08 Enver ALTIN <enver.altin@frontsite.com.tr> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: - Fix parts of #53466. - -2004-05-05 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (init_address_textview): - Implement. - (init_address_record): Init textview. - (fill_in_address_textview): Implement. - (fill_in_address_record): Fill in textview. - (extract_address_textview): Implement. - (extract_address_record): Extract from textview. - - * gui/contact-editor/contact-editor.glade: Combine address-[12] fields - into one multiline text view, as per Anna's new design. - -2004-05-04 Larry Ewing <lewing@ximian.com> - - * gui/component/addressbook-config.c (query_for_supported_bases): - fixup the dialog initialization. - -2004-05-04 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (phones_default): Use defaults - from Anna. - (im_service_default): Ditto. - (email_default): Ditto. - (im_location): Renamed to common_location, as it's used by both IM - and e-mail. - (init_email_record_location): im_location -> common_location - (init_im_record_location): Ditto. - (email_index_to_location): Ditto. - (im_index_to_location): Ditto. - (get_email_location): Ditto. - (get_im_location): Ditto. - (fill_in_email_record): Consult defaults. - (fill_in_im_record): Ditto. - -2004-05-04 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (set_entry_activate_signals): - Remove blog, add home page. - (set_entry_changed_signals): Ditto. - (setup_tab_order): Ditto. - (field_mapping): Ditto. - (widget_field_mappings): Ditto. - - * gui/contact-editor/contact-editor.glade: Replace blog with home - page. - -2004-05-03 Hans Petter Jansson <hpj@ximian.com> - - * gui/widgets/e-minicard.c (e_minicard_set_property): Do ref, unref - in right order, so the same contact can be set twice without ill - effects. - (e_minicard_finalize): NULL pointers after unreffing their objects. - -2004-05-03 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (phones_default): Establish - defaults for the phone number option menus. - (fill_in_phone_record): Fall back to defaults. - -2004-05-03 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (show_help_cb): Implement. - (e_contact_editor_init): Hook up the help button. - - * gui/contact-editor/contact-editor.glade: Give the help button a - sensible name. - -2004-05-03 Larry Ewing <lewing@ximian.com> - - * gui/component/ldap-config.glade: bump the maximum download limit - to 1000. - - * gui/component/addressbook-config.c (add_folder_modify): set the - email entry sesitive only when anonymous isn't selected. Make the - details tab insensitive if the method is local. - - * gui/component/ldap-config.glade: remove unused colorpicker. - -2004-05-03 JP Rosevear <jpr@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: set the - config item type - -2004-05-02 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/component/addressbook-config.c (dialog_to_source) : see if the selected - group is groupwise one and setup the relative uri and other properties into - e-source - -2004-05-01 Larry Ewing <lewing@ximian.com> - - * gui/component/addressbook-config.c: sensitize the details dialog - where appropriate. Don't try to read from widgets that don't - exist. - -2004-04-30 Chris Toshok <toshok@ximian.com> - - * util/e-destination.c (e_destination_set_contact): don't use - "email" twice for a variable name.. even though they don't really - conflict, it's ugly and confusing. - -2004-04-30 Enver ALTIN <enver.altin@frontsite.com.tr> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: Fixed a - type-o. - -2004-04-29 Hans Petter Jansson <hpj@ximian.com> - - * printing/e-contact-print.c: Don't dereference the file_as pointer - if it turns out to be NULL. - -2004-04-28 Jeffrey Stedfast <fejj@ximian.com> - - * gui/component/addressbook-migrate.c: We need a migration dialog - if the revision <= 10. Fixes bug #57770. - -2004-04-27 Larry Ewing <lewing@ximian.com> - - * gui/component/addressbook-config.c: remove debug spew. - -2004-04-27 Jeffrey Stedfast <fejj@ximian.com> - - * gui/component/addressbook-migrate.c (addressbook_migrate): - Migrate pilot data. - (migrate_pilot_data): Oops. Apparently the addressbook didn't - change the format of the changelog file from db3 to xml, so fix to - simply copy the file over. - -2004-04-27 Rodney Dawes <dobey@ximian.com> - - * gui/contact-editor/e-contact-editor-fullname.c: - (e_contact_editor_fullname_init): - * gui/contact-editor/fullname.glade: - * gui/search/e-addressbook-search-dialog.c (eab_search_dialog_init): - Update dialog vbox and action area border widths to be HIG compliant - Update main child widget border widths to be HIG compliant - -2004-04-27 Larry Ewing <lewing@ximian.com> - - * gui/component/addressbook-config.c (source_to_dialog_new): fix - warnings, remove unused code. - - * gui/component/addressbook-config.c: start integrate the new - dialog. - - * gui/component/ldap-config.glade: add the new dialog. - -2004-04-26 Rodney Dawes <dobey@ximian.com> - - * gui/contact-editor/contact-editor.glade: - * gui/contact-editor/e-contact-editor.c (e_contact_editor_init): - Set spacing around notebook widget and the dialog's action area and - vbox widgets to be compliant with the HIG dialog specs - -2004-04-25 Chris Toshok <toshok@ximian.com> - - * importers/evolution-ldif-importer.c (ldif_fields): add "mobile" - mapping to E_CONTACT_PHONE_MOBILE, which is what thunderbird uses - (and really what we should have always been using.) - -2004-04-23 Jeffrey Stedfast <fejj@ximian.com> - - * conduit/address-conduit.c (get_next_mail): The firt EMAIL item - is EMAIL_1, not EMAIL (assuming we want simple strings). - (local_record_from_ecard): Use e_contact_get() for getting the - EContactAddress. Loop from FIRST_ADDRESS_ID up to and *including* - LAST_ADDRESS_ID. - (ecard_from_remote_record): When searching for an address field, - loop from FIRST_ADDRESS_ID up to and *including* LAST_ADDRESS_ID. - (pre_sync): Use e_book_query_any_field_contains() rather than - e_book_query_from_string ("#t") which doesn't work anyway. - -2004-04-20 Jeffrey Stedfast <fejj@ximian.com> - - * conduit/address-conduit.c (map_name): Updated to use - ~/.evolution as the evolution directory rather than ~/evolution. - -2004-04-23 Dan Winship <danw@ximian.com> - - * gui/component/component-factory.c (factory): Fix the addressbook - control to not crash. (Temporary fix.) - -2004-04-23 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-gui-util.c (added_cb): this signal takes an - EContact* too. - (modified_cb): same. - (deleted_cb): same. - (eab_error_dialog): pad the table of status messages out with the - new status codes, and don't specify gui text for messages that - aren't generated by the backends. This fixes the "U" error - messages people were seeing. - -2004-04-22 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/contact-editor.glade: Correct the dialog's title. - - * gui/contact-editor/e-contact-editor.c (init_email_record_location): - Connect to entry's activate signal. - (init_phone_record_type): Ditto. - (init_im_record_location): Ditto. - (init_address_field): Ditto. - (set_entry_changed_signal_field): Remove unnecessary checks. - (set_urlentry_changed_signal_field): Ditto. - (set_entry_changed_signals): Ditto. - (set_entry_activate_signal_field): Implement. - (set_urlentry_activate_signal_field): Implement. - (set_entry_activate_signals): Implement. - (e_contact_editor_init): Call set_entry_activate_signals (). - -2004-04-22 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (e_contact_editor_class_init): - Override the save_contact function. - (e_contact_editor_save_contact): Implement. - (e_contact_editor_init): Remove some unnecessary checks - if - something's the matter with the UI files, that needs to be warned - about and fixed, not silently worked around. - -2004-04-22 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/contact-editor.glade: Make the window be a - GtkDialog. - -2004-04-21 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (free_attr_list): Implement. - (extract_email): Preserve offscreen addresses. - (extract_phone): Preserve offscreen phone numbers. - (extract_im): Preserve offscreen IM accounts. - -2004-04-21 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c: Add defines for the slot - counts for email, phone, im, address. - (phones): Add E_CONTACT_PHONE_COMPANY back in, now that we can - differentiate it. - (init_email): Use EMAIL_SLOTS and a loop. - (init_im): Ditto for IM_SLOTS. - (init_phone): Ditto for PHONE_SLOTS. - (fill_in_address) - (extract_address) - (init_address): Ditto for ADDRESS_SLOTS. - (get_ui_slot_param): Implement. - (get_ui_slot): Implement. - (set_ui_slot): Implement. - (alloc_ui_slot): Implement. - (fill_in_email): Add code to preserve spatial organization. - (extract_email): Ditto. - (fill_in_phone): Ditto. - (extract_phone): Ditto. - (fill_in_im): Ditto. - (exctract_im): Ditto. - -2004-04-21 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-migrate.c (setup_progress_dialog): - store off the label as well as the folder name label, so we can - reuse the dialog and update the label. Also, no longer take the - string to display here. - (dialog_set_label): new function. - (migrate_contact_lists_for_local_folders): call - dialog_set_folder_name here so we can see the folder being - migrated. - (migrate_company_phone_for_local_folders): new function for - updating the way we store company phone numbers. - (addressbook_migrate): split out the logic for setting up/tearing - down the dialog from the individual migration points so we can - reuse the same dialog and not have get destroyed/recreated for - each stage. Also add a new migration point ( <= 1.5.8) for - migrating the company phone numbers. - -2004-04-21 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/component/addressbook.c (remove_parameters_from_uri) : added - a new function to striff off any parameters present after ';' in - the uri - (load_source_auth_cb) (addressbook_authenticate) : call above - function to remove anything after ';' before passing uri to - e-password calls - -2004-04-21 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.h (EContactEditor): Remove - unused fields. - - * gui/contact-editor/e-contact-editor.c (emails): Remove. - (e_contact_editor_init): Don't init unused fields. - (e_contact_editor_dispose): Don't free/clear unused fields. - (enable_writable_fields): Don't use email_choice anymore. Enable - checkbutton-htmlmail only once. - -2004-04-21 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/contact-editor.glade: Make the phone type - selectors be option menus. - - * gui/contact-editor/e-contact-editor.c (phones): Store the phone - param mappings locally. - (set_entry_changed_signals): Don't special-case phone entries here. - (enable_writable_fields): Don't mess with the phone widgets anymore. - (set_fields): Use fill_in_phone (). - (extract_info): Use extract_phone (). - (phone_index_to_type): Implement. - (get_phone_type): Implement. - (get_attributes_named): Implement. - (set_attributes_named): Implement. - (fill_in_phone_record): Implement. - (extract_phone_record): Implement. - (fill_in_phone): Implement. - (extract_phone): Implement. - (init_phone_record_type): Implement. - (init_phone): Implement. - (connect_arrow_button_signal): Remove. - (connect_arrow_button_signals): Remove. - (phone_entry_changed): Remove. - (set_entry_changed_signal_phone): Remove. - (_arrow_pressed): Remove. - (_phone_arrow_pressed): Remove. - (e_contact_editor_build_ui_info): Remove. - (e_contact_editor_build_phone_ui): Remove. - (set_phone_field): Remove. - -2004-04-21 Not Zed <NotZed@Ximian.com> - - * gui/component/addressbook-view.c (addressbook_view_init): fix - for e_user_creatable_items handle api changes. - -2004-04-20 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.etspec: use cursor-mode="line" to - get rid of the annoying cell cursor. - - * gui/widgets/eab-gui-util.c (eab_create_image_chooser_widget): - create the image chooser even if we aren't given an initial - filename. - - * gui/contact-editor/e-contact-editor.c (new_target_cb): - addressbook_show_load_error_dialog -> eab_load_error_dialog. - -2004-04-19 Rodney Dawes <dobey@ximian.com> - - * gui/contact-editor/contact-editor.glade: Set the default image for - the contact photo to be the stock_person image in the icon theme - -2004-04-19 Michael Terry <mike@mterry.name> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: - * gui/component/addressbook-component.c: - * gui/component/addressbook-view.c: - * gui/component/select-names/e-select-names-popup.c: - * gui/contact-editor/e-contact-editor-address.c: - * gui/contact-editor/e-contact-editor-fullname.c: - * gui/contact-editor/e-contact-editor-im.c: - * gui/contact-list-editor/contact-list-editor.glade: - * gui/contact-list-editor/e-contact-list-editor.c: - * gui/merging/eab-contact-commit-duplicate-detected.glade: - * gui/merging/eab-contact-duplicate-detected.glade: - * gui/widgets/e-minicard.c: - * gui/widgets/eab-contact-display.c: - * gui/widgets/eab-gui-util.c: Update the addressbook to use the icon - theme via the EIconFactory object in e-util - -2004-04-18 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (nonempty): new macro. - (extract_email): only create/add the attribute if the email - address is nonempty. - (extract_im): same, but for im accounts. - (extract_address_record): same, but for addresses. - -2004-04-16 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/contact-editor.glade: Add "wants HTML" checkbox. - - * gui/contact-editor/contact-editor.c (email_location_to_index) - (email_entry_changed) - (set_entry_changed_signal_email) - (file_save_cb) - (file_close_cb) - (file_save_as_cb) - (file_send_as_cb) - (file_send_to_cb) - (contact_deleted_cb) - (delete_cb) - (print_cb) - (print_envelope_cb) - (tb_save_and_close_cb) - (verbs) - (pixmaps) - (create_ui): Remove unused funcs. - (command_state_changed): Remove bonobo calls. - (e_contact_editor_init): Remove bonobo stuff. - (fill_in_email) - (fill_in_im): Remove unused vars. - -2004-04-16 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c (book_loaded_cb): new - function, use the async interface to load the book. - (impl_requestCreateItem): use - e_book_async_get_default_addressbook. - -2004-04-16 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/contact-editor.glade: Commit new contact editor - UI by Anna. - - * gui/contact-editor/e-contact-editor.c: Comment out bonobo includes. - (_email_arrow_pressed) - (_address_arrow_pressed) - (set_im_fields) - (find_address_mailing) - (set_address_field) - (add_im_clicked) - (edit_im_clicked) - (remove_im_clicked) - (im_button_press_cb) - (im_selected_cb) - (im_treeview_drag_data_get_cb) - (im_treeview_drag_data_rcv_cb) - (setup_im_treeview) - (email_entry_changed) - (address_to_text) - (text_to_address) - (address_text_changed) - (address_mailing_changed) - (full_addr_clicked) - (e_contact_editor_build_email_ui) - (e_contact_editor_build_address_ui) - (_email_arrow_pressed) - (_address_arrow_pressed) - (find_address_mailing) - (add_im_field) - (set_im_fields) - (set_address_field): Removed. - (address_name) - (im_service) - (im_location): Add lookup structs. - (init_email_record_location) - (init_email) - (fill_in_email_record) - (extract_email_record) - (email_location_to_index) - (email_index_to_location) - (im_index_to_location) - (get_email_location) - (get_im_location) - (fill_in_email) - (extract_email) - (init_im_record_location) - (init_im_record_service) - (init_im) - (fill_in_im_record) - (fill_in_im) - (extract_im_record) - (extract_im) - (init_address_field) - (init_address_record) - (init_address) - (fill_in_address_field) - (fill_in_address_record) - (fill_in_address) - (extract_address_field) - (extract_address_record) - (extract_address) - (file_save_and_close_cb) - (file_cancel_cb) - (set_entry_text): Implemented. - (connect_arrow_button_signals): Updated some widget names. - (set_entry_changed_signals): Removed dead widgets, updated names for - others. - (print_cb) - (tb_save_and_close_cb) - (create_ui): Disabled Bonobo toolbar/menus. - (e_contact_editor_init): Disabled Bonobo toolbar/menus. Init new - UI elements. Remove init of old UI elements. - (command_state_changed): Disabled Bonobo toolbar/menus. Act on new - ok/cancel buttons. - (_phone_arrow_pressed): Updated widget names. - (set_phone_field): Use set_entry_text (). - (set_fields): Update widget names, remove old address code, call new - fill_in_* code. - (field_mapping): Remove dead widgets. - (widget_field_mapping): Ditto. - (enable_writable_fields): Remove calls for old email/address UI. - Update some names. - (fill_in_info): Don't find_address_mailing() or set_im_fields(). - (extract_info): Call new extraction funcs. - -2004-04-14 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-view.c (book_open_cb): force the info - label to update its contents here if the load was successful. - - * gui/component/addressbook-migrate.c (migration_context_new): use - e_book_get_addressbooks instead of getting source_list from the - component. - (migration_context_free): unref the source_list. - - * gui/component/addressbook-config.c (dialog_to_source): sync the - dialog->source_list, since we have it. - -2004-04-14 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c: rip out tons of functions - they - all live in addressbook-view.c now. the only thing left in this - file is the addressbook_load* calls that do authentication. - - * gui/component/addressbook.h: remove prototypes for - addressbook_new_control and addressbook_load_uri (it was #if 0'ed - anyway.) - - * gui/component/addressbook-component.h: remove prototypes for - _peek_activity_handler and _peek_source_list. - - * gui/component/addressbook-component.c: rip out tons of functions - - they all live in addressbook-view.c now. - (impl_createControls): simplify this immensely. we just create an - AddressbookView and get the various widgets/controls from it. - (impl_requestCreateItem): this function loses slightly - it needs - per-window info (the selected source) but there's no way to get - it. So we load the default book. Also, this uses a synchronous - e_book call to load the book, which is not good. - (addressbook_component_peek_source_list): nuke, not used by - anything anyway. - (addressbook_component_peek_activity_handler): nuked, not used by - anything - and it's per-window anyway. - - * gui/component/Makefile.am (libevolution_addressbook_la_SOURCES): - add addressbook-view.[ch]. - - * gui/component/addressbook-view.[ch]: rip out all of the per - window stuff from addressbook.[ch] and addressbook-component.[ch] - and put it here. - -2004-04-13 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-contact-display.c (accum_address): disable the - map link for 2.0. - -2004-04-13 Larry Ewing <lewing@ximian.com> - - * gui/widgets/e-addressbook-view.c (create_table_view): add - GDK_ACTION_COPY to the supported drag types. Connect to the - table_drag_data_delete callback. - (table_drag_data_delete): remove the drag rows. - -2004-04-13 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/component/addressbook.c (addressbook_authenicate): - added a check for new auth type "plain/password" - for groupwise in addressbook_authenicate function - -2004-04-12 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-popup-control.c (email_menu_add_option): treat - "" the same as NULL (don't add it to the list). - -2004-04-12 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (addressbook_load_default_book): - quiet valgrind uninitialized memory warning. - -2004-04-12 Chris Toshok <toshok@ximian.com> - - [ should fix #56537 ] - - * gui/widgets/eab-popup-control.c (EMPTY_ENTRY): use _(), not N_() - here. - (email_menu_add_options_from_contact): and g_strdup it here, so - that the g_list_foreach (... g_free ..) doesn't cause things to - blow up. - (email_menu_unset_options): nuke ifdefed function. - - * gui/widgets/eab-popup-control.h: don't include gtk.h, include - just what we need. - -2004-04-10 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-gui-util.h: add prototypes for - eab_load_error_dialog and eab_search_result_dialog. - - * gui/widgets/eab-gui-util.c (eab_load_error_dialog): the new - addressbook_show_load_error_dialog. - (eab_search_result_dialog): new function, the old contents of - addressbook.c:search_result. - - * gui/component/addressbook.c - (addressbook_show_load_error_dialog): move this function to - eab-gui-utils.[ch] - (search_result): split out the body of this into - eab_search_result_dialog in eab-gui-utils.[ch]. - (book_open_cb): call eab_load_error_dialog. - - * gui/component/addressbook.h: remove prototype for - addressbook_show_load_error_dialog. - -2004-04-10 Chris Toshok <toshok@ximian.com> - - * util/e-destination.h: remove the e_destination_get_book api, - since the function doesn't exist. - -2004-04-09 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-migrate.c (addressbook_migrate): bump - version required to 8 for the contact list migration foo. - -2004-04-09 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c - (selector_tree_drag_motion): pass GDK_CURRENT_TIME instead of a - function pointer to "time" to gdk_drag_status. not sure if this - is right, but it's definitely more right than it was :) - (impl_createControls): create the info label and add it to the - sidebar control. it's not hooked up yet. - -2004-04-09 Chris Toshok <toshok@ximian.com> - - * importers/evolution-ldif-importer.c (resolve_list_card): use the - new e_destination_export_to_vcard_attribute call to build up the - attributes. - - * importers/evolution-vcard-importer.c (process_item_fn): if we're - importing a vcard that we wrote out previously containing xml in - the EMAIL attributes, DTRT and strip it out and use - e_destination_export_to_vcard_attribute to build up the proper - attribute. - - * util/Makefile.am (libeabutil_la_SOURCES): remove - eab-destination.[ch] and add e-destination.[ch]. - - * printing/e-contact-print.c (e_contact_print_contact): we don't - have to worry about the "<?xml..." EMAIL fields anymore. - - * gui/widgets/eab-gui-util.c (eab_send_contact_list): just use the - value as the address (since that's what it is) in the list case. - - * gui/widgets/eab-contact-display.c (render_contact_list): remove - the EABDestination stuff from here. - (eab_contact_display_render_compact): same. - - * gui/widgets/e-minicard.c (activiate_editor): fix warnings - use - EAB_EDITOR instead of G_OBJECT. - (add_field): we don't have to worry about the "<?xml..." EMAIL - fields anymore. - (remodel): same. - - * gui/widgets/e-addressbook-treeview-adapter.c - (adapter_get_value): we don't have to worry about the "<?xml..." - EMAIL fields anymore. - - * gui/widgets/e-addressbook-table-adapter.c - (addressbook_value_at): we don't have to worry about the - "<?xml..." EMAIL fields anymore. - - * gui/contact-list-editor/e-contact-list-model.c - (contact_list_value_at): eab->e. - (contact_list_model_dispose): we're not a GtkObject, we're a - GObject. rename _destroy to _dispose, and chain up to the parent - class's ::dispose. - (e_contact_list_model_class_init): GtkObject -> GObject, and - destroy -> dispose. - (e_contact_list_model_init): GtkObject -> GObject, and EAB -> E. - (e_contact_list_model_add_destination): EAB -> E. - (e_contact_list_model_add_email): same. - (e_contact_list_model_add_contact): same. - (e_contact_list_model_get_destination): same. - - * gui/contact-list-editor/e-contact-list-editor.c - (table_drag_data_received_cb): add email num arg to - e_contact_list_model_add_contact. - (extract_info): fill in the vcard attributes instead of just - generating xml. - (fill_in_info): extract the values from the vcard attributes. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_insert_length): eab->e, and don't - sometimes copy, sometimes ::new. always ::new. - (e_select_names_text_model_delete): same. - (e_select_names_text_model_obj_count): same. - (nth_obj_index): same. - - * gui/component/select-names/e-select-names-table-model.c - (fill_in_info): eab -> e. - - * gui/component/select-names/e-select-names-popup.c - (make_contact_editor_cb): eab -> e. - (change_email_num_cb): same. - (toggle_html_mail_cb): same. - (populate_popup_contact): same, and remove code that checks for - <?xml, then imports the EDestination. - (quick_add_cb): eab -> e. - (populate_popup_nocontact): same. - (e_select_names_populate_popup): same. - - * gui/component/select-names/e-select-names-model.h: eab -> e, and - remove prototypes for nuked functions. - - * gui/component/select-names/e-select-names-model.c - (destination_changed_proxy, send_changed, connect_destination, - disconnect_destination): nuke. - (e_select_names_model_duplicate): EAB -> E. - (e_select_names_model_get_textification): same. - (e_select_names_model_get_address_text): same. - (e_select_names_model_get_destination): same. - (e_select_names_model_export_destinationv): same. - (send_changed): same. - (e_select_names_model_import_destinationv): same. - (e_select_names_model_get_contact): same. - (e_select_names_model_contains): same. - (e_select_names_model_insert): same, and remove call to - connect_destination. - (e_select_names_model_append): same. - (e_select_names_model_replace): same, and remove call to - disconnect/connect_destination. - (e_select_names_model_delete): same. - (delete_all_iter): nuke. - (e_select_names_model_delete_all): use g_object_unref for the - foreach call. - (e_select_names_model_merge): EAB -> E. - (e_select_names_model_name_pos): same. - (e_select_names_model_name_pos): same. - (e_select_names_model_load_all_contacts): nuke. - (e_select_names_model_cancel_all_contact_load): nuke. - - * gui/component/select-names/e-select-names-manager.c - (clean_cb, focus_in_cb, focus_out_cb, completion_popup_cb): nuke. - (completion_handler): EAB -> E, and the signals are gone. - - * gui/component/select-names/e-select-names-completion.c: in - general, s/eab_dest/e_dest and s/EABDest/EDest. - (e_select_names_completion_got_book_view_cb): move the - e_book_view_start to below the assignment of - sequence_complete_received, just to put my mind at ease. - (e_select_names_completion_stop_query): un-#if notyet the call to - e_book_cancel. - (e_select_names_completion_start_query): free the waiting_query - before assigning to it. - - * gui/component/select-names/e-select-names-bonobo.c - (entry_set_property_fn): remove calls to - e_select_names_model_load_all_contacts, since that function is - dead. - - * gui/component/addressbook-migrate.c (setup_progress_dialog): - take the label to display to the user as an arg. - (migrate_contact_lists_for_local_folders): loop over all contacts - in all local addressbooks looking for ones that have <?xml in - their EMAIL attributes. for the ones we find, call - e_destination_export_to_vcard_attribute to build up the proper - attribute. - (addressbook_migrate): add in a clause for all versions under - 1.5.7 to convert contact lists. also, move the unrefs of the - sources/groups to outside the if, as they're created outside it. - - * gui/component/Makefile.am (INCLUDES): remove the - addressbook/backend/ dirs, since libebook isn't there anymore - (nothing is, actually). Add addressbook/util/. - -2004-04-09 Dan Winship <danw@ximian.com> - - * gui/component/addressbook.c (addressbook_new_control): create an - EUserCreatableItemsHandler - (addressbook_view_clear): destroy it - (control_activate): Activate it - - * gui/component/addressbook-component.c - (impl__get_userCreatableItems): Add object/folder flags to the - creatable items. Rename "Address Book" to "Contacts Group" per new - specs - -2004-04-07 Chris Toshok <toshok@ximian.com> - - * util/e-destination.c (e_destination_copy): we don't have an - EBook* anymore. - (e_destination_clear): same. - (e_destination_set_contact): same. - (e_destination_set_book): same, just cache the source_uid. - (e_destination_set_book_uri): nuke. - (e_destination_set_contact_uid): we don't have an EBook*. - (e_destination_xml_decode): same. - (e_destination_export_to_vcard_attribute): new function, fill in - an EVCardAttribute with EDestination values. - - * util/e-destination.h: add prototype for - e_destination_export_to_vcard_attribute. - -2004-04-07 Jeffrey Stedfast <fejj@ximian.com> - - * gui/component/autocompletion-config.c - (source_selection_changed): Sync the changes here rather than - setting 'changed' on the config control (since that no longer - exists). - (autocompletion_config_control_new): Don't connect to an apply - signal, no such signal. - -2004-04-06 Chris Toshok <toshok@ximian.com> - - * util/e-destination.[ch]: old name, new trimmed down - implementation. This will be replacing eab-destination.[ch]. - -2004-04-06 Hao Sheng <hao.sheng@sun.com> - - * gui/widgets/e-minicard.c: - (e_minicard_event) : implement keyboard navigation(TAB/shift+TAB) - (activaite_editor) : add a new function to activiate contact editor - for support "Enter" key - - Fixes #55056 - -2004-04-05 Chris Toshok <toshok@ximian.com> - - * util/eab-destination.h: wrap this with the correct #ifdef. - -2004-04-05 Chris Toshok <toshok@ximian.com> - - * gui/merging/eab-contact-merging.c (match_query_callback): use - the correct glade filename. - -2004-04-01 Hari Prasad Nadig <hp@ndeepak.info> - - Fixes #53433. - - * gui/component/addressbook-config.c (searching_tab_check): added - the tab check for search tab. - (dialog_to_source): added timeout to be saved. - (source_to_dialog): just a piece to retrieve timeout from source. - (addressbook_root_dse_query): few necessary changes. - (do_ldap_root_dse_query): again few changes that were required. - - * gui/component/ldap-config.glade : set right the Hscale to - display the selected value. - -2004-03-30 Chris Toshok <toshok@ximian.com> - - [ fixes bug #34777 ] - - * gui/contact-editor/e-contact-editor.c (file_as_entry_changed): - set the window title to File As if the file as entry has something - in it. "Contact Editor" otherwise. - (set_entry_changed_signals): hook up the file-as-entry's "changed" - signal. - - * gui/contact-list-editor/e-contact-list-editor.c - (list_name_changed_cb): analogous fix, but "List Name" and - "Contact List Editor". - -2004-03-30 Chris Toshok <toshok@ximian.com> - - [ fixes bug #53544 ] - - * gui/component/addressbook-component.c - (impl__get_userCreatableItems): add "address_book" to the user - creatable items list. complete with incorrect accelerator and - shortcut! - (impl_requestCreateItem): handle "address_book" here, and plug a - memory leak. - -2004-03-30 Chris Toshok <toshok@ximian.com> - - [ part of the fix for #51977, the other part is in e-d-s ] - - * gui/widgets/e-addressbook-view.c (search_activated): the name of - the category list property has changed from "category" to - "category" list in 1.5. track the change here to get category - searching working again. - -2004-03-30 Chris Toshok <toshok@ximian.com> - - [ part of the fix for #54528, the other part is in e-d-s ] - - * importers/evolution-vcard-importer.c (process_item_fn): get and - set the PHOTO attribute before storing the contact in the book. - this has the affect of making EContact sniff the image format. - the apple addressbook doesn't give PHOTO's a TYPE. - - -2004-03-30 Chris Toshok <toshok@ximian.com> - - [ fixes bug #53094 ] - - * gui/component/ldap-config.glade: nuke - addressbook-sources-window. - - * gui/component/addressbook-config.c (main): nuke, we don't need - this test case anymore, and it doesn't really work anyway anymore. - -2004-03-30 Chris Toshok <toshok@ximian.com> - - [ fixes bug #53634 ] - - * gui/widgets/e-addressbook-view.c (eab_view_new): call - e_search_bar_set_menu to add the Advanced... menu item to the - search menu, and connect to "menu_activated". - (search_menu_activated): new function, pop up the advanced dialog - if id == ESB_ADVANCED. - (query_changed): use e_search_bar_get_item_id instead of - g_object_get. - - * gui/component/addressbook.c (verbs): remove ToolSearch. - (pixmaps): remove the ToolSearch pixmap. - -2004-03-30 Chris Toshok <toshok@ximian.com> - - [ gui part of the fix required for #48665 ] - - * gui/widgets/e-addressbook-model.c (get_view): pass the source's - "limit" property (if it exists) to e_book_async_get_book_view. - -2004-03-29 Larry Ewing <lewing@ximian.com> - - * gui/component/addressbook-component.c - (selector_tree_drag_data_received): call drag_finish properly. - (selector_tree_drag_motion): set the drag status properly. - -2004-03-25 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/component/eab-editor.c (eab_editor_prompt_to_save_changes) : - do eab_editor_is_valid check only when user wants to save. - -2004-03-24 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c - (fill_popup_menu_callback): don't let the user delete their - Personal addressbook. This is just a nice UI thingy.. A similar - fix needs to be made to e-d-s. so that attempts that circumvent a - nice UI will also fail. - -2004-03-24 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-gui-util.c (eab_show_multiple_contacts): don't - know what I was thinking approving this change. the _() was only - used in the plural case (in fact where n > 5), so a singular case - was never necessary, and neither was the call to ngettext. - -2004-03-24 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c - (e_contact_list_editor_get_type): parent_type == EAB_TYPE_EDITOR. - (e_contact_list_editor_class_init): fill in editor_class virtual - functions, and remove all the signals. - (list_added_cb): call eab_editor_contact_* instead of emitting a - signal here. also call eab_editor_close - (list_modified_cb): same. - (e_contact_list_editor_is_valid): new function. - (e_contact_list_editor_is_changed): same. - (e_contact_list_editor_get_window): same. - (file_close_cb): call eab_editor_ functions. - (list_deleted_cb): call eab_editor_contact_* instead of emitting a - signal here. also call eab_editor_close - (delete_cb): call eab_editor_* functions. - (contact_list_editor_destroy_notify): call eab_editor_remove. - (e_contact_list_editor_new): call eab_editor_add, and remove the - g_object_ref/gtk_object_sink two-step. - (e_contact_list_editor_show): make static, and make arg EABEditor. - (e_contact_list_editor_raise): same. - (e_contact_list_editor_close): same. - (app_delete_event_cb): call eab_editor_ functions. - (command_state_changed): use eab_editor_is_valid instead of - is_named. - (e_contact_list_editor_request_close_all): nuke. - - * gui/contact-list-editor/e-contact-list-editor.h: nuke a bunch of - prototypes for functions that are now either virtual functions - from EABEditor or eab_editor_* functions. - (struct _EContactListEditor): we subclass from EABEditor. - (struct _EContactListEditorClass): same, and nuke all the signals. - - * gui/contact-editor/e-contact-editor.c - (e_contact_editor_get_type): parent_type == EAB_TYPE_EDITOR. - (e_contact_editor_class_init): fill in editor_class virtual - functions, and remove all the signals. - (contact_moved_cb): call eab_editor_contact_* instead of emitting - a signal here. also call eab_editor_close - (contact_added_cb): same. - (contact_modified_cb): same. - (e_contact_editor_close): rename from close_dialog. - (e_contact_editor_is_valid): new function. - (e_contact_editor_is_changed): new function. - (e_contact_editor_get_window): new function. - (file_close_cb): use eab_editor_ calls here. - (e_contact_editor_confirm_delete): nuke. - (contact_deleted_cb): call eab_editor_contact_* instead of - emitting a signal here. also call eab_editor_close - (delete_cb): use eab_editor_ functions. - (e_contact_editor_dispose): chain up to our parent's ::dispose. - (contact_editor_destroy_notify): use eab_editor_remove. - (e_contact_editor_new): use eab_editor_add, and remove the - g_object_ref/gtk_object_sink two-step. - (_popup_position): nuke dead function. - (set_fields): i is an index, not a field_id. - (e_contact_editor_raise): make this static, and it takes an - EABEditor arg now, not a EContactEditor. - (e_contact_editor_show): same. - (e_contact_editor_request_close_all): nuke. - - * gui/contact-editor/e-contact-editor.h: nuke a bunch of - prototypes for functions that are now either virtual functions - from EABEditor or eab_editor_* functions. - (struct _EContactEditor): we subclass from EABEditor. - (struct _EContactEditorClass): same, and remove the signals. - - * gui/widgets/e-addressbook-view.c (delete): call - eab_editor_confirm_delete. - - * gui/widgets/eab-popup-control.c (contact_editor_cb): don't - bother calling e_contact_editor_raise since this is a new contact - editor anyway. - - * gui/widgets/eab-gui-util.c (eab_show_contact_list_editor): use - EABEditor signals, and eab_editor_show. - - * gui/widgets/e-minicard.h: "editor" is now of type EABEditor, not - GObject. - - * gui/widgets/e-minicard.c (e_minicard_event): just use - eab_editor_raise instead of - e_contact_editor_raise/e_contact_list_editor_raise. - - * gui/component/addressbook-component.c (impl_requestQuit): - implement this again, calling eab_editor_request_close_all. - (addressbook_component_class_init): fill in epv->requestQuit. - -2004-03-24 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/eab-editor.[ch]: superclass for both - EContactEditor and EContactListEditor. A start toward simplifying - the interface to both of them, and a place to abstract code. - - * gui/contact-editor/Makefile.am (libecontacteditor_la_SOURCES): - add eab-editor.[ch] - -2004-03-24 Danilo Å egan <dsegan@gmx.net> - - * gui/widgets/e-addressbook-model.c (update_folder_bar_message): - Use ngettext for handling plural forms (fixes bug #53464). - * gui/widgets/eab-gui-util.c (eab_show_multiple_contacts): Likewise. - * gui/widgets/eab-vcard-control.c (pstream_load): Likewise. - - -2004-03-22 Chris Toshok <toshok@ximian.com> - - [ fixes bug #53653, and a couple other instances ] - - * gui/widgets/eab-gui-util.c (file_exists): REJECT -> CANCEL, so - esc works (patch from Pratik V. Parikh <pratikvp@despammed.com>) - (save_it): REJECT -> CANCEL. - (eab_select_source): same. - -2004-03-17 Hans Petter Jansson <hpj@ximian.com> - - Fixes #53625. - - * gui/widgets/eab-contact-display.c (render_contact): Show home and - mobile phone numbers too. - -2004-03-15 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/contact-editor/e-contact-editor.c (enable_writable_fields) : - loop only up to < G_N_ELEMENTS instead of <= G_N_ELEMENTS. Prevents - out of bound indexing of addresses array - -2004-03-15 Hao Sheng <hao.sheng@sun.com> - - * gui/component/Makefile.am : build a11y/addressbook dir - * gui/widgets/e-addressbook-view.c : - (eab_view_class_init) : add the accessibility support for - EAddressbookView - * gui/widgets/e-minicard-view.c : - (e_minicard_view_class_init) : add the accessibility support for - EMinicardView - * gui/widgets/e-minicard.c : - (e_minicard_class_init) : add the accessibility support for EMinicard - -2004-03-10 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-contact-display.c (render_address): #if 0 this, - since nothing uses it anymore. - (accum_address): new function, build up a GString. - (accum_name_value): same. - (accum_attribute): same. - (render_contact): don't just blindly render the work/personal - blocks, since if they're empty it looks stupid. instead, - accumulate each block into a GString and only output the entire - block if the string is non-empty. - -2004-03-10 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (phone_entry_changed): - phone_choice is an index into the phones array. - (_phone_arrow_pressed): same. - (address_text_changed): address_choice is an index into the - addresses array. - (_address_arrow_pressed): same. - (set_address_field): same. - (_email_arrow_pressed): email_choice is an index into the emails - array. - (full_addr_clicked): same, and same with - s/addresses/address_editable. - (e_contact_editor_init): initialize the *_choice fields as indices - into their respective *es arrays. - (e_contact_editor_build_address_ui): initialize the labels from - the addresses array. - (set_fields): *_choice fields are indices into *es arrays. - (enable_writable_fields): same. - -2004-03-09 Rodney Dawes <dobey@ximian.com> - - * gui/contact-editor/e-contact-editor.c (_arrow_pressed): Don't try - to calculate the position of the popup menu for the dropdowns - -2004-03-09 Rodney Dawes <dobey@ximian.com> - - * gui/contact-editor/e-contact-editor-im.c (e_contact_editor_im_edit): - Remove the dialog separator, and set appropriate border widths for the - button area box and the dialog's vbox - * gui/contact-editor/im.glade: Apply patch from Christian Neumair to - make the IM editor dialog HIG compliant - -2004-03-08 Sivaiah Nallagatla <snallagatla@novell.com> - * gui/contact-editor/e-contact-editor.c (enable_writable_fields): - fixed a typo, which is causing probelm in building up email ui - -2004-03-04 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/component/addressbook-config.c : - (addressbook_add_server_druid) : maintain a list of only those source groups which are added to menu - instead of all - (source_group_changed_cb) : use the new list to get the selected group - (addressbook_source_dialog_destroy) : free the new list - -2004-03-04 Not Zed <NotZed@Ximian.com> - - ** See #54991. - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_start_query): dont try to unref a null - query. - (name_style_query): use a GString to build the query, so we can - use e_sexp_encode_string to properly encode the sub terms. - -2004-03-03 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook-component.c (delete_addressbook_cb): - Set error to NULL before using it. - -2004-03-03 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook-component.c (delete_addressbook_cb): - Remove local data, with error reporting on failure. - -2004-03-02 Larry Ewing <lewing@ximian.com> - - * gui/component/addressbook-component.c: add drop support for - text/x-vcard to the source list. - -2004-02-27 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-contact-display.c - (eab_contact_display_render_compact): ref the pixbuf before we - close/unref the loader so the pixbuf sticks around, and make the - scaling logic a bit more transparent. - -2004-02-27 Rodney Dawes <dobey@ximian.com> - - * gui/contact-editor/contact-editor.glade: Change the button relief - back to normal for the drop-down buttons and move the text labels - inside the buttons as well - -2004-02-27 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c (eab_view_set_property): add - missing "break" to PROP_SOURCE's case. - -2004-02-27 Rodney Dawes <dobey@ximian.com> - - * gui/contact-editor/contact-editor.glade: Get rid of some extraneous - event boxes that were not needed/used for anything really - Set the button relief for the pop-down buttons to NONE - Set the shadow type for the arrows in the pop-down buttons to NONE, - so that we look good with themes that actually handle shadow types on - arrows, since most things just ignore the shadow type anyway - - Fixes #8516 - -2004-02-26 Hans Petter Jansson <hpj@ximian.com> - - * util/eab-destination.c (name_and_email_cb): Move unused variable - declaration inside notyet conditional. - - * printing/e-contact-print.c: Include gal/util/e-util.h - - * gui/merging/eab-contact-compare.c (eab_contact_locate_match): Cast - callback to an EBookCallback. - (eab_contact_locate_match_full): Ditto. - - * gui/contact-editor/e-contact-quick-add.c (quick_add_set_name): - Remove unused variable and cast 3rd arg to e_contact_set () (perhaps - this should take a gconstpointer?). - - * gui/contact-editor/e-contact-editor-im.c (setup_service_optmenu): - Remove unused variable. - - * gui/component/select-names/e-select-names.c (e_select_names_init): - Cast the vbox to a GtkBox. - - * gui/component/addressbook-config.c (dialog_to_source): Correctly cast - the spin button to a GtkSpinButton, not a GtkEntry. - - * gui/component/addressbook-component.c (load_primary_selection): - Remove unused variable. - -2004-02-26 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-contact-display.c (render_contact): add the - Groupwise IM attributes to the list of those we render. - -2004-02-26 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c (set_view_preview): call - eab_view_show_contact_preview here so we maintain the preview - state when switching folders. we don't (yet... won't ever?) have - per-addressbook preview settings. - -2004-02-26 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c - (eab_view_show_contact_preview): view->scrolled -> - view->contact_display. fixes crash. - -2004-02-26 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (edit_im_clicked): fix - checks for locations. - -2004-02-26 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/im.glade: set the location label/option menu - to visible. - - * gui/contact-editor/e-contact-editor.c (add_im_clicked): build up - the vcard attributes manually so we can set the TYPE= parameter to - the location the user specifies. - (edit_im_clicked): same. Also, use COLUMN_IM_LOCATION_TYPE, which - is not localized to pass the location to the editor. - (remove_im_clicked): reindent. - (im_treeview_drag_data_get_cb): same. - (im_treeview_drag_data_rcv_cb): same. - (setup_im_treeview): add another column for the (non-localized) - location type, and reindent. - (add_im_field): use the new attribute api for EContact so we can - get the location of each account, and set things appropriately on - the store. - - * gui/contact-editor/e-contact-editor-im.c - (e_contact_editor_im_class_init): reindent. - (e_contact_editor_im_new): same. - (fill_in_info): same. - -2004-02-25 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/contact-editor/e-contact-editor-im.c : added - groupwise im related label and icon image file name - - * gui/contact-editor/e-contact-editor.c : - (im_treeview_drag_data_get_cb), (im_treeview_drag_data_rcv_cb) : - (set_im_fields) : added code to add Gw Im id to contact-editor - - -2004-02-24 Hans petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-quick-add.c (quick_add_set_name): - Port to new way of setting name in contact. - -2004-02-24 JP Rosevear <jpr@ximian.com> - - * gui/component/addressbook-migrate.c (migration_context_new): - don't init the dialog here - (addressbook_migrate): init it here - - Fixes #54214 - -2004-02-20 Chris Toshok <toshok@ximian.com> - * gui/contact-editor/e-contact-editor.c (phone_entry_changed): - remove some spew. - -2004-02-19 Chris Toshok <toshok@ximian.com> - - * gui/component/component-factory.c: s/HAVE_NSS/ENABLE_SMIME. - - * gui/component/addressbook-component.c: s/HAVE_NSS/ENABLE_SMIME. - -2004-02-19 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (activate_source): split out the - majority of the set_prop code for PROPERTY_SOURCE_UID_IDX here, so - it can be used for both SOURCE_UID and FOLDER_URI. - (set_prop): add a setter for "folder_uri". we sorta fudge things - and use the uri for the uid (the uid is only used as a hash key to - look up the view associated with the uri/source, so we should be - good still.) - (get_prop): add getter for "folder_uri". - (addressbook_new_control): add the "folder_uri" property to our - property bag. - -2004-02-19 Hans Petter Jansson <hpj@ximian.com> - - Fixes #45308 and duplicates. - - * gui/widgets/e-addressbook-model.c (eab_model_set_property): Store - the IDs of book signals connected to, so we can disconnect from them - later. - -2004-02-18 Hao Sheng <hao.sheng@sun.com> - - [ fixes bug #52765 ] - - * gui/contact-editor/e-contact-editor.c - (e_contact_editor_confirm_delete): make delete dialog support - ESC press. - -2004-02-17 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.h (struct - _EContactListEditor): add image_set slot. - - * gui/contact-list-editor/e-contact-list-editor.c - (list_image_changed_cb): set image_set = TRUE. - (e_contact_list_editor_init): init image_set = FALSE - (extract_info): only set the LOGO attribute if image_set = TRUE. - - * gui/contact-editor/e-contact-editor.h (struct _EContactEditor): - add image_set slot. - - * gui/contact-editor/e-contact-editor.c (extract_info): only set - the PHOTO attribute if image_set == TRUE. - (image_chooser_changed): new function, set image_set = TRUE and - call widget_changed. - (e_contact_editor_init): init image_set to FALSE. - (_address_arrow_pressed): quiet compiler. - -2004-02-17 Chris Toshok <toshok@ximian.com> - - [ fixes bug #53620 ] - - * gui/merging/eab-contact-compare.c (eab_contact_compare_name): "" - is a valid (and common) value for elements of EContactName now. - it's semantically equivalent to NULL in the old ECard foo. - -2004-02-12 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-migrate.c (migrate_contacts): free up - the list returned by e_book_get_contacts. - -2004-01-12 Rodney Dawes <dobey@ximian.com> - - * gui/component/addressbook-component.c (delete_addressbook_cb): - Fix capitalization of Address Book usage in sentence form - * gui/component/ldap-config.glade: Use Address Book instead of - Addressbook in here (Patch from Aaron Weber <aaron@ximian.com>) - -2004-02-11 Rodney Dawes <dobey@ximian.com> - - * gui/component/addressbook-component.c (delete_addressbook_cb): - (fill_popup_menu_callback): - * gui/widgets/e-addressbook-view.c (init_collection): - * gui/widgets/eab-gui-util.c (eab_error_dialog): - * gui/widgets/eab-popup-control.c (eab_popup_control_contstruct): - Address Book, not Addressbook - - Fixes #54166 and #54120 - -2004-02-10 JP Rosevear <jpr@ximian.com> - - * Makefile.am: build importers dir - -2004-02-08 Rodney Dawes <dobey@ximian.com> - - * gui/component/addressbook-migrate.c (create_groups): Initialize the - personal_source to NULL - - Fixes #54015 - -2004-02-08 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/widgets/e-addressbook-view.c (delete) : pass contact - as an argument instead of contact id to e_book_async_remove_contact - -2004-02-06 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-migrate.c (create_groups): don't - bother using a function-wide variable to store the personal - source. also, use g_build_filename properly (because fejj is a - whiner.) - (migrate_local_folders): same (wrt fejj whining). - -2004-02-06 Rodney Dawes <dobey@ximian.com> - - * gui/component/addressbook.c (addressbook_new_control): Hide the - border on the notebook also - * gui/widgets/e-addressbook-view.c (eab_view_new): Don't pack another - scrolled window inside of a scrolled window, just pack the contact - display inside the paned, since it already has a scrolled window - -2004-02-06 Rodney Dawes <dobey@ximian.com> - - * gui/widgets/e-addressbook-view.c: Use "Address Book" instead of - "folder" or "Addressbook" for the "Address Book Sources..." and - copy/move contact menu items - - Fixes #53654 - -2004-02-06 Chris Toshok <toshok@ximian.com> - - * importers/evolution-ldif-importer.c (getNextLDIFEntry): only set - the address if something in it's been filled in. - (resolve_list_card): build up a separate list representing the xml - formatted crud. - (process_item_fn): remove FIXME. - (factory_fn): use g_new0 since we test for NULL-ness later on. - - * importers/evolution-vcard-importer.c (factory_fn): use g_new0 - since we test for NULL-ness later on. - -2004-02-06 JP Rosevear <jpr@ximian.com> - - * importers/evolution-ldif-importer.c (importer_destroy_cb): - implement - -2004-02-06 JP Rosevear <jpr@ximian.com> - - * importers/evolution-vcard-importer.c (importer_destroy_cb): - implement - (load_file_fn): use g_file_get_contents to get a string we can - convert to a contact list with eab_contact_list_from_string - -2004-02-06 JP Rosevear <jpr@ximian.com> - - * importers/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in: - shlib importer info - - * importers/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in: - ditto - - * importers/Makefile.am: build shlib addressbook importers - - * importers/evolution-ldif-importer.c: First crack at resurrecting - - * importers/evolution-vcard-importer.c: ditto - -2004-02-03 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-contact-display.c (on_url_requested): remove - some spew, and add an evo-icon: handler, for things in evolution's - imagedir. - (render_address): hack up the html. - (render_name_value): new function, just render a name/value/icon. - (render_attribute): split out most of this function into - render_name_value. this just checks to see if the EContact - attribute has something in it before passing it along. - (render_contact_list): split this out from - eab_contact_display_render_normal. - (start_block): new function, insert a row of height 20 with a - header. - (end_block): new function, insert a row of height 20. - (render_contact): split this out from - eab_contact_display_render_normal, and prettify the contact - display. - (eab_contact_display_render_normal): call render_contact and - render_contact_list. - (eab_contact_display_new): create a scrolled window and add the - GtkHTML to it so we actually have scrollbars. - -2004-02-03 Dan Winship <danw@ximian.com> - - * gui/component/select-names/Makefile.am (INCLUDES): add - widgets/misc for e-activity-handler.h - -2004-02-03 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/component/addressbook-config.c (dialog_to_source) - (source_to_dialog) : use gtk_spin_button_* apis to get and set - values for download limit spin button instead of gtk_entry - Fixes #53432 - -2004-02-02 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c (eab_view_new): hook up - contact_changed/contact_removed signals. - (contact_changed): new function. if the changed contact is the - one we're displaying, re-render it. - (contact_removed): new function. if the removed contact is the - one we're displaying, clear the display. - (render_contact): set displayed_contact to the row. - (eab_view_init): init displayed_contact to -1. - (selection_changed): set displayed_contact to -1 when we clear the - display. - - * gui/widgets/e-addressbook-view.h (struct _EABView): add - "displayed_contact" so we can update the contact preview when it - changes. - -2004-01-30 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c: enable d&d drop photos. - - * gui/contact-editor/contact-editor.glade: use - eab_create_image_chooser_widget for the d&d'able image. - - * gui/contact-list-editor/e-contact-list-editor.c: abstract out - all the d&d image support (it's now in - widgets/misc/e-image-chooser.[ch]). - - * gui/contact-list-editor/contact-list-editor.glade: use - eab_create_image_chooser_widget for the d&d'able image. - - * gui/widgets/eab-gui-util.c (eab_create_image_chooser_widget): - new function. - - * gui/widgets/eab-gui-util.h: add prototype for - eab_create_image_chooser_widget. - -2004-01-29 Hans Petter Jansson <hpj@ximian.com> - - * gui/widgets/eab-gui-util.c (source_selection_changed_cb): Implement. - (eab_select_source): Implement. Public function that prompts user to - select a source from a list. - (eab_transfer_contacts): Enable and use eab_select_source () and - ESource, instead of old shell folder/URI stuff. - -2004-01-29 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/ldap-config.glade: Changed "Finish" to "Apply" in - dialog finish page text. - -2004-01-29 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook-config.c (dialog_to_source): Sync the - modified source list. - - * gui/component/addressbook-component.c (delete_addressbook_cb): Sync - the modified source list. - -2004-01-29 Chris Toshok <toshok@m198-139.dsl.rawbw.com> - - * gui/component/addressbook-migrate.c (setup_progress_dialog): use - the MigrationContext struct. - (dialog_close): same. - (dialog_set_folder_name): same. - (dialog_set_progress): same. - (migrate_contacts): same, and pass it along to other functions. - (migrate_contact_folder_to_source): same. - (migrate_contact_folder): same. also, add the old path/uid to the - folder_uid_map. - (migrate_local_folders): same. - (create_groups): use the MigrationContext struct. - (migrate_completion_folders): if it's a file uri, look up the old - path in our hash table for a uid to use. otherwise use the old - behavior. - (migration_context_new): new function, initialize the - MigrationContext. - (migration_context_free): free up everything. - (addressbook_migrate): create the context, pass it to everything, - destroy the context, shine toshok's shoes, etc. - -2004-01-29 Radek Doulik <rodo@ximian.com> - - * gui/component/addressbook-config.c (dialog_to_temp_source): set - group to temporary source - -2004-01-28 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/select-names/e-select-names-table-model.c - (fill_in_info): Get file_as instead of full_name. - - * gui/compoent/select-names/e-select-names.etspec: Show the file_as - column instead of full_name. - -2004-01-27 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor-fullname.c - (e_contact_editor_fullname_set_property): Handle NULL name. Fixes - #53071. - -2004-01-27 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.c (dialog_to_source): set the - relative_uri of a local source to be its uid. - - * gui/component/addressbook-migrate.c - (migrate_contact_folder_to_source): remove the dest_group arg, - since we don't use it. - (migrate_contact_folder): set the relative uri of the source to be - its uid. - (PERSONAL_RELATIVE_URI): "Personal" -> "system". - (create_groups): don't actually make the directory hierarchy for - the personal folder here. let e-d-s do that. Also remove - OnThisComputer from the base uri. - (migrate_local_folders): track change to - migrate_contact_folder_to_source. - -2004-01-26 Chris Toshok <toshok@ximian.com> - - [ Should fix #53361 and other migration problems/crashes ] - * gui/component/addressbook-migrate.c - (migrate_contact_folder_to_source): new function, takes most of - migrate_contact_folder's contents. Fix some of the refcounting - problems though, by not unreffing dest_group, and using - e_group_add_source instead of e_source_set_group. - (migrate_contact_folder): convert to calling - migrate_contact_folder_to_source. - (create_groups): add an out parameter for *personal_source. - (migrate_local_folders): add personal_source as an arg, so we can - get the source that create_groups created/found. Call - migrate_contact_folder_to_source for the personal_source. - (addressbook_migrate): pass personal_source to - migrate_local_folders. - -2004-01-26 Chris Toshok <toshok@ximian.com> - - [ fixes #53238 ] - * util/eab-destination.c (nonempty): make this accept NULL's (and - return FALSE for them). - (eab_destination_is_empty): shorten some of the tests since - nonempty takes NULL now. - (eab_destination_get_address): only call - camel_internet_address_add if both name and email are non-empty. - otherwise call camel_address_decode and let camel try to deal with - it. - (eab_destination_xml_encode): call xmlEncodeEntitiesReentrant on - the strings before adding them to the xml, so people that enter - [<>&] won't end up with broken EABDestinations. - -2004-01-26 Radek Doulik <rodo@ximian.com> - - * gui/widgets/e-addressbook-view.c (selection_received): make sure - we pass \0 terminated string to eab_contact_list_from_string - [it may fix #51743] - -2004-01-25 Chris Toshok <toshok@ximian.com> - - [ fixes bug #51171 ] - * gui/widgets/eab-gui-util.c (eab_send_contact_list): get this - working. - -2004-01-24 Rodney Dawes <dobey@ximian.com> - - * gui/component/select-names/e-select-names.c (e_select_names_init): - Select Contacts from Address Book, not Contents - - Fixes #53263 - -2004-01-24 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-migrate.c (migrate_local_folders): - oops. - (migrate_contact_folder): fix the unreffing. - -2004-01-24 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-migrate.c (migrate_local_folders): use - _("Personal"), not "Personal". - -2004-01-24 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-migrate.c (migrate_local_folders): - don't create/add the source here. it's done in - migrate_contact_folder. - -2004-01-24 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-migrate.c (migrate_local_folders): use - e_folder_map_local_folders. - (find_addressbook_dirs): nuke. - -2004-01-24 JP Rosevear <jpr@ximian.com> - - * gui/widgets/e-addressbook-view.c (init_collection): use - .evolution to store view info - -2004-01-23 Chris Toshok <toshok@ximian.com> - - [ fixes bug #52571 ] - * util/eab-book-util.c (escape): ugh. name fields that have \" - around the name break our queries, because it turns it into (for - instance): (contains "full_name" ""Toshok""). so we need to turn - that into: (contains "full_name" "\"Toshok\""). - (eab_name_and_email_query): escape both the name and email, and - use an EBookQuery instead of passing the string to - e_book_async_get_contacts. Looks like ross missed a couple of - spots. - (eab_nickname_query): same. - - * gui/component/addressbook.c (free_load_source_data): new - function, free up the data and unref the source if there is one. - (load_source_auth_cb): call free_load_source_data instead of just - g_free'ing the struct. - (load_source_cb): same. - (default_book_cb): new function, we need this so we can fill in - the source for the default book. get the source, then call - load_source_cb to continue processing as normal. - (addressbook_load_default_book): use default_book_cb instead of - load_source_cb. - -2004-01-22 Chris Toshok <toshok@ximian.com> - - [ fixes bug #53184 ] - * gui/component/addressbook-migrate.c (migrate_contacts): handle - the fact that the xml 1.4 spits out contains unescaped ';'s in the - EMAIL attributes for mailing lists. - -2004-01-22 Chris Toshok <toshok@ximian.com> - - [ fixes bug #52944 ] - * gui/component/addressbook-migrate.c (migrate_contacts): do some - massaging of contacts as we import them, to fix up the differences - between 1.4 and 1.5 vcards. - -2004-01-21 Nat Friedman <nat@novell.com> - - * gui/contact-editor/contact-editor.glade: Added missing - entry-blog widget. - -2004-01-21 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook-config.c (create_source_dir): Remove. - (dialog_to_source): Don't create source dir, backend takes care of - that now. - -2004-01-21 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c - (addressbook_component_peek_gconf_client): new function. - - * gui/component/addressbook-component.h: add prototype for - addressbook_component_peek_gconf_client. - - * gui/component/addressbook-migrate.c - (migrate_completion_folders): more gross hacking. migrate the - completion settings. - (get_source_by_uri): function to search for an ESource given the - entire uri. used for migrate_completion_folders. - (migrate_ldap_servers): get_string_value -> get_string_child. - same with get_integer_child. - (get_string_child): rename to make it apparent it's a child, not a - property. - (get_integer_child): same. - (addressbook_migrate): call migrate_completion_folders. - -2004-01-21 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (new_target_cb): call - widget_changed here too, since we're changing the destination. - -2004-01-20 Chris Toshok <toshok@ximian.com> - - [ fixes bug #52955 ] - * gui/merging/eab-contact-compare.c (use_common_book_cb): handle - the case properly where there are no query parts (p == 0). - Instead of passing "" to e_book_query_from_string, just set the - query to NULL. - - * util/eab-book-util.c (eab_contact_list_to_string): we need to - put a blank line here, so \r\n\r\n, not just \r\n. - -2004-01-20 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-migrate.c (create_groups): deal with - the groups/sources already being there. Essentially make this - function idempotent. - (addressbook_migrate): unconditionally call create_groups now. - move the version logic here from ipl_upgradeFromVersion, and - include more versions in the set of those we upgrade from. - - * gui/component/addressbook-migrate.h: add major/minor/revision - args to addressbook_migrate. - - * gui/component/addressbook-component.c (impl_upgradeFromVersion): - remove the version logic from here. - -2004-01-20 Sivaiah Nallagatla <snallagatla@novell.com> - - * printing/e-contact-print.c (e_contact_print_response): do not - try to unref when query is NULL - -2004 -01-20 Sivaiah Nallagatla <snallagatla@novell.com> - - * gui/contact-editor/e-contact-editor.c (edit_im_clicked) : do not call - gtk_tree_model_get when nothing in the list is selected - -2004-01-19 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/select-names/e-select-names.etspec: Get name from - correct model column. - -2004-01-19 Hans Petter Jansson <hpj@ximian.com> - - * printing/e-contact-print.c (complete_sequence): Only unref if we - have a query. - -2004-01-19 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook-component.c - (get_primary_source): Implement. - (load_primary_selection): Use get_primary_source (). - (impl_requestCreateItem): Use get_primary_source (), fixing a crash - when we're asked to create a new item and we don't have the controls. - -2004-01-16 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook.c (load_source_auth_cb): Don't run - callback if the action was cancelled. - (load_source_cb): Ditto. - (addressbook_load_source): Return an ID for the load attempt. - (addressbook_load_source_cancel): Implement, allows cancelling a - load attempt. - - * gui/contact-editor/e-contact-editor.c (new_target_cb): Clear the - values for in-progress load operation. Only unref new_book if it's - non-NULL. - (cancel_load): Implement. Cancels the load operation if one is in - progress. - (source_selected): Cancel any running load operation before starting - a new one. Set up in-progress values. - (e_contact_editor_init): Clear the in-progress values. - (e_contact_editor_dispose): Cancel load operation. - (e_contact_editor_set_property): If a new target book is set, cancel - any conflicting load operation in progress. - - * gui/widgets/e-addressbook-view.c (set_paned_position): Remove - debug output. - (get_paned_position): Ditto. - -2004-01-16 JP Rosevear <jpr@ximian.com> - - * gui/component/addressbook.c (set_prop): only set the menus and - command state if we actually are already displayed, otherwise wait - for activation - -2004-01-15 Hans Petter Jansson <hpj@ximian.com> - - * gui/widgets/e-addressbook-view.c (set_paned_position): Implement. - (get_paned_position): Implement. - (eab_view_new): Connect signal to get paned position changes. - Remove old hack. - (display_view): Set paned position properly. - -2004-01-12 JP Rosevear <jpr@ximian.com> - - * gui/component/addressbook-component.c (impl_upgradeFromVersion): - revert dumb upgrade change - -2004-01-12 JP Rosevear <jpr@ximian.com> - - * gui/component/addressbook-component.c (impl_upgradeFromVersion): - migrate from 1.5.0 and 1.5.1 properly - -2004-01-12 JP Rosevear <jpr@ximian.com> - - * gui/contact-editor/contact-editor.glade: de-bold ui elements - -2004-01-09 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook-component.c (add_popup_menu_item): Take a - sensitivity flag per menu item, and fall back to stock icons. - (delete_addressbook_cb): Implement. - (fill_popup_menu_callback): Reorder items, remove "remove" item, set - sensitivity. - - * gui/component/ldap-config.glade: "Edit LDAP Server" -> - "Addressbook Properties". - -2004-01-11 Christian Hammond <chipx86@gnupdate.org> - - * addressbook/gui/contact-editor/e-contact-editor-im.[ch], - addressbook/gui/contact-editor/im.glade: Added a dialog for - adding a new IM account. - * addressbook/gui/contact-editor/Makefile.am: Added the previously - mentioned files, and depend on camel for necessary MIME parsing. - - * addressbook/gui/contact-editor/contact-editor.[ch], - addressbook/gui/contact-editor/contact-editor.glade: Add and implement - -2004-01-09 Ross Burton <ross@burtonini.com> - - * gui/component/select-names/e-select-names-completion.c: - * gui/merging/eab-contact-compare.c: - * gui/widgets/e-addressbook-model.c: - * printing/e-contact-print.c: - Update for API changes to e-book-async. - -2004-01-08 Ross Burton <ross@burtonini.com> - - * gui/contact-editor/contact-editor.glade: - * gui/contact-editor/e-contact-editor.c: - Add the video conferencing field. - -2004-01-07 Rodney Dawes <dobey@ximian.com> - - * gui/component/select-names/e-select-names.c: - * gui/component/select-names/select-names.glade: Make the ESelectNames - object be a HIG-compliant dialog, change "Folder" to be "Address Book", - and fix a mnemonic conflict with "Category" and "Cancel" - - Fixes #51966 - -2004-01-07 Rodney Dawes <dobey@ximian.com> - - * gui/component/addressbook-component.c: Move the smime_component_init - call to the instance init callback, rather than the class init, and - wrap it in #if HAVE_NSS, so the addressbook works without smime support - -2004-01-07 JP Rosevear <jpr@ximian.com> - - * gui/component/Makefile.am: link in printer stuff - - Fixes #51172 - -2004-01-06 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-migrate.c (check_for_conflict): remove - spew. - (migrate_contacts): same. - (migrate_contact_folder): same. - (migrate_local_folders): same, and plug a leak. - -2004-01-06 Chris Toshok <toshok@ximian.com> - - * gui/component/Makefile.am (libevolution_addressbook_la_SOURCES): - add addressbook-migrate.[ch]. - - * gui/component/addressbook-component.c - (addressbook_component_init): remove the source creation from - here, it's in the migration code now. - (impl_upgradeFromVersion): new function, call the - addressbook-migration stuff. - (addressbook_component_class_init): fill in - epv->upgradeFromVersion, and call smime_component_init. - (addressbook_component_peek_base_directory): new function. - (addressbook_component_peek_source_list): same. - - * gui/component/addressbook-component.h: add prototypes for - _peek_base_directory and _peek_source_list. - - * gui/component/addressbook-migrate.[ch]: add migration code to - convert stuff from 1.x over to 1.5/2.0. - -2004-01-06 Rodney Dawes <dobey@ximian.com> - - * gui/contact-editor/e-contact-editor-address.c: Apply - patch from Roozbeh Pournader to update countries list - - Fixes #48151 - -2004-01-06 JP Rosevear <jpr@ximian.com> - - * gui/component/select-names/e-select-names-popup.c - (popup_info_cleanup): disconnect from selection-done signal - -2004-01-05 JP Rosevear <jpr@ximian.com> - - * gui/component/addressbook.c - (addressbook_show_load_error_dialog): these line breaks in the - error messages should actually be spaces - - Fixes #51732 - -2003-12-19 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook-component.c (find_first_source): Impl. - from calendar. - (save_primary_selection): Implement, similar to calendar. - (load_primary_selection): Implement, similar to calendar. - (primary_source_selection_changed_callback): Save selection. - (impl_createControls): Load selection. - -2003-12-18 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (widget_changed): - editable -> target_editable - (e_contact_editor_get_property): Same. - (_email_arrow_pressed): Same. - (enable_writable_fields): Same. - (set_editable): Same. - (contact_added_cb): Make sure source book is editable before trying - to remove contact from there. - (e_contact_editor_init): Set up source/target editability. - (command_state_changed): Allow save only if target editable. Allow - delete only if source editable. - (e_contact_editor_set_property): Set editability flags for - source/target. - - * gui/contact-editor/e-contact-editor.h: Add source_editable, - target_editable flags in place of old editable flag. - -2003-12-17 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c (eab_view_class_init): install - the "source" property. - (eab_view_init): init eav->source to NULL. - (eab_view_dispose): disconnect the ecml_changed_id and unref - source. - (eab_view_new): create the search bar here. - (view_preview): c&p the mailer's code mostly for this - this is - the toggle listener for the Preview Pane menuitem. - (setup_menus): add a listener for the ContactsViewPreview toggle. - (eab_view_set_property): sensitize the search bar based on whether - or not we have a book set. This makes it so you can't search - until the book is loaded. Also add handling for the "source" - attribute and print a warning when it's set multiple times - (something that's not supported at the moment.) - (eab_view_get_property): add "source" case. - (search_activated, query_changed, compare_subitems, make_subitems, - ecml_changed, get_master_list, connect_master_list_changed): move - this here from addressbook.c - (eab_view_show_contact_preview): implement - just show or hide the - scrolled window. - (eab_view_setup_menus): call e_search_bar_set_ui_component here, - kind of a hack. - - * gui/widgets/e-addressbook-view.h: make this inherit from GtkVBox - instead of GtkEventBox since we'll be packing children. Add a - prototype for eab_view_show_contact_preview. - - * gui/component/addressbook.c (get_current_view): return the - EABView associated with the active notebook page. - (save_contact_cb): use the current view. - (view_contact_cb): same. - (search_cb): same. - (delete_contact_cb): same. - (print_cb): same. - (print_preview_cb): same. - (stop_loading_cb): same. - (cut_contacts_cb): same. - (copy_contacts_cb): same. - (paste_contacts_cb): same. - (select_all_contacts_cb): same. - (send_contact_cb): same. - (send_contact_to_cb): same. - (copy_contact_to_cb): same. - (move_contact_to_cb): same. - (update_command_state): same. - (change_view_type): nuke, nothing uses this. - (control_activate): use the current view. - (control_activate_cb): same. - (source_list_changed_cb): new function, remove the notebook pages - (and destroy the EABView's) for sources that no longer exist. - (addressbook_view_clear): dispose of the uid_to_view hash. - (book_open_cb): store the ESource on the EABView too. this - function now takes a struct containing both EABView and ESource - since we can't store either in the AddressbookView. - (set_prop): if we have a view already for this uid, bring it up. - otherwise create a new one and start the book loading. - (addressbook_search_activated): nuked - this is being moved to - e-addressbook-view. - (addressbook_query_changed): same. - (compare_subitems, make_subitems, ecml_changed, - connect_master_list_changed): same. - (addressbook_new_control): simplify things a bunch. create a - notebook to store the views in. the search/vbox stuff is gone. - use e_source_list_new_for_gconf_default, and handle the source - list's "changed" signal. - -2003-12-17 Rodney Dawes <dobey@ximian.com> - - * gui/component/autocompletion-config.c: - (autocompletion_config_control_new): Embed Tree in GtkScrolledWindow - -2003-12-16 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (contact_added_cb): Update - the contact's UID after normal add. - -2003-12-16 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook.c (addressbook_show_load_error_dialog): - Make a public function that shows an error dialog, which can be used - when a source fails to load. - (book_open_cb): Call addressbook_show_load_error_dialog () on error. - (set_prop): Don't reuse the book when loading a new source. This was - confusing the contact-editor, which gets the book passed in. - - * gui/contact-editor/e-contact-editor.c (e_contact_editor_class_init): - Make "source_book" and "target_book" distinct properties. - (new_target_cb): Implement. - (source_selected): Implement. - (contact_moved_cb): Implement. - (contact_added_cb): Handle the case where source_book != target_book as - a move - if the add was successful, remove contact from source book. - (save_contact): Handle case where source_book != target_book. - (delete_cb): "book" renamed to "source_book". - (e_contact_editor_init): Set up source_selected signal. - (e_contact_editor_dispose): Dispose of both source and target books. - (e_contact_editor_new): "book" renamed to "source_book". - (e_contact_editor_set_property): If a source book is set, and we don't - have a target book, make target_book == source_book. Allow setting - target book, and base editability on that. If we're editing an existing - contact, treat book change as a change, and update command state. - (e_contact_editor_get_property): Allow getting target book. - (set_source_field): Indicate the selected book. - -2003-12-16 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (set_source_field): Implement. - Makes the source menu reflect the source for the current book. - -2003-12-16 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c - (e_contact_editor_create_source_option_menu): Implement. Creates - source selection option menu. - - * gui/contact-editor/contact-editor.glade: Add source selection custom - widget. - -2003-12-16 Hans Petter Jansson <hpj@ximian.com> - - * gui/widgets/e-addressbook-table-adapter.c - (addressbook_is_cell_editable): Disable cell editing. - -2003-12-15 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor.c (address_to_text): Implement. - (text_to_address): Implement, using EAddressWestern. - (address_text_changed): Adapt to EContactAddress. - (full_addr_clicked): Ditto. Fix field IDs. - (e_contact_editor_init): Init address_choice. - (_email_arrow_pressed): Fix field IDs. - (_address_arrow_pressed): Adapt to EContactAddress and fix field IDs. - (find_address_mailing): Leave out for now. Addresses don't have flags - anymore... - (set_fields): Adapt to EContactAddress and fix field IDs. Make sure - changes to other widgets don't make us go back to the first listed - address. - (set_address_field): Adapt to EContactAddress and fix field IDs. - (enable_writable_fields): Ditto. - (fill_in_info): Disable find_address_mailing () for now. - -2003-12-10 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-editor/e-contact-editor-address.c - (e_contact_editor_address_class_init): Make "address" a boxed type. - (e_contact_editor_address_init): Set address to NULL. - (e_contact_editor_address_dispose): Free address. - (e_contact_editor_address_new): Take an EContactAddress. - (e_contact_editor_address_set_property): Re-implement setting the - address property. - (e_contact_editor_address_get_property): Ditto for getting. - (fill_in_info): Enable, use EContactAddress fields. - (extract_info): Ditto. - - * gui/contact-editor/e-contact-editor-address.h: - Re-enable the address field, as EContactAddress. - -2003-12-09 JP Rosevear <jpr@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c (fill_in_info): - free email list properly - -2003-12-09 JP Rosevear <jpr@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c (extract_info): - free the list, not unref it, and free the elements - - Fixes #51976 - -2003-12-06 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (open_book_cb): change prototype to fix warning, and change the - comment to read load_source instead of load_uri (which isn't what - we use anymore.) - (update_completion_books): just use our source list for this. - check the "completion" source property. - (source_list_changed): recreate the completion books. - (e_select_names_manager_init): connect to the source_list's - changed signal. - (e_select_names_manager_dispose): don't need to free the - completion_uids list anymore. - - * gui/component/select-names/e-select-names-config.c - (e_select_names_config_get_completion_books, - e_select_names_config_set_completion_books, - e_select_names_config_add_notification_completion_books): remove. - - * gui/component/select-names/e-select-names-config.h: remove the - completion books calls, since we can just use the source list. - - * gui/component/component-factory.c (factory): create the - autocompletion control. - - * gui/component/autocompletion-config.[ch]: new config control for - selecting completion folders. Uses e-source-selector. Could - probably be beautified a bit. - - * gui/component/Makefile.am (libevolution_addressbook_la_SOURCES): - add autocompletion-config.[ch] - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: remove - the ldap config control server, and add the autocompletion one. - -2003-12-06 JP Rosevear <jpr@ximian.com> - - * */Makefile.am: Remove hard coded disable deprecated flags - -2003-12-05 JP Rosevear <jpr@ximian.com> - - * gui/component/select-names/select-names.glade: no more custom - widget for the selection of the search source - - * gui/component/select-names/e-select-names.h: add member - - * gui/component/select-names/e-select-names.etspec: update model - column - - * gui/component/select-names/e-select-names.c (find_first_source): - find the first source in the list - (addressbook_model_set_source): we have the source to set directly - now - (source_selected): listen for the source item to change - (e_select_names_init): create a source option menu and hook it up - (e_select_names_dispose): destroy the source list - (e_select_names_new): do away with the config setup here - - * gui/component/select-names/e-select-names-manager.h: update - members - - * gui/component/select-names/e-select-names-manager.c - (update_completion_books): add books based on source uid - (config_completion_books_changed_cb): handle the completion list - changing - (config_min_query_length_changed_cb): handle minimum query length - changing - (e_select_names_manager_new): we don't do the settings stuff here - any more - (e_select_names_manager_init): do the initial set up here for the - book loaded and listen for changes - (e_select_names_manager_dispose): destroy the new stuff - - * gui/component/select-names/e-select-names-config.[hc]: config - information - - * gui/component/select-names/e-select-names-config-keys.h: the - config keys - - * gui/component/select-names/e-select-names-bonobo.c - (impl_SelectNames_activate_dialog): do away with the shell client - stuff - - * gui/component/select-names/Makefile.am: build new files - -2003-12-05 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-model.c (book_view_loaded): call - remove_book_view/free_data here as well, to guard against multiple - book_view's being loaded. - -2003-12-05 Hans Petter Jansson <hpj@ximian.com> - - * gui/widgets/e-addressbook-view.etspec: Clean up and sync with - current model columns. - -2003-12-04 Christian Hammond <chipx86@gnupdate.org> - - * addressbook/gui/contact-editor/e-contact-editor-im.[ch], - addressbook/gui/contact-editor/im.glade: Added a dialog for - adding a new IM account. - * addressbook/gui/contact-editor/Makefile.am: Added the previously - mentioned files, and depend on camel for necessary MIME parsing. - - * addressbook/gui/contact-editor/contact-editor.[ch], - addressbook/gui/contact-editor/contact-editor.glade: Add and implement - the Instant Messaging tab. - -2003-12-03 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c - (retrieve_shell_view_interface_from_control): Remove. - (set_folder_bar_label): Remove. - (addressbook_new_control): Don't connect. - -2003-12-03 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-config.c: Do not depend on - e-folder-list. - - * gui/component/select-names/e-select-names.c: Remove dependency - on evolution-folder-selector-button. - (e_addressbook_create_folder_selector): Just return a FIXME label - for now. - (folder_selected): #if 0 out. - (e_select_names_init): Do not connect. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_activate_dialog): Don't get a shell_client - arg anymore. - (load_completion_books): Stub out. - - * gui/component/select-names/e-select-names.c - (e_select_names_new): Don't get an EvolutionShellClient anymore. - Don't create the folder selector button for now. - - * gui/component/select-names/e-select-names.h: Remove dependency - on evolution-shell-client. - - * gui/component/select-names/e-select-names-bonobo.c: Remove - dependency on evolution-shell-client. - (impl_SelectNames_activate_dialog): Stub out. - - * gui/widgets/eab-gui-util.c: Remove dependency on - evolution-shell-client. - (eab_transfer_contacts): Stub out. - -2003-12-02 Rodney Dawes <dobey@ximian.com> - - * gui/component/Makefile.am: Version the schemas - * gui/component/apps_evolution_addressbook.schemas: Removed - * gui/component/apps_evolution_addressbook.schemas.in.in: Added - -2003-12-02 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c (set_status_message): Call - e_activity_handler_operation_finished() on the current activity ID - when done. - -2003-12-01 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c (struct AddressbookView): Replace - activity_client with activity_id. - (set_status_message): Use the EActivityHandler from the - AddressbookComponent. - - * gui/component/addressbook-component.c (struct - _AddressbookComponentPrivate): New member activity_handler. - (addressbook_component_init): Init. - (impl_dispose): Unref. - (addressbook_component_peek_activity_handler): New. - (impl_createControls): Return an ETaskBar as the statusbar control - and attach it to the activity handler. - -2003-12-01 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (impl_createControls): - Pass a label for the status bar control for now. - -2003-12-01 Larry Ewing <lewing@ximian.com> - - * gui/component/Makefile.am (INCLUDES): remove - GTK_DISABLED_DEPRECATED so that we can build with gtk-2.3. - -2003-12-01 Rodney Dawes <dobey@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: - * gui/component/addressbook-config.c: - * gui/component/addressbook.c: - * gui/component/component-factory.c: - * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in: - * gui/component/select-names/e-select-names-bonobo.c: - * gui/component/select-names/e-select-names-factory.c: - * gui/widgets/eab-gui-util.c: - * gui/widgets/eab-vcard-control.c: Use BASE_VERSION for repo_ids and - OAFIIDs - -2003-12-01 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/ldap-config.glade: Fix start page text. - -2003-12-01 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: use privconduitdir - - * conduit/e-address.conduit.in: subst right thing - -2003-12-01 JP Rosevear <jpr@ximian.com> - - * conduit/e-address.conduit.in: specify privlibdir as the location - - * conduit/Makefile.am: install the conduit to privlibdir - -2003-12-01 JP Rosvear <jpr@ximian.com> - - * conduit/Makefile.am: version the .conduit file - -2003-12-01 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/new-addressbook.glade: Remove this too. - - * gui/component/Makefile.am (glade_DATA): Remove new-addressbook.glade. - -2003-12-01 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/Makefile.am (libevolution_addressbook_la_SOURCES): - Remove addressbook-storage.[ch] and new-addressbook.[ch]. - - * gui/component/addressbook-storage.[ch]: Removed from repository. - - * gui/component/new-addressbook.[ch]: Removed from repository. - - * gui/component/addressbook-component.c (load_uri_for_selection): - Set source_uid property on view control, not folder_uri. - (new_addressbook_cb): Call addressbook_config_create_new_source (). - (edit_addressbook_cb): Implement. - (fill_popup_menu_callback): Hook up edit_addressbook_cb (). - (addressbook_component_init): Create the LDAP source group. - - * gui/component/addressbook-config.c (AddressbookSourceDialog): - Take out the NEW_ADVANCED_UI stuff and add ESource related vars. - (ldap_unparse_auth) - (ldap_parse_auth) - (ldap_unparse_scope) - (ldap_unparse_ssl) - (ldap_parse_ssl): Moved here from addressbook-storage.c. - (addressbook_dialog_get_source) - (addressbook_dialog_set_source) - (objectclasses_create_server_table) - (objectclasses_create_evolution_table) - (objectclasses_add_foreach) - (objectclasses_add) - (objectclasses_sever_double_click) - (objectclasses_remove_foreach) - (objectclasses_remove) - (objectclasses_evolution_double_click) - (objectclasses_restore_default) - (server_selection_model_changed) - (evolution_selection_model_changed) - (setup_objectclasses_tab): Nuke aging, unfinished NEW_ADVANCED_UI. - (add_source_clicked) - (edit_source_clicked) - (delete_server) - (delete_source_clicked) - (ldap_config_control_destroy_callback) - (ldap_config_control_apply_callback) - (sources_selection_changed) - (sources_table_row_activated) - (ldap_dialog_new) - (addressbook_dialog_create_sources_table) - (ldap_config_control_new) - (addressbook_config_control_new): Nuke config control. - (create_source_dir) - (dialog_to_source) - (dialog_to_temp_source) - (source_to_uri_parts) - (source_to_dialog) - (source_group_changed_cb) - (source_group_menu_add_groups) - (folder_page_forward) - (finish_page_back): Implement. - (addressbook_ldap_init): Take ESource instead of AddressbookSource. - (addressbook_ldap_auth): Don't take a source, not needed. - (addressbook_root_dse_query): Ditto. - (addressbook_source_dialog_destroy): Clean up destroy function. - (addressbook_add_server_druid_finish): Clean up, create ESource. - (general_tab_check): If it's not LDAP, these options don't matter. - (do_ldap_root_dse_query): Source no longer needed here. - (query_for_supported_bases): Use a temp source generated from - current dialog settings. - (display_name_page_prepare): Renamed to folder_page_prepare (). - (druid_display_name_page_modify_cb): Renamed to - druid_folder_page_modify_cb (). - (addressbook_add_server_druid): Set up source list, group selector. - Make LDAP pages optional, dependent on selected group. Use ESource. - (edit_dialog_store_change): Remove config control list stuff, - export settings to ESource. - (addressbook_edit_server_dialog): Renamed to - addressbook_config_edit_source (), which takes an ESource. Remove - config control list stuff, make LDAP pages show up only if we have - an LDAP source. Remove NEW_ADVANCED_UI cruft. - (addressbook_config_create_new_source): Just call - addressbook_add_server_druid (). - - * gui/component/addressbook-config.h: Move LDAP enums here, from - addressbook-storage.h. - - * gui/component/addressbook.c (control_activate_cb): uri -> source - (addressbook_view_clear): Unref source list. - (book_open_cb): Use ESource. - (load_uri_auth_cb): Renamed to load_source_auth_cb (), manipulate - ESource instead of URI. - (get_remember_password): Implement. - (set_remember_password): Implement. - (addressbook_authenticate): Use ESource properties. - (load_uri_cb): Renamed to load_source_cb (), ESource adaptation. - (addressbook_load_uri): Renamed to addressbook_load_source (), takes - ESource. - (addressbook_load_default_book): ESource adaptation. - (get_prop): folder_uri property -> source_uid property. - (set_prop): folder_uri property -> source_uid property. Find ESource - by UID. - (addressbook_new_control): Set up source_uid property and ESourceList. - - * gui/component/component-factory.c (factory): Disable config control. - - * gui/component/ldap-config.glade: Druid and notebook dialogs - generalized to deal with local sources as well as LDAP. This file - should probably be renamed... - - * gui/component/select-names/e-select-names-manager.c - (load_completion_books): Use addressbook_load_source (). However, this - needs a bit more work to get source UIDs instead of URIs. - - * gui/component/select-names/e-select-names.c - (addressbook_model_set_uri): Use addressbook_load_source (). However, - this needs a bit more work to get source UIDs instead of URIs. - -2003-11-26 JP Rosevear <jpr@ximian.com> - - * gui/widgets/Makefile.am: turn on deprecated gtk and libgnomeui - stuff - - * gui/component/select-names/Makefile.am: turn on deprecated gtk - stuff - - * gui/contact-editor/Makefile.am: ditto - -2003-11-17 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/addressbook-component.c (impl_createControls): Store - a ref to the source selector. - (impl_requestCreateItem): Implement. - (impl_dispose): Unref the source selector. - (addressbook_component_init): Set up default sources. - - * gui/widgets/e-addressbook-model.c (eab_model_set_property): If - the 'book' property is set, and editability changes, emit a signal - to that effect. - -2003-11-14 JP Rosevear <jpr@ximian.com> - - * gui/component/new-addressbook.c: include e-source from e-d-s - -2003-11-13 Hans Petter Jansson <hpj@ximian.com> - - * gui/contact-list-editor/e-contact-list-model.c - (contact_list_is_cell_editable): Return TRUE for all cells, for now. - - * gui/widgets/e-addressbook-table-adapter.c (card_modified_cb): - Renamed to contact_modified_cb (). - (addressbook_set_value_at): Port to use EContact instead of ECard. - (addressbook_is_cell_editable): Ditto. - (addressbook_append_row): Ditto. - - * gui/widgets/e-minicard-label.c (e_minicard_label_set_property): - Make not editable, ever, and add a comment to this effect. - (e_minicard_label_realize): Ditto. - - * gui/widgets/e-minicard.c (e_minicard_set_property): Ditto. - (add_field): Ditto. - -2003-11-13 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c - (impl__get_userCreatableItems): New, implementation for the - userCreatableItems property. - (impl_requestCreateItem): New, implementation for the - requestCreateItem method. - (addressbook_component_class_init): Install. - -2003-11-12 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: Add - component_alias of "contacts". - -2003-11-08 Hans Petter Jansson <hpj@ximian.com> - - * gui/component/Makefile.am (libevolution_addressbook_la_SOURCES): - Add new-addressbook.[ch]. - (glade_DATA): Add new-addressbook.glade. - - * gui/component/addressbook-component.c (add_popup_menu_item): - Implement. - (new_addressbook_cb): Implement. - (delete_addressbook_cb): Implement (skeletal). - (fill_popup_menu_callback): Implement. - (impl_createControls): Hook up fill_popup_menu_callback(). - - * gui/component/new-addressbook.[ch]: New files. - - * gui/component/new-addressbook.glade: New file. - -2003-11-07 Dan Winship <danw@ximian.com> - - * util/Makefile.am (INCLUDES): Remove some includes of directories - that don't exist any more - -2003-11-07 JP Rosevear <jpr@ximian.com> - - * gui/contact-editor/Makefile.am: don't include the c marshaller - file twice - - * gui/widgets/Makefile.am: ditto - -2003-11-07 JP Rosevear <jpr@ximian.com> - - * gui/widgets/Makefile.am: make sure the marshal header is in the - source list - - * gui/component/select-names/Makefile.am: ditto - - * gui/contact-editor/Makefile.am: ditto - - * gui/contact-list-editor/Makefile.am: ditto - -2003-11-07 JP Rosevear <jpr@ximian.com> - - * util/Makefile.am: dist the marshal list - -2003-11-07 JP Rosevear <jpr@ximian.com> - - * gui/widgets/e-addressbook-view.c (change_view_type): don't - destroy the widget here - its dead when removed from the paned - container - -2003-11-07 JP Rosevear <jpr@ximian.com> - - * In the gui this is a search and replace commit for moving the - addressbook to evolution-data-server; it also deletes the old - backend files - -2003-11-05 Larry Ewing <lewing@ximian.com> - - * gui/widgets/e-addressbook-view.c (create_minicard_view): fix cast. - -2003-11-03 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/select-names/e-select-names-factory.c: Update - factory ID. - - * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in: - Version the SelectNames server IDs by appending a "_2". - -2003-11-03 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: Change - "evolution:config_item" into "evolution2:config_item". - -2003-10-29 Chris Toshok <toshok@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: add the - S/MIME config control here. - -2003-10-29 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-listener.c (e_book_listener_new): change - the poa hint to PER_REQUEST. fixes a couple of deadlocks. - -2003-10-29 Chris Toshok <toshok@ximian.com> - - * gui/component/component-factory.c (factory): ifdef the smime - code with HAVE_NSS. - - * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD): - conditionally include libevolution-smime.la. - -2003-10-24 Dan Winship <danw@ximian.com> - - * backend/pas/Makefile.am (libpas_la_LIBADD): libpas should depend - on libebook, but NOT on libpasfile, etc, since it needs to be - linked into all backends, not just the wombat. - (libpasfile_la_LIBADD): depend on libpas.la and libedb3util.la - (libpasvcf_la_LIBADD): depend on libpas.la - (libpasldap_la_LIBADD): depend on libpas.la and $(LDAP_LIBS) - -2003-10-23 Dan Winship <danw@ximian.com> - - * backend/ebook/e-contact.c (e_contact_date_equal): new util func - - * backend/pas/pas-backend-ldap.c (anniversary_compare, - birthday_compare): Use it - - * backend/pas/pas-backend-summary.c - (pas_backend_summary_check_contact): Check if an ID exists in the - summary. - -2003-10-23 Chris Toshok <toshok@ximian.com> - - * tools/Makefile.am: convert 8 spaces to a tab. - - * tools/.cvsignore: ignore evolution-addressbook-abuse and - evolution-addressbook-clean. - - * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD): - add libevolution-smime.la. - - * gui/component/component-factory.c (factory): add the certificate - manager config control stuff here, at least for now. - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: same. - -2003-10-23 Rodrigo Moya <rodrigo@ximian.com> - - * gui/component/addressbook-config.c - (addressbook_dialog_create_source_table): fixed typo in variable name. - -2003-10-22 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: Add an - "evolution:button_icon" attribute. - -2003-10-22 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: Add an - "evolution:button_sort_order" property. - -2003-10-22 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (impl_createControls): - Make the the scrolled window have an "in" shadow. - * gui/component/addressbook-config.c - (addressbook_dialog_create_sources_table): Likewise. - * gui/widgets/e-addressbook-view.c (create_minicard_view): Likewise. - (create_treeview_view): Likewise. - -2003-10-22 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (impl_createControls): Set - the GtkScrolledWindow scrollbar policy to "automatic" for both the - horizontal and the vertical scrollbar. - -2003-10-22 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: Add an - "evolution:button_label" property on the component for use in the - shell. - -2003-10-21 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c: make it work with the new ebook api - - * backend/pas/pas-book.c (pas_book_respond_get_changes): put the - vcard in for every change - - * backend/pas/pas-backend.c (pas_backend_change_add_new): just use - the vcard field - (pas_backend_change_modify_new): ditto - (pas_backend_change_delete_new): ditto - - * backend/pas/pas-backend-file.c - (pas_backend_file_changes_foreach_key): create a fake contact with - the uid - (pas_backend_file_get_changes): add the card to the changes - - * backend/ebook/tests/ebook/test-changes.c (main): just print the - uid - - * backend/ebook/e-book.c (e_book_free_change_list): unref the - contact - - * backend/ebook/e-book-types.h: the change struct contains an - EContact now - - * backend/ebook/e-book-listener.c - (impl_BookListener_respond_get_changes): create the contact from - the vcard string - - * backend/idl/addressbook.idl: Book change item is no longer a - union, it always gives back a card - -2003-10-21 Chris Toshok <toshok@ximian.com> - - * tools/evolution-addressbook-abuse.c: use the synchronous api for - this. simplifies it a bunch. - -2003-10-21 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book.c - (impl_GNOME_Evolution_Addressbook_Book_remove): we can ill afford - bad debug spew. - (view_listener_died_cb): implement. - (impl_GNOME_Evolution_Addressbook_Book_getBookView): hook up an - ORBit_small connection listener on the view's listener. - (pas_book_respond_create): use e_contact_get_const instead of - e_contact_get here. fixes a leak. - - * backend/pas/pas-book-view.c - (impl_GNOME_Evolution_Addressbook_BookView_stop): implement, call - pas_backend_stop_book_view. - (pas_book_view_get_listener): return the book view's listener. - (pas_book_view_class_init): fill in epv->stop. - (pas_book_view_init): use a #define for THRESHOLD_MAX instead of - the constant. - - * backend/pas/pas-book-view.h: add prototype for - pas_book_view_get_listener. - - * backend/pas/pas-backend.c (pas_backend_stop_book_view): - implement. - (pas_backend_remove_book_view): implement. - - * backend/pas/pas-backend.h: add prototype for stop_book_view and - remove_book_view. - - * backend/pas/pas-backend-vcf.c (load_file): pass in the fd and - use fdopen here. - (foreach_build_list): don't creat EContacts here, because we'll - just be converting them back to vcards anyway. - (save_file): use char*'s instead of EContacts, and split entries - with 2 blank lines. Also, hold the lock over the entire function. - (do_create): hold the lock around uid generation and touching the - hash table. - (pas_backend_vcf_process_remove_contacts): same. - (pas_backend_vcf_process_modify_contact): same. - (pas_backend_vcf_stop_book_view): new function, but leave - unimplemented for now. - (pas_backend_vcf_load_uri): the uri contains the directory name, - not the filename. - (pas_backend_vcf_dispose): grab the lock here just for sanity's - sake. Also reorder things a bit, and free the hashtable and - mutex. - (pas_backend_vcf_init): init the mutex. - - * backend/pas/pas-backend-summary.c - (pas_backend_summary_add_contact): don't unref the contact here. - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_stop_book_view): new function, but leave - unimplemented for now. - - * backend/pas/pas-backend-file.c (build_summary): use an EContact - for this call. - (do_summary_query): nuke, the contents of this has been moved to - start_book_view. - (pas_backend_file_search_timeout): same. - (pas_backend_file_search): same. - (pas_backend_file_start_book_view): glom everything into here - involving searching. This function could (and should) be renamed - and reused from both this function and _get_contact_list. - (pas_backend_file_stop_book_view): new function. - (pas_backend_file_class_init): fill in backend->stop_book_view. - - * backend/pas/Makefile.am (LDAP_BACKEND): libpasldap.a -> - libpasldap.la - (noinst_LTLIBRARIES): *.a -> *.la. - (libpas_la_SOURCES): same. - (libpasfile_la_SOURCES): same. - (libpasvcf_la_SOURCES): same. - (libpasldap_la_SOURCES): same. - - * backend/idl/addressbook.idl: add BookView::stop. - - * backend/ebook/e-vcard.c (read_attribute_value): fix GString - related leaks. - (read_attribute_params): same. - (parse): don't leak the EVCardAttributes corresponding to - BEGIN/END:vCard. - (free_gstring): new function - (e_vcard_attribute_remove_values): free the decoded_values list, - using free_gstring. - - * backend/ebook/e-book.c (e_book_response_get_book_view): ref the - listener here. - - * backend/ebook/e-book-view.h: add prototype for e_book_view_stop. - - * backend/ebook/e-book-view.c (e_book_view_stop): new function. - - * backend/ebook/e-book-async.c (_get_book_view_response_dtor): - unref the book view. - -2003-10-20 Dan Winship <danw@ximian.com> - - * backend/pas/pas-book-view.c: Queue up removes and modifies as - well as adds, and remove the calls that took a list of changes - rather than a single change, since no one was really using the - list versions. Keep a list of IDs currently in the view so we can - more easily figure out what changes count as adds, modifies, and - removes. - (send_pending_adds): Don't reset next_threshold if it's being - called from notify_add. - (send_pending_changes, send_pending_removes): New - (pas_book_view_notify_update): Simplified add/change interface. - Takes an EContact and figures out if it's new, modified, or - removed relative to this view. - (pas_book_view_notify_change, pas_book_view_notify_change_1, - pas_book_view_notify_add, pas_book_view_notify_add_1): Gone. - (pas_book_view_notify_remove): Now does what remove_1 used to do. - (pas_book_view_vcard_matches): Remove this; no longer used. - - * backend/pas/pas-backend.c (pas_backend_notify_update): New. - Calls pas_book_view_notify_update() on each of the backend's views. - (pas_backend_notify_remove): Likewise for notify_remove(). - (pas_backend_notify_complete): And notify_complete(). - - * backend/pas/pas-book.c (pas_book_respond_create): Take an - EContact instead of an id and a vcard. Use - pas_backend_notify_update. - (pas_book_respond_remove_contacts): Use pas_backend_notify_remove. - (pas_book_respond_modify): Take a single EContact instead of two - vcards. Use pas_backend_notify_update. - - * backend/pas/pas-backend-sync.c - (pas_backend_sync_create_contact): Return an EContact rather than - an id. - (pas_backend_sync_modify_contact): Return an EContact rather than - the old_vcard. - (_pas_backend_create_contact, _pas_backend_modify_contact): Update - - * backend/pas/pas-backend-file.c (do_summary_query): Use - pas_book_view_notify_update. - (pas_backend_file_search_timeout): Likewise - (pas_backend_file_create_contact): Update for API changes - (pas_backend_file_modify_contact): Likewise. - - * backend/pas/pas-backend-ldap.c (create_contact_handler, - pas_backend_ldap_process_create_contact): Update for API changes - (modify_contact_modify_handler, modify_contact_search_handler, - pas_backend_ldap_process_modify_contact): Likewise - (ldap_search_handler): Use pas_book_view_notify_update - - * backend/pas/pas-backend-vcf.c (foreach_search_compare): Use - pas_book_view_notify_update. - (pas_backend_vcf_process_create_contact): Update for API changes - (pas_backend_vcf_process_modify_contact): Likewise - - * backend/pas/pas-backend-summary.c - (pas_backend_summary_add_contact): Take an EContact instead of a - const char *vcard. - - * backend/ebook/e-contact.c (photo_getter): s/malloc/g_malloc/ - -2003-10-20 JP Rosevear <jpr@ximian.com> - - * backend/pas/pas-backend-vcf.c (pas_backend_vcf_search): compiler - with non-c99 compilers - -2003-10-17 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-contact.c (fn_getter): new function, just return - the full name value. - (fn_setter): rather distasteful hack. set the N attribute if it's - not already present. - (n_setter): set the X-EVOLUTION-FILE-AS attribute if it's not - already set. - - * backend/pas/pas-backend-ldap.c (prop_info): add PROP_WRITE_ONLY - flag for properties (right now just 'sn') that we don't want to - use when building the EContact - we only use it when storing the - contact out to the ldap server. - (build_contact_from_entry): skip WRITE_ONLY properties. - -2003-10-17 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c (init_collection): add the - minicard factory back in. - (display_view): add the minicard case back in. - (get_selection_model): same. - (minicard_right_click): resurrect. - (create_minicard_view): same. - (change_view_type): add the minicard case back in. - (eab_view_print): same. - (eab_view_print_preview): same. - - * gui/widgets/e-addressbook-view.h (EABViewType): add MINICARD - back in. - - * gui/widgets/e-addressbook-model.c (eab_model_new): - E_TYPE_AB_MODEL -> EAB_TYPE_MODEL. - - * gui/widgets/e-addressbook-model.h: rename E_TYPE_AB_MODEL to - EAB_TYPE_MODEL. - - * gui/widgets/Makefile.am (libeabwidgets_la_SOURCES): add the - minicard stuff back into the build. - - * gui/widgets/e-addressbook-reflow-adapter.[ch], - gui/widgets/e-minicard-label.[ch], - gui/widgets/e-minicard-view-widget.[ch], - gui/widgets/e-minicard-view.[ch], gui/widgets/e-minicard.[ch], - gui/widgets/gal-view-factory-minicard.[ch], gal-view-minicard.h: - resurrect the minicard stuff, in a new uneditable, - EContact-friendly state. no in-place editing anymore. - - -2003-10-10 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (fill_in_info): un-ifdef - the date handling code. - (extract_info): same. - - * backend/pas/pas-backend-ldap.c (prop_info): add the address - labels and dates to the build. - (anniversary_populate): un-ifdef and get this working. - (anniversary_ber): same. - (anniversary_compare): same. - (birthday_populate): same. - (birthday_ber): same. - (birthday_compare): same. - - * backend/ebook/tests/ebook/.cvsignore, - backend/ebook/tests/ebook/Makefile.am - backend/ebook/tests/ebook/test-date.c: add a test for EContactDate - getting/setting. - - * backend/ebook/e-vcard.h: add EVC_BDAY. - - * backend/ebook/e-contact.h: add prototypes for the - e_contact_date_* functions. - - * backend/ebook/e-contact.c (field_info): add - BIRTH_DATE/ANNIVERSARY fields. - (date_getter): new - (date_setter): new - (e_contact_date_new): new - (e_contact_date_from_string): new - (e_contact_date_to_string): new - (e_contact_date_free): new - -2003-10-10 Not Zed <NotZed@Ximian.com> - - * - gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in: - Use the main factory on the .so file, so it can be found. - -2003-10-08 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names.c (contact_key): add a - descriptive comment about this "#if notyet". - - * gui/component/select-names/e-select-names-model.h - (e_select_names_model_thaw): add prorotype for - e_select_names_model_cancel_all_contact_load. - - * gui/component/select-names/e-select-names-bonobo.c - (_EntryPropertyID): remove the SIMPLE_CARD_LIST property. - (entry_get_property_fn): same. - (impl_SelectNames_get_entry_for_section): same. - - * backend/ebook/e-contact.h: add prototype for - e_contact_name_to_string. - -2003-10-07 Chris Toshok <toshok@ximian.com> - - * util/eab-book-util.c: remove a bunch of ifdef'ed code (that's - going to be living in e-book.c) - - * backend/pas/pas-backend-summary.c - (pas_backend_summary_add_contact): un-ifdef some code. - (pas_backend_summary_get_summary_vcard): same. - - * backend/pas/pas-backend-ldap.c (prop_info): remove the - query_prop field since we can get it from e_contact_field_name. - also remove it from all the macros and their uses. - (homephone_populate): un-ifdef. - (homephone_ber): same. - (homephone_compare): same. - (business_populate): same. - (business_ber): same. - (business_compare): same. - (query_prop_to_ldap): use e_contact_field_name to get the query - prop for a given attribute. - (add_oc_attributes_to_supported_fields): same. - - * backend/pas/pas-backend-card-sexp.c (compare_phone): use the new - EContactField constants to iterate over the phone list. - - * backend/ebook/e-contact.h (EContactField): add some useful - constants for those pieces of code that iterate over - email/phones/addresses. - -2003-10-07 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-vcard-control.c (book_open_cb): un-ifdef this. - (eab_vcard_control_new): put the buttons above the vcard so they - don't move when it's expanded. - - * gui/widgets/eab-popup-control.h: remove prototypes for - eab_popup_control_set_name and eab_popup_control_set_email. - - * gui/widgets/eab-popup-control.c (email_table_ok_cb): remove the - stupid idle function and do the work here. - (eab_popup_control_set_name): make this static - noone uses it. - (eab_popup_control_set_email): same. - - * gui/widgets/eab-gui-util.c (eab_show_contact_editor): - e_contact_editor_new is what we use for the time being. - - * gui/widgets/eab-contact-display.c (render_string): abstract this - code out. - (render_url): same. - (eab_contact_display_render_normal): make use of render_string and - render_url. - - * gui/widgets/e-addressbook-view.c (delete): un-ifdef this and get - it working. - (selection_received): same. - - * gui/widgets/e-addressbook-model.c (get_view): nuke some code - that was moved to another function. - (eab_model_set_property): get the writable state when we set the - book - don't rely on the timing of signals. - - * gui/contact/editor/contact-editor.glade: add the blog field - below the homepage url field. - - * gui/contact/editor/e-contact-editor-address.[ch]: get this - building with the new stuff. - - * gui/contact/editor/e-contact-editor-fullname.[ch]: get this - building with the new stuff. - - * gui/contact-editor/e-contact-editor.[ch]: get this most of the - way there. - - * gui/contact-editor/e-contact-quick-add.[ch]: get this building - with the new stuff. - - * gui/contact-editor/Makefile.am (libecontacteditor_la_SOURCES): - remove e-contact-save-as.[ch]. They're in - addressbook/widgets/eab-gui-util.[ch] now. - - * gui/merging/Makefile.am: track all the naming changes. - - * gui/merging/*.glade: gratuitous renaming. - - * gui/merging/eab-contact-compare.[ch]: gratuitous renaming, and - move this from the old ebook/ - - * gui/merging/eab-contact-merging.[ch]: gratuitous renaming. - - * backend/ebook/e-contact.[ch]: lots of overly complicated changes - for an overly complicated piece of code. - - * backend/ebook/e-book-view.c (e_book_view_do_added_event): remove - some ifdef'ed code. - (e_book_view_do_modified_event): same. - - * backend/ebook/e-vcard.c (parse): plug a memory leak. - (escape_string): deal with @s being NULL. - (e_vcard_remove_attribute): new function. - (e_vcard_attribute_remove_params): same. - (e_vcard_attribute_param_free): same. - (e_vcard_attribute_param_remove_values): same. - - * backend/ebook/e-vcard.h: add prototypes for - e_vcard_remove_attribute, e_vcard_attribute_remove_params, and - e_vcard_attribute_param_remove_values. - - * backend/ebook/e-book.c (e_book_handle_response): cache the - writable state of the ebook before generating the signal. - (e_book_unload_uri): initialize cap to NULL and writable to FALSE. - - * backend/ebook/e-book.h: add prototype for e_book_is_writable. - - * backend/ebook/e-book-async.c (_get_fields_response_handler): - don't call the callback if it's NULL. - (_get_methods_response_handler): same. - (_auth_user_response_handler): same. - (_get_contact_response_handler): same. - (_remove_contacts_response_handler): same. - (_add_contact_response_handler): same. - (_commit_contact_response_handler): same. - (_get_book_view_response_handler): same. - (_get_contacts_response_handler): same. - (_remove_contacts_dtor): free the list. - (e_book_async_remove_contacts): duplicate the list. - - * backend/pas/pas-backend.c (pas_backend_open): if we successfully - load the uri, report the writable status back. - - * backend/pas/pas-backend-sync.c (_pas_backend_remove_contacts): - free the list of ids. - - * backend/pas/pas-backend-file.c (do_create): return the contact - we create here. - (pas_backend_file_create_contact): format the newly created - contact as a string to add to the summary. - (pas_backend_file_remove_contacts): don't free the list of removed - cards here - it happens in pas-backend-sync. - (pas_backend_file_load_uri): pass NULL for @contact to do_create. - -2003-10-01 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-contact-display.c (render_address): move the :'s - inside the <b>'s. Thanks for pointing this out, guenther. :) - (eab_contact_display_render_normal): same. - (eab_contact_display_render_compact): same. - - * gui/widgets/eab-vcard-control.c (save_in_addressbook): track - change to address_load_default_book. - -2003-10-01 Chris Toshok <toshok@ximian.com> - - * gui/component/Makefile.am: remove some commented out crap about - e-address-popup.[ch]. - - * gui/component/component-factory.c (factory): use - eab_popup_control_new for the AddressPopup iid. - - * gui/widgets/Makefile.am (libeabwidgets_la_SOURCES): add - eab-popup-control.[ch]. - - * backend/ebook/e-book.c (e_book_get_default_addressbook): hack - this so it at least sorta works - hardcode the - ~/evolution/local/Contacts uri for now. - - * gui/component/addressbook.[ch] (addressbook_load_default_book): - remove the EBook argument, and call - e_book_async_get_default_addressbook. - - * gui/component/e-address-popup.[ch]: nuke. - - * gui/widgets/eab-popup-control.c: rename - gui/component/e-address-popup.c to this. - - * gui/widgets/eab-popup-control.h: rename - gui/component/e-address-popup.h to this. - - * backend/ebook/e-book-async.h: add prototype for - e_book_async_get_default_addressbook. - - * backend/ebook/e-book-async.c - (e_book_async_get_default_addressbook): new function. - -2003-10-01 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c (eab_view_new): create the - scrolled window to embed the EABContactDisplay widget inside of. - - * gui/widgets/e-addressbook-view.h (struct _EABView): add scrolled; - - * gui/widgets/eab-contact-display.h: add - EABContactDisplayRenderMode enum, and add @render_mode arg to - eab_contact_display_render. - - * gui/widgets/eab-contact-display.c - (eab_contact_display_render_compact): new function, render a - compact format suitable for inclusion in the mail display. - (eab_contact_display_render_normal): move the previouw contents of - eab_contact_display_render here. - (eab_contact_display_render): render in either compact or normal - mode depending on @mode. - (eab_contact_display_new): remove the scrolled window stuff from - here, as in the compact mode we don't want it present. push it up - into the e-addressbook-view.c code. - - * gui/widgets/eab-vcard-control.[ch]: bonobo control that wraps up - the EABContactDisplay stuff and lets us display vcards in a pretty - format in mail messages. - - * gui/component/component-factory.c (factory): replace the #if - notyet'ed minicard control code with the new vcard control. - - * gui/component/Makefile.am (INCLUDES): remove gui/minicard. - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: remove - the MiniCard_Control iid, and replace it with VCard_Control. - -2003-10-01 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c - (destination_folder_handle_drop): use - eab_contact_list_from_string, and un-"#if notyet" this. - - * gui/component/addressbook.c: remove #include - "e-contact-save-as.h" - - * gui/contact-list-editor/e-contact-list-editor.c - (file_save_as_cb): use eab_contact_save. - (file_send_as_cb): use eab_send_contact, un-"#if notyet" this. - (file_send_to_cb): same. - (table_drag_data_received_cb): use eab_contact_list_from_string. - - * gui/widgets/e-addressbook-reflow-adapter.[ch]: nuke. last - vestiges of the minicard view. - - * gui/widgets/e-addressbook-view.c (eab_view_init): - s/clipboard_cards/cliboard_contacts. - (eab_view_dispose): same. - (get_contact_list_1): s/card/contact - (get_contact_list): same. - (save_as): same, and use eab_contact_list_save. - (send_as): reenable this code, s/card/contact, and use - eab_send_contact_list. - (send_to): same. - (print): s/card/contact. - (delete): same. - (new_card): same, and un-"#if notyet" some code. - (selection_get): use eab_contact_list_to_string. - (selection_clear_event): s/card/contact - (selection_received): same. - (get_selected_contacts): same. - (eab_view_save_as): same, and use eab_contact_list_save. - (eab_view_view): same, and use eab_show_multiple_contacts. - (eab_view_send): reenable this code, s/card/contact, and use - eab_send_contact_list. - (eab_view_send_to): same. - (eab_view_copy): s/card/contact. - (view_transfer_contacts): same. - (eab_view_copy_to_folder): same. - (eab_view_move_to_folder): same. - - * gui/widgets/e-addressbook-view.h (struct _EABView): rename - clipboard_cards to clipboard_contacts. - - * gui/widgets/eab-gui-util.c (view_contacts): un-"#if notyet" - (file_exists): moved from e-contact-save-as.c - (save_it): same. - (close_it): same. - (destroy_it): same. - (make_safe_filename): same. - (eab_contact_save): same, and renamed from e_contact_save_as. - (eab_contact_list_save): same, and renamed from - e_contact_list_save_as. - (contact_deleted_cb): s/card/contact. - (do_delete): same, and use e_book_async. - (delete_contacts): s/card/contact. - (process_unref): same. - (contact_added_cb): same. - (do_copy): same, and use e_book_async. - (got_book_cb): same. - (eab_transfer_contacts): same, and use e_book_async. - (eab_send_contact_list): s/card/contact - (eab_send_contact): same. - - * gui/widgets/eab-gui-util.h: some random s/card/contact work, and - move the contents of e-contact-save-as.h here. - - * util/eab-book-util.c (eab_contact_list_from_string): rename - eab_load_contacts_from_string to this. - (eab_contact_list_to_string): new function. - - * util/eab-book-util.h: add prototype for - eab_contact_list_to_string, and rename - eab_load_contacts_from_string to eab_contact_list_from_string. - - * gui/contact-editor/e-contact-save-as.[ch]: nuke. the contents - of these files has been wrapped up in - gui/widgets/eab-gui-util.[ch]. - -2003-09-30 Chris Toshok <toshok@ximian.com> - - * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD): - add libecontactlisteditor.la back into the build. - - * gui/component/addressbook-component.c (new_item_cb): enable the - contact list editor portion. - - * util/eab-book-util.c (eab_load_contacts_from_string): new - function, return a GList of EContact*'s parsed from the string. - - * util/eab-book-util.h: add prototype for - eab_load_contacts_from_string. - - * gui/contact-list-editor/contact-list-editor.glade: set the id of - the list-image widget. - - * gui/contact-list-editor/e-contact-list-editor.c - (e_contact_list_editor_class_init): PROP_CARD -> PROP_CONTACT. - (e_contact_list_editor_init): initialize image_buf to null and - card -> contact. also, hook up the dnd signals on the list_image - widget so we can drop images. - (e_contact_list_editor_dispose): free the image_buf. - (list_added_cb): card -> contact. - (list_modified_cb): same. - (save_contact): same, and use the ebook-async api. - (prompt_to_save_changes): card -> contact. - (file_save_cb): same. - (file_save_as_cb): same. - (file_send_as_cb): #if notyet for now. - (file_send_to_cb): same. - (tb_save_and_close_cb): card -> contact. - (list_deleted_cb): same. - (delete_cb): same. - (delete_cb): same, and use ebook-async. - (e_contact_list_editor_new): card -> contact. - (e_contact_list_editor_set_property): same. - (table_drag_motion_cb): use GDK_POINTER_TO_ATOM instead of - casting. - (table_drag_data_received_cb): use eab_load_contacts_from_string, - and card -> contact. - (set_image_from_data): new function. create a pixbuf from the - image data and composite it in an image that's the same size as - the initial list_image widget. - (image_drag_motion_cb): new function. - (image_drag_drop_cb): new function. - (image_drag_data_received_cb): new function. - (extract_info): port to EContact, and add support for the image. - (fill_in_info): same. - - * gui/contact-list-editor/e-contact-list-editor.h (struct - _EContactListEditor): add image stuff, and ECard -> EContact. - - * gui/contact-list-editor/e-contact-list-model.c - (contact_list_value_at): e_destination -> eab_destination. - (e_contact_list_model_init): same. - (e_contact_list_model_add_destination): same. - (e_contact_list_model_add_email): same. - (e_contact_list_model_add_contact): same, and card -> contact. - (e_contact_list_model_remove_row): e_destination -> - eab_destination. - (e_contact_list_model_get_destination): same. - - * gui/contact-list-editor/e-contact-list-model.h: card -> contact, - and e-destination -> eab-destination. - - * gui/widgets/e-addressbook-view.etspec: fix a couple of - fields.. this needs a completely once-over at some point soon. - - * gui/widgets/e-addressbook-view.c (table_double_click): reenable - all of this. - - * gui/widgets/eab-contact-display.c (render_address): use - e_text_to_html to convert the \n's to <br>'s. - (on_url_requested): get PHOTO if there is one, otherwise LOGO. - (eab_contact_display_render): escape all the text we're sending to - gtkhtml with e_text_to_html. also, if it's a contact list, output - _("List Members") with the contents of _EMAIL. - - * gui/widgets/eab-gui-util.h: rename eab_send_card{_list} to - eab_send_contact{_list}. - -2003-09-30 Chris Toshok <toshok@ximian.com> - - * backend/ebook/tests/ebook/Makefile.am (noinst_PROGRAMS): add - test-string. - - * backend/ebook/tests/ebook/test-string.c: test setting/getting a - string attribute. - - * backend/ebook/e-contact.c (photo_setter): do gnome-vfs mime type - sniffing before we set the attribute value. - (e_contact_set_property): implement setting of MULTI list - attributes (like MAIL). - (e_contact_get_property): rework the ATTR_TYPE attribute handling - so we aren't calling g_value_set_pointer on a value that holds a - string (and vice versa). - - * backend/ebook/e-vcard.c (e_vcard_remove_attributes): implement. - (e_vcard_attribute_add_param): use g_ascii_strcasecmp. - - * backend/ebook/e-vcard.h: rename e_vcard_remove_attribute to - e_vcard_remove_attributes, since it removes all matching - attributes. - - * backend/ebook/e-book.c (e_book_response_add_contact): we need to - strdup the id here since the listener frees it. - (e_book_handle_response): implement the WritableStatusEvent part - of the switch. - - * backend/ebook/e-book-listener.c - (impl_BookListener_report_writable): un-"#if notyet" this. - - * backend/ebook/e-book-async.c (_add_contact_handler): fill in - response->id. - -2003-09-29 Chris Toshok <toshok@ximian.com> - - * printing/e-contact-print-envelope.c: card -> contact. - - * printing/e-contact-print-envelope.h: card -> contact. - - * printing/e-contact-print.c: card -> contact. - - * printing/e-contact-print.h: card -> contact. - - * printing/Makefile.am (contact_print_test_LDADD): add - libeabutil.la and reorder things so it links. - (contact_print_style_editor_test_LDADD): same. - -2003-09-29 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-text-model.c: - e-addressbook-util.h -> eab-gui-util.h. - - * gui/component/select-names/e-select-names-popup.c: - e-addressbook-util.h -> eab-gui-util.h. - - * gui/component/e-address-popup.c: e-addressbook-util.h -> - eab-gui-util.h. - - * gui/component/component-factory.c: #if notyet the minicard - control stuff, since it's been completely nuked from the tree. - - * gui/component/addressbook.c: e-addressbook-util.h -> - eab-gui-util.h. - - * gui/component/addressbook-component.c: e-addressbook-util.h -> - eab-gui-util.h. - - * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD): - rename libeminicard to libeabwidgets. - - * Makefile.am (SUBDIRS): add util/ to the build. - -2003-09-29 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-treeview-adapter.c: - e-addressbook-util.h -> eab-gui-util.h, and convert some - EDestination code to EABDestination. - - * gui/widgets/e-addressbook-table-adapter.c: e-addressbook-util.h - -> eab-gui-util.h, and include util/eab-destination.h. - (addressbook_value_at): un-#if 0 some code. - - * gui/widgets/e-addressbook-model.c: e-addressbook-util.h -> - eab-gui-util.h - - * gui/widgets/e-addressbook-view.c: e-addressbook-util.h -> - eab-gui-util.h - - * gui/widgets/e-minicard-control.c, - gui/widgets/e-minicard-control.h, gui/widgets/e-minicard-label.c, - gui/widgets/e-minicard-label.h, - gui/widgets/e-minicard-view-widget.c, - gui/widgets/e-minicard-view-widget.h, - gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h, - gui/widgets/e-minicard-widget-test.c, - gui/widgets/e-minicard-widget.c, gui/widgets/e-minicard-widget.h, - gui/widgets/e-minicard.c, gui/widgets/e-minicard.h, - test-minicard-label.c, test-minicard-view.c, test-minicard.c: nuke - all of the old minicard stuff. - - * gui/widgets/eab-gui-util.[ch]: rename e-addressbook-util.[ch] to - this and nuke e-addressbook-util.[ch]. - - * gui/widgets/Makefile.am (INCLUDES): change G_LOG_DOMAIN to - eab-widgets, and add -I$(top_srcdir)/addressbook. - (noinst_LTLIBRARIES): rename to libeabwidgets.la - (libeabwidgets_la_SOURCES): rename e-addressbook-util.[ch] to - eab-gui-util.[ch]. - -2003-09-29 Chris Toshok <toshok@ximian.com> - - * gui/widgets/eab-contact-display.c (eab_contact_display_new): - track change from E_TYPE_AB_CONTACT_DISPLAY to - EAB_TYPE_CONTACT_DISPLAY. - - * gui/widgets/eab-contact-display.h: change from E_* type foo to - EAB_* type foo. - -2003-09-29 Chris Toshok <toshok@ximian.com> - - * gui/search/e-addressbook-search-dialog.[ch]: convert everything - from e_addressbook_search_dialog to eab_search_dialog, and - EAddressbookSearchDialog to EABSearchDialog. - - * gui/component/addressbook.c (search_cb): - e_addressbook_search_dialog -> eab_search_dialog. - (addressbook_search_activated): same. - (addressbook_query_changed): same. - -2003-09-29 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book.c (pas_book_respond_get_supported_fields): - don't free the fields here - the backends hold onto them. - (pas_book_respond_get_supported_auth_methods): don't free the - auth_methods here - the backends hold onto them. - - * backend/pas/pas-backend-file.c - (pas_backend_file_get_supported_fields): fields go from 1 to - E_CONTACT_FIELD_LAST, not 0. - -2003-09-29 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c: e-book-util.h -> eab-book-util.h - - * gui/component/addressbook-component.c: e-book-util.h -> - eab-book-util.h. - (new_item_cb): enable the contact editor portion of this. - (user_create_new_item_cb): convert to async_load_uri api, and - ifdef the _use_default_book crap. - (ensure_completion_uris_exist): e_book_get_config_database -> - eab_get_config_database. - - * gui/component/e-address-widget.h: e-book-util.h -> - eab-book-util.h. - - * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD): - add selectnames back in, and add util/libeabutil.la. - -2003-09-29 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-contact.c: my head explodes from so many - changes. - - * backend/ebook/e-contact.h: reorder fields such that all the - string fields are first in the enum (and add a - E_CONTACT_LAST_SIMPLE_STRING value, ala the old e-card-simple - stuff.) Also, add E_CONTACT_LOGO, WANTS_HTML, IS_LIST, and - LIST_SHOW_ADDRESSES. remove E_CONTACT_PHOTO_URI. - - * backend/ebook/e-vcard.c (e_vcard_remove_attribute): rename from - e_card_remove_attribute, and add a g_assert_not_reached. - (_evc_base64_encode_simple): make this not static (we need it for - a test.) - (_evc_base64_decode_simple): same. - - * backend/ebook/e-vcard.h: add LOGO, X-MOZILLA-HTML, - X-EVOLUTION-LIST, and X-EVOLUTION-LIST-SHOW_ADDRESSES #defines. - - * backend/ebook/e-book.c (EBookLoadState): change from - UriNotLoaded to E_BOOK_URI_NOT_LOADED, etc. - (e_book_add_contact): track _URI_ change. - (e_book_get_supported_fields): same. - (e_book_get_supported_auth_methods): same. - (e_book_authenticate_user): same. - (e_book_get_contact): same. - (e_book_response_get_contact): remove the ifdefed call to - e_contact_set_book. - (e_book_remove_contacts): track _URI_ change. - (e_book_get_book_view): same. - (e_book_get_contacts): same. - (e_book_get_changes): same. - (e_book_remove): same. - (e_book_unload_uri): same. - (e_book_load_uri): same. - (e_book_load_uri): same. - (e_book_get_self): start the implementation of this. - (e_book_get_default_addressbook): ifdef out a possible - implementation of this (it's broken.) - (e_book_init): track _URI_ change. - (e_book_dispose): same. - - * backend/ebook/e-book.h: move get_default_addressbook out of the - ifdef, and change get_default_addressbook/get_addressbooks to be - more like the rest of the api. - - * backend/ebook/e-book-util.[ch]: nuke. - - * backend/ebook/e-card-compare.[ch]: nuke. - - * backend/ebook/e-destination.[ch]: nuke. - - * backend/ebook/e-book-query.c (func_and): fix valgrind error. - (func_or): same. - - * backend/ebook/e-book-listener.h: drop #include of e-list.h - - * backend/ebook/e-book-async.c (_get_contacts_response_handler) - (_get_contacts_response_dtor, _get_contacts_handler) - (_get_contacts_dtor, e_book_async_get_contacts): new functions, - implementing e_book_async_get_contacts. - - * backend/ebook/e-book-async.h: add e_book_async_get_contacts. - -2003-09-29 Chris Toshok <toshok@ximian.com> - - * util/eab-marshal.list: new file. - - * util/eab-destination.[ch]: rename - backend/ebook/e-destination.[ch] to this, and change all the entry - point names too. - - * util/eab-book-util.[ch]: rename backend/ebook/e-book-util.[ch] - to this, and change all the entry point names too. - - * util/Makefile.am: new file, build libeabutil.la - -2003-09-29 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names.c - (addressbook_model_set_uri): e_addressbook_model -> eab_model. - (contact_key): e-contactify this, and remove the call to - e_contact_get_book since we don't have it. - (sync_one_model): card -> contact. - (real_add_address_cb): track various name changes. - (esn_get_key_fn): same. - (e_addressbook_create_ebook_table): same. - (folder_selected): same. - (select_entry_changed): same. - (e_select_names_new): same. - - * gui/component/select-names/e-select-names-text-model.c - (dump_model): s/card/contact. - (e_select_names_text_model_insert_length): e-destination -> - eab-destination. - (e_select_names_text_model_delete): same. - (e_select_names_text_model_obj_count): same. - (nth_obj_index): same. - (e_select_names_text_model_activate_obj): ifdef this out since we - don't have e_contact_get_book in the new api. - - * gui/component/select-names/e-select-names-table-model.c - (fill_in_info): convert to e_contact/eab_destination. - - * gui/component/select-names/e-select-names-popup.c - (change_email_num_cb): e_destination -> eab_destination. - (populate_popup_contact): same, and ECard -> EContact. Also, the - email attribute is a GList, not an EList. lastly, rename from - populate_popup_card. - (populate_popup_nocontact): same, and rename from - populate_popup_nocard. - (e_select_names_populate_popup): same. - - * gui/component/select-names/e-select-names-model.h: track changes - to e_destination, and rename the cardify methods to something mode - descriptive. - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_duplicate): e_destination -> - eab_destination. - (e_select_names_model_get_textification): same. - (e_select_names_model_get_address_text): same. - (e_select_names_model_get_destination): same. - (e_select_names_model_export_destinationv): same. - (send_changed): same. - (e_select_names_model_import_destinationv): same. - (e_select_names_model_get_contact): same, and rename from - _get_card - (e_select_names_model_get_string): same. - (connect_destination): same. - (disconnect_destination): same. - (e_select_names_model_contains): same. - (e_select_names_model_insert): same. - (e_select_names_model_append): same. - (e_select_names_model_replace): same. - (e_select_names_model_delete): same. - (e_select_names_model_clean): same. - (delete_all_iter): same. - (e_select_names_model_overwrite_copy): same. - (e_select_names_model_merge): same. - (e_select_names_model_name_pos): same. - (e_select_names_model_text_pos): same. - (e_select_names_model_cardify): nuke. - (e_select_names_model_uncardify): nuke. - (e_select_names_model_cancel_cardify): nuke. - (e_select_names_model_load_all_contacts): rename _cardify_all to - this. - (e_select_names_model_cancel_all_contact_load): rename - _cancel_cardify to this. - - * gui/component/select-names/e-select-names-manager.c - (focus_in_cb): cancel_cardify_all -> cancel_all_contact_load - (focus_out_cb): cardify_all -> load_all_contacts. - (completion_popup_cb): same. - (load_completion_books): no e_book_expand_uri anymore. - (e_select_names_manager_new): e_book_get_config_database -> - eab_get_config_database. - (e_select_names_manager_dispose): same. - - * gui/component/select-names/e-select-names-completion.h: e-book.h - -> e-book-async.h - - * gui/component/select-names/e-select-names-completion.c: - EContactify this. - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): ifdef out the SIMPLE_CARD_LIST getter, - and cardify_all -> load_all_contacts. - - * gui/component/select-names/Evolution-Addressbook-SelectNames.idl: - nuke all the SimpleCard stuff. It's a horribly inefficient way to - deal with vcards, and since ebook is platform level now, we can - (and should) promote just linking to ebook to do this. - -2003-09-19 Gilbert Fang <gilbert.fang@sun.com> - - * addressbook/gui/component/addressbook-component.c (xfer_folder): - remove the "addressbook.db.summary" correctly. #48538 - -2003-09-11 Dan Winship <danw@ximian.com> - - * backend/ebook/Makefile.am (privlib_LTLIBRARIES): Remove - libebook-static.la - - * conduit/Makefile.am (libeaddress_conduit_la_LIBADD): Use - non-static versions of libraries: the static ones were only needed - for libtool 1.3. - -2003-09-07 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-contact.c (e_contact_get_property): implement - getters for the address labels. they aren't really synthetic, but - we can't handle them as normal strings because they switch off the - TYPE parameter, not the attribute name (go go vcard.) Also add - getters for the structured address fields (ADR). Also fix a spot - where we were using strcmp instead of strcasecmp. - (e_contact_address_free): new function. - - * backend/ebook/e-contact.h: Add EContactAddress structure, which - will probably go away once i merge in my cool spiffy address - editor. Add LABEL fields for the address labels, and add - prototype for e_contact_address_free. - - * backend/ebook/e-vcard.h: add EVC_LABEL and EVC_X_BLOG_URL. - - * backend/ebook/e-vcard.c (read_attribute_value): step to the next - character after unescaping \-escaped characters. keeps commas - from multiplying. - - * gui/widgets/eab-contact-display.c (render_address): new function - (eab_contact_display_render): display email, delivery addresses, - and the blog url. - -2003-09-06 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-contact.c (e_contact_set_property): implement - E_CONTACT_EMAIL_*. - - * backend/pas/pas-backend-ldap.c (email_ber): EContact-ify and - re-enable this code. - (email_compare): same. - (email_populate): same. - - * backend/pas/pas-backend-vcf.c (pas_backend_vcf_load_uri): use - XIMIAN_VCARD. - - * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): use - XIMIAN_VCARD, and don't fail if the directory already exists. - just try to create the db anyway. - - * backend/pas/Makefile.am (libpas_a_SOURCES): add ximian-vcard.h - - * backend/pas/ximian-vcard.h (XIMIAN_VCARD): put the initial vcard - here, so we can share 1 #define between file/vcf backends. Also, - add a jpeg photo. - -2003-09-06 Chris Toshok <toshok@ximian.com> - - * gui/widgets/Makefile.am (libeminicard_la_SOURCES): add - eab-contact-display.[ch] - - * gui/widgets/e-addressbook-view.c (eab_view_init): just init - everything to NULL. - (eab_view_new): move a bunch of stuff that was in eab_view_init - here. create a vpaned to hold the contact display, and create the - contact display. - (render_contact): render the selected contact to the - contact_display. - (selection_changed): add logic to display the currently selected - contact in the preview pane. - (create_table_view): add the table to the paned. - (create_treeview_view): add the scrolled to the paned. - (change_view_type): remove view->widget from the paned. - - * gui/widgets/e-addressbook-view.h: switch from using a GtkTable - to a GtkEventBox - we don't need the table logic anymore. - - * gui/widgets/e-addressbook-model.c (create_contact): indent - (eab_model_get_contact): same. - - * gui/widgets/eab-contact-display.[ch]: new files - this - implements the preview pane. - -2003-09-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (BINARY_PROP): new type of - property, for specifying data coming back from the ldap server - with both data/length (like photos). - (photo_populate): set the contact's photo. - (build_contact_from_entry): add PROP_TYPE_BINARY handling. - - * backend/ebook/e-vcard.c (EVCardEncoding): new enum for use with - the ENCODING attribute parameter. Right now, just "raw", - "base64", and "quoted-printable". - (struct _EVCardAttribute): add a "decoded_values" list of - GString*'s, as well as fields to hold encoding/encoding_set. - (e_vcard_class_init): call _evc_base64_init. - (e_vcard_attribute_add_value_decoded): based on what encoding the - attribute uses, add the value properly. - (e_vcard_attribute_add_param): if the parameter is ENCODING, work - our magic. - (e_vcard_attribute_get_values_decoded): spit out properly decoded - values depending on the decoding type. - (_evc_base64*): copy the camel base64 routines here. - - * backend/ebook/e-vcard.h: add prototypes for - e_vcard_attribute_add_value_decoded and - e_vcard_attribute_get_values_decoded. - - * backend/ebook/e-contact.c (e_contact_get_first_attr): move this - to above _set_property so we can make use of it there. - (e_contact_set_property): fix up the generic STRING field handler, - and implement E_CONTACT_PHOTO setting. - (e_contact_get_property): add handling for - E_CONTACT_PHOTO/E_CONTACT_PHOTO_URI. - (e_contact_photo_free): new function. - - * backend/ebook/e-contact.h: add EContactPhoto struct, a prototype - for e_contact_photo_free, and two new EContactField elements (PHOTO and - PHOTO_URI). - - * backend/ebook/tests/ebook/.cvsignore: ignore test-photo - - * backend/ebook/tests/ebook/Makefile.am (noinst_PROGRAMS): add test-photo - - * backend/ebook/tests/ebook/test-photo.c: test for the photo - set/get routines (which do base64 encoding/decoding). - -2003-09-02 Chris Toshok <toshok@ximian.com> - - * gui/component/Makefile.am: comment out a buncha stuff just to - get this building. - - * gui/component/select-names/e-select-names.c: #include - e-book-async.h - (search_result): EAddressbookModel -> EABModel. - (addressbook_model_set_uri): same, and don't use - e_book_expand_uri, as it's dead. - (esn_get_key_fn): EAddressbookModel -> EABModel. - (e_addressbook_create_ebook_table): same. - (status_message): same. - - * gui/component/select-names/e-select-names.h (struct - _ESelectNames): EAddressbookModel -> EABModel. - - * gui/component/addressbook-component.c (new_item_cb): ifdef out - for now. - (dnd_drop_book_open_cb): s/card/contact. - (destination_folder_handle_drop): ifdef out. - (request_quit): same. - - * gui/component/addressbook.c: track api changes - e_addressbook_ - -> eab_, and e_book_* becomes e_book_async_*. - - * gui/component/addressbook.h: #include e-book-async.h - - * gui/component/e-address-widget.c (query_results_cb): - e/EBookSimpleQueryStatus/EBookStatus - - * gui/component/e-address-widget.h: s/ECard/EContact. - - * gui/component/e-cardlist-model.[ch]: nuke. - - * gui/component/e-address-popup.c: s/e-book.h/e-book-async.h - - * gui/component/e-address-popup.h: s/ECard/EContact - -2003-09-02 Chris Toshok <toshok@ximian.com> - - * backend/ebook/Makefile.am (libebook_la_SOURCES): remove - e-card.c,e-card.simple.c - - * backend/ebook/tests/ebook/test-ebook.c: remove #include of - e-card-simple.h - - * backend/ebook/tests/ebook/test-changes.c: remove #include of - e-card-simple.h - - * backend/ebook/e-card.[ch], backend/ebook/e-card-simple.[ch]: - nuke. - - * backend/ebook/e-book-util.h: s/card/contact. - - * backend/ebook/e-book-util.c: ifdef out an #include. - - * backend/ebook/e-book-async.[ch]: stop doing the stupid #define - renaming trick, and just rename all the prototypes from e_book_* - to e_book_async_*. Also, get rid of the *_vcard variants. - -2003-09-02 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-card-sexp.[ch] - (pas_backend_card_sexp_match_contact): rename - pas_backend_card_sexp_match_card, and it takes an EContact now. - Also, port this file to use EContact instead of ECard, and ifdef - out lots of stuff. - - * backend/pas/pas-backend-ldap.c: convert this to use EContact - instead of ECard, and ifdef great swaths of code to make it - compile. - - * backend/pas/pas-book.c (pas_book_respond_modify): convert this - from ECard to EContact. - -2003-09-02 Chris Toshok <toshok@ximian.com> - - * gui/widgets/Makefile.am (libeminicard_la_SOURCES): remove all - the reflow/minicard stuff from the build. - (e-addressbook-marshal.[ch]): change the prefix on the marshallers to - eab_marshal. - - * gui/widgets/e-addressbook-view.etspec: bring this more in line - with the field ids for EContact, and comment out a ton of them - that aren't there yet. - - * gui/widgets/e-addressbook-view.[ch]: big renaming - rename - e_addressbook_view to eab_view, and EAddressbookView to EABView. - - * gui/widgets/e-addressbook-util.c (eab_error_dialog): rename, and - change a few of the error strings s/Card/Contact. - (added_cb): E_BOOK_STATUS_SUCCESS => E_BOOK_ERROR_OK. - (modified_cb): same. - (e_addressbook_show_contact_editor): this takes an EContact now, - and track the change to the contact editor signal names. - (e_addressbook_show_contact_list_editor): this takes an EContact - now. - (view_contacts): rename view_cards to this, and ifdef the body. - (e_addressbook_show_multiple_contacts): rename - e_addressbook_show_multiple_cards to this, and s/card/contact. - - * gui/widgets/e-addressbook-util.h: ifdef some things out, and - rename e_addressbook_error_dialog to eab_error_dialog. - - * gui/widgets/e-addressbook-table-adapter.[ch]: big renaming - - rename e_addressbook_table_adapter to eab_table_adapter, and - EAddressbookTableAdapter to EABTableAdapter. Also, remove the - simple mapping - we can do ECardSimple-like operations directly on - the EContacts from the EABModel. - - * gui/widgets/e-addressbook-model.[ch]: big renaming - rename - e_addressbook_model to eab_model, and EAddressbookModel to - EABModel. Also, convert everything from ECard to EContact. - -2003-09-01 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-vcard.c (e_vcard_new_from_string): omg i'm dumb. - don't call e_vcard_new here since it just turns around and calls - e_vcard_new_from_string again. - -2003-09-01 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book-view.c (pas_book_view_notify_change): guard - pending adds foo. - (pas_book_view_notify_remove): same. - (pas_book_view_notify_add): same. - (pas_book_view_notify_complete): same. - (pas_book_view_construct): init mutex - (pas_book_view_dispose): free mutex - - * backend/pas/pas-backend-ldap.c (func_exists): new function. - (send_pending_adds): remove - (ldap_search_handler): let the BookView stuff handle the pending - adds for us. - (ldap_search_dtor): remove pending adds stuff. - (pas_backend_ldap_search): same - - * backend/pas/pas-backend-card-sexp.c (func_exists): new function. - - * backend/ebook/tests/ebook/test-ebook.c (print_all_emails): use - an exists query. - -2003-08-31 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-query.c (func_and, func_or, func_not) - (func_contains, func_is, func_beginswith, func_endswith) - (e_book_query_from_string): adapt the pas ldap backend sexp - parsing code to this, build up an EBookQuery that represents the - sexp. - - * backend/ebook/e-contact.h (e_contact_field_id): add prototype. - - * backend/ebook/e-contact.c (e_contact_field_id): new function. - - * backend/ebook/Makefile.am (libebook_la_SOURCES): add - e-book-util.c back into the build, if only for the config_database - thingy. - -2003-08-31 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-contact.c (e_contact_duplicate): new function. - - * backend/ebook/e-contact.h: add prototype for - e_contact_duplicate. - - * backend/ebook/e-book-util.[ch]: massive ifdeffing. most of this - is either gone or will be unnecessary soon. - - * backend/ebook/e-book-query.c (e_book_query_from_string): hack - this so it'll at least generate a query. - - * backend/ebook/e-book-listener.c - (impl_BookListener_respond_get_view): add some debug spew and - remove a c&p'ed comment. - - * backend/ebook/e-book-async.h: add prototype for - e_book_async_unload_uri. - - * backend/ebook/e-book-async.c (e_book_async_unload_uri): new - function. - - * backend/pas/pas-book-view.c (pas_book_view_construct): switch to - CORBA_Object_duplicate, ala pas_book. - - * backend/pas/pas-backend-sync.c (pas_backend_sync_class_init): - fix typo and the build. - -2003-08-29 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (ldap_error_to_response): - s/card/contact. - (pas_backend_ldap_process_create_contact): same. - (remove_contact_handler): same. - (remove_contact_dtor): same. - (pas_backend_ldap_process_remove_contacts): same. - (modify_contact_modify_handler): same. - (modify_contact_dtor): same. - (pas_backend_ldap_process_modify_contact): same. - (get_contact_handler): same. - (get_contact_dtor): same. - (pas_backend_ldap_process_get_contact): same. - (pas_backend_ldap_class_init): same. - - * backend/pas/pas-backend-summary.c - (pas_backend_summary_add_contact): s/card/contact, and mostly - switch from ECard{Simple} to EContact. - (pas_backend_summary_get_summary_vcard): same. - (pas_backend_summary_remove_contact): s/card/contact - - * backend/pas/pas-backend-summary.h: s/card/contact. - - * backend/pas/pas-backend-file.c (build_summary): fix g_warning, - and return immediately if the db->cursor call fails. - (pas_backend_file_create_contact): s/card/contact - (pas_backend_file_remove_contacts): same. - (pas_backend_file_modify_contact): same. - (pas_backend_file_get_contact): same. - (pas_backend_file_get_contact_list): same. - (pas_backend_file_class_init): same. - - * backend/pas/pas-backend-vcf.c - (pas_backend_vcf_process_create_contact): s/card/contact. - (pas_backend_vcf_process_remove_contacts): same. - (pas_backend_vcf_process_modify_contact): same. - (pas_backend_vcf_process_get_contact): same. - (pas_backend_vcf_process_get_contact_list): same. - (pas_backend_vcf_class_init): same. - - * backend/pas/pas-backend-sync.c (pas_backend_sync_create_contact): s/card/contact. - (pas_backend_sync_remove_contacts): same. - (pas_backend_sync_modify_contact): same. - (pas_backend_sync_get_contact): same. - (pas_backend_sync_get_contact_list): same. - (_pas_backend_create_contact): same. - (_pas_backend_remove_contacts): same. - (_pas_backend_modify_contact): same. - (_pas_backend_get_contact): same. - (_pas_backend_get_contact_list): same. - (pas_backend_sync_class_init): same. - - * backend/pas/pas-backend-sync.h: s/card/contact. - - * backend/pas/pas-backend.c (pas_backend_create_contact): s/card/contact. - (pas_backend_remove_contacts): same. - (pas_backend_modify_contact): same. - (pas_backend_get_contact): same. - (pas_backend_get_contact_list): same. - (pas_backend_change_add_new): same. - (pas_backend_change_modify_new): same. - (pas_backend_change_delete_new): same. - - * backend/pas/pas-backend.h: s/card/contact. - - * backend/pas/pas-book-view.c (send_pending_adds): s/card/contact - (pas_book_view_notify_change): same. - (pas_book_view_notify_remove): same. - - * backend/pas/pas-book.c - (impl_GNOME_Evolution_Addressbook_Book_getContact): s/card/contact - (impl_GNOME_Evolution_Addressbook_Book_getContactList): same. - (impl_GNOME_Evolution_Addressbook_Book_addContact): same. - (impl_GNOME_Evolution_Addressbook_Book_removeContacts): same. - (impl_GNOME_Evolution_Addressbook_Book_modifyContact): same. - (pas_book_respond_create): same. - (pas_book_respond_remove_contacts): same. - (pas_book_respond_modify): same. - (pas_book_respond_get_contact): same. - (pas_book_respond_get_contact_list): same. - (pas_book_respond_get_changes): same. - (pas_book_class_init): same. - - * backend/pas/pas-book.h: s/card/contact - - * backend/ebook/tests/vcard/dump-vcard.c: #include - "ebook/e-vcard.h" - - * backend/ebook/tests/vcard/Makefile.am (TEST_LIBS): use - top_builddir. - (CFLAGS): same. - - * backend/ebook/tests/ebook/Makefile.am (TEST_LIBS): use - top_builddir. - (CFLAGS): use srcdir - - * backend/ebook/test-card.c, backend/ebook/test-client-list.c, - backend/ebook/test-client.c, backend/ebook/test-ebook.c: remove. - - * backend/ebook/e-card-cursor.[ch]: remove. - - * backend/ebook/e-card-pairs.h: remove. - - * backend/ebook/e-book.c (e_book_add_contact): s/Card/Contact. - (e_book_commit_contact): same - (e_book_get_contact): same. - (e_book_remove_contacts): same. - (e_book_get_contacts): same. - (e_book_handle_response): same. - - * backend/ebook/e-book-view.c (e_book_view_do_added_event): - s/card/contact - (e_book_view_do_modified_event): same. - (e_book_view_do_removed_event): same. - (e_book_view_handle_response): same. - (e_book_view_class_init): same. - - * backend/ebook/e-book-view.h: s/card/contact and pad the class - struct. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_queue_response): s/Card/Contact. - (e_book_view_listener_queue_status_event): no need to assign - things to NULL, we g_new0. - (e_book_view_listener_queue_idlist_event): s/Card/Contact, and no - need to assign things to NULL, we g_new0. - (e_book_view_listener_queue_sequence_event): same. - (e_book_view_listener_queue_message_event): same. - (impl_BookViewListener_notify_contacts_added): s/Card/Contact. - (impl_BookViewListener_notify_contacts_removed): same. - (impl_BookViewListener_notify_contacts_changed): same. - (e_book_view_listener_class_init): same. - - * backend/ebook/e-book-view-listener.h: s/Card/Contact - - * backend/ebook/e-book-types.h: s/CARD/CONTACT - - * backend/ebook/e-book-listener.c - (e_book_listener_convert_status): s/Card/Contact - (impl_BookListener_respond_create_contact): same. - (impl_BookListener_respond_remove_contacts): same. - (impl_BookListener_respond_modify_contact): same. - (impl_BookListener_respond_get_contact): same. - (impl_BookListener_respond_get_contact_list): same. - (impl_BookListener_respond_get_changes): same. - (e_book_listener_class_init): same. - - * backend/ebook/e-book-listener.h: pad the class struct, and - s/Card/Contact. - - * backend/ebook/e-book-async.c (_load_uri_handler): GError - changes. - (_get_fields_handler): same. - (_get_methods_handler): same. - (_auth_user_handler): same. - (_get_card_handler): same. - (_remove_cards_handler): same. - (_add_vcard_handler): same. - (_commit_vcard_handler): same. - (_get_book_view_handler): same. - (e_book_async_get_book_view): use an EBookQuery instead of a char*. - - * backend/ebook/Makefile.am: remove the test handling. - (SUBDIRS): set to ". tests" - (libebook_la_SOURCES): add e-book-async.c - - * backend/idl/addressbook.idl: possibly gratuitous renaming, but i - was sick of seeing "Card" being used everywhere. "Contact" is the - new "Card". - -2003-08-28 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book.c (e_book_op_free): rename from - e_book_free_op. - (e_book_op_remove): rename from e_book_remove_op. - (e_book_clear_op): new function, remove the op, unlock its mutex, - and free it. - (e_book_add_contact): use e_book_clear_op. - (e_book_commit_contact): same. - (e_book_get_supported_fields): same. - (e_book_get_supported_auth_methods): same. - (e_book_authenticate_user): same. - (e_book_get_contact): same. - (e_book_remove_contacts): same. - (e_book_get_book_view): same. - (e_book_get_contacts): same. - (e_book_get_changes): same. - (e_book_load_uri): same. - (e_book_remove): new function. - (e_book_response_remove): new function. - (e_book_handle_response): add handling for RemoveBookResponse. - (e_book_load_local_addressbook): pass TRUE for e_book_load_uri - @only_if_exists. - - * backend/ebook/e-book.h: add @only_if_exists arg to - e_book_load_uri so we can support folder creation at load_uri - time, and add prototype for e_book_remove. - - * backend/ebook/e-book-types.h: add an "id" slot in EBookChange. - - * backend/ebook/e-book-listener.c - (impl_BookListener_respond_get_changes): handle union in idl. - (impl_BookListener_respond_open_book): remove unnecessary - exception check. - (impl_BookListener_respond_remove_book): new function. - (impl_BookListener_respond_get_supported_fields): rename this from - _response_. - (impl_BookListener_respond_get_supported_auth_methods): same. - (e_book_listener_class_init): add _remove_book and track change to - get_supported_fields/get_supported_auth_methods names. - - * backend/ebook/e-book-listener.h: add RemoveBookResponse to - EBookListenerOperation enum. - - * backend/idl/addressbook.idl: make BookChangeItem a union that - switches over BookChangeType. - - * backend/pas/pas-backend.c (pas_backend_change_add_new): new - function, create a BookChangeItem representing the addition of a - contact. - (pas_backend_change_modify_new): same, but for modifications. - (pas_backend_change_delete_new): same, but for deletions. - - * backend/pas/pas-backend.h: add prototypes for - pas_backend_change_{add,modify,delete}_new - - * backend/pas/pas-backend-file.c (pas_backend_file_changes): nuke. - (do_create): fix memory corruption. - (pas_backend_file_get_changes): copy the body of - pas_backend_file_changes here, and rework so that it's synchronous - and return a list instead of the book view hack. - (pas_backend_file_load_uri): mkdir the directory (we need a mkdir - -p here). - (select_changes): new function, scandir helper. - (pas_backend_file_remove): NULL out bf->priv->summary to quiet - valgrind, and call scandir to accumulate the .changes.db files - then unlink them. - - * backend/pas/pas-book.c (pas_book_respond_remove): new function. - (pas_book_respond_get_supported_fields): unifdef this, and make it - use a glist. - (pas_book_respond_get_supported_auth_methods): same. - (pas_book_respond_get_changes): this code is kinda gross... lots - of copying going on, there's got to be a better way. but it - works. - -2003-08-26 Chris Toshok <toshok@ximian.com> - - * backend/idl/addressbook.idl: add oneway void Book::remove() and - oneway void notifyBookRemoved() - -2003-08-26 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend.c (pas_backend_remove): new function. - (pas_backend_add_book_view): new function. - (pas_backend_add_client): move the "real_add_client" code here. - (pas_backend_remove_client): move the "real_remove_client" code - here. - (pas_backend_class_init): remove assignments of add_client and - remove_client vtable entries. - (pas_backend_is_removed): new function. - (pas_backend_set_is_removed): new function. - (pas_backend_init): init clients_mutex and views_mutex. - - * backend/pas/pas-backend.h: remove the vtable entries for - add/remove_client, since these are fully handled in PASBackend. - Add prototypes for - pas_backend_is_removed/pas_backend_add_book_view/pas_backend_set_is_removed. - - * backend/pas/pas-book.c - (impl_GNOME_Evolution_Addressbook_Book_remove): new function. - (impl_GNOME_Evolution_Addressbook_Book_getBookView): clean things - up a bit, and don't use pas_backend_get_book_views as it can't - lock the list of views. - (pas_book_respond_get_supported_auth_methods): remove the extra - unnecessary arg from the corba call. - (pas_book_respond_get_changes): same. - (pas_book_class_init): fill in epv "remove" slot. - - * backend/pas/pas-book.h: rename pas_book_respond_remove to - pas_book_respond_remove_cards, and add a new - pas_book_respond_remove for use with removing books. - - * backend/pas/pas-backend-sync.c (pas_backend_sync_remove): new - function. - (_pas_backend_remove): new function. - (pas_backend_sync_class_init): fill in the "remove" vtable entry. - (_pas_backend_remove_cards): track change to - pas_book_respond_remove_cards (pas_book_respond_remove is used for - removing the book, not the cards.) - - * backend/pas/pas-backend-sync.h: add pas_backend_sync_remove - prototype and add remove_sync virtual function. - -2003-08-26 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_create_card, - pas_backend_file_remove_cards, pas_backend_file_modify_card, - pas_backend_file_get_vcard, pas_backend_file_get_card_list, - pas_backend_file_start_book_view, pas_backend_file_get_changes, - pas_backend_file_authenticate_user, - pas_backend_file_get_supported_fields): rename from - pas_backend_file_process_* - (pas_backend_file_load_uri): save off the dirname/summary - filename. - (pas_backend_file_remove): new function, unlink all the files we - know about. - (pas_backend_file_class_init): track changes to functions, and add - pas_backend_file_remove. - -2003-08-26 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (ecard_from_remote_record): duplicate - the extra address lines - -2003-08-22 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book.[ch]: switch from using the PASRequest - union and a central PASBackend dispatch function. just call the - pas_backend methods directly and expand the args out. - - * backend/pas/pas-backend.[ch]: same. - - * backend/pas/pas-backend-sync.[ch]: same. - - * backend/pas/pas-backend-vcf.c, backend/pas/pas-backend-file.c, - backend/pas/pas-backend-ldap.c: same, and get these all compiling - against the rest of the current pas/ebook code. - -2003-08-21 Chris Toshok <toshok@ximian.com> - - * backend/ebook/test-ebook.c: track GError case. - - * backend/ebook/e-book.[ch]: GError-ify the api, and clean up some - cases where we weren't removing the current op. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_convert_status): track change from - E_BOOK_VIEW_STATUS_* to E_BOOK_VIEW_ERROR_*. - - * backend/ebook/e-book-types.h: track change from E_BOOK_STATUS_* - to E_BOOK_ERROR_*, and some E_BOOK_VIEW_STATUS_* to - E_BOOK_VIEW_ERROR_*. - - * backend/ebook/e-book-listener.c - (e_book_listener_convert_status): track change from - E_BOOK_STATUS_* to E_BOOK_ERROR_*. - - * backend/ebook/e-book-query.c (e_book_query_any_field_contains): - new function. - (e_book_query_unref): handle the any_field_contains case. - (e_book_query_to_string): same. - - * backend/ebook/e-book-query.h: add prototype for - e_book_query_any_field_contains. - - * backend/ebook/e-card.c (e_card_load_uri): ifdef this out for - now. - - * backend/ebook/e-contact.[ch] (e_contact_get_const): new - function/prototype. - -2003-08-20 Gilbert Fang <gilbert.fang@sun.com> - - * gui/widgets/e-addressbook-util.c - (e_addressbook_send_card_list): use memcpy to assign - CORBA_char_sequence instead of strcpy. (#46706) - -2003-08-18 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/component-factory.c: Update OAFIIDs. - - * gui/widgets/e-addressbook-util.c (e_addressbook_transfer_cards): - Removed extern declaration for global_shell_client [yuck]. - (e_addressbook_transfer_cards): #if 0 the invocation for - evolution_shell_client_user_select_folder(), we need to - reimplement this component-side now. - - * gui/component/component-factory.c (factory): Call - addressbook_component_peek() here instead of - addressbook_component_init() [since the latter is no more]. - - * gui/component/addressbook.c (set_status_message): Don't create - the activity client for now. - - * gui/component/addressbook-config.c: Removed member shell from - struct AddressbookDialog. - (ldap_dialog_new): Do not take a shell arg anymore. - (ldap_config_control_new): Likewise. - (addressbook_config_control_new): No need to get the global shell - pointer here anymore. - - * gui/component/addressbook-component.c: Rewritten to support the - new ::Component interface. - * gui/component/addressbook-component.h: Likewise. - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: Version - factory's OAFIID. Remove ShellComponent server, add Component - server. - -2003-08-12 Rodrigo Moya <rodrigo@ximian.com> - - * backend/ebook/e-book.c (e_book_dispose): unref the - EComponentListener before unloading the CORBA object. - -2003-08-12 Hans Petter Jansson <hpj@ximian.com> - - * backend/ebook/e-destination.c (e_destination_dispose): Chain. - - * gui/component/e-address-widget.c (e_address_widget_destroy): Chain. - Prevent double frees. Prevent double GSource removal. - - * gui/component/e-cardlist-model.c (e_cardlist_model_class_init): - Store parent class. - (e_cardlist_model_dispose): Chain. Prevent double frees and unrefs. - - * gui/contact-editor/e-contact-editor-address.c - (e_contact_editor_address_dispose): Chain. - - * gui/contact-editor/e-contact-editor-fullname.c - (e_contact_editor_fullname_dispose): Chain. - - * gui/contact-list-editor/e-contact-list-editor.c - (e_contact_list_editor_dispose): Chain. - - * gui/contact-list-editor/e-contact-list-model.c - (contact_list_model_destroy): Chain. Prevent double frees and unrefs. - - * gui/widgets/e-addressbook-reflow-adapter.c (addressbook_dispose): - Chain. - (addressbook_finalize): Chain. - - * gui/widgets/e-addressbook-table-adapter.c (addressbook_dispose): - Chain. - - * gui/widgets/e-addressbook-treeview-adapter.c (addressbook_destroy): - Chain. Prevent double free. - - * gui/widgets/gal-view-minicard.c (gal_view_minicard_dispose): - Chain. Prevent double free and detach. - - * gui/widgts/gal-view-treeview.c (gal_view_treeview_dispose): - Chain. Prevent double free and detach. - - * printins/e-contact-print-style-editor.c - (e_contact_print_stule_editor_destroy): Chain. Prevent double unref. - -2003-08-07 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-vcard.c (e_vcard_to_string_vcard_21): new, - unimplemented, function. - (e_vcard_to_string_vcard_30): move the 3.0 vcard export code here. - (e_vcard_to_string): call e_vcard_to_string_vcard_21 or - e_vcard_to_string_vcard_30 based on @format. - (e_vcard_attribute_remove_values): new function. - - * backend/ebook/e-vcard.h: add @format to e_vcard_to_string, and - add prototype for e_vcard_attribute_remove_values. also, add - prototype for e_vcard_decode_b_encoding. - -2003-08-07 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-listener.c - (impl_BookListener_respond_open_book): remove the book arg. - - * backend/ebook/e-book-listener.h (struct _EBookListenerResponse): - remove the corba book. - - * backend/ebook/e-book-async.c (_get_book_view_dtor): free the - query string. - (e_book_async_get_book_view): dup the query string. - - * backend/ebook/e-book.h: change e_book_get_book_view and - e_book_get_contacts to take a const char * query string instead of - an EBookQuery. - - * backend/ebook/e-book.c (e_book_add_contact): pass - EVC_FORMAT_VCARD_30 to e_vcard_to_string. - (e_book_commit_contact): same. - (e_book_get_book_view): take a const char* query string instead of - an EBookQuery. - (e_book_get_contacts): same. - (e_book_response_open): track change - the Book is no longer - communicated back here. - (listener_cb): nuke. - (e_book_handle_response): track change to e_book_response_open. - (e_book_load_uri): rework this from using BookFactory::openBook to - BookFactory::getBook + Book::open. - (e_book_get_uri): new function, reimplement from old api. - (e_book_get_static_capabilities): same. - (e_book_check_static_capability): same. - (startup_mainloop): new function, run bonobo_main. - (e_book_activate): start up a thread with startup_mainloop as the - start func. - (e_book_new): call e_book_activate. - - * backend/idl/addressbook.idl: Add Book::open, remove the Book - from notifyBookOpened's args, and change BookFactory::openBook to - BookFactory::getBook. - - * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): add - only_if_exists - stop using the "create-initial" special file. - - * backend/pas/pas-backend-vcf.c (pas_backend_vcf_load_uri): add - only_if_exists - stop using the "create-initial" special file. - - * backend/pas/pas-backend.c (pas_backend_load_uri): add - @only_if_exists, and pass it along to the virtual method. - (pas_backend_open): new function, lock the mutex so only one - PASBook can actually call load_uri. call load_uri with - pas_book_get_uri, and req->only_if_exists. - (pas_backend_handle_request): rename process_client_request to - this, and expose it publicly. Also add a case statement for - "Open". - (real_add_client): gut this function, we don't need to create the - book anymore, just add the client to the list and do the weak - ref/ORBit small stuff. - (pas_backend_add_client): track change to signature - BookListener - -> PASBook. - (pas_backend_init): init open_mutex. - (pas_backend_dispose): free open_mutex. - - * backend/pas/pas-backend.h (PASBackendClass): add @only_if_exists - to the load_uri virtual method, and change the add_client virtual - method to take a PASBook instead of a BookListener. add the same - args to _load_uri and add_client. Also, add prototypes for - pas_backend_handle_request and pas_backend_open. - - * backend/pas/pas-book-factory.c - (_pas_book_factory_send_open_book_response): nuke. - (pas_book_factory_launch_backend): just return NULL, don't call - _pas_book_factory_send_open_book_response, in the error case. - (start_backend): nuke - (impl_GNOME_Evolution_Addressbook_BookFactory_getBook): rename - _openBook to this. clean up the code a bit. Create the PASBook - here, and always track change to pas_backend_add_client's type (we - pass the book now, not the listener). - (pas_book_factory_class_init): openBook -> getBook. - - * backend/pas/pas-book.c - (impl_GNOME_Evolution_Addressbook_Book_open): new function, call - pas_backend_open. - (impl_GNOME_Evolution_Addressbook_Book_getVCard): get rid of the - signal crap, just call pas_backend_handle_request. - (impl_GNOME_Evolution_Addressbook_Book_getCardList): same. - (impl_GNOME_Evolution_Addressbook_Book_authenticateUser): same. - (impl_GNOME_Evolution_Addressbook_Book_addCard): same. - (impl_GNOME_Evolution_Addressbook_Book_removeCards): same. - (impl_GNOME_Evolution_Addressbook_Book_modifyCard): same. - (impl_GNOME_Evolution_Addressbook_Book_getChanges): same. - (impl_GNOME_Evolution_Addressbook_Book_getSupportedFields): same. - (impl_GNOME_Evolution_Addressbook_Book_getSupportedAuthMethods): - same. - (impl_GNOME_Evolution_Addressbook_Book_cancelOperation): same. - (pas_book_get_backend): aggregate some g_return_if_fail's. - (pas_book_get_listener): new function. - (pas_book_get_uri): new function. - (pas_book_respond_open): just call BookListener::notifyBookOpened. - (pas_book_construct): add @uri, and g_strdup it. - (pas_book_new): add @uri, and pass it to pas_book_construct. - (pas_book_class_init): remove the "request" signal stuff, and fill - in epv->open. - - * backend/pas/pas-book.h: add PASOpenRequest struct/enum entry. - Also, add @uri to the pas_book_new args, and add a prototype for - pas_book_get_uri. Also, remove the "request" signal. - -2003-08-07 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book-factory.c - (pas_book_factory_get_n_backends): lock map_mutex around hash - table work. - (pas_book_factory_dump_active_backends): same. - (backend_last_client_gone_cb): same. - (_pas_book_factory_send_open_book_response): track CallStatus idl - change. - (start_backend): simplify this greatly, since the factory is - tagged with HINT_PER_THREAD. - (impl_GNOME_Evolution_Addressbook_BookFactory_openBook): lock - around hash table. - (pas_book_factory_init): initialize map_mutex. - (pas_book_factory_dispose): free map_mutex. - -2003-08-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_book_view_copy): nuke. - (pas_backend_file_book_view_free): same. - (view_destroy): same. - (pas_backend_file_changes): #if notyet - (do_create): e-card -> e-contact. - (pas_backend_file_process_create_card): remove view handling from - here. - (pas_backend_file_process_remove_cards): same. - (pas_backend_file_process_modify_card): convert to e-contact, and - remove view handling. - (pas_backend_file_get_book_view): nuke. - (pas_backend_file_process_get_supported_fields): e-card-simple -> - e-contact. - (pas_backend_file_upgrade_db): e-card -> e-contact. - (pas_backend_file_cancel_operation): implement, just return - CouldNotCancel. - (pas_backend_file_class_init): assign cancel_operation, and remove - get_book_view assignment. - (pas_backend_file_init): remove book_views assignment. - -2003-08-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-vcf.c (pas_backend_vcf_book_view_copy): - nuke. - (pas_backend_vcf_book_view_free): same. - (view_destroy): same. - (insert_contact): new function, insert the contact into our hash - table. - (load_file): reimplement without the e_card stuff. - (foreach_build_list): e_card -> e_contact. - (save_file): mostly reimplement in terms of e-contact. more error - case work needs doing. - (do_create): e-card -> e-contact. - (pas_backend_vcf_process_create_card): remove the view handling - from here. - (pas_backend_vcf_process_remove_cards): implement this, just - remove it from the hash table and set ourselves to dirty. - (pas_backend_vcf_process_modify_card): remove the view handling - from here. - (pas_backend_vcf_process_get_book_view): nuke. - (pas_backend_vcf_process_get_supported_fields): reimplement in - terms of e-contact. - (INITIAL_VCARD): add in a FN attribute, and remove the quoted - printable encoding. - (pas_backend_vcf_cancel_operation): implement, just always return - CouldNotCancel. - (pas_backend_vcf_class_init): fill in cancel_operation, and remove - get_book_view_sync. - (pas_backend_vcf_init): remove book_views handling. - - * backend/pas/pas-backend-vcf.h: update copyright. - -2003-08-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-sync.c (pas_backend_sync_remove_cards): - add out param @ids, so we can call pas_book_respond_remove - properly. - (_pas_backend_remove_cards): the other half of the change - pass - the ids on to pas_book_response_remove. - (pas_backend_sync_modify_card): add out param @old_vcard so we can - call pas_book_respond_modify properly. - (_pas_backend_modify_card): the other half of the change, pass the - old_vcard on to pas_book_respond_modify. - (pas_backend_sync_get_book_view): nuke. - (pas_backend_sync_get_changes): track change (book view -> GList) - (_pas_backend_is_threaded): nuke. - (_pas_backend_create_card): indent. - (_pas_backend_remove_cards): same. - (_pas_backend_modify_card): same. - (_pas_backend_get_card_list): same. - (_pas_backend_get_changes): same. - (_pas_backend_authenticate_user): same. - (_pas_backend_get_supported_fields): same. - (_pas_backend_get_supported_auth_methods): same. - (_pas_backend_get_book_view): nuke. - (pas_backend_sync_class_init): remove assignment to is_threaded - and get_book_view. - - * backend/pas/pas-backend-sync.h: add out-params @ids to - remove_cards_sync, @old_vcard to modify_card_sync. - get_changes_sync's out-param is a GList instead of a book view, - and remove get_book_view_sync. - - * backend/pas/pas-backend.c (pas_backend_get_book_view): nuke. - (pas_backend_is_threaded): nuke. - (pas_backend_start_threaded): nuke. - (pas_backend_init): initialize priv->views. - (pas_backend_dispose): free priv->views. - (pas_backend_get_book_views): new function, return priv->views. - - * backend/pas/pas-backend.h: remove the get_book_view virtual - method, and the pas_backend_get_book_view prototype. Also, track - the CallStatus change, and add a cancel_operation virtual method - and prototype, and add pas_backend_get_book_views function, so the - PASBook's can get ahold of the list. - - * backend/pas/pas-book-view.h: track collapsing of - Addressbook::BookListenerCallStatus and - Addressbook::BookView::CallStatus enums into - Addressbook::CallStatus. - - * backend/pas/pas-book-view.c: same. - - * backend/pas/pas-card-cursor.[ch]: nuke - - * backend/pas/pas-book.c: track collapsing of - Addressbook::BookListenerCallStatus and - Addressbook::BookView::CallStatus enums into - Addressbook::CallStatus. - (impl_GNOME_Evolution_Addressbook_Book_getBookView): implement - this all here, instead of farming it out to the backends. - (impl_GNOME_Evolution_Addressbook_Book_getChanges): track change - to signature. this is no longer a book view, it'll return an - actual list. - (impl_GNOME_Evolution_Addressbook_Book_cancelOperation): new - function, implement. - (pas_book_respond_create): iterate over the views, notifying them - if the new card matches their query. - (pas_book_respond_remove): iterate over the views, telling them to - delete the card matching the id. - (pas_book_respond_modify): iterate over the views, notifying them - if they need to change/add/remove that card. - (view_destroy): move this here from the backends. - (pas_book_respond_get_book_view): weak-ref the book view. - (pas_book_new): remove the is_threaded switch on POA hints, and - always use PER_REQUEST. - (pas_book_class_init): fill in cancelOperation. - - * backend/pas/pas-book.h: track collapsing of - Addressbook::BookListenerCallStatus and - Addressbook::BookView::CallStatus enums into - Addressbook::CallStatus. - -2003-08-01 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-async.c: mostly finished. - -2003-08-01 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-async.[ch]: new files, create async methods - similar to the old ebook api that use GThread/GAsyncQueue to - simulate the old async behavior. - -2003-07-29 Chris Toshok <toshok@ximian.com> - - * backend/idl/addressbook.idl: collapse - Addressbook::BookListenerCallStatus and - Addressbook::BookView::CallStatus enums into - Addressbook::CallStatus. - -2003-07-29 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-types.h: add EBookChangeType/EBookChange. - -2003-07-29 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-view-listener.c: track collapsing of - Addressbook::BookListenerCallStatus and - Addressbook::BookView::CallStatus enums into - Addressbook::CallStatus. - - * backend/ebook/e-book-listener.c track collapsing of - Addressbook::BookListenerCallStatus and - Addressbook::BookView::CallStatus enums into - Addressbook::CallStatus. - (response_free): nuked - (e_book_listener_check_queue): nuked - (e_book_listener_queue_response): nuked - (e_book_listener_queue_progress): nuked - (e_book_listener_queue_get_view_response): nuked - (e_book_listener_queue_get_changes_response): nuked - (e_book_listener_queue_writable_status): nuked - (e_book_listener_queue_authentication_response): nuked - (e_book_listener_queue_get_supported_fields_response): nuked - (e_book_listener_queue_get_supported_auth_methods_response): nuked - (e_book_listener_dispose): nuked - - * backend/ebook/e-book-listener.h: remove prototypes for - check_pending and pop_response. - - * backend/ebook/e-book.c (e_book_get_changes): new function. - implement this as more of a getCardList type function, instead of - getBookView. - (e_book_response_get_changes): new function. - (e_book_free_change_list): new function. - - * backend/ebook/e-book.h: add prototype for - e_book_free_change_list. - -2003-07-23 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book.c (e_book_get_book_view): new function, - implement this. - (e_book_response_get_book_view): same. - (e_book_get_contacts): remove the op so we don't see BUSY after - this request. - (e_book_handle_response): unifdef a few things. - (e_book_unload_uri): fix the assertion about URI_NOT_LOADED, and - unifdef some code. - (e_book_dispose): fix a typo. - - * backend/ebook/e-book-view.c (e_book_view_handle_response): - rename _check_listener_queue to this. we don't need to pop the - response either, it's passed as an arg. - (e_book_view_construct): "response_queued" -> "response" - (e_book_view_start): new function, call BookView.start. - (e_book_view_dispose): track the signal id change. - - * backend/ebook/e-book-view.h: add prototype for - e_book_view_start. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_check_queue): remove. - (e_book_view_listener_queue_response): just emit the signal. - (impl_BookViewListener_notify_card_added): spew. - (impl_BookViewListener_notify_card_changed): spew. - (impl_BookViewListener_notify_sequence_complete): spew. - (impl_BookViewListener_notify_progress): spew. - (e_book_view_listener_check_pending): remove - (e_book_view_listener_check_pop_response): remove - (e_book_view_listener_new): use the ALL_AT_IDLE poa policy. - (e_book_view_listener_init): remove the queue/timeout stuff. - (e_book_view_listener_dispose): remove the queue/timeout stuff. - - * backend/ebook/e-book-view-listener.h: remove _check_pending and - _pop_response. - -2003-07-23 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c (do_summary_query): remove the - completion_search argument, and remove the aggregating stuff. - just call pas_book_view_notify_add_1. - (pas_backend_file_book_view_copy): remove card_sexp crap. - (pas_backend_file_book_view_free): same. - (get_length): remove - (get_nth): remove - (cursor_destroy): remove - (vcard_matches_search): remove - (ecard_matches_search): remove - (pas_backend_file_search_timeout): remove the aggregating stuff. - just call pas_book_view_notify_add_1. - (pas_backend_file_search): simplify this a bunch. - (do_create): use pas_book_view_vcard_matches. - (pas_backend_file_process_get_card_list): add some more error - checks. - (pas_backend_file_process_get_book_view): unifdef this, and - implement it. - (pas_backend_file_start_book_view): kick off the search. - (pas_backend_file_get_uri): remove. - (pas_backend_file_class_init): remove get_uri, add - start_book_view. - - * backend/pas/pas-backend-ldap.c (view_destroy): don't need to - unref the card_sexp, as the PASBookView owns it now. - (create_card_handler): use pas_book_view_vcard_matches. - (modify_card_modify_handler): same. - (ldap_get_view): initialize the view properly. - (pas_backend_ldap_get_uri): remove. - (pas_backend_ldap_class_init): remove the get_uri assignment. - - * backend/pas/pas-backend-sync.c (_pas_backend_get_card_list): - don't free this, it's freed in the pas_book code. - - * backend/pas/pas-backend-sync.h: make use of pas-types.h and - remove some typedefs. - - * backend/pas/pas-backend-summary.h: same. - - * backend/pas/pas-backend-card-sexp.h: same. - -2003-07-23 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book.c - (impl_GNOME_Evolution_Addressbook_Book_getBookView): spew. - (pas_book_respond_create): unifdef this. - (pas_book_respond_remove): same. - (pas_book_respond_modify): same. - (pas_book_respond_authenticate_user): same. - (pas_book_respond_get_supported_fields): unref the iterator. - (pas_book_respond_get_book_view): unifdef, and add spew. - - * backend/pas/pas-book.h: make use of pas-types.h and remove some - typedefs. - -2003-07-23 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-types.h: new file, all the typedefs shared - between files here. - -2003-07-23 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book-view.c (send_pending_adds): abstract all - the aggregating code to the book view. backends just call - notify_card_added and the superclass does all the aggregating. - (pas_book_view_notify_change): if there are pending adds, send - them before we send the change. - (pas_book_view_notify_remove): same. - (pas_book_view_notify_add): the other part of the aggregating - code. - (pas_book_view_notify_complete): send pending adds if there are - any. - (impl_GNOME_Evolution_Addressbook_BookView_start): new function, - call pas_backend_start_book_view. - (pas_book_view_get_card_query): new function. - (pas_book_view_get_card_sexp): new function. - (pas_book_view_get_backend): new function. - - * backend/pas/pas-book-view.h: add a PASBackend arg to the - constructor, as well as the char* query and PASBackendCardSExp - form. also add accessors for card_query, card_sexp, and backend. - - * backend/idl/addressbook.idl - (GNOME::Evolution::Addressbook::BookView): add start() method. - (GNOME::Evolution::Addressbook::BookListener): remove the oneway - tag from notifyBookOpened, notifyViewRequested, and - notifyChangesRequested so the call doesn't return until the remote - object has gotten the method call. - - * backend/pas/pas-backend.c (pas_backend_load_uri): fill in the - uri slot if the load was successful. - (pas_backend_get_uri): return the uri, remove the virtual method - call. - (pas_backend_start_book_view): new function. - (process_client_request): ifdef out the threaded foo, since i'm - not certain it's at all necessary. - (real_add_client): remove the bonobo_object_unref of the book, - since it's immortal. - (pas_backend_dispose): free the uri. - - * backend/pas/pas-backend.h: remove the get_uri virtual method, - and add the start_book_view virtual method and - pas_backend_start_book_view prototype. - -2003-07-23 Chris Toshok <toshok@ximian.com> - - * backend/pas/Makefile.am (libpasvcf_a_SOURCES): new. - (noinst_LIBRARIES): add libpasvcf.a - - * backend/pas/pas-backend-vcf.[ch]: new files, implement a vcard - file backend. the backend api still needs a little work, but it's - getting easier to write backends. - -2003-07-23 Chris Toshok <toshok@ximian.com> - - * printing/e-contact-print.c (e_contact_print_response): deal with - "uses_list". Fixes #30839. - (e_contact_print_dialog_new): use GINT_TO_POINTER instead of - casting to void*, and set "uses_list" to FALSE. - (e_contact_print_card_dialog_new): same. - (e_contact_print_card_list_dialog_new): same, but set "uses_list" - to TRUE. - -2003-07-23 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book.c (e_book_dispose): fix a typo. - -2003-07-22 Akira TAGOH <tagoh@redhat.com> - - * printing/e-contact-print-envelope.c (ecpe_print): Use 'Sans' - instead of 'Helvetica' for the font name. - * printing/e-contact-print.c (e_contact_build_style): Likewise. - -2003-07-23 Dan Winship <danw@ximian.com> - - * backend/ebook/Makefile.am: use EVO_MARSHAL_RULE - * backend/pas/Makefile.am: Likewise - * gui/component/select-names/Makefile.am: Likewise - * gui/contact-editor/Makefile.am: Likewise - * gui/contact-list-editor/Makefile.am: Likewise - * gui/widgets/Makefile.am: Likewise - - * gui/contact-editor/e-contact-editor.c - (e_contact_editor_class_init): - s/ece_marshal/e_contact_editor_marshal/ - - * gui/contact-list-editor/e-contact-list-editor.c - (e_contact_list_editor_class_init): Likewise for ecle_marshal - - * gui/search/e-addressbook-search-dialog.c - (e_addressbook_search_dialog_init): Remove gtk_window_set_policy - call since that function is deprecated and it was just setting - everything to the default values anyway. - - * gui/widgets/e-addressbook-util.c: #include gal/util/e-util.h for - e_free_object_list. - -2003-07-22 Dan Winship <danw@ximian.com> - - * backend/ebook/e-card.c: (e_card_new, - e_card_new_with_default_charset): Make the "vcard" arg const. - ...: add lots and lots of other consts as a side effect - -2003-06-30 Dan Winship <danw@ximian.com> - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_dispose): - disconnect from model signals to prevent a race condition at - shutdown where the view gets destroyed and then the model notices - the backend dying before being destroyed itself. - - * gui/widgets/e-addressbook-reflow-adapter.c - (addressbook_finalize): add, to free priv. - (e_addressbook_reflow_adapter_class_init): set it up - - * gui/component/e-address-popup.c (e_address_popup_set_free_form): - Don't leak strings - - * gui/component/addressbook-storage.c (load_source_data): don't - leak xml data. - - * gui/component/addressbook-component.c (new_item_cb): don't leak - the new card. - -2003-06-25 Gilbert Fang <gilbert.fang@sun.com> - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_real_focus_in_event): new function, - override the event handler for focus_in_event, set the first item - be focused if no focused item at all. Fixes bug 41826. - -2003-06-18 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (fill_in_field): in the - EUrlEntry case just reassign widget. it'll be handled by the - GtkEditable code below. Fixes #43841. - -2003-06-14 Larry Ewing <lewing@ximian.com> - - * gui/backend/ebook/e-card-simple.c: - * gui/backend/ebook/e-card.c: - * gui/backend/ebook/evolution-ldif-importer.c: - * gui/backend/ebook/load-pine-addressbook.c: - * gui/backend/ebook/test-card.c: - * gui/backend/pas/pas-backend-card-sexp.c: - * gui/backend/pas/pas-backend-ldap.c: Fix lots of leaks, update - for correct use of g_object_get. Some cleanups. - -2003-06-13 Larry Ewing <lewing@ximian.com> - - * gui/component/addressbook.c: - * gui/component/e-cardlist-model.c: - * gui/component/select-names/e-select-names-text-model.c: - * gui/contact-editor/e-contact-editor.c: - * gui/contact-editor/e-contact-save-as.c: - * gui/contact-list-editor/e-contact-list-editor.c: - * gui/widgets/e-addressbook-table-adapter.c: - * gui/widgets/e-addressbook-util.c: - * gui/widgets/e-addressbook-view.c: - * gui/widgets/e-minicard-view.c: - * gui/widgets/e-minicard.c: Fix lots of leaks, update for correct - use of g_object_get. Some misc cleanups. - - * printing/e-contact-print.c: update for correct use of - g_object_get. - -2003-06-05 Not Zed <NotZed@Ximian.com> - - ** For #42691. - - * gui/component/select-names/Makefile.am (%.server.in): implicit - rule for .in file. - (BUILT_SOURCES): added server_DATA. - - * gui/component/Makefile.am (%.server.in): use implicit rule for - .in file. - (BUILT_SOURCES): added, just server_DATA. - (CLEANFILES): added - - * backend/ebook/Makefile.am (BUILT_SOURCES): add server_DATA. - -2003-06-04 Rodrigo Moya <rodrigo@ximian.com> - - * backend/ebook/ebook.c (e_book_do_response_open): adapted to - changes in EComponentListener API. - -** See ChangeLog.pre-1-4 for older changes - diff --git a/addressbook/ChangeLog.pre-1-4 b/addressbook/ChangeLog.pre-1-4 deleted file mode 100644 index b1c12cb82f..0000000000 --- a/addressbook/ChangeLog.pre-1-4 +++ /dev/null @@ -1,16758 +0,0 @@ -2003-05-19 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (func_beginswith): use the more - convoluted (but more correct) query if evolutionPerson is - supported. Fixes #42825. - -2003-05-19 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-destination.c (use_default_book_cb): handle the - case where @book == NULL, which can happen if there was a problem - opening the default book. Should fix #43005. - -2003-05-19 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c - (ensure_completion_uris_exist): fix the initial run case. the - config upgrade code creates all elements so we can't just check - for NULL - we have to check if the string is empty. Fixes #43213. - -2003-05-19 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard-label.c (set_colors): if we've got focus, - set the background of the rect to bg[NORMAL], and the fill color - of the text and label to text[NORMAL]. This will make the - background a different color than the canvas, but won't make it - use the selected background. fixes #42472 - -2003-05-19 Chris Toshok <toshok@ximian.com> - - * gui/merging/e-card-merging.c (e_card_merging_book_commit_card): - add a g_object_ref(card), to match the one in - e_card_merging_book_add_card. Fixes #43175. - -2003-05-19 Anna Marie Dirks <anna@ximian.com> - - * gui/contact-editor/e-contact-quick-add.c: Added HIG-appropriate - HIG-appropriate spacing, padding, accelerators. Fixes bug #41210 - - * gui/component/ldap-config.glade: HIG-ified the various dialogs - (including the settings pages, the config druid, and the edit dialog) - in this glade file. This fixes bugs #41140, #41137, #41130 - - * gui/merging/e-card-merging-book-commit-duplicate-detected.glade: - Changed button order, and added HIG-appropriate spacing/padding. - Fixes bug #41232. - - * gui/merging/e-card-duplicate-detected.glade: Changed button - order, and added HIG-appropriate spacing/padding. Fixes bug - #41229 and #41231. - -2003-05-19 Sean Gao <sean.gao@sun.com> - - * gui/component/addressbook-component.c (xfer_folder): remove the - summary if @remove_source is TRUE. Fixes 38084. - -2003-05-16 Anna Marie Dirks <anna@ximian.com> - - * gui/contact-list-editor/contact-list-editor.glade: Added - HIG-appropriate spacing, padding, capitalization and accelerators. - Fixes bug #41254 - -2003-05-16 Anna Marie Dirks <anna@ximian.com> - - * gui/contact-editor/fulladdr.glade: Added HIG-appropriate - spacing, padding, capitalization and accelerators. Fixes bug #41251 -2003-05-14 Anna Marie Dirks <anna@ximian.com> - - * gui/contact-editor/fullname.glade: Added HIG-appropriate - spacing, padding, caps, title and accelerators. Fixes bug #41249, - and also bug #41250.. - -2003-05-16 Anna Marie Dirks <anna@ximian.com> - - * gui/contact-editor/contact-editor.glade: Added HIG-appropriate - spacing, padding, capitalization and accelerators. Fixes bug #41248. - - -2003-05-16 Rodney Dawes <dobey@ximian.com> - - * addressbook/backend/ebook/Makefile.am: Move the tools to a - more appropriate directory, privlibexecdir - -2003-05-15 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (book_open_cb): backing out a tiny - porting of jpr's fix - we need to set the book on the - EAddressbookView, or else it won't do queries, and it won't show - any cards. Fixes #43023, #43090. - -2003-05-15 Chris Toshok <toshok@ximian.com> - - * gui/merging/e-card-merging.c (free_lookup): new function, split - out the duplicated teardown code from final_cb and final_id_cb. - also, unref the card. - (final_id_cb): call free_lookup. - (final_cb): same. - (e_card_merging_book_add_card): ref the card. fixes bug #43016. - -2003-05-14 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (full_addr_clicked): - replace the text_buffer_delete/text_buffer_insert with - set_buffer_set_text. call widget_changed if they clicked OK, so - we actually mark the dialog changed. - (fill_in_field): make this handle GtkTextViews, because for some - reason that escapes rational thought GtkTextView's don't implement - GtkEditable. fixes #42606. - (extract_field): same. - -2003-05-14 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard-label.c (e_minicard_label_reflow): set - the clip_height on reflow so the name of the field is as high as - the field's value. makes it possible to click anywhere to the - left of a tall field (like an address) and have it select the - field. Fixes #42625. - -2003-05-14 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (address_mailing_changed): - handle the case where we haven't filled in the address yet. fixes - #42620. - -2003-05-14 JP Rosevear <jpr@ximian.com> - - * gui/component/addressbook.c (addressbook_view_unref): clear the - view - (book_open_cb): track the book in the view, don't unref the book - (set_prop): set the book - (retrieve_shell_view_interface_from_control): get the shell view - every time - (set_folder_bar_label): release and unref the shell view - - * gui/component/addressbook-storage.h: add proto - - * gui/component/addressbook-storage.c - (addressbook_storage_cleanup): unref the storage - - * gui/component/addressbook-component.c (owner_unset_cb): clean up - storage - - * backend/ebook/e-book.c (e_book_load_uri): track the listener - signal - (e_book_dispose): unref the listener and disconnect the signal - -2003-05-13 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_set_separator): strlen -> - g_utf8_strlen. - (e_select_names_text_model_insert): same. - (e_select_names_text_model_insert_length): big change, make this - work with multibyte utf8. - (e_select_names_text_model_delete): same. this could possibly use - a tighter loop + a memmove, but this works. - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_get_textification): make sure our truncation - to MAX_LENGTH characters uses utf8 characters, not bytes. - (e_select_names_model_name_pos): track e-text-model change. - pos/length are now in utf8 character terms, so use g_utf8_strlen - instead of strlen. - (e_select_names_model_text_pos): same. - -2003-05-13 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-table-adapter.c (addressbook_dispose): - rename addressbook_destroy to this, and guard against multiple - calls. - (e_addressbook_table_adapter_class_init): GtkObject -> GObject, - and destroy -> dispose. - (e_addressbook_table_adapter_init): GtkObject -> GObject. - -2003-05-12 Sean Gao <sean.gao@sun.com> - - * gui/contact-list-editor/e-contact-list-editor.c - (e_contact_list_editor_init): terminate g_build_filename with - NULL. - -2003-05-11 Chris Toshok <toshok@ximian.com> - - [ fixes bug #42048 ] - * gui/widgets/e-addressbook-view.c (e_contact_print_button): - button => response. - (e_addressbook_view_print): connect to "response", not "clicked". - -2003-05-11 Chris Toshok <toshok@ximian.com> - - [ fixes bug #41245 ] - * gui/component/select-names/select-names.glade: fix - spacing/border widths as per HIG. - - * gui/component/select-names/e-select-names.c - (e_select_names_init): set the border width/spacing on widgets we - create here. - -2003-05-09 Jeremy Katz <katzj@redhat.com> - - * printing/e-contact-print.c (e_contact_print_response): Use glib - macro to case from pointer to int. - - * printing/e-contact-print-envelope.c: Add missing #include. - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_start_query): Use - E_SELECT_NAMES_COMPLETION to avoid warning - -2003-05-06 Chris Toshok <toshok@ximian.com> - - [ really commit this, fixes bug #41910 ] - * gui/contact-list-editor/e-contact-list-model.c - (e_contact_list_model_remove_row): change from model_changed to - row_deleted here. model_changed causes the table to free its - ETableSelection, which is what we iterate over when deleting - contacts. - (e_contact_list_model_add_destination): no need to be calling - model_changed here either. - -2003-04-29 Chris Toshok <toshok@ximian.com> - - [ fixes bug #41255 ] - * gui/contact-list-editor/contact-list-editor.glade: use stock - buttons for Add/Remove. - -2003-04-29 Chris Toshok <toshok@ximian.com> - - [ fixes bug #41144 ] - * gui/component/ldap-config.glade: use stock buttons for the - Add/Delete buttons. Switch from "Delete" to "Remove", though, as - "Remove" fits much better with the one for "Add". Also, add our - stock-edit-24.png icon for "Edit". - -2003-04-29 Chris Toshok <toshok@ximian.com> - - [ fixes bug #41211 ] - * gui/component/e-address-popup.c (e_address_popup_no_matches): - call e_button_new_with_stock_icon to create our button and give it - the right icon. - -2003-04-29 Gilbert Fang <gilbert.fang@sun.com> - - * tools/evolution-addressbook-export-list-cards.c - (set_pre_defined_field): remove duplicate HOME_COUNTRY field add. - -2003-04-28 Chris Toshok <toshok@ximian.com> - - [ fixes bug #41843] - * tools/evolution-addressbook-export-list-cards.c - (e_card_simple_csv_get_name): use e_card_simple_get_ecard_field - instead of e_card_simple_get_name, so the return value won't be - localized. - -2003-04-28 Chris Toshok <toshok@ximian.com> - - [ fixes bug #41779 ] - * gui/component/e-address-popup.c (mini_wizard_container_add): we - don't need to call gtk_widget_destroy on the old child, since - gtk_container_remove will unref it for us. - -2003-04-23 Chris Toshok <toshok@ximian.com> - - [ fixes bug #37351 ] - * gui/widgets/e-addressbook-view.c (table_drag_data_get): the row - the signal is called with is already the model row, not the view - row, so don't call e_table_view_to_model_row on it. - -2003-04-23 Chris Toshok <toshok@ximian.com> - - [ either mostly or entirely fixes #33708 ] - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_done): new function, factor it out of - _seq_complete_cb because we need to run the same code in a couple - of places. - (e_select_names_completion_got_book_view_cb): treat an error from - a book as getting a "sequence_complete", and decrement the count - of pending complete signals. - (e_select_names_completion_got_book_view_cb): remove the increment - of pending_completion_seq from here. - (e_select_names_completion_seq_complete_cb): factor out the body - of e_select_names_completion_done from here, and call it. - (e_select_names_completion_start_query): increment - pending_completion_seq here. remove the async variable, as we can - now use pending_completion_seq for that purpose (it's > 0 iff - async would have been TRUE). - -2003-04-19 Chris Toshok <toshok@ximian.com> - - [ fixes bug #40954 ] - * backend/pas/pas-backend-file.c (pas_backend_file_dispose): guard - against NULL bf->priv->summary (happens if the initial load_uri - failed). - (pas_backend_file_load_uri): always set bf->priv->uri, since it's - used in _get_uri, which is called when the backend goes away. - This only happened before if you tried to load a folder that - didn't exist. - -2003-04-19 Chris Toshok <toshok@ximian.com> - - [ fixes #40694 ] - * gui/component/select-names/e-select-names-bonobo.c - (control_activate_cb): just grab focus if @activate == TRUE. - we'll do all merging/unmerging in the focus handler. - (widget_focus_cb): handle the merging here. - (e_bonobo_control_automerge_ui): store off the widget (so we can - grab focus on it) and connect to "activate". - -2003-04-18 Rodney Dawes <dobey@ximian.com> - - * gui/component/select-names/Makefile.am: Add missing -DPREFIX - -2003-04-18 Rodney Dawes <dobey@ximian.com> - - [ fixes #21499 ] - * gui/component/Makefile.am: - * gui/component/addressbook.c: - * gui/component/select-names/e-select-names-bonobo.c: - * gui/contact-editor/Makefile.am: - * gui/contact-editor/e-contact-editor.c: - * gui/contact-list-editor/Makefile.am: - * gui/contact-list-editor/e-contact-list-editor.c: - Use PREFIX instead of EVOLUTION_DATADIR for bonobo_ui_util_set_ui () - -2003-04-15 Chris Toshok <toshok@ximian.com> - - [ fixes #41252 ] - * gui/contact-editor/fulladdr.glade: change title from "Check - Address" to "Full Address". - -2003-04-09 Chris Toshok <toshok@ximian.com> - - [ fixes #40727 ] - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_start_query): if the query text is - either shorter than the cached query_text or they don't match, - don't just set can_reuse_cached_cards to FALSE. we also need to - invalidate the cache. - -2003-04-08 Ettore Perazzoli <ettore@ximian.com> - - * backend/ebook/e-destination.c (d): Remove all debugging - messages. - -2003-04-08 Dan Winship <danw@ximian.com> - - * gui/component/ldap-config.glade: Remove color specifications - from the druid so it will use theme colors. - - * gui/component/addressbook-config.c - (addressbook_add_server_druid): Use g_signal_connect_after for - "prepare" signal (to work around b.g.o 81869) - -2003-04-07 Chris Toshok <toshok@ximian.com> - - [ fixes #7103 ] - * gui/widgets/e-minicard-label.c (e_minicard_label_class_init): - init style_set. and add the signal. - (e_minicard_label_realize): include e_minicard_label_construct's - code here, and call set_colors after we create the sub-items. - (e_minicard_label_unrealize): indent, and remove dead code. - (e_minicard_label_event): indent, and call set_colors instead of - setting the colors manually. - (set_colors): new function, set our colors based on the current - style. - (e_minicard_label_style_set): new function, just call set_colors. - (e_minicard_label_new): e_minicard_label_construct doesn't exist - anymore. - - * gui/widgets/e-minicard-label.h (struct _EMinicardLabelClass): - add style_set signal. - - * gui/widgets/e-minicard.c (set_selected): little tweaks in the - coloring. - (e_minicard_unrealize): reindent, and remove some unused code. - - * gui/widgets/e-minicard-view-widget.h (struct - _EMinicardViewWidget): add background. - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_class_init): init - widget_class->style_class. - (e_minicard_view_widget_style_set): new function, just set the - background's fill_color_gdk to base[GTK_STATE_NORMAL]. - (e_minicard_view_widget_realize): store off the background canvas - item so we can set the color later. - -2003-04-07 Chris Toshok <toshok@ximian.com> - - [ fixes bug #40901 ] - * gui/component/ldap-config.glade: HIG-ify the ldap server edit - dialog's button layout. - -2003-04-07 Chris Toshok <toshok@ximian.com> - - [ fixes bug #39763 ] - * gui/component/select-names/e-select-names-bonobo.c (copy_cb): - verb callback for EditCopy - (cut_cb): verb callback for EditCut. - (paste_cb): verb callback for EditPaste. - (select_all_cb): verb callback for SelectAll. - (free_closure): new function - (merge_menu_items): same - (unmerge_menu_items): same - (control_set_frame_cb): same - (control_activate_cb): same - (widget_focus_cb): same - (e_bonobo_control_automerge_ui): new function, sets up focus - signals on the widget passed in to merge/unmerge the passed in - ui/verbs. - (impl_SelectNames_get_entry_for_section): call - e_bonobo_control_automerge_ui for this entry. - -2003-04-07 Chris Toshok <toshok@ximian.com> - - * gui/component/e-address-popup.c (mini_wizard_new): change the - ok/cancel button layout to be higified. - -2003-04-07 Chris Toshok <toshok@ximian.com> - - [ last portion of #40046 fix ] - * gui/component/select-names/e-select-names-popup.c - (remove_recipient_cb): ifdef this out to quiet the compiler. - (remove_all_recipients_cb): same. - (toggle_html_mail_cb): same. - (populate_popup_card): change the #if 0 to #if - TOO_MANY_MENU_ITEMS. - (popup_menu_list): nuke, as it's handled by populate_popup_card. - (populate_popup_nocard): rename popup_menu_nocard to this, and - implement it as in populate_popup_card. - (e_select_names_populate_popup): we don't need the card, since we - don't check if it's a list here anymore. also, remove the #if 0 - surrounding the nocard case. - -2003-04-07 Not Zed <NotZed@Ximian.com> - - Fixes #40252. - - * conduit/address-conduit.c: Change the LOG macro to a - single arg macro which copies its arg. Fix all callers. Change - WARN and INFO to simply g_warning/g_message. Init G_LOG_DOMAIN - before including anything. - -2003-04-07 Chris Toshok <toshok@ximian.com> - - * Makefile.am (SUBDIRS): add tools. - -2003-04-07 Gilbert Fang <gilbert.fang@sun.com> - - [ fixes bug #23036 ] - * tools/evolution-addressbook-export.c, - tools/evolution-addressbook-export-list-cards.c, - tools/evolution-addressbook-export-list-folders.c: : new and - improved export utility. - -2003-04-07 Dan Winship <danw@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.server.in.in: Clean up - server names. - - * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in: - Likewise - - * backend/ebook/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in: - Likewise. Also mark the evolution:menu_name for i18n. - - * backend/ebook/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in: - Likewise - -2003-04-03 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard-label.c (e_minicard_label_event): set - "handle_popup" on the field to be TRUE if it's got focus, FALSE if - not. - -2003-04-03 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard-label.c (e_minicard_label_construct): - doh, set the im_context on the field name too so we get the Input - Method submenu in the contxt menu. - -2003-04-03 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard-label.c (e_minicard_label_construct): set - the im_context on the field's EText. - (e_minicard_label_event): remove a huge swath of #if 0'd code. - -2003-04-03 Chris Toshok <toshok@ximian.com> - - [ fixes bug #40715 ] - * gui/merging/e-card-merging.c (final_id_cb): add this callback, - to unref the book/free the closure after calling the user's - callback. - (final_cb): same. - (doit): use final{_id}_cb - (cancelit): same. - (response): don't free the lookup struct here. - (match_query_callback): same. - (e_card_merging_book_add_card): ref the book. - (e_card_merging_book_commit_card): same. - - * gui/component/e-address-popup.c (card_picker_init): make sure to - set the "text" attribute on the cell renderer so the text actually - shows up. also, g_object_connect -> g_signal_connect *sigh*. - Lastly, get rid of the scrolled window and just make the window - size to show the text. - - * gui/widgets/e-minicard.c (e_minicard_style_set): only call - set_selected if we're realized (we create all the canvas objects - that set_selected manipulates in our realize method.) - -2003-04-03 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/Makefile.am (INCLUDES): add - EVOLUTION_IMAGESDIR - -2003-04-02 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-popup.c: change all - this around so that we populate the existing popup. This means we - get the select names popup stuff on top of the normal EEntry popup - foo. - - * gui/component/select-names/e-select-names-popup.h - (e_select_names_populate_popup): rename e_select_names_popup to - this. - - * gui/component/select-names/e-select-names-manager.c - (populate_popup_cb): rename popup_cb here, and - e_select_names_popup -> e_select_names_populate_popup. - (e_select_names_manager_entry_new): popup -> populate_popup. - -2003-04-02 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-marshal.list: add NONE:OBJECT - - * gui/widgets/e-minicard.c (e_minicard_class_init): add style_set - signal. - (e_minicard_style_set): just call set_selected with the currently - selected flag, so we recolor properly. - - * gui/widgets/e-minicard.h (struct _EMinicardClass): add style_set - signal. - -2003-04-01 Rodrigo Moya <rodrigo@ximian.com> - - * backend/ebook/evolution-ldif-importer.c (load_file_fn): - * backend/ebook/evolution-vcard-importer.c (load_file_fn): added - "folder_type" parameter to EvolutionImporterLoadFileFn. - -2003-03-31 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-util.c (get_local_book_uri): new function, - just return the local uri. - (set_default_book_uri_local): use get_local_book_uri. - (e_book_default_book_open): only try and reload the default book - if it's not already the local book. - -2003-03-31 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (card_removed): it emits a list now - -2003-03-31 Dan Winship <danw@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_init): Remove folder-selector button - initialization. - (e_select_names_new): Initialize folder-selector button here, - using the passed-in EvolutionShellClient rather than depending on - a global variable. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_activate_dialog): take an - EvolutionShellClient and pass it to e_select_names_new(). - - * gui/component/select-names/e-select-names-bonobo.c - (impl_SelectNames_activate_dialog): get a pointer to the shell - from bonobo-activation, create a shell_client, and pass it to - e_select_names_manager_activate_dialog. - - * backend/ebook/e-book-util.c (e_book_get_default_book_uri): - constify return value - -2003-03-30 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-vcard.[ch]: braindead, and *extremely* forgiving - vcard parser. not for public consumption yet. - -2003-03-30 Chris Toshok <toshok@ximian.com> - - [ fixes bug #39381 (again) ] - * gui/component/e-address-popup.c (edit_contact_info_cb): add - "GtkWidget *button" first arg, so we don't crash. - -2003-03-28 Chris Toshok <toshok@ximian.com> - - [ fixes bug #40403 ] - * backend/ebook/e-card.c (e_card_get_vobject): revert the fix for - 28945, as was done on the 1.2 branch. this is because the "fix" - actually breaks internal use of contact lists. We need to make - the exporting of contacts DTRT, instead of fixing it here. - -2003-03-28 Chris Toshok <toshok@ximian.com> - - [ fix the contact editor so that the only time the address is - parsed is when the user types in the address GtkTextView. ] - * gui/contact-editor/e-contact-editor.c (address_mailing_changed): - make this use delivery addresses instead of labels. - (full_addr_clicked): same. - (find_address_mailing): same. - - * backend/ebook/e-card-simple.c - (e_card_simple_set_delivery_address): make this operate similar to - e_card_simple_set_address: it sets both the delivery address and - the label for the address. - -2003-03-26 Chris Toshok <toshok@ximian.com> - - [ fixes bug #19178 ] - * backend/ebook/evolution-ldif-importer.c (ebook_open): use - e_book_load_address_book_by_uri on the passed in uri. - (load_file_fn): pass the uri. - - * backend/ebook/evolution-vcard-importer.c (ebook_open): use - e_book_load_address_book_by_uri on the passed in uri. - (load_file_fn): pass the uri. - -2003-03-26 Chris Toshok <toshok@ximian.com> - - [ fixes bug #34651 ] - * gui/component/select-names/e-select-names.c - (select_entry_changed): strcmp -> g_utf8_collate. - (update_query): encode the string we pass for the query. - -2003-03-26 Chris Toshok <toshok@ximian.com> - - [ fixes bug #34085 ] - * gui/contact-list-editor/e-contact-list-editor.c - (table_drag_data_received_cb): only successfully complete the drag - if they dropped a valid vcard (or vcard list). Call - gtk_drag_finish. - -2003-03-26 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/Makefile.am (INCLUDES): $evolution_uidir - -> $evolutionuidir - -2003-03-26 Philip Zhao <philip.zhao@sun.com> - - [ fixes bug #39170 ] - * backend/pas/pas-backend.c (pas_backend_create_card): remove - 'return'. - (pas_backend_remove_cards): same. - (pas_backend_modify_card): same. - (pas_backend_check_connection): same. - (pas_backend_get_vcard): same. - (pas_backend_get_cursor): same. - (pas_backend_get_book_view): same. - (pas_backend_get_completion_view): same. - (pas_backend_get_changes): same. - (pas_backend_authenticate_user): same. - (pas_backend_get_supported_fields): same. - (pas_backend_get_supported_auth_methods): same. - -2003-03-26 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (local_record_from_ecard): append the - second line to the address if necessary - (ecard_from_remote_record): split the address line in two if - necessary - -2003-03-23 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/contact-list-editor.glade: set the - dialog to "Visible: No" so it doesn't flash when we bring it up. - -2003-03-23 Chris Toshok <toshok@ximian.com> - - [ fixes bug #40026 ] - * gui/contact-editor/e-contact-editor.c (set_field): add - EContactEditor arg, and block/unblock signals around the - gtk_entry_set_text, since that generates a "changed" signal which - causes problems. - (set_phone_field): take and pass along an EContactEditor arg. - (set_fields): pass editor to set_field. - -2003-03-23 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/arrow.png: nuke. - - * gui/contact-editor/Makefile.am (EXTRA_DIST): remove images_DATA - (images_DATA): nuke, don't need it anymore. - - * gui/contact-editor/e-contact-editor.c - (connect_arrow_button_signal): rename _replace_button to this. we - no longer create an image, as it's a GtkArrow in the .glade file - now. - (connect_arrow_button_signals): rename _replace_buttons to this. - no longer pass the arrow.png's to _replace_button. - (e_contact_editor_init): _replace_buttons -> - connect_arrow_button_signals. - (_arrow_pressed): remove some dead code, and some args that aren't - used. - (_phone_arrow_pressed): track change to _arrow_pressed. - (_email_arrow_pressed): same. - (_address_arrow_pressed): same. - -2003-03-23 Chris Toshok <toshok@ximian.com> - - [ fixes bug #31786 ] - * gui/component/addressbook-config.c - (addressbook_source_dialog_set_source): fix some gtk warnings. - (set_advanced_button_state): the advanced dialog isn't present in - the glade file anymore, so ifdef everything dealing with it. - (addressbook_edit_server_dialog): same. - - * gui/component/ldap-config.glade: remove all the unused Advanced - UI stuff to lessen the amount of strings needing translation. - -2003-03-23 Chris Toshok <toshok@ximian.com> - - [ fixes bug #32113 ] - * backend/ebook/e-destination.h: add include_email arg to - e_destination_get_textrep. - - * backend/ebook/e-destination.c (e_destination_get_textrep): add - include_email arg. if it's TRUE, and if there's an email address to - add - - * gui/contact-list-editor/e-contact-list-model.c - (contact_list_value_at): use e_destination_get_textrep so we don't - display QP text, and pass TRUE for include_email. - - * gui/widgets/e-minicard.c (add_field): same. - (remodel): same. - - * gui/widgets/e-addressbook-treeview-adapter.c (adapter_get_value): same. - - * gui/widgets/e-addressbook-table-adapter.c (addressbook_value_at): same. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_insert_length): pass FALSE for - include_email. - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_get_textification): pass FALSE for - include_email. - (e_select_names_model_get_string): same. - (e_select_names_model_replace): same. - (e_select_names_model_name_pos): same. - (e_select_names_model_text_pos): same. - -2003-03-19 Ettore Perazzoli <ettore@ximian.com> - - * backend/ebook/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in: - Replace "evolution:menu-name" prop with "evolution:menu_name". [#39692] - * backend/ebook/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in: Likewise. - -2003-03-18 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-table-model.c - (e_select_names_table_model_col_count): up the column count by one - for the underline. - (e_select_names_table_model_value_at): add handling for underline. - -2003-03-18 Chris Toshok <toshok@ximian.com> - - * gui/component/e-address-popup.c (email_menu_add_option): fix use - of deprecated gtk_menu_append. - (card_picker_selection_changed): change this to be used with the - "changed" signal on GtkTreeSelection. - (free_str): yeah, gross. i know. - (card_picker_init): this needed some fixing, so the strings don't - go away after we insert them into the model. also, connect to the - "changed" GtkTreeSelection signal instead of using the nonexistant - gtk_tree_selection_set_func. - (e_address_popup_construct): gtk_style_unref -> g_object_unref. - (popup_size_allocate_cb): nuke. - (e_address_popup_ambiguous_email_add): use gtk_window_set_position - and let the window manager place the window instead of doing it - ourself. - -2003-03-18 Chris Toshok <toshok@ximian.com> - - [ Fixes addressbook bug #39730 ] - * gui/component/ldap-config.glade: add response ids to the search - base dialog. - - * gui/component/addressbook-config.c - (addressbook_source_dialog_destroy): use g_object_unref, not - gtk_widget_destroy, on the GladeXML. - (addressbook_add_server_druid): call gtk_window_set_type_hint - GDK_WINDOW_TYPE_HINT_DIALOG so this window looks like a dialog. - (editor_modify_cb): no more apply button. - (edit_dialog_apply_clicked): nuked. - (edit_dialog_close_clicked): rename to _cancal_clicked. - (edit_dialog_ok_clicked): call gtk_widget_destroy here instead of - calling _cancel_clicked. - (addressbook_edit_server_dialog): no more apply button, and - close_button -> cancel_button. Also, set the hint to - GDK_WINDOW_TYPE_HINT_DIALOG. - (ldap_dialog_new): fix compiler warning. - (addressbook_dialog_create_sources_table): same. - -2003-03-18 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-section.etspec: use - alternating-row-colors="false" - - * gui/component/select-names/e-select-names.h: nuke prototypes for - e_select_names_get_source/section. - - * gui/component/select-names/e-select-names.c (set_book): remove - the signal disconnect from here. - (addressbook_model_set_uri): same. - (e_select_names_init): connect to the search_result signal on the - addressbook model. - (e_select_names_child_free): disconnect the changed_id signal. - (e_select_names_add_section): set the underline column so the - recipient tables look like they did when they were EEntry. - (e_select_names_add_section): store off the changed_id. - (e_select_names_get_section): nuke. - (e_select_names_get_source): nuke. - -2003-03-18 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (addrconduit_load_configuration): kill - warning by sinking objects - -2003-03-18 Not Zed <NotZed@Ximian.com> - - * gui/component/select-names/e-select-names.c (set_book, - addressbook_model_set_uri): disconnect/keep track of search result - signal id. - (e_select_names_init): Keep track of various signals, particularly - status signal. - (e_select_names_dispose): disconnect from any signals that are - still active. Fixes crash for #38202. - -2003-03-13 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c - (set_entry_changed_signals): use set_entry_changed_signal_email - for the email entry so the email gets saved out. - (set_entry_changed_signal_email): new function, analogous to - set_entry_changed_signal_phone, but for email. - -2003-03-12 Chris Toshok <toshok@ximian.com> - - [ fixes bug #20210 ] - * gui/component/select-names/e-select-names-popup.c - (popup_menu_card): change "Edit Contact Info" to "View Contact - Info", as you can't always edit the contact (if the book is read - only). - (popup_menu_list): same, but for a contact list. - -2003-03-11 Chris Toshok <toshok@ximian.com> - - [ fixes bug #39507 ] - * gui/component/select-names/e-select-names.c (search_result): new - function, sync the models after we do a search. - (addressbook_model_set_uri): connect to search_result. - -2003-03-11 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_init): fix compiler warnings about deprecated - functions. - (e_select_names_child_free): unref the table model. - (remove_address): re-enable. - (section_right_click_cb): this is an ETable callback now. - (e_select_names_add_section): remove a gross gross awful hack, and - make the recipient tables ETables instead EEntry's. We lose the - nice underlining, but we can add that back in as another ETable - style (like strikeout and bold), and we also fix the longstanding - scrolling problems (like bug #25148) and can finally remove - addresses by double clicking on them (which is also a bug - someplace I think.. dunno the # offhand.) - - * gui/component/select-names/e-select-names-table-model.c - (clear_info): always set the count to -1, regardless of what - model->data is. - - * gui/component/select-names/e-select-names-model.c: remove some - unused enums. - - * gui/component/select-names/Makefile.am (etspec_DATA): add - e-select-names-section.etspec - - * gui/component/select-names/e-select-names-section.etspec: new - file, spec for the To:/Cc:/Bcc: etable's in the select-names - dialog. - -2003-03-11 Not Zed <NotZed@Ximian.com> - - * backend/pas/pas-backend-file.c (INITIAL_VCARD): Updated phone - number. Bug #37204. - - * gui/widgets/e-addressbook-util.c (e_addressbook_send_card_list): - re-enable in build, include e-destination.h. For #39256. - -2003-03-06 Ettore Perazzoli <ettore@ximian.com> - - * backend/ebook/load-pine-addressbook.c (ebook_create): Likewise. - * backend/ebook/load-gnomecard-addressbook.c (ebook_create): Likewise. - * backend/ebook/evolution-vcard-importer.c (ebook_create): Likewise. - * backend/ebook/evolution-ldif-importer.c (ebook_create): Likewise. - * backend/ebook/test-client.c (get_cursor_cb): Likewise. - (ebook_create): Likewise. - * gui/widgets/e-minicard.c (e_minicard_set_property): Likewise. - (card_modified_cb): Likewise. - (e_minicard_event): Likewise. - * gui/widgets/gal-view-minicard.c (column_width_changed): Likewise. - * gui/widgets/test-minicard-view.c (ebook_create): Likewise. - * gui/widgets/gal-view-treeview.c (column_width_changed): Likewise. - -2003-03-05 Not Zed <NotZed@Ximian.com> - - * gui/component/addressbook-component.c (bonobo_main_quit_cb): - removed. - (owner_unset_cb): Basically a noop, the shell does the quit, we - just note we have no owner anymore. - -2003-03-04 JP Rosevear <jpr@ximian.com> - - Fixes #37881 - - * gui/component/select-names/e-simple-card-bonobo.c - (impl_SimpleCard_get): if we get a null value, send back the empty - string - -2003-03-04 JP Rosevear <jpr@ximian.com> - - * gui/component/select-names/e-select-names.etspec: reflect prior column addition - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): set the arg properly - - * gui/component/select-names/Evolution-Addressbook-SelectNames.idl: - add Icscalendar to field list - - * backend/pas/pas-backend-ldap.c: add icscalendar to prop list - - * backend/ebook/e-card.h: add icscalendar data member - - * backend/ebook/e-card.c: add icscalendar to list and its parse - routine - (e_card_get_vobject): add icscalendar prop value - (parse_icscalendar): parse routine - (e_card_class_init): add icscalendar arg - (e_card_destroy): destroy icscalendar member - (e_card_set_arg): set icscalendar - (e_card_init): init icscalendar - (e_card_get_arg): return icscalendar - - * backend/ebook/e-card-simple.c (field_data): add icscalendar - - * backend/ebook/e-card-simple.h: ditto - -2003-03-03 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_new): Don't set the "modal" property through - g_object_new(). - (e_select_names_init): Explictly make the dialog modal here. - -2003-03-03 Ettore Perazzoli <ettore@ximian.com> - - * gui/widgets/e-addressbook-view.c (create_minicard_view): No need - to do any reparenting here; the widget is created with no parent. - -2003-03-03 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_init): Instead of using gtk_widget_unparent(), - remove the widget from the container using gtk_container_remove(). - This fixes a bunch of crashers in all the places using the - ESelectNames widget/control. - -2003-02-28 Dan Winship <danw@ximian.com> - - * gui/contact-editor/Makefile.am: Build libecontacteditor as an - uninstalled shared library. - - * gui/contact-list-editor/Makefile.am: Likewise for - libecontactlisteditor - - * gui/merging/Makefile.am: and libecardmerging - - * gui/search/Makefile.am: and libeaddressbooksearch - - * gui/widgets/Makefile.am: and libeminicard - - * printing/Makefile.am: and libecontactprint - - * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD): - Update for new library names (and get rid of libtool portability - warnings). - -2003-02-28 Dan Winship <danw@ximian.com> - - * backend/ebook/e-card.c (e_card_list_send, e_card_send): Remove - these from here; talking to the mailer doesn't really belong at - the libebook level anyway. - - * backend/ebook/Makefile.am: Remove Evolution-Composer CORBA - stuff, which fixes some linking problems on OS X. - - * gui/widgets/e-addressbook-util.c (e_addressbook_send_card_list, - e_addressbook_send_card): Move from e-card.c and rename. - - * gui/widgets/Makefile.am: move Evolution-Composer CORBA stuff - here - - * gui/widgets/e-addressbook-view.c (send_as, send_to, - e_addressbook_view_send, e_addressbook_view_send_to): Update for - new function names. - - * gui/contact-list-editor/e-contact-list-editor.c (file_send_as_cb, - file_send_to_cb): Likewise - - * gui/contact-editor/e-contact-editor.c (file_send_as_cb, - file_send_to_cb): Likewise - -2003-02-27 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (book_open_cb): use g_signal_connect - here, not swapped... although since we pass the widget as the - closure it really doesn't matter. - (load_uri_auth_cb): use a GtkDialog here. - (search_result): same. - - * gui/component/select-names/e-simple-card-bonobo.h: add prototype - for e_simple_card_bonobo_construct to fix warning. - - * gui/widgets/e-addressbook-view.c (create_alphabet): remove call - to gtk_widget_set_usize. - - * gui/contact-editor/e-contact-editor-address.c - (e_contact_editor_address_init): gtk_window_set_policy => - gtk_window_set_resizable. - - * gui/contact-editor/e-contact-editor-fullname.c - (e_contact_editor_fullname_init): same. - -2003-02-27 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: link to libversit libtool object - -2003-02-27 Rodney Dawes <dobey@ximian.com> - - * backend/ebook/Makefile.am: Fix for server files from Antonio Xu - -2003-02-26 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book.c (e_book_load_uri): if we fail to activate - factories for a given protocol, return. - - * gui/component/ldap-config.glade: remove the two unused custom - widgets to cut down on gtk warning spam. - -2003-02-21 Dan Winship <danw@ximian.com> - - * backend/ebook/Makefile.am (libebook_la_LIBADD): depend on - libversit.la, libcamel.la, libename.la, and libeutil.la. - (test_client_LDADD, test_client_list_LDADD, test_card_LDADD, - evolution_vcard_importer_LDADD, evolution_ldif_importer_LDADD, - load_pine_addressbook_LDADD, load_gnomecard_addressbook_LDADD): - Remove those dependencies from here, since they're pulled in by - libebook. - - * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD): - Remove libebook's dependencies - - * gui/component/select-names/Makefile.am - (libeselectnames_la_LIBADD): add this - - * gui/widgets/Makefile.am (various disabled *_test_LDADD): cleanup - - * printing/Makefile.am (contact_print_test_LDADD, - contact_print_style_editor_test_LDADD): cleanup - -2003-02-20 Dan Winship <danw@ximian.com> - - * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD): - s/libemiscwidgets.a/libemiscwidgets.la/ - - * gui/widgets/Makefile.am: Likewise (in a bunch of commented-out - test programs) - -2003-02-19 Dan Winship <danw@ximian.com> - - * gui/widgets/e-addressbook-model.c: Make parent_class static. - - * gui/widgets/e-addressbook-reflow-adapter.c: Likewise - - * gui/widgets/e-addressbook-table-adapter.c: Likewise - -2003-02-19 Chris Toshok <toshok@ximian.com> - - [ fix #38074 ] - * gui/component/e-address-popup.c (add_contacts_cb): first arg is - a GtkWidget. duh. - -2003-02-19 Ettore Perazzoli <ettore@ximian.com> - - * gui/contact-editor/Makefile.am (INCLUDES): Use $(evolutionuidir) - instead of $(evolution_uidir). [Pointed out by Grzegorz Goawski.] - -2003-02-17 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_start_query): if we can complete solely - from our cached cards, call e_completion_end_search from here when - we're done. - -2003-02-17 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c - (ensure_completion_uris_exist): plug memory leak (always free - val). - -2003-02-16 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_search_timeout): move the bulk of the - non-summary searching stuff here. we aggregate up to our - threshold, then send them to the front end and register a timeout - to do another batch. This keeps us from totally spamming the UI, - making things a bit more responsive. - (pas_backend_file_search): set up the closure and call the timeout - in an idle func. - -2003-02-16 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_entry_new): indent properly. - -2003-02-16 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-reflow-adapter.c (unlink_model): - disconnect search_started and search_result. - (addressbook_compare): if we're loading, just compare model - positions (so we just append while loading). - (remove_card): use e_reflow_model_item_removed. - (search_started): new function, set loading = TRUE. - (search_result): new function, set loading = FALSE and emit - "comparison_changed". - (e_addressbook_reflow_adapter_init): init loading and the new - signal ids. - (e_addressbook_reflow_adapter_construct): connect "search_started" - and "search_result". - - * gui/widgets/e-addressbook-model.h (struct - _EAddressbookModelClass): add search_started signal. - - * gui/widgets/e-addressbook-model.c - (e_addressbook_model_class_init): new signal "search_started". - (book_view_loaded): emit "search_started" after "model_changed". - (remove_card): simplify this, and use CARD_REMOVED all the time, - instead of just in the single card case. - -2003-02-10 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_search_timeout): split out the bulk of the - non-summary searching logic to here. we do 1 "card_threshold" - sized lump per timeout. - (pas_backend_file_search): use pas_backend_file_search_timeout. - -2003-02-10 Chris Toshok <toshok@ximian.com> - - [ fixes bug #33066 ] - * gui/contact-editor/e-contact-editor.c - (set_urlentry_changed_signal_field): new function - (set_entry_changed_signals): call - set_urlentry_changed_signal_field for entry-web, entry-caluri, and - entry-fburl. - (fill_in_field): add handling for EUrlEntry's. - (extract_field): same. - (enable_widget): same. - (e_contact_editor_create_date): show the widget. - (e_contact_editor_create_web): same, create a url entry. - (set_urlentry_changed_signal_field): new function - - * gui/contact-editor/contact-editor.glade: entry-web, - entry-caluri, and entry-fburl are all custom widgets now. - -2003-02-10 Ettore Perazzoli <ettore@ximian.com> - - * backend/ebook/Makefile.am: Install load-pine-addressbook and - load-gnomecard-addressbook into ${privdatadir}/tools. Install - evolution-vcard-importer and evolution-ldif-importer into - ${privlibexecdir}. - - * backend/ebook/GNOME_Evolution_Addressbook_VCard_Importer.server.in: - Removed. - - * backend/ebook/GNOME_Evolution_Addressbook_LDIF_Importer.server.in: - Removed. - - * backend/ebook/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in: - New. Specify an absolute path for the executable, using - @LIBEXECDIR@. - * backend/ebook/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in: - Likewise. - -2003-02-09 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (sexp_initials): gone. - (match_initials): gone. - (book_query_sexp): remove the primary handling. - (book_query_score): same. - - * backend/ebook/e-card.c (e_card_set_property): - g_value_get_pointer => g_value_get_object for "category_list". - - * backend/ebook/e-book.c (struct _EBookPrivate): add a comment. - - * backend/pas/pas-backend-ldap.c (func_beginswith): performance at - the cost of a tiny bit of correctness. If the ldap server doesn't - support evolutionPerson don't query on fileAs, use sn (since - that's effectively what gets used in the display when fileAs isn't - supported.) - -2003-02-09 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-completion.c: lots of - changes here. should be a big performance gain. god i hope this - is finally right. - -2003-02-08 Chris Toshok <toshok@ximian.com> - - [ huge change, all for 1 little performance problem :) fixes #18207 ] - * gui/widgets/e-addressbook-model.c (get_view): use - e_book_check_static_capability here to make things a little - prettier. - (remove_card): complain about my life, and add code to use one - "model_changed" signal if we get back a list of cards instead of - multiple "card_removed" signals. - - * gui/widgets/e-addressbook-model.h: little clean up. - - * gui/widgets/e-addressbook-view.c (delete): write a bulk-remove - case for this. if the backend supports it, send all the ids at - once. otherwise loop over the ids. - (e_addressbook_view_delete_selection): fake a CardAndBook - structure and call delete, instead of duplicating the code in 2 - places. - - * gui/component/addressbook.c (delete_contact_cb): don't call - e_contact_editor_confirm_delete here, it's handled by the - EAddressbookView. - - * backend/pas/pas-card-cursor.c (pas_card_cursor_construct): fix a - compiler warning about a stupid crash. - - * backend/pas/pas-book.h (PASOperation): RemoveCard -> - RemoveCards. - (PASRemoveCardsReques): char *id -> GList *ids. - (PASRequest): PASRemoveCardRequest -> PASRemoveCardsRequest. - - * backend/pas/pas-book.c (pas_book_queue_remove_cards): build up a - GList from the id sequence. - (pas_book_respond_remove): notifyCardRemoved -> - notifyCardsRemoved. - (impl_GNOME_Evolution_Addressbook_Book_removeCards): rename. - (pas_book_free_request): free the idlist for RemoveCards. - (pas_book_class_init): removeCard -> removeCards. - - * backend/pas/pas-book-view.h: change prototype for - pas_book_view_notify_remove, and add prototype for - pas_book_view_notify_remove_1. - - * backend/pas/pas-book-view.c (pas_book_view_notify_remove_1): - build up a list and call pas_book_view_notify_remove. - (pas_book_view_notify_remove): build up the corba id sequence and - call BookViewListener::notifyCardsRemoved. - - * backend/pas/pas-backend.h: remove_card -> remove_cards. - - * backend/pas/pas-backend.c (pas_backend_remove_cards): rename - from _remove_card. - (process_client_requests): RemoveCard -> RemoveCards and - _remove_card -> _remove_cards. - - * backend/pas/pas-backend-ldap.c (check_schema_support): - g_strcasecmp -> g_ascii_strcasecmp. - (remove_card_handler): _remove => _remove_1. - (modify_card_modify_handler): same. - (pas_backend_ldap_process_remove_cards): rename from _remove_card. - (pas_backend_ldap_class_init): _remove_card -> _remove_cards. - - * backend/pas/pas-backend-file.c (pas_backend_file_class_init): - remove_card -> remove_cards. - (pas_backend_file_get_static_capabilities): add "bulk-removes". - (pas_backend_file_process_remove_cards): rewrite this function - largely, so that it handles lists of ids. first we loop through - and for every successful deletion we build a list of deleted - ECards. Then for each view we build a list (a subset of the - deleted ECard list) and pass back that list to the view. - (pas_backend_file_process_modify_card): use _remove_1 instead of - _remove. - (ecard_matches_search): new function. - - * backend/pas/pas-backend-card-sexp.c - (pas_backend_card_sexp_match_vcard): rewrite in terms of - _match_ecard. - (pas_backend_card_sexp_match_ecard): new function, the guts from - _match_vcard. - - * backend/pas/pas-backend-card-sexp.h: add prototype for - pas_backend_card_sexp_match_ecard. - - * backend/idl/addressbook.idl: the card removal stuff now takes - CardIdList. - - * backend/ebook/e-book.c (e_book_get_static_capabilities): cache - successful capability queries (since they're static). - (e_book_check_static_capability): new, convenience function to - check if a particular capability is supported. - (e_book_remove_card_by_id): build a single element GList and call - e_book_remove_cards. - (e_book_remove_cards): build up a CORBA sequence from the GList - and call Book::removeCards. - (e_book_dispose): free the cached capabilities string. - - * backend/ebook/e-book.h: add new prototypes for - e_book_check_static_capability and e_book_remove_cards. - - * backend/ebook/e-book-view.h (struct _EBookViewClass): rename - "card_removed" signal to "cards_removed". - - * backend/ebook/e-book-view.c (e_book_view_do_removed_event): id - -> ids, and free the id list. - (e_book_view_check_listener_queue): CardRemovedEvent -> - CardsRemovedEvent. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_queue_response): free the id list. - (e_book_view_listener_queue_idlist_event): new function, used for - cards_removed. - (e_book_view_listener_queue_status_event): id -> ids. - (e_book_view_listener_queue_sequence_event): same. - (e_book_view_listener_queue_message_event): same. - (impl_BookViewListener_notify_cards_removed): call - queue_idlist_event. - (e_book_view_listener_dispose): free the id list. - (e_book_view_listener_class_init): track change to idl call. - - * backend/ebook/e-book-view-listener.h - (EBookViewListenerOperation): CardRemovedEvent -> - CardsRemovedEvent. - (EBookViewListenerResponse): char *id -> GList *ids. - - * backend/ebook/e-book-listener.c - (impl_BookListener_respond_remove_cards): rename from remove_card. - -2003-02-06 Chris Toshok <toshok@ximian.com> - - * gui/component/e-address-popup.c (email_table_save_card_cb): - check the status, not the book, and unref the book here. - (contact_editor_cb): same. - (start_query): unref the book in the failure case. - (add_card_idle_cb): addressbook_load_default_book returns void - now. - (edit_contact_info_cb): same. - (e_address_popup_query): same. - - * gui/component/addressbook.c (control_activate_cb): track change - to addressbook_load_uri return type. - (set_prop): same. - (addressbook_load_uri): return type is void now. - (addressbook_load_default_book): same. - - * gui/component/addressbook.h: - addressbook_load_uri/addressbook_load_default_book return void - now. - - * conduit/address-conduit.c (start_addressbook_server): - e_book_load_default_book returns void now. - - * backend/ebook/e-book-util.h: track changes to return types. - - * backend/ebook/e-book-util.c (e_book_load_address_book_by_uri): - fallout from change to e_book_load_uri. return type for this - function is void now too. - (e_book_use_address_book_by_uri): same. - (e_book_use_default_book): same. - (e_book_load_default_book): same. - (got_uri_book_cb): if unsuccessful and book is non-NULL, unref it - here. - (got_default_book_cb): same. - - * backend/ebook/e-book.c (e_book_load_uri): no longer return a - gboolean. any error is communicated to the callback. - - * backend/ebook/e-book.h: e_book_load_uri no longer returns a - gboolean (it's void.) - - * backend/ebook/evolution-ldif-importer.c (ebook_create): track - change to the e_book_load_uri family of functions. - - * backend/ebook/test-client-list.c (ebook_create): same. - - * backend/ebook/test-client.c (ebook_create): same. - - * backend/ebook/load-pine-addressbook.c (ebook_create): same. - - * backend/ebook/evolution-vcard-importer.c (ebook_create): same. - -2003-02-06 Ettore Perazzoli <ettore@ximian.com> - - * backend/ebook/Makefile.am (e-book-marshal.c, e-book-marshal.h): - Use different tmp file names so these rules can be executed in - parallel without interfering with each otehr. - - * backend/pas/Makefile.am: Make the ORBit compilation work - properly with parallel makes (i.e. make sure it does not spawn - multiple orbit-idl processes on the same IDL file at the same - time). - * gui/component/select-names/Makefile.am: Likewise. - * backend/ebook/Makefile.am: Likewise. - -2003-02-06 Dan Winship <danw@ximian.com> - - * gui/component/addressbook-config.c (main): - s/PACKAGE/GETTEXT_PACKAGE/ in gettext setup. - -2003-02-05 Dan Winship <danw@ximian.com> - - * backend/ebook/Makefile.am (INCLUDES): Remove cruft. - (libebookincludedir): Use privincludedir. - - * backend/ebook/e-book-util.c: #include <string.h> - * backend/ebook/e-card-compare.c: Likewise - * backend/ebook/load-pine-addressbook.c: Likewise - * backend/ebook/test-client.c: Likewise - - * backend/ebook/evolution-vcard-importer.c: #include - <e-book-util.h> - (factory_fn): Fix this to actually return the importer. - - * backend/ebook/evolution-ldif-importer.c (parseLine): #include - <e-book-util.h> and <bonobo/bonobo-main.h>. Use g_ascii_strcmp. - - * backend/ebook/e-card.c (e_card_email_match_single_string): - (e_card_email_find_number): s/g_str/g_ascii_str/ - * backend/ebook/e-destination.c (e_destination_equal): Likewise. - Also, add an "else return FALSE;" - - - * backend/pas/Makefile.am (INCLUDES): Remove cruft - (ldapschemadir): Use privdatadir - (pasincludedir): Use privincludedir. - - * backend/pas/pas-book-factory.c (pas_book_factory_activate): - Remove unused variable. - * backend/pas/pas-book-view.c (pas_book_view_new): Likewise - - - * printing/Makefile.am (ecpsdir): Define in terms of privdatadir. - (gladedir): Defined in configure.in now. - - * printing/e-contact-print.c: #include <string.h> - - * printing/test-print.c: #include <bonobo/bonobo-main.h> - * printing/test-contact-print-style-editor.c: Likewise - - - * gui/contact-editor/Makefile.am (INCLUDES): Remove some cruft. - rename ICONSDIR to IMAGESDIR. - (images_DATA): Install arrow.png in imagesdir instead of - privdatadir. - - * gui/contact-editor/e-contact-quick-add.c: #include <string.h> - - * gui/contact-editor/e-contact-editor.c: #include <string.h> - (e_contact_editor_init): s/EVOLUTION_ICONSDIR/EVOLUTION_IMAGESDIR/ - (e_contact_editor_new): s/gtk_object_ref/g_object_ref/ - (_replace_button): Look in imagesdir, not privdatadir - (_phone_arrow_pressed): Remove call to deprecated - gtk_check_menu_item_set_show_toggle. - (_email_arrow_pressed): Likewise - (_address_arrow_pressed): Likewise - (set_address_field): Remove unused variable - (enable_widget): - s/gtk_entry_set_editable/gtk_editable_set_editable/ - - * gui/contact-editor/e-contact-editor-address.c - (e_contact_editor_address_init): - s/EVOLUTION_ICONSDIR/EVOLUTION_IMAGESDIR - (e_contact_editor_address_set_property): - s/gtk_entry_set_editable/gtk_editable_set_editable/ - - * gui/contact-editor/e-contact-editor-fullname.c - (e_contact_editor_fullname_init): - s/EVOLUTION_ICONSDIR/EVOLUTION_IMAGESDIR - (e_contact_editor_fullname_set_property): Likewise. - - - * gui/contact-list-editor/Makefile.am (INCLUDES): Remove cruft, - s/ICONSDIR/IMAGESDIR/ - (gladedir, etspecdir): Remove definitions. - - * gui/contact-list-editor/e-contact-list-editor.c: #include - <string.h> - (e_contact_list_editor_init): s/ICONSDIR/IMAGESDIR/ - (e_contact_list_editor_new): s/gtk_object_ref/g_object_ref/ - - * gui/contact-list-editor/e-contact-list-model.c: #include <string.h> - - - * gui/merging/Makefile.am (INCLUDES): Remove cruft. - * gui/search/Makefile.am (ruledir): Define in terms of privdatadir - - - * gui/widgets/Makefile.am (INCLUDES): Remove cruft. - (gladedir, etspecdir): Remove definitions. - (glade_DATA): Empty, so remove it. - - * gui/widgets/e-addressbook-reflow-adapter.c: #include <string.h> - (addressbook_get_property): Remove unused variable - - * gui/widgets/e-addressbook-view.c: #include <string.h> - (get_selection_model): Add a g_return_val_if_reached. - - * gui/widgets/e-minicard.c: #include string.h, gtkmain.h, - gnome-canvas-pixbuf.h - (field_changed): s/gtk_object_unref/g_object_unref/ - (get_left_width): Remove unused variable - - * gui/widgets/e-minicard-control.c: #include <string.h> - (pstream_load, pstream_save): Use g_ascii_strcasecmp - - * gui/widgets/e-minicard-view.c: #include <string.h> - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_new): s/gtk_type_new/g_object_new/ - - - * gui/component/select-names/Makefile.am (INCLUDES): Remove cruft. - (serverdir, gladedir, etspecdir): Remove definitions - - * gui/component/select-names/e-select-names.c: #include <string.h> - - * gui/component/select-names/e-select-names-popup.c - (init_html_mail): Remove deprecated - gtk_check_menu_item_set_show_toggle call. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_entry_free): - s/gtk_timeout_remove/g_source_remove/ - - - * gui/component/Makefile.am (INCLUDES): Remove cruft, rename - ICONSDIR to IMAGESDIR. - (serverdir, gladedir): Remove defintions. - - * gui/component/addressbook-component.c (IS_CONTACT_TYPE): use - g_ascii_strcasecmp - (add_creatable_item): s/ICONSDIR/IMAGESDIR/ - - * gui/component/component-factory.c: #include <string.h> - - * gui/component/e-address-widget.c: Likewise. - (e_address_widget_destroy): s/gtk_idle_remove/g_source_remove/ - (e_address_widget_schedule_query): s/gtk_idle_add/g_idle_add/ - - - * conduit/Makefile.am (INCLUDES): Remove cruft - -2003-02-05 Dan Winship <danw@ximian.com> - - * gui/component/addressbook-config.c (main): Replace deprecated - glade_gnome_init() with glade_init(). - - * gui/contact-editor/test-editor.c (main): Likewise. - - * printing/test-contact-print-style-editor.c (main): Likewise. - - * printing/test-print.c (main): Likewise. - -2003-02-03 Chris Toshok <toshok@ximian.com> - - [ pull forward Jack Jia's fix for #34900 ] - * gui/contact-editor/e-contact-save-as.c (e_contact_save_as): use - a weak ref for the file selector. - (e_contact_list_save_as): same. - (destroy_it): rewrite this as a weak ref notify function. - (close_it): remove frees of the info (it's freed in the weak ref - function). - (save_it): same. - -2003-02-03 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c (remove_folder): pull - forward Jack Jia's fix for #33672, but convert it to use unlink - instead of the gnome-vfs stuff. - -2003-01-27 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/contact-editor.glade: add a scrolled window - (SHADOW_IN) around the address textview. - -2003-01-26 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/contact-editor.glade: rename the category - entry to entry-categories. - - * gui/contact-editor/e-contact-editor.c - (set_entry_changed_signals): use the specialized "changed" signal - handlers for entry-company and entry-fullname. - -2003-01-26 Chris Toshok <toshok@ximian.com> - - * gui/component/Makefile.am: i need to sleep more. - -2003-01-26 Chris Toshok <toshok@ximian.com> - - * gui/component/Makefile.am (componentdir): need to assign this - here or else the lib doesn't get built. - -2003-01-26 Chris Toshok <toshok@ximian.com> - - * printing/e-contact-print.c (e_contact_start_new_page): begin the - new page after showing the last one. - (complete_sequence): beginpage before we start printing. - (e_contact_print_response): GtkDialog-ify this. - (e_contact_print_dialog_new): "clicked" -> "response". - (e_contact_print_card_dialog_new): same. - (e_contact_print_card_list_dialog_new): same. - -2003-01-26 Chris Toshok <toshok@ximian.com> - - * Makefile.am (CONDUIT_SUBDIR): enable this, as building the - conduit works if you have gnome-pilot2. - -2003-01-25 Chris Toshok <toshok@ximian.com> - - * conduit/address-conduit.c: GObjectify the stuff in here that - refers to addressbook objects. the gnome-pilot stuff is still - GtkObject for the moment. - -2003-01-24 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/Makefile.am (iconsdir): Remove definition; this is - now in configure.in. - * gui/contact-editor/Makefile.am (iconsdir): Likewise. - * gui/contact-list-editor/Makefile.am (iconsdir): Likewise. - -2003-01-23 Sean Gao <Sean.Gao@Sun.COM> - - [ fixes bug #34898 ] - * gui/widgets/e-minicard.c (field_changed): handle modifications - to email addresses in contact lists. - -2003-01-23 Sean Gao <Sean.Gao@Sun.COM> - - [ fixes bug #36375 ] - * backend/pas/pas-backend-ldap.c: use PHONE_OTHER_FAX instead of - PHONE_OTHER for "other_fax". - -2003-01-23 Chris Toshok <toshok@ximian.com> - - [ fixes bug #31014, roll this in from the 1.2 branch ] - * backend/pas/pas-backend-ldap.c: use "categories" instead of - "category" for the ECard field so the UI/get_supported_fields stuff - actually thinks its usable in the contact editor.. - -2003-01-23 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_connect): fix - for bug 34883 broke ssl transactions (at least those where we were - connecting to port 636). Move it to after the SSL stanza. - -2003-01-23 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/select-names/Makefile.am (componentdir): Remove - definition; no need to set it here since it's now defined in - configure.in - * gui/component/Makefile.am (componentdir): Likewise. - -2003-01-22 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/select-names/Makefile.am (gladedir): Version using - $(BASE_VERSION). - (etspecdir): Likewise. - (iconsdir): Likewise. - - * gui/contact-list-editor/Makefile.am (iconsdir): Version using - $(BASE_VERSION). - (gladedir): Likewise. - - * gui/merging/Makefile.am (gladedir): Version using $(BASE_VERSION). - - * gui/search/Makefile.am (ruledir): Version using $(BASE_VERSION). - - * gui/component/Makefile.am (INCLUDES): Update EVOLUTION_IMAGESDIR - to be versioned through $(BASE_VERSION). - - * gui/widgets/e-addressbook-view.c (init_collection): Use - EVOLUTION_GALVIEWSDIR. - - * gui/widgets/Makefile.am (INCLUDES): Define EVOLUTION_GALVIEWSDIR - and update EVOLUTION_IMAGESDIR. - -2003-01-21 Radek Doulik <rodo@ximian.com> - - * printing/e-contact-print.c (e_contact_print_button): don't use - gnome_print_multipage_new_from_sizes and add warning - -2003-01-14 Ettore Perazzoli <ettore@ximian.com> - - * gui/widgets/e-addressbook-util.c - (e_addressbook_prompt_save_dialog): Change dialog from - Yes/No/Cancel to Discard/Cancel/Save to match the HIG. - - * gui/search/e-addressbook-search-dialog.c - (e_addressbook_search_dialog_init): Change dialog from OK/Cancel - to Cancel/OK to match the HIG. - - * gui/contact-editor/e-contact-save-as.c (file_exists): Change - dialog from Overwrite/Cancel to Cancel/Overwrite to match the HIG. - - * gui/contact-editor/e-contact-quick-add.c - (build_quick_add_dialog): Fix typo s/reponse/response/. Also - change the dialog to be Edit/Cancel/OK instead of OK/Edit/Cancel - to match the HIG. - - * gui/contact-editor/e-contact-editor.c - (e_contact_editor_confirm_delete): Make alert cancel/delete - instead of delete/cancel to match the HIG. - - * gui/contact-editor/e-contact-editor-fullname.c - (e_contact_editor_fullname_init): Make dialog Cancel/OK instead of - OK/Cancel to match the HIG. - - * gui/contact-editor/e-contact-editor-address.c - (e_contact_editor_address_init): Make dialog Cancel/OK instead of - OK/Cancel to match the HIG. - - * gui/component/select-names/e-select-names.c - (e_select_names_init): Make dialog Cancel/OK instead of OK/Cancel - to match the HIG. - -2003-01-14 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/Makefile.am (EXTRA_DIST): Add $(schema_DATA). - -2003-01-09 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (control_activate_cb): try to load - the uri again if it failed previously. - (book_open_cb): set failed_to_load based on the response. - (set_prop): initialize failed_to_load to FALSE before we kick off - the first load. - - * backend/pas/pas-book-factory.c - (pas_book_factory_process_request): if the load_uri fails, remove - it from the hashtable and free it, so we'll try to load it again - from scratch the next time it's requested instead of serving up a - backend that doesn't function. - - * backend/pas/pas-backend.c (pas_backend_get_uri): we need to be - able to get the uri from backends that aren't loaded (so we can - remove them from the hashtable.) - -2003-01-09 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (query_ldap_root_dse): doh, fix - build error. - -2003-01-09 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-popup.c: #include - gtklabel.h, fixes an unresolved symbol. - -2003-01-09 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (query_ldap_root_dse): build up - the list of supported auth_methods. - (pas_backend_ldap_process_get_supported_auth_methods): respond - with the list of auth methods we've built up. - (pas_backend_ldap_dispose): unref the auth_method list. - (pas_backend_ldap_class_init): hook up - pas_backend_ldap_process_get_supported_auth_methods. - - * backend/pas/pas-backend.c - (pas_backend_get_supported_auth_methods): new function. - (process_client_requests): add clause for GetSupportedAuthMethods. - - * backend/pas/pas-backend.h: add prototype for - pas_backend_get_supported_auth_methods, and add it to the class - vtable. - - * backend/pas/pas-book.h: add GetSupportedAuthMethods enum member - and PASGetSupportedAuthMethodsRequest. and add prototype for - pas_book_respond_get_supported_auth_methods. - - * backend/pas/pas-book.c - (pas_book_queue_get_supported_auth_methods): new function. - (impl_GNOME_Evolution_Addressbook_Book_getSupportedAuthMethods): - new function. - (pas_book_respond_get_supported_auth_methods): new function. - (pas_book_free_request): add clause for GetSupportedAuthMethods. - (pas_book_class_init): hook up getSupportedAuthMethods. - - * backend/ebook/e-book-listener.c - (e_book_listener_queue_get_supported_fields_response): fields -> - list. - (e_book_listener_queue_get_supported_auth_methods_response): new - function. - (impl_BookListener_response_get_supported_auth_methods): new - function. - (e_book_listener_class_init): hook up - epv->notifySupportedAuthMethods. - - * backend/ebook/e-book-listener.h: add - GetSupportedAuthMethodsResponse enum member, and change the field - name from "fields" to list (and use it for both GetSupportedFields - and GetSupportedAuthMethods) - - * backend/ebook/e-book.c (e_book_get_supported_auth_methods): new - function. - (e_book_do_response_get_supported_auth_methods): new function. - - * backend/ebook/e-book.h: add prototype for - e_book_get_supported_auth_methods. - - * backend/idl/addressbook.idl: add getSupportedAuthMethods IDL - call. - -2003-01-09 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book-factory.c (backend_last_client_gone_cb): - deal with backends that might not have loaded successfully - (they'll have a NULL uri). - -2003-01-09 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (e_select_names_bonobo_new): call e_select_names_bonobo_construct - on the newly created object. - -2003-01-09 Chris Toshok <toshok@ximian.com> - - * gui/component/Makefile.am: addressbook-config.etspec is gone. - - * gui/component/addressbook-config.c: make the sources table be a - gtktreeview instead of an etable. - - * gui/component/ldap-config.glade: remove all references to - gnome-hint.png - -2003-01-09 Chris Toshok <toshok@ximian.com> - - * gui/widgets/gal-view-minicard.c (column_width_changed): fix - parameter types here (this signal isn't generated from an ETable.) - - * gui/widgets/gal-view-factory-minicard.c: include e-util.h - - * gui/widgets/e-minicard.h: include gnome-canvas.h here. - - * gui/widgets/e-addressbook-table-adapter.c: #include - e-destination.h here. - - * gui/widgets/e-minicard.c: same. - -2003-01-09 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.[ch]: remove the select - names stuff (the Related Contacts button/entry.) - - * gui/contact-editor/contact-editor.glade: same. - -2003-01-09 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in: - comment out the factory oaf_server, and change the location of the - SelectNames controls to be - OAFIID:GNOME_Evolution_Addressbook_Factory so the normal - addressbook.so will create them. - - * gui/component/select-names/Makefile.am - (libeselectnames_la_SOURCES): remove the - e-select-names-factory.[ch] stuff for the time being. - - * gui/component/component-factory.c (factory): we're now (for the - time being) the factory for the select names control. - -2003-01-08 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c: oops, don't include - e-treeview-selection-model.h unless we're building the treeview. - -2003-01-08 Jeffrey Stedfast <fejj@ximian.com> - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_authenticate_user): Fix to build. - -2003-01-08 Chris Toshok <toshok@ximian.com> - - * gui/component/apps_evolution_addressbook.schemas: add in the - schema entry for minimum_query_length. - -2003-01-08 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.h: add - E_ADDRESSBOOK_VIEW_TREEVIEW to the enum, ifdef'ed out. - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_class_init): add ifdefed treeview code. - (init_collection): same. - (display_view): same. - (get_selection_model): same. - (treeview_row_activated): same. - (create_treeview_view): same. - (change_view_type): same.xo - (e_addressbook_view_print): same. - (e_addressbook_view_print_preview): same. - - * gui/widgets/Makefile.am: add in the treeview sources (commented - out). - -2003-01-08 Chris Toshok <toshok@ximian.com> - - * gui/widgets/gal-view-minicard.c (gal_view_minicard_edit): add - parent arg. - - * gui/widgets/e-addressbook-treeview-adapter.[ch]: new files, for - a GtkTreeView view of contacts. - - * gui/widgets/gal-view-treeview.[ch]: same - - * gui/widgets/gal-view-favroty-treeview.[ch]: same - -2003-01-08 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/Makefile.am: $(datadir)/evolution/images instead - of $(datadir)/images/evolution. - * gui/contact-editor/Makefile.am: Likewise. - * gui/contact-list-editor/Makefile.am (iconsdir): Likewise. - * gui/widgets/Makefile.am: Likewise. - -2002-01-08 Dan Winship <danw@ximian.com> - - Move PASBook request handling into PASBackend itself since all - existing backends do it exactly the same way. (Part of 32866). - - * backend/pas/pas-backend.h (PASBackendClass): add new methods for - the various pas book requests. - - * backend/pas/pas-backend.c: Add a clients list to - PASBackendPrivate. - (pas_backend_create_card, etc): Add these to invoke the new - methods. - (process_client_requests, book_destroy_cb): Moved here and - slightly rewritten from pas-backend-file. - (last_client_gone): Now static. - (add_client, remove_client): Default implementations, based on - pas-backend-file, that add the client to/remove it from the - backend's clients list and connect to its requests_queued signal. - (pas_backend_init, pas_backend_dispose): Deal with the clients - list. - - * backend/pas/pas-backend-file.c (struct _PASBackendFilePrivate): - Remove GList *clients. - (pas_backend_file_process_client_requests, - pas_backend_file_book_destroy_db, pas_backend_file_add_client, - pas_backend_file_remove_client): Gone. - (pas_backend_file_class_init): Remove add_client/remove_client - method initializations, add initializations for processing the - various book requests. - - * backend/pas/pas-backend-ldap.c (struct _PASBackendLDAPPrivate): - Remove GList *clients. - (pas_backend_ldap_process_create_card, etc): Make these take the - specific PAS*Request types rather than a generic PASRequest. - (pas_backend_ldap_process_client_requests, - pas_backend_ldap_book_destroy_db, pas_backend_ldap_add_client, - pas_backend_ldap_remove_client): Gone. - (pas_backend_ldap_class_init): Remove add_client/remove_client - method initializations, add initializations for processing the - various book requests. - -2003-01-07 Chris Toshok <toshok@ximian.com> - - * backend/pas/evolutionperson.schema: fix the SYNTAX for the - telephone attributes, and make the fax attributes more closely - mirror those from core.schema. Fixes the schema for openldap-2.1. - -2003-01-06 Dan Winship <danw@ximian.com> - - * backend/idl/Makefile.am: remove idldir def (defined by - configure.in now) - - * gui/component/select-names/Makefile.am: Likewise - -2003-01-01 Chris Toshok <toshok@ximian.com> - - [ fixes the non-ui portion of #36183 ] - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_start_query): use the entry's - minimum_query_length instead of a constant here. - (e_select_names_completion_set_minimum_query_length): new - function, set the entry's minimum_query_length. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_entry_new): set the minimum_query length - after setting the completion books. - (read_completion_settings_from_db): rename - read_completion_books_from_db to this, and read the - minimum_query_length too. - (db_listener): rename uris_listener to this, and listen for - changes on both the uris and minimum_query_length settings. - - * gui/component/select-names/e-select-names-completion.h: add - prototype for e_select_names_completion_set_minimum_query_length. - - * gui/component/select-names/e-select-names-manager.h: add - minimum_query_length to struct _ESelectNamesManager. - -2002-12-19 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-config.c - (addressbook_config_control_new): Made it return an - EvolutionConfigControl instead of a BonoboControl (and removed a - bogus EvolutionConfigControl -> BonoboControl cast). - -2002-12-17 Chris Toshok <toshok@ximian.com> - - [ fixes bug #34897 ] - * gui/widgets/e-addressbook-table-adapter.c - (addressbook_value_at): don't free the return of - e_card_simple_get_const, as this causes a double free later on. - -2002-12-18 Chris Toshok <toshok@ximian.com> - - * gui/component/e-address-popup.c: convert the clist in here to a - GtkTreeView. your guess is as good as mine if it works (i can't - test it at present) but it compiles. - -2002-12-18 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c (jump_to_letters): - g_string_sprintfa -> g_string_append_printf. - (create_alphabet): same. - (create_minicard_view): remove gtk_widget_{push,pop}_visual. - - * gui/widgets/Makefile.am (INCLUDES): add -D*_DISABLE_DEPRECATED. - -2002-12-18 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard.c (e_minicard_realize): drop use of - "font" arg. - (get_left_width): use pango to calculate this instead of a GdkFont. - - * gui/widgets/e-minicard-view.c: drop include of e-unicode.h. - - * gui/widgets/e-minicard-label.c (e_minicard_label_construct): - don't need to create the font anymore. - - * gui/search/Makefile.am (INCLUDES): add -D*_DISABLE_DEPRECATED. - - * gui/search/e-addressbook-search-dialog.c - (e_addressbook_search_dialog_new): use g_object_new instead of - gtk_type_new. - - * gui/merging/Makefile.am (INCLUDES): add -D*_DISABLE_DEPRECATED. - - * gui/contact-list-editor/Makefile.am (INCLUDES): add - -D*_DISABLE_DEPRECATED. - - * gui/contact-list-editor/e-contact-list-editor.c (is_named): - strdup (or not, if we don't need to save the value) instead of - using the e_utf8 functions. - (fill_in_info): same. - - * gui/contact-editor/Makefile.am (INCLUDES): add - -D*_DISABLE_DEPRECATED. - - * gui/contact-editor/e-contact-save-as.c (e_contact_save_as): - strdup (or not, if we don't need to save the value) instead of - using the e_utf8 functions. - (e_contact_list_save_as): same. - - * gui/contact-editor/e-contact-quick-add.c (clicked_cb): strdup - (or not, if we don't need to save the value) instead of using the - e_utf8 functions. - (build_quick_add_dialog): same. - - * gui/contact-editor/e-contact-editor.c (phone_entry_changed): - strdup (or not, if we don't need to save the value) instead of - using the e_utf8 functions. - (file_as_set_style): same. - (name_entry_changed): same. - (full_name_clicked): same. - (categories_clicked): same. - (set_field): same. - (fill_in_field): same. - (fill_in_single_field): same. - (extract_field): same. - (extract_single_field): same. - - * gui/contact-editor/e-contact-editor-fullname.c (extract_field): - just strdup, it's already utf8. - - * gui/contact-editor/e-contact-editor-address.c (extract_field): - they're all entries, use GTK_ENTRY foo here. - - * gui/component/select-names/Makefile.am (INCLUDES): add - -D*_DISABLE_DEPRECATED. - - * gui/component/select-names/e-select-names.c - (e_select_names_add_section): remove the extra - utf8_from_locale_string stuff. - - * gui/component/select-names/e-select-names-popup.c - (set_uiinfo_label): gtk_container_children -> - gtk_container_get_children, and remove the extra utf8 stuff. - - * gui/component/Makefile.am (INCLUDES): add - -D*_DISABLE_DEPRECATED. - - * gui/component/addressbook-storage.c - (addressbook_storage_init_source_uri): g_string_sprintfa -> - g_string_append_printf. - - * gui/component/addressbook-config.c (focus_help): - gtk_notebook_set_page -> gtk_notebook_set_current_page. - (addressbook_source_dialog_set_source): same. - (auth_optionmenu_activated): gtk_container_children -> - gtk_container_get_children. - (ssl_optionmenu_activated): same. - (ssl_optionmenu_selected): same, and gtk_notebook_set_page -> - gtk_notebook_set_current_page. - (scope_optionmenu_activated): same. - (set_advanced_button_state): same. - (addressbook_ldap_init): hook "response" to gtk_widget_destroy to - make the dialog go away when clicked. - (addressbook_ldap_auth): same. - (addressbook_root_dse_query): same. - (do_ldap_root_dse_query): same. - (addressbook_config_control_new): fix return type and cast. - (main): remove call to gtk_widget_push_visual. - - * gui/component/addressbook-config.h: - addressbook_config_control_new returns a BonoboObject, not a - BonoboControl. - - * gui/component/addressbook.c: remove e-unicode.h include. - - * backend/pas/Makefile.am (INCLUDES): Add - -DLIBGNOME_DISABLE_DEPRECATED. - - * backend/ebook/Makefile.am (INCLUDES): Add - -DLIBGNOME_DISABLE_DEPRECATED. - - * backend/ebook/e-card.c (e_card_get_property): remove misleading - comment. - -2002-12-17 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (build_card_from_entry): - g_strcasecmp -> g_ascii_strcasecmp. - (FIND_INSERT): same. - - * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): - g_dirname -> g_path_get_dirname. - - * backend/pas/Makefile.am (INCLUDES): add - -DG_DISABLE_DEPRECATED. - - * backend/ebook/Makefile.am (INCLUDES): add - -DG_DISABLE_DEPRECATED. - -2002-12-17 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (uris_listener): oops, use strcmp, not !strcmp here. - -2002-12-17 Chris Toshok <toshok@ximian.com> - - [ Fixes bug #35135 ] - * backend/ebook/e-book-util.c (set_default_book_uri_local): don't - free the default_book_uri here, it's done in set_default_book_uri. - (set_default_book_uri): break some stuff out from - set_default_book_uri_from_bonobo_conf to here so it can be used - both from that function and the bonobo listener. - (default_folder_listener): set the new default book uri. - (set_default_book_uri_from_bonobo_conf): install the bonobo conf - listener so we'll get updates. - -2002-12-16 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-config.c - (addressbook_config_control_new): Use - evolution_shell_client_corba_objref() instead of BONOBO_OBJREF() - to get the Shell CORBA object. - -2002-12-16 Jeffrey Stedfast <fejj@ximian.com> - - * gui/component/addressbook-config.c: Don't #include - <e-util/e-html-utils.h> - -2002-12-09 Chris Toshok <toshok@ximian.com> - - * gui/search/e-addressbook-search-dialog.[ch]: GObject-ize this. - -2002-12-09 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (load_uri_auth_cb): pass - "Addressbook" to e_passwords*. - (addressbook_authenticate): same. - -2002-12-09 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (search_cb): remove - PENDING_PORT_WORK. - (addressbook_search_activated): same. - (addressbook_query_changed): same. - - * gui/component/Makefile.am (libevolution_addressbook_la_LIBADD): - add libfilter.la back in. - -2002-12-09 Ettore Perazzoli <ettore@ximian.com> - - * gui/widgets/e-minicard-control.c: #define MINICARD_CONTROL_ID. - -2002-12-08 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog): - connect ::response to gtk_widget_destroy so the dialog goes away. - - * gui/widgets/e-minicard-label.c (e_minicard_label_construct): - don't use font_gdk anymore on EText. it doesn't exist. - -2002-12-08 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-reflow-adapter.c (text_height): this - uses pango now. - (addressbook_height): same. - -2002-12-06 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book.c (e_book_commit_card): use e_card_set_book - instead of basically duplicating its code here. - (e_book_add_card): same. - -2002-12-06 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/e-cardlist-model.c: #include <string.h>. - - * gui/component/addressbook-storage.c: #include <string.h>, - <ctype.h>, <unistd.h>. - - * gui/component/addressbook-factory.c: Removed. - - * gui/component/addressbook-component.c: #include - <bonobo/bonobo-main.h>, <unistd.h> and <string.h>. - (create_view): addressbook_new_control() instead of - addressbook_factory_new_control(). - - * gui/component/select-names/e-select-names.c - (e_addressbook_create_ebook_table): Removed unused variable. - (e_select_names_add_section): Removed unused variable. - - * gui/component/select-names/e-select-names-manager.c - (focus_in_cb): Use g_source_remove() here instead of - gtk_timeout_remove(). - - * gui/component/component-factory.c: New. - - * gui/widgets/e-minicard-control.c - (e_minicard_control_factory_init): Removed. - (e_minicard_control_control_factory): Removed. - (e_minicard_control_new): New. - - * gui/component/e-address-widget.c - (e_address_widget_factory_init): Removed. - (e_address_widget_new_control): Renamed from - e_address_widget_factory_new_control(), made public. - (e_address_widget_factory): Removed. - - * gui/component/e-address-popup.c (e_address_popup_new_control): - New. - (e_address_popup_factory_new_control): Removed. - (e_address_popup_factory): Removed. - (e_address_popup_factory_init): Removed. - - * gui/component/addressbook-config.c - (addressbook_config_register_factory): Removed. - (addressbook_config_create_control): New. - - * gui/component/addressbook-component.c - (addressbook_component_factory_init): Removed. - (addressbook_component_get_object): New. - (owner_set_cb): Do not call addressbok_config_register_factory(). - - * gui/component/addressbook.c (addressbook_factory_init): Removed. - (addressbook_new_control): Renamed from - addressbook_factory_new_control(). - -2002-12-05 Jeffrey Stedfast <fejj@ximian.com> - - * gui/component/select-names/e-select-names.etspec: Use collate - for sorting rather than the normal string sort. This fixes bug - #26335 without causing bug #33933 :-) - -2002-11-30 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_connect): only - enable the LDAPv3 stuff if TLS is being used. Also, deal with - naming errors returned from query_ldap_root_dse, as some servers - (older openldap servers among others i'm sure) don't have a root - dse at all. - -2002-12-02 Not Zed <NotZed@Ximian.com> - - * gui/widgets/e-addressbook-view.c (e_contact_print_button): - gnomedialog -> gtkdialog stuff. print dialog is a gtkdialog now. - - * gui/contact-editor/e-contact-editor.c: include gtkstock.h - - -2002-11-27 Not Zed <NotZed@Ximian.com> - - * gui/contact-editor/e-contact-editor-address.c: #include gtkstock.h - -2002-11-29 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard-view-widget.c (column_width_changed): the - detail is supposed to go after the signal id, not at the end of - the parameter list. - -2002-11-28 Chris Toshok <toshok@ximian.com> - [ roll forward from 1.2 branch, partial fix for #31763 ] - * gui/component/select-names/select-names.glade: add the Find - button back in. - -2002-11-28 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c (create_minicard_view): remove - the button_press_event handler (that did nothing). this makes it - so button presses actually get to the canvas (and therefore we can - now drag the lines in the reflow widget). - -2002-11-26 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-quick-add.c: add include for - gtkstock.h. - - * gui/contact-list-editor/e-contact-list-model.c - (e_contact_list_model_add_destination): add pre_change call. - (e_contact_list_model_remove_row): same. - (e_contact_list_model_remove_all): same. - - * gui/contact-list-editor/e-contact-list-editor.c - (e_contact_list_editor_new): ref/sink the contact list editor so - we don't get the floating unref warning from gtk. - - * gui/contact-editor/e-contact-editor.c (e_contact_editor_new): - ref/sink the contact editor so we don't get the floating unref - warning from gtk. - (e_contact_editor_init): use g_build_filename instead of - g_concat_dir_and_file. - - * gui/widgets/e-minicard-label.c - (e_minicard_label_resize_children): use MAX (value, 0) to make - sure we aren't passing negative values for clip-widths. - - * gui/widgets/e-minicard.c (e_minicard_realize): use MAX (value, - 0) to make sure we aren't passing negative values for widths. - - * gui/contact-editor/e-contact-editor.c (e_contact_editor_init): - use g_build_filename. - -2002-11-26 Chris Toshok <toshok@ximian.com> - - [ roll forward from 1.2 branch ] - * backend/pas/pas-backend-file.c - (pas_backend_file_process_get_vcard): never pass NULL as the vcard - to the corba call, it causes a crash. This particular bug bit us - when we opened a card that contained an unresolvable related - contact. - -2002-11-26 Chris Toshok <toshok@ximian.com> - - [ roll forward from 1.2 branch, Fixes addressbook bug #28945 ] - * backend/ebook/e-card.c (e_card_get_vobject): if the email - property is xml, get the real address from the e-destination. - Fixes saving contact lists. - -2002-11-26 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard.c (e_minicard_reflow): remove redundant - setting of y2. - - * gui/contact-list-editor/e-contact-list-editor.c - (e_contact_list_editor_init): show the table. - - * gui/component/select-names/e-select-names-completion.c: remove - an unnecessary #include. - - * gui/component/addressbook-storage.c (addressbook_storage_setup): - use g_build_filename. - - * gui/component/addressbook-component.c (remove_folder): use - g_build_filename. - (add_creatable_item): same. - (ensure_completion_uris_exist): same, and use the right gconf - paths for completion uris. - -2002-11-26 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (read_completion_books_from_db): use new schema for - completion/uris. - (uris_listener): same. - - * gui/component/select-names/e-select-names.h: Convert to - GtkDialog from GnomeDialog. - - * gui/component/select-names/e-select-names.c: Convert to - GtkDialog from GnomeDialog. - (folder_selected): use new schema for last_used_uri. - (e_select_names_init): same. - (e_select_names_set_default): use pango markup to set - bold/not-bold. - (e_select_names_add_section): don't bother creating an EEntry, we - can use pango and a normal label. This also keeps us from - wrapping "contacts ->" at the '-'. - - * gui/component/apps_evolution_addressbook.schemas: new file. - - * gui/component/Makefile.am: add the schema stuff. - -2002-11-24 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.c (query_for_supported_bases): - show the etable. - (addressbook_add_server_druid): show_all before returning the - dialog, so the druid shows up. - -2002-11-23 Chris Toshok <toshok@ximian.com> - - [ roll forward from the 1.2 branch. fixes #25540, part of #29630, - as well as other selection issues in the contact editor and ACL - issues in the ldap backend ] - * backend/pas/pas-backend-ldap.c (check_schema_support): reset the - schema check state to FALSE if the read returned nothing (and the - user had not authenticated). we'll requery if/when they auth. - (query_ldap_root_dse): free the schema dn before assigning over - it. - (pas_backend_ldap_connect): added a diagnostic warning about the - root dse query failing in anonymous mode (if it in fact did fail.) - (pas_backend_ldap_process_authenticate_user): if we successfully - authed, requery the root dse to pick up any attributes that might - be protected, and retry the schema query if that failed before. - - * gui/contact-editor/e-contact-editor.c (full_name_clicked): set - the dialog's editable state based on the new field - "fullname_editable", and only do the Ok button handling if this - flag is TRUE. - (full_addr_clicked): set the dialog's editable state based on the - editable state for the particular address (from - editor->address_editable[]). also, only do the Ok button handling - if this flag is TRUE. - (_address_arrow_pressed): use the address_editable array to - determine whether the address text and the mailing address - checkbutton are sensitive. - (enable_writable_fields): figure out if fullname_editable is - TRUE/FALSE, also, init the address_editable flags based on the - field list, and handle the address checkbutton. - - * gui/contact-editor/fulladdr.glade: change the label names to - label-<name> to match {entry,combo}-<name>. - - * gui/contact-editor/fullname.glade: same. - - * gui/contact-editor/e-contact-editor-fullname.c - (e_contact_editor_fullname_class_init): rename ARG_IS_READ_ONLY to - ARG_EDITABLE, to reflect the correct sense of the flag. - (e_contact_editor_fullname_set_arg): same, and make the labels - sensitive/insensitive depending on the editable state of the - dialog. - - * gui/contact-editor/e-contact-editor-address.c - (e_contact_editor_address_class_init): rename ARG_IS_READ_ONLY to - ARG_EDITABLE, to reflect the correct sense of the flag. - (e_contact_editor_address_set_arg): same, and make the labels - sensitive/insensitive depending on the editable state of the - dialog. - -2002-11-22 Chris Toshok <toshok@ximian.com> - - [ roll forward Sean.Gao@sun.com's fix for #16870 from the 1.2 - branch ] - * backend/ebook/evolution-ldif-importer.c (getNextLDIFEntry): - check for both LR and CRLF as empty line markers. - -2002-11-22 Chris Toshok <toshok@ximian.com> - - [ rolling forward fix for #34254 from 1.2 branch ] - * backend/ebook/evolution-vcard-importer.c (check_file_is_vcard): - use g-ascii_strncasecmp instead of strncmp. - (support_format_fn): use g_ascii_strcasecmp instead of strcmp. - -2002-11-20 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-storage.h: roll forward the scope fix. - -2002-11-20 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c: roll forward the fix for - the contact editor. - -2002-11-21 Not Zed <NotZed@Ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (entry_changed): Pass type to bonobo_ctonrol_set_property, and - also NULL terminate the valist. - - * gui/component/select-names/e-select-names-text-model.c - (changed_cb): Fix signature for signal. - -2002-11-19 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in, - * gui/component/select-names/Makefile.am: Same changes as below - for the SelectNames component. - -2002-11-18 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_init): show the custom table. - -2002-11-18 Chris Toshok <toshok@ximian.com> - - * gui/widgets/gal-view-minicard.c (gal_view_minicard_attach): - remove the cast to (int) - column_width is a double. - - * gui/widgets/e-minicard.c (e_minicard_class_init): the height - property is only readable, not readwrite. - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_class_init): make column_width a double - property. - (e_minicard_view_widget_set_property): don't cast to (int). - column_width is double in the e-minicard-view. - (e_minicard_view_widget_realize): same. - (e_minicard_view_widget_get_property): use g_value_set_double for - column_width. - -2002-11-17 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/Makefile.am (servers_DATA): oops, - missed some "oaf"'s. - -2002-11-16 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c - (e_contact_editor_build_phone_ui): sink the popup. - (e_contact_editor_build_email_ui): same. - (e_contact_editor_build_address_ui): same. - - * gui/component/addressbook-config.c (ldap_dialog_new): show - everything from dialog->page down, so custom widgets show up. - -2002-11-15 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/Makefile.am: Added rule to generate - GNOME_Evolution_Addressbook.server.in from - GNOME_Evolution_Addressbook.server.in.in, substituting - @LIBEXECDIR@. - - * GNOME_Evolution_Addressbook.server.in.in: Renamed from - GNOME_Evolution_Addressbook.server.in. Added @LIBEXECDIR@ before - the location of the executable. - - * gui/component/select-names/select-names.glade: Ported to Glade - 2. - - * gui/component/select-names/recipient.glade: Ported to Glade 2. - -2002-11-15 Rodney Dawes <dobey@ximian.com> - - * gui/component/addressbook-component.c: Use bonobo_main_quit. - -2002-11-14 Chris Toshok <toshok@ximian.com> - - * gui/widgets/gal-view-factory-minicard.c: clean this up a tad. - - * gui/widgets/e-addressbook-view.c (init_collection): re-enable - this. - (setup_menus): same. - - * gui/widgets/gal-view-minicard.[ch]: more GObject work. - -2002-11-12 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (_popup_position): push_in - = FALSE, no clue why... :) - (_arrow_pressed): call g_signal_stop_emission here, seems to fix - things. - - * gui/component/select-names/e-select-names.c - (e_select_names_init): fix warnings. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_activate_dialog): fix warning. - - * gui/component/addressbook.c (forget_passwords_cb): remove the - PENDING_PORT ifdef. - (load_uri_auth_cb): same. - (addressbook_authenticate): same. - - * gui/component/addressbook-factory.c (main): same. - - * gui/component/addressbook-storage.c (load_source_data): be - silent about text nodes if they contain nothing but whitespace. - -2002-11-11 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-card-cursor.c (pas_card_cursor_dispose): guard - against multiple invocations. - - * backend/pas/pas-backend-ldap.c (view_destroy): change signature - to that of a weak ref notify function. - (cursor_destroy): same. - (pas_backend_ldap_book_destroy_cb): same. - (get_cursor_handler): ::destroy -> weak_ref. - (pas_backend_ldap_process_get_book_view): same. - (pas_backend_ldap_add_client): same. - - * backend/pas/pas-backend-file.c (cursor_destroy): change - signature to that of a weak ref notify function. - (view_destroy): same. - (pas_backend_file_book_destroy_cb): same. - (pas_backend_file_process_get_cursor): ::destroy -> weak_ref. - (pas_backend_file_process_get_book_view): same. - (pas_backend_file_process_get_completion_view): same. - (pas_backend_file_process_get_changes): same. - (pas_backend_file_add_client): same. - - * backend/ebook/test-client.c (get_cursor_cb): unref the book and - exit here. - (get_card_cb): pass a query string to get_cursor. - - * backend/ebook/e-book-view.c (e_book_view_class_init): correct - marshaller for "card_added". - -2002-11-11 Chris Toshok <toshok@ximian.com> - - * gui/widgets/test-reflow.c (destroy_callback): change signature - to that of a weak ref notify function. - (main): ::destroy -> weak_ref. - - * gui/widgets/test-minicard.c (destroy_callback): change signature - to that of a weak ref notify function. - (main): ::destroy -> weak_ref. - - * gui/widgets/test-minicard-view.c (destroy_callback): change - signature to that of a weak ref notify function. - (main): ::destroy -> weak_ref. - - * gui/widgets/test-minicard-label.c (destroy_callback): change - signature to that of a weak ref notify function. - (main): ::destroy -> weak_ref. - - * gui/widgets/e-minicard-widget.c (e_minicard_widget_init): ifdef - out the call to gnome_canvas_set_scroll_region. It doesn't seem - necessary judging from the rest of the code, and it also crashes - the addressbook if it's in. - - * gui/widgets/e-minicard-widget-test.c (destroy_callback): change - signature to that of a weak ref notify function. - (main): ::destroy -> weak_ref. - - * gui/widgets/e-minicard-control.c (free_struct): change signature - to that of a weak ref notify function. - (e_minicard_control_factory): ::destroy -> weak_ref. - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_init): - ::destroy -> weak_ref. - (e_addressbook_view_print): same. - (free_closure): change signature to that of a weak ref notify - function. - (e_contact_print_destroy): same. - (invisible_destroyed): same. - - * gui/widgets/e-addressbook-util.c - (e_addressbook_prompt_save_dialog): convert from GnomeDialog to - GtkDialog. - (e_addressbook_show_multiple_cards): same. - - * gui/contact-list-editor/e-contact-list-editor.c - (prompt_to_save_changes): change response ids to use - GTK_RESPONSE_. - - * gui/component/select-names/e-select-names-manager.c - (clear_widget): new function. - (e_select_names_manager_activate_dialog): ::destroy -> weak_ref. - - * gui/component/select-names/e-select-names.c (clear_widget): - change signature to that of a weak ref notify function. - (e_select_names_init): ::destroy -> weak_ref. - - * gui/component/e-address-popup.c (mini_wizard_destroy_cb): change - signature to that of a weak ref notify function. - (mini_wizard_new): ::destroy -> weak_ref. - - * gui/component/addressbook-config.c - (addressbook_source_dialog_destroy): change signature to that of a - weak ref notify function. - (ldap_config_control_destroy_callback): same. - (addressbook_add_server_druid): ::destroy -> weak_ref. - (addressbook_edit_server_dialog): same. - (ldap_config_control_new): same. - - * gui/component/addressbook.c (destroy_callback): change signature - to that of a a weak ref notify function. - (addressbook_factory_new_control): ::destroy -> weak_ref. - - * gui/merging/e-card-merging.c (response): rename clicked to this, - and destroy the dialog here. - (match_query_callback): ::clicked -> ::response - - * gui/merging/e-card-merging-book-commit-duplicate-detected.glade: - convert. - - * gui/merging/e-card-duplicate-detected.glade: same. - -2002-11-11 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (_arrow_pressed): change - around a little, still ifdefed though. - - * gui/contact-editor/e-contact-save-as.c (file_exists): same. - (save_it): deal with the GtkDialog response ids. - - * gui/contact-editor/e-contact-editor.c - (e_contact_editor_confirm_delete): just build the dialog here - (using gtk_message_dialog*). - - * gui/contact-editor/Makefile.am (glade_DATA): remove - file-exists.glade and e-contact-editor-confirm-delete.glade. - -2002-11-11 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-card-cursor.c (pas_card_cursor_dispose): guard - against multiple invocations. - - * backend/pas/pas-backend-ldap.c (view_destroy): change signature - to that of weak ref's notify function - also, don't use the type - check macros on the freed GObject. - (cursor_destroy): same. - (pas_backend_ldap_book_destroy_cb): same. - (pas_backend_ldap_add_client): use weak_ref insteead of ::destroy. - (get_cursor_handler): same. - (pas_backend_ldap_process_get_book_view): same. - - * backend/pas/pas-backend-file.c (cursor_destroy): change - signature to that of weak ref's notify function - also, don't use - the type check macros on the freed GObject. - (pas_backend_file_book_destroy_cb): same. - (view_destroy): same. - (pas_backend_file_process_get_cursor): use weak_ref instead of - ::destroy. - (pas_backend_file_process_get_book_view): same. - (pas_backend_file_process_get_completion_view): same. - (pas_backend_file_process_get_changes): same. - (pas_backend_file_add_client): same. - -2002-11-10 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-card-sexp.c - (pas_backend_card_sexp_dispose): guard against multiple - invocations. - - * backend/pas/pas-card-cursor.c (pas_card_cursor_dispose): same. - - * backend/pas/pas-book.c (pas_book_dispose): same. - - * backend/pas/pas-book-view.c (pas_book_view_dispose): same. - - * backend/pas/pas-book-factory.c (pas_book_factory_dispose): same. - - * backend/pas/pas-backend-summary.c (pas_backend_summary_dispose): same. - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_dispose): same. - - * backend/pas/pas-backend-file.c (pas_backend_file_dispose): same. - - * backend/ebook/e-book-listener.c (e_book_listener_dispose): guard - against multiple invocations. - - * backend/ebook/e-card.c (e_card_dispose): same. - - * backend/ebook/e-card-simple.c (e_card_simple_dispose): same. - - * backend/ebook/e-card-cursor.c (e_card_cursor_dispose): same. - - * backend/ebook/e-book.c (e_book_dispose): same. - - * backend/ebook/e-book-view-listener.c (e_book_view_listener_dispose): same. - -2002-11-08 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-model.c (free_data): guard against - multiple invocations. - (remove_book_view): same. - (addressbook_dispose): same. - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_dispose): - same. - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_dispose): same. - - * gui/widgets/e-minicard-view.c (e_minicard_view_dispose): same. - - * gui/widgets/e-minicard-widget.c (e_minicard_widget_dispose): - same. - -2002-11-08 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-reflow-adapter.c - (addressbook_get_property): oops, missed these casts. - - * gui/component/addressbook.c (get_master_list): remove the - PENDING_PORT_WORK ifdef, just ported ECategoriesMasterList. - (make_suboptions): same. - - * gui/contact-editor/e-contact-editor.c (categories_clicked): - same. - -2002-11-08 Chris Toshok <toshok@ximian.com> - - * gui/widgets/test-reflow.c: port work. - - * gui/widgets/test-minicard-view.c: port work. - - * gui/widgets/e-minicard.[ch]: port work. - - * gui/widgets/e-minicard-widget.c: port work. - - * gui/widgets/e-minicard-view.c: port work. - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_size_allocate): gtk_->g_ change i missed. - (e_minicard_view_widget_reflow): same. - - * gui/widgets/e-minicard-label.c: port work. - - * gui/widgets/e-minicard-control.c (get_prop): gtk_->g_ change i - missed. - - * gui/widgets/e-addressbook-view.c (setup_menus): ifdef this - PENDING_PORT_WORK for now. - (has_email_address_1): gtk_->g_ change i missed. - (print): remove the PENDING_PORT_WORK from here, as the print_* - symbols now resolve. - (delete): gtk_->g_ changes. - (new_card): same. - (new_list): same. - (sources): same. - (create_minicard_view): same. - (table_double_click): same. - (create_table_view): same. - (e_contact_print_destroy): same. - (e_contact_print_button): same. - (e_addressbook_view_print): same, and remove the PENDING_PORT_WORK - ifdef. - (e_addressbook_view_print_preview): same. - (do_remove): gtk_->g_ changes. - (e_addressbook_view_save_state): same. - (view_transfer_cards): same. - - * gui/widgets/e-addressbook-view.h (struct _EAddressbookView): - GtkObject -> GObject. - - * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog): - GnomeDialog -> GtkDialog. - - * gui/widgets/e-addressbook-table-adapter.c - (addressbook_set_value_at): a gtk_->g_ change i missed. - (e_addressbook_table_adapter_class_init): gtk_type_class -> - g_type_class_peek_parent. - - * gui/widgets/e-addressbook-reflow-adapter.c - (addressbook_get_property): use g_object_get_property for - aggregated properties. - (e_addressbook_reflow_adapter_class_init): gtk_type_class -> - g_type_class_peek_parent. - - * gui/merging/e-card-merging.c (match_query_callback): some misc - gtk_->g_ changes i missed. - -2002-11-08 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-model.h: parent class - is GObjectClass. - - * gui/component/select-names/e-simple-card-bonobo.c - (impl_dispose): guard against multiple invocations, and chain - dispose. - - * gui/component/select-names/e-select-names.c - (e_select_names_dispose): guard against multiple invocations. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_dispose): guard against multiple - invocations. - (e_select_names_text_model_set_source): fix casts. - - * gui/component/select-names/e-select-names-table-model.c - (e_select_names_table_model_add_source): remove the GTK_OBJECT - cast, fixes a warning. - (clear_info): guard against multiple invocations from ::dispose. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_dispose): same. - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_dispose): same. - - * gui/component/select-names/e-select-names-bonobo.c - (impl_dispose): guard against multiple invocations. - -2002-11-08 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/contact-list-editor.glade: convert to glade-2 - - * gui/contact-list-editor/e-contact-list-editor.c: port work. - - * gui/contact-list-editor/e-contact-list-model.[ch]: port work. - -2002-11-08 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor-address.[ch]: port work. - - * gui/contact-editor/e-contact-editor-fullname.[ch]: port work. - - * gui/contact-editor/e-contact-editor.[ch]: port work. - - * gui/contact-editor/e-contact-quick-add.c: port work. - - * gui/contact-editor/e-contact-save-as.c: port work. - -2002-11-08 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-util.c - (set_default_book_uri_from_config_db): prepend /apps/Evolution to - config db paths. - - * gui/component/select-names/e-select-names-manager.c (read_completion_books_from_db): same. - (uris_listener): same. - -2002-11-08 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c: more porting work. - - * e-contact-editor-fullname.[ch]: more porting work. - - * e-contact-editor.c: more porting work. - - * e-contact-quick-add.c: more porting work. - - * e-contact-save-as.c: more porting work. - - * test-editor.c: more porting work. - - * e-contact-editor-confirm-delete.glade, file-exists.glade, - fulladdr.glade, fullname.glade: run these through - libglade-convert. - -2002-11-07 Chris Toshok <toshok@ximian.com> - - * gui/component/Makefile.am (evolution_addressbook_LDADD): add - lots of libs back in since they're building now. - - * gui/component/addressbook-config.c: more porting work. - - * gui/component/addressbook.c: more porting work. - - * gui/component/e-address-popup.[ch]: more porting work. - - * gui/component/e-address-widget.[ch]: more porting work. - - * gui/component/e-cardlist-model.[ch]: more porting work. - -2002-11-07 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.[ch]: more - porting work. - - * gui/component/select-names/e-select-names-completion.[ch]: more - porting work. - - * gui/component/select-names/e-select-names-manager.[ch]: more - porting work. - - * gui/component/select-names/e-select-names-model.[ch]: more - porting work. - - * gui/component/select-names/e-select-names-popup.c: more - porting work. - - * gui/component/select-names/e-select-names-table-model.[ch]: more - porting work. - - * gui/component/select-names/e-select-names-text-model.[ch]: more - porting work. - - * gui/component/select-names/e-select-names.[ch]: more - porting work. - -2002-11-07 Chris Toshok <toshok@ximian.com> - - * backend/ebook/Makefile.am: tests are linking now, and link in - libcamel.la. - - * backend/ebook/e-destination.c (e_destination_get_name): un-ifdef - since camel is compiling. - (e_destination_get_email): same. - (e_destination_get_address): same. - (e_destination_get_textrep): same. - - * backend/ebook/e-card-compare.c (name_fragment_match): use e_utf8_casefold_*. - (name_fragment_match_with_synonyms): same. - (e_card_compare_name_to_string_full): same. - (e_card_compare_name): same. - -2002-11-07 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-util.h: add prototypes for e_utf8_casefold_collate{_len} - - * backend/ebook/e-book-util.c (e_utf8_casefold_collate_len): move - utf8_casefold_collate_len here. - (e_utf8_casefold_collate): move utf8_casefold_collate here. - -2002-11-06 Chris Toshok <toshok@ximian.com> - - * printing/e-contact-print-envelope.c: port this to - gnome2/gnomeprint2. - - * printing/e-contact-print-style-editor.c: same. - - * printing/e-contact-print.c: same. - - * printing/test-contact-print-style-editor.c: same. - - * printing/test-print.c: same. - - * printing/e-contact-print.glade: libglade-convert to libglade-2. - - * printing/Makefile.am (contact_print_test_LDADD) - (contact_print_style_editor_test_LDADD): remove libcamel.la from - these for the time being to get things linking. - -2002-11-06 Chris Toshok <toshok@ximian.com> - - * gui/widgets/gal-view-minicard.[ch]: gobjectify this. - - * gui/widgets/e-minicard.[ch]: gobjectify this. - (e_minicard_class_init): change the - min/max values of the width/height paramspecs so that they can - actually be set to something other than 0.0. - - * gui/widgets/e-minicard-widget.[ch]: gobjectify this. - - * gui/widgets/e-minicard-view.[ch]: gobjectify this. - (set_empty_message): don't need e_utf8_from_locale_string anymore. - - * gui/widgets/e-minicard-view-widget.[ch]: gobjectify this. - - * gui/widgets/e-minicard-label.[ch]: gobjectify this. - - * gui/widgets/e-addressbook-view.[ch]: gobjectify this. - - * gui/widgets/e-addressbook-table-adapter.[ch]: gobjectify this. - - * gui/widgets/e-addressbook-reflow-adapter.[ch]: gobjectify this. - - * gui/widgets/e-addressbook-model.[ch]: gobjectify this. - - * gui/widgets/e-minicard-control.c (e_minicard_control_factory): - fix bonobo_persist_stream_new api change. - - * gui/contact-list-editor/e-contact-list-model.c - (e_contact_list_model_add_destination): get rid of the - gtk_object_sink here. - - * gui/component/ldap-config.glade: glade-2 version of this file. - - * gui/component/e-address-popup.c (e_address_popup_refresh_names): - don't need e_utf8_to_gtk_string anymore. - - * gui/component/addressbook.c (make_suboptions): don't need - e_utf8_to_locale_string anymore. - - * gui/component/addressbook-config.c - (addressbook_dialog_get_source): get rid of the e_utf8 gtk_entry - functions. - (addressbook_source_dialog_set_source): same. - (general_tab_check): same. - (port_changed_func): same. - (connecting_tab_check): same. - (query_for_supported_bases): same. - (display_name_check): same. - (display_name_page_prepare): same. - (edit_source_clicked): same. - (addressbook_config_create_new_source): same. - -2002-11-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-card-sexp.c - (pas_backend_card_sexp_class_init): use g_type_class_peek_parent. - - * backend/pas/pas-card-cursor.c (pas_card_cursor_class_init): same. - - * backend/pas/pas-book-view.c (pas_book_view_class_init): same. - - * backend/pas/pas-book-factory.c (pas_book_factory_class_init): same. - - * backend/pas/pas-backend-summary.c (pas_backend_summary_class_init): same. - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_class_init): same. - - * backend/pas/pas-backend-file.c (pas_backend_file_class_init): same. - - * backend/ebook/e-book-marshal.list: ENUM -> INT. - - * backend/ebook/e-book-view.c (e_book_view_dispose): guard against - this being called multiple times. - (e_book_view_class_init): ENUM -> INT in the sequence_complete - signal. - - * backend/ebook/e-book.c (e_book_do_response_open): un-ifdef the - component_died signal stuff. - -2002-11-06 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-util.c (e_book_expand_uri): call - g_build_filename, not g_build_path. - -2002-11-06 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-destination.[ch]: fix the gnome-xml headers. - -2002-11-06 Chris Toshok <toshok@ximian.com> - - * gui/widgets/gal-view-minicard.c: fix the gnome-xml headers. - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_class_init): convert from gtk signals and args - to GSignal and GObject properties. - (e_addressbook_view_dispose): rename _destroy to this. - (e_addressbook_view_set_property): rework _set_arg to this. - (e_addressbook_view_get_property): rework _get_arg to this. - (display_view): if we're here we need to choose a view, regardless - of whether or not the GAL_IS_VIEW_* macros tell us which type it - is. - - * gui/widgets/e-addressbook-table-adapter.c: fix the gnome-xml - headers. - - * gui/widgets/e-addressbook-model.c - (e_addressbook_model_class_init): use INT, not ENUM in the signal here. - - * gui/component/addressbook-config.c: another big gtk_* -> g_* - renaming. - - * gui/component/addressbook.c: same. - - * gui/component/e-address-popup.c: same. - - * gui/component/e-address-widget.c: same. - - * gui/component/e-cardlist-model.c: fix the gnome-xml headers, and - more gtk_* -> g_* renaming. - - * gui/component/addressbook-component.c (owner_set_cb): use - evolution_shell_client_corba_objref as per ettore's change to - EvolutionShellClient.. - (create_view): fix the call to bonobo_control_set_property. - (create_component): gtk_signal_connect -> g_signal_connect. - - * gui/component/addressbook-storage.c: fix the gnome-xml - headers. - (addressbook_storage_setup): use - evolution_shell_client_corba_objref as per ettore's change to - EvolutionShellClient.. - (addressbook_get_other_contact_storage): gtk_signal_connect -> - g_signal_connect. - (load_source_data): root->childs -> root->childrens. - -2002-11-06 Chris Toshok <toshok@ximian.com> - - * gui/search/e-addressbook-search-dialog.c: fix some #include's. - -2002-11-06 Chris Toshok <toshok@ximian.com> - - * Makefile.am (SUBDIRS): only build the backend and gui dirs for - now. printing and conduits are no-man's land at present. - - * addressbook/gui/merging/e-card-merging.[ch]: Port to - GObject/gnome2. - -2002-11-05 Chris Toshok <toshok@ximian.com> - - * gui/component/.cvsignore: ignore the new .server file. - - * gui/component/Makefile.am: typical port stuff. switch the .oaf - to .server, and leave out a lot of libs so we can actually get - things linking. - - * gui/component/GNOME_Evolution_Addressbook.server.in: rename - .oaf.in here. - - * gui/component/addressbook-component.c: Port to GObject/gnome2. - - * gui/component/addressbook-config.c: Port to GObject/gnome2. - - * gui/component/addressbook-factory.c: Port to GObject/gnome2. - - * gui/component/addressbook-storage.c: Port to GObject/gnome2. - - * gui/component/addressbook.[ch]: Port to GObject/gnome2. - - * gui/component/e-address-popup.[ch]: Port to GObject/gnome2. - - * gui/component/e-address-widget.[ch]: Port to GObject/gnome2. - - * gui/component/e-cardlist-model.h: Port to GObject/gnome2. - -2002-11-05 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/.cvsignore: ignore the marshal generated - stuff. - - * gui/contact-list-editor/Makefile.am: typical port stuff. add - marshaller generation foo, dist it... - - * gui/contact-list-editor/e-contact-list-editor.[ch]: Port to - GObject/gnome2. - - * gui/contact-list-editor/e-contact-list-model.[ch]: Port to - GObject/gnome2. - -2002-11-05 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/.cvsignore: ignore the marshal generated - stuff. - - * gui/contact-editor/Makefile.am: typical port stuff. add - marshaller generation foo, dist it... - - * gui/contact-editor/e-contact-editor-address.[ch]: Port to GObject/gnome2. - - * gui/contact-editor/e-contact-editor-fullname.c: Port to GObject/gnome2. - - * gui/contact-editor/e-contact-editor.c: Port to GObject/gnome2. - - * gui/contact-editor/e-contact-quick-add.c: Port to GObject/gnome2. - - * gui/contact-editor/e-contact-save-as.[ch]: Port to GObject/gnome2. - - * gui/contact-editor/test-editor.c: Port to GObject/gnome2. - -2002-11-05 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-model.[ch]: Port to GObject/gnome2. - - * gui/widgets/e-addressbook-reflow-adapter.c: Port to - GObject/gnome2. - - * gui/widgets/e-addressbook-table-adapter.c: Port to - GObject/gnome2. - - * gui/widgets/e-addressbook-util.c: Port to GObject/gnome2. - - * gui/widgets/e-addressbook-view.[ch]: Port to GObject/gnome2. - - * gui/widgets/e-minicard-control.c: Port to GObject/gnome2. - - * gui/widgets/e-minicard-label.[ch]: Port to GObject/gnome2. - - * gui/widgets/e-minicard-view-widget.[ch]: Port to GObject/gnome2. - - * gui/widgets/e-minicard-view.[ch]: Port to GObject/gnome2. - - * gui/widgets/e-minicard-widget-test.c: Port to GObject/gnome2. - - * gui/widgets/e-minicard-widget.c: Port to GObject/gnome2. - - * gui/widgets/e-minicard.[ch]: Port to GObject/gnome2. - - * gui/widgets/gal-view-factory-minicard.c: Port to GObject/gnome2. - - * gui/widgets/gal-view-minicard.c: Port to GObject/gnome2. - - * gui/widgets/test-minicard-label.c: Port to GObject/gnome2. - - * gui/widgets/test-minicard-view.c: Port to GObject/gnome2. - - * gui/widgets/test-minicard.c: Port to GObject/gnome2. - - * gui/widgets/test-reflow.c: Port to GObject/gnome2. - - * gui/widgets/Makefile.am: typical port stuff. add marshaller - generation foo, dist it... - - * gui/widgets/.cvsignore: ignore the marshaller stuff. - -2002-11-05 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-simple-card-bonobo.[ch]: Port to - GObject/gnome2. - - * gui/component/select-names/e-select-names.[ch]: Port to - GObject/gnome2. - - * gui/component/select-names/e-select-names-text-model.c: Port to - GObject/gnome2. - - * gui/component/select-names/e-select-names-table-model.c: Port to - GObject/gnome2. - - * gui/component/select-names/e-select-names-popup.[ch]: Port to - GObject/gnome2. - - * gui/component/select-names/e-select-names-model.c: Port to - GObject/gnome2. - - * gui/component/select-names/e-select-names-manager.[ch]: Port to - GObject/gnome2. - - * gui/component/select-names/e-select-names-factory.c: Port to - GObject/gnome2. - - * gui/component/select-names/e-select-names-completion.[ch]: Port - to GObject/gnome2. - - * gui/component/select-names/e-select-names-bonobo.[ch]: Port to - GObject/gnome2. - - * gui/component/select-names/Makefile.am: typical port stuff. add - marshaller generation foo, dist it, and switch the .oaf to .server - - * gui/component/select-names/.cvsignore: ignore the marshaller - stuff. - -2002-11-05 Chris Toshok <toshok@ximian.com> - - * backend/ebook/.cvsignore: ignore the generated marshaller files. - - * backend/ebook/e-destination.c (e_destination_dispose): rename - e_destination_destroy. - (e_destination_equal): ifdef this out for now, PENDING_PORT_WORK. - (e_destination_get_name): same. - (e_destination_get_email): same. - (e_destination_get_address): same. - (e_destination_get_textrep): same. - - * backend/ebook/Makefile.am: don't build the executables - (importers and loaders) for now. Also, s/oaf/server, and use - INTLTOOL_SERVER_RULE. - - * backend/ebook/e-book-util.c (e_book_get_config_database): - un-#ifdef this. - (e_book_default_book_open): un-#ifdef ths code in here that relies - on the e_config_listener. - -2002-11-05 Dan Winship <danw@ximian.com> - - * backend/pas/pas-backend-ldap.c (send_pending_adds): copy a - memleak fix from pas-backend-ad. - -2002-11-05 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-card.c: g_date_* => g_date_get_*, fixes - G_DISABLE_DEPRECATED build. - - * backend/ebook/e-book-listener.[ch]: remove the servant crap i'd - c&p'ed and put in here. - - * backend/ebook/e-book-view-listener.[ch]: remove the servant crap - i'd c&p'ed and put in here. - - * backend/pas/pas-book-factory.[ch]: subclass from BonoboObject, - and remove the servant crap from here too. whee. - - * backend/pas/pas-card-cursor.[ch]: remove the servant crap i'd - c&p'ed and put in here. - - * backend/pas/pas-book.[ch]: remove the servant crap i'd c&p'ed - and put in here. - - * backend/pas/pas-book-view.[ch]: remove the servant crap i'd - c&p'ed and put in here. - -2002-11-05 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-card-sexp.[ch]: port to gnome 2. - - * backend/pas/pas-backend-file.[ch]: same. - - * backend/pas/pas-backend-file.[ch]: same. - - * backend/pas/pas-backend-ldap.[ch]: same. - - * backend/pas/pas-backend-summary.[ch]: same. - - * backend/pas/pas-backend.[ch]: same. - - * backend/pas/pas-book-factory.[ch]: same. - - * backend/pas/pas-book-view.[ch]: same. - - * backend/pas/pas-book.[ch]: same. - - * backend/pas/pas-card-cursor.[ch]: same. - - * backend/pas/pas-marshal.list: list of marshallers. - - * backend/pas/Makefile.am (libpas_a_SOURCES): add pas-marshal.c - also add the marshal building foo. - - * backend/pas/.cvsignore: ignore pas-marshal.[ch] - -2002-11-05 Chris Toshok <toshok@ximian.com> - - * backend/ebook/test-client-list.c (main): don't call - bonobo_activation_init directly. - - * backend/ebook/test-client.c (get_card_cb): don't unref the card - here since we never reffed it. - (main): no need to call bonobo_activation_init, as - gnome_program_init did it for us. - - * backend/ebook/e-card-simple.c (e_card_simple_get_property): - s/g_value_{set,get}_pointer/g_value_{set,get}_object - - * backend/ebook/e-book-util.c (set_default_book_uri_local): make - sure to terminate args with NULL for g_build_filename. - - * backend/ebook/e-book-listener.c: nuke e_book_listener_get_type - and use the BONOBO_TYPE_FUNC_FULL macro. - - * backend/ebook/e-book-listener.h: add the epv to - EBookListenerClass so BONOBO_TYPE_FUNC_FULL works. - - * backend/ebook/e-book-view-listener.c: nuke - e_book_view_listener_get_type and use the BONOBO_TYPE_FUNC_FULL - macro. - - * backend/ebook/e-book-view-listener.h: add the epv to - EBookViewListenerClass so BONOBO_TYPE_FUNC_FULL works. - -2002-11-02 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-types.h: just include glib.h instead of the - gtk stuff. - - * backend/ebook/e-book-listener.[ch]: convert to - GObject/bonobo-activation/etc/etc. - * e-book-util.[ch]: same. - * e-book-view-listener.[ch]: same. - * e-book-view.[ch]: same. - * e-book.[ch]: same. - * e-card-compare.[ch]: same. - * e-card-cursor.[ch]: same. - * e-card-simple.[ch]: same. - * e-card.[ch]: same. - * e-destination.[ch]: same. - * evolution-ldif-importer.c: same. - * evolution-vcard-importer.c: same. - * load-gnomecard-addressbook.c: same. - * load-pine-addressbok.c: same. - * test-card.c: same. - * test-client-list.c: same. - * test-client.c: same. - - * backend/ebook/Makefile.am: add e-book-marshal.c to SOURCES, add - e-book-marshal.[ch] to CLEANFILES, and add e-book-marshal.list to - EXTRA_DIST. Also, remove the camel libs from the test LDADD's, - and leave e-destination.[ch] out of the build. - - * backend/ebook/.cvsignore: ignore e-book-marshal.[ch] - - * backend/ebook/e-book-marshal.list: marshallers for e-book. - -2002-10-28 Larry Ewing <lewing@ximian.com> - - * backend/ebook/e-card.c (addPropValueUTF8): never set the charset - on an item without also encoding it. Mime messages don't like - parts with multiple charsets. - -2002-10-25 Dan Winship <danw@ximian.com> - - * gui/widgets/e-addressbook-model.c (addressbook_destroy): - Disconnect from the book's backend_died signal. - -2002-10-24 Chris Toshok <toshok@ximian.com> - - * backend/pas/Makefile.am: install evolutionperson.schema to - $(datadir)/evolution. - -2002-10-24 Chris Toshok <toshok@ximian.com> - - [ fixes #29144 ] - * gui/component/addressbook-config.c (edit_dialog_store_change): - use e_table_memory_storage_change instead of remove/insert, so the - selection is maintained. - -2002-10-22 Dan Winship <danw@ximian.com> - - * gui/component/select-names/e-select-names.c - (folder_selected): Set /Addressbook/select_names_uri in the - configdb to the selected folder. - (e_select_names_init): Look for /Addressbook/select_names_uri - before /DefaultFolders/contacts_uri for the initial folder. So the - select names dialog now starts up using the same folder you used - last time, which is useful when you have an LDAP company directory - (which can't be your default contacts folder because it's - read-only). - -2002-10-21 Dan Winship <danw@ximian.com> - - * gui/component/addressbook-component.c (IS_CONTACT_TYPE): fix the - sense of a strcmp - -2002-10-20 Chris Toshok <toshok@ximian.com> - - [ fix for #23764 ] - * gui/widgets/e-addressbook-view.c (jump_to_letters): handle - multiple letters associated with a single button. - (button_toggled): closure->letter -> closure->letters. - (free_closure): free closure->letters. - (create_alphabet): init closure->letters. - -2002-10-20 Chris Toshok <toshok@ximian.com> - - [ fixes #29067 ] - * backend/pas/pas-backend-file.c (pas_backend_file_search): we - need to create a card_sexp even when doing summary queries since - it's used to check modifications of cards in the view. - -2002-10-20 Chris Toshok <toshok@ximian.com> - - [ fixes #32144 ] - * gui/contact-editor/e-contact-save-as.c (e_contact_save_as): - convert the name to the gtk locale before saving. - (e_contact_list_save_as): same. - -2002-10-19 Chris Toshok <toshok@ximian.com> - - [ probable fix for #25477, and memory leak fix ] - * gui/contact-editor/e-contact-editor.c (supported_fields_cb): if - the dialog isn't in the list of all dialogs it's been destroyed so - just return here. - - * backend/ebook/e-book.c - (e_book_do_response_get_supported_fields): plug leak of - resp->fields. - -2002-10-15 Dan Winship <danw@ximian.com> - - * backend/ebook/e-card.c (e_card_email_match_string): Return right - away rather than crashing if card->email is NULL. - (e_card_email_find_number): Likewise. - -2002-10-10 Kjartan Maraas <kmaraas@gnome.org> - - [ Fix #7094, #7064, #7095, #31944, #31945 ] - * gui/component/Makefile.am: Hook up new etspec file. - * gui/component/addressbook-config.c: Remove ETable spec. - * gui/component/addressbook-config.etspec: New file. - * gui/component/ldap-config.glade: Fix typo. - * gui/component/select-names/e-select-names.c: Remove inline spec. - * gui/component/select-names/e-select-names.etspec: New file. - * gui/contact-list-editor/Makefile.am: Hook up etspec. - * gui/contact-list-editor/e-contact-list-editor.c: Remove inline spec. - * gui/contact-list-editor/e-contact-list-editor.etspec: New file. - * gui/widgets/Makefile.am: Hook up new spec. - * gui/widgets/e-addressbook-view.c: Remove inline spec. - * gui/widgets/e-addressbook-view.etspec: New file. - -2002-10-02 Chris Toshok <toshok@ximian.com> - - [ Fix #28392 ] - * gui/widgets/e-addressbook-view.c (do_popup_menu): #if 0 out the - gal_view submenu, since it's not spec'ed to be there anyway (as - per bug #16250). - -2002-09-30 Chris Toshok <toshok@ximian.com> - - [ Fixes #31321 ] - * backend/ebook/e-card.c (e_card_get_vobject): add VERSION:2.1 to - exported vCards. - -2002-09-30 Chris Toshok <toshok@ximian.com> - - [ Fixes #31434 ] - * backend/pas/pas-backend-file.c (do_summary_query): always - retrieve the card from the db. use the summary strictly for - matching, not for storing all information. This fixes completion - of contact lists, since only 3 addresses were being stored and - contact lists can have more. - -2002-09-30 Aaron Weber <aaron@ximian.com> - - * gui/widgets/e-addressbook-util.c (e_addressbook_show_multiple_cards): rephrase string on l. 213 - -2002-09-30 Dan Winship <danw@ximian.com> - - * backend/ebook/e-card.c (e_card_list_send): update for - Composer_setHeaders change. - -2002-09-27 Chris Toshok <toshok@ximian.com> - - [ fixes #27521 ] - * gui/contact-editor/e-contact-quick-add.c (editor_closed_cb): - always unref the contact editor when we get the editor_closed - signal. - -2002-09-27 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (check_schema_support): set the - timeout to 30 seconds. - (query_ldap_root_dse): same, and also return the ldap_error since - this function is the one that actually causes openldap to - connect() to the ldap host. - (pas_backend_ldap_connect): check the return value of - query_ldap_root_dse, and error out if it's not SUCCESS. - -2002-09-26 Dan Winship <danw@ximian.com> - - * gui/component/addressbook-storage.c (load_source_data): Change - folder type to "contacts/ldap". - (addressbook_storage_add_source): Likewise. - (create_ldap_folder): Check for type being "contacts" not - ldap contacts, since the ldap-specific type doesn't appear in the - menu. - -2002-09-25 Dan Winship <danw@ximian.com> - - * gui/component/addressbook-component.c (folder_types): Rename - "ldap-contacts" to "contacts/ldap" and add "contacts/public". - (IS_CONTACT_TYPE): update for new types. - - * gui/component/select-names/e-select-names.c - (e_select_names_init): Use "contacts/*" for selector_types. - - * gui/widgets/e-addressbook-util.c (e_addressbook_transfer_cards): - Likewise. - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: add - "evolution:config_item:type" = "contacts/ldap" to the LDAP sources - control so it comes up by default when you open Preferences in an - LDAP folder. - -2002-09-23 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-table-adapter.c (addressbook_destroy): - free adapter->priv. - - * gui/widgets/e-addressbook-model.c (addressbook_destroy): free - model->query. - - * gui/component/select-names/e-select-names-manager.c - (load_completion_books): use e_book_expand_uri here, and free the - expanded uri after calling addressbook_load_uri, plugging a leak. - - * gui/component/select-names/e-select-names.c (set_book): unref - esn->model before we unref esn. fixes an edge case memory - corruption bug. - (clear_widget): utility function to set a widget's ref to NULL - when it's destroyed. - (e_select_names_init): hook the status_message, categories option - menu, and select_entry to clear_widget. - (addressbook_model_set_uri): use e_book_expand_uri. - -2002-09-23 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: add libeutil to the link and link with - libcamel instead of libcamel-static.la - -2002-09-22 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-manager.h: oops, add - cached_folder_list to struct _ESelectNamesManager. - -2002-09-22 Chris Toshok <toshok@ximian.com> - - [ Fixes #30481 ] - * gui/component/select-names/e-select-names.c - (e_select_names_init): initialize the select names dialog with the - default contacts folder. - -2002-09-22 Chris Toshok <toshok@ximian.com> - - [ Fixes #28165, 29171 ] - * gui/component/select-names/e-select-names-manager.c - (uris_listener): check to see if the value has really changed. - the way the preferences dialog works is such that we'll get called - when any of the Folder Options are changed (default folders, - offline stuff, etc.) we really only want to tear down and build - back up the completion books if the autocomplete folder setting - changed. - (read_completion_books_from_db): cache the folder list, and call - load_completion_books. - (load_completion_books): new function, loads from the - cached_folder_list. - (e_select_names_manager_init): init cached_folder_list to NULL. - (e_select_names_manager_destroy): g_free (cached_folder_list). - -2002-09-20 Chris Toshok <toshok@ximian.com> - - [ Fixes #30483 ] - * gui/component/select-names/e-select-names-completion.c - (name_style_query): argh, contains => beginswith. - -2002-09-17 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c (add_creatable_item): - don't add the user creatable item for ldap-contact folders atm, - since it results in their being duplicate New Contact and New - Contact List menu items. - -2002-09-17 Kjartan Maraas <kmaraas@gnome.org> - - * gui/component/ldap-config.glade: Fix a typo. - -2002-09-13 Chris Toshok <toshok@ximian.com> - - [ Fixes bug #30250 ] - * backend/ebook/e-destination.c (e_destination_get_name): handle - "Unnamed Lists" here by setting their name to _("Unnamed List'). - - * backend/ebook/e-card-simple.c (e_card_simple_get): same. - - * gui/contact-list-editor/e-contact-list-editor.c (is_named): new - function, return TRUE if the name field is filled in. - (prompt_to_save_changes): return TRUE if the list isn't named - (meaning it's not saveable.) - (command_state_changed): saving requires a name. - (add_email_cb): always call command_state_changed. - (remove_entry_cb): same. - (list_name_changed_cb): same. - (visible_addrs_toggled_cb): same. - (table_drag_data_received_cb): same. - -2002-09-12 Dan Winship <danw@ximian.com> - - * backend/ebook/e-card-simple.c (e_card_simple_get): return - g_strdup("true"), not "true". - -2002-09-11 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_start_query): institute an arbitrary - minimum limit on the number of characters before we actually try - to autocomplete. It's 3, btw. - -2002-09-11 Chris Toshok <toshok@ximian.com> - - [ fixes the other half of #17336 ] - * gui/contact-editor/e-contact-quick-add.c (quick_add_set_name): - parse the name when we're asked to set it, so the full name - doesn't get stored as (potentially) "Last, First" in the card. - -2002-09-11 Chris Toshok <toshok@ximian.com> - - [ fixes part of #17336 ] - * gui/contact-editor/e-contact-editor-fullname.c - (e_contact_editor_fullname_init): get the window title from the - .glade file, and supply a suitable wm icon. - - * gui/contact-editor/e-contact-editor-address.c - (e_contact_editor_address_init): same. - -2002-09-11 Chris Toshok <toshok@ximian.com> - - [ fixes #30208 ] - * gui/component/addressbook.c (load_uri_auth_cb): if the user - clicked cancel in the password dialog, let them off the hook and - bind anonymously. Otherwise (if they failed to auth), prompt them - for the password again. - (addressbook_authenticate): new function, split out 99% of the - auth machinery here so it can be called multiple times. Also, - call the callback with E_BOOK_STATUS_CANCELLED if the user clicked - the cancel button in the dialog. - (load_uri_cb): call addressbook_authenticate if the book has auth - enabled. - (addressbook_load_uri): use g_new0. - -2002-09-05 Anna Dirks <anna@ximian.com> - * gui/component/GNOME_Evolution_Addressbook.oaf.in : Changed the - description of the Directory Servers page of the settings dialog - to be a little less wordy {This page can be used to configure blah--> - Configure blah.} - - -2002-09-04 Chris Toshok <toshok@ximian.com> - - [ Fixes #29904 ] - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_activate_obj): we need to activate - either a contact list editor or contact editor depending on if - it's a list (this screams for a utility function.) - -2002-09-04 Dan Winship <danw@ximian.com> - - * gui/component/addressbook-storage.c - (addressbook_get_other_contact_storage): Pass FALSE to - evolution_storage_new: the Other Contacts storage doesn't support - shared folders. - -2002-09-04 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (create_component): Pass - NULL as @unpopulate_folder_context_menu_fn to - evolution_shell_component_new(). - -2002-09-03 Mike Kestner <mkestner@ximian.com> - - * gui/component/select-names/e-select-names.c (e_select_names_destroy): - unref the "without", adapter, and model, then chain up the GnomeDialog - destroy function. - -2002-09-03 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: Use - ldap-settings.png instead of evolution-contacts.png. - -2002-09-03 Chris Toshok <toshok@ximian.com> - - [ fixes #29699 ] - * gui/component/addressbook-config.c - (addressbook_add_server_druid): call _set_source with a NULL - source to fill in dialog settings that are set from the option - menus (like the SSL setting). - -2002-09-03 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c (delete_contact_cb): Fix typo - [`view>view' instead of `view->view']. Also, cast to - GTK_WINDOW instead of GTK_WIDGET as it should be. - -2002-08-30 Dan Winship <danw@ximian.com> - - * backend/idl/addressbook.idl (CallStatus): add QueryRefused, for - when the backend refuses to perform a query. (part of #25782) - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_convert_status): translate - GNOME_Evolution_Addressbook_BookViewListener_QueryRefused. - - * gui/component/addressbook.c (search_result): Handle - E_BOOK_VIEW_STATUS_QUERY_REFUSED. - -2002-08-30 Chris Toshok <toshok@ximian.com> - - [ fixes #27923] - * backend/pas/pas-backend-summary.c: up the version to 4_0 (4000). - (pas_backend_summary_load_item): handle wants_html{_set}, list, - and list_show_addresses. - (pas_backend_summary_save_item): same. - (pas_backend_summary_add_card): same. - (pas_backend_summary_get_summary_vcard): same. - -2002-08-29 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c (add_creatable_item): call - evolution_shell_component_add_user_creatable_item twice here, once - for the "contacts" folder type, and once for "ldap-contacts". - -2002-08-29 Chris Toshok <toshok@ximian.com> - - [ fixes #20347 ] - * gui/widgets/e-addressbook-view.c (e_addressbook_view_init): hook - up the backend_died signal. - (backend_died): new function, pop up an error dialog saying the - backend died. - - * gui/widgets/e-addressbook-model.c (backend_died): new function, - emit the backend_died signal. - (e_addressbook_model_class_init): create the backend_died signal. - (e_addressbook_model_init): init backend_died_id - (e_addressbook_model_set_arg): disconnect the backend_died signal - from the old book and hook it up to the new book. - - * gui/widgets/e-addressbook-model.h: add the backend_died signal. - - * backend/ebook/e-book.c (backend_died_cb): new function, emit the - backend_died signal. - (e_book_do_response_open): create the component listener and hook - up the backend_died signal. - (e_book_destroy): disconnect the component listener and unref it. - - * backend/ebook/e-book.h: add backend_died signal. - -2002-08-29 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-card-sexp.c (is_helper): use strcasecmp - here, since all the other helpers use case insensitive - comparisons. - - * backend/pas/pas-backend-summary.c (is_helper): same. - -2002-08-29 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (category_ber): return NULL if - the list is empty. - (pas_backend_ldap_connect): always try to use ldapv3, not just - when we want to use tls. - -2002-08-29 Chris Toshok <toshok@ximian.com> - - [ fixes #25038 ] - * gui/contact-editor/Makefile.am (INCLUDES): need to have - EVOLUTION_ICONSDIR defined. - - * gui/contact-list-editor/Makefile.am (INCLUDES): same. - - * gui/contact-editor/e-contact-editor.c (e_contact_editor_init): - set the window icon to the contact mini icon. - - * gui/contact-list-editor/e-contact-list-editor.c - (e_contact_list_editor_init): set the window icon to the new - contact list icon. - - * gui/widgets/e-minicard.c (LIST_ICON_FILENAME): change to (the - prettier, imo) "contact-list-16.png" - -2002-08-28 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_search): spew - the filter we're using for the search. - -2002-08-28 Mike Kestner <mkestner@ximian.com> - - * gui/component/select-names/e-select-names-completion.c : stop the - EBookViews before unreffing. - -2002-08-28 Dan Winship <danw@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: Add an - evolution:shell_component_launch_order and rename - evolution:shell_component_icon. - -2002-08-28 Chris Toshok <toshok@ximian.com> - - [ oops, merged the .h and .glade file back to the HEAD from the - 1-0 branch, but missed the .c file. ] - * gui/component/select-names/e-select-names.c (status_message): set - the status label's text. - (e_select_names_init): get the status message widget from the - glade ui. - -2002-08-28 Chris Toshok <toshok@ximian.com> - - [ fixes #19286 ] - * gui/component/addressbook.c (delete_contact_cb): confirm - deletion of contacts when using the menubar or toolbar. - -2002-08-28 Chris Toshok <toshok@ximian.com> - - [ fixes #28897 ] - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_clear_book_data): set book_data to NULL - after clearing/freeing the list. fixes a crash. - -2002-08-28 Chris Toshok <toshok@ximian.com> - - [ fixes #20348 ] - * backend/pas/evolutionperson.schema: deprecate "categories" in - favor of "category". evolution no longer uses "categories". - - * backend/pas/pas-backend-ldap.c (category_populate): new - function, "category" is the new name, and it's multivalued so we - need the complex-prop stuff.. - (category_ber): new function, same. - (category_compare): new function, same. - - * gui/component/addressbook.c (addressbook_search_activated): the - text is "Category is" so we should use "is" instead of "contains" - for the query. - -2002-08-27 Chris Toshok <toshok@ximian.com> - - [ Fixes #14835 ] - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_search): - notify_complete with InvalidQuery if the parse fails. - -2002-08-27 Chris Toshok <toshok@ximian.com> - - [ fixes #26907 ] - * gui/component/addressbook.c (addressbook_search_activated): use - beginswith for email. - -2002-08-26 Chris Toshok <toshok@ximian.com> - - * printing/e-contact-print.c (complete_sequence): change prototype - for complete_sequence to match sequence_complete. - (e_contact_print_button): same. - -2002-08-26 Chris Toshok <toshok@ximian.com> - - [ fixes #29446 ] - * gui/component/addressbook-config.c (scope_optionmenu_activated): - searching_modify_func can be NULL (since we don't require changes - to enable the "Next" button on this page when you create a - directory server.) - -2002-08-26 Chris Toshok <toshok@ximian.com> - - [ Fixes (almost certainly) #24649, #25494, #27351, and other LDAP search crashes ] - * backend/pas/pas-backend-ldap.c (view_destroy): use an EList - instead of a GList to store the book_view's so we don't have weird - issues with modifying the list while it's being traversed. - (find_book_view): same. - (create_card_handler): same. - (remove_card_handler): same. - (modify_card_modify_handler): same. - (poll_ldap): same, and also ref the book_view before calling - ldap_search_op_timeout (and therefore send_pending_adds). - (ldap_search_handler): same. - (ldap_op_add): warn about conflicting ldap msgid's (shouldn't ever - happen..) - (homephone_populate): make this a bit more robust (if values[0] == - NULL, values[1] won't be valid). - (business_populate): same. - (build_card_from_entry): break out of the prop_info loop when we - get a match, and only set the simple field if the value != NULL. - (ldap_search_dtor): free all the pending adds stuff. - (pas_backend_ldap_process_get_book_view): g_list_prepend => - e_list_append. - (pas_backend_ldap_remove_client): simplify the removing of the - book (use g_list_remove instead of searching and then using - g_list_remove_link.) - (pas_backend_ldap_destroy): unref the book_views list. - (pas_backend_ldap_init): initialize the EList for book_views. - -2002-08-25 Mike Kestner <mkestner@ximian.com> - - * gui/widgets/e-addressbook-view.c (remove_book_view): stop the - view before unref, in case the listener has pending events. - -2002-08-20 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (book_open_cb): not sure what i was - thinking here... the EBook isn't valid if we couldn't open it, so - we can't turn around and query it for its capabilities. - -2002-08-19 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-manager.h: add the - listener_id slot. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_new): store off the listener_id. - (e_select_names_manager_destroy): remove the bonobo listener - - fixes a crash when modifying the completion folders after you - bring up a compose window. - (e_select_names_manager_entry_new): another random timeout change - - make the completion at 100ms. - -2002-08-19 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book-view.c (pas_book_view_notify_complete): - take and pass the CallStatus to our listener. - - * backend/pas/pas-book-view.h: change the prototype for - notify_complete to include the CallStatus. - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_seq_complete_cb): add the status arg. - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_class_init): init the search_result signal. - (e_addressbook_view_init): connect to the model's search_result - signal. - (emit_search_result): emit our search_result signal. - (search_result): call emit_search_result. - - * gui/widgets/e-addressbook-view.h (struct - _EAddressbookViewClass): add the search_result signal. - - * gui/widgets/e-addressbook-model.c (sequence_complete): emit both - a "search_result" as well as the "stop_state_changed" signal. - (e_addressbook_model_class_init): init the search_result signal. - - * gui/widgets/e-addressbook-model.h: add search_result signal. - - * gui/component/addressbook.c (search_result): pop up a dialog - telling the user why the search failed or was truncated. - (addressbook_factory_new_control): connect to the "search_result" - signal on the view. - - * conduit/address-conduit.c (sequence_complete): add the status - parameter to sequence_complete. - - * backend/idl/addressbook.idl: add BookViewListener_CallStatus, - and change notifySequenceComplete to take a CallStatus. - - * backend/pas/pas-backend-ldap.c (create_card_handler): pass - status back in the notify_complete call. - (remove_card_handler): same. - (modify_card_modify_handler): same - (ldap_search_handler): same, and parse out the ldap return code so - we can report limits being properly. - - * backend/pas/pas-backend-file.c (do_summary_query): pass status - back in the notify_complete call. - (pas_backend_file_search): same, and get rid of the - status_message, as the status is passed back properly. - (pas_backend_file_search): pass status - back in the notify_complete call. - (pas_backend_file_changes): same. - (pas_backend_file_process_create_card): same. - (pas_backend_file_process_remove_card): same. - (pas_backend_file_process_modify_card): same. - - * backend/ebook/e-book-util.c (simple_query_sequence_complete_cb): - add status parameter. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_queue_status_event): change name from - _queue_empty_event, and take a status arg. - (e_book_view_listener_queue_id_event): init resp->status (to - SUCCESS). - (e_book_view_listener_queue_sequence_event): same. - (e_book_view_listener_queue_message_event): same. - (impl_BookViewListener_notify_sequence_complete): call - queue_status_event, and convert the corba status to - EBookViewStatus. - (e_book_view_listener_convert_status): new function, conver the - corba status to EBookViewStatus. - - * backend/ebook/e-book-view-listener.h: add a "status" slot to - EBookViewListenerResponse. - - * backend/ebook/e-book-view.h: change prototype for - sequence_complete signal. - - * backend/ebook/e-book-view.c (e_book_view_do_complete_event): - sequence_complete takes a parameter now (EBookViewStatus). - (e_book_view_class_init): add the enum arg to the signal. - - * backend/ebook/e-book-types.h: add EBookViewStatus enum. - -2002-08-19 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_get_static_capabilities): add - "cache-completions" here, since file completion results are - blanket cached (as they're generated from a summary). - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_get_cursor): there should be no search - limit on the get_cursor_request, as it's meant to match every card - it can. - (ldap_search_handler): parse the ldap result in the - RES_SEARCH_RESULT case. we'll want more here soon, so we can - notify the front end if the result was truncated due to either the - size or time limit being exceeded. - (pas_backend_ldap_process_get_book_view): in the case of a - completion view, we hardcode (yeah yeah, i know, but really) the - search limit to MIN (100, user-specified-limit). - (pas_backend_ldap_search): each view has its own limit now, - defaulting from the user specified one for normal searches but - possibly different for completion views. use the view's limit - here. - -2002-08-19 Dan Winship <danw@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): add an "addresses" property, to get the - "Dan Winship <danw@ximian.com>" form, as opposed to "text", which - gets you what's displayed, which might be just "Dan Winship". - (entry_set_property_fn): When setting, just reuse the "text" code, - since it should properly cardify everything for us anyway. - (impl_SelectNames_get_entry_for_section): Add the property. - -2002-08-16 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.c - (addressbook_source_dialog_set_source): fix c&p error that was - losing the ssl setting. - -2002-08-16 Iain <iain@ximian.com> - - * backends/e-book/evolution-ldif-importer.c (ebook_create): Use the - default EBook instead of the local one. - - * backends/e-book/evolution-vcard-importer.c (ebook_create): Ditto. - -2002-08-16 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (book_view_notify_status): new - function to save a little typing. - (find_book_view): same. - (pas_backend_ldap_connect): reorder things a bit - set the version - to VERSION3 *before* doing TLS, as tls requires v3, and if we're - doing ldaps://, do tls a little differently (not sure if this is - strictly necessary, but the openldap source did it.. *shrug*). - also, guard the schema check as this function can be called - multiple times for the same server (if the server goes down or - times us out.) - (pas_backend_ldap_reconnect): new function, reconnect and if - necessary reauth the user. - (pas_backend_ldap_process_create_card): use - find_book_view/book_view_notify_status/pas_backend_ldap_reconnect. - (pas_backend_ldap_process_remove_card): same. - (pas_backend_ldap_process_modify_card): same. - (pas_backend_ldap_process_get_vcard): same. - (pas_backend_ldap_process_get_cursor): same. - (pas_backend_ldap_search): same. - (poll_ldap): reconnect if ldap_result returns -1. - (pas_backend_ldap_process_authenticate_user): ick ick ick save off - the dn/passwd we auth with so we can use them to reauthenticate. - -2002-08-16 Chris Toshok <toshok@ximian.com> - - [ fix 27333 ] - * gui/widgets/e-addressbook-model.c (get_view): "local" -> - "do-initial-query". - - * backend/pas/pas-backend-file.c - (pas_backend_file_get_static_capabilities): "local" -> - "local,do-initial-query". - - * gui/widgets/e-addressbook-model.c (get_view): "local" -> - "do-initial-query". - - * gui/component/addressbook.c (book_open_cb): Only assume the - addressbook is local if "local" appears in its static - capabilities. We still use the ldap special case, but be nicer to - other networked backends. - -2002-08-12 Dan Winship <danw@ximian.com> - - * gui/component/addressbook-component.c (user_create_new_item_cb): - If invoked from a non-contact folder, add the contact to the - default contact folder, not the local one. If invoked from a - contact folder, don't append "addressbook.db" to the URI, let - ebook do the right thing. Fixes #28327 and #28325. - - * backend/idl/addressbook.idl (CallStatus): Add NoSuchBook. - (Initially intended as part of a fix for #28327, but the other - changes make it so the error code never ends up getting used any - more, but it's still good to have.) - - * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog): - Handle NO_SUCH_BOOK. - - * backend/ebook/e-book-types.h (EBookStatus): Add - E_BOOK_STATUS_NO_SUCH_BOOK. - - * backend/ebook/e-book-listener.c - (e_book_listener_convert_status): add case for NoSuchBook. - - * backend/ebook/e-book-util.c (e_book_load_local_address_book): - Kill this. Nothing should ever explicitly load the local - addressbook. - (e_book_use_default_book): Replaces e_book_use_local_address_book, - using the default book instead. - (e_book_default_book_open): Fall back to local contact folder on - E_BOOK_STATUS_NO_SUCH_BOOK too. - (e_book_query_address_default): Use default book, not local. - - * gui/component/e-address-widget.c (query_idle_fn): Use the - default book, not the local book. - - * gui/component/select-names/e-select-names-popup.c - (edit_contact_info_cb): Use the default book, not the local book. - - * backend/ebook/e-destination.c (e_destination_cardify): Use the - default book, not the local book. - (e_destination_touch): Query the default book, not the local book. - - * backend/ebook/e-card-compare.c (e_card_locate_match, - e_card_locate_match_full): Use the default book, not the local - book. - -2002-08-08 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-summary.c (pas_backend_summary_init): - initialize summary->upgraded to quiet valgrind. - -2002-08-06 Dan Winship <danw@ximian.com> - - * backend/ebook/test-client.c (TEST_VCARD): Use "\r" rather than - including literal CRs in the string, which confuses gcc on OS X. - - * backend/ebook/test-card.c (TEST_VCARD): Likewise. - -2002-08-01 Chris Toshok <toshok@ximian.com> - - [ fixes bug #25958 ] - * gui/component/addressbook.c (alphabet_state_changed): use - FULL_NAME in the case where we're untoggling a letter, and... well - use FULL_NAME in the other case too - we should never pop up the - advanced dialog. - -2002-08-01 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names.h (struct - _ESelectNames): no more search_entry. - - * gui/component/select-names/e-select-names.c (update_query): no - more search_entry, search_entry => select_entry, and add file_as - to the query since some entries don't have names (like the Ximian, - Inc. default card.) - (e_select_names_init): no more search_entry, and add an "activate" - handler on select_entry that updates the query. - -2002-08-01 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names.h (struct - _ESelectNames): remove folders and folders_by_uri, and the 2 - listeners. - - * gui/component/select-names/e-select-names.c - (e_select_names_destroy): remove the hash_table_destroys of - folders and folders_by_uri, since they no longer exist. same for - other_contacts_listener and local_listener. - -2002-08-01 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (create_component): Use - "contact-list-16.png" for the "New Contact List" item. - -2002-07-31 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (create_component): Change - the order so that "New Contact" is first and "New Contact List" is - next. - -2002-07-31 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (add_creatable_item): Pass - "contacts" as the @folder_type to - evolution_shell_component_add_user_creatable_item(). - -2002-07-31 Chris Toshok <toshok@ximian.com> - - [ roll in the following change from the 1.0 branch.] - * backend/pas/pas-backend-ldap.c: - (prop_info): change the CALURI and FBURL ecard attributes to map to the - RFC 2739 specified attributes. - (check_schema_support): check to see if calEntry is supported. - (add_objectclass_mod): insert calEntry if it's supported. - * backend/pas/evolutionperson.schema: deprecate freeBusyURI - and calendarURI. - -2002-07-31 Ettore Perazzoli <ettore@ximian.com> - - [Patch by Jacob Berkman <jacob@ximian.com>, fixes #25968] - - * backend/ebook/e-book.c (activate_factories_for_uri): Don't - double free protocol and query. - -2002-07-27 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-summary.c (save_string): don't save - empty strings. - (pas_backend_summary_save): print out the errno when we fail. - -2002-07-26 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c: Don't set up the ContactNew and - ContactNewList verbs. - (update_command_state): Don't set the sensitivity of - /commands/ContactNew and /commands/ContactNewList anymore. - (new_contact_cb): Removed. - (new_contact_list_cb): Removed. - -2002-07-24 Peter Williams <peterw@ximian.com> - - * conduit/Makefile.am (libeaddress_conduit_la_LIBADD): Change - libversit.la -> libversit.a for danw's changes. - -2002-07-24 Dan Winship <danw@ximian.com> - - * conduit/Makefile.am (libeaddress_conduit_la_LIBADD): - s/libversit_lt/libversit/ - -2002-07-22 Dan Winship <danw@ximian.com> - - * backend/pas/Makefile.am: Split pas-backend-file and - pas-backend-ldap out of libpas and build them as separate (noinst) - libraries libpasfile.a and libpasldap.a. This gets the db3 and - LDAP dependencies out of libpas, and people trying to create an - addressbook backend shouldn't be calling functions from the - existing backends anyway so there's no reason to install them. - -2002-07-16 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/select-names.glade: remove the option - menu and browse button, and add a custom widget placeholder for - the folder-selector. - - * gui/component/select-names/e-select-names.c - (addressbook_model_set_uri): move the "append /addressbook.db" - stuff here. - (e_addressbook_create_ebook_table): remove the code setting - initial uri from here. - (e_select_names_folder_free): gone. - (e_select_names_option_activated): gone. - (add_menu_item): gone. - (update_option_menu): gone. - (new_folder): gone. - (removed_folder): gone. - (folder_browse): gone. - (hookup_listner): gone. - (add_additional_select_names_uris): gone. - (e_select_names_hookup_listners): gone. - (e_addressbook_create_folder_selector): new function, create the - folder selector button. - (folder_selected): new function, callback for the folder selector. - just calls addresbook_model_set_uri. - (e_select_names_init): get the folder selector and initialize it - to show /local/Contacts. also, set the model's uri here to the - same folder. nuke the code involving the old option menu and - browse button. - -2002-07-08 Peter Williams <peterw@ximian.com> - - * backend/ebook/Makefile.am: Install libebook-static.la. - Also change --all-static to -all-static, which is the right flag. - - * backend/pas/Makefile.am: Install the PAS headers in - $(includedir)/evolution/pas. Install libpas.a - -2002-07-08 Peter Williams <peterw@ximian.com> - - * gui/component/select-names/Makefile.am (idl_DATA): Install the - SelectNames IDL and ancillary changes. - -2002-07-12 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-summary.c (free_summary_item): free the - full_name (as well as given_name. oops.) - (pas_backend_summary_new): new summaries are version 3.0 now. - (pas_backend_summary_load_item): all loaded summaries should be - 3.0+, as we fail to load versions lower than that. - (pas_backend_summary_load_header): if the summary isn't version - 3.0 fail out, as we need to rebuild the entire file to cache the - full_name fields. - (pas_backend_summary_save_item): save out the full_name. - (pas_backend_summary_add_card): put the item's full_name in the - card. - -2002-07-12 Dan Winship <danw@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): Make the - ENTRY_PROPERTY_ID_SIMPLE_CARD_LIST case not crash, although - there's still something wrong. - -2002-07-10 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_start_query): e_book_get_book_view => - e_book_get_completion_view, so the backends have the option of - using a pregenerated summary. - -2002-07-10 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-summary.c (clear_items): actually remove - the items from the pointer array too, so an error while loading - doesn't leave the memory summary corrupted. - (pas_backend_summary_load_header): bleah, load the num_items and - summary_mtime in the right order :) Also, set upgraded to TRUE if - we loaded a v1.0 summary. - (pas_backend_summary_open): make this return a gboolean, return - TRUE if the summary is already open (priv->fp != NULL). return - FALSE in error conditions. - (pas_backend_summary_load): if summary_open returns FALSE, return - FALSE, also set the dirty flag to FALSE after we load, and if the - summary was upgraded write it out. - (pas_backend_summary_save): update the in memory mtime to that of - the file when we save. - (summary_flush_func): if we're not dirty, do nothing and return. - (pas_backend_summary_is_up_to_date): make sure we've opened the - summary. - (pas_backend_summary_get_summary_vcard): fix compiler warning. - -2002-07-10 Peter Williams <peterw@ximian.com> - - * backend/ebook/e-book-view-listener.h: Oops, missed this one. - - * backend/ebook/Makefile.am (libebookinclude_HEADERS): Also - put addressbook.h here because several headers reference it. - -2002-07-08 Peter Williams <peterw@ximian.com> - - * backend/ebook/e-book.h: Normalize includes to <ebook/foo.h>, so - that the installed headers will work sanely. - - * backend/ebook/e-card-cursor.h: - * backend/ebook/e-book-view.h: - * backend/ebook/e-card-simple.h: - * backend/ebook/e-card.h: - * backend/ebook/e-destination.h: Same. - - * printing/Makefile.am (INCLUDES): add -Iaddressbook/backend - to access the ebook headers. Also the builddir version to get - the generated addressbook.h - - * conduit/Makefile.am (INCLUDES): Same. - - * gui/widgets/Makefile.am (INCLUDES): Same builddir fix. - - * gui/merging/e-card-merging.c: Fix an ebook #include. - - * gui/merging/Makefile.am (INCLUDES): Same idea. - - * gui/contact-list-editor/Makefile.am (INCLUDES): Same. - - * gui/contact-editor/Makefile.am (INCLUDES): Same builddir - change. - -2002-07-10 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-storage.c (load_source_data): Pass - zero as the @sorting_priority to evolution_storage_new_folder(). - (addressbook_storage_add_source): Likewise. - -2002-07-10 Chris Toshok <toshok@ximian.com> - - * backend/idl/addressbook.idl: add Book.getCompletionView. - - * backend/ebook/e-book.c (e_book_get_completion_view): new - function, basically c&p of e_book_get_book_view, but call - getCompletionView. - - * backend/ebook/e-book.h: add prototype for - e_book_get_completion_view. - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_client_requests): add a - GetCompletionView case here that just calls the same code as - GetBookView (since we don't build summaries for the ldap backend.) - - * backend/pas/pas-backend-file.c (do_summary_query): add - @completion_search. If it's TRUE, just create the vcards from the - summary using pas_backend_summary_get_summary_vcard instead of - looking them up from the db. - (pas_backend_file_search): add @completion_search and pass it on - to do_summary_query. - (pas_backend_file_process_get_book_view): pass FALSE to - pas_backend_file_search. - (pas_backend_file_process_get_completion_view): new function, - basically c&p pas_backend_file_process_get_book_view, but pass - TRUE to pas_backend_file_search. - (pas_backend_file_process_client_requests): add a case for - GetCompletionView. - (pas_backend_file_load_uri): track the change to the summary api - - create the summary filename - - * backend/pas/pas-book.c (pas_book_queue_get_completion_view): new - function, queue a GetCompletionView request to our queue. - (impl_GNOME_Evolution_Addressbook_Book_getCompletionView): new - function, call pas_book_queue_get_completion_view. - (pas_book_respond_get_completion_view): new function, just call - notifyViewRequested. - (pas_book_free_request): add a case for GetCompletionView. - (pas_book_get_epv): fill in epv->getCompletionView. - - * backend/pas/pas-book.h: add a GetCompletionView PASOperation, - and a new structure (PASGetCompletionViewRequest). Also, add - get_completion_view to PASRequest. - - * backend/pas/pas-backend-summary.c (clear_items): remove the - items from the hash table. - (pas_backend_summary_new): db_path -> summary_path. - (pas_backend_summary_destroy): db_.path -> summary_path, and - destroy the hash table. - (pas_backend_summary_init): db_path = summary_path, and initialize - the id_to_item hashtable. - (pas_backend_summary_load_header): handle the upgrading from - version 1.0 to version 2.0 (the addition of an mtime field in the - header) - (pas_backend_summary_load_item): version 1.0 and 2.0 have the same - format for items. - (pas_backend_summary_open): new function. open the summary so we - can load the header (and get the mtime). - (pas_backend_summary_load): rework this a bit since the header has - already been loaded, and also add the items to the hashtable. - (pas_backend_summary_add_card): add the new item to the hashtable. - (pas_backend_summary_remove_card): remove the item from the hash - table. - (pas_backend_summary_is_up_to_date): new function, chekc @t - against the summary's mtime. - (pas_backend_summary_get_summary_vcard): create a vcard from the - fields we have in the summary. - - * backend/pas/pas-backend-summary.h: add prorotypes for - pas_backend_summary_is_up_to_date and - pas_backend_summary_get_summary_vcard. - -2002-07-09 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-storage.c (load_source_data): Pass - NULL @custom_icon_name to evolution_storage_new_folder(). - (addressbook_storage_add_source): Likewise. [Note we could be - passing a nice custom here. ;-)] - -2002-07-02 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (add_creatable_item): New - arg @tooltip; pass it to - evolution_shell_component_add_user_creatable_item() [which now has - a @tooltip arg]. - -2002-06-29 Chris Toshok <toshok@ximian.com> - - * backend/pas/Makefile.am (libpas_a_SOURCES): add - pas-backend-summary.[ch]. - - * backend/pas/pas-backend-file.c (string_to_dbt): move this to the - top of the file so it can be used in.. - (build_summary): loop over the db, adding cards ot the summary. - (do_summary_query): call pas_backend_summary_search and loop over - the returned id's looking them up in the db. - (pas_backend_file_search): call - pas_backend_summary_is_summary_query, and either call - do_summary_query if it's a query over just the set of attributes - in the summary or use the old, slow method if not. - (pas_backend_file_process_create_card): call - pas_backend_summary_add_card. - (pas_backend_file_process_remove_card): call - pas_backend_summary_remove_card. - (pas_backend_file_process_modify_card): call remove_card/add_card. - (pas_backend_file_load_uri): try to load the summary file, and if - it doesn't exist create it. - (pas_backend_file_destroy): unref the summary. - - * backend/pas/pas-backend-summary.[ch]: new files, reading and - writing (and querying) summaries. - -2002-06-27 Sean Atkinson <sean@cantab.net> - - * gui/component/addressbook-config.c (query_for_supported_bases): - don't unref selection_model (otherwise 3 clicks of - "Show Supported Bases" crashes if LDAP server isn't running). - -2002-06-25 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c (create_component): - reorder the adding of creatable items so the default is a new - contact, not a new contact list. - -2002-06-21 Sean Atkinson <sean@cantab.net> - - * gui/component/addressbook-config.c (addressbook_edit_server_dialog): - remove source argument (get it from the dialog). - (edit_source_clicked): same. - (sources_table_double_click): added to edit server by double-clicking. - (ldap_dialog_new): use sources_table_double_click. - -2002-06-17 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_save_as): - pass NULL to e_contact_list_save_as. modality sucks. fixes - broken build. - (save_as): same. - -2002-06-15 Chris Toshok <toshok@ximian.com> - - [ fixes bug #26130 ] - * gui/contact-editor/e-contact-editor.c (file_save_as_cb): pass - ce->app as parent_window. - - * gui/contact-list-editor/e-contact-list-editor.c - (file_save_as_cb): same . - - * gui/contact-editor/e-contact-save-as.c (e_contact_list_save_as): - if a parent_window is specified, the file selector should be - modal/transient for that window. - (e_contact_save_as): same. - - * gui/contact-editor/e-contact-save-as.h: track prototype changes - (addition of GtkWindow *parent_window to both calls.) - -2002-06-15 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_connect): use - ldap_unbind_ext. - (create_card_handler): don't leak the new vcard. - (pas_backend_ldap_process_authenticate_user): don't leak the dn. - -2002-06-14 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_search): up the - max threshold to 3000 cards from 1000 cards.. seems to improve - performance a bit. also remove the g_list_reverse since it - doesn't matter what order the cards arrive to the gui. - (pas_backend_file_changes): plug memory leaks. - -2002-06-14 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-compare.c (compare_email_addresses): Made - "" compare as not equal to "" for addresses. - (use_common_book_cb): Don't bother checking for nickname here - since we don't use it as a match later. Don't add "" as an - address to the list of query parts. - -2002-06-13 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/e-contact-editor.c (enable_writable_fields): - Don't enable fields if the editor isn't editable and the - widget_field_mappings lists this field as being desensitize for - read only. - -2002-06-11 Chris Toshok <toshok@ximian.com> - - [ fixes bug #17332 ] - * backend/ebook/e-book.c (e_book_get_static_capabilities): we - shouldn't ever return NULL here. in error cases we need to return - g_strdup(""); - -2002-06-11 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-minicard-view.c (e_minicard_view_event): Made - double clicking on read only folders not do anything. - -2002-06-10 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-book-util.c (e_book_expand_uri): Made expand_uri - a bit more robust and readable. - (e_book_get_default_book_uri): Made e_book_get_default_book_uri - use e_book_expand_uri if using the bonobo_config value. - - * gui/component/e-address-popup.c (start_query): Handle the - failure state here by acting as if there are no matches. - -2002-06-05 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-minicard.c (e_minicard_event): Call - e_minicard_selected in the GDK_BUTTON_RELEASE case here. - (e_minicard_drag_begin): Set E_REFLOW (parent)->maybe_in_drag = - FALSE if it's an EReflow. - -2002-06-04 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_book_ready): Commented out this unused - function. - - * gui/component/select-names/e-select-names-manager.c - (open_book_cb): Ref if we're keeping the book. Don't unref if - we're not keeping the book. - (clean_cb): Commented out this unused function. - -2002-06-04 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c (init_collection): Set the - title of our GalVIewCollection. - -2002-05-29 Anna Marie Dirks <anna@ximian.com> - - * gui/component/select-names/select-names.glade: Changed some spacing - and expanding behavior to make this dialog behave more like I intended - to. - -2002-05-24 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.c (CONFIG_CONTROL_FACTORY_ID): - put this back in, accidentally got snipped with the hacking going - on in here. - -2002-05-24 Chris Toshok <toshok@ximian.com> - - [ part of #25047 ] - * gui/component/addressbook-config.c: remove the autocompletion - config control from here, as it lives in the shell now. - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: same. - -2002-05-24 Chris Toshok <toshok@ximian.com> - - [ #24189 ] - * gui/component/select-names/e-select-names-manager.c - (focus_out_cb): ifdef out the body of this because it only works - with a single completion book. not sure what to do here, but it - doesn't impact most usage scenarios. - (completion_popup_cb): same. - (e_select_names_manager_entry_new): add the books that have been - loaded successfully by the time this entry is created. - (open_book_cb): add the opened book to the entries that have - already been created, and store it in our list so that entries - that are created in the future can catch up. - (read_completion_books_from_db): slurp in the folder list from the - config db and load all the uris. - (uris_listener): listener function - when there's a change it - calls _clear_books on all the created entries, and clears our - list. It then re-reads the books from the db. - (e_select_names_manager_new): create our bonobo listener and call - read_completion_books_from_db. - (e_select_names_manager_init): init completion_books. - (e_select_names_manager_destroy): free our list of - completion_books. - - * gui/component/select-names/e-select-names-manager.h: switch from - a single EBook to a GList of completion_books here. - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_add_book): deal with the case where - there's an active query (by effectively restarting it.) This is - quite a contrived edge case. - (e_select_names_completion_clear_books): stop the current query - and clear our list of books. - (e_select_names_completion_new): track change to prototype, and - axe the majority of this method since an EBook* isn't passed - anymore. - (e_select_names_completion_clear_book_data): split this code out - from the destroy method so it can be called from _clear_books. - - * gui/component/select-names/e-select-names-completion.h: the - constructor no longer takes an EBook -- pass in as many as you - want using _add_book. Also, add prototype for _clear_books. - - * gui/component/addressbook.c (load_uri_cb): when - storing/retrieving passwords, use the cleaned (without params) - version of the uri, so changing things like download limit don't - cause the user to be prompted for a password again. - - * gui/component/addressbook-component.c - (ensure_completion_uris_exist): new function - probably doesn't - belong in this file. Make sure the basic local Contacts folder - exists in the completion uris. - (addressbook_component_factory_init): call - ensure_completion_uris_exist. - - * backend/ebook/e-book-util.h: add prototype for - e_book_get_default_book_uri. - - * backend/ebook/e-book-util.c (e_book_get_default_book_uri): new - function, just return the default contacts uri. - (e_book_load_default_book): change - to use e_book_get_default_book_uri. - -2002-05-23 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.c (addressbook_root_dse_query): - fix parameter/local variable overloading. - -2002-05-21 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c (load_uri_cb): Don't try to invoke - e_book_get_uri() on NULL. Fixes #25069. - -2002-05-17 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog): - make sure we map status -> string correctly (add missing strings). - - * backend/ebook/e-book-types.h (EBookStatus): add the missing - AUTHENTICATION_REQUIRED status code, to map to the idl response. - - * backend/ebook/e-book-listener.c - (e_book_listener_convert_status): make sure we map all idl status - codes to EBookStatus statuses. - -2002-05-20 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-storage.c (load_source_data): Pass - FALSE for @sync_offline to evolution_storage_new_folder(). - (addressbook_storage_add_source): Pass FALSE for @sync_offline to - evolution_storage_new_folder(). - -2002-05-16 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (request_quit): New, quit - handler for the EvolutionShellComponent. - (add_creatable_item): Set it up. - - * gui/contact-editor/e-contact-list-editor.c - (e_contact_list_editor_request_close_all): New. - (e_contact_list_editor_new): Put the contact editor in a static - list and gtk_object_weakref() it. - (contact_list_editor_destroy_notify): New, GtkDestroyNotify - function for the contact editors. - - * gui/contact-editor/e-contact-editor.c - (e_contact_editor_request_close_all): New. - (e_contact_editor_new): Put the contact editor in a static list - and gtk_object_weakref() it. - (contact_editor_destroy_notify): New, GtkDestroyNotify function - for the contact editors. - -2002-05-15 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (create_component): Pass - NULL as @request_quit_fn. - -2002-05-13 Christopher James Lahey <clahey@ximian.com> - - * backend/idl/addressbook.idl: Removed an incorrect comment here. - -2002-05-13 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/e-contact-editor.c (enable_writable_fields): - Enable the dropdown widgets even if the contact is not editable so - that you can view any email address, phone number, or postal - address on read only contacts. - -2002-05-10 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/Evolution-Addressbook-SelectNames.idl: - Added SimpleCard interface. - - * gui/component/select-names/Makefile.am: Added - e-simple-card-bonobo.c and e-simple-card-bonobo.h. - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): Added SIMPLE_CARD_LIST arg. - - * gui/component/select-names/e-simple-card-bonobo.c, - gui/component/select-names/e-simple-card-bonobo.h: New class to - represent an ECardSimple across Bonobo. - -2002-05-09 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): Added "first_email" property. - -2002-05-09 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-storage.c - (addressbook_get_other_contact_storage): Pass %FALSE as - @has_shared_folders to evolution_storage_new(). - -2002-05-08 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: link against the libtool version of - libversit - -2002-05-07 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.c - (addressbook_config_control_new): oops, add the NULL back at the - end of possible_types. - -2002-05-07 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.c (addressbook_ldap_init): - bleah, need to pass the GtkWindow here so we can pop up the a - modal parented dialog (gtk modal dialogs suck?). - (addressbook_ldap_auth): same. - (addressbook_root_dse_query): same. - (do_ldap_root_dse_query): same. - (addressbook_config_control_new): add "ldap-contacts" to the list - of possible types. - -2002-05-07 Dan Winship <danw@ximian.com> - - * gui/component/addressbook-storage.c (create_ldap_folder): - s/ldap_config/addressbook_config/ - -2002-05-03 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book.c (activate_factories_for_uri): finally - remove the #if 0's and use the oaf query stuff to get backends - that handle specific protocols. - -2002-05-03 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook-config.c - (addressbook_folder_list_changed_callback): Call - evolution_config_control_changed when the EFolderList changes. - -2002-05-03 Christopher James Lahey <clahey@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: Updated this - to have the ConfigControlFactory have an addressbookwide generic - name and added OAFIID:GNOME_Evolution_Addressbook_ConfigControl. - - * gui/component/Makefile.am (evolution_addressbook_SOURCES), - gui/component/addressbook-component.c, - gui/component/addressbook-storage.c, gui/component/addressbook.c: - Replaced ldap-config.c and ldap-config.h with addressbook-config.c - andaddressbook-config.h. - - * gui/component/addressbook-config.c, - gui/component/addressbook-config.h: Based on ldap-config.c and - ldap-config.h. Added a folder list control. Made this a multi - factory. - - * gui/component/ldap-config.c, gui/component/ldap-config.h: - Replaced these with addressbook-config.c and addressbook-config.h. - -2002-05-02 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c (selection_change): - Desensitize the to, cc, and bcc buttons if there's no selection - here. Fixes Ximian bug #21482. - -2002-05-01 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c (verbs): Changed - some of these to bind to the ContactListEditor verbs since they're - marked as that in the ui file. Fixes Ximian bug #13034. - -2002-04-30 JP Rosevear <jpr@ximian.com> - - * gui/component/Makefile.am (EXTRA_DIST): fix - -2002-04-30 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-model.c, - gui/widgets/e-addressbook-model.h - (e_addressbook_model_peek_card): Added this function so that there - would be less duplication of cards during run time when - duplication is unnecessary. - - * gui/widgets/e-addressbook-view.c: Cleaned up get_card_list and a - number of associated functions to be much more uniform and - simpler. - (get_has_email_address): Don't show the "Send Message to Contact" - menu item if there are no email addresses in the listed contacts. - Fixes bug #1298. - -2002-04-30 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card.c (e_card_list_send): Changed this to set a - subject when sending a contact. This makes the signature be set - properly also. - -2002-04-26 Jeffrey Stedfast <fejj@ximian.com> - - * printing/Makefile.am: Don't link to libibex anymore. - - * conduit/Makefile.am: Same. - - * backend/ebook/Makefile.am: Again here. - - * gui/component/Makefile.am: And finally here. - -2002-04-26 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_child_free): Unref the text_model here instead of - the model, since the model never gets set. Removed the model - field since it's no longer used. - -2002-04-24 Christopher James Lahey <clahey@ximian.com> - - * gui/component/ldap-config.c: Updated this for the new - e_table_memory_store_insert function prototype. - -2002-04-24 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h, - gui/component/select-names/select-names.glade (folder_browse): - Added a "Browse..." button to switch to a different addressbook - folder. - - * gui/widgets/e-addressbook-util.c (e_addressbook_transfer_cards): - Moved extern EvolutionShellClient out of this function so that - it'd be more readable. - -2002-04-23 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h: Coded handling of the - select_entry to search within the displayed contacts. - - * gui/component/select-names/select-names.glade: Updated this - dialog to have an entry-select instead of an entry-find. - -2002-04-23 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/select-names.glade: Updated this - dialog to match the redesign. - -2002-04-23 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c (do_popup_menu): Make unused - menu items disappear instead of graying out. - -2002-04-23 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-reflow-adapter.c, - gui/widgets/e-addressbook-reflow-adapter.h: Removed - e_addressbook_reflow_adapter_right_click and - e_addressbook_reflow_adapter_base_right_click. - - * gui/widgets/e-addressbook-view.c: Handle right click menu for - both types of view. Merged right click on white space with right - click on main area. General clean up. - - * gui/widgets/e-minicard-view-widget.c, - gui/widgets/e-minicard-view-widget.h: Removed a couple unnecessary - functions. Added e_minicard_view_widget_get_view. Added - right_click signal. - - * gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h: - Added the right_click signal and the e_minicard_view_get_card_list - function. - -2002-04-22 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.h: Removed an unused - variable here. - - * gui/widgets/e-addressbook-view.c (table_right_click, - table_white_space_event): Added a current view submenu to the - popup menu here. - -2002-04-22 Jeffrey Stedfast <fejj@ximian.com> - - * gui/widgets/e-minicard-view.c (e_minicard_view_drag_begin): - Allow GDK_ACTION_COPY also, since the composer for example does - not accept MOVE's. Completes bug #8448. - -2002-04-18 Chris Toshok <toshok@ximian.com> - - * gui/component/ldap-config.glade: change order of scope option - menu to match how it's stored. - -2002-04-18 Chris Toshok <toshok@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: change ldap - config control text so it fits in the config dialog. - - * gui/component/ldap-config.c: #ifdef lots of stuff HAVE_LDAP so - it'll build/run in either case. - (addressbook_source_dialog_destroy): rename - addressbook_add_server_druid_destroy to this, and free lots more - stuff. - (addressbook_add_server_druid): - addressbook_add_server_druid_destroy -> - addressbook_source_dialog_destroy. - (do_schema_query): add 3 second timeout to schema query. - (addressbook_edit_server_dialog): hook up destroy signal. - (config_control_new): if HAVE_LDAP isn't defined, put up a label - saying so. - -2002-04-18 Chris Toshok <toshok@ximian.com> - - * gui/component/Makefile.am (INCLUDES): add LDAP_CFLAGS to INCLUDES - -2002-04-18 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (book_open_cb): no more - source->type. - -2002-04-18 Chris Toshok <toshok@ximian.com> - - * gui/component/ldap-config.c (addressbook_dialog_get_source): - fill in source->ssl. - (addressbook_source_dialog_set_source): set up auth/scope/ssl - option menus properly. - - * gui/component/addressbook-storage.c - (addressbook_storage_init_source_uri): always include the - limit/ssl in the uri so we don't need to rely on defaults - everywhere. - (ldap_source_foreach): store the ssl option. - - * gui/component/addressbook-storage.h: reorder SSLType to match - the UI. - - * backend/pas/pas-backend-ldap.c: (struct _PASBackendLDAPPrivate) - add field for ldap_timeout. - (pas_backend_ldap_connect): reorder things a bit - we need to - start tls before the root dse query, if we can. - (pas_backend_ldap_load_uri): track the way ssl parameters are - given in the uri, and parse out the timeout. - - * gui/component/ldap-config.c (port_changed_func): use the - symbolic SSL name instead of an integer constant. - -2002-04-18 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (get_ldap_library_info): fix - memory leaks. - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: remove the - Addressbook_ConfigControl stuff to LDAP_ConfigControl. - - * gui/component/Makefile.am (evolution_addressbook_SOURCES): - remove addressbook-config.* and add ldap-config.* - (glade_DATA): same. - (evolution_addressbook_LDADD): add LDAP_LIBS. - - * gui/component/addressbook-component.c (owner_set_cb): - addressbook_config_register_factory => - ldap_config_register_factory. - - * gui/component/addressbook.c (book_open_cb): remove source->type - check - they're always LDAP. - (load_uri_cb): same. - - * gui/component/addressbook-storage.c (ldap_unparse_ssl): new - function. - (ldap_parse_ssl): new function. - (addressbook_storage_init_source_uri): use a more flexible scheme - to build up the uri's, and add in the ssl parameter. - (load_source_data): fill in source->ssl, and remove source->type - assignment. - (addressbook_source_copy): copy source->ssl, and remove - source->type copy. - (create_ldap_folder): addressbook_create_new_source => - ldap_config_create_new_source. - - * gui/component/addressbook-storage.h: remove - AddressbookSourceType (it was always LDAP), and add - AddressbookLDAPSSLType. - -2002-04-18 Dan Winship <danw@ximian.com> - - * backend/ebook/e-book-util.c (e_book_load_default_book): Append - /addressbook.db to the end of the default URI if it starts with - file: - - * backend/ebook/e-book.c (e_book_load_uri_step): Fix this to not - loop forever if you have more than one backend. - -2002-04-17 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_create_categories): Changed this to use - ECategoriesMasterListOptionMenu. - - * gui/component/select-names/e-select-names.c - (section_right_click_cb), - gui/widgets/e-addressbook-reflow-adapter.c, - gui/widgets/e-addressbook-view.c: Updated these to match the new - EPopupMenu. - -2002-04-11 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook-component.c: Include - addressbook-config.h here as this file uses it. - - * gui/component/select-names/e-select-names.c (SPEC, SPEC2): Made - this dialog searchable by typing in the ETable. - - * gui/widgets/e-addressbook-model.c: Include e-addressbook-util.h - here. - - * gui/widgets/e-addressbook-reflow-adapter.c - (e_addressbook_reflow_adapter_right_click), - gui/widgets/e-addressbook-view.c (table_right_click): Fixed a - memory leak here by using "selection-done" signal. - - * gui/widgets/e-addressbook-reflow-adapter.c, - gui/widgets/e-addressbook-reflow-adapter.h, - gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard-view.c: - Added a right click menu for areas that aren't cards. - -2002-04-09 Dan Winship <danw@ximian.com> - - * backend/ebook/e-book-util.c (e_book_load_default_book): Update - for new-and-improved consistent default folder uri. - - * gui/component/addressbook.c (addressbook_load_default_book): Use - e_book_load_default_book rather than duplicating most of its logic - here. - (load_uri_cb): Modify to work as a callback for - addressbook_load_default_book as well as addressbook_load_uri. - -2002-04-08 Dan Winship <danw@ximian.com> - - * gui/component/addressbook-component.c (create_view): Add - view_info arg, but don't do anything with it. - -2002-04-06 JP Rosevear <jpr@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: add - config_item:type - -2002-04-04 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: link to the static libversit - -2002-04-04 Dan Winship <danw@ximian.com> - - * gui/widgets/e-addressbook-util.c (e_addressbook_transfer_cards): - Update for evolution_shell_client_user_select_folder API change. - -2002-04-04 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c: Remove AddressbookConfig, - ContactNew, ContactNewList EPixmap entries. - - * gui/component/addressbook-factory.c (main): Print out a - debugging message just before the main loop starts, for debugging - purposes. - -2002-04-02 Dan Winship <danw@ximian.com> - - * backend/ebook/e-card-simple.h: Fix spelling of - E_CARD_SIMPLE_PHONE_ID_TTYTDD and E_CARD_SIMPLE_FIELD_PHONE_TTYTDD - (they previously ended with "TTD" instead of "TDD") - - * backend/ebook/e-card-simple.c: Update for spelling fix. - - * backend/pas/pas-backend-ldap.c: Likewise - -2002-04-01 Dan Winship <danw@ximian.com> - - * gui/component/select-names/e-select-names-text-model.c: - parent_class should be static. (From Max Horn <max@quendi.de>) - -2002-03-29 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: Add priority - for the config page. Renamed to "Directory Servers". - -2002-03-27 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_create_card): don't free req->vcard. - it's freed in pas_book_free_request. - (pas_backend_file_process_remove_card): don't free req->id for the - same reason. - (pas_backend_file_process_modify_card): don't free req->vcard for - the same reason. - (pas_backend_file_process_get_changes): don't free req->change_id - or release_unref the listener for the same reason. - -2002-03-27 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (check_schema_support): make sure - to call ldap_value_free (values);, and ldap_msgfree (resp). - (get_ldap_library_info): don't ask me why, but it appears we have - to free each extension char*. - (query_ldap_root_dse): make sure to free values in the - subschemaSubentry code before overwriting it, and call - ldap_msgfree(resp) when we're all done. - (build_card_from_entry): don't leak the DN, ldap attributes, or - the berval the ldap_*_attribute calls use to step through the - attributes. the docs say this berval is freed when - ldap_next_attribute returns NULL, but if we don't free it it leaks - a substantial amount of memory. - (pas_backend_ldap_search): make sure to only allocate *op once, - and fix the g_warning since op isn't valid in its scope anymore. - -2002-03-19 Dan Winship <danw@ximian.com> - - * backend/ebook/Makefile.am: Update for libversit change: Use .a - rather than .la now. - - * printing/Makefile.am: Likewise - - * gui/component/Makefile.am: Likewise - -2002-03-18 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c (addressbook_menu_activated): - Removed. - (addressbook_factory_new_control): Don't connect anymore, as this - signal has been removed from the ESearchBar. - (addressbook_factory_new_control): No more custom menu items here. - -2002-03-15 Jeffrey Stedfast <fejj@ximian.com> - - * gui/widgets/e-addressbook-view.c (table_right_click): Update to - use new EPopupMenu API. - - * gui/widgets/e-addressbook-reflow-adapter.c - (e_addressbook_reflow_adapter_right_click): Update to use new - EPopupMenu API. - - * gui/component/select-names/e-select-names.c - (section_right_click_cb): Update to match new EPopupMenu api. - -2002-03-15 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c: Remove the - `addressbook_search_menu_items'. - (addressbook_menu_activated): Removed. - (addressbook_factory_new_control): Don't connect. No menu items. - -2002-03-15 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c (control_activate): Call - `e_search_bar_set_ui_component()' to set the BonoboUIComponent for - the search bar. - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: Add an icon - for the LDAP sources configuration control. - -2002-03-12 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c: Remove verb "AddressbookConfig". - (config_cb): Removed. - - * gui/component/addressbook-config.c: Remove `dialog' member from - `AddresbookDialog'. Instead, add a `config_control' member. - (config_control_new): New. - (addressbook_config): Removed. - (addressbook_config_register_factory): New. - (config_control_factory_fn): New, factory function for the - ConfigControl page. - (addressbook_source_edit_changed): Don't change the sensitivity of - the dialog. Rather, invoke ::changed on the ConfigPage. - (auth_checkbutton_changed): No need to manually change the - sensitiviness of the buttons here either. - (add_source_clicked): Likewise, just invoke - evolution_config_control_changed(). - (edit_source_clicked): Likewise. - (addressbook_dialog_close): Removed. - (config_control_destroy_callback): New, callback for when the - config control gets destroyed. - (addressbook_dialog_apply): Removed. - (config_control_apply_callback): New callback for - EvolutionConfigControl::apply. - (addressbook_dialog_ok): Removed. - (addressbook_config_control_new): Set up ->config_control and - connect the signals. - - * gui/component/addressbook-config.glade: Call the main hbox in - the addressbook_sources dialog `addressbook_sources_main_hbox'. - - * gui/component/addressbook-component.c (owner_set_cb): Call - `addresbook_config_register_factory'. - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: Add items for - OAFIID:GNOME_Evolution_Addresbook_ConfigControl and - OAFIID:GNOME_Evolution_Addressbook_ConfigControlFactory. - -2002-03-11 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names.c (update_query): - change contains x-evolution-any-field to beginswith on email, - full_name, and nickname. faster, and more applicable to this - dialog. - -2002-03-09 Chris Toshok <toshok@ximian.com> - - * backend/idl/addressbook.idl: add TLSNotAvailable to - BookLister_CallStatus. - - * backend/ebook/e-book-types.h: add TLS_NOT_AVAILABLE to the EBookStatus enum. - - * backend/ebook/e-book-listener.c - (e_book_listener_convert_status): add TLS_NOT_AVAILABLE to the - switch. - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_get_static_capabilities): fix name. - (pas_backend_ldap_class_init): fix name. - (pas_backend_ldap_connect): change return type to CallStatus so we - can return different errors from here. Also, do STARTTLS if the - user has asked for it and the connection supports it, returning - TLSNotAvailable (and close the connection) if they chose to - require it. - (pas_backend_ldap_load_uri): return pas_backend_ldap_connect. - (func_beginswith): pull in change from evolution-1-0-branch to - make full_name beginswith search both cn and sn. - -2002-03-09 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c (jump_to_letter): since I've - gone ahead and made the file backend (by way of - pas-backend-card-sexp.c) use case insensitive searches for - beginswith, there's no need to list upper and lower case here. - - * gui/component/addressbook.c (addressbook_search_option_items): - reorder things to put "Any field contains" at the end, since it's - the least efficient search. Also reorder the enum to the same - ordering. Change "Name contains" to "Name begins with" and change - "Email contains" to "Email is". - (addressbook_search_activated): change FULL_NAME to beginswith, - and change EMAIL to is to match the labels. - - * backend/pas/pas-backend-card-sexp.c (compare_name): new - function, so we can compare both full and family names (so - beginswith can operate on them both.) - (endswith_helper): use e_utf8_strstrcase here, since all the - backends backends use case insensitive searching. - (func_endswith): same. - -2002-03-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book.c (pas_book_queue_create_card): track - union/struct change. - (pas_book_queue_remove_card): same. - (pas_book_queue_modify_card): same. - (pas_book_queue_get_cursor): same. - (pas_book_queue_get_vcard): same. - (pas_book_queue_authenticate_user): same. - (pas_book_queue_get_book_view): same. - (pas_book_queue_get_changes): same. - (pas_book_free_request): new function - free everything we need to - for each type of request. - (pas_book_destroy): call pas_book_free_request here instead of - just freeing 3 elements of the old struct. yay plugging memleaks. - - * backend/pas/pas-book.h: make PASRequest a union and split out - members into structs, so it's a little clearer which fields are - used by which requests. Also, add prototype for - pas_book_free_request so backends can just free everything at once - (usually in their requests_queued signal func.) - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_create_card): track struct/union change. - (pas_backend_file_process_remove_card): same. - (pas_backend_file_process_modify_card): same. - (pas_backend_file_build_cards_list): same. - (pas_backend_file_process_get_vcard): same. - (pas_backend_file_process_get_cursor): same. - (pas_backend_file_process_get_book_view): same. - (pas_backend_file_process_get_changes): same. - (pas_backend_file_process_check_connection): same. - (pas_backend_file_process_authenticate_user): same. - (pas_backend_file_process_get_supported_fields): same. - (pas_backend_file_process_client_requests): case the union to the - specific struct and pass it to the process_* functions. also, - call pas_book_free_request here, instead of relying on each of the - functions to free their stuff. - -2002-03-07 Dan Winship <danw@ximian.com> - - * gui/component/addressbook-storage.c - (addressbook_get_other_contact_storage): Update for - evolution_storage_new() change. - -2002-03-05 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_realize): don't set "editable" here, as - the way things work the backend isn't able to override a setting - from the UI, so writable books never show up as writable. - -2002-03-04 Chris Toshok <toshok@ximian.com> - - [fixes bug #20871] - * gui/component/select-names/select-names.glade: add the - status-message label. - - * gui/component/select-names/e-select-names.h (struct - _ESelectNames): add status_message field. - - * gui/component/select-names/e-select-names.c (status_message): - new function, set the label's text from the message. - (e_select_names_init): get the status-message label, and if it's - valid, connect to the status_message signal of the - EAddressbookModel. - -2002-02-28 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_search): don't - ref the view here, since it keeps the view alive until the search - is over, which we don't want. we want the view's death to cancel - the search. This speeds up starting new searches after one is - already active (since switching searches actually creates a new - book view and destroys the old one.) - (ldap_search_dtor): remove the matching unref here. The unref as - it was was incorrect anyway, and caused a crash (we needed - search_op->view, not op->view.) - -2002-02-27 Chris Toshok <toshok@ximian.com> - - [fixes bug #20690] - * backend/pas/pas-backend-ldap.c (func_and): the data arg is not - GList** anymore, it's PASBackendLDAPSExpData*, so use - ldap_data->list instead of *list. - (func_or): same. - (func_not): same. - (func_contains): same. - (func_is): same. - (func_endswith): same. - (func_beginswith): same, but also special case the beginswith - "fileAs" query type (the one used by the alphabet buttons on the - right hand side, so we can deal with entries that don't have - fileAs attributes, and return meaningful responses.) - (pas_backend_ldap_build_query): initialize the - PASBackendLDAPSExpData struct and pass that instead of &list. - Also, take the PASBackendLDAP arg to add to the struct in case we - need it at some point in the future. - (ldap_search_handler): pass in the PASBackendLDAP. - -2002-02-26 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_search): move - card_count++ inside the if that checks to see if a card matches - (and adds the card to the list). - -2002-02-24 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (addressbook_query_changed): only - handle the ESB_ADVANCED case here now. the actual query work is - done in addressbook_search_activated. - (addressbook_search_activated): split out all the searching - functionality here. - (addressbook_factory_new_control): hook up "search_activated" to - addressbook_search_activated. - -2002-02-24 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.c - (addressbook_source_dialog_set_source): make the right auth page - start up open. - - * gui/component/addressbook-storage.c (addressbook_source_free): - free the binddn. - (addressbook_source_copy): copy the binddn; - -2002-02-22 Chris Toshok <toshok@ximian.com> - - [ Fixes bugs 20740, 16680, and god knows what else :) ] - * gui/widgets/e-addressbook-model.c (create_card): double the - allocated size every time we need more space instead of using a - fixed size increment. this helps huge queries. Also, remove the - gtk_object_get of "file_as", as it was dead code. - (book_view_loaded): handle errors here (by popping up a dialog). - - * backend/pas/pas-backend-ldap.c (view_destroy): search_idle -> - search_timeout. - (build_card_from_entry): comment out some spew, and unref ecard - when we're done to plug a memory leak. - (send_pending_adds): send along to the client all the cards we've - been saving up. - (poll_ldap): use a timeout for ldap_result to keep the backend - from blocking (and it turns out keep the frontend from hanging - waiting on a ref to complete) on large db's with few matches. - - Also, add some fairly smart, self-tuning aggregating of cards. - Keep track of the number of cards we've sent the last time through - as well as this time, and estimate the number we want to aggregate - the next time based on them (we average them at the moment), - subject to maximum/minimum number of cards. also, we have a - maximum aggregation time, after which we force a flush if there - are pending cards and recalculate our target pending number. - there's a minimum wait time to possibly keep outselves from - spamming the ui, although it's 0 at the moment. - - Lastly, make sure to only notify the GUI of status messages when - we need to. this results in a *huge* savings. - (ldap_search_handler): initialize all the pending card stuff, and - use a timeout instead of an idle function for poll_ldap. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_queue_response): performance optimization - for large adds. If we're a CardAddedEvent and there's an existing - CardAddedEvent at the end of the queue, just concat the lists of - cards together. This is to keep the gui from falling further and - further behind the ldap backend, which is merrily spewing updates - at the gui. - -2002-02-21 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/Makefile.am: Define $(iconsdir). - - * gui/component/addressbook-component.c (add_creatable_item): New - helper function. - (create_component): Add the icons for the user creatable items as - well. - -2002-02-20 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): - track change to signature, and (for now) just change all the - return FALSE's to _RepositoryOffline (what FALSE used to map to in - pas_book_factory_process_request), and change TRUE to _Success. - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_load_uri): - track change to signature, and differentiate between - pas_backend_ldap_connect failing (RepositoryOffline), and - ldap_url_parse failing (OtherError). - - * backend/pas/pas-book-factory.c - (pas_book_factory_process_request): since pas_backend_load_uri - returns status now, use it to nodify the BookListener if there's a - failure. - - * backend/pas/pas-backend.c (pas_backend_load_uri): track change - to signature. - - * backend/pas/pas-backend.h: change return type of - pas_backend_load_uri to - GNOME_Evolution_Addressbook_BookListener_CallStatus to allow - differentiation between failure types. - - * backend/ebook/e-book-listener.c - (e_book_listener_convert_status): handle _AUTHENTICATION_FAILED. - - * backend/ebook/e-book-types.h (EBookStatus): add - _AUTHENTICATION_FAILED. - -2002-02-18 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book-factory.c - (pas_book_factory_process_request): if the load_uri fails, notify - the listener that the repository is offline. (partial fix for bug - 20347) - -2002-02-18 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (create_dn_from_ecard): escape - commas in the dn, since they're used by ldap to specify the node's - placement in the tree. (fixes bug 20089) - (rfc2254_escape): just use sprintf and %02X instead. - -2002-02-13 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c (set_book): Keep a - ref of the model in this case as well. - -2002-02-13 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c (set_book): Make - sure to only set the query once when creating a new book and not - at all on addressbook model creation. This prevents an accidental - pair of changes from making the addressbook model load a remote - addressbook. - - * gui/widgets/e-addressbook-model.c (get_view): If this is the - first_get_view and the addressbook is remote, empty the view - instead of leaving it in the state it used to be in. This only - occurs if you set the book after the model has existed for a - while. - (e_addressbook_model_set_arg): When setting the book, set - first_get_view to TRUE. - -2002-02-13 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c (display_view): Attach to the - emvw instead of the emv here. - - * gui/widgets/e-minicard-view-widget.c, e-minicard-view-widget.h: - Made this object have a "column_width" argument and a - "column_width_changed" signal which are a simple layer down to the - EMinicardView contained within. - - * gui/widgets/gal-view-minicard.c, gui/widgets/gal-view-minicard.h - (gal_view_minicard_attach): Made this attach to an - EMinicardViewWidget instead of a EMinicardView. - -2002-02-13 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-book-util.c, backend/ebook/e-book-util.h - (e_book_expand_uri, e_book_load_address_book_by_uri, - e_book_use_address_book_by_uri): New functions that take a file:// - url ending in the directory name and automatically append the - addressbook.db and do the appropriate thing. - - * backend/pas/pas-backend-card-sexp.c, - backend/pas/pas-backend-card-sexp.h: Added copyright notice here. - - * gui/component/addressbook-component.c - (destination_folder_handle_drop), gui/component/addressbook.c - (set_prop): Use e_book_expand_uri instead of - addressbook_expand_uri. - - * gui/component/addressbook-storage.c: Fixed the fcntl include - here. - - * gui/component/addressbook.c (ContactsCopyToFolder, - ContactsMoveToFolder): Added handlers for these two verbs. - - * gui/component/addressbook.h: Removed addressbook_expand_uri in - favor of e_book_expand_uri. - - * gui/widgets/e-addressbook-reflow-adapter.c (transfer_cards): - Added code to handle Move to and Copy to right click menu items. - - * gui/widgets/e-addressbook-util.c, - gui/widgets/e-addressbook-util.h (e_addressbook_transfer_cards): - New function to pop up a dialog and transfer a set of cards to the - given folder. - - * gui/widgets/e-addressbook-view.c, - gui/widgets/e-addressbook-view.h (display_view): Don't attach to - the view if it doesn't exist yet. We have to make this then - attach later. - (e_addressbook_view_copy_to_folder, - e_addressbook_view_move_to_folder): New functions utilizing - e_addressbook_transfer_cards. - (table_right_click): Add copy_to_folder and move_to_folder to the - right click menu for tables here. - (e_addressbook_view_discard_menus): Handle menu unmerging here. - - * gui/widgets/e-minicard-view-widget.h (struct - _EMinicardViewWidget): Removed unused field. - -2002-02-13 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c (display_view): Attach the - GalViewMinicard to the EMinicardView here. - - * gui/widgets/gal-view-minicard.c, gui/widgets/gal-view-minicard.h - (gal_view_minicard_load, gal_view_minicard_save): Made these save - the column width of the view. - (gal_view_minicard_attach, gal_view_minicard_detach): Added these - functions to allow the GalViewMinicard to set the column width of - a EMinicardView and to monitor its changes. - -2002-02-12 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-reflow-adapter.c - (addressbook_get_arg): Added an argument to get the model. - - * gui/widgets/e-addressbook-view.c (writable_status): Don't bother - connecting to the writable_status callback on the book, simply - rely on the writable_status callback on the addressbook model. - - * gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h - (set_empty_message): Handle the case of a read only view here. - -2002-02-07 JP Rosevear <jpr@ximian.com> - - * gui/component/addressbook-component.c (create_component): remove - "New" from user creatable menu items - -2002-02-07 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c, - gui/widgets/e-addressbook-view.h - (e_addressbook_view_setup_menus): Changed this function to use the - new GalViewMenus which takes a GalViewInstance, instead of a - GalViewCollection. - -2002-02-04 JP Rosevear <jpr@ximian.com> - - * gui/contact-editor/e-contact-editor.c (find_address_mailing): tidy - - * conduit/address-conduit.c (addrconduit_load_configuration): load - default address setting - (addrconduit_save_configuration): save default address setting - (e_addr_gui_new): new gui routine for conduit settings - (e_addr_gui_fill_widgets): ditto - (e_addr_gui_fill_config): ditto - (e_addr_gui_destroy): ditto - (e_addr_context_destroy): destroy the gui and new_cfg - (local_record_from_ecard): reinstate commented out bits, determine - which address to sync to pilot - (ecard_from_remote_record): determine which address to sync from - pilot - (fill_widgets): put the gui widgets in - (create_settings_window): create gui - (save_settings): fill gui - -2002-02-04 JP Rosevear <jpr@ximian.com> - - * gui/contact-editor/e-contact-editor.c (address_text_changed): if - the shown address in the mailing address or there is no mailing - address, set the default flag and make sure the button is checked - (address_mailing_changed): set the flags properly when the mailing - address changes - (e_contact_editor_init): listen for the check button being toggled - (find_address_mailing): find the address (if any) with the default - flag - (set_address_field): set the mailing address button appropriately - (fill_in_info): find the mailing address - - * gui/contact-editor/e-contact-editor.h: add new class data member - - * gui/contact-editor/contact-editor.glade: show mailing address - check button - -2002-02-01 Jeffrey Stedfast <fejj@ximian.com> - - * backend/ebook/e-destination.c (e_destination_is_auto_recipient): - New function to find out if a destination was one which was - auto-matically set by Evolution. - (e_destination_set_auto_recipient): Set whether or not the dest is - an auto-recipient. - (e_destination_touch): Don't touch the address if it is an - auto_recipient. - (e_destination_list_to_vector_sized): New function to avoid having - to calculate the length of the list ourselves. Allows for a bit of - optimization if our caller knows the length of the list. - (e_destination_xml_encode): Encode the auto_recipient bit. - (e_destination_xml_decode): Decode the auto_recipient bit. - -2002-02-01 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-simple.c (e_card_simple_sync_card): Made - this preserve addressbook flags other than the first three. - - * backend/ebook/e-card-types.h: Added E_CARD_ADDR_MASK and - E_CARD_ADDR_DEFAULT. - - * backend/ebook/e-card.c (get_address_flags): Added "PREF" to - E_CARD_ADDR_DEFAULT mapping. - - * backend/ebook/test-client.c: Added #include "e-book-util.h". - -2002-01-30 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_changes): - compute the change db filename based on our contact db filename. - (pas_backend_file_load_uri): store the filename in - bf->priv->filename. - (pas_backend_file_destroy): free the filename, and (!) free - bf->priv too. - -2002-01-28 Jeffrey Stedfast <fejj@ximian.com> - - * backend/ebook/e-destination.c (e_destination_is_valid): Revert - my previous change as trow says this will break auto-completion - stuff. - -2002-01-27 Ettore Perazzoli <ettore@ximian.com> - - * gui/contact-editor/Makefile.am: Use EVOLUTION_ADDRESSBOOK_CFLAGS. - * gui/contact-list-editor/Makefile.am: Likewise. - * gui/merging/Makefile.am: Likewise. - * gui/search/Makefile.am: Likewise. - * gui/component/select-names/Makefile.am: Likewise. - -2002-01-25 Jeffrey Stedfast <fejj@ximian.com> - - * backend/ebook/e-destination.c (e_destination_is_valid): Don't - check for an @ in the email address. This is to fix bug #10960. - -2002-01-24 Chris Toshok <toshok@ximian.com> - - [ fixes bug 16097 ] - * gui/component/addressbook-config.glade: gui love for the new - auth stuff. - - * gui/component/addressbook.c (load_uri_cb): track change to auth, - and offer up different prompt strings depending on which method - (binddn or email) we're using. - - * gui/component/addressbook-storage.c (ldap_unparse_auth): use the - new auth types for ldap. - (ldap_parse_auth): same. - (addressbook_storage_auth_type_to_string): new function. - (load_source_data): get the binddn too. - (ldap_source_foreach): store out binddn or emailaddr, depending on - the auth type chosen. - - * gui/component/addressbook-storage.h: add the more detailed auth - types, add "binddn" to the source structure, and add a prototype - for addressbook_storage_auth_type_to_string. - - * gui/component/addressbook-config.c (auth_checkbutton_changed): - set the auth stuff (in)sensitive. - (auth_optionmenu_activated): new function. - (addressbook_source_dialog_set_source): track UI change. - (addressbook_source_dialog_get_source): same. - (add_scope_activate_cb): rename add_activate_cb to this to - distinguish it from the auth stuff. - (add_auth_activate_cb): new function. - (addressbook_source_dialog): track change to auth UI stuff. - (addressbook_storage_auth_type_to_string): new function. - - * backend/ebook/e-book.h: add auth_method arg to - e_book_authenticate_user. - - * backend/ebook/e-book.c (e_book_authenticate_user): track change - to prototype - add auth_method arg, and pass it along to the CORBA - call. - - * backend/ebook/test-client.c (book_open_cb): track api change - - keep this building. - - * backend/pas/pas-book.h: add auth_method slot in PASRequest. - - * backend/pas/pas-book.c (pas_book_queue_authenticate_user): add - auth_method arg and add it to the PASRequest. - (impl_GNOME_Evolution_Addressbook_Book_authenticateUser): track - idl change, add auth_method and pass it along to - pas_book_queue_authenticate_user. - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_authenticate_user): support both - "ldap/simple-email" and "ldap/simple-binddn" auth methods. - - * backend/idl/addressbook.idl: add "in string authMethod" to - authenticateUser. - -2002-01-24 Ettore Perazzoli <ettore@ximian.com> - - * conduit/Makefile.am: Use EVOLUTION_ADDRESSBOOK_CONDUIT_CFLAGS - and EVOLUTION_ADDRESSBOOK_CONDUIT_LIBS and remove unused flags - - * gui/component/Makefile.am: Use EVOLUTION_ADDRESSBOOK_CFLAGS and - EVOLUTION_ADDRESSBOOK_LIBS and remove unused flags. - * backend/pas/Makefile.am: Likewise. - * backend/ebook/Makefile.am: Likewise. - * printing/Makefile.am: Likewise. - * backend/ebook/Makefile.am: Likewise. - * gui/widgets/Makefile.am (INCLUDES): Likewise. - -2002-01-23 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (create_component): Pass a - NULL @icon to - `evolution_shell_component_add_user_creatable_item()'. - -2002-01-23 Ettore Perazzoli <ettore@ximian.com> - - * gui/contact-editor/e-contact-editor-address.c: #include - <locale.h>. - -2002-01-22 Chris Toshok <toshok@ximian.com> - - [ fixes bug # 16864 ] - * backend/ebook/evolution-ldif-importer.c (getValue): create and - return a GString here, instead of writing to a fixed size buffer. - (parseLine): use a GString here instead of a fixed size buffer. - -2002-01-21 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-ldap.c (ldap_search_handler): Set the - number of cards to return to the value specified in the ldap uri, - leaving the default at 100. Fixes Ximian bug #13953. - - * gui/component/addressbook-config.c (addressbook_source_dialog), - gui/component/addressbook-config.glade: Added a limit entry here - to edit the limit field of the source. - - * gui/component/addressbook-storage.c, - gui/component/addressbook-storage.h - (addressbook_storage_init_source_uri): Added a limit field to this - class and pass that value through in the uri that's generated. - -2002-01-18 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-compare.c: Made username match with no - domain match be vague instead of partial. Fixes Ximian bug - #13612. - -2002-01-18 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook.c (view_contact_cb): New verb to open - a bunch of cards. - - * gui/widgets/e-addressbook-reflow-adapter.c (open_card): Call - e_addressbook_show_multiple_cards instead of doing this ourselves. - - * gui/widgets/e-addressbook-util.c, - gui/widgets/e-addressbook-util.h - (e_addressbook_show_multiple_cards): Added this function to show a - bunch of cards, including a dialog if lots of windows are going to - appear. - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_view, - e_addressbook_view_can_view): e_addressbook_view_view calls - e_addressbook_show_multiple_cards on the appropriate list of - cards. - -2002-01-18 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/e-contact-editor-address.c - (fill_in_countries), gui/contact-editor/fulladdr.glade: Sort - country list. Country list moves from fulladdr.glade to - e-contact-editor-address.c, but only a few country names have - actually changed. Fixes Ximian bug #16545. - -2001-12-20 Zbigniew Chyla <cyba@gnome.pl> - - Fixes #17725 - - * evolution/addressbook/printing/e-contact-print.c (complete_sequence): - Do not assume that the first byte of file_as is the first letter, use - utf8 functions instead. - -2002-01-16 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c: move all functions here, get rid of - header files, use e-pilot-settings to display gui - -2002-01-15 JP Rosevear <jpr@ximian.com> - - * gui/component/select-names/select-names.glade: remove misleading - title and fix spacing - -2002-01-11 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook.c (alphabet_state_changed): Handle - setting the search bar to "Advanced..." when the alphabet buttons - are pushed and back when they're cleared. Fixes Ximian bug - #12904. - (addressbook_menu_activated): When the user calls Search->clear, - set the search to ESB_ANY and "", don't just set the text. This - is especially useful when it's set to ESB_ADVANCED. - - * gui/widgets/e-addressbook-view.c, - gui/widgets/e-addressbook-view.h (alphabet_state_change): Added - this signal which gets emitted when the alphabet buttons are - pushed. - (command_state_change): Removed the ref pair here. It's not - necessary. gtk_signal_emit refs the object itself. - -2002-01-11 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-compare.c (name_synonyms): Added a couple - of names here. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_get_nth_obj): Removed an unused - variable. - -2002-01-11 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c, - gui/widgets/e-addressbook-view.h (create_alphabet): Use toggle - buttons here. Fixes Ximian bug #10734. - -2002-01-09 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/e-contact-editor.c (set_fields): Choose the - first filled in address field here. Fixes Ximian bug #2222. - -2002-01-03 Joe Shaw <joe@ximian.com> - - * backend/ebook/test-card.c: Add a test for getting arbitrary - fields. - - * backend/pas/pas-backend-card-sexp.c (compare_arbitrary): Added. - (prop_info_table): Add a LIST_PROP for arbitrary fields. - -2002-01-03 Nat Friedman <nat@ximian.com> - - * backend/ebook/e-book.c (activate_factories_for_uri): Free the - query if the oaf response is of zero length. - -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. - -2001-12-20 Ettore Perazzoli <ettore@ximian.com> - - [Fix #17377, Evolution doesn't work on multi-depth displays.] - - * gui/component/addressbook-factory.c (main): Push GdkRGB visual - and colormap. - -2001-12-19 Jon Trowbridge <trow@ximian.com> - - * gui/widgets/e-addressbook-reflow-adapter.c - (e_addressbook_reflow_adapter_right_click): Add cut/copy/paste to - right-click menu. - - * gui/widgets/e-addressbook-view.c (table_right_click): Add - cut/copy/paste to right-click menu. (Fixes bug #14528.) Also, - disable some right-click options if our addressbook isn't - editable. - -2001-12-18 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (check_for_slow_setting): go slow and - clear the map if the last uri and the current uri do not match - (post_sync): save the last uri - - * conduits/address-conduit-config.h: handle a last uri config - option - -2001-12-18 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (addressbook_default_book_open): - change this to match its e-book counterpart, and only failover to - the local addressbook if the protocol wasn't supported. that way - errors like "failure to connect" are still reported to the user. - - * backend/ebook/e-book-util.h: add prototypes for - e_book_load_default_book and e_book_get_config_database. - - * backend/ebook/e-book-util.c (e_book_default_book_open): new - function, basically cut and paste addressbook_default_book_open - from addressbook.c here. - (e_book_load_default_book): cut and past - addressbook_load_default_book here, pretty much, except leave off - the auth stuff. - (e_book_get_config_database): new function, returns the - Bonobo_ConfigDatabase for e_book_load_default_book to use. - - * conduit/address-conduit.c (start_addressbook_server): use - e_book_load_default_book here. - -2001-12-17 Chris Toshok <toshok@ximian.com> - - [ fixes bug 17355 ] - * gui/component/select-names/e-select-names.c (new_folder): if - we're dealing with an LDAP folder, prepend [LDAP] to it. Now that - we have 3 different places where folders are coming from, it helps - to be able to differentiate "Contacts" in ~/evolution and a - "Contacts" ldap server and a "Contacts" exchange folder. - (add_additional_select_names_uris): loop through the bonobo conf - settings for additional folders, adding them to the option menu. - (e_select_names_hookup_shell_listeners): call - add_additional_select_names_uris. - -2001-11-28 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_realize): Use an #ECanvasBackground here - instead of a #GnomeCanvasRect. - -2001-12-16 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c: Added - 'cache_complete' flag to ESelectNamesCompletionPrivate. - (e_select_names_completion_seq_complete_cb): Set cache_complete - to TRUE if our query wasn't interrupted. - (e_select_names_completion_start_query): Set cache_complete to - FALSE at the beginning of a potentially-cached query. - (e_select_names_completion_do_query): Only reuse cached cards - if cache_complete is TRUE. (Fixes bug #10241) - -2001-12-15 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (e_addr_context_destroy): don't free - the hash table keys, we didn't allocate them and free the change - objects and unref the associated cards - (local_record_from_uid): unref the temp card we create - (replace_record): ref the new card associated with the card change - and unref the old one - -2001-12-13 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (local_record_from_ecard): Make sure - to copy the custom fields so they are not overwritten - -2001-12-13 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-book-util.c (simple_query_new): Used - g_strdup_printf to dup a string. Doh! Changed to g_strdup. - (Bug #17126) - -2001-12-07 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_entry_new): Remove a reference to code - I don't want to commit yet. :-) - - * gui/component/select-names/e-select-names-manager.c: Extensively - refactored -- this code had gotten _really_ ugly. Untangle things - to the point where our reference counting problems are fixable. - - * gui/component/select-names/e-select-names-bonobo.c - (impl_destroy): Remove all of the ugly hacks to work around our - memory management problems, and just unref the manager. - (Fixes #14412) - -2001-12-05 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c - (search_for_dn_with_objectclasses): move search_for_dn's contents - here, and add an "existing_objectclasses" parameter that we pass - on to build_card_from_entry. - (search_for_dn): call search_for_dn_with_objectclasses with NULL - for existing_objectclasses. - (build_card_from_entry): if existing_objectclasses is non-NULL, - fill it in with the list of existing objectclass values for this - entry. - (add_objectclass_mod): if existing_objectclasses is non-NULL, - meaning we're modifying an entry, search in the existing - objectclasses for the ones we want to be there, and only add - what's missing. If none are missing, don't add objectclass_mod to - the list of mods. - (create_card_handler): track change to add_objectclass_mod (pass - NULL). - (modify_card_handler): use search_for_dn_with_objectclasses - instead of search_for_dn, and pass the existing objectclasses to - add_objectclass_mod. also, free the list when we're done. - (poll_ldap): track change to build_card_from_entry (pass NULL). - -2001-12-05 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (enable_writable_fields): - we need to be able to disable non-labels here as well. since - we're using enable_widget and not gtk_widget_set_sensitive, it's - okay to handle entries/text's, etc, here. - (widget_field_mappings): add label-caluri and label-fburl here. - - * gui/contact-editor/contact-editor.glade: change the label names - for the freebusy/calendar urls to have more descriptive names, - since we use them in e-contact-editor.c now. - - * backend/pas/pas-backend-ldap.c: add support for - caluri/calendarURI, fburl/freeBusyURI. - - * backend/pas/evolutionperson.schema: add calendarURI and - freeBusyURI. - -2001-12-04 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/contact-editor.glade: Fixed up the - accelerators and such here. - - * gui/contact-editor/e-contact-editor.c (file_save_as_cb): - Translate this string. - (pixmaps): Added a pixmap for the ContactEditorSaveClose command. - (setup_tab_order): Fixed up the tab order here. - - * gui/contact-editor/fulladdr.glade: Made the country combo - focusable here. - -2001-12-03 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-destination.c (e_destination_equal): Make address - comparisons case-insensitive. (Fixes 11776) - - * backend/ebook/e-card.c (e_card_email_match_single_string): Make address - host comparisons case-insensitive. (Fixes 11776) - - * gui/component/select-names/e-select-names-manager.c (focus_out_cb): Clean - ESelectNamesModel on focus-out. (Half of a fix for 15656) - - * backend/ebook/e-destination.c (nonempty): Fix this function - and make it utf8-safe. (The other half of the fix for 15656) - -2001-11-28 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c: Consistency - fixes with standard contact editor. Added Save As, Send As, and - Send To. Replaced Save toolbar with Save and Close and added Save - and Close menu item. Added a trash icon. - -2001-11-28 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/e-contact-editor-address.c (setup_tab_order): - Setup the tab order here. Fixes Ximian bug #13751. - -2001-11-28 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook.c (connect_master_list_changed, - make_suboptions): Changed how this list of categories gets - computed. Fixes Ximian bugs #7707 and #7708. - -2001-11-15 Zbigniew Chyla <cyba@gnome.pl> - - * printing/e-contact-print-envelope.c (ecpe_linelist_dimensions), - printing/e-contact-print.c (e_contact_divide_text, e_contact_output, - e_contact_rectangle, e_contact_print_letter_tab, - e_contact_print_letter_heading, e_contact_get_card_size, - e_contact_print_card, e_contact_print_phone_list): - s/gnome_font_get_width_string/gnome_font_get_width_utf8/ - s/gnome_font_get_width_string_n/gnome_font_get_width_utf8_sized/ - -2001-11-14 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (search_for_dn): check against - LDAP_SUCCESS as the return value, not -1. - (pas_backend_ldap_build_all_cards_list): same. - (pas_backend_ldap_process_authenticate_user): same. - -2001-11-12 Chris Toshok <toshok@ximian.com> - - [ Fixes Ximian bug #14843 ] - * backend/pas/pas-backend-ldap.c (func_and): don't crash if a - subexpression wasn't filled in. - - * backend/pas/pas-backend-ldap.c (func_or): same. - -2001-11-12 Jon Trowbridge <trow@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c (list_added_cb): - Release callback's reference to EContactListEditor. - (list_modified_cb): Release callback's reference to - EContactListEditor. - (save_card): Ref the EContactListEditor on behalf of the - e_book_foo callback. (Fixes bug #14743) - (save_card): Set changed to false once we've saved. - (list_deleted_cb): Release callback's reference. - (delete_cb): Hold reference for the callback. - -2001-11-12 Jon Trowbridge <trow@ximian.com> - - * gui/contact-editor/e-contact-editor.c (categories_clicked): If - our call to e_categories_new returns NULL, put up an error dialog - and return. (Fixed #14780) - -2001-11-09 Chris Toshok <toshok@ximian.com> - - [ Fixes Ximian bug #14687 ] - * backend/pas/pas-backend-file.c - - * backend/pas/pas-book-factory.c - (pas_book_factory_process_request): do load_uri before add_client, - so we know if the load actually worked (add_client uses this - information to respond to the new client.) before this change, - the client would still think the book was in a useful state even - if the load_uri failed. - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_add_client): if - the we're not connected, say so. - - * backend/pas/pas-backend-file.c (pas_backend_file_add_client): - same. - (pas_backend_file_load_uri): don't report_writable here, - add_client does it. was only needed before because of the - improper ordering in pas-book-factory.c above. - -2001-11-09 Chris Toshok <toshok@ximian.com> - - [ Fixes Ximian bug #14646 ] - * gui/component/addressbook.c (addressbook_default_book_open): new - function. if the default_book failed to load, load the local - addressbook in its place. - addressbook_load_default_book): if we're loading the default_book - uri, use addressbook_default_book_open as the open_response. - - * backend/ebook/e-book.c (e_book_load_uri_step): reset the - load_state to NotLoaded so we can attempt another load_uri on - the book if it fails. - -2001-11-08 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (impl_destroy): Explicitly destroy entries. Part of the fix for - the lingering completion window bug. - -2001-11-04 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c: Use ordering of the pilot's phone - label list to find fields we sync in order to avoid strcmp'ing the - pilot's labels rendering phone syncing usable only for english - language pilots - -2001-11-03 Chris Toshok <toshok@ximian.com> - - [ Fixes Ximian bug #14410 ] - * gui/contact-editor/e-contact-editor.c (e_contact_editor_init): - init in_async_call to FALSE. - (card_added_cb): turn the UI back on and set in_async_call to - FALSE. - (card_modified_cb): same. - (card_deleted_cb): same. - (save_card): turn off the UI by setting the dialog insensitive, - and set in_async_call to TRUE. - (delete_cb): same. - (app_delete_event_cb): if we're in an async call don't let the - window get deleted. - - * gui/contact-editor/e-contact-editor.h (struct _EContactEditor): - add in_async_call flag for when we make a wombat call and need to - disable the UI. - - * gui/contact-list-editor/e-contact-list-editor.c - (e_contact_list_editor_init): init in_async_call to FALSE. - (list_added_cb): turn the UI back on and set in_async_call to - FALSE. - (list_modified_cb): same. - (list_deleted_cb): same. - (save_card): turn off the UI by setting the dialog insensitive, - and set in_async_call to TRUE. - (delete_cb): same. - (app_delete_event_cb): if we're in an async call don't let the - window get deleted. - - * gui/contact-list-editor/e-contact-list-editor.h (struct - _EContactListEditor): add in_async_call flag for when we make a - wombat call and need to disable the UI. - -2001-11-02 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-simple.c (e_card_simple_get): Check for - NULL dates before converting them to strings. Fixes Ximian bug - #14394. - -2001-11-02 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (impl_destroy): Leak select-names related data structures until - the memory management issues get sorted out. Fixed bug #14086. - -2001-10-31 Christopher James Lahey <clahey@ximian.com> - - * gui/component/e-cardlist-model.c, - gui/component/select-names/e-select-names-table-model.c, - gui/widgets/e-addressbook-table-adapter.c: Make the pre_changes - and changes match here. - -2001-10-31 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_destroy): Check that local_listener and - other_contacts_listener are non-NULL before - disconnecting/unrefing. - - * gui/component/select-names/e-select-names-manager.c - (entry_destroyed): The entry shouldn't unref the manager. - (e_select_names_manager_create_entry): The entry shouldn't hold a - ref to the manager. It becomes circular. - (e_select_names_manager_create_entry): On the other hand, we - should hold a ref to the entry we create. - - * gui/component/select-names/e-select-names-bonobo.c - (impl_destroy): Remove the explicit dialog destroy hack. - -2001-10-30 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (impl_destroy): Force the select names dialog to be destroyed. - This is a hack to fix bug #14002 -- I'll clean up the refcounting - issues post-freeze. At least now it won't crash. - -2001-10-30 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (ecard_from_remote_record): make sure - to translate the character sets of the names - -2001-10-30 JP Rosevear <jpr@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (manager_ok_cb): send a null bonobo arg to prevent explosion - -2001-10-30 JP Rosevear <jpr@ximian.com> - - * gui/widgets/e-addressbook-view.c: correct include typo - -2001-10-29 Jon Trowbridge <trow@ximian.com. - - * gui/widgets/e-minicard.c (add_field): Five characters, not four! - - * gui/widgets/e-addressbook-table-adapter.c - (addressbook_value_at): Convert xml-ified destinations into proper - addresses. - -2001-10-29 Jon Trowbridge <trow@ximian.com. - - * gui/component/select-names/e-select-names-bonobo.c (init): - Connect to manager's "ok" signal. - (manager_ok_cb): Emit "ok" bonobo-signal. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_class_init): Added "ok" signal. - (e_select_names_clicked): Emit 'ok' signal. - -2001-10-29 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-util.c - (e_addressbook_prompt_save_dialog): new function, a "Do you want - to save changes?" dialog. - - * gui/widgets/e-addressbook-util.h: add prototype for - e_addressbook_prompt_save_dialog. - - * gui/contact-editor/e-contact-editor.c (prompt_to_save_changes): - call e_addressbook_prompt_save_dialog and save the card if they - select save. return TRUE if the dialog should be closed, FALSE - otherwise. - (file_close_cb): check prompt_to_save_changes before closing the - dialog. - (app_delete_event_cb): same. - - * gui/contact-list-editor/e-contact-list-editor.c - (prompt_to_save_changes): call e_addressbook_prompt_save_dialog - and save the card if they select save. return TRUE if the dialog - should be closed, FALSE otherwise. - (file_close_cb): check prompt_to_save_changes before closing the - dialog. - (app_delete_event_cb): same. - -2001-10-29 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (add_objectclass_mod): overload - this function for modifying objectclasses too, so we can make sure - evolutionPerson shows up in the objectclasses of an entry if it - shows up in the schema for the server. - (create_card_handler): add @replace = FALSE in the call to - add_objectclass_mod. - (modify_card_handler): call add_objectclass_mod with @replace = - TRUE. - (anniversary_compare): fix typo - return "equal", not "TRUE". - (birthday_compare): same. - -2001-10-29 Jon Trowbridge <trow@ximian.com> - - * conduit/address-conduit.c (pre_sync): Comment out spew. - - * gui/contact-list-editor/e-contact-list-editor.c (fill_in_info): - Comment out spew. - - * gui/component/addressbook-component.c - (destination_folder_handle_drop): Comment out spew. - (get_dnd_selection): Comment out spew. - - * gui/widgets/e-addressbook-table-adapter.c - (addressbook_set_value_at): Comment out spew. - -2001-10-29 Jon Trowbridge <trow@ximian.com> - - * gui/component/addressbook.c (update_command_state): Check that - our BonoboUIComponent has a container so we don't get a lot of - annoying debug spew. - - * printing/smallbook.ecps: Fixed fonts. - - * printing/phonelist.ecps: Fixed fonts. - - * printing/medbook.ecps: Fixed fonts. - - * printing/e-contact-print.c (e_contact_get_card_size): Commented - out spew. - - * gui/widgets/e-minicard.c (remodel): Check that e_minicard->card - != NULL. - -2001-10-29 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_destroy): We were using - book_data->book_view immediately after unrefing it. Reordered the - code a bit to avoid this. - -2001-10-29 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book-factory.h: add prototype for - pas_book_factory_dump_active_backends. - - * backend/pas/pas-book-factory.c - (pas_book_factory_dump_active_backends): new function. - (dump_active_server_map_entry): new function. - -2001-10-29 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (make_match): Drop a match if either of the text fields is NULL. - This could happen if any of the utf-8 involved is invalid, for - example. (Bug #13757) - -2001-10-29 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (is_syncable): fix bug that allowed - for phone's not to be in priority order and the item to still be - syncable - - * conduit/address-conduit-config.h - (addrconduit_load_configuration): get management by id - -2001-10-29 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (is_syncable): a card also needs to - have its phone nums in priority order to be "syncable" - -2001-10-29 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (is_syncable): move the syncable - checking code to a different function - (ecard_from_remote_record): set the name parts individually - (local_record_from_ecard): use is_syncable - -2001-10-29 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-simple.c (file_as_get_style, - file_as_set_style): Use the actual ECardName in the ECard instead - of parsing the full_name here. - -2001-10-29 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h - (e_card_simple_set_name): New function to set the ECardName on - this card and fix the file_as if necessary. - -2001-10-29 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h - (e_card_simple_get): Handle returning dates here. - (e_card_simple_get_allow_newlines): New function. Returns whether - it makes much sense to have newlines in this string. - - * gui/component/addressbook-config.c, - gui/component/addressbook-config.h - (addressbook_create_new_source): The first argument here should - be const. - - * gui/component/addressbook-storage.c: Added #include - "addressbook-config.h". - - * gui/widgets/e-minicard-label.c (e_minicard_label_event): On an - escape here, cancel editing and remove the focus from the text. - - * gui/widgets/e-minicard.c (add_field): Set allow_newlines here. - (field_activated): Stop editing on the activate signal and remove - the focus from the text. Fixes Ximian bug #12286. - -2001-10-28 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.h: tidy - - * conduit/address-conduit-config.h: ditto - - * conduit/address-conduit.c (add_record): unref ecard when done - -2001-10-28 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-card.c (e_card_date_from_string): Expose this - function. - (e_card_date_to_string): ...and this one. Fixes build problem in - pas-backend-ldap.c. - -2001-10-28 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_hookup_shell_listeners): Change "this should never - happen" dialog to not give my name/e-mail. Sorry translators. - But this really should never happen, thanks to my fix below. - - * gui/component/addressbook-component.c: Initialize - global_shell_client to NULL. (Bug #6625) - -2001-10-27 Chris Toshok <toshok@ximian.com> - - [ bug #12979 ] - * backend/pas/pas-backend-ldap.c (anniversary_populate): new - function. - (anniversary_ber): new function. - (anniversary_compare): new function. - (birthday_populate): new function. - (birthday_ber): new function. - (birthday_compare): new function. - -2001-10-27 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_destroy): free up all the book_data - list stuff. - (e_select_names_completion_got_book_view_cb): deal with book_data - being passed as the closure, and increment the - pending_completion_seq counter. - (e_select_names_completion_card_added_cb): deal with book_data - being passwd as the closure. - (e_select_names_completion_seq_complete_cb): same, and decrement - the pending_completion_seq if we haven't gotten one for this book - view before. - (e_select_names_completion_stop_query): cancel all the - book_data's. - (e_select_names_completion_start_query): use the books_not_ready - counter instead of book_ready. also, do e_book_get_book_view on - each of the book's in our list. - (e_select_names_completion_do_query): change to deal with our - list. - (e_select_names_completion_book_ready): decrement the - book_not_ready counter. - (e_select_names_completion_new): add the book we're created with - to our list. - (e_select_names_completion_add_book): implement. - - * gui/component/select-names/e-select-names-completion.h: add - prototype for e_select_names_completion_add_book. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_new): use addressbook_config_data, and - don't unref the db. - (e_select_names_manager_create_entry): always add NULL for a book - (which corresponds to the local book), and if the completion_book - is present, add it to the list of books to complete again. - -2001-10-27 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-quick-add.c (merge_cb): change to - EBookCallback signature, and unref the book. - (quick_add_merge_card): use addressbook_load_default_book. - (ce_have_book): change to EBookCallback signature, and unref the - book. - (edit_card): use addressbook_load_default_book. - - * gui/component/e-address-popup.c (email_table_save_card_cb): - change to EBookCallback signature, and unref the book. - (add_card_idle_cb): use addressbook_load_default_book, and call - the cb if it fails. - (e_address_popup_cleanup): fix type -- should be "pop->card = - NULL", not "pop = NULL". - (contact_editor_cb): change to EBookCallback signature. - (edit_contact_info_cb): use addressbook_load_default_book. - (start_query): change to EBookCallback signature. - (e_address_popup_query): use addressbook_load_default_book. - - * gui/widgets/e-minicard-control.c (book_open_cb): change to - EBookCallback signature, and unref the book. - (save_in_addressbook): use addressbook_load_default_book instead - of e_book_use_local_address_book. - - * gui/widgets/Makefile.am (INCLUDES): change includes since we're - including addressbook.h which has it's own set of funky include - path requirements. - -2001-10-27 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-book.c (activate_factories_for_uri): Don't leak - stuff. (Bug #13709) - -2001-10-27 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-destination.c (name_and_email_simple_query_cb, - nickname_simple_query_cb): Set book_uri when cardification occurs. - -2001-10-27 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_add_section): Turned off use_ellipsis (it breaks - emulate_label_resize) and on emulate_label_resize. Fixes Ximian - bug #13693. - -2001-10-27 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (make_match): Doh! We should be sorting our contacts so that the - most frequently used ones are at the top of the list, not the - bottom. - - * backend/pas/pas-book.c (pas_book_check_queue): That should be a - bonobo_object_unref, not a gtk_object_unref. - (pas_book_queue_request): Likewise, we need to bonobo_object_ref - here. - (pas_book_destroy): If our pas_book_check_queue timeout is still - active, disable it. This should never happen, but it never hurts - to be careful. - (pas_book_destroy): Set book->priv to NULL after we free it. - -2001-10-27 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (local_record_from_ecard): copy phone - labels and show phone as well, clear correct entry text and - correctly detect unsyncable cases - -2001-10-27 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (local_record_from_ecard): touch the - record on lookup - (check_for_slow_setting): write touched only if we are doing a - slow sync - (card_removed): don't touch on lookup - (match): touch on lookup - -2001-10-27 Jon Trowbridge <trow@ximian.com> - - * backend/pas/pas-book.c (pas_book_check_queue): Added paranoid - reentrancy guards. - (pas_book_queue_request): Changed our idle handler into a timeout, - so as to work w/ reentrancy guards. - (pas_book_init): Explicit initialization. - -2001-10-26 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.h: add prototypes for - addressbook_config_database, and addressbook_load_default_book. - - * gui/component/addressbook.c (addressbook_config_database): new - function, so we aren't activating the db everywhere we need to use - it. - (addressbook_load_default_book): load the default book, after - getting the uri from bonobo-config. - -2001-10-26 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-book-util.c (simple_query_card_added_cb): Return - on cancellation. - (simple_query_sequence_complete_cb): Act if not cancelled. - (simple_query_book_view_cb): Free & return on cancellation. - (e_book_simple_query_cancel): Set cancellation flag. - - * gui/component/e-address-popup.c (e_address_popup_query): Hold a - reference to ourselves for the duration of our addressbook fetch. - (start_query): Release when we've fetched our addressbook. - (e_address_popup_cleanup): Break out most of what we do in - _destroy into a separate function. - (e_address_popup_destroy): Class cleanup. - (contact_editor_cb): Paranoid clean-up. - (add_contacts_cb): Paranoid clean-up. - (e_address_popup_ambiguous_email_add): Paranoid clean-up. - -2001-10-26 JP Rosevear <jpr@ximian.com> - - * conduit/e-address.conduit.in: remove the merges as valid sync - types - - * conduit/address-conduit.c (pre_sync): write out only the touched - records if we are doing copies - - * conduit/address-conduit-config.h - (addrconduit_load_configuration): get the sync type - -2001-10-26 Jon Trowbridge <trow@ximian.com> - - * gui/component/e-address-popup.c (e_address_popup_destroy): - Cancel any pending queries. - - * gui/contact-editor/e-contact-editor.c (close_dialog): Don't - assert, but check if ce->app != NULL, since this function can - (apparently) get called multiple times. - - * gui/contact-editor/e-contact-save-as.c (file_exists): Remove bad - dialog ref-counting crap. - - * gui/contact-editor/e-contact-editor.c (save_card): Ref our - EContactEditor, since we are holding a pointer to it in - EditorCloseStruct. - (card_modified_cb): Unref our EContactEditor when we free our - EditorCloseStruct. - (card_added_cb): Unref our EContactEditor when we free our - EditorCloseStruct. - -2001-10-26 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (check_for_slow_setting): make debug - info more accurate - -2001-10-26 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (e_addr_context_destroy): prevent - double unref - (cursor_cb): correct typo - (card_removed): remove the card from the map if was archived and - is now deleted - -2001-10-26 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.h: new member - - * conduit/address-conduit.c (print_remote): free the struct after - using it - (e_addr_context_new): make consistent with other conduits - (e_addr_context_destroy): properly destroy the context - (cursor_cb): no need to ref the card, its done for us - (clear_entry_text): util function to free a field - (free_local): free a local record - (local_record_to_pilot_record): use a static buffer so we don't - have to free it later - (local_record_from_ecard): only fill in the fields we might not - sync, clear a field before replacing the contents - (for_each): track locals - (for_each_modified): ditto - (free_match): use free_local - -2001-10-26 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-minicard.c, gui/widgets/e-minicard.h - (set_has_cursor): Added has_cursor argument. Setting the argument - to TRUE if the minicard doesn't have focus will grab the focus. - Fixes Ximian bug #3024. - -2001-10-24 Jon Trowbridge <trow@ximian.com> - - * gui/component/addressbook-factory.c (main): Initialize - gnome-vfs. - - * gui/component/addressbook-component.c (xfer_file): Added. - (Copied from the calendar.) - (xfer_folder): Fixed to allow renaming of contact folders. - -2001-10-24 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_class_init): Removed key_press handler here - since delete and backspace are now handled by keybindings. - -2001-10-23 Jon Trowbridge <trow@ximian.com> - - * gui/component/addressbook.c: Fix command paths when we specify - our pixmaps, so we don't get a lot of totally useless & very ugly - bonobo-ui spew. - - * backend/ebook/e-book-util.c (e_book_nickname_query): The empty - string as an arg shouldn't generate a warning. - - * gui/component/select-names/e-select-names-completion.c: Removed - our cancelled flag and e_select_names_completion_cancel function, - since we were just duplicating stuff that had ended up in - ECompletion. - (match_name): Form our menu_text properly on an additional-name - match. - (e_select_names_completion_got_book_view_cb): Store handles for - our signals, disconnect them properly when we switch book views. - (e_select_names_completion_stop_query): Disconnect signals when we - stop our query. - (check_capabilities): Spew if we are using LDAP for completion. - (e_select_names_completion_destroy): Disconnect our signals when - we destroy. - This all should fix bug #10241. - -2001-10-23 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_add_section): Set "draw_button" argument to TRUE - on this EEntry. - -2001-10-22 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/e-contact-save-as.c (save_it): Put up an - error dialog if there's an error while saving. If the person hits - cancel on the "file exists" dialog, don't close the file selection - dialog. Fixes Ximian bug #7055. - -2001-10-21 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-reflow-adapter.c - (model_and_selection_free): right_click_up here when we let go of - the popup. - - * gui/widgets/e-minicard-view.c (e_minicard_view_selection_event): - right_click_up here. - -2001-10-21 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_add_section, e_select_names_set_default): Use an - EEntry here instead of a GtkLabel. Fixes Ximian bug #7067. - -2001-10-21 Jon Trowbridge <trow@ximian.com> - - * gui/component/addressbook.c (control_activate_cb): Call - e_addressbook_model_force_folder_bar_message when we activate the - component. (Fixes bug #11749) - - * gui/widgets/e-addressbook-model.c - (e_addressbook_model_force_folder_bar_message): Added. Forces - emission of a folder_bar_message. - -2001-10-20 Larry Ewing <lewing@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_set_default): stick with the style font if the - efont bold font does not exist. - (e_select_names_set_default): don't forget to unref the oldstyle. - -2001-10-20 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (name_style_query): Fix memory leak. - - * gui/widgets/e-addressbook-view.c (jump_to_letter): Free our - string vector letter_v when we are done with it. - - * gui/contact-editor/e-contact-quick-add.c (edit_card): Unref our - QuickAdd structure. - - * gui/component/e-address-popup.c (e_address_popup_construct): - Unref our style after we are done with it. - -2001-10-20 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-book.c (activate_factories_for_uri): We - shouldn't leak the info returned by oaf_query. - - * gui/contact-editor/e-contact-quick-add.c (card_added_cb): Remove - superfluous call to quick_add_unref. - (editor_closed_cb): Remove superfluous call to quick_add_unref. - - * gui/component/select-names/e-select-names.c (esn_get_key_fn): We - need to unref the card returned by e_addressbook_model_get_card. - -2001-10-20 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c: Make LDAP servers - non-user-creatable. - -2001-10-20 Jon Trowbridge <trow@ximian.com> - - * printing/e-contact-print.c (e_contact_print_card): Check that the - string we are checking for xml-ness is non-NULL. - - * backend/ebook/e-destination.c (e_destination_importv): Filter - out empty destinations. (also Bug #13036) - - * printing/e-contact-print.c (e_contact_build_style): Use - gnome_font_new_closest; if gnome_font_new fails and returns NULL, - our spacing gets all messed up. (Bug #10785) - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_can_print): - Allow printing if there are any cards in our view. The selection - has nothing to do with it. - - * backend/ebook/e-destination.c (e_destination_is_empty): Check - for strings that contain non-whitespace, rather than just looking - for a non-zero first character. (Bug #13036) - -2001-10-20 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-minicard-view.c (e_minicard_view_selection_event): - Handle focus_change in event by selecting that contact. Fixes - Ximian bug #3024. - - * gui/component/addressbook-component.c (owner_unset_cb): - Repeatedly call gtk_main_quit here as long as there is a main loop - around. This is an ugly hack around Ximian bug #11760. - -2001-10-20 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c: Added #include - <gal/widgets/e-unicode.h>. - - * gui/widgets/e-minicard-control.c: Made this display the number - of extra cards in the attachment as well as made it save them all - to the local addressbook if the person selects the button. Fixes - Ximian bug #9507. - -2001-10-20 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-minicard.c (e_minicard_event): Changed this to not - grab on a right click. Fixes Ximian bug #12660. - -2001-10-19 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c - (destination_folder_handle_motion): Get @folder_type here too [to - match the changes in the EvolutionShellComponentDnd interface]. - Also, remove a debugging message. - (destination_folder_handle_drop): Likewise. - -2001-10-18 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names.c (add_menu_item): - Translate labels in select-names option menu. (Bug #9604) - - * gui/search/e-addressbook-search-dialog.c - (e_addressbook_search_dialog_init): Made the default window size - slightly wider. (Bug #7516) - -2001-10-18 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card.c, backend/ebook/e-card.h - (e_card_list_get_vcard): Made this take a const GList. - -2001-10-18 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (check_capabilities): Added. Check if our book is local or - networked. - (e_select_names_completion_book_ready): Call check_capabilities. - (e_select_names_completion_new): Call check_capabilities. - (e_select_names_completion_do_query): If we have a networked book, - keep trying if we haven't been able to cache any cards --- our - earlier attempts could have failed due to too many matches. (Bug - #12932) - - * gui/component/select-names/e-select-names-manager.c - (focus_out_cb): Lag our cardification on focus-out. This seems to - help with the unintended cardifications that can result from the - weird focus-out/focus-in events that get generated when the popup - disappears. - - * backend/ebook/e-card-compare.c: Removed some debug spew. - -2001-10-17 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.c (addressbook_source_dialog): - grab focus in the Account entry when preparing the dialog, fixes - #10406. - -2001-10-17 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names.c (new_folder): make - sure to also add "ldap-contacts" folders to the option menu. - -2001-10-17 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (ecard_from_remote_record): sync all - the fields we can, with out overwriting - (local_record_from_ecard): write the fields to the pilot in - priority order unless there are fields on the pilot we can't - store, then fill in the fields as they are on the pilot - -2001-10-17 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card.c (e_card_get_vobject): Did a bit of clean - up here. Might fix some crashes, specifically Ximian bug #10164. - - * gui/widgets/e-addressbook-view.c (SPEC): Updated the model - column numbers here. Fixes Ximian bug #12308. - -2001-10-17 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_upgrade_db): - add upgrade from 0.1 to 0.2, where we make sure id dbt's match - vcard id's, fixes longstanding bug (#7406) where cards were not - modifiable or removable after having been created during a 1-2 - week long window in early betas. - (PAS_BACKEND_FILE_VERSION): change to 0.2 - (PAS_ID_PREFIX): #define this here. - (pas_backend_file_create_unique_id): use PAS_ID_PREFIX instead of - the string. - -2001-10-16 Iain Holmes <iain@ximian.com> - - * backend/ebook/evolution-ldif-importer.c (support_format_fn): Return - FALSE if no extension. - -2001-10-16 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-card.c (e_card_get_id): If card->id is NULL, - return an empty string. - (e_card_set_id): Don't allow the card id to be set to NULL; use - the empty string instead. - (e_card_get_vobject): When building our vcard, pass in the empty - string as the id if card->id is NULL. (Bug #10164) - -2001-10-16 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (local_record_from_ecard): don't set - the phone info if it is blank - (ecard_from_remote_record): save up to 3 fax numbers - -2001-10-15 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_add_client): - unref the book after we pass it off to evolution-addressbook. - -2001-10-15 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (create_card_dtor): unref - op->view. - (pas_backend_ldap_process_create_card): ref op->view. - (remove_card_dtor): unref op->view. - (pas_backend_ldap_process_remove_card): ref op->view. - (modify_card_dtor): unref op->view. - (pas_backend_ldap_process_modify_card): ref op->view. - (ldap_search_dtor): unref op->view. - (pas_backend_ldap_search): ref op->view. - -2001-10-15 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_get_book_view): make sure to unref the - book_view here so we don't leak them. - -2001-10-12 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-factory.c (main): call - e_passwords_init and e_passwords_shutdown. - -2001-10-15 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card.c (addPropValueQP, addPropValueSets, - e_card_get_vobject): Properly decide whether a property needs to - be marked as QP by searching for '\n'. Fixes Ximian bug #3021. - -2001-10-15 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/e-contact-save-as.c (e_contact_save_as, - e_contact_list_save_as): Set the default file name here. Fixes - Ximian bug #7053. - -2001-10-14 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_hookup_shell_listeners): Added linebreaks to our - "this shouldn't happen" dialog message. (Bug #12498) - -2001-10-12 Jon Trowbridge <trow@ximian.com> - - * gui/component/addressbook-factory.c (main): Add a component name - to the e_passwords_init() call. - -2001-10-12 Chris Toshok <toshok@ximian.com> - - * backend/ebook/evolution-ldif-importer.c: commit the importer - originally from Michael M. Morrison, with fixups by toshok. - - * backend/ebook/Makefile.am (bin_PROGRAMS): add - evolution-ldif-importer. - (oaf_in_files): add - GNOME_Evolution_Addressbook_LDIF_Importer.oaf.in. - - * backend/ebook/e-card-simple.h: add WANTS_HTML and IS_LIST. - - * backend/ebook/e-card-simple.c (field_data): add WANTS_HTML and - IS_LIST. - (e_card_simple_set): fix typo. - - * backend/ebook/.cvsignore: ignore - GNOME_Evolution_Addressbook_LDIF_Importer.oaf and - evolution-ldif-importer. - - * backend/ebook/GNOME_Evolution_Addressbook_LDIF_Importer.oaf.in: - ldif importer oafinfo. - -2001-10-12 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - Added a boolean type here. - -2001-10-12 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names.c - (addressbook_model_set_uri): Check to see if the uri we are - setting is the same as the current uri. If so, do nothing. - (Bug #11324) - -2001-10-11 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-destination.c - (e_destination_reverting_is_a_good_idea): Added. Heuristic for - whether or not we want to revert to an earlier cardified state. - (e_destination_cardify): Don't be quite as aggressive about - reverting to previous cardified states. (Bug #11890) - -2001-10-11 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-simple.c (e_card_simple_destroy, - fill_in_info, e_card_simple_sync_card, e_card_simple_set_phone, - e_card_simple_set_address, e_card_simple_set_delivery_address, - file_as_get_style, file_as_set_style, e_card_simple_set, - e_card_simple_set_arbitrary), - gui/contact-editor/e-contact-editor-address.c - (e_contact_editor_address_destroy, - e_contact_editor_address_set_arg, - e_contact_editor_address_get_arg), - gui/contact-editor/e-contact-editor-fullname.c - (e_contact_editor_fullname_destroy, - e_contact_editor_fullname_set_arg, - e_contact_editor_fullname_get_arg), - gui/contact-editor/e-contact-editor.c (phone_entry_changed, - address_text_changed, name_entry_changed, full_name_clicked, - full_addr_clicked, fill_in_info): Changed these to use the new ref - and unref functions for ECard auxillary types. - - * backend/ebook/e-card-simple.h: Added a comment. - - * backend/ebook/e-card-types.h: Added ref_count field to all the - types. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added ref and - unref functions here for all the ECard auxillary types. Removed - the corresponding free functions. Switched to using these - functions where appropriate. - - * gui/component/addressbook-factory.c: #include - <e-util/e-passwords.h> - - * gui/component/addressbook.c (load_uri_cb): const correctify. - - * gui/component/select-names/e-select-names-manager.c, - gui/component/select-names/e-select-names.c: #include - <addressbook/gui/component/addressbook.h> - - * gui/widgets/e-addressbook-model.c (modify_card): Removed an - unnecessary ref here. - -2001-10-11 Dan Winship <danw@ximian.com> - - * gui/component/select-names/e-select-names.c (update_folder): - Don't need this any more. - -2001-10-11 Jon Trowbridge <trow@ximian.com> - - * gui/component/addressbook.c (new_contact_cb): Check that - view->view != NULL. - (save_contact_cb): Check that view->view != NULL. - (search_cb): Check that view->view != NULL. - (delete_contact_cb): Check that view->view != NULL. - (print_cb): Check that view->view != NULL. - (print_preview_cb): Check that view->view != NULL. - (stop_loading_cb): Check that view->view != NULL. - (cut_contacts_cb): Check that view->view != NULL. - (copy_contacts_cb): Check that view->view != NULL. - (paste_contacts_cb): Check that view->view != NULL. - (select_all_contacts_cb): Check that view->view != NULL. - (send_contact_cb): Check that view->view != NULL. - (send_contact_to_cb): Check that view->view != NULL. - (update_command_state): Check that view->view != NULL. Hold a - reference to the AddressbookView for the duration of the function, - in case we exit during bonobo-reentrancy. - (addressbook_view_ref): Added. - (addressbook_view_unref): Added. Simple ref counting for - AddressbookView objects. - (addressbook_view_clear): Zero out an AddressbookView. This is - now separated from the deallocation of the AddressbookView object, - so that we don't leave a dangling pointer if we exit during - bonobo-reentrancy in update_command_state. (Which often seems to - happen if we exit while addressbook operations are going on.) - (destroy_callback): Replace previous call to addressbook_view_free - with addressbook_view_clear/addressbook_view_unref calls. - (addressbook_factory_new_control): Initialize the reference count - in the AddressbookView object. - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_destroy): - Carefully zero out our destroyed object. - (command_state_change): Hold a reference to ourselves during the - signal emission. - (get_selected_cards): Ref cards as we add them to the list. - (e_addressbook_view_stop): Check for view != NULL. - (e_addressbook_view_can_create): Check for view != NULL. - (e_addressbook_view_can_print): Check for view != NULL. - (e_addressbook_view_can_save_as): Check for view != NULL. - (e_addressbook_view_can_send): Check for view != NULL. - (e_addressbook_view_can_send_to): Check for view != NULL. - (e_addressbook_view_can_delete): Check for view != NULL. - (e_addressbook_view_can_cut): Check for view != NULL. - (e_addressbook_view_can_copy): Check for view != NULL. - (e_addressbook_view_can_paste): Check for view != NULL. - (e_addressbook_view_can_select_all): Check for view != NULL. - (e_addressbook_view_can_stop): Check for view != NULL. - - * gui/widgets/e-addressbook-model.c (addressbook_destroy): Be - careful about zeroing out our destroyed object. - - * backend/ebook/e-book-view.c (e_book_view_stop): Added. Stops - event processing in the underlying listener. - -2001-10-10 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_destroy): If our select names dialog is - still around, destroy it. Otherwise, the dialog will hang around - after our composer goes away. - -2001-10-06 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.glade: add an Email Address - field/label/help text. - - * gui/component/addressbook-config.c - (addressbook_source_dialog_set_source): fill in the email entry - from the source. also, set the initial state of the email - label/entry. - (auth_checkbutton_changed): set the email label/entry - sensitive/editable if auth is turned on, and - insensitive/uneditable if it's off. - (addressbook_source_dialog_get_source): get the email address from - the email entry. - (addressbook_source_dialog): hook up the email entry to the - changed signal foo, as well as the focus handler for displaying - help text. - -2001-10-06 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_new): db isn't a BonoboObject, so don't - bonobo_object_unref it! - -2001-10-05 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names.c - (addressbook_model_set_uri): e_book_load_uri -> - addressbook_load_uri. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_new): e_book_load_uri -> - addressbook_load_uri. - - * gui/component/addressbook.c (forget_passwords_cb): new function, - call e_passwords_forget_passwords. - (verbs): Add ContactsForgetPasswords. - (load_uri_auth_cb): new function, call the callback and free up - our closure stuff. - (load_uri_cb): once the uri is loaded, check if we're configured - to authenticate for it, and do so, using the e_passwords stuff. - (addressbook_load_uri): wrapper around e_book_load_uri. save off - the parameters and start the load-with-auth machinery. - (book_open_cb): remove all the auth stuff from here, as it's - handled elsewhere now. - - * gui/component/addressbook-factory.c (main): call - e_passwords_init. - - * gui/component/addressbook-component.c (user_create_new_item_cb): - e_book_load_uri -> addressbook_load_uri. - (destination_folder_handle_drop): same. - - * gui/component/addressbook.h: add prototype for - addressbook_load_uri (a wrapper around e_book_load_uri that also - handles authentication if the user selects it.) - -2001-10-05 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names.c - (real_add_address_cb): Check to make sure our call to - e_addressbook_model_get_card doesn't return NULL. - - * gui/widgets/e-addressbook-model.c - (e_addressbook_model_get_card): Chek that we aren't requesting a - negative row. - - * gui/contact-list-editor/e-contact-list-editor.c (add_email_cb): - Move to the bottom of the scrolled window, so we can see the - address we just added. - (table_drag_data_received_cb): Move to the bottom of the scrolled - window, so we can see the contact we just dropped. - - * gui/component/addressbook.c (addressbook_factory_new_control): - We don't own the string returned by e_categories_master_list_nth, - so terrible things will happen if we free it. (Bug 10916) - -2001-10-05 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_set_arg): - don't set the editable field on the model - let the book do that. - (book_writable_cb): call writable_status to propagate a ui-change - event up (and sensitize the write-only toolbar buttons after you - authenticate with ldap.) - -2001-10-04 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book.c (activate_factories_for_uri): for some - reason, matching on protocol is causing problems for me. - disabling it for now. - -2001-10-04 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c: use ldap.png for ldap - contacts. - -2001-10-03 Iain Holmes <iain@ximian.com> - - * addressbook/gui/component/addressbook-storage.c - (addressbook_storage_setup): Only load_storages if you have LDAP. - (load_source_data): Only do stuff if you have LDAP. - -2001-10-03 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-reflow-adapter.c (addressbook_height), - gui/widgets/e-minicard.c (remodel): Fixed these to determine the - fields to use properly. - -2001-10-02 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (name_style_query): Strip out commas before forming our query. - (match_name): Use e_card_compare_name_to_string_full, rather - than our crufty old matching code. Not only is this cleaner, - but that crufty old code was very broken when it came to - handling strings with whitespace. (Bug 8988) - (match_nickname): utf8 and bug fixes. - - * backend/ebook/e-card-compare.c - (e_card_compare_name_to_string_full): Added. This is basically - e_card_compare_name_to_string with a bunch of extra options, so - that it can more readily be reused in other contexts. - (e_card_compare_name_to_string): This is now just a call to - e_card_compare_name_to_string_full with the extra args filled in - to defaults that simulate the old behavior. - -2001-10-02 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book.c (e_book_construct): remove most of the - oaf stuff from here. we do it in load_uri, where we'll have more - information (namely, the protocol we're using.) - (activate_factories_for_uri): do an oaf query to get a list of all - objects implementing our BookFactory interface and also supporting - the protocol used in the uri. - (e_book_load_uri): try activating book factories to handle this - uri, and start the iteration over the list. - (e_book_load_uri_from_factory): try and load the uri. - (e_book_load_uri_open_cb): callback function for the - BookFactory_openBook call - if it succeeds, call the user's - callback. otherwise step to the next factory. - (e_book_load_uri_step): go to the next factory in our list, and - error out if there are no more. - -2001-10-02 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_get_textification): Made the max length of - the textification be 2047 characters. Fixes Ximian bug #3021. - -2001-10-01 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (ecard_from_remote_record): if there - was no first name or last name, file as the company. - -2001-10-01 JP Rosevear <jpr@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_changes_foreach_key): if there is a db error, - assume deletion - (pas_backend_file_changes): write after all is done for efficiency - -2001-09-28 JP Rosevear <jpr@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_changes_foreach_key): g_strdup - (pas_backend_file_changes): ditto, make sure to free all data and - do a hash write after each add/remove - - * conduit/address-conduit.c (local_record_to_pilot_record): use - the local record category - (local_record_from_ecard): ndle the fields and category we don't - sync by making sure we don't overwrite them - -2001-09-27 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book.c (e_book_construct): do an oaf query to - get a list of all objects implementing our BookFactory interface, - instead of just activating the one IID. this should really be a - global list, not a per EBook. - (e_book_load_uri): start the iteration over our list of - BookFactory's. - (e_book_load_uri_from_factory): try and load the uri. - (e_book_load_uri_open_cb): callback function for the - BookFactory_openBook call - if it succeeds, call the user's - callback. otherwise step to the next factory. - (e_book_load_uri_step): go to the next factory in our list, and - error out if there are no more. - -2001-09-27 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (local_record_from_ecard): use the old - record (if there was one) so as not to overwrite fields we don't - sync - (pre_sync): store the dbi in the context and don't make it object - data - -2001-09-26 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book-factory.c (pas_book_factory_destroy): use - priv->iid instead of the hardcoded string here. - (pas_book_factory_activate): parameterize the factory's iid, as in - the calendar server, and provide a default if iid == NULL. - - * backend/pas/pas-book-factory.h: add iid parameter for - pas_book_factory_activate. - -2001-09-26 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-destination.c (e_destination_get_textrep): Use - camel_address_format, not camel_address_encode. - -2001-09-26 Anna Marie Dirks <anna@ximian.com> - - * gui/contact-editor/contact-editor.glade: Added help text (thanks - to Aaron) and re-worded the labels, and fixed the shortcuts on the - brand-spanking-new Collaboration tab. - - -2001-09-26 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-manager.h: add - completion_book. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_new): get /Addressbook/Completion/uri, and - if it's present, use the corresponding EBook for completing - addresses. - (focus_out_cb): use manager->completion_book here instead of NULL, - which corresponds to the local addressbook. - (completion_popup_cb): same. - (e_select_names_manager_create_entry): same. - -2001-09-26 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-card-compare.c (e_card_compare_name_to_string): - Properly handle names when the individual elements (given, - addition, family) contain whitespace. (Bug #10502) - - * backend/ebook/e-destination.c (e_destination_set_name): Reset - textrep when we change the name. - (e_destination_set_email): Reset textrep when we change the email. - (e_destination_get_textrep): Make sure that the textrep version of - the address is properly quoted if it contains unsafe characters. - (All related to bug #10796) - - * gui/component/select-names/e-select-names-completion.c - (match_nickname): Fix nickname matching. (bug #9698) - (make_match): Use e_completion_match_new when building our match, - rather than ad hoc manipulation of the struct. - -2001-09-26 JP Rosevear <jpr@ximian.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_changes): set - the last_use and use_score fields of the card to known values so - the card doesn't register as changed when only they have changed - -2001-09-26 Peter Williams <peterw@ximian.com> - - * conduit/address-conduit.c (ecard_from_remote_record): Fix this function - to set email addresses properly, and handle multiple occurrences of - email addresses, home phone numbers, and business phone numbers. - -2001-09-25 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook-component.c (user_create_new_item_cb): - Handle creating the new contact in the current folder if it's a - contacts folder. Fixes Ximian bug #7814. - -2001-09-24 Chris Toshok <toshok@ximian.com> - - * backend/pas/Makefile.am (LDAP_SCHEMA): add - evolutionperson.schema - (EXTRA_DIST): add LDAP_SCHEMA to the dist (but don't install it). - -2001-09-23 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (ecard_from_remote_record): sync the - note the to pilot and make sure to blank fields when appropriate - (local_record_from_ecard): sync the note to the desktop - -2001-09-22 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c (do_create): g_free (id) in the - error case to plug a memory leak. - -2001-09-22 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard.c (remodel): when creating the cards, - don't display any of the subname fields (surname, given, middle, - suffix, etc.) - -2001-09-22 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-card-simple.c - (e_card_simple_get): add getters for the additional name fields. - (field_data): move FAMILY_NAME to the end of the list, and add - GIVEN_NAME, ADDITIONAL_NAME (middle name), and NAME_SUFFIX. - - * backend/ebook/e-card-simple.h: same. - -2001-09-21 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook.c (print_preview_cb): Hooked up print - preview button. - - * gui/widgets/e-addressbook-view.c, - gui/widgets/e-addressbook-view.h - (e_addressbook_view_print_preview): Added this function. - - * printing/e-contact-print.c, printing/e-contact-print.h - (e_contact_print_preview): Added this function. - -2001-09-19 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-destination.c (name_and_email_simple_query_cb): - Use the default e-mail address if we have nothing else to go on. - Previously we just failed, which basically meant that name-only - searches would never work properly. - (nickname_simple_query_cb): The logic was a bit tangled here; if - our query status isn't SUCCESS, always give up but don't leak the - destination. And if our nickname query fails and we try the - name-and-email query, use the textrep for a name-only search. The - only reason we are doing a nickname query in the first place is if - we have an obviously invalid e-mail. - (launch_cardify_query): Use e_destination_is_valid to determine - if we should try a nickname query first. - These changes basically fix bug 7728, and generally make the - auto-cardification of addresses a lot more clever and robust. - - * backend/ebook/e-book-util.c (name_and_email_cb): Use - e_card_compare_name_to_string instead of e_card_name_match_string. - (e_book_name_and_email_query): The arguments to g_strsplit were - in the wrong order. Doh! - - * backend/ebook/e-card-compare.c (e_card_compare_name_to_string): - Added. Replaces e_card_name_match_string, and actually works. - - * backend/ebook/e-card.c: Removed e_card_name_match_string - function, which didn't work particularly well. - -2001-09-19 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (cursor_cb): don't add to the complete - list of cards if the card is a list - (card_added): don't add to the list of changes if the card is a - list - (card_changed): ditto - (card_removed): ditto - -2001-09-19 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_hookup_shell_listeners): Change the "this should - never happen" message into a request for people to e-mail me - directly with info if they encounter that error. - - * backend/ebook/e-book-util.c (e_book_name_and_email_query): - Freeing name[i] instead of namev[i] is a bad idea. (bug #10270) - - * gui/component/select-names/e-select-names-popup.c - (popup_menu_card): Properly handle our GnomeUIInfo labels so that - they won't be leaked if they are dynamic strings, so that they - will be i18n-correct, and so that underscores won't be interpreted - as key accelerators. What a PITA. Also, don't leak our - iterators. (Bug #10200.) - (popup_menu_list): The same GnomeUIInfo tweaking as in - popup_menu_card. - (popup_menu_nocard): Ditto. - -2001-09-18 JP Rosevear <jpr@ximian.com> - - * backend/ebook/e-card-simple.c (field_data): add caluri field data - - * backend/ebook/e-card.c (e_card_get_vobject): add the caluri - property when appropriate - (parse_caluri): handle read caluri - (e_card_class_init): add caluri arg - (e_card_destroy): free the caluri - (e_card_get_arg): return caluri arg - (e_card_set_arg): set caluri from arg - (e_card_init): init caluri to null - - * backend/ebook/e-card-simple.h: new simple field - - * backend/ebook/e-card.h: new member - - * gui/contact-editor/e-contact-editor.c (field_changed): util - callback to change the command state - (set_entry_changed_signal_field): hook up a change signal to above - (set_entry_changed_signals): use above function - - * gui/contact-editor/e-contact-editor.glade: Add collaboration - page and fields - -2001-09-18 JP Rosevear <jpr@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_build_cards_list): create a sexp and check if - the cards match before adding them to the list - (pas_backend_file_process_get_cursor): send extra param - -2001-09-18 Larry Ewing <lewing@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (book_query_process_card_list): unref the destination regardless - of whether we get an email addresss. - -2001-09-17 Larry Ewing <lewing@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (name_style_query): use g_strfreev. - (match_name): s/g_free/g_strfreev. - (match_file_as): s/g_free/g_strfreev. - - * backend/ebook/e-book-util.c (e_book_name_and_email_query): fix - the memory handling here. All there members of the vector need to - be freed all the time. - - * backend/ebook/load-pine-addressbook.c (parse_line): free the - string outside of the test that makes sure there are three - entries. - - * gui/component/select-names/e-select-names-completion.c - (match_nickname): don't malloc a match we will never use. - - * gui/widgets/e-addressbook-model.c (get_view): free the dup'd - capabilities. - -2001-09-17 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-destination.c (e_destination_is_valid): We want - to assume that a destination that comes from a card is - automatically valid, but the right way to check that is by calling - e_destination_from_card, not by checking if dest->priv->card != - NULL. (Fixed bug #10017) - - * gui/component/select-names/e-select-names-completion.c - (match_name): Fixed a stupid bug was causing completion to fail - for contacts who have only one name. (The classic example we all - know and love is 'George <jirka@5z.com>') (bug #8353) - - * backend/ebook/e-card.c (e_card_list_send): Do the right thing if - the card we are trying to send to has no valid e-mail addresses. - (bug #10137) - - * gui/widgets/e-minicard.c (e_minicard_event): Code implicitly - assumed that event->button.button is 1, 2, or 3, causing disaster - when using a wheel-mouse. Fixed. (bug #9400) - -2001-09-16 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (_phone_arrow_pressed): - use enable_widget instead of gtk_widget_set_sensitive. - (_email_arrow_pressed): same. - (_address_arrow_pressed): same. - (disable_widget_foreach): same. - (enable_writable_fields): same. - (set_editable): same. - (enable_widget): new function, using both gtk_widget_set_sensitive - and *_set_editable to allow the user to select text in GtkEntry's - and GtkText's. - - * gui/contact-editor/e-contact-editor-fullname.c - (e_contact_editor_fullname_set_arg): use set_editable as well as - set_sensitive, to allow the user to select text in GtkEntry's. - - * gui/contact-editor/e-contact-editor-address.c - (e_contact_editor_address_set_arg): same. - -2001-09-16 Chris Toshok <toshok@ximian.com> - - * backend/pas/evolutionperson.schema: fix syntax errors (which are - broken, imo...) - -2001-09-16 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-storage.h: reorder the LDAP scopes so - that they match the order of the option menus in the glade file. - - * gui/component/addressbook-config.c (auth_checkbutton_changed): - new function, mostly there to house some #ifdef'ed out code. - (option_menuitem_activated): new function, to keep track of - changes to the ldap scope optionmenu. - (addressbook_source_dialog_set_source): set the menu history as - well as the dialog's copy of the scope. - (addressbook_source_dialog_get_source): fill in the source's scope - from the dialog's copy, and add more #if the_ui_gods_smile_on_me - code. - (add_activate_cb): new function, add an activate callback for the - optionmenu's items. - (addressbook_source_dialog): more #if the_ui_gods_smile_on_me - code, always start the dialog on page 0, and hook up the - scope optionmenu's items. - -2001-09-15 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-card-compare.c (e_card_compare_name): No - loose name matches on family names. (#8802) - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_activate_obj): We can't use NULL as the - first arg for e_addressbook_show_contact_editor anymore. Damn. - (#8535) - - * backend/ebook/e-book-listener.c (e_book_listener_stop): Make - "stop" do nothing but set the stopped flag, as in - e-book-view-listener.c. - (e_book_listener_destroy): Clean up our queue here, rather than in - e_book_listener_stop. - (response_free): Added. Move the rather lengthy bit of code - needed to free a EBookListenerResponse into one place. - (e_book_listener_check_queue): Properly deal with the stopped - flag. - (e_book_listener_queue_response): If the stopped flag is set, just - drop the incoming response. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_stop): Make "stop" do nothing but set the - stopped flag. - (e_book_view_listener_destroy): Move all of the clean-up that used - to be in e_book_view_listener_stop here. This considerably simplifies - the logic required to avoid various race conditions. - (e_book_view_listener_check_queue): Properly deal with the stopped flag. - (e_book_view_listener_queue_response): Drop all incoming responses if - we are stopped. - -2001-09-14 Jon Trowbridge <trow@ximian.com> - - * backend/pas/pas-book.c (pas_book_queue_request): Hold a - reference to the book on behalf of our idle function. - (pas_book_check_queue): When we are finished, drop the reference - we've been holding on behalf of the idle function. - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_create_card): Hold a reference to the - book_view while sending our notifications. - (pas_backend_file_process_remove_card): Hold a reference to the - book_view while sending our notifications. - - * gui/contact-editor/e-contact-quick-add.c (quick_add_unref): Remove - debugging spew. - - * backend/ebook/e-book-util.c: Remove a lot of unused code that - worked around bugs that have long since been fixed. - (simple_query_disconnect): Added. Breaks out the part of - simple_query_free that disconnect signals. - (simple_query_free): Replace code w/ a call to - simple_query_disconnect. - (simple_query_sequence_complete_cb): Call simple_query_disconnect - before executing the callback, so that our callbacks don't get - triggered by any book changes that might occur during that - callback. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_check_queue): Changed to be consistent with - e_book_listener_check_queue. - (e_book_view_listener_queue_response): Also changed to use a - high-frequency timeout. - - * backend/ebook/e-book-listener.c (e_book_listener_check_queue): - OK, I've agonized over this stupid little function, and it should - now be race-free. - (e_book_listener_queue_response): We process our response queue in - a high-frequency timeout rather than an idle. Using an idle - function leads to some tricky race conditions and bad interactions - with bonobo's semi-broken attempts to take over event processing. - (e_book_view_listener_stop): Manually disable our timeout and - clean up. - -2001-09-14 Ettore Perazzoli <ettore@ximian.com> - - [Automake 1.5 fixes pointed out by Richard Boulton - <richard@tartarus.org>, as per #9258.] - - * gui/component/select-names/Makefile.am: Set CLEANFILES directly - instead of using `+='. - - * backend/pas/Makefile.am: Rename `LDAP_BACKEND_SOURCES' to - `LDAP_BACKEND_FILES'. - - * backend/ebook/Makefile.am: Set CLEANFILES directly instead of - using `+='. - -2001-09-13 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_connect): use - ldap_init. ldap_open is deprecated in openldap 2.x. - -2001-09-12 Iain Holmes <iain@ximian.com> - - * backends/ebook/evolution-vcard-importer.c (check_file_is_vcard): - Fix the check. - -2001-09-12 Larry Ewing <lewing@ximian.com> - - * backend/ebook/e-destination.c: free the values that are being - leaked here. - -2001-09-12 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c (match_email): - printf arguments were reversed by mistake. Fixed bug #9693. - -2001-09-09 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-popup.c - (popup_menu_list): Added. Treat right-clicks on a contact list as - a special case. - (e_select_names_popup): Check if we are dealing with a contact - list. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_check_queue): See - e_book_listener_check_queue below. - (e_book_view_listener_queue_response): See - e_book_listener_queue_response below. - - * backend/ebook/e-book-listener.c (e_book_listener_check_queue): - Explicitly prohibit reentrancy. Use gtk-unref rather than - bobobo-unref. - (e_book_listener_queue_response): Hold a gtk-ref to the listener - while the idle function runs, not a bonobo-ref. As far as I can - tell, it is impossible to avoid a race condition here when we have - to worry about bonobo reentrancy. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_insert_length): Alter a copy of the - original EDestination, rather than just using a new one. We need - to do this to preserve prior-card information for possible - reversion later. - (e_select_names_text_model_delete): Ditto. - - * backend/ebook/e-destination.c (e_destination_clear_card): When - clearing a destination where ->card != NULL, store it for possible - reversion later. - (e_destination_revert): If we have an old card stored, go back to - using it for the destination. - (e_destination_is_valid): Tries to detect obviously broken - addresses. - (e_destination_cardify): If our destination is invalid, first try - to cardify simply by reverting to an older card. - (e_destination_destroy): Unref any cached old card. - (e_destination_copy): Copy the old card information. - -2001-09-07 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names.c - (sync_table_and_models): Show all rows in the table, and then - remove the rows that correspond to entries in the - ESelectNamesModels in the children. - (real_add_address): Freeze/thaw our ESelectNamesModel, so that we - don't change our table while we are in the middle of iterating - over the selection. - (remove_address): Just delete the address from the - ESelectNamesModel, the signal handler will do the rest. - (selected_rows_foreach_cb): Call remove_address to do our dirty - work. - (e_select_names_add_section): Connect to the 'changed' signal from - the ESelectNamesModel, and call sync_table_and_models explicitly to - get our initial state correct. - - * gui/component/select-names/e-select-names-table-model.c - (fill_in_info): Deal with EDestinations in our table that don't - come from cards. - - * gui/component/select-names/e-select-names-manager.c: Added - another ESelectNamesModel* to the ESelectNamesManagerSection - struct. Called 'original_model', this contains a copy of the - model as it is when we begin using the SelectNames dialog. - (section_copy): Copy the original model. - (section_free): Free the original model. - (e_select_names_manager_add_section_with_limit): Initialize the - original model. - (e_select_names_clicked): I've changed the semantics of this - dialog quite a bit... no UI freeze can stop me! If OK is clicked, - we do nothing. If Cancel is clicked, we revert to the - 'original_model' copy of our address entry state before we started - editting. Finally, we close the dialog before any of thing. Doing - it last caused problems, because signals were being triggered - which had dangling pointers as their closures. - (e_select_names_manager_activate_dialog): Copy our current state - to the original model, and share the same ESelectNamesModel - between the dialog and the address entry in the composer.. - (e_select_names_manager_get_cards): Removed. It had been - #if 0/#endif-ed out for a while. - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_freeze): Added. - (e_select_names_model_thaw): Added. - (e_select_names_model_uncardify): Added. If possible, - "uncardifies" a specific model entry. - (e_select_names_model_changed): Changed to pay attention - to the freeze count. - - * gui/component/select-names/e-select-names-completion.c - (clean_query_text): Strip leading/trailing whitespace from - queries. - - * backend/ebook/e-destination.c (e_destination_uncardify): Added. - Converts a card-associated destination into a text-associated - destination w/ the e-mail address. - (e_destination_list_to_vector): Added. A convenience routine. - (e_destination_freev): Added. A convenience routine. - (e_destination_touchv): Added. I'm lazy. - -2001-09-08 Chris Toshok <toshok@ximian.com> - - (make_contact_editor_cb): show the right contact editor (the list - editor for list cards). - -2001-09-08 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-popup.c - (popup_menu_card): do the EDestination xml magic on email - addresses we put in the popup. - -2001-08-27 Zbigniew Chyla <cyba@gnome.pl> - - * gui/component/addressbook.c (addressbook_factory_new_control): - For every category: - - set .translate to FALSE (e_categories_master_list_nth returns - translated category name) - - convert category name in UTF-8 to locale's encoding - -2001-08-23 Zbigniew Chyla <cyba@gnome.pl> - - * gui/component/select-names/e-select-names-popup.c - (popup_menu_card): Fixed two bugs: - - missing coversion of contact name to GTK+ locale, - - passing dynamically created string (contact name) inside uiinfo struct - to gnome-app-helper functions. - Remember: these functions may change strings, trying to translate them! - (popup_menu_nocard): Ditto - -2001-09-07 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook-component.c: Removed unused factory - variable. - -2001-09-06 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-storage.c (notify_listener): new - function, notify the bonobo listener. - (remove_ldap_folder): track change to EvolutionStorage signal. - (create_ldap_folder): same, and make sure the type is - "ldap-contacts". - (load_source_data): folders that we create should have - "ldap-contacts" as their type. - (addressbook_storage_add_source): same. - - * gui/component/addressbook-component.c: (folder_types): add - "ldap-contacts", for display of ldap servers (they get their own - icon, and their own name in the Create New Folder dialog. - (create_view): use IS_CONTACT_TYPE since we support two folder - types now. - (create_folder): same. - (remove_folder): same. - (xfer_folder): same. - -2001-09-06 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c: (pixmaps): change - /Toolbar/ContactEditorSave to /Toolbar/ContactEditorSaveClose. - -2001-09-06 Chris Toshok <toshok@ximian.com> - - * gui/component/Makefile.am (INCLUDES): add -DEVOLUTION_IMAGESDIR. - - * gui/widgets/e-addressbook-view.c (card_deleted_cb): remove - status messages from here. - (e_addressbook_view_delete_selection): same. - - * gui/widgets/e-addressbook-model.c (sequence_complete): emit a - NULL status message along with the stop_state_changed. The null - status message will clear the status bar for this view. - - * gui/component/addressbook.c (set_status_message): use the - EvolutionActivityClient stuff. - - * backend/pas/pas-backend-ldap.c (view_destroy): remove status - message for abandoning a search. - (ldap_op_process_current): wrap status messages in _(). - (ldap_op_process): same. - (create_card_handler): same, and remove the notify_status for "" - and add a notify_complete call after the card is added. - (remove_card_handler): same. - (modify_card_handler): same. - (poll_ldap): wrap status messages with _(), and remove the "Search - Complete" message. - (ldap_search_handler): wrap status message. - - * backend/pas/pas-backend-file.c (pas_backend_file_search): use - _() on status messages, and make sure the last notify_* called is - notify_complete. - -2001-09-05 Ettore Perazzoli <ettore@ximian.com> - - [Fix #958, ShellComponents should not be created by factories, for - the addressbook.] - - * gui/component/addressbook-component.c - (GNOME_EVOLUTION_ADDRESSBOOK_COMPONENT_FACTORY_ID): Removed. - (GNOME_EVOLUTION_ADDRESSBOOK_COMPONENT_ID): New. - (create_component): Renamed from `factory_fn'. Just register the - thing on OAF. - (addressbook_component_factory_init): Just call it. - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: Remove the - ShellComponentFactory. - -2001-09-04 Iain Holmes <iain@ximian.com> - - * backend/ebook/evolution-vcard-importer.c (load_file_fn): Return FALSE - if the file isn't a valid VCard file. - -2001-08-05 Zbigniew Chyla <cyba@gnome.pl> - - I18n fixes (mainly making buttons on the right side less Anglocentric :-) - - * backend/ebook/e-card-simple.c - (field_data): Marked "name" and "short_name" fields for translation. - (e_card_simple_get_name, e_card_simple_get_short_name): Return - localized version of the name (using U_() macro). - - * gui/contact-editor/e-contact-editor.c (set_entry_changed_signals): - Connect "changed" signal from "entry-web" entry to widget_changed. - (changing this field wasn't making "Save and Close" button sensitive) - - * gui/widgets/Makefile.am (glade_DATA): Removed alphabet.glade. - - * gui/widgets/e-addressbook-view.c - (button_labels, button_letters): New strings containing a list of - labels and "values" of all buttons placed on the right side of the - addressbook view (intended for localization). - (struct LetterClosure): Changed the type of letter field to gunichar. - (e_utf8_split): New function, similar to g_strsplit, but operates on - UTF-8 strings. - (jump_to_letter): Don't hardcode letters, build queries dynamically - using UTF-8 and localized letters stored in button_letters. - (connect_button): Removed. - (create_alphabet): Don't use glade file, build buttons manually using - (localized) labels from button_labels. Use (localized) values from - button_letters when creating LetterClosure. - - * gui/widgets/e-minicard-view-widget.[ch] - (e_minicard_view_widget_jump_to_letter): Changed the type of the - second argument from char to gunichar. - - * gui/widgets/e-minicard-view.c - (compare_to_utf_str): Renamed from compare_to_letter, now operates on - UTF-8 string. - (e_minicard_view_jump_to_letter): Changed the type of the second - argument from char to gunichar + conversion to UTF-8 string. - - * gui/widgets/e-minicard-view.h - (e_minicard_view_jump_to_letter): Changed the type of the second - argument from char to gunichar. - -2001-09-02 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-book.c (e_book_add_card, e_book_commit_card), - backend/pas/pas-backend-file.c (do_create), - backend/pas/pas-backend-ldap.c - (create_card_handler, remove_card_handler, modify_card_handler, - pas_backend_ldap_process_get_vcard, poll_ldap): Use - e_card_get_vcard_assume_utf8 instead of e_card_get_vcard here - since all internal communications and database storage are assumed - to be utf8. - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h - (e_card_simple_duplicate): Simplified this function considerably. - (e_card_simple_get_vcard_assume_utf8): Added this function. - - * backend/ebook/e-card.c, backend/ebook/e-card.h (e_card_new, - e_card_load_cards_from_file, e_card_load_cards_from_string): Made - these functions pay attention to charset attributes. - (e_card_new_with_default_charset, - e_card_load_cards_from_file_with_default_charset, - e_card_load_cards_from_string_with_default_charset): New functions - that let you change the default charset from UTF-8. - (e_card_get_vcard): Made this write out charset attributes when - necessary. - (e_card_get_vcard_assume_utf8): New function that writes out a - card without writing out charset attributes. - - * backend/ebook/evolution-vcard-importer.c (book_open_cb), - backend/ebook/load-gnomecard-addressbook.c (book_open_cb), - backend/ebook/test-card.c (main), - gui/component/addressbook-component.c - (destination_folder_handle_drop), gui/contact-editor/test-editor.c - (main), gui/contact-list-editor/e-contact-list-editor.c - (table_drag_data_received_cb), gui/widgets/e-addressbook-view.c - (selection_received), gui/widgets/e-minicard-control.c - (pstream_load): Changed the default charset to be used here to - ISO-8859-1. - - * backend/ebook/load-gnomecard-addressbook.c (add_card_cb), - backend/ebook/load-pine-addressbook.c (add_card_cb), - backend/ebook/test-client-list.c (get_cursor_cb), - backend/ebook/test-client.c (get_cursor_cb, get_card_cb): Use - e_card_get_vcard_assume_utf8 to print out testing strings. - - * gui/component/select-names/e-select-names-model.c, - gui/component/select-names/e-select-names-model.h - (e_select_names_model_contains): Changed this to be const - EDestination *dest to fix a warning. - - * gui/contact-editor/e-contact-editor.c (e_contact_editor_init): - Translate window title here. - -2001-08-31 Zbigniew Chyla <cyba@gnome.pl> - - * gui/component/addressbook-storage.c - (addressbook_get_other_contact_storage): s/_/U_/ - - * gui/widgets/e-addressbook-reflow-adapter.c (addressbook_compare): - Use g_utf8_collate. - - * gui/widgets/e-minicard.c (e_minicard_compare): - Ditto. - - * printing/e-contact-print.c (card_compare): - Ditto. - -2001-08-29 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_clicked): Use e_select_names_model_merge to - combine the selected names with any existing ones. This causes - you to not lose addresses typed directly into the entry while the - SelectNames dialog is up. (Bug #8058) - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_merge): Merge the contents of one - ESelectNamesModel into another, avoiding duplicates. - - * backend/ebook/e-destination.c (e_destination_equal): Added. - Determines if two destinations appear to refer to the same - recipient. - - * backend/ebook/e-card.c (e_card_list_send): Added cast to - g_free args to silence compiler warnings. - - * gui/contact-editor/e-contact-quick-add.c (quick_add_set_name): - Paranoia. Check that name != qa->name. - (quick_add_set_email): Check that email != qa->email. - (ce_have_book): Store the QuickAdd data structure in object data, - so that we can be extra-careful and avoid having a dangling - pointer floating around out somewhere as the closure for a signal. - Fixes bug #8155, I think. - (card_added_cb): Clear object data to ensure single unref. - (editor_closed_cb): Clear object data to ensure single unref. - - * gui/component/select-names/e-select-names-completion.c - (book_query_score): Make sure that comp->priv->query_text isn't - NULL. (Fixes bug #8195) - - * backend/ebook/e-book-listener.c (e_book_listener_check_queue): - This function can be re-entrant during the signal emission; Added - extra ref/unrefs and checks to avoid problems if this happens. - This is similar to my recent changes to - e_book_view_listener_check_queue. (Fixes bug #7400) - -2001-08-27 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c: Get rid of a warning by - initializing the closing NULL element in folder_types correctly. - - * gui/component/select-names/e-select-names.c: Updated to match - the studlyCapsification of attributes in shell/Evolution*.idl. - -2001-08-27 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (sexp_file_as): Added. Generated queries against file_as. - (match_file_as): Added. Match results of queries against - file_as. (Bug #8152) - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_check_queue): Added ref/unref pair to make - sure that our listener doesn't get finalized during the signal - emission and leave us with a dangling pointer. (Bug #7661) - - * backend/ebook/e-card.c (e_card_list_send): Removed some debugging - spew that I left in by mistake. - - * gui/widgets/e-addressbook-model.c (create_card): Removed debugging - spew. - - * backend/ebook/e-card.c (e_card_list_send): Do the right thing if - the card we are trying to send to is a contact list. (Bug #6580) - -2001-08-27 Zbigniew Chyla <cyba@gnome.pl> - - * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog): - Display localized status string (added missing _()). - -2001-08-24 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-destination.c (e_destination_set_card): Put a - freeze/thaw around our the set of operations that changes the - internal state of our card, so 'changed' signal callbacks won't be - invoked on a card in an intermediary state. This fixes the bug - that was causing the e-mail addresses in cards to be blank when - replying to a message. (An unexpected side-effect of toshok's - change on 8/22 to make sure that priv->email != NULL). - (e_destination_get_name): Code slightly rearranged for (IMO) - clarity. - -2001-08-23 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard.c (e_minicard_event): add - BUTTON_PRESS_MASK so double clicks still work. - -2001-08-23 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (addressbook_query_changed): switch - "full_name" to "x-evolution-any-field" in all the queries where we - want to match all cards, since the backends universally handle - this special case more efficiently. - -2001-08-22 Jon Trowbridge <trow@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c (extract_info): - In the GUI, the toggle is labelled "hide addresses", not "show - addresses" -- so we have to reverse the boolean value we read in. - (fill_in_info): Same bug as before: since the GUI reads "hide", we - have to initialize the toggle to '!show_addresses', not - 'show_addresses'. - - * backend/ebook/e-destination.c - (e_destination_list_show_addresses): Added. - (e_destination_xml_encode): Encode the value of - e_destination_list_show_addresses into the XML. - (e_destination_xml_decode): Read and store the "show_addresses" - flag. - -2001-08-22 jacob berkman <jacob@ximian.com> - - * gui/component/e-address-popup.c (emit_event): emit an event from - our event source - (contact_editor_cb): emit a destroy event so our control frame can - be destroyed. - (edit_contact_info_cb): emit a hide event so our control frame can - be hidden - (e_address_popup_cardify): - (add_contacts_cb): emit the destroy event - (e_address_popup_factory_new_control): don't unref our object at - widget destroy time as that was really really broken - (e_address_popup_factory_new_control): create an event source and - aggregate ourself with it - - * gui/contact-editor/e-contact-editor.c (enable_writable_fields): - display a nicer warning when we can't find a widget for a given - field - (e_contact_editor_raise): only raise if there is a window - - * gui/contact-editor/contact-editor.glade: name some widgets that - got unnamed, and set the first entry as defaultable - - * gui/contact-editor/e-contact-editor.c: envelope printing is - disabled in 1.0 - -2001-08-22 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-destination.c (e_destination_get_email): make - sure we don't get into a situation where priv->email == NULL. - -2001-08-21 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard.c (e_minicard_event): if we're dragging, - drag_button_down won't be true in the BUTTON_RELEASE case, since - we set it to false in MOTION_NOTIFY once the threshold is reached. - (e_minicard_drag_end): remove this function, since it was needed - to work around a bug in gnome-canvas. - -2001-08-20 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_addressbook_create_ebook_table): Wrap our addressbook table - adapter in an ETableWithout, so that we can make addresses appear - and disappear when we remove/add them to the section lists - (To/Cc/Bcc) on the right of the dialog. - (real_add_address_cb): When we add an address, hide it in the main - list. - (e_select_names_init): Get pointer to our without table from the - table's object data, and store it. - (remove_address): When we remove an address, show it in the main - list. - (card_key): Added. Allocate a unique key from an ECard. - (esn_get_key_fn): Added. Callback for ETableWithout. - (esn_dup_key_fn): Added. Callback for ETableWithout. - (esn_free_gotten_key_fn): Added. Callback for ETableWithout. - (esn_free_duped_key_fn): Added. Callback for ETableWithout. - - * backend/ebook/e-card-simple.c (e_card_simple_get): Changed - E_CARD_SIMPLE_FIELD_NAME_OR_ORG to first try the FILE_AS - type. This allows the cards in the ESelectName dialog to - appear in proper sort order (i.e. as 'Doe, John' rather than - 'John Doe'). Fixes ximian #6002. - -2001-08-20 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-reflow-adapter.c - (e_addressbook_reflow_adapter_class_init): fix arg info - we're - only passing 1 GTK_TYPE_POINTER arg, not 2. - - * gui/widgets/e-minicard.c (e_minicard_event): lots of fixes for - DnD. For GDK_BUTTON_PRESS, we grab immediately. For - GDK_BUTTON_MOTION, we start the drag after a certain threshold, - and connect to the "drag_end" signal on our canvas so we'll know - when the drag is complete. For GDK_BUTTON_RELEASE, we release the - grab if we were dragging and get the event. - (e_minicard_drag_end): new function, just remove the pointer/gtk - grabs and disconnect. - - * gui/widgets/e-minicard.h (struct _EMinicard): add "gint - drag_button" - -2001-08-20 JP Rosevear <jpr@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_changes_foreach_key): use DB_NOTFOUND const - -2001-08-20 JP Rosevear <jpr@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_get_changes): null out card_sexp so that - we don't crash when copying - -2001-08-20 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c: fix warnings, get compiling again - - * conduit/address-conduit-config.h: remove c/p typos - - * conduit/address-conduit.h: ditto - - * conduit/Makefile.am: link against the static camel - -2001-08-20 Damon Chaplin <damon@ximian.com> - - * gui/contact-editor/e-contact-editor.c: use bigger Save icon for - toolbar. Used Delete icon in menu. - - * gui/component/addressbook.c: use 'Save As' icon rather than 'Save' - as it seems more appropriate. Also added delete icon for menu. - -2001-08-19 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c: Update the folder list to - include a display name and a description. - -2001-08-19 Damon Chaplin <damon@ximian.com> - - * gui/component/addressbook.c: use new Cut/Copy/Paste/Save/Search - icons. - -2001-08-19 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook.c (set_folder_bar_label), - gui/widgets/e-addressbook-model.c, - gui/widgets/e-addressbook-model.h (update_folder_bar_message), - gui/widgets/e-addressbook-view.c, gui/widgets/e-addressbook-view.h - (folder_bar_message): Set the folder bar message here. Fixes - Ximian bug #4670. - - * gui/component/select-names/e-select-names-model.c (SEPLEN): Use - strlen(SEPARATOR) here so that if the separator changes the length - will work properly. - -2001-08-19 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/fulladdr.glade: Added full country list. - Fixes Ximian bug #5123. - -2001-08-18 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c: Hook up `delete-message.png' as the - icon for "ContactDelete". - * gui/contact-editor/e-contact-editor.c: Likewise. - -2001-08-17 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-storage.h: add prototype for - addressbook_get_other_contact_storage. - - * gui/component/addressbook-storage.c - (addressbook_get_other_contact_storage): rename register_storage - to this, and return the EvolutionStorage. - (load_source_data): register_storage => - addressbook_get_other_contact_storage. - (addressbook_storage_add_source): register_storage => - addressbook_get_other_contact_storage. - -2001-08-17 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c - (set_entry_changed_signals): connect to the "changed" signal on - "entry-web" to update command state. - -2001-08-17 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c (list_added_cb): - call e_card_set_id on the list's card so we can continue to use - this dialog. also, call command_state_changed if we aren't - closing the dialog so the toolbar is properly sensitized. - (list_deleted_cb): always close the dialog after we successfully - delete a list. - - * gui/contact-editor/e-contact-editor.c (card_added_cb): call - e_card_set_id on the card so we can continue to use this dialog - (to modify or delete the card.) - (card_deleted_cb): always close the dialog after we successfully - delete a card. - -2001-08-17 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (addressbook_query_changed): call - e_sexp_encode_string on the search string the user types in so it - doesn't break sexp parsing in the wombat. - -2001-08-17 Damon Chaplin <damon@ximian.com> - - * gui/component/addressbook.c: changed to new print icon. - -2001-08-17 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names.c: (struct - ESelectNamesFolder): rename physical_uri to uri, since it includes - the addressbook.db for file: uris. - (e_select_names_folder_free): physical_uri => uri. - (e_select_names_option_activated): physical_uri => uri, and we - don't need to strdup_printf "addressbook.db" onto the end anymore. - (new_folder): if the physical_uri is a file: uri, append - /addressbook.db onto it. - (hookup_listener): new function, split out lots of code from - e_select_names_hookup_shell_listener. - (e_select_names_hookup_shell_listeners): rename - e_select_names_hookup_shell_listener to this, and hookup both the - local and "Other Contacts" listener, using hookup_listener. - (e_select_names_destroy): disconnect from the - other_contacts_listener and unref it. - - * gui/component/select-names/e-select-names.h (struct - _ESelectNames): add a listener for Other Contacts, and rename - "listener" to "local_listener." - -2001-08-17 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_seq_complete_cb): If we get the - "sequence_complete" signal when we aren't searching, it means the - addressbook changed out from under us. Clear the search cache, so - that future completion requests won't use the out-of-date cached - data. Also, don't unref book_view... we leave the EBookView open - so that we can catch these addressbook changes. - (e_select_names_completion_do_query): Don't use the book_view - being non-NULL as a sign that another query is still running. - (e_select_names_completion_got_book_view_cb): Properly unref any - previous value in book_view. - -2001-08-17 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-reflow-adapter.c - (e_addressbook_reflow_adapter_right_click), - gui/widgets/e-addressbook-view.c (table_right_click): Changed the - messages here in the right click menus. - -2001-08-17 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (view_destroy): unref our - card_sexp. - (create_card_handler): make sure to set the id of the vcard so it - gets properly transmitted back to the BookView, and notify all - matching BookViews to add the created card. - (remove_card_handler): notify all matching BookViews to remove the - card. - (modify_card_handler): notify all matching BookViews to modify the - card. - (pas_backend_ldap_process_get_book_view): init card_sexp based on - the view's search. - -2001-08-17 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_book_view_copy): use card_sexp. - (pas_backend_file_book_view_free): same. - (vcard_matches_search): use the new pas_backend_card_sexp_match_vcard call. - (pas_backend_file_search): use card_sexp. - (pas_backend_file_process_get_book_view): same. - - * backend/pas/Makefile.am (libpas_a_SOURCES): add - pas-backend-card-sexp.[ch]. - -2001-08-17 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook-component.c (factory_fn): Added code - so the user can create a new contact or contact list from anywhere - in evolution. - -2001-08-16 Jeffrey Stedfast <fejj@ximian.com> - - * backend/pas/evolutionperson.schema: Added a closing paren. - -2001-08-16 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_handle_request): Renamed from _begin to - match changes in gal 0.10.99.3. - - * gui/contact-editor/e-contact-quick-add.c (e_contact_quick_add): - Check that name != NULL before we start messing with it. - (Fixes bug #7329) - -2001-08-16 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (match_nickname): Boost scoring on an exact nickname match. - Manually addressify match. - (match_name): Manually addressify matches. - (book_query_score): Remove automatic addressification. - - * gui/component/addressbook.c (addressbook_query_changed): Minor - tweak to avoid a crash if we have a negative subid with id - ESB_CATEGORY. This should never happen. - (addressbook_menu_activated): Reset the entry/option when we - select "Clear". - Some changes to reflect renaming in ESearchBar. - - * gui/component/select-names/e-select-names-bonobo.c - (entry_set_property_fn): Cardify after importing destinations. - This might fix a problem that Damon is having. - -2001-08-15 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.glade: set title of initial - dialog to Addressbook Sources (bug #6704). - -2001-08-15 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-storage.c (create_ldap_folder): don't - let people add subdirs in the ldap server storage - everything is - toplevel there. - -2001-08-14 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_get_vcard): implement using - search_for_dn. - -2001-08-14 Federico Mena Quintero <federico@ximian.com> - - * gui/component/addressbook.c (addressbook_factory_new_control): - Tell the search bar to translate the subitem texts. - -2001-08-14 Jon Trowbridge <trow@ximian.com> - - * gui/component/addressbook.c (addressbook_factory_new_control): - Add "Any Category" option for category searches. - (addressbook_query_changed): Do the right thing on an - "Any Category" search. - -2001-08-14 Dan Winship <danw@ximian.com> - - * backend/pas/pas-backend-ldap.c: Fix up to match the - pas_book_new/get_vcard changes. - -2001-08-14 Christopher James Lahey <clahey@ximian.com> - - * gui/merging/e-card-merging-book-commit-duplicate-detected.glade: - Got rid of an extraneous _ here. - - * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog): - Changed Canceled to Cancelled here. Fixes Ximian bug #2465. - -2001-08-14 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-book.c (pas_book_respond_get_vcard): Oops, - forgot to write this function. - -2001-08-14 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/contact-editor.glade: Added focus targets - here. Fixes part of Ximian bug #5843. - -2001-08-14 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/e-contact-editor.c (e_contact_editor_init): - Grab focus here. Fixes Ximian bug #2265. - -2001-08-14 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook.c (addressbook_factory_new_control): - (addressbook_query_changed): Fixed two const warnings here. - - * printing/e-contact-print-envelope.c, - printing/e-contact-print-envelope.h: Fixed some missing includes - here. - -2001-08-14 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-book-view.c (add_book_iterator): Call - e_card_set_book here. - - * backend/ebook/e-book.c (e_book_do_response_get_vcard): Call - e_card_set_book here. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Pulled out the - part where the uri is made part of the uid. Made uri a separate - field. Fixes Ximian bug #6490. - - * backend/ebook/e-destination.c, backend/ebook/e-destination.h: - Change this to use ECard's split uids and uris. - -2001-08-13 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (add_to_supported_fields): don't - g_strdup the stuff we're passing into e_list_append, since it does - the copy for us. - (check_schema_support): don't initialize supported_fields list - here, since there's a gross case where the programmer/user can - bring up the contact editor before the connection stuff is - finished, and we don't want to crash. - (pas_backend_ldap_init): move it here to we can guarantee it's - there. (bug #6546). - -2001-08-13 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.c - (addressbook_source_dialog_set_source): don't access source->auth - if source == NULL (bug #7086). - -2001-08-13 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-book-listener.c, - backend/ebook/e-book-listener.h, backend/ebook/e-book.c, - backend/ebook/e-book.h, backend/idl/addressbook.idl, - backend/pas/pas-backend-file.c, backend/pas/pas-book.c, - backend/pas/pas-book.h: Changed get_card to be asyncronous. - - * backend/ebook/e-card.c, backend/ebook/test-client.c: Changed - these to deal with the new get_card functionality. - -2001-08-11 Kjartan Maraas <kmaraas@gnome.org> - - * gui/component/select-names/e-select-names.c: Mark a string for translation. - * This fixes bug #7052 - * printing/e-contact-print.h: Add headers to make it stand on itw own. - * printing/e-contact-print.c: Marked some strings for translation. - * printing/e-contact-print-envelope.c: Same here. - -2001-08-10 Jon Trowbridge <trow@ximian.com> - - * gui/contact-editor/e-contact-quick-add.c (e_contact_quick_add): - Remove single- or double-quotes from names before sticking them - into the addressbook. (Bug #6499) - - * gui/component/addressbook.c (addressbook_query_changed): - Properly handle "Category is" queries by checking the search bar - suboption. - (addressbook_factory_new_control): Attach subitems corresponding - to all wombat categories to the "Category is" ESearchBarItem. - - * gui/component/addressbook.c: Set the ESearchBarItem - subitems explicitly to NULL. - -2001-08-10 Anna Marie Dirks <anna@ximian.com> - * gui/component/select-names/select-names.glade: did a little - packing-magic to get the two tables at bottom of this dialog - to seem to line up. - - *gui/component/select-names/e-select-names.c: changed the title - of this dialog to "Select Contacts from Addressbook". - -2001-08-09 Anna Marie Dirks <anna@ximian.com> - * gui/component/select-names/select-names.glade: redesigned - this dialog to fix bug #6815. - - *gui/component/select-names/e-select-names.c: connected the - widgets (or one of them anyway. clahey did the rest) for my - new and lovely glade file. - -2001-08-09 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c: remove passwd_cb. - -2001-08-09 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-text-model.c - This change is dedicated to Jacob Berkman. - (e_select_names_text_model_insert_length): If the last character - we inserted was a "magic comma", remember its position. - (e_select_names_text_model_delete): If the last character we - inserted was a "magic comma", and if the next thing we do is to - hit backspace, delete both the comma and the extra whitespace we - added. - (e_select_names_text_model_init): Initialize our last magic comma - position. - -2001-08-09 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_create_entry): Hook up some magic to - (basically) cardify an entry on focus-out. (What we do is actually - more complicated than that.) - - * gui/component/select-names/e-select-names-bonobo.c - (entry_set_property_fn): After we set an entry's text, try to - cardify it. We need to do this so that (for example) reply - e-mails get properly cardified. - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_duplicate): Use e_select_names_model_append, - rather than manipulating lists directly. - (e_select_names_model_insert): Connect "changed" signal proxy for - added EDestination. - (e_select_names_model_append): Ditto. - (e_select_names_model_replace): Ditto, and disconnect signals for - replaced EDestination. - (e_select_names_model_delete): Ditto on the disconnection. - (e_select_names_model_delete_all): Ditto. - (e_select_names_model_cardify): Added. Try to cardify a specified - EDestination. - (e_select_names_model_cancel_cardify): Added. Cancel the pending - cardification of a single EDestination. - (e_select_names_model_cardify_all): Added. Cardify all of the - EDestinations in the model. - (e_select_names_model_cancel_cardify_all): Added. Cancel's any - and all pending cardifications. - - * backend/ebook/e-destination.c (e_destination_class_init): Added - "changed" and "cardified" signals. - (e_destination_freeze): Added (static). - (e_destination_thaw): Added (static). - (e_destination_clear_card): Reset allow_cardify and - cannot_cardify, cancel any pending cardifications, and emit the - "changed" signal. - (e_destination_clear_strings): Emit the "changed" signal. - (e_destination_clear): Do freeze/thaw to prevent multiple signal - emissions. - (e_destination_set_card): Check that the card we are setting is - not equal to the current card, and emit the "changed" signal if we - are actually changing. - (e_destination_set_card_uri): Emit "changed" signal, if necessary. - (e_destination_set_name): Emit "changed" signal, if necessary. - (e_destination_set_email): Emit "changed" signal, if necessary. - (e_destination_set_html_mail_pref): Emit "changed" signal, if - necessary. - (use_card_cb): If we've just loaded/set the ECard, emit the - "changed" signal. - (e_destination_set_raw): Emit "changed" signal, if necessary. - (e_destination_allow_cardification): Added. - (e_destination_set_allow_cardification): Added. - (e_destination_cardify): Added. Tries to automatically convert - a string-based EDestination to one based on an ECard. - (e_destination_cardify_delayed): Added. Cardifies in a timeout. - (e_destination_cancel_cardify): Added. Cancels any pending - cardifications. - (e_destination_xml_decode): Added freeze/thaw. - - * backend/ebook/e-book-util.c (e_book_nickname_query): Added. A - canned simple query for nicknames. - - * backend/ebook/e-card.c (e_card_email_find_number): Added. Given - a card and an string containing an email address, return the index - number of the address inside of the card, or -1 if the address is - not found. - -2001-08-09 Chris Toshok <toshok@ximian.com> - - [ Fixes ximian bugs #5080, #6021, #6704, #6705 ] - - * gui/component/addressbook.c (book_open_cb): create our own - dialog that prompts for both the email address and the password. - the email address is stored in the source and filled in for the - user after the first time they enter one and press OK. - - * gui/component/addressbook-storage.c (create_ldap_folder): has a - return value, not a int* parameter. - (create_ldap_folder): new function, we can create ldap servers - from the File->New->Folder menu item now. - (register_storage): hook up the "create_folder" signal. - (addressbook_storage_init_source_uri): remove the file case, we - only build ldap uris here. - (load_source_data): remove the file source stuff, and handle - "emailaddr". - (save_source_data): call ldap_source_foreach directly. - (addressbook_source_free): remove file source stuff. - (addressbook_source_copy): same. - - * gui/component/addressbook-storage.h: get rid of all the file - source stuff from AddressbookSource, since this is only being used - for ldap servers. - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_authenticate_user): look up the ldap - entry based on the provided email address and use the resulting - DN/passwd to authenticate. - - * gui/component/addressbook-config.c: pretty much gutted to make - it work with the new UI. - - * gui/component/addressbook-config.glade: new version from anna. - -2001-08-09 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c (SPEC): Upped the minimum width - on all addressbook columns to 75. Fixes Ximian bug #2773. - -2001-08-08 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-quick-add.c (ce_have_book): mark - the dialog as changed so the save button is immediately available. - - * gui/contact-editor/e-contact-editor.c (card_modified_cb): once - we save reset the change flag to false if we aren't closing the - dialog. - (card_added_cb): same. - (e_contact_editor_class_init): add a "changed" arg. - (e_contact_editor_set_arg): add setter for "changed". - (e_contact_editor_get_arg): add getter for "changed". - -2001-08-08 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-quick-add.c (ce_have_book): better - to assume that we can write to the local addressbook than that we - can't write to it :) - -2001-08-08 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c (create_ui): - call e_pixmap_update so we can use the same save/save-as pixmaps - as the contact editor. - -2001-08-08 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-reflow-adapter.c (open_card): new - function, used by the context menu. - (e_addressbook_reflow_adapter_right_click): put "Open" at the top - of the menu. also, disable "Delete" if the addressbook isn't - writable. - -2001-08-08 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (rfc2254_escape): escape *, \, (, - and ), as per rfc2254. - (func_contains): escape the string. - (func_is): same. - (func_beginswith): same. - (func_endswith): same. - -2001-08-08 Nat Friedman <nat@ximian.com> - - * gui/widgets/e-addressbook-reflow-adapter.c (print_envelope): If 0'd out - since Envelope printing is disabled for 1.0. - * gui/widgets/e-addressbook-view.c (print_envelope): Likewise. - * gui/contact-editor/e-contact-editor.c (print_envelope_cb): Likewise. - - * gui/widgets/e-addressbook-reflow-adapter.c - (e_addressbook_reflow_adapter_right_click): Removed "Print - Envelope" menu item. - * gui/widgets/e-addressbook-view.c (table_right_click): Likewise. - * gui/contact-editor/e-contact-editor.c (verbs): Likewise. - -2001-08-07 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-storage.c (remove_ldap_folder): ifdef - this HAVE_LDAP. - -2001-08-07 Chris Toshok <toshok@ximian.com> - - * gui/search/e-addressbook-search-dialog.c - (e_addressbook_search_dialog_init): set the title of the window to - "Advanced Search". - -2001-08-07 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (search_cb): pass view->view instead - of the EBook. - (addressbook_search_menu_items): remove E_FILTERBAR_ADVANCED. - (addressbook_menu_activated): remove E_FILTERBAR_ADVANCED. - (addressbook_search_option_items): add "Advanced..." here. - (addressbook_query_changed): add special handling for Advanced... - - * gui/search/e-addressbook-search-dialog.h (struct - _EAddressbookSearchDialog): add EAddressbookView and remove the - model/adapter fields. Also fix prototype of - e_addressbook_search_dialog_new. - - * gui/search/e-addressbook-search-dialog.c - (e_addressbook_search_dialog_class_init): get rid of - set_arg/get_arg. - (button_press): set the query on the EAddressbookView, and always - close the dialog. - (e_addressbook_search_dialog_init): get rid of the minicard view, - and pack the other widgets accordingly. - (e_addressbook_search_dialog_new): pass EAddressbookView instead - of EBook. - (e_addressbook_search_dialog_destroy): remove model/adapter stuff. - -2001-08-07 Chris Toshok <toshok@ximian.com> - - [ Fixes bug #5066 ] - * gui/component/addressbook-storage.c (remove_ldap_folder): new - function, remove the source. - (register_storage): connect to the "remove_folder" signal so we - know when to remove the folder. - -2001-08-07 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (build_card_from_entry): use - g_strcasecmp since ldap attribute names are not case sensitive. - -2001-08-07 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c - (table_drag_data_received_cb): make sure we update the changed - state if a successful drop happens. - -2001-08-07 Jason Leach <jleach@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_init): Make the OK button the keyboard default - instead of Cancel. Bug #4942. - -2001-08-06 Radek Doulik <rodo@ximian.com> - - * backend/ebook/e-book.c (e_book_op_free): new EBookOp destructor - (e_book_unqueue_op): use e_book_op_free - (e_book_do_response_create_card): ditto - (e_book_do_response_generic): ditto - (e_book_do_response_get_cursor): ditto - (e_book_do_response_get_view): ditto - (e_book_do_response_get_changes): ditto - (e_book_do_response_open): ditto - (e_book_do_response_get_supported_fields): ditto - -2001-08-05 Radek Doulik <rodo@ximian.com> - - * backend/ebook/e-book.c (e_book_do_response_get_view): set - op->listener to NULL to catch possible use of freed op - (e_book_do_response_get_changes): ditto - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_check_queue): this callback could be (and - indeed is) called from signal emited above, - signal handler could call e_book_view_listener_stop, so we need to check - if idle is still set and if not we don't want to unref again - -2001-08-04 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-compare.c (e_card_compare_name): Made it so - that if there's one less match than possible compares are - considered more VAGUE. Fixes Ximian bug #3400. - -2001-08-03 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_hookup_shell_listener): Check for storage != NULL - here. This shouldn't come up unless addressbook has crashed - previously within this session of evolution, but this is just a - bit of insurance. Fixes Ximian bug #3699. - -2001-08-03 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card.c (e_card_name_match_string): Changed the - criteria of whether the first part of each iteration matched or - the second one did. Before it got it wrong sometimes and caused - the pointer to jump off the end of the array. Fixes Ximian bug - #4674. - -2001-08-03 Jason Leach <jleach@ximian.com> - - * gui/component/addressbook-storage.c (load_source_data): Update - for EvolutionStorage API changes. - (addressbook_storage_add_source): Ditto. - -2001-08-03 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c (jump_to_letter): Made this - change the query based on which letter is clicked. Fixes Ximian - bug #2202. - -2001-08-03 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook.c (addressbook_factory_new_control): - Fixed warnings here. - - * gui/component/select-names/e-select-names-completion.c - (hash_cleanup_fn): Removed this unused function. - -2001-08-03 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-simple.c (e_card_simple_sync_card, - fill_in_info): Made the list of E_CARD_PHONE types in - phone_correspondences more complete by adding the new 5 - E_CARD_PHONE types. Also, made it a bit less restrictive for some - types (E_CARD_PHONE_HOME will actually match - E_CARD_SIMPLE_PHONE_ID_HOME now.) Made e_card_simple_sync_card - and fill_in_info search for an exact match in the list of - phone_correspondences and then look for a partial match. Got rid - of not going forward when doing a remove from an EList since EList - handles this case automatically. - - * backend/ebook/e-card-types.h: Added E_CARD_PHONE types for - assistant, callback, radio, telex, and ttytdd. - - * backend/ebook/e-card.c (get_phone_flags, set_phone_flags): - Handle the new E_CARD_PHONE types. - -2001-08-02 Jon Trowbridge <trow@ximian.com> - - * printing/Makefile.am (ecpsdir): Add camel dependency. - - * gui/component/Makefile.am: Add camel dependency. - - * backend/ebook/Makefile.am: Add camel dependency. - - * gui/component/addressbook-factory.c (main): Properly init camel. - - * backend/ebook/e-destination.c (e_destination_clear_strings): - Clear ->raw. - (e_destination_is_empty): We aren't empty if ->raw is set.. - (e_destination_set_raw): Replaces e_destination_set_string. - (e_destination_get_name): Use camel's parser to extract the name - from ->raw. - (e_destination_get_email): Use camel's parser to extract the email - address from ->raw. - (e_destination_get_address): Use camel to produce properly quoted, - RFC-compliant addresses. Thanks camel! (Bug #5860) - - * gui/component/select-names/e-select-names-completion.c - (emailify_match): Always append an e-mail address, as long as it - doesn't have one already at it's beginning or end. Don't limit - self to just emailifying entries tied to cards with multiple - addresses. (I didn't really want to do this, but people seem to - like keeping multiple cards for the same person, and other - solutions (like scanning all matches for duplicate names, and only - emailifying those) just seemed like way too much work for such a - limited payoff.) - - * gui/component/select-names/e-select-names-text-model.c: - s/e_destination_set_string/e_destination_set_raw/. - - * gui/component/select-names/e-select-names-popup.c - (popup_menu_card): Quote _'s in our popup menus, so that "foo_bar" - doesn't get displayed as "foobar" w/ the 'b' underlined. (Bug - #5558) - (popup_menu_nocard): Ditto. - -2001-08-02 Jason Leach <jleach@ximian.com> - - * gui/component/addressbook.c (addressbook_factory_new_control): - Removed some extra padding and pack the addressbook view into a - frame with inward shadowing, just because it looks prettier. - - * gui/contact-editor/e-contact-editor.c: Use the updated Save, - Save As, and Print icons for the menus and toolbar. - -2001-08-02 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook.c: Added ContactsSaveAsVCard, - ContactsSendContactToOther, and ContactsSendMessageToContact verbs - here. - - * gui/widgets/e-addressbook-view.c, - gui/widgets/e-addressbook-view.h (e_addressbook_view_save_as, - e_addressbook_view_send, e_addressbook_view_send_to): New - functions to allow outside users to cause the addressbook to save, - send, or send a message to its selection. - -2001-08-01 Christopher James Lahey <clahey@ximian.com> - - * contact-editor/.cvsignore: Removed this file from this unused - directory. - -2001-08-01 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/Makefile.am: Added file-exists.glade. - - * gui/contact-editor/e-contact-save-as.c (file_exists), - gui/contact-editor/file-exists.glade: Added a dialog to ask the - user whether to replace an already existing file. Mostly from a - patch by Jos Dehaes. Fixes Ximian bug #2231. - -2001-08-01 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_check_queue): Removed thrash checking code - here since thrashing shouldn't happen now that we've cleaned this - up some. - - * backend/ebook/e-book.c (e_book_do_response_get_view): Properly - handle cases where construction fails. - -2001-07-30 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/evolution-vcard-importer.c: Added #include - <e-util/e-path.h>. - -2001-07-23 Zbigniew Chyla <cyba@gnome.pl> - - * gui/component/addressbook-config.c (addressbook_source_dialog): - Convert translated string to UTF8 before calling put_html. - -2001-07-30 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_do_query): Properly handle the case - where our "cleaned" completion is the empty string. This happens, - for example, if the query text is the string "\"". (Bug #5610). - - * backend/ebook/e-destination.c (e_destination_get_address_textv): - Reassure fejj that I'm not doing something stupid here. - (e_destination_get_address): Fix address quoting. This is a - stop-gap measure until I can change this code to use Camel's - superior address-handling routines. (Also Bug #5610) - -2001-07-30 Jason Leach <jleach@ximian.com> - - * gui/component/addressbook-storage.c (load_source_data): Fix a - return value bug, to make it so if it fails to load an - addressbook-sources.xml file (either a parse error or it doesn't - exist for example), it deregisters the storage. - (register_storage): Don't make a storage for users who don't have - LDAP support built in. Bug #1950. - -2001-07-30 Frederic Crozat <fcrozat@mandrakesoft.com> - - * addressbook/gui/component/addressbook-factory.c: Fix crashes - when gtkhtml is compiled with gconf support - -2001-07-27 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: Tidy ldadds - -2001-07-26 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c: Fixing a - small, stupid mistake; use e_select_names_model_get_textification - for the getter for "text". - - * backend/ebook/e-card.c: Removed some debugging chatter. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_create_entry): Store the completion - handler in the entry's object data. - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): Added support for getting "destinations" - and "allow_contact_lists" properties. - (entry_set_property_fn): Added support for setting "destinations" - and "allow_contact_lists" properties. - (impl_SelectNames_get_entry_for_section): Added definitions for - "destinations" and "allow_contact_lists" properties. - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_get_match_contact_lists): Added. - (e_select_names_completion_set_match_contact_lists): Added. - Controls whether contact lists are offered as options during - completion. - (book_query_process_card_list): Check if match_contact_lists - is set before (duh!) matching on a contact list. - (e_select_names_completion_init): Set match_contact_lists - to TRUE by default. - -2001-07-25 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (func_contains): change the way - x-evolution-any-field is converted to an ldap query. it used to - be we'd nest queries like: (|(|(|(foo=*x*))(bar=*x*))(baz=*x*)). - now we build it like: (|(foo=*x*)(bar=*x*)(baz=*x*)). much more - efficient (both in the building, and on the server side no doubt). - -2001-07-25 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-destination.c (e_destination_get_name): Properly dup - the results of e_destination_get_email. - - * gui/component/select-names/e-select-names-popup.c - (e_select_names_popup): Check that our destination isn't empty - before building our popup. (Bug #5250) - - * backend/ebook/e-destination.c (e_destination_is_empty): Made - argument const. - -2001-07-24 Jon Trowbridge <trow@ximian.com> - - * gui/contact-list-editor/e-contact-list-model.c: Added checks - for all of the args of the exposed functions, so that - we won't crash on bad inputs. (Related to bug #4856.) - -2001-07-24 Jason Leach <jleach@ximian.com> - - * gui/merging/e-card-duplicate-detected.glade: "_Add Anyway" to - "Add Anyway". - -2001-07-24 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-destination.c (e_destination_get_name): Added - fallbacks for the name in the case of an e-card, to avoid the - "nameless contact" bug. - -2001-07-24 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard.c (remodel): need the EDestination magic - here too for when we modify an already shown card. - - * gui/contact-list-editor/e-contact-list-model.c: make - parent_class static, just to be anal. - - * gui/contact-list-editor/e-contact-list-editor.c - (remove_entry_cb): removing entries changes the list, so flag it. - (table_drag_data_received_cb): restrict cards we add to lists to - be non-list cards. - (extract_info): clear out the email list in the card before we - repopulate it from the contact list model. - (fill_in_info): set the checkbox to active/inactive based on - thecard. - -2001-07-24 Chris Toshok <toshok@ximian.com> - - * gui/contact-editor/e-contact-editor.c (wants_html_changed): call - widget_changed. - (phone_entry_changed): same. - (email_entry_changed): same. - (address_text_changed): same. - (name_entry_changed): same. - (company_entry_changed): same. - (widget_changed): new function that we can either call or set as a - signal to change the "changed" flag on the dialog. - (set_entry_changed_signals): connect lots of "changed" signals on - widgets to widget_changed. - (add_lists): connect "changed" to widget_changed. - -2001-07-24 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_hookup_shell_listener): Check if - evolution_shell_client_get_local_storage returns CORBA_OBJECT_NIL, - which it should never do. If it does, print a warning in a dialog - and try to recover w/o crashing. (Bug #5193) - -2001-07-24 Dan Winship <danw@ximian.com> - - * backend/ebook/e-book-listener.c (e_book_listener_stop): Don't - stop the idle_queue and unref from here, since this might be - called from inside e_book_listener_check_queue, and we don't want - to return to that function with the listener having been - destroyed. - (e_book_listener_check_queue): Don't exit early if the queue is - stopped. Proceed through the check if the queue is NULL (which is - must be if the queue is stopped), and then reach the existing code - to remove the idle handler. Combined with the above, this fixes - ximian #4485 (again). This is not a plot to boost my - showstopper-bugfixing count by fixing the same bug over and over - again. - -2001-07-23 Dan Winship <danw@ximian.com> - - Re-fix for my 07-18 not-quite-fix. - - * backend/ebook/e-book-listener.c: Add a "stopped" flag like - EBookViewListener. - (e_book_listener_check_queue): Don't emit signals if the listener - is stopped. - (e_book_listener_queue_generic_response, etc): Don't queue - responses if the listener is stopped. - (e_book_listener_stop): Flush the queue and stop queue/emitting - further responses. - - * backend/ebook/e-book.c (e_book_unload_uri): Revert the previous - change and call e_book_listener_stop() instead. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_stop): When removing an idle handler, unref - the listener as well, since e_book_view_listener_queue_response - will have ref'ed it. - -2001-07-22 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (remove_folder): Add a - @type arg. If the type is not "contacts", report an - `UNSUPPORTED_TYPE' error through the listener. Also, remove - `g_print()' debugging messages. - (xfer_folder): Likewise. - -2001-07-21 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c: Make the "contacts" - folders user-creatable by setting `user_creatable' to %TRUE in the - `EvolutionShellComponentFolderType's. - -2001-07-18 Chris Toshok <toshok@ximian.com> - - [ patch contributed by Jos Dehaes <jos.dehaes@bigfoot.com> ] - - * gui/component/addressbook-storage.c (register_storage): new - function, register our evolution_storage. - (addressbook_storage_setup): remove storage registration from - here. - (load_source_data): register the storage here before we load - addressbook-sources.xml, and deregister it if there are no sources - listed. - (addressbook_storage_remove_source): unregister the storage if the - list of sources hits 0 length. - -2001-07-18 Dan Winship <danw@ximian.com> - - * backend/ebook/e-book.c (e_book_unload_uri): Flush the listener's - queue before unreffing it to ensure that it doesn't emit any more - "responses_queued" signals after the EBook is destroyed. - - * backend/ebook/e-book-listener.c (e_book_listener_check_queue, - e_book_listener_queue_response, e_book_listener_new): Use - bonobo_object_ref/unref rather than gtk_object_ref/unref. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_queue_response, e_book_view_listener_new): - Likewise. - -2001-07-18 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-card-compare.c (simple_query_cb): prune the list - of cards that match our query using the avoid list here, instead - of using the avoid list in the query itself, since ldap can't - handle that. - (use_common_book_cb): remove the block of code including the avoid - list in the query sent to wombat. - -2001-07-17 Chris Toshok <toshok@ximian.com> - - [ Fixes bugs #4611 - crash searching in the name field at Bigfoot for "\" - and #4554 - general ldap search crash ] - - * backend/pas/pas-backend-ldap.c (func_contains): the length of - the big query string needs to take into account the length of the - footer as well as the header - fix random memory corruption here. - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_build_query): - list can be NULL, specifically if there's a parsing error in the - sexp, so deal with it. - -2001-07-17 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_queue_response): Hold a reference to our - listener while the idle function is active. - (e_book_view_listener_check_queue): Only unref the listener when - the idle function is finished. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_clicked): Instead of replacing section->model with - source, copy source onto section->model with - e_select_names_model_overwrite_copy. #if 0/#endif out all of the - stuff related to ETextModels, because it doesn't make any sense to - me, and everything appears to work without it. - (Die bug #2059. Die! Die! Die!) - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_overwrite_copy): Added. Copies the contents - of one ESelectNamesModel onto another. - - * backend/ebook/e-destination.c (e_destination_copy): Made the argument - const. - - * backend/ebook/e-destination.c (e_destination_set_string): Removed - old, broken code and annoying g_messages. - - * backend/ebook/e-book-listener.c - (e_book_listener_queue_response): Hold a reference to the listener - while the idle function is active. - (e_book_listener_check_queue): Only release our reference to the - listener when the queue is empty. These two changes fix a race - condition, since the listener could be unrefed while the listener - was still active. (Seems to fix bug #4485) - -2001-07-17 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/contact-editor.glade, - gui/merging/e-card-duplicate-detected.glade, - gui/merging/e-card-merging-book-commit-duplicate-detected.glade, - printing/e-contact-print.glade: Patch from Taylor Hayward - <thayward@gjpc.com>. Added accelerators to a few dialogs. - -2001-07-16 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/Evolution-Addressbook-SelectNames.idl: - Added addSectionWithLimit to the SelectNames interface. - - * gui/component/select-names/e-select-names-bonobo.c - (impl_SelectNames_add_section_with_limit): Added. Implements - addSectionWithLimit. - (e_select_names_bonobo_construct): Set up as a BonoboEventSource. - (init): Listen for "changed" signals from our manager. - (manager_changed_cb): Notify our listeners if we get a changed - signal from our manager. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_class_init): Added a "changed" signal". - (section_copy): Propogate the signal connection. - (section_free): Disconnect the changed handler. - (e_select_names_manager_add_section_with_limit): Connect to the - new section's model, listening for changes. - (e_select_names_manager_activate_dialog): Connect to the "working - copy" model, listening for changes. - (e_select_names_manager_add_section_with_limit): Added. - (e_select_names_manager_add_section): Changed to just be a special - case of e_select_names_manager_add_section_with_limit. - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_set_limit): Added. Allows a max number of - names allowed in the model. - (e_select_names_model_get_limit): Added. Returns the limit. - (e_select_names_model_at_limit): Added. Returns TRUE if the - model is "full". - (e_select_names_model_insert): Check that we aren't at the - limit before inserting. Silently return if we are. - (e_select_names_model_append): Check that we aren't at the - limit before appending. Silently return if we are. - -2001-07-16 Chris Toshok <toshok@ximian.com> - - [ Fix bug #4705 - LDAP storage gets saved with corrupted binddn] - - * gui/component/addressbook-config.c (addressbook_dialog_apply): - call addressbook_storage_write_sources here after we're done - rebuilding them. - - * gui/component/addressbook-storage.c - (addressbook_storage_clear_sources): don't write the source file - here. - (addressbook_storage_add_source): same. - (addressbook_storage_remove_source): same. - (addressbook_storage_write_sources): new function, write the - source file out. - (addressbook_source_copy): g_strdup the binddn so we don't end up - free'ing it multiple times thanks to copies freeing theirs. - - * gui/component/addressbook-storage.h: add prototype for - address_storage_write_sources. - -2001-07-16 Iain Holmes <iain@ximian.com> - - * backend/pas/evolution-vcard-importer.c (ebook_create): Don't just - use the default directory. Use the directory that is passed into the - load file function. - -2001-07-15 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-destination.c (e_destination_set_string): - Commented out some unused variables and labels. - (e_destination_importv): Check for the xml not parsing correctly - and just return NULL here. - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_import_destinationv): Handle a NULL destv - here. - -2001-07-15 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c (table_drag_data_get): Added a - call to e_table_view_to_model_row here. - (e_addressbook_view_can_print, e_addressbook_view_can_delete, - e_addressbook_view_can_copy): If the selection model is NULL here, - return NULL (this was done before in a g_return_val_if_fail which - is only conditionally included.) - -2001-07-13 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/contact-editor.glade: Changed Company to - Organization here. - -2001-07-12 JP Rosevear <jpr@ximian.com> - - * backend/pas/Makefile.am: add ldap cflags - -2001-07-12 Jeffrey Stedfast <fejj@ximian.com> - - * backend/ebook/e-destination.c (e_destination_xml_decode): - Oops. I introduced my own bug, accidently set `email' to a - g_free'd pointer - eek! - -2001-07-12 Jeffrey Stedfast <fejj@ximian.com> - - * backend/ebook/e-destination.c (e_destination_importv): Optimized - the same way I optimized g_strsplit. If you use a GPtrArray - instead of a linked list, you save yourself from having to iterate - through the list an extra 3 times. - (e_destination_xml_decode): Do NOT, I repeat: do NOT! - e_utf8_xml1_decode something which is already in UTF-8 or you'll - corrupt it!! I smack thee who hath done this evil deed! - -2001-07-12 Iain Holmes <iain@ximian.com> - - * backend/e-book/evolution-vcard-importer.c (support_format_fn): - Check for no extension. Actually same as Jason's fix below :) but - also check the file contents. - -2001-07-12 JP Rosevear <jpr@ximian.com> - - * gui/component/addressbook-config.glade: add accelerators, - taylor's patch - -2001-07-12 Jason Leach <jleach@ximian.com> - - * backend/ebook/evolution-vcard-importer.c (support_format_fn): - Crash fix because strcmp() hates NULL arguments. Bug #3777. - -2001-07-11 Jason Leach <jleach@ximian.com> - - * gui/component/select-names/e-select-names.c (remove_cb): Added - some comments for clarity and fixed a pretty noticable bug with - how right click "Remove" was deleting more than it should with - consecutive runs. - -2001-07-10 Chris Toshok <toshok@ximian.com> - - * backend/pas/evolutionperson.schema: assign OID's to the schema - entries, and add schema support for contact lists. - -2001-07-10 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): Set - bf->priv->file_db before calling do_create. - -2001-07-06 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook-component.c (factory_fn): Fixed order - of arguments to evolution_shell_component_new. - -2001-07-08 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_insert_length): Check that str isn't - the empty string before doing an insert. - - * backend/ebook/e-destination.c (e_destination_set_string): We were - being too smart for our own good here, and causing problems for - the completion code... (bug #4253, bug #4255, bug #4280) - (e_destination_set_name): Clear any cached address. - (e_destination_set_email): Clear any cached address. - (e_destination_get_address): Handle the cases where the name - contains some e-mail information. - -2001-07-09 Kjartan Maraas <kmaraas@gnome.org> - - * gui/contact-list-editor/e-contact-list-editor.c: Marked a - string for translation. Also add the neccesary includes to make - _() macros work. - -2001-07-07 Jon Trowbridge <trow@ximian.com> - - * gui/widgets/e-minicard.c (add_field): Detect the embedded - EDestination XML, and convert it to a nice-looking e-mail address. - - * gui/contact-list-editor/e-contact-list-editor.c: Adjusted to - reflect changes to EContactListModel. (Yeah, this is vague, - but the changes are _really_ obvious and boring.) - - * gui/contact-list-editor/e-contact-list-model.c: Revamped - to make everything an EDestination, rather than storing either - cards or strings. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_insert_length): Use - e_destination_get_textrep. - - * gui/component/select-names/e-select-names-table-model.c - (fill_in_info): Use e_destination_get_name and - e_destination_get_email. - - * gui/component/select-names/e-select-names-popup.c - (popup_menu_card): Use e_destination_get_name instead of - e_card_name_to_string. - (quick_add_cb): Use e_destination_get_address. - (popup_menu_nocard): Use e_destination_get_name. - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_changed): Removed obsolete debugging code. - (e_select_names_model_get_textification): Use e_destination_get_textrep. - (e_select_names_model_get_address_text): Use e_destination_get_address. - (e_select_names_model_get_string): Use e_destination_get_textrep. - (e_select_names_model_replace): Use e_destination_get_textrep. - (e_select_names_model_name_pos): Use e_destination_get_textrep. - - * gui/component/select-names/e-select-names-completion.c - (emailify_match): Match only if this isn't a contact list. - (match_email): Match only if this isn't a contact list. - (match_name): Do the right thing in the case of a contact list. - (book_query_process_card_list): Don't construct a match for - each possible e-mail address if this is a contact list. - - * backend/ebook/e-destination.c: Major-league de-crufting and - rationalization, combined with lots of hacks to make things work - properly with contact lists. - (e_destination_copy): Copy contact list info. - (e_destination_clear_card): Clear contact list info. - (e_destination_is_empty): If we contain a contact list, we aren't - empty. - (e_destination_set_card_uri): Added. Allows us to set a - destination by card URI. - (e_destination_set_name): Allows the contact's name only ("Jane - Smith") to be set. - (e_destination_set_email): Allows the contact's e-mail only - ("jane@assbarn.com") to be set. - (e_destination_set_string): Takes a free-form string containing a - contact's name and/or e-mail, and tries to do the right thing with - it. - (e_destination_contains_card): Renamed. Used to be - e_destination_has_card. - (e_destination_from_card): Added. Returns TRUE if the - EDestination comes from either a ECard (which we presently hold) - or is specified by an ECard URI. - (e_destination_use_card): Allows an EDestination's ECard to be - accessed, via a callback. If we only are holding the URI, the - card will be loaded and stored in the EDestination. - (e_destination_get_name): Returns the name only ("Jane Smith"), or - NULL. - (e_destination_get_email): Returns the email only - ("jane@assbarn.com"), or NULL. - (e_destination_get_address): Added. Returns a "full address" if - both the name & e-mail are available ("Jane Smith - <jane@assbarn.com>"), or just the e-mail if the name is unknown - ("jane@assbarn.com>"). If the destination is a contact list, - returns a comma-separated list of addresses. - (e_destination_get_textrep): Added. Returns a "text - representation" of the EDestination. This is what is now - displayed for completed, "cardified" destinations in addressbook - entries. - (e_destination_is_evolution_list): Check to see if this - destination is for a contact list. - (e_destination_xml_encode): Added. Build an XML data structure - representing an EDestination. - (e_destination_xml_decode): Added. Parse an XML data structure, - constructing an EDestination. - (e_destination_export): Added. Returns a null-terminated string - containing an XML representation of the EDestination, with - newlines and excess whitespace removed. - (e_destination_import): Added. Parses a string containing an XML - representation of an EDestination. - (e_destination_exportv): Added. Returns a null-terminated string - containing an XML representation of a collection of EDestinations, - with newlines and excess whitespace removed. - (e_destination_importv): Added. Takes an XML representation of a - collection of destinations, parses it, and returns a vector of - EDestinations. - - * backend/ebook/e-card.c (e_card_duplicate): Copy the ->book - pointer. - (e_card_get_id): Check that the argument is valid. - (e_card_set_id): Check that the argument is valid. - (e_card_get_book): Added. Return the EBook the ECard came from. - (e_card_get_uri): Added. Tries to returns a URI for the ECard, - which is of the form (EBook URI)/(ECard unique ID). Returns NULL - if the EBook URI or the ID are unknown/not set. - (e_card_get_vobject): If we have the URI, use it as the - VCUniqueStringProp, rather than just the ID. This is a hack to - make DnD work properly. - (parse_id): Detect if the unique ID we've been passed is a URI or - just a plain card ID, and do the right thing in either case. - (e_card_uri_extract_book_uri): Added. Convenience function for - parsing card URIs. - (e_card_uri_extract_card_id): Added. Convenience function for - parsing card URIs. - (e_card_load_uri): Added. Allows an ECard to be loaded by its - URI. - - * backend/ebook/e-book-view.c: Added a EBook * to the - _EBookViewPrivate struct. This is meant to contain the EBook the - EBookView is associated with. - (add_book_iterator): Added. A convenience function for attaching - the EBook to a GList of cards (if no EBook is already stored). - (e_book_view_do_added_event): Record the EBook in the added - ECards. - (e_book_view_do_modified_event): Record the EBook in the modified - ECards. - (e_book_view_set_book): Added. Stores a pointer to the - EBookView's "parent" EBook. - (e_book_view_init): Init book_view->priv->book to NULL. - (e_book_view_destroy): Unref book_view->priv->book. - - * backend/ebook/e-book.c: Added a uri field to _EBookPrivate. - (e_book_unqueue_op): Removed debugging spew. - (e_book_do_response_get_view): Attach the current EBook to the - created EBookView. - (e_book_do_response_get_changes): Attach the current EBook to the - created EBookView. - (e_book_load_uri): Save a copy of the uri in the EBook. - (e_book_get_uri): Added. Just returns book->priv->uri. - (e_book_get_card): Attach a pointer to the Ebook to the - newly-loaded ECard. - (e_book_add_card): Attach a pointer to the EBook to the - newly-added ECard. - (e_book_commit_card): Attach a pointer to the EBook to the - committed ECard. - (e_book_init): Initialize the uri to NULL. - (e_book_destroy): Free the uri string on destruction. - -2001-07-06 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (populate_context_menu): - Removed. [It was just bogus testing code for the right-click menu - populating interface in the shell]. - (factory_fn): Pass NULL as the PopulateContextMenuFn. - -2001-07-05 Anna Marie Dirks <anna@ximian.com> - - * gui/contact-list-editor/contact-list-editor.glade: - Added some accelerators, padding, and a "memebers" frame; - also fixed spacing and growth behaviour of this dialog. - -2001-07-05 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-file.c (compare_category): Fix a memory - leak here. - -2001-07-05 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-compare.c (match_search_info_free): Set - info->avoid = NULL. This shouldn't make a difference, but it - can't hurt. - -2001-07-05 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-table-adapter.c - (addressbook_is_cell_editable): Check if the row is within our - table and return from this function as if the card is a standard - card, not a list. - -2001-07-03 Damon Chaplin <damon@ximian.com> - - * backend/ebook/Makefile.am (evolution_vcard_importer_LDADD): - added $(BONOBO_CONF_LIBS) to get it to compile. - -2001-07-02 Christopher James Lahey <clahey@ximian.com> - - * gui/component/Makefile.am (evolution_addressbook_LDADD): Added - $(BONOBO_CONF_LIBS). - - * gui/component/select-names/e-select-names.c - (e_select_names_create_categories), - gui/contact-editor/e-contact-editor.c (categories_clicked): - Switched to an ECategoriesMasterListWombat instead of an - ECategoriesMasterListArray here. - -2001-07-02 Peter Williams <peterw@ximian.com> - - * gui/contact-editor/Makefile.am (INCLUDES): srcdir != - builddir compile fix. - - * gui/contact-list-editor/Makefile.am (INCLUDES): Same. - - * gui/widgets/Makefile.am (INCLUDES): Same. - - * gui/search/Makefile.am (INCLUDES): Same. - -2001-07-02 Christopher James Lahey <clahey@ximian.com> - - * gui/contact-editor/e-contact-editor.c (categories_clicked): - Turned off wombatification of the categories master list here. - -2001-07-01 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/e-contact-list-editor.c (fill_in_info): - use ECARD_UID_LINK_PREFIX. - - * gui/contact-list-editor/e-contact-list-model.c - (e_contact_list_model_get_email): use ECARD_UID_LINK_PREFIX. - - * backend/ebook/e-destination.h: add prototype for - e_destination_importv_list. - - * backend/ebook/e-destination.c (e_destination_importv_list): new - function, take an ECard corresponding to an address list and - resolve any linked cards, returning an EDestination vector. - - * backend/ebook/e-card.h (ECARD_UID_LINK_PREFIX): #define this here, - since we need to use it in a few places. - -2001-07-02 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added - related_contacts field. - - * gui/component/select-names/e-select-names-model.c, - gui/component/select-names/e-select-names-model.h - (e_select_names_model_import_destinationv): Added this function. - - * gui/contact-editor/contact-editor.glade: Replaced the entry here - for related contacts with a table which is filled in in the C code. - - * gui/contact-editor/e-contact-editor.c, - gui/contact-editor/e-contact-editor.h (add_lists): Added a select - names entry here for the related contacts field. - - * gui/widgets/Makefile.am: Removed all the test programs here - since there are circular dependencies now. - -2001-07-01 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-destination.c (e_destination_get_string): Fall - back to use the name field if all else fails (which can happen - with imported EDestinations). - - * backend/ebook/e-destination.c (e_destination_is_empty): Fix for the - "recipient not specified" bug --- we were not correctly checking - for whether or not an EDestination was actually empty. - -2001-06-30 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-card.c (e_card_evolution_list): Check args. - Somewhere in the code (somewhere in the minicard stuff) this can - be called with a NULL arg, which was causing crashes. - (e_card_evolution_list_show_addresses): Check args. - - * backend/ebook/e-destination.c (build_field): I was accidentally - comparing characters and strings here, and didn't see the compiler - warning. Fixed. - (e_destination_exportv): Don't export any empty destinations. - (bug#3825). - -2001-06-30 Zbigniew Chyla <cyba@gnome.pl> - - * gui/component/e-address-popup.c (e_address_popup_construct): Marked - strings for translation. - -2001-06-30 Jon Trowbridge <trow@ximian.com> - - * gui/merging/e-card-merging.c (match_query_callback): Make the - standard for considering two cards to be match stricter. - - * gui/component/select-names/e-select-names-completion.c - (make_match): Use the card's use-score to set the match's - sort_major value. - (match_name): Removed obsolete code. - (e_select_names_completion_begin): Added (double) cast to make - match->score calculation come out properly. - - * backend/ebook/e-card.c: Added X-EVOLUTION-LAST-USE and - X-EVOLUTION-USE-SCORE to attribute_jump_array. - (e_card_get_today): Added. A convenience routine for getting - today's date and putting it in a GDate. - (e_card_get_use_score): Added. Compute the current, time-decayed, - use-score for the card. - (e_card_touch): Increment the use-score by one; update the last - used date. - (e_card_date_to_string): Added as a convenience routine, getting - rid of some code duplication. - (e_card_get_vobject): Add handlers for X-EVOLUTION-USE-SCORE and - X-EVOLUTION-LAST-USE. - (parse_last_use): Added. - (parse_use_score): Added. - (e_card_class_init): Added args for last-use and use-score. - (e_card_get_arg): Added handlers for last-use and use-score. - o - (e_card_set_arg): Added handlers for last-use and use-score. - - * backend/ebook/e-destination.c: Added pending_card_id to - EDestinationPrivate struct. - (e_destination_copy): Copy the pending_card_id. - (e_destination_is_empty): Check for a pending_card_id. We are - non-empty if we have one. - (e_destination_clear_card): Clear pending_card_id. - (e_destination_set_card): Clear pending_card_id. - (e_destination_has_pending_card): Added. - (e_destination_use_card): Added. An asynchronous way to load a - pending card and then apply a callback to it. - (build_field): Be paranoid, map our special characters to '_'. - (e_destination_export): Use EXPORT_MAX_FIELDS symbol rather than a - hard-wired array size. Added the "card" entry. - (e_destination_import): Fix bug in handling of the "name" field. - Process the "card" field. - (e_destination_touch): "Touch" and commit the ECard corresponding - to the e-mail address in the destination. (A query against the - local addressbook is actually performed, in case the destination - isn't cardified. - - * backend/ebook/e-card-compare.c (e_card_compare_name): Revamp the - way E_CARD_MATCH_FOO results are mapped to comparison results. - Report better matches when the family name is matched. - -2001-06-29 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c (update_query): - Added a search field to the query here. - (e_select_names_init): Update the query on a number of signals here. - - * gui/component/select-names/e-select-names.h: Added search_entry - here. - - * gui/component/select-names/select-names.glade: Added the search - entry here. Added some labels. Removed the update button. - -2001-06-29 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_option_activated): Change the uri here to have - addressbook.db at the end. - - * gui/component/select-names/select-names.glade: Changed the name - of the folder option menu here to match the name used in the code. - -2001-06-29 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c (update_query): - Change the query when the "Update List" button is pushed. - - * gui/component/select-names/e-select-names.h: Removed - currently_selected field. Added categories_entry field. - - * gui/component/select-names/select-names.glade: Added "Update - List" button. - -2001-06-29 Chris Toshok <toshok@ximian.com> - - * gui/widgets/Makefile.am (INCLUDES): add EVOLUTION_IMAGESDIR - define. - - * gui/widgets/e-minicard.h (struct _EMinicard): add our pixbuf and - pixbuf size. - - * gui/widgets/e-minicard.c (e_minicard_init): init the icon pixbuf - and its size. - (e_minicard_destroy): unref the list_icon_pixbuf. - (e_minicard_realize): create the list_icon GnomeCanvasPixbuf. - (e_minicard_resize_children): clip the header_text by the - list_icon, and place the list_icon in the right spot. - (remodel): show the list_icon if we're a list, and hide it - otherwise. - -2001-06-28 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c (table_double_click): pop up - list editor for lists, contact editor otherwise. - - * gui/widgets/e-minicard.c (e_minicard_event): same. - - * gui/widgets/e-minicard.h (struct _EMinicard): change "editor" to - GtkOjbect, since it can be either a contact editor or contact list - editor. - - * gui/widgets/e-addressbook-table-adapter.c - (addressbook_is_cell_editable): don't allow editting of any fields - except the name and file_as for lists. - -2001-06-28 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/Makefile.am (INCLUDES): remove ancient - e-table include, and add include for contact-editor so we can - reuse the confirm_delete dialog. - - * gui/contact-list-editor/e-contact-list-editor.h (struct - _EContactListEditor): remove prototype for - e_contact_list_editor_close, since the function no longer exists. - - * gui/contact-list-editor/e-contact-list-editor.c - (list_deleted_cb): new function, emit our "list_deleted" signal. - (delete_cb): new function, called from the Delete toolbar item. - (e_contact_list_editor_raise): flesh out function. - (extract_info): "evolution_list" => "list". - (fill_in_info): same. - -2001-06-28 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-card.c (e_card_get_vobject): add support for - X-EVOLUTION-LIST and X-EVOLUTION-LIST-SHOW-ADDRESSES. - (parse_list): new function, parse the boolean X-EVOLUTION-LIST. - (parse_list_show_addresses): new function, parse the boolean - X-EVOLUTION-LIST-SHOW-ADDRESSES. - (e_card_class_init): add args for "list" and - "list_show_addresses". - (e_card_set_arg): add support for list and list_show_addresses. - (e_card_get_arg): same. - (e_card_init): init list and list_show_addresses. - -2001-06-27 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (factory_fn): Pass NULL as - the @external_uri_schemas argument to - `evolution_shell_component_new()'. - -2001-06-27 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/e-contact-list-model.c - (contact_list_row_count): track storage change - we're only using - 1 array now. - (contact_list_value_at): same. - (contact_list_model_destroy): same. - (e_contact_list_model_init): same. - (e_contact_list_model_add_email): same. - (e_contact_list_model_add_card): same. - (e_contact_list_model_remove_row): same. - (e_contact_list_model_remove_all): new function - just free/unref - all existing rows. - (e_contact_list_model_get_email): new function, returns the - alloc'ed string containing either an email address or an encoded - ECardId. - - * gui/contact-list-editor/e-contact-list-model.h: remove the 2 - separate arrays for email and cards, and store them in the same - array. - - * gui/contact-list-editor/e-contact-list-editor.h (struct - _EContactListEditor): add the visible_addr_checkbutton widget. - - * gui/contact-list-editor/e-contact-list-editor.c - (visible_addrs_toggled_cb): new function. - (e_contact_list_editor_init): connect to "toggled" on - visible_addrs_checkbutton. - (file_save_cb): new function. - (tb_save_and_close_cb): new function. - (verbs): add Save and Save & Close. - (list_added_cb): new function. - (list_modified_cb): new function. - (save_card): new function - we do *not* use e_card_merging_* calls - here. - (e_contact_list_editor_get_arg): un-#if 0 code in the "card" - getter. - (e_contact_list_editor_set_arg): same for the "card" setter. - (extract_info): new function. - (fill_in_info): new function. - - * gui/contact-list-editor/contact-list-editor.glade: add a - checkbutton at the bottom to determine whether to visibly include - mail addresses in mail sent to this list. - -2001-06-26 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_create_categories): Oops. Can't use the wombat - version of the master categories list yet. - -2001-06-26 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-table-adapter.c (create_card): memmove - counts were off in this function. - (remove_card, modify_card): Moved the table notifications around a - bit here. - -2001-06-26 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h, - gui/component/select-names/select-names.glade - (e_select_names_create_categories): Added a categories combo here. - It's not used yet. - -2001-06-26 Christopher James Lahey <clahey@ximian.com> - - * gui/search/addresstypes.xml: Added category searching to the - advanced search dialog here. - -2001-06-26 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-file.c (compare_category): Added - category searching to the file backend. - - * gui/component/addressbook.c (addressbook_query_changed): Added - category searching to the search bar. - -2001-06-25 Peter Williams <peterw@ximian.com> - - * conduit/Makefile.am (INCLUDES): Fix for srcdir != builddir. - -2001-06-25 Chris Toshok <toshok@ximian.com> - - * gui/contact-list-editor/contact-list-editor.glade: change layout - slightly, the icon no longer pushes everything to the left, and - make the buttons on the right smaller and more in line with the - other widgets. - - * gui/contact-list-editor/e-contact-list-model.c - (contact_list_value_at): return the SimpleAndString->string - instead of querying the ecardsimple. - (e_contact_list_model_init): initially allocate 10 of each type - (email and simple). - (e_contact_list_model_add_email): realloc if need be. - (e_contact_list_model_add_card): same, and initialize the string - displayed to be "[Name] [<email>]". - (e_contact_list_model_remove_row): change for SimpleAndString. - (contact_list_model_destroy): free our 2 arrays. - - * gui/contact-list-editor/e-contact-list-model.h: add alloc counts - and the SimpleAndString struct. - - * gui/contact-list-editor/e-contact-list-editor.c: Helix Code => - Ximian. - (e_contact_list_editor_init): hook up d&d destination signals, and - un-#if 0 the delete_event signal. - (table_drag_motion_cb): new function. - (table_drag_drop_cb): new function. - (table_drag_data_received_cb): new function. - (file_close_cb): new function. - (verbs) uncomment the close verb. - (close_dialog): new function. - (app_delete_event_cb): new function. - - * gui/contact-list-editor/e-contact-list-editor.h: Helix Code => - Ximian. - -2001-06-25 Jon Trowbridge <trow@ximian.com> - - * gui/component/e-address-popup.c: Add a huge steaming pile of - code to handle the case of single-address merging. In other - words, if you go to "harvest" an address by right-clicking on it - in the mail viewer, and you already have a closely-matching - contact (w/ a different e-mail address), this gives you the - option of editting that contact's e-mail addresses to add the - one you just clicked on. - - * backend/ebook/e-card-compare.c (match_search_info_free): It is - amazing how much better things work when you don't try to - dereference the pointer you just freed. - -2001-06-24 Chris Toshok <toshok@ximian.com> - - * gui/widgets/Makefile.am (minicard_test_LDADD): correct path to - libecontacteditor.a. - (minicard_widget_test_LDADD): same. - (INCLUDES): same, for the includes. - - * gui/widgets/e-minicard.h: correct e-contact-editor.h path. - - * gui/widgets/e-addressbook-util.h: correct path to - e-contact-editor.h, and add e-contact-list-editor.h. Add - prototype for e_addressbook_show_contact_list_editor. - - * gui/widgets/e-addressbook-util.c: remove #include - "e-contact-editor.h" (our header includes it.) - (added_cb): rename card_added_cb to this, and make it so it can be - reused in both the list and card cases. remove the g_print too. - (modified_cb): same for modified case. - (deleted_cb): same for deleted case. - (editor_closed_cb): change first arg to GtkObject* so we can reuse - this for both list and card. - (e_addressbook_show_contact_editor): use added_cb, modified_cb, - deleted_cb, and pass FALSE as user_data. - (e_addressbook_show_contact_list_editor): new function, same as - above but creating a contact-list-editor, and pass TRUE as - user_data. - - * gui/component/e-address-popup.c: correct path to contact-editor. - - * gui/component/e-address-widget.c: same. - - * gui/component/select-names/e-select-names-popup.c: same. - - * gui/component/select-names/e-select-names-text-model.c: same. - - * gui/component/addressbook.c (new_contact_list_cb): new function. - (update_command_state): update ContactNewList command. - (verbs): remove ViewAll from the toolbar from the verb list. Add - ContactNewList. - (pixmaps): same for pixmaps. - - * gui/component/Makefile.am (evolution_addressbook_LDADD): new - path for contact-editor. - (INCLUDES): same. - - * gui/contact-list-editor/e-contact-list-model.h: - * gui/contact-list-editor/e-contact-list-model.c: - * gui/contact-list-editor/e-contact-list-editor.h: - * gui/contact-list-editor/e-contact-list-editor.c: - * gui/contact-list-editor/Makefile.am: Initial contact-list editor - commit. - - * gui/Makefile.am (SUBDIRS): add contact-editor. - - * Makefile.am: (SUBDIRS): remove contact-editor. - -2001-06-21 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-popup.c - (make_contact_editor_cb): Renamed. (The old name, - edit_contact_info_have_book_cb was a hold-over from before, when - we weren't using e_book_use_local_address_book.) - - * gui/component/e-address-popup.c - (e_address_popup_schedule_refresh): A Added. We now do the name - refreshes in an idle function, rather than in the setters. - (e_address_popup_set_free_form): Added. Properly handle inputs of - the form "Foo <bar@zar.com>", extracting the name and e-mail - address. - (e_address_popup_set_name): Check to make sure that the free-form - handler shouldn't be used to handle the input. Schedule a refresh - after making any changes. - (e_address_popup_set_email): Check to make sure that the free-form - handler shouldn't be used to handle the input. Schedule a refresh - after making any changes. - (e_address_popup_name_only_matches): Temporary place-holder for - handling name-only matches. - (query_cb): If our initial query fails (and included e-mail - information), do a name-only query. This is to handle the case of - adding new e-mail addresses to existing contacts. - (e_address_popup_query): Eliminated the "common_book" crap; using - e_book_use_local_address_book instead. - - * backend/ebook/e-card-compare.c (match_search_info_free): Make - sure that the ->avoid list gets properly freed. - -2001-06-20 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_get_supported_fields): fix a refcounting - memleak. - -2001-06-20 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-listener.c - (e_book_listener_queue_get_supported_fields_response): fix memory - leak. - -2001-06-20 Chris Toshok <toshok@ximian.com> - - * contact-editor/e-contact-editor.c: add prototype for - close_dialog to remove warnings. - -2001-06-20 Dave Camp <dave@ximian.com> - - * backend/ebook/e-card.c (e_card_list_send): Changed attach_data - to be a GNOME_Evolution_Composer_AttachmentData rather than a - CORBA_char*. - -2001-06-19 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-view.c (table_double_click): track - change to e_addressbook_show_contact_editor signature. - - * gui/widgets/e-minicard-view.c (e_minicard_view_event): same. - - * gui/widgets/e-minicard.c (e_minicard_event): same. - - * gui/widgets/e-addressbook-util.c (e_addressbook_error_dialog): - add an entry for "Card ID already exists". - (e_addressbook_show_contact_editor): track the change to signal - names and e_contact_editor_new signature here. - - * gui/widgets/e-addressbook-util.h: change - e_addressbook_show_contact_editor's signature to match - e_contact_editor_new more closely. - - * gui/widgets/e-addressbook-table-adapter.c (unlink_model): free - up the simple mapping to plug a potentially sizeable memory leak. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_activate_obj): call - e_addressbook_show_contact_editor here. - - * gui/component/select-names/e-select-names-popup.c - (edit_contact_info_have_book_cb): remove the get_supported_fields - stuff, since the contact editor handles it for us now, and call - e_addressbook_show_contact_editor. - - * gui/component/e-address-popup.c (edit_contact_info_cb): same. - - * gui/component/addressbook.c (new_contact_cb): track change to - e_addressbook_show_contact_editor. - -2001-06-19 Chris Toshok <toshok@ximian.com> - - * contact-editor/e-contact-quick-add.c (ce_have_book): rename - ce_book_found_fields to this, remove the fetching of fields (the - contact editor code handles that now.), and change the add_card - signal to card_added. - (card_added_cb): copied somewhat from merge_cb above. we don't - need to do the merge here, just call the callback. - - * contact-editor/e-contact-editor.c (e_contact_editor_class_init): - track signal change. add book arg, and is_read_only -> editable. - (wants_html_changed): if the card isn't already changed, flag it - as such (and update the commands.) - (phone_entry_changed): same. - (email_entry_changed): same. - (address_text_changed): same. - (name_entry_changed): same. - (company_entry_changed): same. - (full_name_clicked): is_read_only -> editable. - (full_addr_clicked): same. - (card_added_cb): new function, emit our card_added signal, and - close the dialog if we're supposed to. properly deal with error - status here. - (card_modified_cb): same, modulo card_added -> card_modified. - (save_card): actually call e_card_merging_book_{add/commit}_card - instead of using a signal. Also, add a gboolean arg to tell - whether or not to close the dialog after saving the card. - (card_deleted_cb): new function, just emit our "card_deleted" - signal. - (delete_cb): actually call e_book_remove_card here, instead of - using a signal. - (tb_save_and_close_cb): call save_card with TRUE for should_close. - (e_contact_editor_init): init changed = FALSE; - (e_contact_editor_destroy): unref our book if we have one. - (e_contact_editor_new): new signature, set the "book" arg, and - call e_book_get_supported_fields here. - (supported_fields_cb): new function, show the contact editor. - (e_contact_editor_set_arg): initialize changed to FALSE when - setting the card (but *after*, since the changed callbacks will - set it to TRUE.) also, call command_state_changed if editable - changes. also handle setting "book". oh, and is_read_only -> - editable. - (command_state_changed): new function - set the state of the - commands we care about. - (e_contact_editor_get_arg): add "book" handling, and is_read_only - -> editable. - (_phone_arrow_pressed): is_read_only -> editable. - (_email_arrow_pressed): same. - (_address_arrow_pressed): same. - (enable_writable_fields): same. - (set_editable): rename set_read_only to this, and is_read_only -> - editable. - - * contact-editor/e-contact-editor.h (struct _EContactEditor): - is_read_only -> editable, add a "changed" flag so we can sensitize - commands correctly, and add an EBook* arg to e_contact_editor_new - and to the EContactEditor struct. Also, change all the signals to - past tense, and send the EBookStatus in them. - - * contact-editor/e-contact-editor-address.c - (e_contact_editor_address_class_init): is_read_only -> editable. - (e_contact_editor_address_set_arg): same. - (e_contact_editor_address_get_arg): same. - - * contact-editor/e-contact-editor-address.h (struct - _EContactEditorAddress): same. - - * contact-editor/e-contact-editor-fullname.c - (e_contact_editor_fullname_class_init): same. - (e_contact_editor_fullname_set_arg): same. - (e_contact_editor_fullname_get_arg): same. - - * contact-editor/e-contact-editor-fullname.h (struct - _EContactEditorFullname): same. - - * contact-editor/Makefile.am: don't build contact-editor-test now, - until contact-editor gets moved to gui/ and we can more easily - depend on the e_card_merging_* calls. - - * backend/pas/pas-backend-ldap.c (ldap_error_to_response): return - CardIdAlreadyExists for LDAP_ALREADY_EXISTS. - - * backend/idl/addressbook.idl: Add CardIdAlreadyExists to the - BookListener status enum. - - * backend/ebook/e-book-types.h: add - E_BOOK_STATUS_CARD_ID_ALREADY_EXISTS. - - * backend/ebook/e-book-listener.c - (e_book_listener_convert_status): add support for - CardIdAlreadyExists. - -2001-06-19 Jon Trowbridge <trow@ximian.com> - - * contact-editor/e-contact-quick-add.c: Serious de-crufting, - removal of gtk_object_set_data() hacks, simplified by using - some of the newer ebook convenience routines, etc. - (ce_book_found_fields): - s/e_contact_editor_raise/e_contact_editor_show/, to accomodate the - small changes in the contact editor API. - -2001-06-18 Eskil Heyn Olsen <eskil@eskil.dk> - - * conduit/address-conduit.c: (check_for_slow_setting), - (conduit_get_gpilot_conduit): - Tweaked for some gnome-pilot api changes - -2001-06-15 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (search_for_dn): implement this - properly, using base and (objectclass=*). - -2001-06-14 Chris Toshok <toshok@ximian.com> - - * contact-editor/e-contact-editor.c (delete_cb): save ourselves a - function call - call close_dialog instead of file_close_cb. - -2001-06-14 Jeffrey Stedfast <fejj@ximian.com> - - * gui/component/addressbook-component.c: Set the - "expoted_dnd_types" to NULL in the folder_types. - -2001-06-11 Dan Winship <danw@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (search_override_check): Add a workaround for an EText bug. - (e_select_names_completion_begin): Fix up the match scoring in the - search_override case so the lines are offered in the correct - order. - -2001-06-11 Christopher James Lahey <clahey@ximian.com> - - * gui/merging/Makefile.am (glade_DATA): Added - e-card-merging-book-commit-duplicate-detected.glade here. - - * gui/merging/e-card-merging-book-commit-duplicate-detected.glade: - Added this file. The GUI for asking whether to commit a modified - card. - - * gui/merging/e-card-merging.c, gui/merging/e-card-merging.h - (e_card_merging_book_commit_card): Added this function. - - * gui/widgets/e-addressbook-table-adapter.c - (addressbook_set_value_at), gui/widgets/e-addressbook-util.c - (commit_card_cb), gui/widgets/e-minicard.c (e_minicard_event): Use - e_card_merging_book_commit_card instead of e_book_commit_card here. - -2001-06-11 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - Made e_card_simple_get_id return const char *. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Made - e_card_get_id return const char *. - - * gui/component/e-cardlist-model.c (e_cardlist_model_add): Made id - variable const here. Added a break to make it slightly more - efficient. - - * gui/widgets/e-minicard.c, gui/widgets/e-minicard.h: Made - e_minicard_get_card_id return const char *. - -2001-06-11 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-file.c (entry_compare): Made this handle - the "id" property in searches. - (pas_backend_file_process_modify_card): Made id variable const - here. - - * backend/pas/pas-backend-ldap.c (modify_card_handler): Made id - variable const here. - -2001-06-11 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-book-listener.c, - backend/ebook/e-book-listener.h, backend/ebook/e-book.c: Rolled - back the change 2 ago, dated 06/11/2001 01:51 in CVS, involving - e-book-listener.[ch] and e-book.c. - -2001-06-11 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-book.c (e_book_load_uri, - e_book_get_supported_fields, e_book_authenticate_user, - e_book_remove_card_by_id, e_book_add_vcard, e_book_commit_vcard, - e_book_get_cursor, e_book_get_book_view, e_book_get_changes): Made - it so that all of these functions queue their ops before calling - their CORBA functions. This way, if the response is sent back - before the CORBA function returns there's no problem. Added - e_book_unqueue_op so that the op could be unqueued if the CORBA - call fails. - -2001-06-11 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-book-listener.c, backend/ebook/e-book-listener.h - (e_book_listener_unpop_response): Added this function to put a - response back into the queue. - - * backend/ebook/e-book.c (e_book_check_listener_queue, - e_book_queue_op): Handle the case where the op hasn't been queued - yet when we get the response. In this case we unpop the response. - Also, when queueing an op, we check to see if there are any - responses waiting. - - * This change has been reverted. - -2001-06-11 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-compare.c, backend/ebook/e-card-compare.h - (e_card_locate_match_full): Added this function to let you do - slightly more complicated searches. - - * gui/merging/e-card-merging.c (e_card_merging_book_add_card): Use - e_card_locate_match_full to check if the card exists in the book - it's being added to instead of in the default book. - -2001-06-09 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (match_name): Removed unused email variable. - -2001-06-09 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-compare.c (use_common_book_cb): Null - terminate the strv here. - (e_card_locate_match): ref here instead of unref. - - * backend/ebook/e-card-simple.c (e_card_simple_get): Handle a NULL - card here. - - * contact-editor/Makefile.am (INCLUDES), gui/widgets/Makefile.am - (INCLUDES): Added addressbook/gui/merging here. - - * contact-editor/e-contact-quick-add.c (book_ready_cb), - gui/component/addressbook-component.c (dnd_drop_book_open_cb), - gui/widgets/e-addressbook-table-adapter.c - (addressbook_append_row), gui/widgets/e-addressbook-util.c - (add_card_cb), gui/widgets/e-addressbook-view.c - (selection_received), gui/widgets/e-minicard-control.c - (book_open_cb): Use e_card_merging_book_add_card instead of - e_book_add_card here. - - * gui/Makefile.am (SUBDIRS): Added merging. - - * gui/component/Makefile.am (evolution_addressbook_LDADD), - gui/widgets/Makefile.am (minicard_test_LDADD, - minicard_widget_test_LDADD): Added libecardmerging.a here. - - * gui/merging/, gui/merging/.cvsignore, gui/merging/Makefile.am: - New addressbook library. - - * gui/merging/e-card-duplicate-detected.glade: Glade file for - duplicate detected dialog. - - * gui/merging/e-card-merging.c, gui/merging/e-card-merging.h: New - files for detecting duplicates before adding and putting up a - dialog if duplicates are found. - - * gui/widgets/e-minicard-view.c: Include e-addressbook-util.h - here. - -2001-06-08 Chris Toshok <toshok@ximian.com> - - * contact-editor/e-contact-editor.c (e_contact_editor_new): remove - the gtk_widget_show call... - (e_contact_editor_show): and put it here. - - * contact-editor/e-contact-editor.h: add prototype for - e_contact_editor_show. - - * gui/widgets/e-minicard.c (e_minicard_event): call - e_addressbook_show_contact_editor. - (card_modified_cb): call e_addressbook_error_dialog if status != - SUCCESS. - - * gui/widgets/e-minicard-view.c (e_minicard_view_event): call - e_addressbook_show_contact_editor. also, use card_modified_cb as - the commit_card callback. - - * gui/widgets/e-addressbook-view.c (table_double_click): clean - this area up alot, call e_addressbook_show_contact_editor. - (card_deleted_cb): call e_addressbook_error_dialog. - - * gui/widgets/e-addressbook-table-adapter.c - (card_modified_cb): new function, call e_addressbook_error_dialog - if the status != SUCCESS. - (addressbook_set_value_at): use card_modified_cb as the callback - for e_book_commit_card. - - * gui/widgets/Makefile.am (libeminicard_a_SOURCES): add - e-addressbook-util.[ch]. - - * gui/component/addressbook.c (new_contact_cb): use - e_addressbook_show_contact_editor here. - -2001-06-05 Christopher James Lahey <clahey@ximian.com> - - * contact-editor/e-contact-editor.c (categories_clicked): Remove - references to ECategoryMasterListWombat. - -2001-06-05 Jason Leach <jleach@ximian.com> - - * gui/component/select-names/e-select-names.c (remove_cb): Make - this work when multiple names are selected then right - click->Remove. - -2001-06-05 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card.c (e_card_set_arg): Copy dates as they come - in. - - * backend/pas/pas-backend-file.c - (pas_backend_file_changes_foreach_key, pas_backend_file_changes, - pas_backend_file_process_remove_card, - pas_backend_file_process_modify_card, - pas_backend_file_build_all_cards_list, pas_backend_file_get_vcard, - pas_backend_file_maybe_upgrade_db): memset DBTs to 0 before using - them. - (pas_backend_file_build_all_cards_list): Reindented. - - * contact-editor/contact-editor.glade: Replaced GnomeDateEdits - with a custom widget that creates an EDateEdit. - - * contact-editor/e-contact-editor.c: Use an EDateEdit here instead - of a GnomeDateEdit. - -2001-06-05 Jason Leach <jleach@ximian.com> - - (Fix bug #655: SelectNames doesn't let you remove addresses after - you add them) - - * gui/component/select-names/e-select-names.c - (section_right_click_cb): New function, provides a popup menu with - just "Remove" in it. - (remove_cb): New callback to do the remove. - (e_select_names_add_section): Attach the "right_click" signal to - the section_right_click_cb above. - -2001-06-05 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (completion_handler): Change the completion handler to use the - ECompletionMatch. - - * gui/component/select-names/e-select-names-completion.c - General changes to convert for ECompletionMatch use. - (emailify_match): Use extra sort keys in ECompletionMatch to let - us ensure that the primary email address is always the first - option, the secondary comes second, etc. There was no nice way to - do this previously. - (match_name): Removed code that adjusted score based on - similarities between the "real name" and the e-mail address. It - seemed like a good idea at the time, but produced unexpected and - confusing results. - -2001-06-04 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-card-compare.c: Added. Code for testing - if two ECards appear to pertain to the same contact (using loose - matching rules, as opposed to requiring exact equality) and to - query the addressbook for the "best match" to ECard. - -2001-06-03 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (set_status_message): remove spew, - and don't call the ShellView CORBA method if the interface doesn't - exist (for whatever reason.) - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_destroy): - unref the EAddressbookModel. - (create_minicard_view): unref the adapter. - (card_added_cb): call e_book_error_dialog if status != SUCCESS. - (card_modified_cb): same. - (card_removed_cb): new function, and same. - (delete_card_cb): pass card_removed_cb as the callback. - (emit_status_message): new function, just emit status_message. - (status_message): change to call emit_status_message. - (card_deleted_cb): emit_status_message ("Done."), and call - e_book_error_dialog if status != SUCCESS. - (do_remove): pass view in the closure arg. - (e_addressbook_view_delete_selection): emit status "Removing - cards..." before starting the removal. - (e_book_error_dialog): new function - pop up a (possibly) helpful - message about why an operation failed. - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_new): ref the EAddressbookReflowAdapter. - (e_minicard_view_widget_destroy): unref the adapter. - (e_minicard_view_widget_get_selection_model): if there isn't a - minicard view return NULL. - - * gui/widgets/e-addressbook-table-adapter.c - (e_addressbook_table_adapter_construct): ref the - EAddressbookModel. - - * gui/widgets/e-addressbook-reflow-adapter.c - (addressbook_finalize): rename this from addressbook_destroy, to - reflect the method change. - (e_addressbook_reflow_adapter_class_init): same. - (e_addressbook_reflow_adapter_construct): ref the - EAddressbookModel. - - * gui/widgets/e-addressbook-model.h: add editable_set flag. - - * gui/widgets/e-addressbook-model.c (writable_status): only record - the writable state of the addressbook if the user hasn't set it. - (e_addressbook_model_init): init editable_set to FALSE. - (e_addressbook_model_set_arg): set editable_set to TRUE. - -2001-06-03 Ettore Perazzoli <ettore@ximian.com> - - * backend/ebook/Makefile.am (evolution_vcard_importer_LDADD): Move - `$(DB3_LDADD)' before libeutil. - -2001-06-01 Ettore Perazzoli <ettore@ximian.com> - - * backend/ebook/Makefile.am (evolution_vcard_importer_LDADD): Add - $(DB3_LDADD)'. - -2001-05-31 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/Makefile.am (INCLUDES): Added db3 cflags. - - * backend/pas/pas-backend-file.c: Updated this to use db3. - -2001-05-31 Federico Mena Quintero <federico@ximian.com> - - * gui/widgets/e-addressbook-view.h (EAddressbookView): Added - fields for the GalViewMenus and GalViewCollection; we need to keep - them around while the component is active. - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_setup_menus): Plug leak; unref the spec. - Unref the factories. Do not unref the collection, since we need - it for the signal emission (okay, so the views object adds a - reference to it, but if we are interested in it we should keep a - reference anyways). - (e_addressbook_view_setup_menus): Create the collection and views - on the EAddressbookView's fields so that we can keep them around. - (e_addressbook_view_discard_menus): New function; gets rid of the - collection and views objects. - - * gui/component/addressbook.c (control_activate_cb): Call - e_addressbook_view_discard_menus(). - -2001-05-31 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names.h (struct - _ESelectNames): add the EAddressbookModel* and change the - ETableModel's name to "adapter". - - * gui/component/select-names/e-select-names.c (set_book), - (addressbook_model_set_uri): these two things take an - EAddressbookModel* instead of an ETableModel now. - (e_addressbook_create_ebook_table): don't case the - EAddressbookModel* to ETableModel*, create an EAddressbookTableAdapter - on the EAddressbookModel instead. - (e_select_names_init): set e_select_names->adapter. - -2001-05-31 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-model.c (remove_card): decrement - data_count before emitting the card_removed signal, and break - after we've removed the matching card. - (e_addressbook_model_class_init): change signature of - "card_removed" signal to match what we emit (and what is - expected.) - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_init): the - signal name is "destroy", not "destroyed". - (do_remove): new function, actually remove the card. - (e_addressbook_view_delete_selection): get this working for both - view types. - -2001-05-31 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c: Print Preview => - ContactsPrintPreview. Changed peter's change so that the node - name is more in line with "Print.."'s - -2001-05-30 Peter Williams <peterw@ximian.com> - - * gui/component/addressbook.c: Use the correct path to the print - preview menu item. - -2001-05-30 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (cut_contacts_cb): new function, for - the Cut verb. - (copy_contacts_cb): new function, for the Copy verb. - (paste_contacts_cb): new function, for the Paste verb. - (select_all_contacts_cb): new function, for the Select All verb. - (update_command_state): add handling for sensitivity of - Cut/Copy/Paste/Select All. - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_init): init - the invisible and set up selection/destroy signals. - (get_selection_model): new function, so we can get the - ETableSelectionModel from either view type. makes lots of the - other functions easier, since we can get the list of selected - cards using the same code regardless of view type. - (invisible_destroyed): new function. - (selection_get): new function. convert the clipboard list to - string. - (selection_clear_event): new function - free up the list of - ECards. - (selection_received): if the selection data is valid and - well-formed, add the corresponding cards to the ebook. - (add_to_list): new function. - (get_selected_cards): new function. - (e_addressbook_view_cut): new function, implement in terms of - _copy and _delete_selection. - (e_addressbook_view_copy): claim ownership of the CLIPBOARD - selection after saving the list of selected ECards. - (e_addressbook_view_paste): call gtk_selection_convert. - (e_addressbook_view_select_all): new function, using - e_selection_model_select_all. - (e_addressbook_view_can_print): re-implement in terms of - get_selection_model. - (e_addressbook_view_can_delete): same. - (e_addressbook_view_can_cut): new function. - (e_addressbook_view_can_copy): new function. - (e_addressbook_view_can_paste): new function. hmm, always return - TRUE here. - (e_addressbook_view_can_select_all): new function. - - * gui/widgets/e-addressbook-view.h (struct _EAddressbookView): add - selection stuff - the list of selected cards, and the GtkInvisible - selection owner, and add prototypes for - e_addressbook_view_[can]_{cut,copy,paste,select_all}. - - * gui/widgets/e-minicard-view-widget.h: add a prototype for - e_minicard_view_widget_get_selection_model. - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_get_selection_model): new function. - -2001-05-27 Dan Winship <danw@ximian.com> - - * gui/component/addressbook.c: #include - "evolution-shell-component-utils.h" rather than "e-gui-utils.h" - for e_pixmaps_update. - -2001-05-25 Peter Williams <peterw@ximian.com> - - * gui/component/Makefile.am: Reference libeshell.la instead of - libeshell.a. - -2001-05-25 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-reflow-adapter.c (addressbook_height): - Correct the height calculation here to not include the - E_CARD_SIMPLE_FIELD_FAMILY_NAME since it won't be displayed. - - * gui/widgets/e-minicard.c (remodel): Changed this to continue to - be more consistent and simpler. - -2001-05-23 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (view_destroy): fix strings such - that ones that happening at the beginning or during an operation - are followed by "..." and those that stop the operation are - followed by "." - (create_card_handler): same. - (ldap_op_process_current): same, and also call _notify_complete if - we can't connect to ldap server. - (poll_ldap): same, and change "Polling for LDAP search result" to - "Receiving LDAP search results" - - * backend/pas/pas-backend-file.c (pas_backend_file_search): call - notify_status_message at the beginning of this function, and - whenever we call _notify_complete. - -2001-05-23 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-addressbook-model.h: add sequence_complete_id to - EAddressbookModel and stop_state_changed to - EAddressbookModelClass. also, add prototype for - e_addressbook_model_can_stop. - - * gui/widgets/e-addressbook-model.c (remove_book_view): disconnect - from "sequence_complete", and set search_in_progress to FALSE. - (sequence_complete): set search_in_progress to FALSE and emit - "stop_state_changed." - (e_addressbook_model_class_init): create the "stop_state_changed" - signal. - (e_addressbook_model_init): init stuff. - (book_view_loaded): connect to "sequence_complete" signal. - (book_view_loaded): set search_in_progress to TRUE and emit - "stop_state_changed" - (e_addressbook_model_stop): set search_in_progress to false, emit - "stop_state_changed", and set our status to "Search Interrupted." - (e_addressbook_model_can_stop): return search_in_progress. - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_init): - connect to the stop_state_changed signal on EAddressbookModel. - (stop_state_changed): new function. - (e_addressbook_view_can_stop): call e_addressbook_model_can_stop. - - * gui/component/addressbook.c (update_command_state): use - e_addressbook_view_can_stop to set the sensitivity of the stop - button. - -2001-05-22 Dan Winship <danw@ximian.com> - - * backend/ebook/e-book-listener.c (e_book_listener_check_queue): - ref the listener for the duration of this function, since emitting - "responses_queued" may cause it to be unreffed by its EBook in - some cases, which could cause the second response_queue check to - look at garbage data if it got destroyed. - (e_book_listener_destroy): Call g_source_remove if idle_id is set. - -2001-05-22 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c: track the change in - evolution-addressbook.xml's bonobo ui path's. - -2001-05-21 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (change_view_type): update_view_type - is gone, since the menu item is gone. - - * gui/widgets/e-addressbook-table-adapter.c (create_card): use - e_table_model_rows_inserted here. - -2001-05-20 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook-config.c - (addressbook_source_item_new): Removed an unused variable. - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): Made text here non-const. - - * gui/component/select-names/e-select-names-popup.c - (edit_contact_info_cb): Cast to a gpointer here. - - * gui/component/select-names/e-select-names.c - (e_addressbook_create_ebook_table): Cast to E_TABLE_MODEL here. - -2001-05-18 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (match_name): Do a better job constructing match strings, so we - never try to use a segment of the name that isn't there (resulting - in ugly (null)'s in the string). Boost our score if some part of - the name also matches the front part of the e-mail address, so the - name match will always trump the e-mail match. - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): Return the serialized EDestinations - (rather than just a string w/ e-mail addresses) through the bonobo - component's property bag. - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_export_destinationv): Added. A convenience routine - for serializing the model's EDestinations into a string. - - * gui/component/select-names/e-select-names-popup.c - (add_html_mail): Added. Puts in a check menu item for whether or - not the recipient wants HTML mail. - (popup_menu_card): Add menu item for HTML mail. Enable edit - contact info item. - (popup_menu_nocard): Add menu item for HTML mail. Enable edit - contact info item. - - * backend/ebook/e-book-util.c (e_book_use_local_address_book): - Added. Fetches the local addressbook and caches it on the first - call. This is meant to be an easy and efficient way to get at the - local addressbook with the minimum of code. - (e_book_query_address_locally): Added. Convenience code that - does an e-mail only e_book_name_and_email_query against the - local address book. - - * backend/ebook/e-destination.c - (e_destination_set_html_mail_pref): Added. Allows the intended - recipient's HTML mail preference to be manipulated. - (e_destination_get_email_verbose): Added. Cleaned up to use - e_destination_get_name. - (e_destination_get_html_mail_pref): Added. Read the recipient's HTML mail - preference. If the destination is linked to a card, the - preference is taken from the card (unless it has been explicitly - overridden by a called to e_destination_set_html_mail_pref). - (e_destination_get_address_textv): Added. Form a unified address string - from a NULL-terminated vector of EDestinations. - (e_destination_export): Added. Serialize an EDestination to a string. - (e_destination_import): Added. Unserialize a string to build an - EDestination. - (e_destination_exportv): Added. Serialize a NULL-terminated vector of - EDestinations to a string. - (e_destination_importv): Added. Unserialize a string to build a - NULL-terminated vector of EDestinations. - - * gui/component/select-names/e-select-names-completion.c: - Implemented local versions of g_strcasecmp and g_strncasecmp - (which should really be in glib, I think...) for utf8, and used - them to make this code utf8-safe. - -2001-05-17 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (update_command_state): no more - ContactFind command. - -2001-05-17 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_class_init): add our selection_change - signal. - (e_minicard_view_widget_realize): connect to the ESelectionModel's - selection_changed signal. - (e_minicard_view_widget_selected_count): new function. - (selection_change): new function - emit our "selection_change" - signal. - - * gui/widgets/e-minicard-view-widget.h (struct - _EMinicardViewWidgetClass): add selection_change signal. also, - add prototype for e_minicard_view_widget_selected_count. - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_class_init): add our command_state_change - signal. - (e_addressbook_view_init): connect to the writable_status signal - on the EAddressbookModel. - (minicard_selection_change): new function - calls - command_state_change. - (create_minicard_view): connect to selection_change on the - minicard_view so we know when to update command state. - (table_selection_change): new function - calls - command_state_change. - (writable_status): new function - calls command_state_change. - (command_state_change): new function - emits our - "command_state_change" signal. - (create_table_view): connect to the selection_change signal so we - know to update the command state. - (change_view_type): update the command state every time we change - view types. - (e_addressbook_view_can_create): new function. - (e_addressbook_view_can_print): new function. - (e_addressbook_view_can_delete): new function. - (e_addressbook_view_can_stop): new function. - - * gui/widgets/e-addressbook-view.h (struct - _EAddressbookViewClass): add command_state_change signal, and - prototypes of functions the component can use to test the state of - commands. - - * gui/widgets/e-addressbook-model.c (addressbook_destroy): unlink - the writable_status signal on the EBook. - (writable_status): new function. - (e_addressbook_model_class_init): add our writable_status signal. - (e_addressbook_model_init): init writable_status_id. - (e_addressbook_model_set_arg): unlink the writable_status signal - on the old EBook, and connect it on the new one. - - * gui/widgets/e-addressbook-model.h: add writable_status signal. - - * gui/component/addressbook.c (update_command_state): new - function, set the sensitivity of the bonobo commands. - (control_activate): update our command state immediately upon - activating the control. - (addressbook_factory_new_control): register command_state_change - to update the commands. - -2001-05-15 Chris Toshok <toshok@ximian.com> - - * gui/search/e-addressbook-search-dialog.c - (e_addressbook_search_dialog_init): initialize the model and - adapter. - (button_press): set on the model. - (e_addressbook_search_dialog_new): same. - (e_addressbook_search_dialog_set_arg): same. - (e_addressbook_search_dialog_destroy): unref the model and - adapter. - - * gui/search/e-addressbook-search-dialog.h (struct - _EAddressbookSearchDialog): add our model and reflow adapter. - -2001-05-16 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-minicard-view.c: (e_minicard_view_destroy): Fixed - up the lifetime of the drag_data_get signal a bit. - -2001-05-15 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard-view.c (add_to_list): MinicardViewModel - -> ReflowAdapter name change. - (get_card_list): same. - (e_minicard_view_drag_begin): same. - (supported_fields_cb): model -> adapter. - (adapter_changed): hook up signals and set the empty message on - our adapter. - (e_minicard_view_set_arg): add support for "adapter", and set - model -> adapter. - (e_minicard_view_get_arg): same. - (disconnect_signals): no more status_message. - (do_remove): track to use adapter. - (e_minicard_view_class_init): add adapter arg, and remove - status_message. - (e_minicard_view_init): all the code here is in adapter_changed - now. - - * gui/widgets/e-minicard-view.h (struct _EMinicardView): - EMinicardViewModel -> EAddressbookReflowAdapter. - (struct _EMinicardViewClass): get rid of status_message. - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_class_init): remove the status_message - signal. - (e_minicard_view_widget_new): take the adapter as our argument, - and store it away for when we create the view. - (e_minicard_view_widget_realize): when we create the view just set - the adapter field on it. also, don't connect to status_message. - - * gui/widgets/e-minicard-view-widget.h (struct - _EMinicardViewWidget): add our adapter here, so we can pass it - into the view when we create it. - (struct _EMinicardViewWidgetClass): remove status_message. - - * gui/widgets/e-addressbook-view.c (status_message): new function, - no more propagating status messages! - (e_addressbook_view_init): create our model and conenct to its - status_message signal. - (book_writable_cb): set "editable" on the model, not our object. - (e_addressbook_view_set_arg): same, but with "book" and "query" as - well. - (create_minicard_view): create our reflow adapter and pass it to - the minicard view widget. also, call e_reflow_model_changed so - it'll pick up any already present cards. - (table_double_click): ADDRESSBOOK_MODEL -> TABLE_ADAPTER. - (get_card_list_1): remove the cast, since we don't need it any - longer. - (table_right_click): ADDRESSBOOK_MODEL -> TABLE_ADAPTER. - (table_drag_data_get): same. - (create_table_view): create the table adapter, and use it as our - ETableModel. - (change_view_type): remove the status_message hook up and setting - of query/book/editable. - (e_addressbook_view_stop): just call e_addressbook_model_stop here - instead of switching on the view type. - - * gui/widgets/e-addressbook-view.h (struct _EAddressbookView): add - our EAddressbookModel. - - * gui/widgets/Makefile.am (libeminicard_a_SOURCES): add the - adapter files, and remove e-minicard-view-model.[ch]. - - * gui/widgets/e-minicard-view-model.[ch]: removed. - - * gui/widgets/e-addressbook-table-adapter.c: new file. - - * gui/widgets/e-addressbook-table-adapter.h: new file. - - * gui/widgets/e-addressbook-reflow-adapter.c: new file. - - * gui/widgets/e-addressbook-reflow-adapter.h: new file. - - * gui/widgets/e-addressbook-model.c: rework this class to now - subclass from ETableModel anymore. It not subclasses from - GtkObject, and we use table and reflow adapters to get at the - data. - - * gui/widgets/e-addressbook-model.h: same. - -2001-05-14 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-minicard-view-model.c (remove_card): Fix a small - error not decreasing the data_count here. - -2001-05-13 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.h: add prototype for - addressbook_expand_uri. - - * gui/component/addressbook-component.c - (destination_folder_handle_drop): create an EBook for - @physical_uri. - (dnd_drop_book_open_cb): actually add the dropped cards. - - * gui/component/addressbook.c (addressbook_expand_uri): abstract - this code out from the set_prop method so we can use it in the - component. - (set_prop): call addressbook_expand_uri. - - * backend/ebook/e-card.c (e_card_load_cards_from_string): new - function. - - * backend/ebook/e-card.h: add prototype for - e_card_load_cards_from_string. - -2001-05-12 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c - (destination_folder_handle_drop): spew the data passed to us. - (destination_folder_handle_motion): the suggested_action is not an - ActionSet, but an Action, so don't or together multiple actions. - -2001-05-11 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.c (addressbook_source_dialog): - correct bug causing the Ok button to never be enabled. - -2001-05-11 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c (populate_context_menu): - example. - -2001-05-11 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard-view.c (e_minicard_view_drag_data_get): - use e_card_list_get_vcard to build up the data to send. - (e_minicard_view_init): connect to the model's drag_begin signal. - (e_minicard_view_drag_begin): gather the list of cards being - dragged and call gtk_drag_begin. - (add_to_list): new function. - (get_card_list): same. - (disconnect_signals): disconnect the drag_data_get signal. - (e_minicard_view_init): connect to the drag_begin signal on our - model. - - * gui/widgets/e-minicard-view.h (struct _EMinicardView): change - drag_card to drag_list. - - * gui/widgets/e-minicard-view-model.c (minicard_drag_begin): new - function, emit our drag_begin signal. - (addressbook_incarnate): connect to the item's drag_begin signal. - (e_minicard_view_model_class_init): init our drag_begin signal. - - * gui/widgets/e-minicard-view-model.h: add drag_begin signal. - - * gui/component/addressbook-config.c (addressbook_source_dialog): - always loop through all source types here, making LDAP first so - it's forces as the first notebook item. - (addressbook_config_auth_label): remove SASL case. - (addressbook_source_edit_changed): same. - (addressbook_source_item_new): flag the area of code that needs to - go into the advanced dialog (if we add one before someone - graciously redesigns the entire addressbook gui :) - - - * gui/component/addressbook-storage.c (ldap_unparse_auth): remove - SASL case. - (ldap_parse_auth): same. - - * gui/component/addressbook-storage.h: make LDAP come first in our - source type enumeration, and remove the SASL auth type. - -2001-05-11 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card.c (e_card_set_arg): If the name is set and - the full_name or file_as haven't been yet, set them. - -2001-05-11 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-file.c: Reordered the includes here. - (string_to_dbt): The sleepycat libdb documentation suggests - memseting the DBT to 0 so we do that here. - - * gui/widgets/e-minicard-view-model.c (addressbook_height): Skip - the E_CARD_SIMPLE_FIELD_FAMILY_NAME field. - - * gui/widgets/e-minicard.c (remodel): Skip the - E_CARD_SIMPLE_FIELD_FAMILY_NAME field. - -2001-05-11 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_connect): only - check schema support if we've connected. - -2001-05-11 Chris Toshok <toshok@ximian.com> - - * contact-editor/e-contact-editor.c (enable_writable_fields): - don't leak the ECard or ECardSimple. - -2001-05-08 Iain Holmes <iain@ximian.com> - - * backend/ebook/GNOME_Evolution_Addressbook_VCard_Importer.oaf.in: - Renamed the GnomeCard_Importer.oaf.in to this, and change the IID. - - * Makefile.am: Rename all the GnomeCard to VCard. - - * evolution-vcard-importer.c: Make the GnomeCard a generic - vcard importer. - -2001-05-08 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/Makefile.am (libebookinclude_HEADERS): Removed - e-card-pairs.h since we're not using it. - - * backend/ebook/e-book-view.c (e_book_view_check_listener_queue): - Added break; to default: case here. - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - Added changed variable so as to avoid sync_card when possible. - (e_card_simple_destroy): Free all the data here properly. - (e_card_simple_get_arg): Slight simplification here. - (fill_in_info, e_card_simple_arbitrary_foreach, - e_card_simple_get_arbitrary): Call e_card_free_empty_lists here to - save a bit of memory. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Fixed up - includes a bit. - (e_card_list_get_vcard, e_card_list_send): Added these functions - for acting on a group of cards. - (parse_org): Cleaned up this function a bit. - (e_card_free_empty_lists): Added this function to delete - unnecessary ELists and save a bit of memory. - (e_v_object_get_child_value): Made this return NULL if not found - instead of g_strdup(""). - - * contact-editor/e-contact-save-as.c, - contact-editor/e-contact-save-as.h (e_contact_list_save_as): Added - this function to save multiple contacts. - - * gui/widgets/Makefile.am: Commented out reflow test. - (libeminicard_a_SOURCES): Added e-minicard-view-model.c and - e-minicard-view-model.h. - - * gui/widgets/e-minicard-view-model.c, - gui/widgets/e-minicard-view-model.h: Model for use in - EMinicardView. - - * gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h: - Reworked this to use the new EReflow stuff. - - * gui/widgets/e-minicard.c (e_minicard_event): Doesn't handle - right click menus now. Emits a signal on the parent canvas item - instead. - - * printing/e-contact-print-envelope.c, - printing/e-contact-print-envelope.h - (e_contact_print_envelope_list_dialog_new): Added this function to - print multiple envelopes (only prints first for now.) - - * printing/e-contact-print.c, printing/e-contact-print.h - (e_contact_print_card_list_dialog_new): Added this function to - print multiple cards. Only prints the first for now. - -2001-05-07 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c (remove_folder): flesh out - the function more. It should work now, but there's no way to - invoke this method from the ui at the moment, heh. - -2001-05-07 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook.c (book_open_cb): Use a different - error message in the ldap support/no ldap support/file cases. - -2001-05-07 Gediminas Paulauskas <menesis@delfi.lt> - - * gui/component/addressbook.c: use define from - widgets/misc/e-filter-bar.h instead of own enumeration and search menu - names. - - * gui/component/Makefile.am, gui/component/select-names/Makefile.am: - removed EVOLUTION_VERSION. - -2001-05-04 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c (remove_folder): un-#if 0 - this. - (xfer_folder): add skeleton code to validate xfer request. always - notifies with PERMISSION_DENIED at present. - (populate_context_menu): un-#if 0 this. - (get_dnd_selection): same. - (destination_folder_handle_motion): new function. - (destination_folder_handle_drop): new function. - (factory_fn): create a EvolutionShellComponentDndDestinationFolder - interface, and add it to our shell component. - -2001-05-04 JP Rosevear <jpr@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_get_book_view): init change_id to NULL - -2001-05-02 JP Rosevear <jpr@ximian.com> - - * gui/component/addressbook.c (addressbook_view_free): unref the - book if the view is being destroyed - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_get_book_view): unref the book_view when - we are finished, it is only interesting if someone else has reffed - it now (weak reference) - (pas_backend_file_add_client): unref the book for the same reason - as above - - * Fixes bug #2255 - -2001-04-30 JP Rosevear <jpr@ximian.com> - - * backend/pas/pas-backend-file.c (vcard_matches_search): if the - view does not contain a search context, the result is by default - false fixes #2470 - -2001-04-25 Dan Winship <danw@ximian.com> - - * gui/component/addressbook-factory.c (main): Remove call to - unicode_init. - -2001-04-23 Jon Trowbridge <trow@ximian.com> - - * gui/component/e-address-popup.c: Lots of code has been - simplified here. - (e_address_popup_factory_new_control): Rather than directly pop - our control up in a window (via the e_address_popup_popup - function, which is now gone), just return the widget and let the - caller do the popping. This works better, since it means we don't - have to work around the vagaries of bonobo focus & event handling. - (e_address_popup_set_name): Refresh when both name & email have - been set, rather than checking a stupid counter. - (e_address_popup_set_email): Ditto. - -2001-04-22 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook-storage.c - (addressbook_storage_clear_sources): Added save_source_data here. - -2001-04-21 Jon Trowbridge <trow@ximian.com> - - * contact-editor/e-contact-quick-add.c (clicked_cb): Properly - convert to utf8. (Bug #2256) - (build_quick_add_dialog): Properly convert from utf8. (Bug #2256) - -2001-04-16 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-destination.c (e_destination_get_name): Added. - - * gui/component/select-names/e-select-names.c - (real_add_address_cb): Use e_select_names_model_append. It's - nicer. - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_append): Added. - - * gui/component/select-names/e-select-names-completion.c - (book_query_process_card_list): Filter out completion matches that - don't have an associated e-mail address. - (book_query_score): Give a bonus to the primary address, so that - it always comes up first in the completion results. - - * gui/component/e-address-popup.c (e_address_popup_refresh_names): - Convert utf8 strings into gtk strings before displaying. - -2001-04-14 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-book-view-listener.c, - backend/ebook/e-book-view-listener.h: Added the function - e_book_view_listener_stop to tell the book view listener to stop - sending signals. - - * backend/ebook/e-book-view.c (e_book_view_destroy): Tell the - EBookViewListener to stop when we're destroyed. - - * backend/pas/pas-backend-file.c (view_destroy, - pas_backend_file_process_get_book_view, - pas_backend_file_process_get_changes): Cleaned these up a bit - using bonobo_object_ref and bonobo_object_unref. - (pas_backend_file_process_get_book_view, - pas_backend_file_process_get_changes): bonobo_object_release_unref - the EBookListener here. - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_get_book_view): Cleaned this up a bit - using bonobo_object_ref. Make sure to unref the listener when - we're done with it. Put the new book_view in the list before - telling the book_listener that it's ready. - - * backend/pas/pas-book-view.c (pas_book_view_construct): Cleaned - this up a bit using bonobo_object_dup_ref. - (pas_book_view_destroy): Cleaned this up a bit using - bonobo_object_release_unref. - - * backend/pas/pas-book.c (pas_book_queue_get_book_view, - pas_book_queue_get_changes): bonobo_object_dup_ref here instead of - just duplicating. - -2001-04-14 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-book-listener.c - (impl_BookListener_respond_get_cursor): Ref the cursor here when - we receive it. - (impl_BookListener_respond_get_view, - impl_BookListener_respond_get_changes): Ref the book_view here - when we receive it. - (impl_BookListener_respond_open_book): Ref the book here when we - receive it. - (e_book_listener_destroy): Unref the objects in our queue here. - - * backend/ebook/e-book-view.c (e_book_view_construct): Cleaned - this up using bonobo_object_dup_ref. - (e_book_view_destroy): Cleaned this up using - bonobo_object_release_unref. - - * backend/ebook/e-book.c (e_book_do_response_get_cursor, - e_book_do_response_get_view, e_book_do_response_get_changes, - e_book_unload_uri): Cleaned this up using - bonobo_object_release_unref. - -2001-04-13 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): Get the ESelectNamesModel from the - widget's text model instead of storing it as a gtk_object_set_data - since it may change. - -2001-04-12 Jason Leach <jasonleach@usa.net> - - * backend/pas/pas-backend-file.c (INITIAL_VCARD): Update the Voice - and Fax phone numbers too, finishing off bug #1667. - -2001-04-11 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-file.c (INITIAL_VCARD): Update the built - in VCard. - -2001-04-12 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (local_record_from_ecard): put the - business address into the pilot record as that is what we put into - the desktop record - (ecard_from_remote_record): set both the address label and - delivery address to avoid bad parser guessing, fixes #2143 - - * backend/ebook/e-card-types.h: remove deprecated pilot code - - * backend/ebook/e-card.c: ditto - - * backend/ebook/e-card.h: ditto - -2001-04-11 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (local_record_from_ecard): Don't add - more than five phone numbers and set the remaining blank entries - to some reasonable defaults - -2001-04-11 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-simple.h: Added - E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING. - - * gui/component/addressbook-component.c (accepted_dnd_types): - Fixed a warning here. - - * gui/widgets/e-addressbook-model.c: Modified this to have more - columns, but not let them be edited if they're not a simple - string. - - * gui/widgets/e-minicard-view.c (e_minicard_view_init): Fixed a - warning and a memory leak here. - -2001-04-10 Gediminas Paulauskas <menesis@delfi.lt> - - * backend/ebook/evolution-gnomecard-importer.c: added missing #include. - * contact-editor/e-contact-editor.c (_arrow_pressed): popup menu items were - not translated after selecting one of them. - * gui/widgets/e-addressbook-view.c: mark popup menu items with N_(). - Updated list[] for translators. - * gui/widgets/e-minicard.c: same. - * gui/widgets/e-minicard-view-widget.c (e_minicard_view_widget_set_arg): fix warning - for "editable" arg. - * gui/widgets/e-minicard-view.c: convert "empty_message" to utf8. - -2001-04-09 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-component.c (remove_folder): stubbed, - #if 0'ed - (xfer_folder): same. - (populate_context_menu): same. - (get_dnd_selection): same. - (factory_fn): add the accepted drag types ("text/x-vard") to - folder_types. - -2001-04-09 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard.c (e_minicard_event): on BUTTON_PRESS: if - it's button 1, store the button x, y, and set drag_button_down to - TRUE. on BUTTON_RELEASE: always set drag_button_down to FALSE. - for MOTION_NOTIFY: initiate drag if the pointer has moved 3 - pixels. - - * gui/widgets/e-minicard.h (struct _EMinicard): add fields for - button x, y, and a bit for if the button has been pressed so we - can tell whether a motion should be a drag. - (struct _EMinicardClass): add drag_begin signal. - - * gui/widgets/e-minicard-view.c (e_minicard_view_drag_begin): new - function, starts the drag. - (book_view_loaded): connect the "drag_data_get" signal. - (e_minicard_view_drag_data_get): new function. - - * gui/widgets/e-minicard-view.h (struct _EMinicardView): add - drag_card and id for canvas_drag_data_get_id. - - * gui/widgets/e-addressbook-view.c (table_drag_data_get): new - function. - (create_table_view): add d&d stuff. - -2001-04-08 Chris Toshok <toshok@ximian.com> - - * printing/e-contact-print.c: add #include <sys/types.h> since - gnome-print.h uses time_t without including it. this really - should be fixed in gnome-print. - -2001-04-08 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_add_client): - make sure to notify new clients to the writable status of an - already open (and authenticated) book. - -2001-04-04 Kjartan Maraas <kmaraas@gnome.org> - - * contact-editor/e-contact-editor.[ch]: Fix headers. - * component/addressbook-storage.c: Same here. - * gui/search/e-addressbook-search-dialog.c: Same here. - * gui/widgets/e-addressbook-view.c: Same here. - * gui/widgets/e-minicard-label.c: Same here. - * gui/widgets/e-minicard-view-widget.c: Same here. - * gui/widgets/e-minicard-view.c: Same here. - * gui/widgets/e-minicard-widget-test.c: Same here. - * gui/widgets/e-minicard-widget.c: Same here. - * gui/widgets/e-minicard.c: Same here. - * gui/widgets/test-minicard-label.c: Same here. - -2001-04-03 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c (table_double_click): Fixed a - crash here. - -2001-04-03 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-model.c (COLS): Made this table model - more consistent in the number of columns it has. - (addressbook_append_row): Fixed this function. We removed the col - offset. - -2001-04-02 Iain Holmes <iain@ximian.com> - - * backend/ebook/evolution-gnomecard-importer.c (importer_init): Shut - down and unregister the factory on exit. - -2001-04-01 Gediminas Paulauskas <menesis@delfi.lt> - - * contact-editor/contact-editor.glade: changed icon to - evolution-contacts-plain.png. - * gui/component/addressbook.c: use new pixmap cache. Added icon for new - contact, print, print preview, changed filenames of renamed icons. - -2001-03-31 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names.c - (real_add_address_cb): Call e_select_names_model_clean after - adding address. This should deal with the bug reports related - to stray commas. - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_clean): Added. Remove all empty destinations. - - * backend/ebook/e-destination.c (e_destination_is_empty): Added. Check - if an EDestination is in essentially a null state. - -2001-03-30 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_add_client): - Tell new clients that are added whether they're writable. - -2001-03-29 Jon Trowbridge <trow@ximian.com> - - * printing/e-contact-print.c: Added #include <libgnome/gnome-paper.h> - - * printing/e-contact-print-envelope.c: Added #include <time.h> - and #include <libgnome/gnome-paper.h> - -2001-04-03 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (match_email): Better handle matching of "nameless" contacts. - - * backend/ebook/e-destination.c (e_destination_get_string): Better - handle the case of a "nameless" contact. - -2001-03-29 Kjartan Maraas <kmaraas@gnome.org> - - * *.*: Clean up #includes. Replace <gnome.h>, <bonobo.h> and - <gtk/gtk.h> with more finegrained headers where needed. - -2001-03-28 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card.c (e_card_set_arg): Fixed some crashes. - -2001-03-28 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names-table-model.c - (fill_in_info): Use E_CARD_SIMPLE_FIELD_NAME_OR_ORG instead of - getting the NAME and then the ORG. That way if we expand - NAME_OR_ORG, this will use it. - - * gui/component/select-names/e-select-names.c - (e_addressbook_create_ebook_table, SPEC): Use the correct column - in the SPEC. - -2001-03-25 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_seq_complete_cb): Rather than starting - the pending query by directly calling - e_select_names_completion_do_query, call - e_completion_begin_search. Circumventing the ECompletion API was - causing it to get confused in some cases. - -2001-03-23 Jon Trowbridge <trow@ximian.com> - - * gui/widgets/e-minicard-widget.c (e_minicard_widget_set_card): - Added. Call me old-fashioned, but I just prefer to have a real - API rather than doing everything via gtk_object_get/set-type - calls. - (e_minicard_widget_set_arg): Changed to call - e_minicard_widget_set_card. - - * backend/ebook/e-book-util.c: Small changes to get rid of - compiler warnings. (Casting out const, removed unused variables, - etc.) Removed some debugging messages. - - * gui/component/addressbook-factory.c (main): Added call - to e_address_popup_factory_init. - - * gui/component/e-address-popup.c: Added. A popup gadget that is - invoked (as a bonobo control) when an address is left-clicked in - the mailer. The addressbook is queries, and the address is either - displayed as a minicard (if it already exists) or in a "generic - format". A button is provided for editting/adding the contact. - Some of the semantics of this widget are a bit... non-standard, - because of bonobo issues. I can't really seem to replicate - popup-menu behavior because of how bonobo propogates events, etc. - so I've tried to produce something that I think is non-annoying. - YMMV. - -2001-03-22 Iain Holmes <iain@ximian.com> - - * backend/ebook/evolution-gnomecard-importer.c: Update to the new - IDL. - -2001-03-20 Miguel de Icaza <miguel@ximian.com> - - * gui/component/addressbook.c (update_pixmaps): Added artwork from - Jakub. - -2001-03-19 Christopher James Lahey <clahey@ximian.com> - - * Merged branch: - -2001-03-14 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-minicard-view.c: Call - e_selection_model_simple_insert_rows and - e_selection_model_simple_delete_rows instead of - e_selection_model_simple_insert_row and - e_selection_model_simple_delete_row. - -End of branch - -2001-03-17 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c: Brutally - refactored to boost performance in large-addressbook situations. - These fixes give accepable performance (even with the suboptimal - pas-backend-file searching) using tigert's addressbook-of-death. - - * backend/pas/pas-backend-file.c (pas_backend_file_search): - Start feeding query matches back to the caller before the - entire search is complete; this gives us some "instant feedback" - rather than causing evolution to totally lock up... - - * backend/ebook/e-book.c (e_book_queue_op): Tag all queued ops. - (e_book_cancel_op): Added. Search for a pending op with a given - tag, and mark it as inactive. - (e_book_do_response_get_cursor): Don't execute callback if this - operations has been cancelled. - (e_book_do_response_get_view): Ditto. - (e_book_do_response_get_changes): Ditto. - (e_book_do_response_get_supported_fields): Ditto. - (e_book_get_supported_fields): Return an operation tag (that can - be used to cancel the operation) rather than just TRUE/FALSE. - Zero is always an invalid tag and is returned in the case of an - error, so this shouldn't break any code that looked at the return - value (unless it did so in a particularly stupid way, of course). - (e_book_get_cursor): Ditto. - (e_book_get_book_view): Ditto. - (e_book_get_changes): Ditto. - (e_book_cancel): Added. Cancel a pending operation. (Basically - a call to e_book_cancel_op with error checking, etc.) - - * backend/ebook/e-book-types.h: Added E_BOOK_STATUS_CANCELLED. - -2001-03-17 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book-listener.c - (e_book_listener_queue_writable_status): new function. - (impl_BookListener_report_writable): new function. - (e_book_listener_get_epv): fill in epv->notifyWritable. - - * backend/ebook/e-book-listener.h: add writable status entries. - - * backend/ebook/e-book.c (e_book_do_writable_event): new function. - (e_book_check_listener_queue): add WritableStatusEvent to the - switch. - (e_book_class_init): register writable_status signal. - - * backend/ebook/e-book.h: add writable_status signal. - - * backend/idl/addressbook.idl: add notifyWritable method to - BookListener. - - * gui/widgets/e-minicard.c (e_minicard_class_init): add "editable" - arg. - (e_minicard_init): init editable. - (e_minicard_set_arg): loop over the minicard fields setting their - "editable". - (e_minicard_get_arg): add editable. - (supported_fields_cb): use editable when creating the - contact_editor. - (add_field): set "editable" when creatin the e_minicard. - - * gui/widgets/e-minicard.h (struct _EMinicard): add "editable". - - * gui/widgets/e-minicard-view.c (e_minicard_view_class_init): add - editable arg. - (e_minicard_view_init): init editable. - (create_card): pass editable to e_minicard canvas item. - (e_minicard_view_set_arg): bit of a hack - loop over all the - canvas items setting their "editable." - (e_minicard_view_get_arg): add editable. - (supported_fields_cb): use editable when creating the contact - editor. - - * gui/widgets/e-minicard-view.h (struct _EMinicardView): add - "editable." - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_class_init): add "editable" field. - (e_minicard_view_widget_init): init editable to FALSE. - (e_minicard_view_widget_set_arg): save editable, and pass it along - the e-minicard-view. - (e_minicard_view_widget_realize): same. - (e_minicard_view_widget_get_arg): add editable. - - * gui/widgets/e-minicard-view-widget.h (struct - _EMinicardViewWidget): add "editable" field. - - * gui/widgets/e-minicard-label.h (struct _EMinicardLabel): add - "editable" field. - - * gui/widgets/e-minicard-label.c (e_minicard_label_class_init): - add "editable" arg. - (e_minicard_label_set_arg): editable, set it on the e_text too. - (e_minicard_label_get_arg): editable. - (e_minicard_label_construct): set the "editable" field when we - create the e_text cavas item - - * gui/widgets/e-addressbook-view.c (e_addressbook_view_init): - default editable to FALSE. - (book_writable_cb): new function, set our editable field and - gtk_object_set it on the active view. - (e_addressbook_view_set_arg): set the active view's editable when - we set the view's book, and connect the "writable_status" signal - to book_writable_cb. - (change_view_type): same. - (supported_fields_cb): use our "editable" when creating the - contact editor. - - * gui/widgets/e-addressbook-view.h (struct _EAddressbookView): add - editable field. - - * gui/widgets/e-addressbook-model.c (e_addressbook_model_init): - change the default of editable to FALSE. - - * backend/pas/pas-book.c (pas_book_report_writable): new function. - - * backend/pas/pas-book.h: prototype for pas_book_report_writable. - - * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): if - we open the file O_RDWR (or create it) report it as writable. if - we can't open it as O_RDWR, try opening it read-only before we - attempt to create it. - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_authenticate_user): if we authenticate - successfully, grant write permissions (this is lacking but there's - really nothing we can do to determine the extent of the access - afforded a user.) - - -2001-03-15 Jon Trowbridge <trow@ximian.com> - - * gui/component/e-address-widget.c: Added addressbook querying and - "cardification" functions, which are turned off by default for now - because of addressbook bugs. Added a popup menu option to turn - queries on, so that others can enjoy the thrill of massive flaming - death. - - * gui/component/addressbook-factory.c (main): Made warnings always - be fatal. - - * backend/pas/pas-book-view.c: Added some debugging spew. - - * backend/pas/pas-backend-file.c (pas_backend_file_search): Added - a little experimental code to try to make file searches scale - better. #if 0/#endif-ed out for now. - - * contact-editor/e-contact-quick-add.c: #included e-book-util.h. - - * backend/ebook/e-card.c (e_card_name_match_string): Added. - Looser name-matching function. - (e_card_email_match_string): Added. Loose e-mail matching. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_check_queue): Added code to cause us to - abort rather than get trapped in a 100%-CPU-consuming loop in - certain situations. Now we just need to figure out how to avoid - these situations altogether. - - * backend/ebook/e-book-util.c: Added. Now contains the simple - query stuff and the open local addressbook functions. - - * backend/ebook/e-book.c: Moved simple query stuff and open local - addressbook functions into e-book-util.c. - -2001-03-15 Dan Winship <danw@ximian.com> - - * gui/widgets/e-minicard-label.c (e_minicard_label_set_arg): - * gui/widgets/e-minicard.c (e_minicard_set_arg, e_minicard_event): - Update arguments to e_canvas_item_grab_focus. - -2001-03-13 Christopher James Lahey <clahey@ximian.com> - - * gui/component/addressbook.c (update_pixmaps): Fix a warning - here. - -2001-03-13 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/Makefile.am (minicard_label_test_LDADD): Change to - ld order from Greg Williams. - -2001-03-13 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_get_book_view): Moved where we call - pas_book_respond_get_book_view. - -2001-03-12 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c: add E_STRING_PROP for - categories. - - * backend/pas/evolutionperson.schema: add categories attribute. - - * backend/ebook/e-card-simple.c (field_data): add - E_CARD_SIMPLE_FIELD_CATEGORIES. - - * backend/ebook/e-card-simple.h: add - E_CARD_SIMPLE_FIELD_CATEGORIES. - -2001-03-12 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard.c (supported_fields_cb): add is_read_only - param. - - * gui/widgets/e-minicard-view.c (supported_fields_cb): add - is_read_only param. - - * gui/widgets/e-addressbook-view.c (supported_fields_cb): add - is_read_only param. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_activate_obj): add is_read_only param. - also, include a little policy here and make it TRUE, as the user - shouldn't be editting in this context anyway (imo). - - * gui/component/addressbook.c (supported_fields_cb): add - is_read_only param. - - * contact-editor/test-editor.c (main): add is_read_only param. - - * contact-editor/e-contact-editor.c (set_read_only): new function, - that either enables or disables all the text fields, combo boxes, - and some buttons, depending on the state of is_read_only. - (e_contact_editor_class_init): add read/write arg "is_read_only". - (full_name_clicked): set the is_read_only of the fullname dialog - to the editor's. - (full_addr_clicked): same. - (e_contact_editor_new): add is_read_only param, that gets set - along with the other params. - (e_contact_editor_set_arg): add setter for is_read_only. - (e_contact_editor_get_arg): add getter for is_read_only. - (_phone_arrow_pressed): change TRUE to !editor->is_read_only for - entry. - (_email_arrow_pressed): same. - (_address_arrow_pressed): same. - (enable_writable_fields): same. - - * contact-editor/e-contact-editor-fullname.c - (e_contact_editor_fullname_class_init): add read/write arg - "is_read_only". - (e_contact_editor_fullname_set_arg): add setter for is_read_only - that enables/disables all the entries/combos. - (e_contact_editor_fullname_get_arg): add getter for is_read_only. - - * contact-editor/e-contact-editor-fullname.h (struct - _EContactEditorFullname): add is_read_only flag. - - * contact-editor/e-contact-editor-address.c - (e_contact_editor_address_class_init): add read/write arg - "is_read_only". - (e_contact_editor_address_set_arg): add setter for is_read_only - that disables/enables all the entries/combos. - (e_contact_editor_address_get_arg): add getter for is_read_only. - - * contact-editor/e-contact-editor-address.h (struct - _EContactEditorAddress): add is_read_only flag. - -2001-03-13 Iain Holmes <iain@ximian.com> - - * backend/ebook/Makefile.am: Change the importer includes around a bit. - - * backend/ebook/evolution-gnomecard-importer.c: Correctly add the includes. - -2001-03-09 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: PISOCK_INCLUDEDIR has become - PISOCK_CFLAGS in gnome-pilot.m4 and remove capplet foo - -2001-03-11 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-book.c (e_book_simple_query): Added. A - simplified, cancellable query mechanism that lets you avoid - dealing with EBookView. - (e_book_simple_query_cancel): Added. Cancels a running query. - - * backend/ebook/e-book-types.h: Add enum EBookSimpleQueryStatus. - -2001-03-08 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-popup.c - (quick_add_cb): Switched to use e_contact_quick_add_free_form. - Removed debugging code, hopefully without introducing any bugs - in the process. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_insert_length): Fix bug with commas - inside of name/address combos. As long as the comma is inside of - quotes, it will be treated as part of the name rather than as a - break between addresses. - - * gui/component/select-names/e-select-names-completion.c - (match_nickname): Use e_card_name_to_string for nickname match - strings. - (match_email): Use e_card_name_to_string for email match strings. - (e_select_names_completion_begin): Strip quotes out of query text, - so we don't produce malformed sexps. - Added William Blake quote easter egg. - - * contact-editor/e-contact-quick-add.c: Further attempts to fix... - mostly unsuccessful. - (e_contact_quick_add_free_form): Added. Takes a single string - and tries to parse out (using some simple, loose rules) the - name and e-mail -- then calls e_contact_quick_add. An attempt to - get the computer to automatically Do The Right Thing. - - * backend/ebook/e-book.c: Fixed some broken indentation. Yes, I'm - anal. - - * gui/component/GNOME_Evolution_Addressbook.oafinfo: Added oaf_server - info for EAddressWidget. - - * gui/component/GNOME_Evolution_Addressbook.oaf.in: Added oaf_server - info for EAddressWidget. - - * gui/component/addressbook-factory.c (main): Add call to - e_address_widget_factory_init. - - * gui/component/e-address-widget.h: - * gui/component/e-address-widget.c: Added. A little widget (and a - Bonobo control, BTW) for displaying addresses, with a left-click - menu. Used to display addresses in the mail viewer (as embedded - GtkHTML objects, replacing the text previously used). Still quite - incomplete. - -2001-03-08 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook-component.c (factory_fn): Specify a - NULL `EvolutionShellComponentGetDndSelectionFn'. - -2001-03-06 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_insert_length): Fix glitch with - inserting comma-delimited stuff when length > 1. - -2001-03-06 Jon Trowbridge <trow@ximian.com> - - * backend/ebook/e-book.c (e_book_load_local_address_book): Added. - Just encapsulates opening - file://~username/evolution/local/Contactes/addressbook.db, so that - path doesn't need to be hardwired in throughout the code. - -2001-03-06 Benjamin Kahn <xkahn@cybersites.com> - - * contact-editor/e-contact-quick-add.c (clicked_cb): - Added the third argument to e_contact_editor_new. (Cheated - and send NULL for the field argument, which is probably - troublesome. It will be fixed soon by either clahey or - toshok.) - -2001-03-06 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-model.c - (e_select_names_model_replace): Fix a reference counting bug. - - * gui/component/select-names/e-select-names-manager.c (popup_cb): - A callback for creating the appropriate popup by calling - e_select_names_popup. - (e_select_names_manager_create_entry): Connect popup_cb to the - entry's popup signal - - * gui/component/select-names/e-select-names-popup.c: Added. Code - for popup right-click menus for recipient entries. Still a bit - incomplete. - - * backend/ebook/e-destination.c (e_destination_get_email_num): - Added. - - * contact-editor/e-contact-quick-add.c: Added. Some code and a - dialog for very quickly adding entries to the address book. - Still not fully working. - -2001-03-04 Christopher James Lahey <clahey@ximian.com> - - * backend/ebook/e-card-simple.c: Cleaned up the formatting in this - file a bit. - - * contact-editor/e-contact-editor.c (e_contact_editor_set_arg): - Made it so that passing in NULL to the writable_fields arg sets - the set of writable fields to the empty set. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_activate_obj): Pass NULL as the - writable_fields argument here. - - * gui/widgets/e-addressbook-model.c: Don't offset by one here. - This way we will get the file_as field as one of our - ETableColumns. - - * gui/widgets/e-addressbook-view.c (SPEC): Updated this for the - changes in ECardSimple. - - * gui/widgets/e-minicard.c (remodel): Don't remodel if the item - isn't realized. - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c: doh, track renaming of - objectclass from evolvePerson to evolutionPerson. - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * backend/pas/evolutionperson.schema: rename evolveperson.schema - to this, and add remaining attributes. - - * backend/pas/pas-backend-ldap.c: add remaining fields, and fix up - ones that were incorrent (either the ldap_attr or the query prop). - -2001-03-02 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: update sed script - - * conduit/e-address.conduit.in: update for new pilot foo - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_activate_obj): track change to - e_contact_editor_new. - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (add_objectclass_mod): add - objectclasses for "person", "organizationalPerson", and "top" as - well, just to be complete. - (check_schema_support): rename check_for_evolve_person to this, to - reflect that we're doing more than just checking for that - objectClass. - (add_oc_attributes_to_supported_fields): new function. - (add_to_supported_fields): new function. - (pas_backend_ldap_destroy): unref supported_fields. - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * gui/widgets/e-minicard-view.c (supported_fields_cb): new - function. - (e_minicard_view_event): split out the creation of the contact - editor to the supported_fields callback. - - * gui/widgets/e-minicard.c (supported_fields_cb): new function. - (e_minicard_event): split out the creation of the contact editor - to the supported_fields callback. - - * gui/widgets/e-addressbook-view.c (table_double_click): split - function into two functions, since e_book_get_supported_fields - requires a callback now. - (supported_fields_cb): new function. - - * gui/component/addressbook.c (new_contact_cb): split this into - two functions, since e_book_get_supported_fields requires a - callback now. - (supported_fields_cb): new function. - - * contact-editor/test-editor.c (main): track change to - e_contact_editor_new (pass NULL for the writable_fields arg.) - - * contact-editor/contact-editor.glade: fix several labels so they - make better sense (since we look them up in e-contact-editor.c.) - - * contact-editor/e-contact-editor.h (struct _EContactEditor): add - writable_fields. also, add it to e_contact_editor_new. - - * contact-editor/e-contact-editor.c (e_contact_editor_class_init): - add writable_fields arg. - (e_contact_editor_destroy): unref the writable_fields list. - (e_contact_editor_new): pass @fields as the writable_fields arg. - (e_contact_editor_set_arg): add writable_fields support. - (enable_writable_fields): new (very hairy) function, to disable - everything and reenable just the fields listed in the - writable_fields list. - (_email_arrow_pressed): set label-email1, entry-email1, and - checkbutton-htmlmail to be sensitive since the only way to get - here is to activate a writable field in the menu. - (_address_arrow_pressed): set label-address, button-fulladdr, and - text-address to be sensitive for the same reason. - (_phone_arrow_pressed): sensitize the label and entry for the same - reason. - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-card-simple.c (field_data): add new entries for - phone enums, and fill in the ecard_field with (bogus in all but a - few cases) strings. these are the strings sent from wombat to - evolution-addressbook for supported_fields. - (e_card_simple_get_ecard_field): new function. - (e_card_simple_map_phone_to_field): new function. - (e_card_simple_map_email_to_field): new function. - (e_card_simple_map_address_to_field): new function. - - * backend/ebook/e-card-simple.h: add a few phone entries to the - ECardSimpleField enum, and add prototypes for mapping the list - types (phone, email, address) to ECardSimpleField. Also, add - prototype for e_card_simple_get_ecard_field. - - * backend/ebook/e-book.c - (e_book_do_response_get_supported_fields): don't build the EList - here, it's already built. - - * backend/ebook/e-book-listener.h: change fields from the CORBA - sequence to the EList in our reponse struct. - - * backend/ebook/e-book-listener.c - (e_book_listener_queue_get_supported_fields_response): we make the - EList here, since after we return the CORBA list is freed up. - -2001-03-02 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_get_supported_fields): implement - properly, we support everything. - -2001-03-01 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-bonobo.c - (entry_set_property_fn): Oops, we do need to be able to write to - "text" after all (for things like Reply-to: to work properly). - Fixed. - (impl_SelectNames_get_entry_for_section): Made "text" a writeable - property again. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_insert_length): Increment pos so that - we don't reverse strings when length > 1 (a particularly amusing - bug). - - * gui/component/select-names/e-select-names-completion.c - (e_select_names_completion_destroy): Check for NULL before calling - gtk_object_unref (GTK_OBJECT (---)), to get rid of annoying error - messages. - -2001-03-01 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-completion.c: I am an - idiot. - -2001-03-01 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-table-model.c - (fill_in_info): Change for new EDestination/ESelectNamesModel API. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_get_source): Added. A function for - looking up the ESelectNamesModel by id. (I didn't end up using - this function, but it might come in handy later.) - (e_select_names_manager_get_cards): #if 0/#endif out this - function. - (e_select_names_manager_create_entry): Modified to attach an - ESelectNamesCompletion to the entry we create. - (completion_handler): A post-completion handler for our EEntry, to - take the completion's extra data (an EDestination) and properly - stick it into our ESelectNamesModel. - - * gui/component/select-names/e-select-names.c - (real_add_address_cb): Changed to operate on EDestinations rather - than ECards and to use the new ESelectNamesModel API. This leads - to a rather nice code simplication. - (remove_address): Changed for new ESelectNamesModel API. - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): Rather than just passing the entry's text - through the property bag, get the "address text" from the model. - This returns a nice, verbose string of addresses with names - expanded when the address is tied to an ECard (i.e. "Jon - Trowbridge <trow@ximian.com>"). - (impl_SelectNames_get_entry_for_section): Make the text property - read-only. - (entry_set_property_fn): ...and since it is read-only now, chop - out the setter code. - - * gui/component/select-names/e-select-names-text-model.h: - * gui/component/select-names/e-select-names-text-model.c: Again, - this code has been (pretty much) totally rewritten to convert all - text operations into changes on the ESelectNamesModel. This lets - us give the associated EEntry some (IMHO) nice semantics regarding - whitespace, etc. Includes object activation, so destinations tied - to ECards are underlined and can be double-clicked to bring up a - contact editor. - - * gui/component/select-names/e-select-names-model.h: - * gui/component/select-names/e-select-names-model.c: I've heavily - modified this object to both hide all implementation details - (which the old version exposed a bit too much for my peculiar - tastes) and to act as an EDestination container. The old code put - the text model operations here. I've moved them all to - ESelectNamesTextModel --- so the text model actions (insert, - delete, etc.) are all done through the API rather than operating on - ESelectNamesModel internals. - - * gui/component/select-names/e-select-names-completion.c: Added. A - fairly complicated object derived from ECompletion that searches - our local addressbook in various and sundry ways. - - * gui/component/select-names/e-select-names-completion.h: - - * backend/ebook/e-destination.h: - * backend/ebook/e-destination.c: Added. This object encapsulates - a place to sent an email to, which can either be just a address as - a string ("trow@ximian.com"), a fancier string ("Jon Trowbridge - <trow@ximian.com>"), or an ECard and a specific address within - that ECard. - -2001-03-01 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h, - gui/widgets/e-minicard.c, gui/widgets/e-minicard.h: Used - ESelectionModelSimple and the changes to EReflow and EReflowSorted - to get multiple selection in the minicard view. - - * gui/widgets/test-reflow.c: Changed this to get it to compile - with the changes to EReflow. - -2001-02-21 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_search): Made - this pay attention to the return value of e_sexp_parse. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_activate_obj): Fixed a const - inconsistency here. - -2001-02-21 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-book.c (pas_book_queue_get_supported_fields): - new function. - (impl_GNOME_Evolution_Addressbook_Book_getSupportedFields): track - change to idl. - (pas_book_respond_get_supported_fields): new function. - - * backend/pas/pas-book.h: add GetSupportedFields to the - PASOperation enum. Also, add a stringlist field to the PASRequest - struct. lastly, add a prototype for - pas_book_respond_get_supported_fields. - - * backend/pas/pas-backend.h: remove prototype for - pas_backend_get_supported_fields, and remove it from the vtable. - - * backend/pas/pas-backend.c (pas_backend_get_supported_fields): - remove. - (pas_backend_class_init): no vtable entry for get_supported_fields - anymore. - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_get_supported_fields): new function. - (pas_backend_ldap_process_client_requests): add case for - GetSupportedFields. - (pas_backend_ldap_class_init): get_supported_fields isn't in - vtable anymore. - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_get_supported_fields): new function. - (pas_backend_file_process_client_requests): add case for - GetSupportedFields. - (pas_backend_file_class_init): get_supported_fields isn't in - vtable anymore. - - * backend/idl/addressbook.idl: Book::getSupportedFields now - returns void and add BookListener::notifySupportedFields. - - * backend/ebook/test-client.c (get_fields_cb): new function. - (auth_user_cb): track change to e_book_get_supported_fields. - - * backend/ebook/e-book.c - (e_book_do_response_get_supported_fields): new function. - (e_book_check_listener_queue): add case - GetSupportedFieldsResponse. - (e_book_get_supported_fields): switch to async model. - - * backend/ebook/e-book.h: switch e_book_get_supported_fields to an - async model. - - * backend/ebook/e-book-listener.c - (e_book_listener_queue_get_supported_fields_response): new - function. - (impl_BookListener_response_get_supported_fields): new function. - (e_book_listener_get_epv): fill in epv's "notifySupportedFields" - - * backend/ebook/e-book-listener.h: add an async response for - GetSupportedFields and add a stringlist member to the - EBookListenerResponse struct. - -2001-02-20 Federico Mena Quintero <federico@ximian.com> - - * backend/pas/pas-book-factory.c (pas_book_factory_activate): - Moved the register_factory() code to here, since it was the only - thing being called anyways. - (PasBookFactoryPrivate): Added a "registered" flag. - (pas_book_factory_activate): Set the registered flag. - (pas_book_factory_destroy): Deactivate the factory when we go away. - -2001-02-20 Chris Toshok <toshok@ximian.com> - - * backend/ebook/e-book.c (e_book_get_supported_fields): new function. - - * backend/ebook/e-book.h: add e-book interface to getting - supported fields. - - * backend/ebook/test-client.c (auth_user_cb): shoe-horn in some - spew about supported fields. - -2001-02-19 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: Remove PISOCK_LIBDIR - -2001-02-19 Jon Trowbridge <trow@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_create_entry): When creating the entry, - open up an ebook (corresponding to the local addressbook) and make - the entry use an EAddressCompletion. - (completion_handler): Added; this is the actual completion - handler, which manipulates the entry when the user selects - something from the drop-down. - - * gui/component/select-names/e-select-names-model.c: Various hacks - by clahey to unbreak e_select_names_model_add_item, - e_select_names_model_replace_item (which I added) and - e_select_names_model_remove_item. - - * gui/component/select-names/e-select-names-text-model.c - (e_select_names_text_model_obj_count, - e_select_names_text_model_get_nth_obj): Make chunks of text that - correspond to ECards in the ESelectNamesModel be embedded objects. - (e_select_names_text_model_activate_obj): On activation, pop up a - contact editor for the embedded object's card. - (e_select_names_text_model_model_changed): Fixed to work with - ETextModel API changes. - (e_select_names_text_model_set_text): Make const correct. - (e_select_names_text_model_insert): Make const correct. - (e_select_names_text_model_insert_length): Make const correct. - - * backend/ebook/e-address-completion.h, - backend/ebook/e-address-completion.c: Added. EAddressCompletion - is a derived class of ECompletion that does asynchronous address - lookups for completions. - -2001-02-17 Chris Toshok <toshok@ximian.com> - - * backend/idl/addressbook.idl: add sequence<string> typedef, and - add getSupportedFields method. - - * backend/pas/pas-book.c - (impl_GNOME_Evolution_Addressbook_Book_getSupportedFields): new - function. - - * backend/pas/pas-backend.c (pas_backend_class_init): init - get_supported_fields = NULL. - (pas_backend_get_supported_fields): new function. - - * backend/pas/pas-backend.h: add prototype for - pas_backend_get_supported_fields. - - * backend/pas/pas-backend-file.c - (pas_backend_file_get_supported_fields): new function. - (pas_backend_file_class_init): fill in get_supported_fields. - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_get_supported_fields): new function. - (pas_backend_ldap_class_init): fill in get_supported_fields. - -2001-02-14 Christopher James Lahey <clahey@ximian.com> - - * backend/pas/pas-backend-ldap.c: Undefine E_STRING_PROP and - E_LIST_PROP here. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h (e_contact_editor_raise): Added - this function. - - * gui/widgets/e-minicard.c, gui/widgets/e-minicard.h - (e_minicard_event): Added an editor field to the EMinicard object. - Made it so that if you double click on the same card twice, it - doesn't open a new window, but instead raises the old. - -2001-02-08 Iain Holmes <iain@ximian.com> - - * gui/component/addressbook-storage.c (addressbook_source_free): - Free the ldap.binddn. - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_setup_menus): Free the dir strings. - -2001-02-08 Christopher James Lahey <clahey@ximian.com> - - * contact-editor/e-contact-editor.c (categories_clicked): Set the - header on the category dialog we pop up. - -2001-02-12 Kjartan Maraas <kmaraas@gnome.org> - - * backend/ebook/GNOME_Evolution_Addressbook_GnomeCard_Importer.oaf.in: Translations. - * gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.oaf.in: - Marked strings for translation in this newly created file. - * gui/component/select-names/Makefile.am: Hook up the .oaf.in files in the - xml-i18n-tools framework. - * gui/component/Makefile.am: Same as above. - * gui/component/GNOME_Evolution_Addressbook.oaf.in: Marked stuff for translation here - too. - -2001-02-11 Jason Leach <jasonleach@usa.net> - - * gui/component/addressbook.c: Removed an ancient #include - <libgnorba/gnorba.h> - -2001-02-11 Gediminas Paulauskas <menesis@delfi.lt> - - Really use xml-i18n-tools. - - * conduit/e-address-conduit-control-applet.desktop: removed. - * conduit/e-address-conduit-control-applet.desktop.in: added empty. - * conduit/Makefile.am: reflect above changes, merge translations. - - * contact-editor/e-contact-editor-strings.h, - contact-editor/fulladdr.glade.h, contact-editor/fullname-strings.h, - contact-editor/e-contact-editor-confirm-delete.glade.h, - gui/component/select-names/select-names.glade.h: - removed these files, xml-i18n-extract takes care of strings itself. - - * contact-editor/*.glade, - gui/component/select-names/select-names.glade, - gui/widgets/alphabet.glade, printing/e-contact-print.glade: - changed project options to not output_translatable_strings. - - * contact-editor/Makefile.am, gui/widgets/Makefile.am, - gui/component/select-names/Makefile.am, printing/Makefile.am: - do not include removed files in EXTRA_DIST. - -2001-02-07 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (check_for_evolve_person): flesh - out this check. #ifdef the entire thing OPENLDAP2, as it only - works with the new schema stuff in openldap 2.x (both on server - and client, so upgrade your server.) - -2001-02-07 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/e-addressbook-view.c: Added N_("* Click here to add - a contact *"). - -2001-02-07 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_connect): only - set the DEBUG_LEVEL if we're OPENLDAP2. - -2001-02-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (email_compare): return TRUE if - equal, FALSE otherwise. - (business_compare): same. - (homephone_compare): same. - (email_ber): return NULL if there are no elements in our list. - (homephone_ber): same. - (business_ber): same. - (build_mods_from_ecards): add smarts to handle list elements - properly (like email, business_phone, home_phone.) now we'll - properly send updates if any element in the list changes. - -2001-02-06 Christopher James Lahey <clahey@ximian.com> - - * gui/widgets/Makefile.am (INCLUDES): Added - -DEVOLUTION_DATADIR=\""$(datadir)"\". - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_setup_menus): Changed the local and system - directories. - -2001-02-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (create_card_handler): doh, - didn't mean to commit this. - -2001-02-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/evolveperson.schema: new file. this will eventually - form the suggested additions to an existing openldap server that, - along with support for inetorgperson, will allow people to store - all evolution attributes in ldap. - -2001-02-06 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_init): don't - need the = NULL's since we g_new0. - (check_for_evolve_person): new function. - (pas_backend_ldap_connect): check to see if the evolvePerson - objectclass is there. - (build_mods_from_ecards): right now, just silently skip the extra - attributes if we don't support evolvePerson. - (add_objectclass_mod): new function, add both inetOrgPerson and - (if it's available) evolvePerson as objectclasses. - (pas_backend_ldap_process_authenticate_user): also check to see if - evolvePerson is there, if we couldn't do it (due to auth reasons) - in the connect method. - (prop_info): change the telephoneNumber LDAP attribute to be used - for evolution's business phone numbers. the primary phone number - will be a single valued attribute on evolvePerson. - (business_populate): new function. - (business_ber): new function. - (business_compare): new function. - -2001-02-05 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (create_card_handler): err, - allocate 2 char*s when i assign 2 char*s. - -2001-02-05 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (modify_card_handler): switch to - ldap_modify_ext_s if OPENLDAP2, as ldap_modify_s is deprecated. - (build_mods_from_ecards): don't include the mod if the value is "" - - this isn't valid on schema checking ldap servers. - (homephone_populate): new function. - (homephone_ber): new function. - (homephone_compare): new function. - (create_card_handler): add spew when adding cards so I can see - what's going on. -2001-02-05 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook-config.c (table_add_elem): Save the - help_text in the closure. - -2001-02-05 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/Makefile.am (libeminicard_a_SOURCES): Added - gal-view-factory-minicard.c, gal-view-factory-minicard.h, - gal-view-minicard.c, and gal-view-minicard.h. - - * gui/widgets/gal-view-factory-minicard.c, - gui/widgets/gal-view-factory-minicard.h, - gui/widgets/gal-view-minicard.c, and - gui/widgets/gal-view-minicard.h: New classes for minicard view - type. - - * gui/widgets/e-addressbook-view.c: Deploy gal-view stuff - properly. - -2001-02-05 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c (e_card_get_vcard): Make the Note field - be quoted printable. - -2001-01-27 Christopher James Lahey <clahey@helixcode.com> - - * gui/search/e-addressbook-search-dialog.c - (e_addressbook_search_dialog_init): This should be a close button, - not a cancel button. - -2001-02-04 Christopher James Lahey <clahey@ximian.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_activate_dialog): Call - e_select_names_set_default when appropriate. - - * gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h: Added support for - double clicking sending the selected contacts to the default - section. Added a set_default function. Made multiple selection - work. - -2001-01-29 Chris Toshok <toshok@ximian.com> - - * gui/component/addressbook-config.c - (addressbook_config_source_label): #ifdef INCLUDE_FILE_SOURCE. - (table_add_elem): add help_text parameter and set up focus_in - events to display the help in the dialog's html area. - (focus_help): new function, calls put_html on the help text. - (addressbook_ldap_auth_item_new): add help texts. - (addressbook_source_item_new): add help texts. - (addressbook_source_dialog): add help texts. - -2001-01-27 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_add_section): Remove the butt-ugly arrow icon and - replace it with a less invasive "->" icon. - -2001-01-25 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (build_mods_from_ecards): add - comment about the else block here. - (prop_info): add home_address, business_address, business_fax, - assistant, and isdn. - -2001-01-25 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_load_uri): Made - this only add the initial VCard if it finds a file - "create-initial" in the directory it's creating the database in. - - * gui/component/addressbook-component.c (factory_fn): Added a - create_folder function. - - * gui/search/e-addressbook-search-dialog.c - (e_addressbook_search_dialog_init): Fixed an unused variable - warning. - -2001-01-25 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_setup_menus): Setup the view collection - properly and handle the "display_view" signal. - -2001-01-25 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c (update_pixmaps): Consider the - placeholder in the path for the "Print" item. - -2001-01-25 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c (update_pixmaps): Set the icon for - "/Toolbar/Find" to "24_find_contact.xpm". - -2001-01-25 Ettore Perazzoli <ettore@ximian.com> - - * gui/component/addressbook.c (set_pixmap): New. - (update_pixmaps): New function, setting the pixmaps for the items - of type "pixbuf", using `set_pixmap'. - (control_activate): Call it. - -2001-01-25 Not Zed <NotZed@Ximian.com> - - * backend/pas/pas-backend-ldap.c: esexp api change fixes. - - * backend/pas/pas-backend-file.c (entry_compare): Fix for e_sexp api changes. - (vcard_matches_search): esexp api fixes. - (pas_backend_file_search): Ouch, unref the e-sexp properly (not gtk object). - -2001-01-24 Chris Toshok <toshok@ximian.com> - - * backend/pas/pas-backend-ldap.c (email_ber_func): make sure to - add the lengths here (include the \0? anyone?). - (build_mods_from_ecards): if we're filling in mod->mod_bvalues, - set mod_op |= LDAP_MOD_BVALUES. - -2001-01-23 Jason Leach <jasonleach@usa.net> - - (Fix #1225: advanced search cancel/close) - - * gui/search/e-addressbook-search-dialog.c - (e_addressbook_search_dialog_init): Set it up with Search and a - Cancel button, Search is still the default. - -2001-01-23 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (local_record_from_ecard): properly ref - the ecard. still need to kill some memory leaks. - -2001-01-22 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: remove vfs dependency - -2001-01-21 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (delete_record): Remove - deleted records from the pilot map so we don't have dupes in the future - -2001-01-19 Dan Winship <danw@ximian.com> - - * gui/widgets/e-addressbook-view.c (table_right_click): - * gui/widgets/e-minicard.c (e_minicard_event): Update for - e_popup_menu_run prototype change. - -2001-01-19 Jason Leach <jasonleach@usa.net> - - (Adding a boolean "entry_changed" BonoboPropertyBag arg) - - * gui/component/select-names/e-select-names-bonobo.c - (entry_set_property_fn): Use a gtk_object_set_data to set the - property to TRUE here. - - (entry_changed): New function, calls bonobo_control_set_property - if entry_changed hasn't been set to TRUE yet. - - (impl_SelectNames_get_entry_for_section): Connect "changed" on - each entry_widget to the new entry_changed() func. - -2001-01-19 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (ecard_from_remote_record): always free - the delivery elements and correct embarrassingly stupid memory error - that was causing the addressbook conduit problems. - - * backend/ebook/e-book-view-listener.c - (e_book_view_listener_check_queue): ref/unref ourself when processing - in case someone we signal unrefs us. - - * conduit/address-conduit.c (sequence_complete): disconnect signals - when complete - -2001-01-17 Federico Mena Quintero <federico@ximian.com> - - * backend/pas/pas-book-factory.c (pas_book_factory_activate): Made - it return a gboolean; it was completely ignoring the return value - from register_factory(). - -2001-01-17 Larry Ewing <lewing@helixcode.com> - - * backend/ebook/.cvsignore: add evolution-gnomecard-importer. - - * backend/ebook/Makefile.am (oaf_DATA): don't require the pine - oainfo file until it is actually added to the repository. We need - to keep the build working for nightlies to work. - -2001-01-16 Jason Leach <jasonleach@usa.net> - - * backend/pas/pas-backend-file.c (INITIAL_VCARD): s/Helix - Code/Ximian/ for the initial contact card. - -2001-01-15 JP Rosevear <jpr@ximian.com> - - * conduit/address-conduit.c (print_local): prevent segfaults and - buffer overflows - (print_remote): ditto - -2001-01-14 JP Rosevear <jpr@ximian.com> - - * conduit/Makefile.am: pass -module and -avoid-version to conduit - linker - -2001-01-12 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-component.c (factory_fn): Pass NULL as - the @copy_folder_fn arg to `evolution_shell_component_new'. - -2001-01-12 Miguel de Icaza <miguel@ximian.com> - - * gui/widgets/e-addressbook-view.c: added i18n for etable. - -2001-01-11 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_process_create_card): get a book view from - somewhere so we can give status messages - choose the first one in - the list. - (pas_backend_ldap_process_modify_card): same. - (pas_backend_ldap_process_remove_card): same. - (prop_info): add more properties, like home_phone, mobile, pager, - uri, org_unit, office, title, and manager. - -2001-01-09 Miguel de Icaza <miguel@gnu.org> - - * gui/widgets/Makefile.am (minicard_widget_test_LDADD): Put GNOME - libraries at the end to make the thing compile. - - * printing/Makefile.am: Order LDADD flags correctly so it compiles. - -2001-01-09 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (addressbook_factory_new_control): - connect with the EAddressbookView's status_message signal. - (set_status_message): set the status message on the ShellView - Interface associated with our control. - (retrieve_shell_view_interface_from_control): new function. get - the shell view inteface associated with a control. - - * gui/widgets/e-addressbook-view.c - (e_addressbook_view_class_init): register status_message signal. - (status_message): new function, emit our status_message signal. - (change_view_type): connect with the view->object's - "status_message" signal. - - * gui/widgets/e-addressbook-view.h (struct - _EAddressbookViewClass): add status_message signal. - -2001-01-09 Chris Toshok <toshok@helixcode.com> - - * gui/widgets/e-minicard-view-widget.c - (e_minicard_view_widget_class_init): register our status_message - signal. - (status_message): new function, emit our status_message signal. - (e_minicard_view_widget_realize): connect to the EMinicardView's - status_message signal. - - * gui/widgets/e-minicard-view-widget.h: add status_message signal. - - * gui/widgets/e-minicard-view.c (e_minicard_view_class_init): - register our status_message signal. - (e_minicard_view_init): init status_message_id. - (status_message): new function, emit our status_message signal. - (book_view_loaded): connect to the EBookView's status_message - signal. - (disconnect_signals): disconnect status_message_id. - - * gui/widgets/e-minicard-view.h: add status_mesage_id, and - status_message signal. - - * gui/widgets/e-addressbook-model.c (status_message): new - function, emit our status_message. - (e_addressbook_model_class_init): register our "status_message" - signal. - (book_view_loaded): connect to the EBookView's status_message - signal, so we can chain it to our parent. - (e_addressbook_model_init): init status_message_id. - (remove_book_view): disconnect status_message_id. - - * gui/widgets/e-addressbook-model.h: add status_message_id, and - status_message signal. - - * backend/pas/pas-backend-ldap.c change the objectclass we create - objects with to "inetOrgPerson" as it encompasses the fields we - use. - (create_dn_from_ecard): remove the mail/org handling from - here. we just prepend cn=$cn onto the base dn. - (create_card_handler): remove the NULL that build_mods_from_ecards - adds at the end, and insert our objectClass. - (modify_card_handler): call search_for_dn to get the ECardSimple - of the old card, since it might (and does in the current code) - doing a brute force search. - (search_for_dn): new function, to search for an entry by its dn. - right now we brute force (objectclass=*) under the base dn and - compare dn's. going to add a first pass that explodes the dn and - searches that way, using (objectclass=*) as a last resort. also, - here's where we'd put the extensibleMatch code if we want to go - that route. - - * backend/ebook/e-card.c (e_card_set_arg): if we're setting the - full name regenerate ecard->name. - -2001-01-04 Chris Toshok <toshok@helixcode.com> - - * backend/ebook/e-book-listener.c - (e_book_listener_queue_authentication_response): new function. - (impl_BookListener_respond_authentication_result): new function. - (e_book_listener_get_epv): fill in - epv->notifyAuthenticationResult. - - * backend/ebook/e-book-listener.h: add AuthenticationResponse to - EBookListenerOperation. - - * backend/ebook/e-book.c (e_book_authenticate_user): new function. - - * backend/ebook/e-book.h: add prototype for - e_book_authenticate_user. - - * backend/idl/addressbook.idl (GNOME:Evolution:Addressbook:Book): - add authenticateUser method. - (GNOME:Evolution:Addressbook:BookListener): add - AuthenticationFailed and AuthenticationRequired to CallStatus. - also add notifyAuthenticationResult method. - - * backend/pas/pas-backend-file.c - (pas_backend_file_process_authenticate_user): dummy - authenticate_user function that always succeeds. - (pas_backend_file_process_client_requests): respond to the - AuthenticateUser request. - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_build_query): - gtk_object_unref(sexp) => s_exp_unref(sexp). - (pas_backend_ldap_process_authenticate_user): fill in to use - ldap_simple_bind_s. - (pas_backend_ldap_process_client_requests): respond to the - AuthenticateUser request. - - * backend/pas/pas-book.c (pas_book_queue_authenticate_user): new - function. - (impl_GNOME_Evolution_Addressbook_Book_authenticateUser): new - function. - (pas_book_respond_authenticate_user): new function. - (pas_book_get_epv): fill in epv->authenticateUser. - - * backend/pas/pas-book.h: add AuthenticateUser operation type, and - add user/passwd to the PASRequest struct. - - * gui/component/addressbook-storage.c - (addressbook_storage_get_source_by_uri): new function. should use - a hashtable, perhaps, but the lists will generally be small - anyway. - - * gui/component/addressbook-storage.h: add prototype for - addressbook_storage_get_source_by_uri. - - * gui/component/addressbook-config.c - (addressbook_source_dialog_set_source): fill in the binddn if the - auth page is shown. - - * gui/component/addressbook.c (book_open_cb): shoe-horn - authentication in here. if the source was configured to use - authentication, authenticate the user after opening the ebook. - also, be paranoid and clear out the password after authenticating. - (book_auth_cb): callback for auth. set the "book" arg on the - view->view here. - (passwd_cb): set the view's passwd that'll be used in - book_open_cb. - (addressbook_view_free): g_free view->passwd. - -2001-01-04 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook-component.c, - gui/component/addressbook-component.h - (addressbook_component_get_shell_client): Added this function. - - * gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h: Added code for the - ability to switch between different folders. This doesn't work - yet. - - * gui/component/select-names/select-names.glade, - gui/component/select-names/select-names.glade.h: Added an option - menu to this dialog. - -2001-01-04 JP Rosevear <jpr@helixcode.com> - - * conduit/Makefile.am: Fix hard coded library names that were - accidentally committed (i'm looking at you miggie) - - * contact-editor/e-contact-editor.c (categories_clicked): Reflect - renaming. - - * contact-editor/e-contact-editor-categories.[hc]: These are - living in gal now - -2001-01-04 JP Rosevear <jpr@helixcode.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_book_view_free): - Need to e_sexp_unref the the sexp, not gtk_object_unref it. - -2001-01-03 Michael Meeks <michael@helixcode.com> - - * gui/widgets/e-addressbook-model.c (get_view): check - capabilities is valid before doing a strstr. - -2001-01-03 Michael Meeks <michael@helixcode.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_search): - g_strdup things we g_free. - -2001-01-02 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c (delete_cb): Make sure this - won't crash if the given contact is removed from the database - while this function is being called. - - * gui/widgets/e-minicard.c: Made sure this won't crash if the - given contact is removed from the database while the right click - menu is being displayed. - -2000-12-30 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook-config.c (edit_source_clicked): copy - the dialog's source, destroy the dialog after we're done, and make - sure to update both columns in the clist. - (add_source_clicked): copy the dialog's source, and destroy the - dialog when we're done. - (addressbook_source_dialog_destroy): free up all the dialog's - memory. - - * gui/component/addressbook.c (set_prop): allow file: uri's that - point to files, not just dirs that contain addressbook.db. The - rule is the addressbook file has to end in .db. - - * gui/component/addressbook-storage.c (file_source_foreach): - contactserver => contactfile. cut and paste error. - (addressbook_storage_init_source_uri): use file://%s to build the - uri. - - * gui/component/e-ldap-server-dialog.[ch]: forgot to remove these - in my last commit. - -2000-12-29 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (config_cb): new function, calling - our new config ui code. - (control_activate): no longer load evolution-addressbook-ldap.xml, - as it's not there. - - * gui/component/addressbook-component.c (owner_set_cb): - setup_ldap_storage => addressbook_storage_setup. - - * gui/component/Makefile.am (evolution_addressbook_SOURCES): - remove e-ldap-storage.[ch] and add addressbook-storage.[ch]. - (glade_DATA): remove ldap-server-dialog.glade and add - addressbook-config.glade. - (EXTRA_DIST): same. - - * gui/component/addressbook-config.[ch]: add another dialog to - give a list of our sources and offer the Add/Delete/Edit - interface. This plugs into the previous dialog work (the source - editor.) - - * gui/component/addressbook-storage.[ch]: new files, containing - the remains of e-ldap-storage.[ch] and adding the new - AddressbookSource type and it's subordinates. Also, the xml - format has changed slightly and the file name is no longer - ~/evolution/ldap-servers.xml - it's - ~/evolution/addressbook-sources.xml. - - * gui/component/addressbook-config.glade: new file, new config - interface. - - * gui/component/ldap-server-dialog.glade: removed. - - * gui/component/e-ldap-storage.[ch]: removed. - -2000-12-28 Chris Toshok <toshok@helixcode.com> - - * gui/component/Makefile.am (evolution_addressbook_SOURCES): add - addressbook-config.[ch]. - - * gui/component/addressbook-config.c, - gui/component/addressbook-config.h: new files, containing at the - moment a beautiful "new/edit source dialog" inspired by the - mail-config-gui code. It'll be ready for prime time after rev'ing - the .xml file the addressbook uses to store it's "other sources" - to include files, and the addition of the ldap auth stuff. - -2000-12-25 Miguel de Icaza <miguel@helixcode.com> - - * gui/widgets/e-minicard.c (e_minicard_realize): Set draw - background to FALSE. - - * gui/widgets/e-minicard-label.c (e_minicard_label_construct): ditto. - (e_minicard_label_construct): ditto - -2000-12-23 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/fullname-strings.h, - contact-editor/fullname.glade: Added Ms. and Miss to the prefix - drop down box. Patch submitted by Martin Hicks <mort@bork.org>. - -2000-12-21 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (cursor_cb): Ref the cards that get put - in the change list - (next_changed_item): util function to get the real next changed item - (compute_status): really compute the status of the record - (local_record_from_uid): Set the id of the temporary card - (check_for_slow_setting): Make this check a little saner - (card_added): Only record the CardObjectChange if the card is not - archived - (card_changed): ditto - (card_removed): ditto - (set_status_cleared): actually clear the status - (for_each_modified): Clean out cruft and use next_changed_item - (add_record): Set the new id properly in our local card copy - (replace_record): handle the case where the record has been deleted - and we need to call add. need to update the changed_hash entry - (delete_record): Don't panic if the card is not found, its already - been deleted. - - * backend/pas/pas-backend-file.c (pas_backend_file_book_view_copy): - The change_context no longer has a del_cards member - (pas_backend_file_book_view_free): ditto - (pas_backend_file_process_get_changes): ditto - (pas_backend_file_changes_foreach_key): just record the id - (pas_backend_file_changes): notify_remove needs an id not a vcard - -2000-12-20 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (match): Use my own wrapper - functions instead of trying to *directly* access the the data - structures my self - (post_sync): Put in hack to prevent syncing the same records twice - (local_record_from_uid): set the card id when creating a blank one - (add_record): Set the id of the card we have and don't go to the - server to get the latest version - -2000-12-19 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (ecard_from_remote_record): Convert - pilot strings to utf for the e-cards. - -2000-12-19 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (local_record_from_ecard): Convert ecard - strings to pilot encodings - -2000-12-19 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/e-addressbook-view.c (delete): Made it so that if - you select multiple contacts, the right click menu to delete - deletes them all. - -2000-12-18 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c (ldap_error_to_response): always - use LDAP_NAME_ERROR (in the openldap1 case it's #defined to - NAME_ERROR). - (build_card_from_entry): ldap_get_values can return NULL. also, - openldap2 keeps us from getting at ldap->ld_errno, so we can't - tell if there was a decoding error like we used to. the double - free problem where ldap would free the ber if there was a decoding - problem might be fixed now.. further investigation is needed. - for now we leak in openldap2. - (ldap_search_handler): the ldap structure is opaque, so use - ldap_search_ext to give the extra information (the max responses, - timeout, etc.) in the openldap2 case. - -2000-12-13 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-ldap.c (ldap_error_to_response): Test - for the existance of LDAP_NAME_ERROR and if it exists as a macro, - use it instead of NAME_ERROR. - -2000-12-14 Michael Meeks <michael@helixcode.com> - - * gui/component/GNOME_Evolution_Addressbook.oafinfo: update cut - and paste description error. - -2000-12-13 Dan Winship <danw@helixcode.com> - - * gui/widgets/e-minicard-control.c (stream_read): NULL-terminate - the returned vcard so we don't sometimes end up with trailing - junk that makes libversit unhappy. - -2000-12-13 Iain Holmes <iain@helixcode.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_add_section): Make the -> into a GNOME stock image. - -2000-12-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_init): Connect to the "cursor_change" signal on - the ETable here instead of the ETableScrolled. - (remove_address): Added the col and event parameters to this - callback to match the added parameters to the double click signal. - (e_select_names_add_section): Connect to the "double_click" signal - on the ETable here instead of the ETableScrolled. - -2000-12-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c (e_card_set_arg): When setting the "name" - argument, copy the incoming name. This fixes a crash. - -2000-12-09 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Made editing the name using - the full name button set the file as entry properly. Made it - so that the address parse that the user chooses after - clicking on the Full Address... button gets saved. - -2000-12-08 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c (full_name_clicked): Made it - so that the editor->name is set after the entry is changed. This - means that the reparse that the person chose is saved. - -2000-12-07 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/e-ldap-storage.c (setup_ldap_storage): Pass NULL - as the @toplevel_node_handler_id argument to - `evolution_storage_new'. - -2000-12-08 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Fixed some formatting. - - * contact-editor/e-contact-editor-categories.h: Removed an - unneeded #include. - - * gui/widgets/e-addressbook-view.c: Connect to the signals on the - ETable instead of the ETableScrolled. - -2000-12-07 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (local_record_from_uid): Pass "" rather - than NULL to e_card_new. - (local_record_from_ecard): Make sure ecard->name is valid - (check_for_slow_setting): Remove hard coded test value - (card_added): g_strdup the resul of e_card_get_id - (card_changed): ditto - -2000-12-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/e-addressbook-view.c: Got rid of code referencing - the ETableScrolled proxy functions. - -2000-12-06 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Moved the gal view menu stuff from - here to EAddressbookView. - - * gui/widgets/e-addressbook-view.c, - gui/widgets/e-addressbook-view.h: New function to set up the menus - for the EAddressbookView. - -2000-12-06 JP Rosevear <jpr@helixcode.com> - - * conduit/Makefile.am: Another conduit build fix - -2000-12-05 JP Rosevear <jpr@helixcode.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_changes_foreach_key): - Create an empty vcard with the appropriate id for deleted cards - - * conduit/address-conduit.c (ecard_from_remote_record): Ensure the - address fields are added sensibly - -2000-12-05 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/e-ldap-storage.c (setup_ldap_storage): Updated the - call to `evolution_storage_new()': pass NULL for - @toplevel_node_uri. - -2000-11-28 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (local_record_to_pilot_record): Return - a struct rather than a pointer to a struct - (view_cb): kill warning - (compare): local_record_to_pilot_record now returns a struct - (prepare): ditto - (free_prepare): remove as per gnome-pilot changes - (conduit_get_gpilot_conduit): don't listen for free_prepare signal - -2000-11-27 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.h: Remove "complete" field - - * conduit/address-conduit.c (print_local): Make it print useful debug - info - (print_remote): ditto - (local_record_from_ecard): Make sure phone numbers get out to the pilot - (ecard_from_remote_record): Set phone strings to "" if they are null - (sequence_complete): unref the book view - (view_cb): ref the book view - (free_prepare): do nothing - - * backend/pas/pas-backend-file.c (pas_backend_file_book_view_free): - Destroy the card lists with the rest of the view. - (pas_backend_file_changes): Don't destroy the card lists here - (pas_backend_file_book_view_free): Free the card/id lists in the - change context here, the correct place. - (pas_backend_file_changes): instead of here... - -2000-11-22 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c: Set view.change_context to NULL - in pas_backend_file_process_get_book_view. Changed - pas_backend_file_book_view_copy a bit. - - * backend/pas/pas-backend-ldap.c: Got rid of a warning. - -2000-11-18 Matt Bissiri <matt@bissiri.org> - - * gui/component/Makefile.am: - Add widgets/menus/libmenus.la to evolution_addressbook_LDADD - so that it will link properly now that gal-view-menus.[ch] - was moved from gal into evolution. - -2000-11-15 JP Rosevear <jpr@helixcode.com> - - * backend/pas/pas-backend-file.c (pas_backend_file_book_view_copy): - Initialize destination struct with '0's. - -2000-11-12 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Changed the mime type from "text/vcard" - to "text/x-vcard". - -2000-11-11 Matt Bissiri <bissiri@eecs.umich.edu> - - * backend/ebook/.cvsignore: Add idl-generated files. - * backend/ebook/e-book.c: (e_book_do_response_get_changes): - * backend/ebook/e-card.c: (e_card_send): - s/Evolution_/GNOME_Evolution_/g; - -2000-11-11 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Link in composer bonobo code. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added code to - send mail to an ECard or send an ECard as a VCard attachment. - - * contact-editor/e-contact-editor.c: Add verbs to send the contact - as a VCard or send mail to the contact. - - * gui/search/e-addressbook-search-dialog.c: Removed some unused - variables. - - * gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard.c: - Added menu items to send the contact as a VCard or send mail to - the contact. - -2000-11-11 Matt Bissiri <bissiri@eecs.umich.edu> - - * gui/component/addressbook.oafinfo: - * gui/component/select-names/evolution-addressbook-select-names.oafinfo: - Update the remaining "IDL:Evolution*" to "IDL:GNOME/Evolution*" - to sync up with yesterday's IDL re-scoping. - -2000-11-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-ldap.c: Fixed a warning. - - * gui/component/addressbook.c: Put in gal view menus for testing - purposes. - - * printing/e-contact-print-envelope.c: Fixed up envelope printing - a bit. Added code for printing return addresses. - -2000-11-09 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.h: Add changed_hash, change list and complete bool - - * conduit/address-conduit.c (local_record_from_ecard): Add empty field checks - (card_added): callback for book view - (card_changed): ditto - (card_removed): ditto - (sequence_complete): ditto - (view_cb): callback for the get changes call - (pre_sync): force synchronous loading of book view - (for_each): we already have the card so create the local record directly - (for_each_modified): Uncomment and fix - (delete_record): ditto - - * conduit/Makefile.am: link against gal for ebook - needs fixing - - * backend/ebook/e-book.c (e_book_do_response_get_changes): Properly respond - to a get_changes call - (e_book_check_listener_queue): define the get changes response operation - - * backend/ebook/e-book-listener.c (e_book_listener_queue_get_changes_response): - Queue up a get changes response - (impl_BookListener_respond_get_changes): Implement the get_changes method - (e_book_listener_get_epv): add get_changes implementation to epv - - * backend/pas/pas-backend-file.c (pas_backend_file_book_view_copy): Only - copy the search_context and change_context elements if they actually exist - (pas_backend_file_changes): Hard code a path for now, only notify if - there is something to notify about - -2000-11-07 JP Rosevear <jpr@helixcode.com> - - * backend/pas/pas-book.h: Update PASRequest structure - - * backend/pas/pas-book.c (impl_Evolution_Book_get_changes): update param name - (pas_book_queue_get_changes): Use PASRequest change_id slot - - * backend/pas/pas-backend-file.c (pas_backend_file_book_view_copy): - Properly copy change_id and change_context - (pas_backend_file_book_view_free): Free change_id/change_context - (pas_backend_file_changes_foreach_key): Callback to figure out the - deleted cards - (pas_backend_file_changes): Use new e-dbhash stuff to implement. - Write out updated hash - - * backend/idl/addressbook.idl: Rename get_changes param - -2000-11-06 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Switched from EAddressbookSearch to - ESearchBar. - - * gui/widgets/Makefile.am, gui/widgets/e-addressbook-search.c, - gui/widgets/e-addressbook-search.h: Removed EAddressbookSearch. - This has been moved to filter/ and renamed ESearchBar. - - * printing/e-contact-print-envelope.c: Forgot to set the font. - This works for me now. - -2000-11-06 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/select-names/e-select-names-bonobo.c - (impl_SelectNames_get_entry_for_section): Duplicate the object - reference before returning. - -2000-11-05 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c, - gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard.c: Add - menus items to the envelope printing stuff. - - * gui/component/addressbook.c: Hook up the search menu. - - * gui/widgets/e-addressbook-search.c, - gui/widgets/e-addressbook-search.h: Add the search menu. - - * printing/Makefile.am: Add e-contact-print-envelope.c and - e-contact-print-envelope.h. - - * printing/e-contact-print-envelope.c, - printing/e-contact-print-envelope.h: Added envelope printing. - -2000-11-03 Federico Mena Quintero <federico@helixcode.com> - - * gui/component/select-names/Makefile.am: Clean the idl-generated - files properly. - -2000-11-02 Christopher James Lahey <clahey@helixcode.com> - - * ename/.cvsignore, gui/minicard/.cvsignore: Removed these - unnecessary .cvsignores. - - * gui/component/addressbook.c: Switch to using EAddressbookSearch - instead of custom quick search widget. - - * gui/component/select-names/e-select-names.c: Made this do a - slightly better job of rendering names. - - * gui/widgets/Makefile.am: Added e-addressbook-search.c and - e-addressbook-search.h. - - * gui/widgets/e-addressbook-search.c, - gui/widgets/e-addressbook-search.h: New class that puts up an - entry and a combo box. - -2000-11-01 Dan Winship <danw@helixcode.com> - - * gui/component/e-ldap-storage.c (load_ldap_data): - (e_ldap_storage_add_server): Add "highlighted" flag to - evolution_storage_new_folder - -2000-10-31 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (cursor_cb): Let the warning make sense - (compute_pid): remove - (local_record_from_ecard): Create local record from ecard - not finished - (local_record_from_uid): Obtain local_record from uid with the proper - e-book way - (set_status_cleared): Add empty callback - (add_archive_record): kill - (delete_archive_record): kill - (archive_record): Add empty callback - (conduit_get_gpilot_conduit): Update signal connects - - * backend/pas/pas-backend-file.c (vcard_change_type): Function to determine - the type of change - not finished - (pas_backend_file_search_changes): Create a view and callback based on - how the cards have changed - (pas_backend_file_process_get_changes): Implement the get changes operation - for files - (pas_backend_file_process_client_requests): Add GetChanges method for - processing - - * backend/pas/pas-book.c (pas_book_queue_get_changes): Add changes to - the list - (impl_Evolution_Book_get_changes): implement object method - (pas_book_get_epv): Add get changes to epv - (pas_book_respond_get_changes): Respond to the get changes operation - - * backend/pas/pas-book.h: Add GetChanges PASOperation - - * backend/idl/addressbook.idl: add get_changes and respond_get_changes - methods - - * backend/ebook/e-book.c (e_book_get_changes): Client function - to a view of the changed objects - - * backend/ebook/e-book.h: New prototype - -2000-10-30 Kjartan Maraas <kmaraas@gnome.org> - - * backend/e-book/e-card.c: Fixed marking of strings - for translation. Use "_(" instead of "_ (". - * gui/component/addressbook-factory.c: Add missing - calls to bindtextdomain() and textdomain noticed by - Dan Winship. - * gui/component/addressbook.c: Marked string for translation. - -2000-10-27 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/Makefile.am, gui/search/Makefile.am, - printing/Makefile.am: Fixed these to include EXTRA_GNOME_CFLAGS. - - * gui/component/select-names/e-select-names-manager.c: Turned off - newlines in header fields. - -2000-10-26 Michael Meeks <michael@helixcode.com> - - * printing/e-contact-print.c (e_contact_print_letter_tab), - (complete_sequence, e_contact_do_print_phone_list, lowify): - unsigned charness. - -2000-10-25 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c (ldap_op_process_current): only - call the handler if the if we're connected, and if we fail to - connect finish the op and post a message. - (pas_backend_ldap_connect): add debug spew if DEBUG is defined. - (modify_card_handler): LDAP_RES_SEARCH_ENTRY => LDAP_SUCCESS. - (modify_card_handler): only perform the ldap_modify_s if we have a - list of modifications. - (get_cursor_handler): use ldap_error_to_response here. - (pas_backend_ldap_load_uri): use LDAP_PORT instead of the constant - 389. - -2000-10-23 Dan Winship <danw@helixcode.com> - - * gui/component/select-names/Makefile.am (INCLUDES): - * gui/component/Makefile.am (INCLUDES): Update EVOLUTION_LOCALEDIR - - * backend/pas/Makefile.am (INCLUDES): - * backend/ebook/Makefile.am (INCLUDES): Update GNOMELOCALEDIR. - -2000-10-23 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.h: Use new libeconduit calls and - abstraction - - * conduit/address-conduit.c: ditto - -2000-10-23 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.c (pre_sync): Use e_pilot_map_read - (post_sync): Use e_pilot_map_write - - * conduit/Makefile.am: Link libeconduit and not libical - -2000-10-20 Michael Meeks <michael@helixcode.com> - - * contact-editor/e-contact-editor.c (tb_save_and_close_cb): - - * gui/component/addressbook.c (toggle_view_as_cb): - -2000-10-20 JP Rosevear <jpr@helixcode.com> - - * conduit/address-conduit.h: New structure of file - similar - to calendar/todo conduits - - * conduit/address-conduit.c: ditto - - * conduit/address-conduit-config.h: Config stuff for conduit - - * conduit/.cvsignore: Update - - * conduit/Makefile.am: Build fixes - - * conduit/address-conduit-control-applet.desktop: Renamed - to e-address-conduit-control-applet.desktop - - * conduit/address.conduit.in: Renamed to e-address.conduit.in - -2000-10-19 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/e-addressbook-view.c (SPEC): Remove Family name - column since it's a bit weird. This also fixes the initial state - since all of the column choices were off by one. - -2000-10-19 Ettore Perazzoli <ettore@helixcode.com> - - * printing/Makefile.am (glade_DATA): Remove - `e-contact-print.glade.h'. - (EXTRA_DIST): Move here. - - * gui/component/Makefile.am (glade_DATA): Remove - `ldap-server-dialog.glade.h'. - (EXTRA_DIST): Move here. - -2000-10-19 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Change how the extension field acts when - converting delivery addresses to labels. - -2000-10-18 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added the - function e_card_delivery_address_to_label. - - * contact-editor/e-contact-editor-address.c: Fixed a potential - crash. - - * contact-editor/e-contact-editor.c: Made this save the changed - data to the string version of the address. - -2000-10-19 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c (change_view_type): update to new - UI handler. - (update_view_type): split from (change_view_type). - (control_activate): add an update_view_type. - -2000-10-18 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c: Change NAME_OR_ORG to return the - email address if both name and organization are taken. - - * gui/component/select-names/e-select-names.c: Fixed up the spec - strings in this class. Removed the "cursor_mode" argument to - ETable since it's part of the spec now. - -2000-10-17 Iain Holmes <iain@helixcode.com> - - * contact-editor/contact-editor.glade: Change the initial dialog - visibility to FALSE - so the contact editor doesn't flash when it appears. - -2000-10-16 Iain Holmes <iain@helixcode.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_activate_dialog): Only allow one dialog - per manager. - -2000-10-16 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/fulladdr.glade: Fixed a typo. Made this look a - bit better. - -2000-10-15 Dan Winship <danw@helixcode.com> - - * gui/component/select-names/Makefile.am: - * gui/component/Makefile.am: Remove CPPFLAGS since they just - duplicate flags that were already in INCLUDES. - - * printing/Makefile.am (ecpsdir): - * gui/widgets/Makefile.am: - * contact-editor/Makefile.am: Move -D flags from CPPFLAGS to - INCLUDES so they don't override any CPPFLAGS set at configure - time. - -2000-10-14 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c (control_activate): if we are in - LDAP mode then merge in the extra few items, otherwise just merge - the standard thing; saves duplication. - -2000-10-14 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.oafinfo: Added - "evolution:shell-component-icon" property. - -2000-10-14 Iain Holmes <iain@helixcode.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_manager_activate_dialog): Only allow one dialog - per id. - (e_select_names_manager_destroy): Destroy the hashtable. - (e_select_names_manager_init): Init the hashtable. - -2000-10-13 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/fulladdr.glade, contact-editor/fulladdr.glade.h: - Rearranged these fields a bit more. - -2000-10-13 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c, - gui/component/select-names/e-select-names.c, - gui/widgets/e-addressbook-view.c: Changed these for boolean - ascending attribute instead of int ascending attribute. Fixed - e-select-names to not use a column past the end of its array. - - * contact-editor/e-contact-editor-address.c, - contact-editor/fulladdr.glade, contact-editor/fulladdr.glade.h: - Rearranged the address editor dialog. - -2000-10-11 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Fixed the column - elements, the no-headers attribute and added a cursor-mode=line - attribute. - - * gui/component/select-names/e-select-names.c, - gui/widgets/e-addressbook-view.c: Fixed the column elements here. - -2000-10-11 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c, - gui/component/select-names/e-select-names.c, - gui/widgets/e-addressbook-view.c: Updated these to the new style - ETables. - -2000-10-06 Not Zed <NotZed@HelixCode.com> - - * gui/search/e-addressbook-search-dialog.c (get_widget): Removed - ondemand callback nonsense from rule_context_load(). - -2000-10-05 Michael Meeks <michael@helixcode.com> - - * contact-editor/e-contact-editor.c (create_ui): upd. - (e_contact_editor_init): upd. - - * gui/component/addressbook.c (control_activate_cb): upd. - (control_deactivate): kill. - (control_activate): upd. - -2000-09-22 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c (control_activate): update. - - * contact-editor/e-contact-editor.c (create_ui): upd. - -Fri Sep 29 07:33:54 2000 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/e-minicard.c, gui/widgets/e-minicard.h: Made it so - that minicard doesn't write out changes to the backend unless - something's actually changed. - -Tue Sep 26 16:28:47 2000 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Make sure that card->name and - card->full_name are always valid. - - * contact-editor/e-contact-editor.c: Removed some unused - variables. - -2000-09-22 Matt Bissiri <bissiri@eecs.umich.edu> - - * contact-editor/e-contact-editor-fullname.c (extract_info): If - (editor->name == NULL), store ptr to newly allocated ECardName in - editor->name, not just in a stack variable. This fixes a crash - which happened when you click "New", then click "Full Name...", - then enter name, then click "OK". - - * backend/ebook/e-card.c (e_card_name_to_string): Add - g_return_val_if_fail. - -2000-09-25 Jeffrey Stedfast <fejj@helixcode.com> - - * gui/widgets/Makefile.am: - * gui/component/Makefile.am: - * contact-editor/Makefile.am: - * printing/Makefile.am: Look for ename in /e-util/ename instead of - /addressbook/ename - - * backend/ebook/e-card.c: Updated to include e-util/ename/*.h - - * ename: Moved to /e-util so it could be shared - - * Makefile.am (SUBDIRS): took out ename - -2000-09-25 Nat Friedman <nat@helixcode.com> - - * ename/e-name-western-tables.h: Added a ton of new prefixes and - suffixes. - -2000-09-22 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c (control_activate): update. - - * contact-editor/e-contact-editor.c (create_ui): upd. - -2000-09-22 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c: lots of changes. flesh out the - remove/modify/create functions. add another flag for the property - table, PROP_DN, which makes it easy for us to determine when we - need to create a new DN for a record when we're modifying. also - add a ber_func to the table for PROP_TYPE_LIST fields, which fills - in the list of bvalues that we send to the ldap server. The - add/modify/delete stuff hasn't been tested yet, and it hopelessly - complex (yay ldap). - (ldap_search_handler): act synchronous when ldap_search responds - with -1. - (view_destroy): use pas_book_view_notify_status_message. - (ldap_op_process_current): same - (ldap_op_process): same - (poll_ldap): same - (ldap_search_handler): same - -2000-09-22 Chris Toshok <toshok@helixcode.com> - - * backend/ebook/e-card-simple.h: add - E_CARD_SIMPLE_FIELD_FAMILY_NAME to the enum. - - * backend/ebook/e-card-simple.c (field_data): add - E_CARD_SIMPLE_FIELD_FAMILY_NAME. - (e_card_simple_get): add getter for FAMILY_NAME. - -2000-09-22 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Made addresses be quoted printable again - so that they will encode properly if they have carriage returns in - them. This is possible now because of a fix in libversit. - -2000-09-22 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-book-view-listener.c, - backend/ebook/e-book-view-listener.h, backend/ebook/e-book-view.c, - backend/ebook/e-book-view.h, backend/idl/addressbook.idl, - backend/pas/pas-book-view.c, backend/pas/pas-book-view.h: Added a - function to set the status message associated with a given view. - This is not yet implemented in the gui. - -2000-09-22 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-book.c, backend/ebook/e-book.h, - backend/idl/addressbook.idl, backend/pas/pas-backend-file.c, - backend/pas/pas-backend-ldap.c, backend/pas-backend.c, - backend/pas/pas-backend.h, backend/pas/pas-book.c, - backend/pas/pas-book.h: Added a function to query static - capabilities (capabilities that can be reported immediately) and - implemented them in the 2 servers. - - * gui/component/addressbook.c: Added a View All button and a Stop - button. Sorted out the new directory server stuff a bit. - - * gui/widgets/e-addressbook-model.c, - gui/widgets/e-addressbook-model.h: Cleaned up a bit. Added a stop - function. Check for capabilities before deciding whether to load - all cards when initially viewed. - - * gui/widgets/e-addressbook-view.c, - gui/widgets/e-addressbook-view.h: Added stop and view all - functions. - - * gui/widgets/e-minicard-view-widget.c, - gui/widgets/e-minicard-view-widget.h, - gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h: - Added a stop function. Check for capabilities before deciding - whether to load all cards when initially viewed. - -2000-09-21 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c (control_activate): remove _UIHandler - -2000-09-21 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/load-pine-addressbook.c: Added a missing include - of ctype.h. - - * backend/pas/pas-backend-file.c: Fixed a problem where using a - GList was causing us to not be reentrant. We now use an EList - here and so now this is reentrant. This should fix the "wombat - crashes every time you run evolution" bug. - - * contact-editor/e-contact-editor.c: Fixed a type mismatch. - -2000-09-21 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/load-pine-addressbook.c: Make this work when a - field is spread across multiple lines. - -2000-09-20 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added a - wants_html field to cards. Uses "x-mozilla-html". - - * contact-editor/Makefile.am: Added definition of - EVOLUTION_DATADIR. - - * contact-editor/contact-editor.glade: Make Wants HTML check - button visible. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Make Wants HTML check button - active. Fix UI stuff to use XML. Set parent window of - confirm_delete dialog. - - * gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard.c: Set - the parent window of the confirm_delete dialog. - -2000-09-20 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/e-addressbook-view.c: Fixed display of the minicards - when the addressbook was first loading. (It was overwriting a - string with NULL during init.) - -2000-09-19 Dan Winship <danw@helixcode.com> - - * gui/search/Makefile.am (ruledir): Use $(datadir), not - $(prefix)/share - -2000-09-18 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am, contact-editor/Makefile.am, - ename/Makefile.am, gui/component/Makefile.am, - gui/widgets/Makefile.am: Added $(EXTRA_GNOME_CFLAGS) and - $(EXTRA_GNOME_LIBS). Removed unneeded libraries. - - * backend/ebook/e-card.c, backend/pas/pas-backend-file.c, - contact-editor/e-contact-editor-address.c, - contact-editor/e-contact-editor-categories.c, - contact-editor/e-contact-editor-categories.h, - contact-editor/e-contact-editor-fullname.c, - contact-editor/e-contact-editor.c, - contact-editor/e-contact-save-as.c, ename/e-address-western.c, - ename/test-ename-western-gtk.c, - gui/component/addressbook-factory.c, gui/component/addressbook.c, - gui/component/e-cardlist-model.h, gui/component/e-ldap-storage.c, - gui/component/select-names/e-select-names-bonobo.c, - gui/component/select-names/e-select-names-manager.c, - gui/component/select-names/e-select-names-model.c, - gui/component/select-names/e-select-names-table-model.c, - gui/component/select-names/e-select-names-table-model.h, - gui/component/select-names/e-select-names-text-model.h, - gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h, - gui/search/e-addressbook-search-dialog.c, - gui/widgets/e-addressbook-model.h, - gui/widgets/e-addressbook-view.c, gui/widgets/e-minicard-label.c, - gui/widgets/e-minicard-view-widget.c, - gui/widgets/e-minicard-view-widget.h, - gui/widgets/e-minicard-view.c, gui/widgets/e-minicard-view.h, - gui/widgets/e-minicard-widget.h, gui/widgets/e-minicard.c, - gui/widgets/test-minicard-label.c, gui/widgets/test-reflow.c, - printing/e-contact-print.c: Fixed the #include lines to deal - properly with gal. - -2000-09-15 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.h, - contact-editor/e-contact-save-as.h, - gui/widgets/e-addressbook-model.h, - gui/widgets/e-minicard-view-widget.h, - gui/widgets/e-minicard-view.h, gui/widgets/e-minicard.c, - gui/widgets/e-minicard.h: Fixed the paths of some .h #includes. - - * gui/component/addressbook.c: Removed all of the code to actually - create and display the correct view of the addressbook and moved - it to the new class gui/widgets/e-addressbook-view.c. - - * gui/widgets/Makefile.am: Added everything necessary for - e-addressbook-view.c and e-addressbook-view.h. - - * gui/widgets/e-addressbook-view.c, - gui/widgets/e-addressbook-view.h: New class to deal with actual - display of addresses and switching between card view and table - view. - - * gui/widgets/e-minicard-view-widget.c: Made this deal more - gracefully with having the book set to NULL. - -2000-09-16 Michael Meeks <michael@helixcode.com> - - * gui/component/select-names/e-select-names.c: fix broken include. - - * gui/component/Makefile.am (INCLUDES): define datadir. - (evolution_addressbook_SOURCES): remove e-addressbook-model.[ch] - - * gui/component/addressbook.c (control_activate): use datadir. - -2000-09-16 Ettore Perazzoli <ettore@helixcode.com> - - * gui/widgets/Makefile.am (gladedir): Define. - (glade_DATA): Install `alphabet.glade'. - (EXTRA_DIST): Define. - - * gui/component/Makefile.am (glade_DATA): Remove `alphabet.glade'. - (EXTRA_DIST): Remove `alphabet.glade.h'. - - * gui/widgets/Makefile.am (libeminicard_a_SOURCES): Add - `e-addressbook-model.c' and `e-addressbook-model.h'. I hope this - is what Chris meant to do. - - * gui/component/Makefile.am (INCLUDES): Add - `-I$(top_srcdir)/addressbook/gui/widgets'. - (evolution_addressbook_SOURCES): Remove `e-addressbook-model.c' - and `e-addressbook-model.h'. - - * gui/component/select-names/e-select-names.c: #include - "e-addressbook-model.h" from "addressbook/gui/widgets" instead of - "addressbook/gui/component", as it has been moved there. - -2000-09-15 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c: split all the ldap operations - into 2 halves, a handler, and destructor, and create a structure - containing two function pointers and any data they need. this - allows us queue up pending operations (since the LDAP*'s are no - longer view specific. there's one per backend.) also, add - support for restarting async operations if the SERVER DOWN error - isn't communicated until sometime after the handler is called (as - is the case with the async search stuff.) - -2000-09-14 Dan Winship <danw@helixcode.com> - - * gui/component/addressbook-factory.c (main): Call unicode_init - for e-font stuff. - -2000-09-14 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/Makefile.am, gui/widgets/Makefile.am: Added - $(GNOME_PRINT_LIBS) to all of the test files in these directories. - -2000-09-14 Michael Meeks <michael@helixcode.com> - - * gui/component/Makefile.am (evolution_addressbook_LDADD): fix path. - - * gui/component/addressbook.c: update include. - - * gui/component/addressbook-factory.c: update include. - - * gui/widgets/e-minicard-view.h: update include. - - * gui/search/e-addressbook-search-dialog.c: update include path. - -2000-09-13 Michael Meeks <michael@helixcode.com> - - * contact-editor/e-contact-editor.c (e_contact_editor_init): hack. - (create_toolbar): ditto. - -2000-09-07 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c: Radicaly update UI handler code. - -2000-09-13 Christopher James Lahey <clahey@helixcode.com> - - * gui/widgets/*, gui/minicard/*: Moved gui/minicard to - gui/widgets, except for e-reflow.c, e-reflow.h, e-reflow-sorted.c, - and e-reflow-sorted.h. - - * gui/widgets/Makefile.am: Added e-reflow to the INCLUDES list and - libereflow.a to a bunch of LDADD lines. - - * gui/component/Makefile.am (evolution_addressbook_LDADD): Added - libereflow.a here. - - * gui/Makefile.am (SUBDIRS): Replaced minicard with widgets. - -2000-09-12 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/select-names/Makefile.am: Add space after `-I' - when invoking `orbit-idl'. - -2000-09-12 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/Makefile.am (EXTRA_DIST): Remove `ui.xml'. - -2000-09-11 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Fixed a crash error. - -2000-09-11 Christopher James Lahey <clahey@helixcode.com> - - * ename/e-address-western.c: Fixed some warnings. - -2000-09-11 Jesse Pavel <jpavel@helixcode.com> - - * ename/e-address-western.c: fixed certain address parsing - problems. - -2000-09-11 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/fulladdr.glade: Made this a bit better balanced. - - * gui/component/addressbook.c: Make the toolbar button for find do - the same thing that the menu item for search does. - - * gui/search/e-addressbook-search-dialog.c: Made the top half of - this not expand. - -2000-09-11 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - Removed a bunch of redundant code. Made it so that when you set - an address label, it sets the delivery address as well. Added - functions to set and get the delivery address. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added code to - convert and address label to a delivery address. - - * contact-editor/Makefile.am: Added e-contact-editor-address.[ch], - fulladdr.glade, fulladdr.glade.h. - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Switched from a label - to a button to show the parsed address. - - * contact-editor/e-contact-editor-address.c, - contact-editor/e-contact-editor-address.h: New class to implement - the parsed address dialog. - - * contact-editor/e-contact-editor-fullname.c, - contact-editor/e-contact-editor-fullname.h: Added const to the - _new function. - - * contact-editor/e-contact-editor.c: Implemented clicking on the - address button. - - * contact-editor/fulladdr.glade, contact-editor/fulladdr.glade.h: - New glade files for the parsed address dialog. - - * contact-editor/fullname-strings.h, fullname.glade: Changed these - accellabels to labels. - - * ename/Makefile.am: Added e-address-western.c. - - * ename/e-address-western.c: Fixed some warnings. - -2000-09-10 Christopher James Lahey <clahey@helixcode.com> - - * ename/e-address-western.c: Added by Jesse. - -2000-09-08 Lauris Kaplinski <lauris@helixcode.com> - - * gui/minicard/e-minicard-label.c (e_minicard_label_construct): - Use canvas default font - - * gui/minicard/e-minicard.c (e_minicard_realize): Ditto - (get_left_width): Ditto - -2000-09-08 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Fixed a few warnings. - -2000-09-02 Lauris kaplinski <lauris@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: e_utf8 wrappers - - * contact-editor/e-contact-editor.c: e_utf8 wrappers - -2000-09-01 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/e-ldap-storage.c (load_ldap_data): Updated for the - extra arg now needed by `evolution_storage_new_folder()'. - (e_ldap_storage_add_server): Likewise. - -2000-08-31 Ettore Perazzoli <ettore@helixcode.com> - - * conduit/Makefile.am (INCLUDES): Add `BONOBO_GNOME_CFLAGS' and - `-I$(top_srcdir)'. - -2000-08-31 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Install load-gnomecard-addressbook - and load-pine-addressbook. - -2000-08-30 Lauris Kaplinski <lauris@helixcode.com> - - * printing/e-contact-print.c: Countless small changes for gnome-print 0.21+ - -2000-08-30 Dan Winship <danw@helixcode.com> - - * gui/component/addressbook.oafinfo: Add a name to the minicard - viewer. - -2000-08-29 Dan Winship <danw@helixcode.com> - - * backend/ebook/e-book.c: - * backend/ebook/test-client.c: - * backend/ebook/test-client-list.c: - * backend/ebook/load-gnomecard-addressbook.c: - * backend/ebook/load-pine-addressbook.c: - * backend/pas/pas-book-factory.c: - * conduit/address-conduit.h: Remove USING_OAF checks - -2000-08-28 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Use the right argument name to turn - on grid lines. - -2000-08-26 JP Rosevear <jpr@helixcode.com> - - * gui/minicard/Makefile.am: Comment out minicard-view-test - since its gnorba dependent - -2000-08-26 JP Rosevear <jpr@helixcode.com> - - * gui/component/addressbook-component.c: Remove gnorba stuff - - * gui/minicard/e-minicard-control.c (e_minicard_control_factory_init): - ditto - - * gui/component/addressbook.c: ditto - - * gui/component/addressbook-factory.c: ditto - -2000-08-25 Christopher James Lahey <clahey@helixcode.com> - - * demo/* Removed the demo directory since it's no longer used. - -2000-08-26 JP Rosevear <jpr@helixcode.com> - - * gui/minicard/Makefile.am: Remove gnorba stuff - - * gui/minicard/e-minicard-control.gnorba: Kill - -2000-08-26 JP Rosevear <jpr@helixcode.com> - - * gui/component/addressbook.gnorba: Kill - - * gui/component/Makefile.am: Remove gnorba stuff - -2000-08-25 Dan Winship <danw@helixcode.com> - - * gui/component/Makefile.am (evolution_addressbook_LDFLAGS): Add - -export-dynamic so libglade will be able to resolve custom widget - callbacks. - -2000-08-23 Lauris Kaplinski <lauris@helixcode.com> - - * backend/pas/pas-backend-file.c (func_contains): Use e_utf8_strstrcase - - * contact-editor/e-contact-editor-fullname.c (fill_in_field): Use e_utf8 wrapper - (extract_field): Same - - * contact-editor/e-contact-editor.c (full_name_clicked): Don't crash - - * ename/Makefile.am: Link demo with libeutil.la - - * ename/test-ename-western-gtk.c (full_changed_cb): Use e_utf8 wrapper - - * gui/component/addressbook.c (find_contact_cb): Use e_utf8 wrapper - (search_entry_activated): Same - -2000-08-22 Christopher James Lahey <clahey@helixcode.com> - - * gui/search/e-addressbook-search-dialog.c: Fix an error in the - arguments to rule_context_load. - - * backend/ebook/e-card.c: Fix this to not mess up if the person - passes a VCard with a carriage return in the mailing address. - -2000-08-14 Not Zed <NotZed@HelixCode.com> - - * gui/search/addresstypes.xml: Fixed fullname->full_name for - search field. - - * gui/search/e-addressbook-search-dialog.c (get_widget): Check we - actually got any parts to build the dialogue with. - -2000-08-13 Not Zed <NotZed@HelixCode.com> - - * gui/component/addressbook-component.c (owner_set_cb): Set the - global_shell_client nastyhack when we know it. - This is only required to link with the filter code ... - - * gui/component/Makefile.am (evolution_addressbook_LDADD): Added - libfilter.a to the link line. - - * gui/search/Makefile.am (noinst_LIBRARIES): Change library name - from libaddressbooksearchdialog to libaddressbooksearch, as used - elsewhere. - - * gui/search/e-addressbook-search-dialog.c (get_widget): - Implement. - (get_query): Likewise. - (e_addressbook_search_dialog_destroy): Unref filter stuff when - done. - - * gui/component/addressbook.c (control_deactivate): Added chris's - patch to put the meny in - -2000-08-22 Lauris Kaplinski <lauris@helixcode.com> - - * contact-editor/e-contact-editor.c: Use e_utf8 wrappers everywhere - -2000-08-22 Christopher James Lahey <clahey@helixcode.com> - - * backend/e-card.h: Started adding a time zone field to ECard. - - * gui/component/e-addressbook-model.c: Added - e_table_model_pre_change where appropriate. - - * gui/minicard/e-minicard-control.c: Added a ref and unref pair. - -2000-08-22 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Linked in the search dialog again. - It looks like some changes in the shell made this not work. - -2000-08-19 Christopher James Lahey <clahey@helixcode.com> - - * conduit/address-conduit.c, conduit/address-conduit.h: Changed - this to use ECardSimple. - - * contact-editor/e-contact-editor.c: Fixed a memory leak. - - * gui/component/addressbook.c: Added stuff to the right click - menu. Activated the new search dialog that doesn't quite work - yet. - - * gui/minicard/e-minicard-view.c: Fixed some run time warnings. - -2000-08-15 Larry Ewing <lewing@helixcode.com> - - * gui/minicard/e-minicard.c (e_minicard_event): use style colors - for the selected state. This doesn't properly redraw the minicard - when there is a style_change event, that is next. - (e_minicard_realize): use style colors. - -2000-08-14 Peter Williams <peterw@helixcode.com> - - * backend/pas/pas-backend-file.c: Include the proper db1/db.h - as in RedHat 7.0 -- patch from Kenny Graunke <kwg@teleport.com> - -2000-08-13 Chris Toshok <toshok@helixcode.com> - - * conduit/Makefile.am (libaddress_conduit_la_SOURCES): add - address-conduit.h - - * Makefile.am (CONDUIT_SUBDIR): only set subdir if - ENABLE_PILOT_CONDUITS is set. - -2000-08-13 Chris Toshok <toshok@helixcode.com> - - * Makefile.am (SUBDIRS): add conduit subdir. - -2000-08-13 Chris Toshok <toshok@helixcode.com> - - * conduit/address-conduit.c (conduit_get_gpilot_conduit): add - special oaf initialization hack so conduit can find wombat, and - accept all cookies so that we can actually talk to oaf. - -2000-08-13 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c: Fixed a typo that cause the - wrong field to be searched. - - * gui/component/select-names/e-select-names.c: Made the select - names dialog only display entries with email addresses. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/contact-editor.glade: Fixed a typo in the name of - the first phone entry. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * gui/search/Makefile.am, - gui/search/e-addressbook-search-dialog.c, - gui/search/e-addressbook-search-dialog.h: A few small interface - fixes. - - * gui/component/Makefile.am: Link in the addressbook search - dialog. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * gui/Makefile.am: Added the search directory. - - * backend/ebook/e-book.c: Fixed a potential crash. - - * gui/minicard/e-reflow-sorted.h: Fixed an include line. - - * gui/search/.cvsignore, gui/search/Makefile.am: New files. - - * gui/search/e-addressbook-search-dialog.c: Fixed compilation. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * printing/Makefile.am: Ettore fixed compilation. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/.cvsignore: Added load-gnomecard-addressbook. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * gui/search/e-addressbook-search-dialog.c, - gui/search/e-addressbook-search-dialog.h: Made this into a Gtk - object. - -2000-08-12 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-book-view.c: Ref our book view listener. - - * gui/component/addressbook.c: Updated to use new minicard view - widget. - - * gui/minicard/Makefile.am: Added e-minicard-view-widget.c and - e-minicard-view-widget.h. - - * gui/minicard/e-minicard-view-widget.c, - gui/minicard/e-minicard-view-widget.h: New class that's just a - minicard view in an ECanvas. - - * gui/search/e-addressbook-search-dialog.c: New file for - implementing a search dialog. - -2000-08-11 Chris Toshok <toshok@helixcode.com> - - * conduit/address-conduit.c (transmit): implement code to encode - the first email address and send to the pilot. - (get_phone_label_by_flag): rename find_phone_label_for_flags to - this, and implement by calling get_phone_label_by_name. - -2000-08-11 Chris Toshok <toshok@helixcode.com> - - * conduit/address-conduit.c (ecard_from_remote_record): add code - for handling email addresses from pilot (which stores it as a - phone number entry. go figure.) - (check_for_slow_setting): #if 0 out, since we don't use it (yet). - (update_record): un #if 0 the code to handle the case where the - pilot info has changed for a local record. - (merge_ecard_with_remote_record): implement function, but for now - just return the existing (desktop) record - we still don't allow - merge from the pilot. - - -2000-08-10 Christopher James Lahey <clahey@helixcode.com> - - * gui/search/addresstypes.xml: Changed a couple of input field - names. - -2000-08-10 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-component.c: Remove prototype for - `setup_ldap_storage()', which shouldn't be here anyway. - -2000-08-10 Christopher James Lahey <clahey@helixcode.com> - - * gui/search/, gui/search/addresstypes.xml: New search dialog for - addressbook. - -2000-08-10 Dan Winship <danw@helixcode.com> - - * gui/component/addressbook-component.c (owner_set_cb): Update for - changed prototype, pass evolution_homedir arg to - setup_ldap_storage. - - * gui/component/e-ldap-storage.c (setup_ldap_storage): Now takes - an evolution_homedir arg, uses that to generate the path to the - ldapservers.xml file, and stores the result in a static variable. - (e_ldap_storage_add_server, e_ldap_storage_remove_server): Use that - static variable rather than hardcoding the path to the file. - -2000-08-10 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c: Fixed any search to not crash on - missing phone numbers or email addresses. - -2000-08-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-control.c: Added a button to save to - your addressbook. - -2000-08-09 Cody Russell <bratsche@gnome.org> - - * gui/component/addressbook.c: Make the toolbar honor the user's - gnomecc settings for detachable toolbars. - -2000-08-09 Nat Friedman <nat@helixcode.com> - - * ename/e-name-western-tables.h: Added some military prefixes. - -2000-08-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Fixed a warning. - -2000-08-09 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.c (control_activate): Add the stock - print icon to the print item. - -2000-08-09 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.c (control_activate): Put the print - item in the right placeholder so that it gets the right position - in the "File" menu. - (control_deactivate): Updated accordingly. - -2000-08-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c, gui/minicard/e-minicard.c: Changed - e_popup_menu_run call to match the new arguments. - - * gui/component/addressbook.oafinfo: Fixed this file to work - properly. - - * gui/minicard/e-minicard-control.c: Use the correct oafinfo ID - here. Also cleaned up the code a bit with the help of Michael - Meeks. - -2000-08-08 Chris Toshok <toshok@helixcode.com> - - * gui/component/e-addressbook-model.c (e_addressbook_model_init): - use x-evolution-any-field. - - * gui/component/addressbook.c (search_entry_activated): use - x-evolution-any-field. - (change_view_type): same. - - * gui/minicard/e-minicard-view.c (e_minicard_view_init): set query - to x-evolution-any-field. - - * backend/pas/pas-backend-ldap.c (func_contains): support - x-evolution-any-field for matching any evolution supported field. - - * backend/pas/pas-backend-file.c (compare_email): switch to using - ECardSimple calls. - (compare_phone): same. - (compare_address): same. - (entry_compare): switch to using ECardSimple calls, and support a - 'x-evolution-any-field' wildcard field. - (vcard_matches_search): use an ECardSimple. - -2000-08-07 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Removed the next and prev - toolbar buttons since they don't do anything. - -2000-08-07 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor.c: Fixed the tab order to not - repeat the web page address field. - -2000-08-07 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Fixed the tab order for this - dialog. - -2000-08-05 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c: Fixed a warning. - - * backend/ebook/e-card.c: Cast to (char *) in - e_card_load_cards_from_file since libversit isn't const correct. - - * backend/pas/pas-backend-file.c: Fixed a warning. - -2000-08-04 Michael Meeks <michael@helixcode.com> - - * gui/component/addressbook.c (control_activate): unref. - - * demo/addressbook.c (control_activate): unref. - -2000-08-02 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c, - gui/component/e-addressbook-model.c: Emit "model_pre_change" - signal as appropriate. - -2000-08-02 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-addressbook-model.c: Adapted this to supply the - new append_row API of ETableModel. - -2000-07-31 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Changed the default set of columns. - -2000-07-29 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Added load-gnomecard-addressbook - compilation. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added - e_card_load_cards_from_file helper function to load multiple cards - from a single file. - - * backend/ebook/load-gnomecard-addressbook.c: New file to load - vcard files. I think this is the format that gnomecard uses so if - you copy your gnomecard file to gnomecard.vcf and then run this - program in the same directory, it'll copy all your gnome contacts - into evolution. It needs to be changed to take a filename as a - parameter. Some fields (phone and address information, for - example) aren't displayed properly, but are saved. This is new - code, so some other than phone and address may be lost. - -2000-07-28 Ettore Perazzoli <ettore@helixcode.com> - - * backend/pas/Makefile.am: Add `pas-backend-ldap.c' and - `pas-backend-ldap.h' to `EXTRA_DIST' so they get distributed even - if the OpenLDAP support is not enabled. - -2000-07-27 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/load-pine-addressbook.c: Changed the URI to load - to. - -2000-07-26 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-widget-test.c: Fixed a warning. - -2000-07-26 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c (view_destroy): wait to free the - view until we've taken care of freeing its internals. also, close - the ldap connection here. - (pas_backend_ldap_connect): rename p_b_l_ensure_connected to this, - since it's always called when we create a view. - (pas_backend_ldap_build_all_cards_list): open an ldap connection - in this function and close it at the end. - (poll_ldap): make sure to call ldap_unbind to close the view's - connection here. - (pas_backend_ldap_search): call pas_backend_ldap_connect here - - ldap_unbind will either be called from poll_ldap or from - view_destroy. - (pas_backend_ldap_get_vcard): the PASBackendLDAP no longer has an - LDAP*. - -2000-07-26 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_build_all_cards_list): add support for user settable scope. - (pas_backend_ldap_search): same. - (pas_backend_ldap_load_uri): same. - -2000-07-26 Dan Winship <danw@helixcode.com> - - * gui/component/addressbook.oafinfo: lowercasify the - supported_mime_types - -2000-07-25 Chris Toshok <toshok@helixcode.com> - - * backend/ebook/e-card-types.h: add enum for e-card pilot status. - - * conduit/address-conduit.c: #ifdef out all the archiving code with SUPPORT_ARCHIVING. - (purge): implement correctly - deleting ecards whose pilot status is DELETED. - (set_status): implement. - (set_pilot_id): add gtk_main call here to change commit_card into a synchronous - (delete_all): implement correctly - don't delete the records, just set their status to DELETED. - (local_record_from_ecard): get the current status from the ecard. - - * backend/ebook/e-card.c (e_card_get_vcard): add vcard support for pilot status. - (parse_pilot_status): new function. - (e_card_class_init): add pilot status object arg. - (e_card_set_arg): add pilot status support. - (e_card_get_arg): same. - (e_card_init): initialize pilot_status to 0. - -2000-07-25 Chris Toshok <toshok@helixcode.com> - - * conduit/address-conduit.c: add comment headers to signals that - didn't have any. - -2000-07-25 Chris Toshok <toshok@helixcode.com> - - * conduit/address-conduit.c (start_address_server): use the user's - Contact db. not toshok's. - -2000-07-25 Michael Meeks <michael@helixcode.com> - - * backend/ebook/load-pine-addressbook.c (book_open_cb): check we - opened ok. - -2000-07-25 Seth Alves <alves@hungry.com> - - * ename/Makefile.am (libename_static_la_LDFLAGS): build static - version of the library for address conduit to use - - * backend/ebook/Makefile.am: build a static version of the library - to link into the conduit - -2000-07-25 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Added a #define for - "X-EVOLUTION-PILOTID". Added a parse_pilot_id to read pilot id's - in properly from VCards. Rearranged some field orders. Added a - get_arg case for ARG_PILOTID. Initialize pilot_id field to 0. - -2000-07-24 Chris Toshok <toshok@helixcode.com> - - * backend/ebook/e-card.h: add pilot_id. - - * backend/ebook/e-card.c (e_card_get_vcard): add support for - X-EVOLUTION-PILOTD vcard field. - (e_card_class_init): add pilot_id arg. - (e_card_set_arg): handle pilot_id arg. - -2000-07-23 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-book-view-listener.c: Remove the idle handler - when we're destroyed. - - * printing/e-contact-print.c: Fixed the spacing on the card - header. - -2000-07-20 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.oafinfo: Fixed the oaf info. - - * gui/minicard/.cvsignore, gui/minicard/Makefile.am, - gui/minicard/e-minicard-widget-test.c: Added a test for the - minicard widget. - - * gui/minicard/e-minicard-control.c: Fixed the mime type. - - * gui/minicard/e-minicard.c: Fixed some crashes if your parent - isn't a minicard view. - - * gui/minicard/e-minicard-control.oafinfo: Removed. - -2000-07-20 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-component.c (factory_fn): Update for - the new `evolution_shell_component_new()'. - -2000-07-19 Fatih Demir <kabalak@gmx.net> - - * conduit/address-conduit-control-applet.desktop: - Added the Turkish desktop entry. - -2000-07-18 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-control.c: Added "text/vCard" to the - list of mime types we support. - -2000-07-18 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/Makefile.am: Added - gui/minicard/e-minicard-control.c, - gui/minicard/e-minicard-control.h, - gui/minicard/e-minicard-widget.c, and - gui/minicard/e-minicard-widget.h. - - * gui/minicard/e-minicard-control.c, - gui/minicard/e-minicard-control.h, - gui/minicard/e-minicard-widget.c, - gui/minicard/e-minicard-widget.h: Got these to compile. - - * gui/minicard/e-minicard-control.gnorba, - gui/minicard/e-minicard-control.oafinfo: Copied directly from - bonobo-clock-control. These aren't done yet. - -2000-07-18 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-control.c, - gui/minicard/e-minicard-control.h, - gui/minicard/e-minicard-widget.c, - gui/minicard/e-minicard-widget.h: New files for using a minicard - as a widget or a bonobo control. - -2000-07-14 Chris Toshok <toshok@helixcode.com> - - * gui/component/e-ldap-storage.c (ldap_server_foreach): duh. - don't save the port in the host slot either. - -2000-07-13 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-confirm-delete.glade, - contact-editor/e-contact-editor-confirm-delete.glade.h: Added - these. - -2000-07-13 Christopher James Lahey <clahey@helixcode.com> - - * Makefile.am: Switched the order of compilation of printing and - contact-editor. - - * contact-editor/Makefile.am: Added printing libraries and a - confirm delete dialog glade file. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Enabled the delete and print - functions as well as providing a confirm delete dialog to the - outside world. - - * gui/component/addressbook.c: Made the delete button on new cards - active. - - * gui/minicard/Makefile.am: Added printing libraries to a number - of test programs. - - * gui/minicard/e-minicard.c: Added print and delete to the right - click menu. Made the delete button on the card editor active. - - * printing/e-contact-print.c, printing/e-contact-print.h: Added a - function to print a single card. - -2000-07-12 Chris Toshok <toshok@helixcode.com> - - * gui/component/e-ldap-storage.c (ldap_server_foreach): oops. fix - typo that was saving the port in the rootdn spot. - (save_ldap_data): make this a bit safer - writing to a new file - and renaming it. - (load_ldap_data): make this a bit smarter - if parsing the - ldapservers.xml file fails and there's a .new file there, - rename it. - -2000-07-12 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c: Do case insensitive compares. - - * addressbook/gui/component/addressbook.c: Make quick search - search both name and company name. - -2000-07-12 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Add icons to the toolbars. - -2000-07-12 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/Makefile.am: Added installation of arrow.png. - - * contact-editor/e-contact-editor.c: Use EVOLUTIONDIR #define. - -2000-07-11 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Removed an unused function - -2000-07-10 Dan Winship <danw@helixcode.com> - - * gui/component/select-names/Makefile.am (EXTRA_DIST): add idl - file to EXTRA_DIST - -2000-07-10 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.c (control_activate): Remove the - SelectNames test. - -2000-07-10 Peter Williams <peterw@curious-george.helixcode.com> - - * gui/component/select-names/e-select-names-model.c: (Clahey's fix) - Make multiple addresses be concatenated correctly. - -2000-07-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c, - gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h: Switched from ETable - to ETableScrolled. - - * addressbook/gui/minicard/e-minicard.c: Don't display mailer or - "name or org" fields. - -2000-07-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - Added a field that gives the name if it exists and the company - name otherwise. - - * gui/component/e-addressbook-model.c: Formatting changes. - - * gui/component/select-names/e-select-names-table-model.c: Added - stripping of names and display of company name if name doesn't - exist. - - * gui/component/select-names/e-select-names.c: Fixed up the - display so that we display both name and email address. - -2000-07-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names-model.c: Fixed a small - off by one error that was causing an extra character to get - deleted sometimes. - -2000-07-09 Anders Carlsson <andersca@gnu.org> - - * gui/minicard/test-reflow.c (allocate_callback): Fix off by one bug with - scroll region setting. - (resize): Likewise. - (main): Put the contacts list in an EScrolledFrame instead of using a - separate GtkScrollbar. - - * gui/minicard/e-reflow.c (e_reflow_event): Don't change mouse cursor and - don't allow drags on dividers that aren't visible. - - * gui/component/addressbook.c (allocate_callback): Fix off by one bug with - scroll region setting. - (resize): Likewise. - (create_minicard_view): Put the contacts list in an EScrolledFrame instead of - using a separate GtkScrollbar. - -2000-07-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Removed unused do_nothing_cb - function. - - * gui/component/select-names/e-select-names-manager.c, - gui/component/select-names/e-select-names-manager.h: Made the OK - and Cancel buttons in the ESelectNames dialog we create work - properly. - - * gui/component/select-names/e-select-names-model.c, - gui/component/select-names/e-select-names-model.h: Added - e_select_names_model_duplicate. - - * gui/component/select-names/e-select-names-text-model.c: Made the - text be set correctly if there's already data in the source when - the text model is created. - - * gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h: Removed handling of - the buttons (the user of this dialog will have to handle them.) - Added e_select_names_get_source. Fixed some typos. - -2000-07-09 Not Zed <NotZed@HelixCode.com> - - * gui/component/addressbook.c: Link the toolbar print button to - the print callback. - -2000-07-08 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names.c - (e_select_names_clicked): Hitting OK or Cancel at least closes the - dialog now. - -2000-07-08 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_create_entry): Set the returned entry to - use the ellipsis. - -2000-07-08 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook-factory.c: Include - e-select-names-factory.h. - - * gui/component/select-names/e-select-names-model.c: Handle a NULL - iterator properly in the replace function. - - * gui/component/select-names/e-select-names-table-model.c: Fill in - info properly in the value_at function. - - * gui/component/select-names/e-select-names-text-model.c: Don't - strlen a NULL text object. - - * gui/component/select-names/e-select-names.c: Close if the person - hits ok or cancel (doesn't yet actually undo changes if Cancel is - hit.) Handle removing addresses when they're double clicked on. - - * gui/component/select-names/select-names.glade, - gui/component/select-names/select-names.glade.h: Hid some unused - fields and changed the text at the top of the dialog. - -2000-07-08 Jeffrey Stedfast <fejj@helixcode.com> - - * gui/component/select-names/.cvsignore: Ignore dynamically - created source files - -2000-07-08 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/select-names/e-select-names-bonobo.c - (entry_get_property_fn): New function to set the properties. - -2000-07-08 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-factory.c (main): Start up the factory - for `Evolution::Addressbook::SelectNames'. - - * gui/component/select-names/evolution-addressbook-select-names.oafinfo: - New. - - * gui/component/select-names/e-select-names-factory.c: New. - * gui/component/select-names/e-select-names-factory.h: New. - - * gui/component/select-names/e-select-names-bonobo.c: New. - * gui/component/select-names/e-select-names-bonobo.h: New. - - * gui/component/addressbook-factory.c (main): Call - `e_select_names_factory_init()'. - - * gui/component/select-names/e-select-names-manager.c - (e_select_names_manager_add_section): Made const-aware. - (e_select_names_manager_create_entry): Made const-aware. - (e_select_names_manager_activate_dialog): Made const-aware. - - * gui/component/select-names/Evolution-Addressbook-SelectNames.idl: - New. - -2000-07-08 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-addressbook-model.c, - gui/component/e-addressbook-model.h: Added an "editable" argument. - - * gui/component/select-names/e-select-names.c: Set our - EAddressModel to not be editable. - -2000-07-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names.c: Changed to line - mode. - -2000-07-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names-manager.c, - gui/component/select-names/e-select-names-model.c: Implemented the - get_cards function. - - * gui/component/select-names/e-select-names.c: Implemented adding - cards through the interface. - -2000-07-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names-manager.c: Make the - entry widgets we create editable. - - * gui/component/select-names/e-select-names-model.c: Use - e_strsplit instead of g_strsplit. Fixed an off by 1 error. - - * gui/component/select-names/e-select-names-table-model.c: When - the model changes, send a model changed signal. - - * gui/component/select-names/e-select-names-text-model.c: Made - changing this work correctly if it's empty. Made change signals - propagate properly. Is a bit better about freeing iterators when - done. - - * gui/component/select-names/e-select-names.c: Made the finished - lists be in order instead of being sorted. - -2000-07-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c (new_server_cb): Since - ELDAPServer->port is a char *, allocate a string with the number - 389 contained. - - * gui/component/addressbook.c: Make the select names test test the - new code instead of the old way of getting to an ESelectNames - dialog. - - * gui/component/select-names/e-select-names-manager.c: Coded - storing the model for each section, creating an entry and - returning it, and for activating the dialog. Wrote a bit of the - get_cards code, but not all of it. - - * gui/component/select-names/e-select-names-model.c, - gui/component/select-names/e-select-names-model.h: Coded all of - the code needed to make ESelectNamesTextModel work (it doesn't - yet, but all the code should be there.) Removed - E_SELECT_NAMES_MODEL_DATA_TYPE_SEPARATION_MATERIAL. - - * gui/component/select-names/e-select-names-table-model.c, - gui/component/select-names/e-select-names-text-model.c: Changed - these to compensate for removal of - E_SELECT_NAMES_MODEL_DATA_TYPE_SEPARATION_MATERIAL. - - * gui/component/select-names/e-select-names-table-model.h, - gui/component/select-names/e-select-names-text-model.h: Fixed some - silly typos. - - * gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h: Added a parameter to - add_section that lets you specify the source ESelectNamesModel. - -2000-07-06 Chris Toshok <toshok@helixcode.com> - - * gui/component/e-ldap-storage.h: add scope to ELDAPServer, and - make port a string. - - * gui/component/e-ldap-storage.c (load_ldap_data): don't load a - uri, load all the bits and pieces and build up the uri when - creating the folder, according to the openldap url format. - (ldap_server_foreach): store out each of the individual uri - pieces. - (e_ldap_storage_remove_server): free the new fields. - (get_string_value): if the text is empty, return the empty string - instead of NULL. - - * gui/component/e-ldap-server-dialog.c (extract_server_info): port is a string now. - (fill_in_server_info): port is a string now. - -2000-07-06 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Changed "FIXME: Save and - Close" to "Save and Close". Removed some toolbar items that will - never be used. - - * gui/component/select-names/e-select-names-model.c, - gui/component/select-names/e-select-names-model.h: Added functions - to allow you to modify the model (not implemented yet.) - - * gui/component/select-names/e-select-names-table-model.c, - gui/component/select-names/e-select-names-table-model.h: Finished - this. Doesn't support changing the model at all. - - * gui/component/select-names/e-select-names-text-model.c: Finished - this. Changing the model by typing is done, but doesn't work - since none of the functions in the base model are implemented. - -2000-07-05 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (new_server_cb): call - e_ldap_storage_add_server call. - - * gui/component/ldap-server-dialog.glade: add name row. - - * gui/component/e-ldap-server-dialog.h: remove the ELDAPServer type. - - * gui/component/e-ldap-server-dialog.c (extract_server_info): add - support for the name-entry. - - * gui/component/e-ldap-server-dialog.c (fill_in_server_info): same. - - * gui/component/e-ldap-storage.h: add ELDAPServer type, and add - prototypes for e_ldap_storage_add_server and - e_ldap_storage_remove_server. - - * gui/component/e-ldap-storage.c (e_ldap_storage_add_server): new - function, add it to our hash table, add a shell folder, and save - out the metadata. - (ldap_server_foreach): add the ldap server info under a - "contactserver" node. - (setup_ldap_storage): create our hashtable. - -2000-07-05 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (set_prop): remove hack to read - "uri" file from local directory. - - * gui/component/Makefile.am (evolution_addressbook_SOURCES): add - e-ldap-storage.{c,h} - - * gui/component/addressbook-component.c (owner_set_cb): call - setup_ldap_storage. - - * gui/component/e-ldap-storage.c (setup_ldap_storage): Register - the LDAP storage and load the .xml file. - (load_ldap_data): function to load our xml file. - (save_ldap_data): function to save our xml file. - - * gui/component/e-ldap-storage.h: new file. - -2000-07-03 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/e-select-names-manager.c, - gui/component/select-names/e-select-names-text-model.c, - gui/component/select-names/e-select-names.c: Fixed more compile - errors. - -2000-07-03 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/Makefile.am: Fixed compile error. - -2000-07-03 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Removed e-card-iterator.c, - e-card-iterator.h, e-card-list-iterator.c, e-card-list-iterator.h, - e-card-list.c, e-card-list.h. - - * backend/ebook/e-card-iterator.c, - backend/ebook/e-card-iterator.h, - backend/ebook/e-card-list-iterator.c, - backend/ebook/e-card-list-iterator.h, backend/ebook/e-card-list.c, - backend/ebook/e-card-list.h: Removed in favor or versions without - the -card in the e-util directory since these classes are not - specific to cards at all. - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h, - backend/ebook/e-card.c, backend/ebook/e-card.h, - backend/ebook/load-pine-addressbook.c, backend/ebook/test-card.c, - backend/pas/pas-backend-file.c: Changed the references to - e-card-list.c and friends to e-list.c and friends. - - * contact-editor/e-contact-editor.c: Added #include - <e-contact-save-as.h> to fix a warning. - - * gui/component/Makefile.am: Moved a number of classes associated - with the select-names object to the new select-names directory. - - * gui/component/addressbook.c: Changed the reference to - e-select-names.h. - - * gui/component/e-select-names.c, gui/component/e-select-names.h, - gui/component/select-names.glade, - gui/component/select-names.glade.h: Moved these files into - select-names/. - - * gui/component/select-names/.cvsignore, - gui/component/select-names/Makefile.am, - gui/component/select-names/e-select-names-manager.c, - gui/component/select-names/e-select-names-manager.h, - gui/component/select-names/e-select-names-model.c, - gui/component/select-names/e-select-names-model.h, - gui/component/select-names/e-select-names-table-model.c, - gui/component/select-names/e-select-names-table-model.h, - gui/component/select-names/e-select-names-text-model.c, - gui/component/select-names/e-select-names-text-model.h, - gui/component/select-names/e-select-names.c, - gui/component/select-names/e-select-names.h, - gui/component/select-names/recipient.glade, - gui/component/select-names/select-names.glade, - gui/component/select-names/select-names.glade.h: New files for - select names dialog (e-select-names.c, e-select-names.h, - select-names.glade, select-names.glade.h and recipient.glade moved - from gui/component/.) - -2000-06-29 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-component.c (owner_set_cb): Get an - EvolutionShellClient instead of an Evolution_Shell to match the - changes in libeshell. - -2000-06-28 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names/, - gui/component/select-names/e-select-names-manager.c, - gui/component/select-names/e-select-names-manager.h: New select - names manager interface (Not complete.) - -2000-06-26 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c, - addressbook/gui/component/e-cardlist-model.c: Added - value_to_string handlers. - - * demo/addressbook-widget.c, demo/demo.c: Removed usage of "x" and - "y" arguments. - - * addressbook/gui/component/addressbook.c: Activated Click To Add - and set the click to add message. - - * addressbook/gui/component/e-addressbook-model.c: Added - value_to_string and append_row handlers. - - * addressbook/gui/component/e-select-names.c: Added a column. - -2000-06-26 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c (poll_ldap): remove spew. - (pas_backend_ldap_ensure_connected): duh, don't access a pointer - we know to be NULL. - (query_prop_to_ldap): rename map_e_card_prop_to_ldap to this. - easier to type. - -2000-06-21 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/test-minicard-label.c, - gui/minicard/test-minicard.c, gui/minicard/test-reflow.c: Remove - usage of "x" and "y" arguments. - -2000-06-18 <ettore@helixcode.com> - - * contact-editor/Makefile.am (INCLUDES): Use - `$(BONOBO_GNOME_CFLAGS)' so that we compile when Bonobo is not in - the default GNOME prefix. - -2000-06-17 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-label.c, - gui/minicard/e-minicard-label.h, gui/minicard/e-minicard.c: Made - the left column of minicards not get any wider than the widest - possible name. - -2000-06-13 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/Makefile.am (SHELL_OBJS): Removed. - (evolution_addressbook_LDADD): Link with - `$(top_builddir)/shell/libeshell.a'. - -2000-06-12 Federico Mena Quintero <federico@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Removed the - ETableModel thaw handler. - * gui/component/e-cardlist-model.c: Likewise. - -2000-06-11 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-select-names.c: Fixed the widget reparenting. - -2000-06-11 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/Makefile.am: Added glade files. - - * gui/component/addressbook.c: Added a test of the Select Names - functionality. - - * gui/component/e-addressbook-model.c: Made this class_init - function a bit cleaner. - - * gui/component/e-select-names.c: Tested this and fixed some - obvious errors. - - * gui/component/select-names.glade: The main window shouldn't be - visible by default. - -2000-06-11 Ettore Perazzoli <ettore@helixcode.com> - - * contact-editor/Makefile.am (contact_editor_test_LDADD): Link - with libemiscwidgets.a. - * gui/component/Makefile.am (evolution_addressbook_LDADD): Likewise. - * gui/minicard/Makefile.am (minicard_test_LDADD): Likewise. - (reflow_test_LDADD): Likewise. - (minicard_view_test_LDADD): Likewise. - -2000-06-10 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-cardlist-model.c: Renamed a bunch of functions - for better readability. - - * gui/component/e-select-names.c, gui/component/e-select-names.h: - This should be a working dialog now. - - * gui/component/select-names.glade: Changed the name & creation - function of the ETable here. - -2000-06-10 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/select-names.glade, - gui/component/select-names.glade.h: Glade files for Select Names - dialog. - -2000-06-10 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Do e_card_simple_sync and - extract_info more often. - - * gui/component/addressbook.c: Added table printing code. - -2000-06-09 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-component.c (factory_fn): Pass NULL - for the new args @create_folder_fn and @remove_folder_fn. - -2000-06-08 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook-component.c (create_view): Updated for - the new `EvolutionShellComponentCreateViewFn'. Return - `EVOLUTION_SHELL_COMPONENT_UNSUPPORTEDTYPE' if @type is not - "contacts". - -2000-06-08 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Bind Save As to save the - current view of the contact as a vcard. - -2000-06-08 Federico Mena Quintero <federico@helixcode.com> - - * contact-editor/e-contact-editor.c (save_card): Doh, sync the - card simple and extract the card info. - -2000-06-08 Federico Mena Quintero <federico@helixcode.com> - - * contact-editor/e-contact-editor.h (EContactEditor): Now this - derives from GtkObject. It follows the same strategy as the - EventEditor in the calendar. - (EContactEditor): Added an is_new_card field so that we can know - whether to add() or commit() the card. - - * contact-editor/e-contact-editor.c (e_contact_editor_get_type): - Derive from GtkObject. - (e_contact_editor_class_init): Likewise. - (e_contact_editor_class_init): Added an "is_new_card" argument. - (e_contact_editor_set_arg): Handle ARG_IS_NEW_CARD. - (e_contact_editor_get_arg): Likewise. - (e_contact_editor_new): Take in an is_new_arg argument and set it - on the object. - (e_contact_editor_init): Load the app widget into the app field of - the EContactEditor structure. Create its UIHandler as well. - (e_contact_editor_class_init): New "add_card", "commit_card", and - "editor_closed" signals. - - * contact-editor/test-editor.c (main): Modified for the new API. - (editor_closed_cb): Tweaked for the new API. - Since this test program does not use Bonobo, it doesn't work, - though. - - * gui/component/addressbook.c (new_contact_cb): Use the new - contact editor API. - (table_double_click): Ditto. - - * gui/minicard/e-minicard-view.c (e_minicard_view_event): Use the - new contact editor API. - - * gui/minicard/e-minicard.c (e_minicard_event): Use the new - contact editor API. - -2000-06-08 Ettore Perazzoli <ettore@helixcode.com> - - * contact-editor/Makefile.am (contact_editor_test_LDADD): Remove - the `$(srcdir)/' prefix from `libecontacteditor.a' because [of - course] the library is built in the build directory, not in the - source directory. - * gui/minicard/Makefile.am (minicard_test_LDADD): Likewise with - `libeminicard.a'. - (minicard_label_test_LDADD): Likewise. - (reflow_test_LDADD): Likewise. - (minicard_view_test_LDADD): Likewise. - -2000-06-06 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Bind right click on the ETable to - "Save to VCard." - -2000-06-02 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Made phone/email/address - labels change correctly again. - -2000-06-02 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook-component.c: Made - evolution-addressbook shut down when the shell is done with it. - -2000-06-02 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-view.c, gui/minicard/e-minicard.c: Made - double click only work on the first button. - -2000-06-01 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard.c: return TRUE if opening a contact - editor so that we don't get a "new dialog" contact editor. - -2000-06-01 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.c (new_contact_cb): Use the stock - cancel button for the dialog. - (table_double_click): Likewise. - (find_contact_cb): Likewise. - -2000-05-31 Miguel de Icaza <miguel@helixcode.com> - - * contact-editor/contact-editor.glade: Added accelerators for - the remaining items. - - Add spacing, beautify the dialogs. - -2000-06-01 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.c (control_activate): Put the toolbar - into a frame to make it look like standard GNOME toolbars. Also, - set `GNOME_DOCK_ITEM_BEH_NEVER_VERTICAL' so that it does not do - evil things when its moved to the left or the right of the window. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-cardlist-model.c, - gui/component/e-cardlist-model.h: New files for card list. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Fixed a memory leak. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/alphabet.glade: Made the alphabet buttons not - focusable. - - * gui/minicard/e-minicard-view.c: Made the "123" button work. - - * gui/minicard/e-reflow-sorted.c: Made all buttons past the last - letter available work. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/alphabet.glade: Added a bit of space around the - alphabet bar. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/Makefile.am: Added alphabet.glade and - alphabet.glade.h. - - * gui/component/addressbook.c, gui/component/alphabet.glade, - gui/component/alphabet.glade.h: Added an alphabet bar. - - * gui/minicard/e-minicard-view.c, gui/minicard/e-minicard-view.h, - gui/minicard/e-reflow-sorted.c, gui/minicard/e-reflow-sorted.h: - Added the ability to just to a particular spot in the reflow. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * printing/Makefile.am: Added BONOBO_GNOME_CFLAGS to CPPFLAGS. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-view.c: Made double clicking create a - new card. Set the empty message. - - * gui/minicard/e-minicard.c: Made sorting be case insensitive. - - * gui/minicard/e-reflow-sorted.c, e-reflow.c, e-reflow.h: Added a - message for when the reflow is empty. - - * printing/e-contact-print.c, printing/medbook.ecps: Made the - default printout be full page. Made sorting case insensitive. - -2000-05-30 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-book-view-listener.c, - backend/ebook/e-book-view-listener.h, backend/ebook/e-book-view.c, - backend/ebook/e-book-view.h, backend/idl/addressbook.idl, - backend/pas/pas-backend-file.c, backend/pas/pas-backend-ldap.c, - backend/pas/pas-book-factory.c, backend/pas/pas-book-view.c, - backend/pas/pas-book-view.h: Added "sequence_complete" signal. - - * printing/e-contact-print.c: Made printing wait for - "sequence_complete" signal and made it sort. - -2000-05-25 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c, - gui/component/e-addressbook-model.c, - gui/component/e-addressbook-model.h: Added double click to open - contact editor. - -2000-05-25 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Removed some columns. - -2000-05-25 Ettore Perazzoli <ettore@helixcode.com> - - * gui/component/addressbook.c (addressbook_factory_new_control): - New function. - (addressbook_factory): Use it. - - * Makefile.am (evolution_addressbook_LDADD): Link with - `evolution-shell-component.o' from the shell directory. - - * gui/component/addressbook-component.c: New. - * gui/component/addressbook-component.h: New. - -2000-05-23 Christopher James Lahey <clahey@helixcode.com> - - * Makefile.am: Switched printing and gui. - - * backend/ebook/e-book-view-listener.h, - backend/ebook/e-book-view.h, backend/ebook/e-book.h, - backend/ebook/e-card-cursor.h, backend/ebook/e-card-list.h, - backend/ebook/e-card-simple.h, backend/ebook/e-card.h: Fixed the - #defines to work elsewhere in evolution. - - * gui/component/Makefile.am: Added linking to libecontactprint. - - * gui/component/addressbook.c: Added a menu item to print the - current query. - - * printing/Makefile.am: Add linking to libebook and requirements. - Add installation of ecps files. - - * printing/e-contact-print.c, printing/e-contact-print.h: Changed - this to use real data from an EBook. - - * printing/test-print.c: Made this pass NULL, NULL to - e_contact_print_dialog_new so that it will compile. - -2000-05-23 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-save-as.c: Fixed some memory leaks. - -2000-05-23 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/Makefile.am: Added e-contact-editor-save-as.c and - e-contact-editor-save-as.h. - - * contact-editor/e-contact-save-as.c, - contact-editor/e-contact-save-as.h: New files that display a save - as dialog and then save the given card to that file. - - * gui/minicard/e-minicard.c: Call e_contact_save_as in a right - click menu. - -2000-05-19 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c, - gui/component/e-addressbook-model.c: Added initialize_value and - value_is_empty callbacks. - -2000-05-19 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Fixed a bug that broke - address field support. - -2000-05-19 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Added support for arbitrary - fields in the contact editor. - -2000-05-18 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Fixed e_card_name_copy and - e_card_arbitrary_copy to deal correctly with a passed NULL. - - * contact-editor/Makefile.am: Removed imagesdir stuff. - - * contact-editor/arrow.png: Made this transparent. - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Renamed some widgets - and added custom widgets for all of the images. - - * contact-editor/e-contact-editor.c: Worked on making this work - decently well with messed up glade files. Cleaned up a lot of code. - -2000-05-18 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Fixed the code to write out and read in - arbitrary fields. - -2000-05-18 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h, - backend/ebook/e-card-types.h, backend/ebook/e-card.c, - backend/ebook/e-card.h: Implemented "MAILER" field. Added - arbitrary field support. - - * contact-editor/e-contact-editor-categories.c: Fixed a warning. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - Added E_CARD_SIMPLE_FIELD_MAILER. Not implemented yet. - -2000-05-16 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c (construct_email_list): convert to use ECardSimple. - (poll_ldap): same. - -2000-05-16 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-book.h: add typedefs for the can_write - functions, and add parameters to pas_book_new. - - * backend/pas/pas-book.c (pas_book_construct): add can_write/can_write_card params. - (pas_book_new): same. - (impl_Evolution_Book_can_write): new function. - (impl_Evolution_Book_can_write_card): same. - (pas_book_get_epv): assign the can_write/can_write_card slots in the epv. - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_can_write): new function. - (pas_backend_ldap_can_write_card): same. - (pas_backend_ldap_add_client): add can_write/can_write_card to pas_book_new call. - - * backend/pas/pas-backend-file.c (pas_backend_file_can_write_card): new function, calls can_write. - (pas_backend_file_can_write): same. - (can_write): return TRUE if we can write to the addressbook file. - (pas_backend_file_add_client): add can_write/can_write_card to pas_book_new call. - - * backend/idl/addressbook.idl (Evolution): add can_write and - can_write_card permission requests. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c (e_card_get_vcard): Fixed a large memory leak. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c (add_list_unique): Fixed another memory - leak. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c, backend/pas/pas-backend-file.c, - contact-editor/e-contact-editor.c, ename/e-name-western.c, - gui/component/addressbook.c, gui/minicard/e-minicard-view.c: Fixed - some memory leaks. - - * backend/ebook/e-card.c: Rearranged some code. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Fixed a reference - leak. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Fixed a compile - error. - -2000-05-16 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Got rid of a - memory leak. Rearranged a couple functions. - - * gui/minicard/e-minicard-view.c, gui/minicard/e-minicard-view.h: - Added some code to stop watching the EBook when the canvas is - destroyed (apparently the canvas is destroyed before our widget is - destroyed.) - -2000-05-14 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-categories.c: Use the correct - policy for resize. - -2000-05-14 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Added libeutil for e-card's support - for categories. - - * backend/ebook/e-card-list.c, backend/ebook/e-card-list.h: Added - a function to get the length. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added categories - support (accessible either as "categories" or "category_list".) - - * contact-editor/Makefile.am: Added e-table and all of the - categories files. - - * contact-editor/categories.glade, - contact-editor/categories-strings.h, - contact-editor/e-contact-editor-categories.c, - contact-editor/e-contact-editor-categories.h: - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Rearranged this dialog. - - * contact-editor/e-contact-editor.c: Rearranged dialog a bit. - Added opening of categories dialog. - - * gui/component/Makefile.am: Rearranged libraries so that - libetable would be available for the contact editor categories - dialog. - - * gui/component/addressbook.c: Fix for new ETable resizing. Make - contact editor dialog resizable. - - * gui/minicard/Makefile.am: Added libetable contact editor - categories dialog. - - * gui/minicard/e-minicard.c: Make contact editor dialog resizable. - -2000-05-12 Miguel de Icaza <miguel@gnu.org> - - * contact-editor/fulname.glade: Use accelerators here. - -2000-05-13 Valek Filippov <frob@df.ru> - - * gui/component/ldap-server-dialog.glade: save translatable strings - * gui/component/ldap-server-dialog.glade.h: file with strings - * printing/e-contact-print.glade: save translatable strings - * printing/e-contact-print.glade.h: file with strings - -2000-05-11 Dan Winship <danw@helixcode.com> - - * gui/component/addressbook.c (control_activate): Now that we - depend on recent gnome-libs we can make the toolbar detachable - again. - -2000-05-10 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Make the table view be sorted by - name initially. - -2000-05-10 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-book-factory.c: Send a proper response when you - can't find the ldap URI. - - * gui/component/addressbook.c: Cleaned up the open error dialog a - bit. - -2000-05-10 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Added a dialog for when you can't - open an addressbook. - -2000-05-10 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Added e-book-types.h, e-card-pairs.h, - e-card-types.h. - - * backend/pas/Makefile.am: Added pas-backend-ldap.h. - - * contact-editor/Makefile.am: Added a proper EXTRA_DIST section. - Removed some old defines. - - * ename/Makefile.am: Added e-name-western-tables.h. - - * gui/component/Makefile.am: Added e-ldap-server-dialog.h. Added - a proper EXTRA_DIST section. - - * gui/minicard/e-reflow.c: Added a missed cast. - - * printing/Makefile.am: Added a proper EXTRA_DIST section. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Make sure that the canvas - doesn't intercept keyboard focus. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Use new art. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Replaced the Address - button with a label and rearranged the address area a bit. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard.c: Reenable editting. - - * gui/minicard/e-reflow-sorted.c: Make reflow flow on deletion. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Destroy the view object when - leaving the minicard view. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-reflow-sorted.c: Fixed reflow sorting to call - reflow_request when sorting on an item changes. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c: Make File As change if name or - company are changed pretty much anywhere. - - * gui/minicard/e-minicard.c: Turned off having minicard editing - effect anything since it's so crashy. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-ldap.c: Enabled a couple more fields - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c: Added a default card to all new - file backends. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-addressbook-model.c: Rearranged order of things - getting destroyed. - - * gui/minicard/e-minicard-view.c: Rearranged order of things - getting destroyed. Don't set attributes of non-null or destroyed - items. Destroy parent object when destroyed. Maintain ref_count - of items in list. - - * gui/minicard/e-minicard.c: Don't set attributes of non-null - items. - - * gui/minicard/e-reflow-sorted.c: Maintain ref_count of items in - list. - - * gui/minicard/e-reflow.c: Maintain ref_count of items in list. - Destroy parent object when destroyed. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c: Fixed some indentation. - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Changed Email to - Primary Email. - - * contact-editor/e-contact-editor.c: Added checkmarks to indicate - if data exists in the pull down menus for the phone, address, and - email fields. - -2000-05-09 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c: Fixed the string duplication - problem. Fixed the business/home address string mix up. - - * gui/component/addressbook.c: Made the minicard view the default - view. - -2000-05-08 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c: Fixed this up a bit. Syncing - should work better now. - -2000-05-08 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard-view.c, gui/minicard/e-minicard.c, - gui/minicard/e-minicard.h, gui/minicard/e-reflow-sorted.c, - gui/minicard/e-reflow-sorted.h: Made a minimal number of things be - destroyed and recreated when updating a field. - -2000-05-07 <toshok@the-dot-in.helixcode.com> - - * gui/minicard/e-minicard.c (remodel): make sure to free the - return value of e_card_simple_get. - - * gui/component/addressbook.c (teardown_table_view): destroy the - ECardSimple here, plug memory leak. - (create_table_view): use view->simple so we can destroy the - ECardSimple later on. - -2000-05-07 Chris Toshok <toshok@helixcode.com> - - * ename/e-name-western.c (e_name_western_extract_middle): comment - function, and fix an ABR. - -2000-05-07 Chris Toshok <toshok@helixcode.com> - - * ename/e-name-western.c (e_name_western_cleanup_string): comment - function, and fix an ABR. - -2000-05-08 Christopher James Lahey <clahey@helixcode.com> - - * gui/minicard/e-minicard.c: Added saving in minicard view. - -2000-05-07 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c: Fixed an off by 2 error. - -2000-05-07 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (set_prop): don't create a new - ebook. instead, unload the current uri (if there is one) and load - the new one. - (addressbook_factory): create the ebook once. - -2000-05-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/e-addressbook-model.c: Replaced some model_changed - calls with row_inserted calls. - -2000-05-07 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c, backend/pas/pas-backend-ldap.c: - Removed some code that was notifying too many clients at the wrong - times. - - * gui/component/addressbook.c: Set view->book. Unreffed - view->book. Unreffed the model instead of destroying it. Removed - the /tmp/test.db stuff. - -2000-05-07 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Make the addressbook create the - correct file uri. Added a default query. Initialize view->model - and view->view to NULL. - - * gui/component/e-addressbook-model.c, - gui/minicard/e-minicard-view.c: Only call get_book_view if both - book and query and non-null. - -2000-05-06 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (control_deactivate): remove the - separator and toggle view items as well. - (toggle_view_as_cb): callback for the "/View/Toggle View" menu - item. - (get_query): getter for the query string that takes into account - the two view types. - (set_query): setter for the query string that takes into account - the two view types. - (set_book): setter for the EBook type - not really a setter, since - the book is kept in the AddressbookView, but this method actually - sets the "book" property on the current view. - (find_contact_cb): make use of get/set_query - (search_entry_activated): make use of set_query. - (control_activate): add a menu separator and an item to toggle - between view types. - (book_open_cb): make use of set_book. - (ebook_create): no longer needs to return the EBook, since we set - the book field in our view. - (teardown_minicard_view): destructor function for the minicard - specific ui. - (create_minicard_view): constructor function for the minicard - specific ui. - (teardown_table_view): destructor function for the e-table - specific ui. - (create_table_view): constructor function for the e-table specific - ui. - (change_view_type): destroy the old and create the new view ui, - change the label of the Toggle View menu item, and reset the book - and query on the new view type. - (addressbook_factory): create an all-encompassing vbox that the - view uses to create the bonobo control, which contains 1 widget - per ui specific view (the e-table in the table case, and another - vbox in the minicard case.) use change_view_type to create the - initial view. - -2000-05-07 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-book.c: Made a NULL callback just mean to not - call back. - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - Reordered fields. Added a get_const function to get a constant - string that persists until the simple is destroyed. - - * gui/component/Makefile.am: Added e-addressbook-model.c and - e-addressbook-model.h and all of the libraries and includes that - they are dependent on. - - * gui/component/addressbook-factory.c: Initialize e cursors. - - * gui/component/addressbook.c: Added inactive code to display an - ETable view of the addressbook. - - * gui/component/e-addressbook-model.c, - gui/component/e-addressbook-model.h: New files to implement an - ETable model with a EBook back end. - -2000-05-06 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - Mostly finished ECardSimple. - - * contact-editor/e-contact-editor.c: Changed this to match with - some of the changes to ECardSimple. - - * gui/component/addressbook.c: Changed this to look for - "addressbook.db" in the given directory if it doesn't find the - file "uri". - - * gui/minicard/e-minicard.c, gui/minicard/e-minicard.h: Changed - this to use ECardSimple. - -2000-05-06 Chris Toshok <toshok@helixcode.com> - - * gui/component/.cvsignore: ignore evolution-addressbook.pure - - * gui/component/Makefile.am: add support for generating - evolution-addressbook.pure. - -2000-05-06 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_load_uri): if a - port isn't specified in the uri default to 389. - -2000-05-06 Christopher James Lahey <clahey@helixcode.com> - - * gui/component/addressbook.c: Made this take a uri through its - property bag. - -2000-05-05 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Added e-card-simple.c and - e-card-simple.h. - - * backend/ebook/e-card-simple.c, backend/ebook/e-card-simple.h: - New card wrapper class to simplify things. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Changed e-contact-editor to use - ECardSimple a bit. - -2000-05-03 Chris Toshok <toshok@helixcode.com> - - * gui/component/addressbook.c (control_deactivate): #ifdef - HAVE_LDAP the ldap specific stuff. - (null_cb): same. - (control_activate): same. - -2000-05-02 Ettore Perazzoli <ettore@helixcode.com> - - * backend/ebook/Makefile.am (INCLUDES): Add - `-I$(top_srcdir)/addressbook/ename'. - -2000-05-02 Matt Loper <matt@helixcode.com> - - * demo/Makefile.am: set G_LOG_DOMAIN. - * printing/Makefile.am: same. - -2000-05-01 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-book-factory.c: Add back in the - CORBA_Object_release. - - * backend/pas/pas-book.c: Properly duplicate and release the - listener passed to us. - -2000-05-01 Christopher James Lahey <clahey@helixcode.com> - - * backend/pas/pas-backend-file.c, backend/pas/pas-backend-ldap.c: - Made uri slightly better managed. - - * backend/pas/pas-book-factory.c - (pas_book_factory_process_request): Remove this - CORBA_Object_release that causes things not to work. This is just - a temporary fix until we figure out what's actually wrong. - - * backend/pas/pas-book.c: Fixed a copy and paste error in a warning. - -2000-05-01 Christopher James Lahey <clahey@helixcode.com> - - * Makefile.am: Switched the subdirs order since backend depends on - ename. - -2000-05-01 Larry Ewing <lewing@helixcode.com> - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_remove_client): - fix a typo in the for loop. - -2000-05-01 Michael Meeks <michael@helixcode.com> - - * backend/pas/pas-book-factory.c: include gtk. - -2000-04-30 Federico Mena Quintero <federico@helixcode.com> - - * backend/ebook/e-book-types.h (EBookStatus): Added new status - values for the IDL stuff. - - * backend/pas/pas-book-factory.h (PASBookFactoryClass): New - "last_book_gone" signal. - - * backend/pas/pas-book-factory.c - (pas_book_factory_launch_backend): Better error handling. - (pas_book_factory_process_queue): Let - pas_book_factory_process_request() free the request. - (pas_book_factory_process_request): Free the request here. - Perform better error handling. - (free_active_server_map_entry): Free an active server map entry; - free the URI key and unref the backend value. This function was - renamed; the old one was trying to CORBA_Object_unref() a GTK+ - object! - (remove_backends_entry): Free a backend table entry; free the URI - key. - (backend_last_client_gone_cb): Remove the backend from the active - server map and emit the "last_book_gone" signal if appropriate. - (pas_book_factory_get_n_backends): New function to query the - number of running backends in an addressbook factory. - - * backend/idl/addressbook.idl (BookListener::CallStatus): Added a - ProtocolNotSupported code. This is for when the addressbook - factory cannot find a provider for the requested URI. - - * backend/pas/pas-backend.h (PASBackendClass): New - "last_client_gone" signal. - (PASBackendClass): New get_uri virtual method. - - * backend/pas/pas-backend.c (pas_backend_load_uri): Return a - gboolean success code. - (pas_backend_add_client): Return a gboolean success code. - (pas_backend_last_client_gone): New function used by backend - implementations to notify upwards when the backend's last client - is destroyed. - (pas_backend_get_uri): New function to get the URI of a backend. - - * backend/pas/pas-backend-file.c (pas_backend_file_add_client): - Pass the backend as the closure data to the "destroy" handler of - the book. We cannot call pas_book_get_backend() in the callback - since the book's private data has already been destroyed when the - callback is invoked. Alternatively, we could move the private - data destruction step to the book's ::finalize() method. - (pas_backend_file_book_destroy_cb): Get the backend from the - callback's data, not from the book. - (pas_backend_file_remove_client): Remove the book from the list of - clients. When all clients go away, call - pas_backend_last_client_gone(). - (PASBackendFilePrivate): Added an uri field. - (pas_backend_file_get_uri): Implement the get_uri method. - (pas_backend_file_load_uri): Return a gboolean success code. - Also, store the URI in the private structure. - (pas_backend_file_add_client): Return a gboolean success code. - Also, call pas_backend_last_client_gone() if appropriate. - (pas_backend_file_destroy): Free the bf->priv->uri. - - * backend/pas/pas-backend-ldap.c (pas_backend_ldap_add_client): - Pass the backend as the closure data to the "destroy" handler of - the book. See above for rationale. - (pas_backend_ldap_book_destroy_cb): Get the backend from the - callback's data. - (pas_backend_ldap_remove_client): Remove the book from the list of - clients. When all clients go away, call - pas_backend_last_client_gone(). - (pas_backend_ldap_load_uri): Return a gboolean success code. - (pas_backend_ldap_add_client): Return a gboolean success code. - Also, call pas_backend_last_client_gone() if appropriate. - (PASBackendLDAPPrivate): New uri field. - (pas_backend_ldap_get_uri): Implement the get_uri method. - (pas_backend_ldap_load_uri): Store the uri in the private - structure. - (pas_backend_ldap_destroy): Free the bl->priv->uri. - -2000-04-30 Chris Toshok <toshok@helixcode.com> - - * gui/component/Makefile.am (evolution_addressbook_SOURCES): added - e-ldap-server-dialog.c - (glade_DATA): added ldap-server-dialog.glade - - * gui/component/ldap-server-dialog.glade: new file. - - * gui/component/e-ldap-server-dialog.h: new file. - - * gui/component/e-ldap-server-dialog.c: new file, contains logic - associated with ldap server dialog. - - * gui/component/addressbook.c (control_deactivate): remove the - directory server menu item. - (null_cb): do nothing callback for e_book_load_uri call. should - change to (at the very least) pop up a dialog if there was an - error. - (new_server_cb): new function - really just switches to a - particular ldap server, since the information isn't saved - anywhere. - (control_activate): add directory server menu item. - -2000-04-30 Chris Toshok <toshok@helixcode.com> - - * backend/ebook/e-book.c (e_book_load_uri): create the book - listener here, since it's destroyed in unload_uri. - (e_book_construct): remove the book listener construction here. - -2000-04-30 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/.cvsignore: Added load-pine-addressbook. - -2000-04-30 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor.c, gui/minicard/e-minicard.c: Made - some fields invisible that were visible before. - -2000-04-30 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c: Make file as not have the : after it if - it's empty. If there's no name, or file_as, fill in these fields - with defaults based on full_name or name respectively. - - * backend/ebook/load-pine-addressbook.c: New file to do import of - pine .addressbook files. - - * backend/pas/pas-backend-file.c: Made empty fields act as the - empty string for searches. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Made the File As field update - properly as you edit the name and company fields. Added the pull - down list of File As choices. Made sure that all fields will - be set to NULL if they are deleted to the empty string. - - * gui/minicard/e-minicard.c: Use the File As field instead of the - Full Name field for the header. Make identical compares on the - File As field do a compare on the uid. - -2000-04-30 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor-fullname.c, - contact-editor/fullname.glade: Fixed a string mismatch. - -2000-04-30 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/Makefile.am: Added ename includes and libs. - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added - e_card_name_from_string. Added header for - e_card_delivery_address_from_string, even though it's not - implemented yet. - - * contact-editor/Makefile.am: Removed the ename includes since we - no longer use ename directly here. - - * contact-editor/e-contact-editor.c: Fixed this to properly save - the address labels displayed. Updated this to use the function - e_card_name_from_string instead of doing it by hand. - - * contact-editor/fullname-strings.h, - contact-editor/fullname.glade: Deleted an unused field. Changed - the set of prefixes and suffixes. - -2000-04-30 Chris Toshok <toshok@helixcode.com> - - * backend/pas/pas-backend-ldap.c - (pas_backend_ldap_ensure_connected): add support for a rootdn in - the uri. - (pas_backend_ldap_build_all_cards_list): make use of the rootdn in - the call to ldap_search_s. - (pas_backend_ldap_search): same. - (pas_backend_ldap_load_uri): get the rootdn out of the passed in uri. - -2000-04-29 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added - e_card_phone_new e_card_delivery_address_new, - e_card_delivery_address_to_string, e_card_name_copy, - e_card_name_new, e_card_name_to_string, and made e_card_name_free - public. Removed some unused code. - - * backend/pas/pas-backend-file.c: Fixed a warning. - - * contact-editor/Makefile.am: Added e-contact-editor-fullname.[ch] - and fullname.glade. Added e-name libs and includes. - - * contact-editor/e-contact-editor-fullname.c, - contact-editor/e-contact-editor-fullname.h, - contact-editor/fullname-strings.h, contact-editor/fullname.glade: - New dialog for editing the fields of a name separately. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Create an - EContactEditorFullname when you click on the Full Name button. - Maintain a parsed name at all times. - - * gui/component/Makefile.am, gui/minicard/Makefile.am: Added - e-name libs. - -2000-04-28 Larry Ewing <lewing@helixcode.com> - - * backend/pas/pas-book-factory.c (register_factory): fix the - `USING_OAF' changes so that they work for when we are not using - oaf. - -2000-04-27 Ettore Perazzoli <ettore@helixcode.com> - - * ename/Makefile.am - (gnome_libs): Use `BONOBO_GNOME_LIBS'. - (INCLUDES): Add `-I$(srcdir)/..'. - - * backend/pas/pas-book-factory.c - (register_factory): New function to register the factory. - Implementation different according to `USING_OAF'. - (pas_book_factory_activate): Use `register_factory()'. - - * gui/component/addressbook.c: New #define `CONTROL_FACTORY_ID', - varying depending on whether we are `USING_OAF'. - (addressbook_factory_init): Use `CONTROL_FACTORY_ID'. - - * backend/ebook/test-client.c (init_corba): New function, - implemented differently according to the `USING_OAF' #define. - - * backend/ebook/e-book.c: New #define `CARDSERVER_OAF_ID'. - (e_book_construct): Work with OAF #if `USING_OAF'. - - * backend/ebook/Makefile.am (gnome_libs): Removed. - (corbadir): Removed. - (ebook_libs): Removed. - (test_client_LDADD): Just add `libebook.la'. - (test_card_LDADD): Likewise. - (test_client_list_LDADD): Likewise. - - * gui/component/addressbook-factory.c - (init_corba): New helper function, implemented differently - according to `USING_OAF'. - (main): Call `init_corba()'. - -2000-04-27 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card.c, backend/ebook/e-card.h: Added file as, - office, manager, assistant, spouse, and anniversary fields. These - all use "X-EVOLUTION-" fields in the VCards. - - * backend/pas/pas-backend-file.c: Added all the new fields (except - anniversary) to the list of fields. - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Fixed some misnamed - fields and fixed the placement of the comments field. - - * contact-editor/e-contact-editor.c: Made the newly added fields - display properly. - - * Makefile.am: Added ename. - - * ename/e-name-western.h, ename/test-ename-western-gtk.c, - ename/test-ename-western.c: Fixed up some #includes. - - * ename/.cvsignore: Added .cvsignore. - -2000-04-26 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-types.h, backend/ebook/e-card.c, - backend/ebook/e-card.h: Added an address label field. - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Got rid of some unused - fields. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Added the address label field. - Load only. Editing these fields seems to mess things up. - -2000-04-26 Christopher James Lahey <clahey@helixcode.com> - - * contact-editor/e-contact-editor.c: Added proper handling of the - email field. - -2000-04-26 Christopher James Lahey <clahey@helixcode.com> - - * backend/ebook/e-card-types.h, backend/ebook/e-card.c, - gui/minicard/e-minicard.c: Prefixed the ADDR_ flags. - - * contact-editor/contact-editor.glade, - contact-editor/e-contact-editor-strings.h: Edited the glade file. - Removed all the fields that we don't use. - - * contact-editor/e-contact-editor.c, - contact-editor/e-contact-editor.h: Made the phone fields work - properly. The address and email fields are temporarily turned off - until they can be made to work as the phone fields do. - -2000-04-25 Ettore Perazzoli <ettore@helixcode.com> - - * gui/minicard/Makefile.am (INCLUDES): Use - `$(BONOBO_GNOME_CFLAGS)'. - - * backend/pas/Makefile.am (idl_flags): Add `-I $(datadir)/idl' to - pick up IDL files in the installation prefix as well. - (INCLUDES): Use `$(BONOBO_GNOME_CFLAGS)'. - - * backend/ebook/Makefile.am (ORBIT_IDL): Use `-I $(datadir)/idl' - to get the IDLs from the installation prefix as well. - (INCLUDES): Add `$(BONOBO_GNOME_CFLAGS)'. - (test_client_LDADD): Use `$(BONOBO_GNOME_LIBS)' instead of - hardcoding `-lbonobo'! Also get rid of some other useless flags, - as `$(BONOBO_GNOME_LIBS)' really has all what we need. - (test_client_list_LDADD): Likewise. - (test_card_LDADD): Likewise. - -2000-04-18 Federico Mena Quintero <federico@helixcode.com> - - * gui/minicard/Makefile.am (INCLUDES): Use "e-minicard" as the log - domain. - - * gui/component/Makefile.am (INCLUDES): Use - "evolution-addressbook" as the log domain. - - * backend/pas/Makefile.am: Build libpas.a, not a shared library. - Do not install any header files. - (INCLUDES): Remove spurious include paths. - - * backend/pas/*.[ch]: Fix includes. - - * backend/ebook/Makefile.am: Do not install the test programs. - Fixed some include weirdness. - - * backend/ebook/*.[ch]: Fix includes. - - * contact-editor/Makefile.am (INCLUDES): Set the log domain to - "contact-editor". - (INCLUDES): Fix. - - * contact-editor/*.[ch]: Fix includes. - - * gui/minicard/*.[ch]: Fix includes. - - * ChangeLog: Started a ChangeLog here. diff --git a/addressbook/Makefile.am b/addressbook/Makefile.am deleted file mode 100644 index 4fde08a4a9..0000000000 --- a/addressbook/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -if ENABLE_PILOT_CONDUITS -CONDUIT_SUBDIR=conduit -endif - -SUBDIRS = \ - util printing gui importers tools $(CONDUIT_SUBDIR) - -error_DATA = addressbook-errors.xml -error_i18n = $(error_DATA:.xml=.xml.h) -errordir = $(privdatadir)/errors -%.xml.h: %.xml - $(top_builddir)/e-util/e-error-tool $^ - -EXTRA_DIST = \ - ChangeLog.pre-1-4 \ - $(error_DATA) - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) - -BUILT_SOURCES = $(error_i18n) - -CLEANFILES = $(BUILT_SOURCES) diff --git a/addressbook/addressbook-errors.xml b/addressbook/addressbook-errors.xml deleted file mode 100644 index 9b9b499793..0000000000 --- a/addressbook/addressbook-errors.xml +++ /dev/null @@ -1,93 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<error-list domain="addressbook"> - - <error id="ldap-init" type="error" modal="true"> - <primary>This addressbook could not be opened.</primary> - <secondary>This addressbook server might unreachable or the server name may be misspelled or your network connection could be down.</secondary> - </error> - - <error id="ldap-auth" type="error" modal="true"> - <primary>Failed to authenticate with LDAP server.</primary> - <secondary>Check to make sure your password is spelled correctly and that you are using a supported login method. Remember that many passwords are case sensitive; your caps lock might be on.</secondary> - </error> - - <error id="ldap-search-base" type="error" modal="true"> - <primary>This addressbook server does not have any suggested search bases.</primary> - <secondary>This LDAP server may use an older version of LDAP, which does not support this functionality or it may be misconfigured. Ask your administrator for supported search bases.</secondary> - </error> - - <error id="ldap-v3-schema" type="error" modal="true"> - <primary>This server does not support LDAPv3 schema information.</primary> - </error> - - <error id="ldap-get-schema" type="error" modal="true"> - <primary>Could not get schema information for LDAP server.</primary> - </error> - - <error id="ldap-invalid-schema" type="error" modal="true"> - <primary>LDAP server did not respond with valid schema information.</primary> - </error> - - <error id="remove-addressbook" type="error" modal="true"> - <primary>Could not remove addressbook.</primary> - </error> - - <error id="ask-delete-addressbook" type="question" modal="true" default="GTK_RESPONSE_CANCEL"> - <primary>Delete address book '{0}'?</primary> - <secondary>This address book will be removed permanently.</secondary> - <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/> - <button stock="gtk-delete" response="GTK_RESPONSE_YES"/> - </error> - - <error id="edit-categories" type="error"> - <primary>Category editor not available.</primary> - </error> - - <error id="generic-error" type="error"> - <primary>{0}</primary> - <secondary>{1}</secondary> - </error> - - <error id="load-error" type="error"> - <title>Unable to open addressbook</title> - <primary>Error loading addressbook.</primary> - <secondary>{0}</secondary> - </error> - - <error id="search-error" type="error"> - <primary>Unable to perform search.</primary> - <secondary>{0}</secondary> - </error> - - <error id="prompt-save" type="question" default="GTK_RESPONSE_YES"> - <primary>Would you like to save your changes?</primary> - <secondary>You have made modifications to this contact. Do you want to save these changes?</secondary> - <button label="_Discard" response="GTK_RESPONSE_NO"/> - <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/> - <button stock="gtk-save" response="GTK_RESPONSE_YES"/> - </error> - - <error id="prompt-move" type="question" default="GTK_RESPONSE_NO"> - <primary>Cannot move contact.</primary> - <secondary>You are attempting to move a contact from one addressbook to another but it cannot be removed from the source. Do you want to save a copy instead?</secondary> - <button stock="gtk-no" response="GTK_RESPONSE_NO"/> - <button stock="gtk-yes" response="GTK_RESPONSE_YES"/> - </error> - - <error id="save-error" type="error"> - <primary>Unable to save contact(s).</primary> - <secondary>Error saving contacts to {0}: {1}</secondary> - </error> - - <error id="backend-died" type="error"> - <primary>The Evolution addressbook has quit unexpectedly.</primary> - <secondary>Your contacts for {0} will not be available until Evolution is restarted.</secondary> - </error> - - <error id="ask-list-add-exists" type="question" default="GTK_RESPONSE_NO"> - <primary>Address '{0}' already exists.</primary> - <secondary>A contact already exists with this address. Would you like to add a new card with the same address anyway?</secondary> - <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/> - <button stock="gtk-ok" label="_Add" response="GTK_RESPONSE_YES"/> - </error> -</error-list> diff --git a/addressbook/addressbook-errors.xml.h b/addressbook/addressbook-errors.xml.h deleted file mode 100644 index fee57879d4..0000000000 --- a/addressbook/addressbook-errors.xml.h +++ /dev/null @@ -1,62 +0,0 @@ -/* addressbook:ldap-init primary */ -char *s = N_("This addressbook could not be opened."); -/* addressbook:ldap-init secondary */ -char *s = N_("This addressbook server might unreachable or the server name may be misspelled or your network connection could be down."); -/* addressbook:ldap-auth primary */ -char *s = N_("Failed to authenticate with LDAP server."); -/* addressbook:ldap-auth secondary */ -char *s = N_("Check to make sure your password is spelled correctly and that you are using a supported login method. Remember that many passwords are case sensitive; your caps lock might be on."); -/* addressbook:ldap-search-base primary */ -char *s = N_("This addressbook server does not have any suggested search bases."); -/* addressbook:ldap-search-base secondary */ -char *s = N_("This LDAP server may use an older version of LDAP, which does not support this functionality or it may be misconfigured. Ask your administrator for supported search bases."); -/* addressbook:ldap-v3-schema primary */ -char *s = N_("This server does not support LDAPv3 schema information."); -/* addressbook:ldap-get-schema primary */ -char *s = N_("Could not get schema information for LDAP server."); -/* addressbook:ldap-invalid-schema primary */ -char *s = N_("LDAP server did not respond with valid schema information."); -/* addressbook:remove-addressbook primary */ -char *s = N_("Could not remove addressbook."); -/* addressbook:ask-delete-addressbook primary */ -char *s = N_("Delete address book '{0}'?"); -/* addressbook:ask-delete-addressbook secondary */ -char *s = N_("This address book will be removed permanently."); -/* addressbook:edit-categories primary */ -char *s = N_("Category editor not available."); -/* addressbook:generic-error primary */ -char *s = N_("{0}"); -/* addressbook:generic-error secondary */ -char *s = N_("{1}"); -/* addressbook:load-error title */ -char *s = N_("Unable to open addressbook"); -/* addressbook:load-error primary */ -char *s = N_("Error loading addressbook."); -/* addressbook:load-error secondary */ -char *s = N_("{0}"); -/* addressbook:search-error primary */ -char *s = N_("Unable to perform search."); -/* addressbook:search-error secondary */ -char *s = N_("{0}"); -/* addressbook:prompt-save primary */ -char *s = N_("Would you like to save your changes?"); -/* addressbook:prompt-save secondary */ -char *s = N_("You have made modifications to this contact. Do you want to save these changes?"); -char *s = N_("_Discard"); -/* addressbook:prompt-move primary */ -char *s = N_("Cannot move contact."); -/* addressbook:prompt-move secondary */ -char *s = N_("You are attempting to move a contact from one addressbook to another but it cannot be removed from the source. Do you want to save a copy instead?"); -/* addressbook:save-error primary */ -char *s = N_("Unable to save contact(s)."); -/* addressbook:save-error secondary */ -char *s = N_("Error saving contacts to {0}: {1}"); -/* addressbook:backend-died primary */ -char *s = N_("The Evolution addressbook has quit unexpectedly."); -/* addressbook:backend-died secondary */ -char *s = N_("Your contacts for {0} will not be available until Evolution is restarted."); -/* addressbook:ask-list-add-exists primary */ -char *s = N_("Address '{0}' already exists."); -/* addressbook:ask-list-add-exists secondary */ -char *s = N_("A contact already exists with this address. Would you like to add a new card with the same address anyway?"); -char *s = N_("_Add"); diff --git a/addressbook/conduit/.cvsignore b/addressbook/conduit/.cvsignore deleted file mode 100644 index 594beaac72..0000000000 --- a/addressbook/conduit/.cvsignore +++ /dev/null @@ -1,9 +0,0 @@ -.deps -.libs -*.lo -Makefile.in -Makefile -libeaddress_conduit.la -e-address-conduit-control-applet -e-address-conduit-control-applet.desktop -e-address*.conduit diff --git a/addressbook/conduit/Makefile.am b/addressbook/conduit/Makefile.am deleted file mode 100644 index cde1ac2092..0000000000 --- a/addressbook/conduit/Makefile.am +++ /dev/null @@ -1,42 +0,0 @@ -INCLUDES = \ - -I$(top_srcdir) \ - -I$(top_srcdir)/addressbook \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_builddir)/addressbook/backend \ - -I$(top_srcdir)/e-util \ - -I$(top_builddir)/e-util \ - -I$(top_srcdir)/widgets/misc \ - -I$(top_builddir)/widgets/misc \ - $(EVOLUTION_ADDRESSBOOK_CONDUIT_CFLAGS) - -# Address Conduit -privconduit_LTLIBRARIES = libeaddress_conduit.la - -libeaddress_conduit_la_SOURCES = \ - address-conduit.c - -libeaddress_conduit_la_LDFLAGS = -module -avoid-version -libeaddress_conduit_la_LIBADD = \ - $(top_builddir)/e-util/libeutil.la \ - $(top_builddir)/e-util/libeconduit.la \ - $(top_builddir)/widgets/misc/libemiscwidgets.la \ - $(top_builddir)/camel/libcamel.la \ - $(EVOLUTION_ADDRESSBOOK_CONDUIT_LIBS) - -e-address-$(BASE_VERSION).conduit: e-address.conduit.in - sed -e 's^\@privconduitdir\@^$(privconduitdir)^g' \ - -e 's^\@datadir\@^$(datadir)^g' \ - -e 's^\@BASE_VERSION\@^$(BASE_VERSION)^g' \ - $< > $@ - -conduitdir = $(datadir)/gnome-pilot/conduits/ -conduit_DATA = e-address-$(BASE_VERSION).conduit - -BUILT_SOURCES = $(conduit_DATA) -CLEANFILES = $(BUILT_SOURCES) - -EXTRA_DIST = \ - e-address.conduit.in - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) diff --git a/addressbook/conduit/address-conduit.c b/addressbook/conduit/address-conduit.c deleted file mode 100644 index 15573c190b..0000000000 --- a/addressbook/conduit/address-conduit.c +++ /dev/null @@ -1,1766 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* Evolution addressbook - Address Conduit - * - * Copyright (C) 1998 Free Software Foundation - * Copyright (C) 2000 Ximian, Inc. - * - * Authors: Eskil Heyn Olsen <deity@eskil.dk> - * JP Rosevear <jpr@ximian.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#define G_LOG_DOMAIN "eaddrconduit" - -#include <bonobo.h> -#include <libxml/parser.h> -#include <pi-source.h> -#include <pi-socket.h> -#include <pi-dlp.h> -#include <pi-address.h> -#include <libebook/e-book.h> -#include <gpilotd/gnome-pilot-conduit.h> -#include <gpilotd/gnome-pilot-conduit-sync-abs.h> -#include <libgpilotdCM/gnome-pilot-conduit-management.h> -#include <libgpilotdCM/gnome-pilot-conduit-config.h> -#include <e-dialog-widgets.h> -#include <e-pilot-map.h> -#include <e-pilot-settings.h> -#include <e-pilot-util.h> - -GnomePilotConduit * conduit_get_gpilot_conduit (guint32); -void conduit_destroy_gpilot_conduit (GnomePilotConduit*); - -#define CONDUIT_VERSION "0.1.2" - -#define DEBUG_CONDUIT 1 -/* #undef DEBUG_CONDUIT */ - -#ifdef DEBUG_CONDUIT -#define LOG(x) x -#else -#define LOG(x) -#endif - -#define WARN g_warning -#define INFO g_message - -enum { - LABEL_WORK, - LABEL_HOME, - LABEL_FAX, - LABEL_OTHER, - LABEL_EMAIL, - LABEL_MAIN, - LABEL_PAGER, - LABEL_MOBILE -}; - -static EContactField priority [] = { - E_CONTACT_PHONE_BUSINESS, - E_CONTACT_PHONE_HOME, - E_CONTACT_PHONE_BUSINESS_FAX, - E_CONTACT_EMAIL_1, - E_CONTACT_PHONE_PAGER, - E_CONTACT_PHONE_MOBILE, - E_CONTACT_PHONE_BUSINESS_2, - E_CONTACT_PHONE_HOME_2, - E_CONTACT_PHONE_HOME_FAX, - E_CONTACT_EMAIL_2, - E_CONTACT_PHONE_OTHER, - E_CONTACT_PHONE_PRIMARY, - E_CONTACT_PHONE_OTHER_FAX, - E_CONTACT_EMAIL_3, - E_CONTACT_FIELD_LAST -}; - -static int priority_label [] = { - LABEL_WORK, - LABEL_HOME, - LABEL_FAX, - LABEL_EMAIL, - LABEL_PAGER, - LABEL_MOBILE, - LABEL_WORK, - LABEL_HOME, - LABEL_FAX, - LABEL_EMAIL, - LABEL_OTHER, - LABEL_MAIN, - LABEL_FAX, - LABEL_EMAIL, - -1 -}; - -typedef struct _EAddrLocalRecord EAddrLocalRecord; -typedef struct _EAddrConduitCfg EAddrConduitCfg; -typedef struct _EAddrConduitGui EAddrConduitGui; -typedef struct _EAddrConduitContext EAddrConduitContext; - -/* Local Record */ -struct _EAddrLocalRecord { - /* The stuff from gnome-pilot-conduit-standard-abs.h - Must be first in the structure, or instances of this - structure cannot be used by gnome-pilot-conduit-standard-abs. - */ - GnomePilotDesktopRecord local; - - /* The corresponding ECard object */ - EContact *contact; - - /* pilot-link address structure, used for implementing Transmit. */ - struct Address *addr; -}; - - -static void -addrconduit_destroy_record (EAddrLocalRecord *local) -{ - g_object_unref (local->contact); - free_Address (local->addr); - g_free (local->addr); - g_free (local); -} - -/* Configuration */ -struct _EAddrConduitCfg { - guint32 pilot_id; - GnomePilotConduitSyncType sync_type; - - ESourceList *source_list; - ESource *source; - gboolean secret; - EContactField default_address; - - gchar *last_uri; -}; - -static EAddrConduitCfg * -addrconduit_load_configuration (guint32 pilot_id) -{ - EAddrConduitCfg *c; - GnomePilotConduitManagement *management; - GnomePilotConduitConfig *config; - gchar *address, prefix[256]; - g_snprintf (prefix, 255, "/gnome-pilot.d/e-address-conduit/Pilot_%u/", - pilot_id); - - c = g_new0 (EAddrConduitCfg,1); - g_assert (c != NULL); - - c->pilot_id = pilot_id; - management = gnome_pilot_conduit_management_new ("e_address_conduit", GNOME_PILOT_CONDUIT_MGMT_ID); - gtk_object_ref (GTK_OBJECT (management)); - gtk_object_sink (GTK_OBJECT (management)); - config = gnome_pilot_conduit_config_new (management, pilot_id); - gtk_object_ref (GTK_OBJECT (config)); - gtk_object_sink (GTK_OBJECT (config)); - if (!gnome_pilot_conduit_config_is_enabled (config, &c->sync_type)) - c->sync_type = GnomePilotConduitSyncTypeNotSet; - gtk_object_unref (GTK_OBJECT (config)); - gtk_object_unref (GTK_OBJECT (management)); - - /* Custom settings */ - gnome_config_push_prefix (prefix); - - if (!e_book_get_addressbooks (&c->source_list, NULL)) - c->source_list = NULL; - if (c->source_list) { - c->source = e_pilot_get_sync_source (c->source_list); - if (!c->source) - c->source = e_source_list_peek_source_any (c->source_list); - if (c->source) { - g_object_ref (c->source); - } else { - g_object_unref (c->source_list); - c->source_list = NULL; - } - } - - c->secret = gnome_config_get_bool ("secret=FALSE"); - address = gnome_config_get_string ("default_address=business"); - if (!strcmp (address, "business")) - c->default_address = E_CONTACT_ADDRESS_WORK; - else if (!strcmp (address, "home")) - c->default_address = E_CONTACT_ADDRESS_HOME; - else if (!strcmp (address, "other")) - c->default_address = E_CONTACT_ADDRESS_OTHER; - g_free (address); - c->last_uri = gnome_config_get_string ("last_uri"); - - gnome_config_pop_prefix (); - - return c; -} - -static void -addrconduit_save_configuration (EAddrConduitCfg *c) -{ - gchar prefix[256]; - - g_snprintf (prefix, 255, "/gnome-pilot.d/e-address-conduit/Pilot_%u/", - c->pilot_id); - - gnome_config_push_prefix (prefix); - e_pilot_set_sync_source (c->source_list, c->source); - gnome_config_set_bool ("secret", c->secret); - switch (c->default_address) { - case E_CONTACT_ADDRESS_WORK: - gnome_config_set_string ("default_address", "business"); - break; - case E_CONTACT_ADDRESS_HOME: - gnome_config_set_string ("default_address", "home"); - break; - case E_CONTACT_ADDRESS_OTHER: - gnome_config_set_string ("default_address", "other"); - break; - default: - g_warning ("Unknown default_address value"); - } - gnome_config_set_string ("last_uri", c->last_uri); - gnome_config_pop_prefix (); - - gnome_config_sync (); - gnome_config_drop_all (); -} - -static EAddrConduitCfg* -addrconduit_dupe_configuration (EAddrConduitCfg *c) -{ - EAddrConduitCfg *retval; - - g_return_val_if_fail (c != NULL, NULL); - - retval = g_new0 (EAddrConduitCfg, 1); - retval->sync_type = c->sync_type; - retval->pilot_id = c->pilot_id; - - if (c->source_list) - retval->source_list = g_object_ref (c->source_list); - if (c->source) - retval->source = g_object_ref (c->source); - retval->secret = c->secret; - retval->default_address = c->default_address; - retval->last_uri = g_strdup (c->last_uri); - - return retval; -} - -static void -addrconduit_destroy_configuration (EAddrConduitCfg *c) -{ - g_return_if_fail (c != NULL); - - g_object_unref (c->source_list); - g_object_unref (c->source); - g_free (c->last_uri); - g_free (c); -} - -/* Gui */ -struct _EAddrConduitGui { - GtkWidget *default_address; -}; - -static EAddrConduitGui * -e_addr_gui_new (EPilotSettings *ps) -{ - EAddrConduitGui *gui; - GtkWidget *lbl, *menu; - gint rows, i; - static const char *items[] = {"Business", "Home", "Other", NULL}; - - g_return_val_if_fail (ps != NULL, NULL); - g_return_val_if_fail (E_IS_PILOT_SETTINGS (ps), NULL); - - gtk_table_resize (GTK_TABLE (ps), E_PILOT_SETTINGS_TABLE_ROWS + 1, - E_PILOT_SETTINGS_TABLE_COLS); - - gui = g_new0 (EAddrConduitGui, 1); - - rows = E_PILOT_SETTINGS_TABLE_ROWS; - lbl = gtk_label_new (_("Default Sync Address:")); - gtk_misc_set_alignment (GTK_MISC (lbl), 0.0, 0.5); - gui->default_address = gtk_option_menu_new (); - menu = gtk_menu_new (); - for (i = 0; items[i] != NULL; i++) { - GtkWidget *item; - - item = gtk_menu_item_new_with_label (items[i]); - gtk_widget_show (item); - - gtk_menu_append (GTK_MENU (menu), item); - } - gtk_widget_show (menu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (gui->default_address), menu); - gtk_table_attach_defaults (GTK_TABLE (ps), lbl, 0, 1, rows, rows + 1); - gtk_table_attach_defaults (GTK_TABLE (ps), gui->default_address, 1, 2, rows, rows + 1); - gtk_widget_show (lbl); - gtk_widget_show (gui->default_address); - - return gui; -} - -static const int default_address_map[] = { - E_CONTACT_ADDRESS_WORK, - E_CONTACT_ADDRESS_HOME, - E_CONTACT_ADDRESS_OTHER, - -1 -}; - -static void -e_addr_gui_fill_widgets (EAddrConduitGui *gui, EAddrConduitCfg *cfg) -{ - g_return_if_fail (gui != NULL); - g_return_if_fail (cfg != NULL); - - e_dialog_option_menu_set (gui->default_address, - cfg->default_address, - default_address_map); -} - -static void -e_addr_gui_fill_config (EAddrConduitGui *gui, EAddrConduitCfg *cfg) -{ - g_return_if_fail (gui != NULL); - g_return_if_fail (cfg != NULL); - - cfg->default_address = e_dialog_option_menu_get (gui->default_address, - default_address_map); -} - -static void -e_addr_gui_destroy (EAddrConduitGui *gui) -{ - g_free (gui); -} - -/* Context */ -struct _EAddrConduitContext { - GnomePilotDBInfo *dbi; - - EAddrConduitCfg *cfg; - EAddrConduitCfg *new_cfg; - EAddrConduitGui *gui; - GtkWidget *ps; - - struct AddressAppInfo ai; - - EBook *ebook; - GList *cards; - GList *changed; - GHashTable *changed_hash; - GList *locals; - - EPilotMap *map; -}; - -static EAddrConduitContext * -e_addr_context_new (guint32 pilot_id) -{ - EAddrConduitContext *ctxt = g_new0 (EAddrConduitContext, 1); - - ctxt->cfg = addrconduit_load_configuration (pilot_id); - ctxt->new_cfg = addrconduit_dupe_configuration (ctxt->cfg); - ctxt->gui = NULL; - ctxt->ps = NULL; - ctxt->ebook = NULL; - ctxt->cards = NULL; - ctxt->changed_hash = NULL; - ctxt->changed = NULL; - ctxt->locals = NULL; - ctxt->map = NULL; - - return ctxt; -} - -static void -e_addr_context_destroy (EAddrConduitContext *ctxt) -{ - GList *l; - - g_return_if_fail (ctxt != NULL); - - if (ctxt->cfg != NULL) - addrconduit_destroy_configuration (ctxt->cfg); - if (ctxt->new_cfg != NULL) - addrconduit_destroy_configuration (ctxt->new_cfg); - if (ctxt->gui != NULL) - e_addr_gui_destroy (ctxt->gui); - - if (ctxt->ebook != NULL) - g_object_unref (ctxt->ebook); - - if (ctxt->cards != NULL) { - for (l = ctxt->cards; l != NULL; l = l->next) - g_object_unref (l->data); - g_list_free (ctxt->cards); - } - - if (ctxt->changed_hash != NULL) - g_hash_table_destroy (ctxt->changed_hash); - - if (ctxt->changed != NULL) - e_book_free_change_list (ctxt->changed); - - if (ctxt->locals != NULL) { - for (l = ctxt->locals; l != NULL; l = l->next) - addrconduit_destroy_record (l->data); - g_list_free (ctxt->locals); - } - - if (ctxt->map != NULL) - e_pilot_map_destroy (ctxt->map); - - g_free (ctxt); -} - -/* Debug routines */ -static char * -print_local (EAddrLocalRecord *local) -{ - static char buff[ 4096 ]; - - if (local == NULL) { - sprintf (buff, "[NULL]"); - return buff; - } - - if (local->addr) { - g_snprintf (buff, 4096, "['%s' '%s' '%s']", - local->addr->entry[entryLastname] ? - local->addr->entry[entryLastname] : "", - local->addr->entry[entryFirstname] ? - local->addr->entry[entryFirstname] : "", - local->addr->entry[entryCompany] ? - local->addr->entry[entryCompany] : ""); - return buff; - } - - return ""; -} - -static char *print_remote (GnomePilotRecord *remote) -{ - static char buff[ 4096 ]; - struct Address addr; - - if (remote == NULL) { - sprintf (buff, "[NULL]"); - return buff; - } - - memset (&addr, 0, sizeof (struct Address)); - unpack_Address (&addr, remote->record, remote->length); - - g_snprintf (buff, 4096, "['%s' '%s' '%s']", - addr.entry[entryLastname] ? - addr.entry[entryLastname] : "", - addr.entry[entryFirstname] ? - addr.entry[entryFirstname] : "", - addr.entry[entryCompany] ? - addr.entry[entryCompany] : ""); - - free_Address (&addr); - - return buff; -} - -/* Utility routines */ -static char * -map_name (EAddrConduitContext *ctxt) -{ - char *filename = NULL; - - filename = g_strdup_printf ("%s/.evolution/addressbook/local/system/pilot-map-%d.xml", g_get_home_dir (), ctxt->cfg->pilot_id); - - return filename; -} - -static GList * -next_changed_item (EAddrConduitContext *ctxt, GList *changes) -{ - EBookChange *ebc; - GList *l; - - for (l = changes; l != NULL; l = l->next) { - ebc = l->data; - - if (g_hash_table_lookup (ctxt->changed_hash, e_contact_get_const (ebc->contact, E_CONTACT_UID))) - return l; - } - - return NULL; -} - -static EContactField -get_next_mail (EContactField *field) -{ - if (field == NULL) - return E_CONTACT_EMAIL_1; - - switch (*field) { - case E_CONTACT_EMAIL_1: - return E_CONTACT_EMAIL_2; - case E_CONTACT_EMAIL_2: - return E_CONTACT_EMAIL_3; - default: - break; - } - - return E_CONTACT_FIELD_LAST; -} - -static EContactField -get_next_home (EContactField *field) -{ - if (field == NULL) - return E_CONTACT_PHONE_HOME; - - switch (*field) { - case E_CONTACT_PHONE_HOME: - return E_CONTACT_PHONE_HOME_2; - default: - break; - } - - return E_CONTACT_FIELD_LAST; -} - -static EContactField -get_next_work (EContactField *field) -{ - if (field == NULL) - return E_CONTACT_PHONE_BUSINESS; - - switch (*field) { - case E_CONTACT_PHONE_BUSINESS: - return E_CONTACT_PHONE_BUSINESS_2; - default: - break; - } - - return E_CONTACT_FIELD_LAST; -} - -static EContactField -get_next_fax (EContactField *field) -{ - if (field == NULL) - return E_CONTACT_PHONE_BUSINESS_FAX; - - switch (*field) { - case E_CONTACT_PHONE_BUSINESS_FAX: - return E_CONTACT_PHONE_HOME_FAX; - case E_CONTACT_PHONE_HOME_FAX: - return E_CONTACT_PHONE_OTHER_FAX; - default: - break; - } - - return E_CONTACT_FIELD_LAST; -} - -static EContactField -get_next_other (EContactField *field) -{ - if (field == NULL) - return E_CONTACT_PHONE_OTHER; - - return E_CONTACT_FIELD_LAST; -} - -static EContactField -get_next_main (EContactField *field) -{ - if (field == NULL) - return E_CONTACT_PHONE_PRIMARY; - - return E_CONTACT_FIELD_LAST; -} - -static EContactField -get_next_pager (EContactField *field) -{ - if (field == NULL) - return E_CONTACT_PHONE_PAGER; - - return E_CONTACT_FIELD_LAST; -} - -static EContactField -get_next_mobile (EContactField *field) -{ - if (field == NULL) - return E_CONTACT_PHONE_MOBILE; - - return E_CONTACT_FIELD_LAST; -} - -static void -get_next_init (EContactField *next_mail, - EContactField *next_home, - EContactField *next_work, - EContactField *next_fax, - EContactField *next_other, - EContactField *next_main, - EContactField *next_pager, - EContactField *next_mobile) -{ - *next_mail = get_next_mail (NULL); - *next_home = get_next_home (NULL); - *next_work = get_next_work (NULL); - *next_fax = get_next_fax (NULL); - *next_other = get_next_other (NULL); - *next_main = get_next_main (NULL); - *next_pager = get_next_pager (NULL); - *next_mobile = get_next_mobile (NULL); -} - -static gboolean -is_next_done (EContactField field) -{ - if (field == E_CONTACT_FIELD_LAST) - return TRUE; - - return FALSE; -} - -static gboolean -is_syncable (EAddrConduitContext *ctxt, EAddrLocalRecord *local) -{ - EContactField next_mail, next_home, next_work, next_fax; - EContactField next_other, next_main, next_pager, next_mobile; - gboolean syncable = TRUE; - int i, l = 0; - - /* See if there are fields we can't sync or not in priority order */ - get_next_init (&next_mail, &next_home, &next_work, &next_fax, - &next_other, &next_main, &next_pager, &next_mobile); - - for (i = entryPhone1; i <= entryPhone5 && syncable; i++) { - int phonelabel = local->addr->phoneLabel[i - entryPhone1]; - const char *phone_str = local->addr->entry[i]; - gboolean empty = !(phone_str && *phone_str); - - if (empty) - continue; - - for ( ; priority_label[l] != -1; l++) - if (phonelabel == priority_label[l]) - break; - - if (priority_label[l] == -1) { - syncable = FALSE; - continue; - } - - if (phonelabel == LABEL_EMAIL) { - if (is_next_done (next_mail) || next_mail != priority[l]) { - syncable = FALSE; - break; - } - next_mail = get_next_mail (&next_mail); - } else if (phonelabel == LABEL_HOME) { - if (is_next_done (next_home) || next_home != priority[l]) { - syncable = FALSE; - break; - } - next_home = get_next_home (&next_home); - } else if (phonelabel == LABEL_WORK) { - if (is_next_done (next_work) || next_work != priority[l]) { - syncable = FALSE; - break; - } - next_work = get_next_work (&next_work); - } else if (phonelabel == LABEL_FAX) { - if (is_next_done (next_fax) || next_fax != priority[l]) { - syncable = FALSE; - break; - } - next_fax = get_next_fax (&next_fax); - } else if (phonelabel == LABEL_OTHER) { - if (is_next_done (next_other) || next_other != priority[l]) { - syncable = FALSE; - break; - } - next_other = get_next_other (&next_other); - } else if (phonelabel == LABEL_MAIN) { - if (is_next_done (next_main) || next_main != priority[l]) { - syncable = FALSE; - break; - } - next_main = get_next_main (&next_main); - } else if (phonelabel == LABEL_PAGER) { - if (is_next_done (next_pager) || next_pager != priority[l]) { - syncable = FALSE; - break; - } - next_pager = get_next_pager (&next_pager); - } else if (phonelabel == LABEL_MOBILE) { - if (is_next_done (next_mobile) || next_mobile != priority[l]) { - syncable = FALSE; - break; - } - next_mobile = get_next_mobile (&next_mobile); - } - } - - return syncable; -} - -static void -set_contact_text (EContact *contact, EContactField field, struct Address address, int entry) -{ - char *text = NULL; - - if (address.entry[entry]) - text = e_pilot_utf8_from_pchar (address.entry[entry]); - - e_contact_set (contact, field, text); - - g_free (text); -} - -static char * -get_entry_text (struct Address address, int entry) -{ - if (address.entry[entry]) - return e_pilot_utf8_from_pchar (address.entry[entry]); - - return NULL; -} - -static void -clear_entry_text (struct Address address, int field) -{ - if (address.entry[field]) { - free (address.entry[field]); - address.entry[field] = NULL; - } -} - -static void -compute_status (EAddrConduitContext *ctxt, EAddrLocalRecord *local, const char *uid) -{ - EBookChange *ebc; - - local->local.archived = FALSE; - local->local.secret = FALSE; - - ebc = g_hash_table_lookup (ctxt->changed_hash, uid); - - if (ebc == NULL) { - local->local.attr = GnomePilotRecordNothing; - return; - } - - switch (ebc->change_type) { - case E_BOOK_CHANGE_CARD_ADDED: - local->local.attr = GnomePilotRecordNew; - break; - case E_BOOK_CHANGE_CARD_MODIFIED: - local->local.attr = GnomePilotRecordModified; - break; - case E_BOOK_CHANGE_CARD_DELETED: - local->local.attr = GnomePilotRecordDeleted; - break; - } -} - -static GnomePilotRecord -local_record_to_pilot_record (EAddrLocalRecord *local, - EAddrConduitContext *ctxt) -{ - GnomePilotRecord p; - static char record[0xffff]; - - g_assert (local->addr != NULL ); - - LOG (g_message ( "local_record_to_pilot_record\n" )); - - p.ID = local->local.ID; - p.category = local->local.category; - p.attr = local->local.attr; - p.archived = local->local.archived; - p.secret = local->local.secret; - - /* Generate pilot record structure */ - p.record = record; - p.length = pack_Address (local->addr, p.record, 0xffff); - - return p; -} - -static void -local_record_from_ecard (EAddrLocalRecord *local, EContact *contact, EAddrConduitContext *ctxt) -{ - EContactAddress *address = NULL; - int phone = entryPhone1; - EContactField field; - gboolean syncable; - int i; - - g_return_if_fail (local != NULL); - g_return_if_fail (contact != NULL); - - local->contact = g_object_ref (contact); - local->local.ID = e_pilot_map_lookup_pid (ctxt->map, e_contact_get_const (contact, E_CONTACT_UID), TRUE); - - compute_status (ctxt, local, e_contact_get_const (contact, E_CONTACT_UID)); - - local->addr = g_new0 (struct Address, 1); - - /* Handle the fields and category we don't sync by making sure - * we don't overwrite them - */ - if (local->local.ID != 0) { - struct Address addr; - char record[0xffff]; - int cat = 0; - - if (dlp_ReadRecordById (ctxt->dbi->pilot_socket, - ctxt->dbi->db_handle, - local->local.ID, &record, - NULL, NULL, NULL, &cat) > 0) { - local->local.category = cat; - memset (&addr, 0, sizeof (struct Address)); - unpack_Address (&addr, record, 0xffff); - for (i = 0; i < 5; i++) { - if (addr.entry[entryPhone1 + i]) - local->addr->entry[entryPhone1 + i] = - strdup (addr.entry[entryPhone1 + i]); - local->addr->phoneLabel[i] = addr.phoneLabel[i]; - } - local->addr->showPhone = addr.showPhone; - for (i = 0; i < 4; i++) { - if (addr.entry[entryCustom1 + i]) - local->addr->entry[entryCustom1 + i] = - strdup (addr.entry[entryCustom1 + i]); - } - free_Address (&addr); - } - } - - local->addr->entry[entryFirstname] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_GIVEN_NAME)); - local->addr->entry[entryLastname] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_FAMILY_NAME)); - local->addr->entry[entryCompany] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_ORG)); - local->addr->entry[entryTitle] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_TITLE)); - - /* See if the default has something in it */ - if ((address = e_contact_get (contact, ctxt->cfg->default_address))) { - field = ctxt->cfg->default_address; - } else { - /* Try to find a non-empty address field */ - for (field = E_CONTACT_FIRST_ADDRESS_ID; field <= E_CONTACT_LAST_ADDRESS_ID; field++) { - if ((address = e_contact_get (contact, field))) - break; - } - } - - if (address) { - char *add; - - /* If the address has 2 lines, make sure both get added */ - if (address->ext != NULL) - add = g_strconcat (address->street, "\n", address->ext, NULL); - else - add = g_strdup (address->street); - local->addr->entry[entryAddress] = e_pilot_utf8_to_pchar (add); - g_free (add); - - local->addr->entry[entryCity] = e_pilot_utf8_to_pchar (address->locality); - local->addr->entry[entryState] = e_pilot_utf8_to_pchar (address->region); - local->addr->entry[entryZip] = e_pilot_utf8_to_pchar (address->code); - local->addr->entry[entryCountry] = e_pilot_utf8_to_pchar (address->country); - - e_contact_address_free (address); - } - - /* Phone numbers */ - - /* See if everything is syncable */ - syncable = is_syncable (ctxt, local); - - if (syncable) { - INFO ("Syncable"); - - /* Sync by priority */ - for (i = 0, phone = entryPhone1; - priority[i] != E_CONTACT_FIELD_LAST && phone <= entryPhone5; i++) { - const char *phone_str; - - phone_str = e_contact_get_const (contact, priority[i]); - if (phone_str && *phone_str) { - clear_entry_text (*local->addr, phone); - local->addr->entry[phone] = e_pilot_utf8_to_pchar (phone_str); - local->addr->phoneLabel[phone - entryPhone1] = priority_label[i]; - phone++; - } - } - for ( ; phone <= entryPhone5; phone++) - local->addr->phoneLabel[phone - entryPhone1] = phone - entryPhone1; - local->addr->showPhone = 0; - } else { - EContactField next_mail, next_home, next_work, next_fax; - EContactField next_other, next_main, next_pager, next_mobile; - - INFO ("Not Syncable"); - get_next_init (&next_mail, &next_home, &next_work, &next_fax, - &next_other, &next_main, &next_pager, &next_mobile); - - /* Not completely syncable, so do the best we can */ - for (i = entryPhone1; i <= entryPhone5; i++) { - int phonelabel = local->addr->phoneLabel[i - entryPhone1]; - const char *phone_str = NULL; - - if (phonelabel == LABEL_EMAIL && !is_next_done (next_mail)) { - phone_str = e_contact_get_const (contact, next_mail); - next_mail = get_next_mail (&next_mail); - } else if (phonelabel == LABEL_HOME && !is_next_done (next_home)) { - phone_str = e_contact_get_const (contact, next_home); - next_home = get_next_home (&next_home); - } else if (phonelabel == LABEL_WORK && !is_next_done (next_work)) { - phone_str = e_contact_get_const (contact, next_work); - next_work = get_next_work (&next_work); - } else if (phonelabel == LABEL_FAX && !is_next_done (next_fax)) { - phone_str = e_contact_get_const (contact, next_fax); - next_fax = get_next_fax (&next_fax); - } else if (phonelabel == LABEL_OTHER && !is_next_done (next_other)) { - phone_str = e_contact_get_const (contact, next_other); - next_other = get_next_other (&next_other); - } else if (phonelabel == LABEL_MAIN && !is_next_done (next_main)) { - phone_str = e_contact_get_const (contact, next_main); - next_main = get_next_main (&next_main); - } else if (phonelabel == LABEL_PAGER && !is_next_done (next_pager)) { - phone_str = e_contact_get_const (contact, next_pager); - next_pager = get_next_pager (&next_pager); - } else if (phonelabel == LABEL_MOBILE && !is_next_done (next_mobile)) { - phone_str = e_contact_get_const (contact, next_mobile); - next_mobile = get_next_mobile (&next_mobile); - } - - if (phone_str && *phone_str) { - clear_entry_text (*local->addr, i); - local->addr->entry[i] = e_pilot_utf8_to_pchar (phone_str); - } - } - } - - /* Note */ - local->addr->entry[entryNote] = e_pilot_utf8_to_pchar (e_contact_get_const (contact, E_CONTACT_NOTE)); -} - -static void -local_record_from_uid (EAddrLocalRecord *local, - const char *uid, - EAddrConduitContext *ctxt) -{ - EContact *contact = NULL; - const char *cuid; - GList *l; - - g_assert (local != NULL); - - for (l = ctxt->cards; l != NULL; l = l->next) { - contact = l->data; - - /* FIXME Do we need to check for the empty string? */ - if ((cuid = e_contact_get_const (contact, E_CONTACT_UID)) && !strcmp (cuid, uid)) - break; - - contact = NULL; - } - - if (contact != NULL) { - local_record_from_ecard (local, contact, ctxt); - } else { - contact = e_contact_new (); - e_contact_set (contact, E_CONTACT_UID, (gpointer) uid); - local_record_from_ecard (local, contact, ctxt); - g_object_unref (contact); - } -} - -static EContact * -ecard_from_remote_record(EAddrConduitContext *ctxt, - GnomePilotRecord *remote, - EContact *in_contact) -{ - struct Address address; - EContact *contact; - EContactName *name; - EContactAddress *eaddress; - EContactField mailing_address; - char *txt, *find, *full_name; - EContactField next_mail, next_home, next_work, next_fax; - EContactField next_other, next_main, next_pager, next_mobile; - int i; - - g_return_val_if_fail(remote!=NULL,NULL); - memset (&address, 0, sizeof (struct Address)); - unpack_Address (&address, remote->record, remote->length); - - if (in_contact == NULL) - contact = e_contact_new (); - else - contact = e_contact_duplicate (in_contact); - - /* Name */ - name = e_contact_name_new (); - name->given = get_entry_text (address, entryFirstname); - name->family = get_entry_text (address, entryLastname); - - full_name = e_contact_name_to_string (name); - e_contact_set (contact, E_CONTACT_FULL_NAME, full_name); - e_contact_name_free (name); - - /* File As */ - if (!full_name || !*full_name) - set_contact_text (contact, E_CONTACT_FILE_AS, address, entryCompany); - - g_free (full_name); - - /* Title and Company */ - set_contact_text (contact, E_CONTACT_TITLE, address, entryTitle); - set_contact_text (contact, E_CONTACT_ORG, address, entryCompany); - - /* Address */ - mailing_address = -1; - if ((eaddress = e_contact_get (contact, ctxt->cfg->default_address))) { - mailing_address = ctxt->cfg->default_address; - e_contact_address_free (eaddress); - } else { - for (i = E_CONTACT_FIRST_ADDRESS_ID; i <= E_CONTACT_LAST_ADDRESS_ID; i++) { - if ((eaddress = e_contact_get (contact, i))) { - e_contact_address_free (eaddress); - mailing_address = i; - break; - } - } - } - - if (mailing_address == -1) - mailing_address = ctxt->cfg->default_address; - - eaddress = g_new0 (EContactAddress, 1); - - txt = get_entry_text (address, entryAddress); - if (txt && (find = strchr (txt, '\n')) != NULL) { - *find = '\0'; - find++; - } else { - find = NULL; - } - - eaddress->street = txt; - eaddress->ext = find != NULL ? g_strdup (find) : g_strdup (""); - eaddress->locality = get_entry_text (address, entryCity); - eaddress->region = get_entry_text (address, entryState); - eaddress->country = get_entry_text (address, entryCountry); - eaddress->code = get_entry_text (address, entryZip); - - e_contact_set (contact, mailing_address, eaddress); - e_contact_address_free (eaddress); - - /* Phone numbers */ - get_next_init (&next_mail, &next_home, &next_work, &next_fax, - &next_other, &next_main, &next_pager, &next_mobile); - - for (i = entryPhone1; i <= entryPhone5; i++) { - int phonelabel = address.phoneLabel[i - entryPhone1]; - char *phonenum = get_entry_text (address, i); - - if (phonelabel == LABEL_EMAIL && !is_next_done (next_mail)) { - e_contact_set (contact, next_mail, phonenum); - next_mail = get_next_mail (&next_mail); - } else if (phonelabel == LABEL_HOME && !is_next_done (next_home)) { - e_contact_set (contact, next_home, phonenum); - next_home = get_next_home (&next_home); - } else if (phonelabel == LABEL_WORK && !is_next_done (next_work)) { - e_contact_set (contact, next_work, phonenum); - next_work = get_next_work (&next_work); - } else if (phonelabel == LABEL_FAX && !is_next_done (next_fax)) { - e_contact_set (contact, next_fax, phonenum); - next_fax = get_next_fax (&next_fax); - } else if (phonelabel == LABEL_OTHER && !is_next_done (next_other)) { - e_contact_set (contact, next_other, phonenum); - next_other = get_next_other (&next_other); - } else if (phonelabel == LABEL_MAIN && !is_next_done (next_main)) { - e_contact_set (contact, next_main, phonenum); - next_main = get_next_main (&next_main); - } else if (phonelabel == LABEL_PAGER && !is_next_done (next_pager)) { - e_contact_set (contact, next_pager, phonenum); - next_pager = get_next_pager (&next_pager); - } else if (phonelabel == LABEL_MOBILE && !is_next_done (next_mobile)) { - e_contact_set (contact, next_mobile, phonenum); - next_mobile = get_next_mobile (&next_mobile); - } - - g_free (phonenum); - } - - /* Note */ - set_contact_text (contact, E_CONTACT_NOTE, address, entryNote); - - free_Address(&address); - - return contact; -} - -static void -check_for_slow_setting (GnomePilotConduit *c, EAddrConduitContext *ctxt) -{ - GnomePilotConduitStandard *conduit = GNOME_PILOT_CONDUIT_STANDARD (c); - int map_count; - const char *uri; - - map_count = g_hash_table_size (ctxt->map->pid_map); - if (map_count == 0) - gnome_pilot_conduit_standard_set_slow (conduit, TRUE); - - /* Or if the URI's don't match */ - uri = e_book_get_uri (ctxt->ebook); - LOG (g_message (" Current URI %s (%s)\n", uri, ctxt->cfg->last_uri ? ctxt->cfg->last_uri : "<NONE>")); - if (ctxt->cfg->last_uri != NULL && strcmp (ctxt->cfg->last_uri, uri)) { - gnome_pilot_conduit_standard_set_slow (conduit, TRUE); - e_pilot_map_clear (ctxt->map); - } - - if (gnome_pilot_conduit_standard_get_slow (conduit)) { - ctxt->map->write_touched_only = TRUE; - LOG (g_message ( " doing slow sync\n" )); - } else { - LOG (g_message ( " doing fast sync\n" )); - } -} - -/* Pilot syncing callbacks */ -static gint -pre_sync (GnomePilotConduit *conduit, - GnomePilotDBInfo *dbi, - EAddrConduitContext *ctxt) -{ - GnomePilotConduitSyncAbs *abs_conduit; - EBookQuery *query; - GList *l; - int len; - unsigned char *buf; - char *filename; - char *change_id; - gint num_records, add_records = 0, mod_records = 0, del_records = 0; - - abs_conduit = GNOME_PILOT_CONDUIT_SYNC_ABS (conduit); - - LOG (g_message ( "---------------------------------------------------------\n" )); - LOG (g_message ( "pre_sync: Addressbook Conduit v.%s", CONDUIT_VERSION )); - /* g_message ("Addressbook Conduit v.%s", CONDUIT_VERSION); */ - - ctxt->dbi = dbi; - - if (ctxt->cfg->source) { - ctxt->ebook = e_book_new (ctxt->cfg->source, NULL); - } else { - ctxt->ebook = e_book_new_default_addressbook (NULL); - } - if (!ctxt->ebook || !e_book_open (ctxt->ebook, TRUE, NULL)) { - WARN(_("Could not load addressbook")); - gnome_pilot_conduit_error (conduit, _("Could not load addressbook")); - - return -1; - } - - /* Load the uid <--> pilot id mappings */ - filename = map_name (ctxt); - e_pilot_map_read (filename, &ctxt->map); - g_free (filename); - - /* Get a list of all contacts */ - if (!(query = e_book_query_any_field_contains (""))) { - LOG (g_warning ("Failed to get EBookQuery")); - return -1; - } - - if (!e_book_get_contacts (ctxt->ebook, query, &ctxt->cards, NULL)) { - LOG (g_warning ("Failed to get Contacts")); - e_book_query_unref (query); - return -1; - } - - e_book_query_unref (query); - - /* Count and hash the changes */ - change_id = g_strdup_printf ("pilot-sync-evolution-addressbook-%d", ctxt->cfg->pilot_id); - if (!e_book_get_changes (ctxt->ebook, change_id, &ctxt->changed, NULL)) - return -1; - ctxt->changed_hash = g_hash_table_new (g_str_hash, g_str_equal); - g_free (change_id); - - for (l = ctxt->changed; l != NULL; l = l->next) { - EBookChange *ebc = l->data; - const char *uid; - - uid = e_contact_get_const (ebc->contact, E_CONTACT_UID); - if (!e_pilot_map_uid_is_archived (ctxt->map, uid)) { - - g_hash_table_insert (ctxt->changed_hash, g_strdup (uid), ebc); - - switch (ebc->change_type) { - case E_BOOK_CHANGE_CARD_ADDED: - add_records++; - break; - case E_BOOK_CHANGE_CARD_MODIFIED: - mod_records++; - break; - case E_BOOK_CHANGE_CARD_DELETED: - del_records++; - break; - } - } else if (ebc->change_type == E_BOOK_CHANGE_CARD_DELETED) { - e_pilot_map_remove_by_uid (ctxt->map, uid); - } - } - - /* Set the count information */ - num_records = g_list_length (ctxt->cards); - gnome_pilot_conduit_sync_abs_set_num_local_records(abs_conduit, num_records); - gnome_pilot_conduit_sync_abs_set_num_new_local_records (abs_conduit, add_records); - gnome_pilot_conduit_sync_abs_set_num_updated_local_records (abs_conduit, mod_records); - gnome_pilot_conduit_sync_abs_set_num_deleted_local_records(abs_conduit, del_records); - - buf = (unsigned char*)g_malloc (0xffff); - len = dlp_ReadAppBlock (dbi->pilot_socket, dbi->db_handle, 0, - (unsigned char *)buf, 0xffff); - - if (len < 0) { - WARN (_("Could not read pilot's Address application block")); - WARN ("dlp_ReadAppBlock(...) = %d", len); - gnome_pilot_conduit_error (conduit, - _("Could not read pilot's Address application block")); - return -1; - } - unpack_AddressAppInfo (&(ctxt->ai), buf, len); - g_free (buf); - - check_for_slow_setting (conduit, ctxt); - if (ctxt->cfg->sync_type == GnomePilotConduitSyncTypeCopyToPilot - || ctxt->cfg->sync_type == GnomePilotConduitSyncTypeCopyFromPilot) - ctxt->map->write_touched_only = TRUE; - - return 0; -} - -static gint -post_sync (GnomePilotConduit *conduit, - GnomePilotDBInfo *dbi, - EAddrConduitContext *ctxt) -{ - GList *changed; - gchar *filename, *change_id; - - LOG (g_message ( "post_sync: Address Conduit v.%s", CONDUIT_VERSION )); - - g_free (ctxt->cfg->last_uri); - ctxt->cfg->last_uri = g_strdup (e_book_get_uri (ctxt->ebook)); - addrconduit_save_configuration (ctxt->cfg); - - filename = map_name (ctxt); - e_pilot_map_write (filename, ctxt->map); - g_free (filename); - - /* FIX ME ugly hack - our changes musn't count, this does introduce - * a race condition if anyone changes a record elsewhere during sycnc - */ - change_id = g_strdup_printf ("pilot-sync-evolution-addressbook-%d", ctxt->cfg->pilot_id); - if (e_book_get_changes (ctxt->ebook, change_id, &changed, NULL)) - e_book_free_change_list (changed); - g_free (change_id); - - LOG (g_message ( "---------------------------------------------------------\n" )); - - return 0; -} - -static gint -set_pilot_id (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - guint32 ID, - EAddrConduitContext *ctxt) -{ - LOG (g_message ( "set_pilot_id: setting to %d\n", ID )); - - e_pilot_map_insert (ctxt->map, ID, e_contact_get_const (local->contact, E_CONTACT_UID), FALSE); - - return 0; -} - -static gint -set_status_cleared (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - EAddrConduitContext *ctxt) -{ - const char *uid; - - LOG (g_message ( "set_status_cleared: clearing status\n" )); - - if ((uid = e_contact_get_const (local->contact, E_CONTACT_UID))) - g_hash_table_remove (ctxt->changed_hash, uid); - - return 0; -} - -static gint -for_each (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord **local, - EAddrConduitContext *ctxt) -{ - static GList *cards, *iterator; - static int count; - - g_return_val_if_fail (local != NULL, -1); - - if (*local == NULL) { - LOG (g_message ( "beginning for_each" )); - - cards = ctxt->cards; - count = 0; - - if (cards != NULL) { - LOG (g_message ( "iterating over %d records", g_list_length (cards) )); - - *local = g_new0 (EAddrLocalRecord, 1); - local_record_from_ecard (*local, cards->data, ctxt); - g_list_prepend (ctxt->locals, *local); - - iterator = cards; - } else { - LOG (g_message ( "no events" )); - (*local) = NULL; - return 0; - } - } else { - count++; - if (g_list_next (iterator)) { - iterator = g_list_next (iterator); - - *local = g_new0 (EAddrLocalRecord, 1); - local_record_from_ecard (*local, iterator->data, ctxt); - g_list_prepend (ctxt->locals, *local); - } else { - LOG (g_message ( "for_each ending" )); - - /* Tell the pilot the iteration is over */ - *local = NULL; - - return 0; - } - } - - return 0; -} - -static gint -for_each_modified (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord **local, - EAddrConduitContext *ctxt) -{ - static GList *iterator; - static int count; - - g_return_val_if_fail (local != NULL, 0); - - if (*local == NULL) { - LOG (g_message ( "for_each_modified beginning\n" )); - - iterator = ctxt->changed; - - count = 0; - - iterator = next_changed_item (ctxt, iterator); - if (iterator != NULL) { - EBookChange *ebc = iterator->data; - - LOG (g_message ( "iterating over %d records", g_hash_table_size (ctxt->changed_hash))); - - *local = g_new0 (EAddrLocalRecord, 1); - local_record_from_ecard (*local, ebc->contact, ctxt); - g_list_prepend (ctxt->locals, *local); - } else { - LOG (g_message ( "no events" )); - - *local = NULL; - } - } else { - count++; - iterator = g_list_next (iterator); - if (iterator && (iterator = next_changed_item (ctxt, iterator))) { - EBookChange *ebc = iterator->data; - - *local = g_new0 (EAddrLocalRecord, 1); - local_record_from_ecard (*local, ebc->contact, ctxt); - g_list_prepend (ctxt->locals, *local); - } else { - LOG (g_message ( "for_each_modified ending" )); - - /* Signal the iteration is over */ - *local = NULL; - - return 0; - } - } - - return 0; -} - -static gint -compare (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - GnomePilotRecord *remote, - EAddrConduitContext *ctxt) -{ - GnomePilotRecord local_pilot; - int retval = 0; - - LOG (g_message ("compare: local=%s remote=%s...\n", - print_local (local), print_remote (remote))); - - g_return_val_if_fail (local != NULL, -1); - g_return_val_if_fail (remote != NULL, -1); - - local_pilot = local_record_to_pilot_record (local, ctxt); - - if (remote->length != local_pilot.length - || memcmp (local_pilot.record, remote->record, remote->length)) - retval = 1; - - if (retval == 0) - LOG (g_message ( " equal" )); - else - LOG (g_message ( " not equal" )); - - return retval; -} - -static gint -add_record (GnomePilotConduitSyncAbs *conduit, - GnomePilotRecord *remote, - EAddrConduitContext *ctxt) -{ - EContact *contact; - int retval = 0; - - g_return_val_if_fail (remote != NULL, -1); - - LOG (g_message ( "add_record: adding %s to desktop\n", print_remote (remote) )); - - contact = ecard_from_remote_record (ctxt, remote, NULL); - - /* add the ecard to the server */ - if (!e_book_add_contact (ctxt->ebook, contact, NULL)) { - WARN ("add_record: failed to add card to ebook\n"); - g_object_unref (contact); - - return -1; - } - - e_pilot_map_insert (ctxt->map, remote->ID, e_contact_get (contact, E_CONTACT_UID), FALSE); - - g_object_unref (contact); - - return retval; -} - -static gint -replace_record (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - GnomePilotRecord *remote, - EAddrConduitContext *ctxt) -{ - EContact *new_contact; - EBookChange *ebc; - char *old_id; - int retval = 0; - - g_return_val_if_fail (remote != NULL, -1); - - LOG (g_message ("replace_record: replace %s with %s\n", - print_local (local), print_remote (remote))); - - old_id = e_contact_get (local->contact, E_CONTACT_UID); - ebc = g_hash_table_lookup (ctxt->changed_hash, old_id); - - new_contact = ecard_from_remote_record (ctxt, remote, local->contact); - g_object_unref (local->contact); - local->contact = new_contact; - - if (ebc && ebc->change_type == E_BOOK_CHANGE_CARD_DELETED) { - if (!e_book_add_contact (ctxt->ebook, local->contact, NULL)) { - WARN (G_STRLOC ": failed to add card\n"); - - return -1; - } - - } else { - if (!e_book_commit_contact (ctxt->ebook, local->contact, NULL)) { - WARN (G_STRLOC ": failed to commit card\n"); - - return -1; - } - } - - /* Adding a record causes wombat to assign a new uid so we must tidy */ - if (ebc && ebc->change_type == E_BOOK_CHANGE_CARD_DELETED) { - const char *uid = e_contact_get_const (local->contact, E_CONTACT_UID); - gboolean arch; - - arch = e_pilot_map_uid_is_archived (ctxt->map, uid); - e_pilot_map_insert (ctxt->map, remote->ID, uid, arch); - - ebc = g_hash_table_lookup (ctxt->changed_hash, old_id); - if (ebc) { - g_hash_table_remove (ctxt->changed_hash, old_id); - g_object_unref (ebc->contact); - g_object_ref (local->contact); - ebc->contact = local->contact; - /* FIXME We should possibly be duplicating the uid */ - g_hash_table_insert (ctxt->changed_hash, (gpointer) uid, ebc); - } - } - - return retval; -} - -static gint -delete_record (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - EAddrConduitContext *ctxt) -{ - GError *error = NULL; - int retval = 0; - - g_return_val_if_fail (local != NULL, -1); - g_return_val_if_fail (local->contact != NULL, -1); - - LOG (g_message ( "delete_record: delete %s\n", print_local (local) )); - - e_pilot_map_remove_by_uid (ctxt->map, e_contact_get_const (local->contact, E_CONTACT_UID)); - if (!e_book_remove_contact (ctxt->ebook, e_contact_get_const (local->contact, E_CONTACT_UID), &error) && error->code != E_BOOK_ERROR_CONTACT_NOT_FOUND) { - WARN ("delete_record: failed to delete card in ebook\n"); - g_error_free (error); - - retval = -1; - } - - return retval; -} - -static gint -archive_record (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - gboolean archive, - EAddrConduitContext *ctxt) -{ - int retval = 0; - - g_return_val_if_fail (local != NULL, -1); - - LOG (g_message ( "archive_record: %s\n", archive ? "yes" : "no" )); - - e_pilot_map_insert (ctxt->map, local->local.ID, e_contact_get_const (local->contact, E_CONTACT_UID), archive); - - return retval; -} - -static gint -match (GnomePilotConduitSyncAbs *conduit, - GnomePilotRecord *remote, - EAddrLocalRecord **local, - EAddrConduitContext *ctxt) -{ - const char *uid; - - LOG (g_message ("match: looking for local copy of %s\n", - print_remote (remote))); - - g_return_val_if_fail (local != NULL, -1); - g_return_val_if_fail (remote != NULL, -1); - - *local = NULL; - uid = e_pilot_map_lookup_uid (ctxt->map, remote->ID, TRUE); - - if (!uid) - return 0; - - LOG (g_message ( " matched\n" )); - - *local = g_new0 (EAddrLocalRecord, 1); - local_record_from_uid (*local, uid, ctxt); - - return 0; -} - -static gint -free_match (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - EAddrConduitContext *ctxt) -{ - LOG (g_message ( "free_match: freeing\n" )); - - g_return_val_if_fail (local != NULL, -1); - - addrconduit_destroy_record (local); - - return 0; -} - -static gint -prepare (GnomePilotConduitSyncAbs *conduit, - EAddrLocalRecord *local, - GnomePilotRecord *remote, - EAddrConduitContext *ctxt) -{ - LOG (g_message ( "prepare: encoding local %s\n", print_local (local) )); - - *remote = local_record_to_pilot_record (local, ctxt); - - return 0; -} - -/* Pilot Settings Callbacks */ -static void -fill_widgets (EAddrConduitContext *ctxt) -{ - if (ctxt->cfg->source) - e_pilot_settings_set_source (E_PILOT_SETTINGS (ctxt->ps), - ctxt->cfg->source); - e_pilot_settings_set_secret (E_PILOT_SETTINGS (ctxt->ps), - ctxt->cfg->secret); - - e_addr_gui_fill_widgets (ctxt->gui, ctxt->cfg); -} - -static gint -create_settings_window (GnomePilotConduit *conduit, - GtkWidget *parent, - EAddrConduitContext *ctxt) -{ - LOG (g_message ( "create_settings_window" )); - - if (!ctxt->cfg->source_list) - return -1; - - ctxt->ps = e_pilot_settings_new (ctxt->cfg->source_list); - ctxt->gui = e_addr_gui_new (E_PILOT_SETTINGS (ctxt->ps)); - - gtk_container_add (GTK_CONTAINER (parent), ctxt->ps); - gtk_widget_show (ctxt->ps); - - fill_widgets (ctxt); - - return 0; -} -static void -display_settings (GnomePilotConduit *conduit, EAddrConduitContext *ctxt) -{ - LOG (g_message ( "display_settings" )); - - fill_widgets (ctxt); -} - -static void -save_settings (GnomePilotConduit *conduit, EAddrConduitContext *ctxt) -{ - LOG (g_message ( "save_settings" )); - - if (ctxt->new_cfg->source) - g_object_unref (ctxt->new_cfg->source); - ctxt->new_cfg->source = e_pilot_settings_get_source (E_PILOT_SETTINGS (ctxt->ps)); - g_object_ref (ctxt->new_cfg->source); - ctxt->new_cfg->secret = - e_pilot_settings_get_secret (E_PILOT_SETTINGS (ctxt->ps)); - e_addr_gui_fill_config (ctxt->gui, ctxt->new_cfg); - - addrconduit_save_configuration (ctxt->new_cfg); -} - -static void -revert_settings (GnomePilotConduit *conduit, EAddrConduitContext *ctxt) -{ - LOG (g_message ( "revert_settings" )); - - addrconduit_save_configuration (ctxt->cfg); - addrconduit_destroy_configuration (ctxt->new_cfg); - ctxt->new_cfg = addrconduit_dupe_configuration (ctxt->cfg); -} - -GnomePilotConduit * -conduit_get_gpilot_conduit (guint32 pilot_id) -{ - GtkObject *retval; - EAddrConduitContext *ctxt; - - LOG (g_message ( "in address's conduit_get_gpilot_conduit\n" )); - - retval = gnome_pilot_conduit_sync_abs_new ("AddressDB", 0x61646472); - g_assert (retval != NULL); - - ctxt = e_addr_context_new (pilot_id); - gtk_object_set_data (GTK_OBJECT (retval), "addrconduit_context", ctxt); - - gtk_signal_connect (retval, "pre_sync", (GtkSignalFunc) pre_sync, ctxt); - gtk_signal_connect (retval, "post_sync", (GtkSignalFunc) post_sync, ctxt); - - gtk_signal_connect (retval, "set_pilot_id", (GtkSignalFunc) set_pilot_id, ctxt); - gtk_signal_connect (retval, "set_status_cleared", (GtkSignalFunc) set_status_cleared, ctxt); - - gtk_signal_connect (retval, "for_each", (GtkSignalFunc) for_each, ctxt); - gtk_signal_connect (retval, "for_each_modified", (GtkSignalFunc) for_each_modified, ctxt); - gtk_signal_connect (retval, "compare", (GtkSignalFunc) compare, ctxt); - - gtk_signal_connect (retval, "add_record", (GtkSignalFunc) add_record, ctxt); - gtk_signal_connect (retval, "replace_record", (GtkSignalFunc) replace_record, ctxt); - gtk_signal_connect (retval, "delete_record", (GtkSignalFunc) delete_record, ctxt); - gtk_signal_connect (retval, "archive_record", (GtkSignalFunc) archive_record, ctxt); - - gtk_signal_connect (retval, "match", (GtkSignalFunc) match, ctxt); - gtk_signal_connect (retval, "free_match", (GtkSignalFunc) free_match, ctxt); - - gtk_signal_connect (retval, "prepare", (GtkSignalFunc) prepare, ctxt); - - /* Gui Settings */ - gtk_signal_connect (retval, "create_settings_window", (GtkSignalFunc) create_settings_window, ctxt); - gtk_signal_connect (retval, "display_settings", (GtkSignalFunc) display_settings, ctxt); - gtk_signal_connect (retval, "save_settings", (GtkSignalFunc) save_settings, ctxt); - gtk_signal_connect (retval, "revert_settings", (GtkSignalFunc) revert_settings, ctxt); - - return GNOME_PILOT_CONDUIT (retval); -} - -void -conduit_destroy_gpilot_conduit (GnomePilotConduit *conduit) -{ - EAddrConduitContext *ctxt; - - ctxt = gtk_object_get_data (GTK_OBJECT (conduit), - "addrconduit_context"); - - e_addr_context_destroy (ctxt); - - gtk_object_destroy (GTK_OBJECT (conduit)); -} diff --git a/addressbook/conduit/e-address.conduit.in b/addressbook/conduit/e-address.conduit.in deleted file mode 100644 index 669a506001..0000000000 --- a/addressbook/conduit/e-address.conduit.in +++ /dev/null @@ -1,9 +0,0 @@ -<gnome-pilot-conduit version="1.0"> - <conduit id="e_address_conduit" type="shlib" location="@privconduitdir@/libeaddress_conduit.so"/> - <name value="EAddress"/> - <conduit-attribute name="description" value="Synchronizes Addressbook with Evolution"/> - <conduit-attribute name="default-synctype" value="synchronize"/> - <conduit-attribute name="valid-synctypes" value="synchronize copy_from_pilot copy_to_pilot"/> - <conduit-attribute name="settings" value="TRUE"/> - <conduit-attribute name="icon" value="@datadir@/images/evolution/conduits/48_evo-address-conduit.png"/> -</gnome-pilot-conduit> diff --git a/addressbook/gui/.cvsignore b/addressbook/gui/.cvsignore deleted file mode 100644 index 09980ae6ba..0000000000 --- a/addressbook/gui/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -.deps -.libs -Makefile -Makefile.in -*.lo -*.la diff --git a/addressbook/gui/Makefile.am b/addressbook/gui/Makefile.am deleted file mode 100644 index 4e049a7116..0000000000 --- a/addressbook/gui/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = merging contact-editor contact-list-editor widgets search component diff --git a/addressbook/gui/component/.cvsignore b/addressbook/gui/component/.cvsignore deleted file mode 100644 index 847efaf29c..0000000000 --- a/addressbook/gui/component/.cvsignore +++ /dev/null @@ -1,15 +0,0 @@ -.deps -.libs -.pure -Makefile -Makefile.in -*.lo -*.la -evolution-addressbook -evolution-addressbook.pure -test-addressbook -GNOME_Evolution_Addressbook*.server -GNOME_Evolution_Addressbook*.server.in -addressbook-marshal.c -addressbook-marshal.h -*.schemas
\ No newline at end of file diff --git a/addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in b/addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in deleted file mode 100644 index f57fcb7f09..0000000000 --- a/addressbook/gui/component/GNOME_Evolution_Addressbook.server.in.in +++ /dev/null @@ -1,135 +0,0 @@ -<oaf_info> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@" - type="shlib" - location="@COMPONENTDIR@/libevolution-addressbook.so"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/ObjectFactory:1.0"/> - </oaf_attribute> - - <oaf_attribute name="name" type="string" - _value="Evolution Addressbook"/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_VCard_Control:@VERSION@" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:Bonobo/Control:1.0"/> - <item value="IDL:Bonobo/PersistStream:1.0"/> - </oaf_attribute> - - <oaf_attribute name="bonobo:supported_mime_types" type="stringv"> - <item value="text/vcard"/> - <item value="text/x-vcard"/> - </oaf_attribute> - - <oaf_attribute name="name" type="string" - _value="Evolution Addressbook card viewer"/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_Component:@VERSION@" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/Evolution/Component:@VERSION@"/> - </oaf_attribute> - - <oaf_attribute name="name" type="string" - _value="Evolution Addressbook component"/> - - <oaf_attribute name="evolution:component_alias" type="string" value="contacts"/> - - <oaf_attribute name="evolution:menu_label" type="string" _value="C_ontacts"/> - <oaf_attribute name="evolution:menu_accelerator" type="string" value="*Control*F2"/> - <oaf_attribute name="evolution:button_label" type="string" _value="Contacts"/> - <oaf_attribute name="evolution:button_sort_order" type="string" value="-9"/> - <oaf_attribute name="evolution:button_icon" type="string" value="stock_addressbook"/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_AddressWidget:@VERSION@" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:BonoboControl/address-widget:@VERSION@"/> - <item value="IDL:GNOME/Control:1.0"/> - </oaf_attribute> - - <oaf_attribute name="name" type="string" - _value="Evolution Addressbook address viewer"/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_AddressPopup:@VERSION@" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:BonoboControl/address-widget:@VERSION@"/> - <item value="IDL:GNOME/Control:1.0"/> - </oaf_attribute> - - <oaf_attribute name="name" type="string" - _value="Evolution Addressbook address pop-up"/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_SMime_CertificateManager_ConfigControl:@VERSION@" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/Evolution/ConfigControl:@VERSION@"/> - </oaf_attribute> - - <oaf_attribute name="evolution2:config_item:title" type="string" - _value="Certificates"/> - - <oaf_attribute name="evolution2:config_item:description" type="string" - _value="Manage your S/MIME certificates here"/> - - <oaf_attribute name="evolution2:config_item:icon_name" type="string" - value="stock_lock-ok"/> - - <oaf_attribute name="evolution2:config_item:priority" type="string" value="-6"/> - - <oaf_attribute name="name" type="string" - _value="Evolution S/Mime Certificate Management Control"/> - -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_Autocompletion_ConfigControl:@VERSION@" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/Evolution/ConfigControl:@VERSION@"/> - </oaf_attribute> - - <oaf_attribute name="evolution2:config_item:title" type="string" - _value="Autocompletion"/> - - <oaf_attribute name="evolution2:config_item:description" type="string" - _value="Configure autocomplete here"/> - - <oaf_attribute name="evolution2:config_item:icon_name" type="string" - value="stock_contact"/> - - <oaf_attribute name="evolution2:config_item:type" type="stringv"> - <item value="contacts"/> - </oaf_attribute> - - <oaf_attribute name="evolution2:config_item:priority" type="string" value="-9"/> - - <oaf_attribute name="name" type="string" - _value="Evolution folder settings configuration control"/> -</oaf_server> - -</oaf_info> diff --git a/addressbook/gui/component/Makefile.am b/addressbook/gui/component/Makefile.am deleted file mode 100644 index adf772206c..0000000000 --- a/addressbook/gui/component/Makefile.am +++ /dev/null @@ -1,115 +0,0 @@ -SUBDIRS = select-names - -INCLUDES = \ - -DG_LOG_DOMAIN=\"evolution-addressbook\" \ - -I$(top_srcdir) \ - -I$(top_builddir) \ - -I$(top_srcdir)/shell \ - -I$(top_builddir)/shell \ - -I$(top_srcdir)/widgets/misc \ - -I$(top_srcdir)/addressbook/util \ - -I$(top_srcdir)/addressbook/gui/contact-editor \ - -I$(top_srcdir)/addressbook/gui/contact-list-editor \ - -I$(top_srcdir)/addressbook/gui/widgets \ - -I$(top_builddir)/a11y/addressbook \ - -DEVOLUTION_DATADIR=\""$(datadir)"\" \ - -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ - -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \ - -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \ - -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \ - -DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \ - -DPREFIX=\""$(prefix)"\" \ - $(LDAP_CFLAGS) \ - $(EVOLUTION_ADDRESSBOOK_CFLAGS) - -component_LTLIBRARIES = libevolution-addressbook.la - -libevolution_addressbook_la_SOURCES = \ - addressbook-component.c \ - addressbook-component.h \ - addressbook-config.c \ - addressbook-config.h \ - addressbook-migrate.c \ - addressbook-migrate.h \ - autocompletion-config.c \ - autocompletion-config.h \ - addressbook.c \ - addressbook.h \ - addressbook-view.c \ - addressbook-view.h \ - component-factory.c - -# $(top_builddir)/addressbook/printing/libecontactprint.la - -if ENABLE_SMIME -SMIME_LIB=$(top_builddir)/smime/gui/libevolution-smime.la -endif - -libevolution_addressbook_la_LIBADD = \ - $(SMIME_LIB) \ - $(top_builddir)/addressbook/printing/libecontactprint.la \ - $(top_builddir)/addressbook/gui/component/select-names/libeselectnames.la \ - $(top_builddir)/shell/libeshell.la \ - $(top_builddir)/addressbook/gui/merging/libeabbookmerging.la \ - $(top_builddir)/addressbook/gui/widgets/libeabwidgets.la \ - $(top_builddir)/addressbook/gui/search/libeaddressbooksearch.la \ - $(top_builddir)/filter/libfilter.la \ - $(top_builddir)/addressbook/util/libeabutil.la \ - $(top_builddir)/addressbook/gui/contact-editor/libecontacteditor.la \ - $(top_builddir)/addressbook/gui/contact-list-editor/libecontactlisteditor.la \ - $(top_builddir)/widgets/misc/libemiscwidgets.la \ - $(top_builddir)/widgets/menus/libmenus.la \ - $(top_builddir)/a11y/addressbook/libevolution-addressbook-a11y.la \ - $(top_builddir)/camel/libcamel.la \ - $(EVOLUTION_ADDRESSBOOK_LIBS) $(LDAP_LIBS) - - - -libevolution_addressbook_la_LDFLAGS = -module -avoid-version - -# GConf schemas - -schemadir = $(GCONF_SCHEMA_FILE_DIR) -schema_in_files = apps_evolution_addressbook.schemas.in.in -schema_DATA = $(schema_in_files:.schemas.in.in=-$(BASE_VERSION).schemas) -%-$(BASE_VERSION).schemas.in: %.schemas.in.in - cp $< $@ - -@INTLTOOL_SCHEMAS_RULE@ - -install-data-local: - if test -z "$(DESTDIR)" ; then \ - for p in $(schema_DATA) ; do \ - GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$$p; \ - done \ - fi - -server_in_files = GNOME_Evolution_Addressbook.server.in.in -server_DATA = $(server_in_files:.server.in.in=_$(BASE_VERSION).server) -@EVO_SERVER_RULE@ -@INTLTOOL_SERVER_RULE@ - -glade_DATA = \ - ldap-config.glade - -BUILT_SOURCES = $(server_DATA) -CLEANFILES = $(BUILT_SOURCES) - -EXTRA_DIST = \ - $(glade_DATA) \ - $(schema_in_files) \ - $(server_in_files) - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) - -if ENABLE_PURIFY -PLINK = $(LIBTOOL) --mode=link $(PURIFY) $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ - -all-local: evolution-addressbook.pure - -evolution-addressbook.pure: evolution-addressbook - @rm -f evolution-addressbook.pure - $(PLINK) $(evolution_addressbook_LDFLAGS) $(evolution_addressbook_OBJECTS) $(evolution_addressbook_LDADD) $(LIBS) - -endif diff --git a/addressbook/gui/component/addressbook-component.c b/addressbook/gui/component/addressbook-component.c deleted file mode 100644 index 9e71580d0b..0000000000 --- a/addressbook/gui/component/addressbook-component.c +++ /dev/null @@ -1,304 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* addressbook-component.c - * - * Copyright (C) 2003 Ettore Perazzoli - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli <ettore@ximian.com> - */ - -/* EPFIXME: Add autocompletion setting. */ - - -#include <config.h> - -#include "addressbook-component.h" -#include "addressbook-config.h" -#include "addressbook-migrate.h" -#include "addressbook-view.h" -#include "addressbook/gui/contact-editor/eab-editor.h" -#include "addressbook/gui/widgets/eab-gui-util.h" -#include "e-util/e-plugin.h" -#include "addressbook/gui/widgets/eab-popup.h" -#include "addressbook/gui/widgets/eab-menu.h" - -#include "widgets/misc/e-task-bar.h" -#include "widgets/misc/e-info-label.h" - -#include <string.h> -#include <bonobo/bonobo-i18n.h> -#include <gtk/gtkimage.h> -#include <gconf/gconf-client.h> -#include <gal/util/e-util.h> - -#ifdef ENABLE_SMIME -#include "smime/gui/component.h" -#endif - - -#define PARENT_TYPE bonobo_object_get_type () -static BonoboObjectClass *parent_class = NULL; - -struct _AddressbookComponentPrivate { - GConfClient *gconf_client; - char *base_directory; -}; - -/* Evolution::Component CORBA methods. */ - -static void -impl_createControls (PortableServer_Servant servant, - Bonobo_Control *corba_sidebar_control, - Bonobo_Control *corba_view_control, - Bonobo_Control *corba_statusbar_control, - CORBA_Environment *ev) -{ - AddressbookView *view = addressbook_view_new (); - BonoboControl *sidebar_control; - BonoboControl *view_control; - BonoboControl *statusbar_control; - - sidebar_control = bonobo_control_new (addressbook_view_peek_sidebar (view)); - view_control = addressbook_view_peek_folder_view (view); - statusbar_control = bonobo_control_new (addressbook_view_peek_statusbar (view)); - - *corba_sidebar_control = CORBA_Object_duplicate (BONOBO_OBJREF (sidebar_control), ev); - *corba_view_control = CORBA_Object_duplicate (BONOBO_OBJREF (view_control), ev); - *corba_statusbar_control = CORBA_Object_duplicate (BONOBO_OBJREF (statusbar_control), ev); -} - -static GNOME_Evolution_CreatableItemTypeList * -impl__get_userCreatableItems (PortableServer_Servant servant, - CORBA_Environment *ev) -{ - GNOME_Evolution_CreatableItemTypeList *list = GNOME_Evolution_CreatableItemTypeList__alloc (); - - list->_length = 3; - list->_maximum = list->_length; - list->_buffer = GNOME_Evolution_CreatableItemTypeList_allocbuf (list->_length); - - CORBA_sequence_set_release (list, FALSE); - - list->_buffer[0].id = "contact"; - list->_buffer[0].description = _("New Contact"); - list->_buffer[0].menuDescription = _("_Contact"); - list->_buffer[0].tooltip = _("Create a new contact"); - list->_buffer[0].menuShortcut = 'c'; - list->_buffer[0].iconName = "stock_contact"; - list->_buffer[0].type = GNOME_Evolution_CREATABLE_OBJECT; - - list->_buffer[1].id = "contact_list"; - list->_buffer[1].description = _("New Contact List"); - list->_buffer[1].menuDescription = _("Contact _List"); - list->_buffer[1].tooltip = _("Create a new contact list"); - list->_buffer[1].menuShortcut = 'l'; - list->_buffer[1].iconName = "stock_contact-list"; - list->_buffer[1].type = GNOME_Evolution_CREATABLE_OBJECT; - - list->_buffer[2].id = "address_book"; - list->_buffer[2].description = _("New Address Book"); - list->_buffer[2].menuDescription = _("Address _Book"); - list->_buffer[2].tooltip = _("Create a new address book"); - list->_buffer[2].menuShortcut = 'b'; - list->_buffer[2].iconName = "stock_addressbook"; - list->_buffer[2].type = GNOME_Evolution_CREATABLE_FOLDER; - - return list; -} - -static void -book_loaded_cb (EBook *book, EBookStatus status, gpointer data) -{ - EContact *contact; - char *item_type_name = data; - - if (status != E_BOOK_ERROR_OK) { - /* XXX we really need a dialog here, but we don't have - access to the ESource so we can't use - eab_load_error_dialog. fun! */ - return; - } - - contact = e_contact_new (); - - if (!strcmp (item_type_name, "contact")) { - eab_show_contact_editor (book, contact, TRUE, TRUE); - } - else if (!strcmp (item_type_name, "contact_list")) { - eab_show_contact_list_editor (book, contact, TRUE, TRUE); - } - - g_object_unref (book); - g_object_unref (contact); - - g_free (item_type_name); -} - -static void -impl_requestCreateItem (PortableServer_Servant servant, - const CORBA_char *item_type_name, - CORBA_Environment *ev) -{ - AddressbookComponent *addressbook_component = ADDRESSBOOK_COMPONENT (bonobo_object_from_servant (servant)); - AddressbookComponentPrivate *priv; - EBook *book; - - priv = addressbook_component->priv; - - if (!item_type_name || - (strcmp (item_type_name, "address_book") && - strcmp (item_type_name, "contact") && - strcmp (item_type_name, "contact_list"))) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Component_UnknownType, NULL); - return; - } - - if (!strcmp (item_type_name, "address_book")) { - addressbook_config_create_new_source (NULL); - return; - } - - book = e_book_new_default_addressbook (NULL); - e_book_async_open (book, FALSE, book_loaded_cb, g_strdup (item_type_name)); -} - -static void -impl_upgradeFromVersion (PortableServer_Servant servant, short major, short minor, short revision, CORBA_Environment *ev) -{ - GError *err = NULL; - - if (!addressbook_migrate (addressbook_component_peek (), major, minor, revision, &err)) { - GNOME_Evolution_Component_UpgradeFailed *failedex; - - failedex = GNOME_Evolution_Component_UpgradeFailed__alloc(); - failedex->what = CORBA_string_dup(_("Failed upgrading Addressbook settings or folders.")); - failedex->why = CORBA_string_dup(err->message); - CORBA_exception_set(ev, CORBA_USER_EXCEPTION, ex_GNOME_Evolution_Component_UpgradeFailed, failedex); - } - - if (err) - g_error_free(err); -} - -static CORBA_boolean -impl_requestQuit (PortableServer_Servant servant, CORBA_Environment *ev) -{ - return eab_editor_request_close_all (); -} - -/* GObject methods. */ - -static void -impl_dispose (GObject *object) -{ - AddressbookComponentPrivate *priv = ADDRESSBOOK_COMPONENT (object)->priv; - - if (priv->gconf_client != NULL) { - g_object_unref (priv->gconf_client); - priv->gconf_client = NULL; - } - - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -impl_finalize (GObject *object) -{ - AddressbookComponentPrivate *priv = ADDRESSBOOK_COMPONENT (object)->priv; - - g_free (priv); - - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - - -/* Initialization. */ - -static void -addressbook_component_class_init (AddressbookComponentClass *class) -{ - POA_GNOME_Evolution_Component__epv *epv = &class->epv; - GObjectClass *object_class = G_OBJECT_CLASS (class); - - epv->createControls = impl_createControls; - epv->_get_userCreatableItems = impl__get_userCreatableItems; - epv->requestCreateItem = impl_requestCreateItem; - epv->upgradeFromVersion = impl_upgradeFromVersion; - epv->requestQuit = impl_requestQuit; - - object_class->dispose = impl_dispose; - object_class->finalize = impl_finalize; - - parent_class = g_type_class_peek_parent (class); -} - -static void -addressbook_component_init (AddressbookComponent *component) -{ - AddressbookComponentPrivate *priv; - static int first = TRUE; - - priv = g_new0 (AddressbookComponentPrivate, 1); - - /* EPFIXME: Should use a custom one instead? */ - priv->gconf_client = gconf_client_get_default (); - - priv->base_directory = g_build_filename (g_get_home_dir (), ".evolution", NULL); - - component->priv = priv; - -#ifdef ENABLE_SMIME - smime_component_init (); -#endif - - if (first) { - first = FALSE; - e_plugin_hook_register_type(eab_popup_hook_get_type()); - e_plugin_hook_register_type(eab_menu_hook_get_type()); - } -} - - -/* Public API. */ - -AddressbookComponent * -addressbook_component_peek (void) -{ - static AddressbookComponent *component = NULL; - - if (component == NULL) - component = g_object_new (addressbook_component_get_type (), NULL); - - return component; -} - -GConfClient* -addressbook_component_peek_gconf_client (AddressbookComponent *component) -{ - g_return_val_if_fail (ADDRESSBOOK_IS_COMPONENT (component), NULL); - - return component->priv->gconf_client; -} - -const char * -addressbook_component_peek_base_directory (AddressbookComponent *component) -{ - g_return_val_if_fail (ADDRESSBOOK_IS_COMPONENT (component), NULL); - - return component->priv->base_directory; -} - -BONOBO_TYPE_FUNC_FULL (AddressbookComponent, GNOME_Evolution_Component, PARENT_TYPE, addressbook_component) diff --git a/addressbook/gui/component/addressbook-component.h b/addressbook/gui/component/addressbook-component.h deleted file mode 100644 index de92637a59..0000000000 --- a/addressbook/gui/component/addressbook-component.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* addressbook-component.h - * - * Copyright (C) 2003 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli <ettore@ximian.com> - */ - -#ifndef _ADDRESSBOOK_COMPONENT_H_ -#define _ADDRESSBOOK_COMPONENT_H_ - -#include <bonobo/bonobo-object.h> - -#include "Evolution.h" -#include "e-activity-handler.h" -#include <libedataserver/e-source-list.h> - -#define ADDRESSBOOK_TYPE_COMPONENT (addressbook_component_get_type ()) -#define ADDRESSBOOK_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ADDRESSBOOK_TYPE_COMPONENT, AddressbookComponent)) -#define ADDRESSBOOK_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ADDRESSBOOK_TYPE_COMPONENT, AddressbookComponentClass)) -#define ADDRESSBOOK_IS_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ADDRESSBOOK_TYPE_COMPONENT)) -#define ADDRESSBOOK_IS_COMPONENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), ADDRESSBOOK_TYPE_COMPONENT)) - - -typedef struct _AddressbookComponent AddressbookComponent; -typedef struct _AddressbookComponentPrivate AddressbookComponentPrivate; -typedef struct _AddressbookComponentClass AddressbookComponentClass; - -struct _AddressbookComponent { - BonoboObject parent; - - AddressbookComponentPrivate *priv; -}; - -struct _AddressbookComponentClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_Component__epv epv; -}; - - -GType addressbook_component_get_type (void); - -AddressbookComponent *addressbook_component_peek (void); - -GConfClient *addressbook_component_peek_gconf_client (AddressbookComponent *component); -const char *addressbook_component_peek_base_directory (AddressbookComponent *component); - -#endif /* _ADDRESSBOOK_COMPONENT_H_ */ diff --git a/addressbook/gui/component/addressbook-config.c b/addressbook/gui/component/addressbook-config.c deleted file mode 100644 index 43f69dfbf2..0000000000 --- a/addressbook/gui/component/addressbook-config.c +++ /dev/null @@ -1,1290 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Toshok <toshok@ximian.com> - * Chris Lahey <clahey@ximian.com> - **/ - -/*#define STANDALONE*/ - -#include <config.h> - -#include <string.h> -#include <stdlib.h> -#include <sys/time.h> - -#include <gtk/gtkcombo.h> -#include <gtk/gtkdialog.h> -#include <gtk/gtkentry.h> -#include <gtk/gtkmessagedialog.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-druid.h> -#include <libgnomeui/gnome-druid-page.h> - -#include <bonobo/bonobo-generic-factory.h> - -#include <glade/glade.h> - -#include "addressbook.h" -#include "addressbook-component.h" -#include "addressbook-config.h" - -#include "widgets/misc/e-error.h" - -#include "evolution-config-control.h" - -#include <gal/e-table/e-table-memory-store.h> -#include <gal/e-table/e-table-scrolled.h> - - -#ifdef HAVE_LDAP -#include "ldap.h" -#include "ldap_schema.h" -#endif - -#define LDAP_PORT_STRING "389" -#define LDAPS_PORT_STRING "636" - -#define GLADE_FILE_NAME "ldap-config.glade" -#define CONFIG_CONTROL_FACTORY_ID "OAFIID:GNOME_Evolution_Addressbook_ConfigControlFactory:" BASE_VERSION -#define LDAP_CONFIG_CONTROL_ID "OAFIID:GNOME_Evolution_LDAPStorage_ConfigControl:" BASE_VERSION - -GtkWidget* supported_bases_create_table (char *name, char *string1, char *string2, - int num1, int num2); - -/* default objectclasses */ -#define TOP "top" -#define PERSON "person" -#define ORGANIZATIONALPERSON "organizationalPerson" -#define INETORGPERSON "inetOrgPerson" -#define EVOLUTIONPERSON "evolutionPerson" -#define CALENTRY "calEntry" - - -typedef struct { - GtkWidget *notebook; - int page_num; -} FocusHelpClosure; - -typedef struct _AddressbookSourceDialog AddressbookSourceDialog; -typedef void (*ModifyFunc)(GtkWidget *item, AddressbookSourceDialog *dialog); - -struct _AddressbookSourceDialog { - GladeXML *gui; - - GtkWidget *window; - GtkWidget *druid; /* only used (obviously) in the druid */ - - /* Source selection (druid only) */ - ESourceList *source_list; - GSList *menu_source_groups; - GtkWidget *group_optionmenu; - - /* ESource we're currently editing (editor only) */ - ESource *source; - - /* Source group we're creating/editing a source in */ - ESourceGroup *source_group; - - /* info page fields */ - ModifyFunc general_modify_func; - GtkWidget *host; - GtkWidget *auth_optionmenu; - AddressbookLDAPAuthType auth; - GtkWidget *auth_principal; - - /* connecting page fields */ - ModifyFunc connecting_modify_func; - GtkWidget *port_combo; - GtkWidget *ssl_optionmenu; - AddressbookLDAPSSLType ssl; - - /* searching page fields */ - ModifyFunc searching_modify_func; - GtkWidget *rootdn; - AddressbookLDAPScopeType scope; - GtkWidget *scope_optionmenu; - GtkWidget *timeout_scale; - GtkWidget *limit_spinbutton; - - /* new dialog stuff */ - GtkWidget *auth_frame; - GtkWidget *server_frame; - - /* display name page fields */ - GtkWidget *display_name; - gboolean display_name_changed; /* only used in the druid */ - - gboolean schema_query_successful; - - /* stuff for the account editor window */ - GtkWidget *ok_button; - GtkWidget *cancel_button; - GtkWidget *advanced_button_notebook; - GtkWidget *notebook; /* the toplevel notebook */ - - gboolean advanced; -}; - - - -#ifdef HAVE_LDAP - -static char * -ldap_unparse_auth (AddressbookLDAPAuthType auth_type) -{ - switch (auth_type) { - case ADDRESSBOOK_LDAP_AUTH_NONE: - return "none"; - case ADDRESSBOOK_LDAP_AUTH_SIMPLE_EMAIL: - return "ldap/simple-email"; - case ADDRESSBOOK_LDAP_AUTH_SIMPLE_BINDDN: - return "ldap/simple-binddn"; - default: - g_assert(0); - return "none"; - } -} - -static AddressbookLDAPAuthType -ldap_parse_auth (const char *auth) -{ - if (!auth) - return ADDRESSBOOK_LDAP_AUTH_NONE; - - if (!strcmp (auth, "ldap/simple-email") || !strcmp (auth, "simple")) - return ADDRESSBOOK_LDAP_AUTH_SIMPLE_EMAIL; - else if (!strcmp (auth, "ldap/simple-binddn")) - return ADDRESSBOOK_LDAP_AUTH_SIMPLE_BINDDN; - else - return ADDRESSBOOK_LDAP_AUTH_NONE; -} - -static char * -ldap_unparse_scope (AddressbookLDAPScopeType scope_type) -{ - switch (scope_type) { - case ADDRESSBOOK_LDAP_SCOPE_BASE: - return "base"; - case ADDRESSBOOK_LDAP_SCOPE_ONELEVEL: - return "one"; - case ADDRESSBOOK_LDAP_SCOPE_SUBTREE: - return "sub"; - default: - g_assert(0); - return ""; - } -} - -static char * -ldap_unparse_ssl (AddressbookLDAPSSLType ssl_type) -{ - switch (ssl_type) { - case ADDRESSBOOK_LDAP_SSL_NEVER: - return "never"; - case ADDRESSBOOK_LDAP_SSL_WHENEVER_POSSIBLE: - return "whenever_possible"; - case ADDRESSBOOK_LDAP_SSL_ALWAYS: - return "always"; - default: - g_assert(0); - return ""; - } -} - -static AddressbookLDAPSSLType -ldap_parse_ssl (const char *ssl) -{ - if (!ssl) - return ADDRESSBOOK_LDAP_SSL_WHENEVER_POSSIBLE; /* XXX good default? */ - - if (!strcmp (ssl, "always")) - return ADDRESSBOOK_LDAP_SSL_ALWAYS; - else if (!strcmp (ssl, "never")) - return ADDRESSBOOK_LDAP_SSL_NEVER; - else - return ADDRESSBOOK_LDAP_SSL_WHENEVER_POSSIBLE; -} - -#endif - - - -static void -dialog_to_source (AddressbookSourceDialog *dialog, ESource *source, gboolean temporary) -{ - gchar *str; - - g_assert (source); - - e_source_set_name (source, gtk_entry_get_text (GTK_ENTRY (dialog->display_name))); - - if (!strcmp ("ldap://", e_source_group_peek_base_uri (dialog->source_group))) { -#ifdef HAVE_LDAP - if (dialog->auth != ADDRESSBOOK_LDAP_AUTH_NONE) - e_source_set_property (source, - dialog->auth == ADDRESSBOOK_LDAP_AUTH_SIMPLE_EMAIL ? "email_addr" : "binddn", - gtk_entry_get_text (GTK_ENTRY (dialog->auth_principal))); - str = g_strdup_printf ("%d", gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (dialog->limit_spinbutton))); - e_source_set_property (source, "limit", str); - g_free (str); - - str = g_strdup_printf ("%f", gtk_adjustment_get_value (GTK_RANGE(dialog->timeout_scale)->adjustment)); - e_source_set_property (source, "timeout", str); - g_free (str); - - e_source_set_property (source, "ssl", ldap_unparse_ssl (dialog->ssl)); - e_source_set_property (source, "auth", ldap_unparse_auth (dialog->auth)); - str = g_strdup_printf ("%s:%s/%s?" /* trigraph prevention */ "?%s", - gtk_entry_get_text (GTK_ENTRY (dialog->host)), - gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (dialog->port_combo)->entry)), - gtk_entry_get_text (GTK_ENTRY (dialog->rootdn)), - ldap_unparse_scope (dialog->scope)); - e_source_set_relative_uri (source, str); - g_free (str); -#endif - }else if (g_str_has_prefix (e_source_group_peek_base_uri (dialog->source_group), "groupwise://") && - !e_source_peek_group (source)) { /* if this is an existing book we don't change anything else */ - - GSList *groupwise_source_list; - ESource *existing_source = NULL; - const char *property_value = NULL; - - groupwise_source_list = e_source_group_peek_sources(dialog->source_group); - if (groupwise_source_list) - existing_source = E_SOURCE (groupwise_source_list->data); - if (existing_source) { - property_value = e_source_get_property (existing_source, "auth"); - e_source_set_property (source, "auth", property_value); - property_value = e_source_get_property (existing_source, "user"); - e_source_set_property (source, "user", property_value); - property_value = e_source_get_property (existing_source, "use_ssl"); - e_source_set_property (source, "use_ssl", property_value); - } - e_source_set_property (source, "auth-domain", "Groupwise"); - str = g_strconcat (";", gtk_entry_get_text (GTK_ENTRY (dialog->display_name)), NULL); - e_source_set_relative_uri (source, str); - g_free (str); - - } else { - const gchar *relative_uri; - - relative_uri = e_source_peek_relative_uri (source); - if (!relative_uri || !strlen (relative_uri)) - e_source_set_relative_uri (source, e_source_peek_uid (source)); - } - - if (!temporary) { - if (!e_source_peek_group (source)) - e_source_group_add_source (dialog->source_group, source, -1); - - e_source_list_sync (dialog->source_list, NULL); - } -} - -static ESource * -dialog_to_temp_source (AddressbookSourceDialog *dialog) -{ - ESource *source; - - source = e_source_new ("", ""); - e_source_set_group (source, dialog->source_group); - dialog_to_source (dialog, source, TRUE); - - return source; -} - -#ifdef HAVE_LDAP -static gboolean -source_to_uri_parts (ESource *source, gchar **host, gchar **rootdn, - AddressbookLDAPScopeType *scope, gint *port) -{ - gchar *uri; - LDAPURLDesc *lud; - gint ldap_error; - - g_assert (source); - - uri = e_source_get_uri (source); - ldap_error = ldap_url_parse ((gchar *) uri, &lud); - g_free (uri); - - if (ldap_error != LDAP_SUCCESS) - return FALSE; - - if (host) - *host = g_strdup (lud->lud_host ? lud->lud_host : ""); - if (rootdn) - *rootdn = g_strdup (lud->lud_dn ? lud->lud_dn : ""); - if (port) - *port = lud->lud_port ? lud->lud_port : LDAP_PORT; - if (scope) - *scope = lud->lud_scope == LDAP_SCOPE_BASE ? ADDRESSBOOK_LDAP_SCOPE_BASE : - lud->lud_scope == LDAP_SCOPE_ONELEVEL ? ADDRESSBOOK_LDAP_SCOPE_ONELEVEL : - lud->lud_scope == LDAP_SCOPE_SUBTREE ? ADDRESSBOOK_LDAP_SCOPE_SUBTREE : - ADDRESSBOOK_LDAP_SCOPE_ONELEVEL; - - ldap_free_urldesc (lud); - return TRUE; -} -#endif - -#define SOURCE_PROP_STRING(source, prop) \ - (source && e_source_get_property (source, prop) ? e_source_get_property (source, prop) : "") - -static void -source_to_dialog (AddressbookSourceDialog *dialog) -{ - ESource *source = dialog->source; - const char *base_uri; - - gtk_entry_set_text (GTK_ENTRY (dialog->display_name), source ? e_source_peek_name (source) : ""); - base_uri = e_source_group_peek_base_uri (dialog->source_group); - if (source && base_uri && g_str_has_prefix (base_uri, "groupwise://")) - gtk_widget_set_sensitive (GTK_WIDGET(dialog->display_name), FALSE); - -#ifdef HAVE_LDAP - gtk_spin_button_set_value ( GTK_SPIN_BUTTON (dialog->limit_spinbutton), - g_strtod ( source && e_source_get_property (source, "limit") ? - e_source_get_property (source, "limit") : "100", NULL)); - gtk_adjustment_set_value (GTK_RANGE(dialog->timeout_scale)->adjustment, - g_strtod ( source && e_source_get_property (source, "timeout") ? - e_source_get_property (source, "timeout") : "3", NULL)); - - dialog->auth = source && e_source_get_property (source, "auth") ? - ldap_parse_auth (e_source_get_property (source, "auth")) : ADDRESSBOOK_LDAP_AUTH_NONE; - dialog->ssl = source && e_source_get_property (source, "ssl") ? - ldap_parse_ssl (e_source_get_property (source, "ssl")) : ADDRESSBOOK_LDAP_SSL_WHENEVER_POSSIBLE; - - if (dialog->auth != ADDRESSBOOK_LDAP_AUTH_NONE) - gtk_entry_set_text (GTK_ENTRY (dialog->auth_principal), - SOURCE_PROP_STRING (source, - dialog->auth == ADDRESSBOOK_LDAP_AUTH_SIMPLE_EMAIL ? "email_addr" : "binddn")); - - if (source && !strcmp ("ldap://", e_source_group_peek_base_uri (dialog->source_group))) { - gchar *host; - gchar *rootdn; - AddressbookLDAPScopeType scope; - gint port; - - if (source_to_uri_parts (source, &host, &rootdn, &scope, &port)) { - gchar *port_str; - - gtk_entry_set_text (GTK_ENTRY (dialog->host), host); - gtk_entry_set_text (GTK_ENTRY (dialog->rootdn), rootdn); - - dialog->scope = scope; - - port_str = g_strdup_printf ("%d", port); - gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (dialog->port_combo)->entry), port_str); - g_free (port_str); - - g_free (host); - g_free (rootdn); - } - } - - gtk_option_menu_set_history (GTK_OPTION_MENU(dialog->auth_optionmenu), dialog->auth); - gtk_option_menu_set_history (GTK_OPTION_MENU(dialog->scope_optionmenu), dialog->scope); - gtk_option_menu_set_history (GTK_OPTION_MENU(dialog->ssl_optionmenu), dialog->ssl); -#endif -} - -#ifdef HAVE_LDAP - -/* ldap api foo */ -static LDAP * -addressbook_ldap_init (GtkWidget *window, ESource *source) -{ - LDAP *ldap; - gchar *host; - gint port; - int ldap_error; - int protocol_version = LDAP_VERSION3; - - if (!source_to_uri_parts (source, &host, NULL, NULL, &port)) - return NULL; - - if (!(ldap = ldap_init (host, port))) { - e_error_run ((GtkWindow *) window, "addressbook:ldap-init", NULL); - goto done; - } - - ldap_error = ldap_set_option (ldap, LDAP_OPT_PROTOCOL_VERSION, &protocol_version); - if (LDAP_OPT_SUCCESS != ldap_error) - g_warning ("failed to set protocol version to LDAPv3"); - - /* XXX do TLS if it's configured in */ - - done: - g_free (host); - return ldap; -} - -static gint -addressbook_ldap_auth (GtkWidget *window, LDAP *ldap) -{ - gint ldap_error; - - /* XXX use auth info from source */ - ldap_error = ldap_simple_bind_s (ldap, NULL, NULL); - if (LDAP_SUCCESS != ldap_error) - e_error_run ((GtkWindow *) window, "addressbook:ldap-auth", NULL); - - return ldap_error; -} - -static int -addressbook_root_dse_query (AddressbookSourceDialog *dialog, LDAP *ldap, - char **attrs, LDAPMessage **resp) -{ - int ldap_error; - struct timeval timeout; - - timeout.tv_sec = (gint) gtk_adjustment_get_value (GTK_RANGE(dialog->timeout_scale)->adjustment); - timeout.tv_usec = 0; - - ldap_error = ldap_search_ext_s (ldap, - LDAP_ROOT_DSE, LDAP_SCOPE_BASE, - "(objectclass=*)", - attrs, 0, NULL, NULL, &timeout, LDAP_NO_LIMIT, resp); - if (LDAP_SUCCESS != ldap_error) - e_error_run (GTK_WINDOW (dialog->window), "addressbook:ldap-search-base", NULL); - - return ldap_error; -} - -#endif - -static void -addressbook_source_dialog_destroy (gpointer data, GObject *where_object_was) -{ - AddressbookSourceDialog *dialog = data; - - g_object_unref (dialog->gui); - g_object_unref (dialog->source_list); - g_slist_free (dialog->menu_source_groups); - g_free (dialog); -} - -static void -addressbook_add_server_dialog_finish (GtkWidget *widget, AddressbookSourceDialog *sdialog) -{ - sdialog->source = e_source_new ("", ""); - dialog_to_source (sdialog, sdialog->source, FALSE); - - /* tear down the widgets */ - gtk_widget_destroy (sdialog->window); -} - -static void -addressbook_add_server_dialog_cancel (GtkWidget *widget, AddressbookSourceDialog *dialog) -{ - gtk_widget_destroy (dialog->window); -} - -static void -auth_optionmenu_activated (GtkWidget *item, AddressbookSourceDialog *dialog) -{ - dialog->auth = g_list_index (gtk_container_get_children (GTK_CONTAINER (item->parent)), - item); - - dialog->general_modify_func (item, dialog); -} - -static void -add_auth_activate_cb (GtkWidget *item, AddressbookSourceDialog *dialog) -{ - g_signal_connect (item, "activate", - G_CALLBACK (auth_optionmenu_activated), dialog); -} - -static void -setup_general_tab (AddressbookSourceDialog *dialog, ModifyFunc modify_func) -{ - GtkWidget *menu; - - dialog->general_modify_func = modify_func; - dialog->host = glade_xml_get_widget (dialog->gui, "server-name-entry"); - - g_signal_connect (dialog->host, "changed", - G_CALLBACK (modify_func), dialog); - - dialog->auth_principal = glade_xml_get_widget (dialog->gui, "auth-entry"); - g_signal_connect (dialog->auth_principal, "changed", - G_CALLBACK (modify_func), dialog); - - dialog->auth_optionmenu = glade_xml_get_widget (dialog->gui, "auth-optionmenu"); - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU(dialog->auth_optionmenu)); - gtk_container_foreach (GTK_CONTAINER (menu), (GtkCallback)add_auth_activate_cb, dialog); -} - -static gboolean -general_tab_check (AddressbookSourceDialog *dialog) -{ - gboolean valid = TRUE; - const char *string; - - if (strcmp ("ldap://", e_source_group_peek_base_uri (dialog->source_group))) - return TRUE; - - string = gtk_entry_get_text (GTK_ENTRY (dialog->host)); - if (!string || !string[0]) - valid = FALSE; - - if (valid) { - if (dialog->auth != ADDRESSBOOK_LDAP_AUTH_NONE) { - string = gtk_entry_get_text (GTK_ENTRY (dialog->auth_principal)); - - if (!string || !string[0]) - valid = FALSE; - } - } - - return valid; -} - - -/* connecting page */ -static void -ssl_optionmenu_activated (GtkWidget *item, AddressbookSourceDialog *dialog) -{ - dialog->ssl = g_list_index (gtk_container_get_children (GTK_CONTAINER (item->parent)), - item); - - dialog->connecting_modify_func (item, dialog); -} - -static void -add_ssl_activate_cb (GtkWidget *item, AddressbookSourceDialog *dialog) -{ - g_signal_connect (item, "activate", - G_CALLBACK (ssl_optionmenu_activated), dialog); -} - -static void -port_changed_func (GtkWidget *item, AddressbookSourceDialog *dialog) -{ - /* if the port value is ldaps, set the SSL/TLS option menu to - Always and desensitize it */ - const char *string = gtk_entry_get_text (GTK_ENTRY (item)); - - dialog->connecting_modify_func (item, dialog); - - if (!strcmp (string, LDAPS_PORT_STRING)) { - dialog->ssl = ADDRESSBOOK_LDAP_SSL_ALWAYS; - gtk_option_menu_set_history (GTK_OPTION_MENU(dialog->ssl_optionmenu), - dialog->ssl); - - gtk_widget_set_sensitive (dialog->ssl_optionmenu, FALSE); - } - else { - gtk_widget_set_sensitive (dialog->ssl_optionmenu, TRUE); - } - -} - -static void -setup_connecting_tab (AddressbookSourceDialog *dialog, ModifyFunc modify_func) -{ - GtkWidget *menu; - - dialog->connecting_modify_func = modify_func; - - dialog->port_combo = glade_xml_get_widget (dialog->gui, "port-combo"); - - g_signal_connect (GTK_COMBO(dialog->port_combo)->entry, "changed", - G_CALLBACK (modify_func), dialog); - g_signal_connect (GTK_COMBO(dialog->port_combo)->entry, "changed", - G_CALLBACK (port_changed_func), dialog); - dialog->ssl_optionmenu = glade_xml_get_widget (dialog->gui, "ssl-optionmenu"); - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU(dialog->ssl_optionmenu)); - gtk_container_foreach (GTK_CONTAINER (menu), (GtkCallback)add_ssl_activate_cb, dialog); -} - -static gboolean -connecting_tab_check (AddressbookSourceDialog *dialog) -{ - gboolean valid = TRUE; - const char *string; - - string = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO(dialog->port_combo)->entry)); - if (!string || !string[0]) - valid = FALSE; - - return valid; -} - - - -#ifdef HAVE_LDAP - -/* searching page */ -static ETableMemoryStoreColumnInfo bases_table_columns[] = { - E_TABLE_MEMORY_STORE_STRING, - E_TABLE_MEMORY_STORE_TERMINATOR -}; - -#define BASES_TABLE_SPEC \ -"<ETableSpecification cursor-mode=\"line\" no-headers=\"true\"> \ - <ETableColumn model_col= \"0\" _title=\"Base\" expansion=\"1.0\" minimum_width=\"20\" resizable=\"true\" cell=\"string\" compare=\"string\"/> \ - <ETableState> \ - <column source=\"0\"/> \ - <grouping></grouping> \ - </ETableState> \ -</ETableSpecification>" - -GtkWidget* -supported_bases_create_table (char *name, char *string1, char *string2, int num1, int num2) -{ - GtkWidget *table; - ETableModel *model; - - model = e_table_memory_store_new (bases_table_columns); - - table = e_table_scrolled_new (model, NULL, BASES_TABLE_SPEC, NULL); - - g_object_set_data (G_OBJECT (table), "model", model); - - return table; -} - -static gboolean -do_ldap_root_dse_query (AddressbookSourceDialog *sdialog, ETableModel *model, ESource *source, char ***rvalues) -{ - LDAP *ldap; - char *attrs[2]; - int ldap_error; - char **values; - LDAPMessage *resp; - int i; - - ldap = addressbook_ldap_init (sdialog->window, source); - if (!ldap) - return FALSE; - - if (LDAP_SUCCESS != addressbook_ldap_auth (sdialog->window, ldap)) - goto fail; - - attrs[0] = "namingContexts"; - attrs[1] = NULL; - - ldap_error = addressbook_root_dse_query (sdialog, ldap, attrs, &resp); - - if (ldap_error != LDAP_SUCCESS) - goto fail; - - values = ldap_get_values (ldap, resp, "namingContexts"); - if (!values || values[0] == NULL) { - e_error_run (GTK_WINDOW (sdialog->window), "addressbook:ldap-search-base", NULL); - goto fail; - } - - for (i = 0; values[i]; i++) - e_table_memory_store_insert (E_TABLE_MEMORY_STORE (model), - -1, GINT_TO_POINTER(i), values[i]); - - *rvalues = values; - - ldap_unbind_s (ldap); - return TRUE; - - fail: - ldap_unbind_s (ldap); - return FALSE; -} - -static void -search_base_selection_model_changed (ESelectionModel *selection_model, GtkWidget *dialog) -{ - gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), - GTK_RESPONSE_OK, - e_selection_model_selected_count (selection_model) == 1); -} - -static void -query_for_supported_bases (GtkWidget *button, AddressbookSourceDialog *sdialog) -{ - ESelectionModel *selection_model; - ESource *source; - GtkWidget *dialog; - GtkWidget *supported_bases_table; - ETableModel *model; - GladeXML *gui; - int id; - char **values; - - source = dialog_to_temp_source (sdialog); - - gui = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, "supported-bases-dialog", NULL); - dialog = glade_xml_get_widget (gui, "supported-bases-dialog"); - - gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (sdialog->window)); - gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); - - gtk_widget_ensure_style (dialog); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 0); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), 12); - - supported_bases_table = glade_xml_get_widget (gui, "supported-bases-table"); - gtk_widget_show (supported_bases_table); - selection_model = e_table_get_selection_model (e_table_scrolled_get_table (E_TABLE_SCROLLED(supported_bases_table))); - model = g_object_get_data (G_OBJECT (supported_bases_table), "model"); - - g_signal_connect (selection_model, "selection_changed", - G_CALLBACK (search_base_selection_model_changed), dialog); - - search_base_selection_model_changed (selection_model, dialog); - - if (do_ldap_root_dse_query (sdialog, model, source, &values)) { - gtk_widget_show (dialog); - - id = gtk_dialog_run (GTK_DIALOG (dialog)); - - gtk_widget_hide (dialog); - - if (id == GTK_RESPONSE_OK) { - int i; - /* OK was clicked */ - - /* ugh. */ - for (i = 0; values[i]; i ++) { - if (e_selection_model_is_row_selected (selection_model, i)) { - gtk_entry_set_text (GTK_ENTRY (sdialog->rootdn), values[i]); - break; /* single selection, so we can quit when we've found it. */ - } - } - } - - ldap_value_free (values); - - e_table_memory_store_clear (E_TABLE_MEMORY_STORE (model)); - } - - gtk_widget_destroy (dialog); - - g_object_unref (source); -} - -static void -scope_optionmenu_activated (GtkWidget *item, AddressbookSourceDialog *dialog) -{ - dialog->scope = g_list_index (gtk_container_get_children (GTK_CONTAINER (item->parent)), - item); - - if (dialog->searching_modify_func) - dialog->searching_modify_func (item, dialog); -} - -static void -add_scope_activate_cb (GtkWidget *item, AddressbookSourceDialog *dialog) -{ - g_signal_connect (item, "activate", - G_CALLBACK (scope_optionmenu_activated), dialog); -} - -static void -setup_searching_tab (AddressbookSourceDialog *dialog, ModifyFunc modify_func) -{ - GtkWidget *menu; - GtkWidget *rootdn_button; - - dialog->searching_modify_func = modify_func; - - - dialog->rootdn = glade_xml_get_widget (dialog->gui, "rootdn-entry"); - - if (modify_func) - g_signal_connect (dialog->rootdn, "changed", - G_CALLBACK (modify_func), dialog); - - dialog->scope_optionmenu = glade_xml_get_widget (dialog->gui, "scope-optionmenu"); - - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU(dialog->scope_optionmenu)); - gtk_container_foreach (GTK_CONTAINER (menu), (GtkCallback)add_scope_activate_cb, dialog); - - dialog->timeout_scale = glade_xml_get_widget (dialog->gui, "timeout-scale"); - - if (modify_func) - g_signal_connect (GTK_RANGE(dialog->timeout_scale)->adjustment, - "value_changed", - G_CALLBACK (modify_func), dialog); - - dialog->limit_spinbutton = glade_xml_get_widget (dialog->gui, "download-limit-spinbutton"); - if (modify_func) - g_signal_connect (dialog->limit_spinbutton, "changed", - G_CALLBACK (modify_func), dialog); - - /* special handling for the "Show Supported Bases button" */ - rootdn_button = glade_xml_get_widget (dialog->gui, "rootdn-button"); - g_signal_connect (rootdn_button, "clicked", - G_CALLBACK(query_for_supported_bases), dialog); -} - -static gboolean -searching_tab_check (AddressbookSourceDialog *dialog) -{ - gboolean valid = TRUE; - gdouble timeout = 3; - - timeout = gtk_adjustment_get_value (GTK_RANGE(dialog->timeout_scale)->adjustment); - - if(!timeout) - return FALSE; - return valid; -} - -#endif - - -/* display name page */ -static gboolean -display_name_check (AddressbookSourceDialog *dialog) -{ - gboolean valid = TRUE; - const char *string; - - string = gtk_entry_get_text (GTK_ENTRY (dialog->display_name)); - if (!string || !string[0]) - valid = FALSE; - - return valid; -} - - -static gboolean -source_group_is_remote (ESourceGroup *group) -{ - return !strcmp ("ldap://", e_source_group_peek_base_uri (group)); -} - -static void -add_folder_modify (GtkWidget *widget, AddressbookSourceDialog *sdialog) -{ - gboolean valid = TRUE; - gboolean remote = FALSE; - - valid = display_name_check (sdialog); - remote = source_group_is_remote (sdialog->source_group); - - - remote = source_group_is_remote (sdialog->source_group); - if (sdialog->server_frame) - gtk_widget_set_sensitive (sdialog->server_frame, remote); - - if (sdialog->auth_frame) - gtk_widget_set_sensitive (sdialog->auth_frame, remote); - -#ifdef HAVE_LDAP - gtk_widget_set_sensitive (sdialog->auth_principal, sdialog->auth != ADDRESSBOOK_LDAP_AUTH_NONE); - - if (valid) - valid = general_tab_check (sdialog); - if (valid) - valid = connecting_tab_check (sdialog); - - gtk_widget_set_sensitive (glade_xml_get_widget (sdialog->gui, "details-label"), valid && remote); - - gtk_widget_set_sensitive (glade_xml_get_widget (sdialog->gui, "details-vbox"), valid && remote); - - if (valid) - valid = searching_tab_check (sdialog); -#endif - - gtk_widget_set_sensitive (sdialog->ok_button, valid); -} - -static void -source_group_changed_cb (GtkWidget *widget, AddressbookSourceDialog *sdialog) -{ - sdialog->source_group = g_slist_nth (sdialog->menu_source_groups, - gtk_option_menu_get_history (GTK_OPTION_MENU (sdialog->group_optionmenu)))->data; - if (sdialog->auth_frame) - add_folder_modify (widget, sdialog); -} - -static void -source_group_menu_add_groups (GtkMenuShell *menu_shell, ESourceList *source_list) -{ - GSList *groups, *sl; - - groups = e_source_list_peek_groups (source_list); - for (sl = groups; sl; sl = g_slist_next (sl)) { - GtkWidget *menu_item; - ESourceGroup *group = sl->data; - -#ifndef HAVE_LDAP - /* If LDAP isn't configured, skip LDAP groups */ - if (!strcmp ("ldap://", e_source_group_peek_base_uri (group))) - continue; -#endif - menu_item = gtk_menu_item_new_with_label (e_source_group_peek_name (group)); - gtk_widget_show (menu_item); - gtk_menu_shell_append (menu_shell, menu_item); - - if (!strcmp ("exchange://", e_source_group_peek_base_uri (group))) - gtk_widget_set_sensitive (menu_item, FALSE); - - } -} - -static AddressbookSourceDialog * -addressbook_add_server_dialog (void) -{ - AddressbookSourceDialog *sdialog = g_new0 (AddressbookSourceDialog, 1); - GConfClient *gconf_client; - GSList *source_groups; - - sdialog->gui = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, "account-add-window", NULL); - - sdialog->window = glade_xml_get_widget (sdialog->gui, "account-add-window"); - - gtk_widget_ensure_style (sdialog->window); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (sdialog->window)->vbox), 0); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (sdialog->window)->action_area), 12); - - sdialog->display_name = glade_xml_get_widget (sdialog->gui, "display-name-entry"); - g_signal_connect (sdialog->display_name, "changed", - G_CALLBACK (add_folder_modify), sdialog); - - gconf_client = gconf_client_get_default (); - sdialog->source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/addressbook/sources"); - source_groups = e_source_list_peek_groups (sdialog->source_list); - sdialog->menu_source_groups = g_slist_copy (source_groups); -#ifndef HAVE_LDAP - for ( ; source_groups != NULL; source_groups = g_slist_next (source_groups)) - if (!strcmp ("ldap://", e_source_group_peek_base_uri (source_groups->data))) - sdialog->menu_source_groups = g_slist_remove (sdialog->menu_source_groups, source_groups->data); -#endif - - sdialog->group_optionmenu = glade_xml_get_widget (sdialog->gui, "group-optionmenu"); - if (!GTK_IS_MENU (gtk_option_menu_get_menu (GTK_OPTION_MENU (sdialog->group_optionmenu)))) { - GtkWidget *menu = gtk_menu_new (); - gtk_option_menu_set_menu (GTK_OPTION_MENU (sdialog->group_optionmenu), menu); - gtk_widget_show (menu); - } - - /* NOTE: This assumes that we have sources. If they don't exist, they're set up - * on startup of the Addressbook component. */ - source_group_menu_add_groups (GTK_MENU_SHELL (gtk_option_menu_get_menu ( - GTK_OPTION_MENU (sdialog->group_optionmenu))), sdialog->source_list); - gtk_option_menu_set_history (GTK_OPTION_MENU (sdialog->group_optionmenu), 0); - sdialog->source_group = e_source_list_peek_groups (sdialog->source_list)->data; - g_signal_connect (sdialog->group_optionmenu, "changed", - G_CALLBACK (source_group_changed_cb), sdialog); - - setup_general_tab (sdialog, add_folder_modify); -#ifdef HAVE_LDAP - setup_connecting_tab (sdialog, add_folder_modify); - - setup_searching_tab (sdialog, add_folder_modify); -#endif - - sdialog->auth_frame = glade_xml_get_widget (sdialog->gui, "authentication-frame"); - sdialog->server_frame = glade_xml_get_widget (sdialog->gui, "server-frame"); - - sdialog->ok_button = glade_xml_get_widget (sdialog->gui, "ok-button"); - g_signal_connect (sdialog->ok_button, "clicked", - G_CALLBACK(addressbook_add_server_dialog_finish), sdialog); - - sdialog->cancel_button = glade_xml_get_widget (sdialog->gui, "cancel-button"); - g_signal_connect (sdialog->cancel_button, "clicked", - G_CALLBACK(addressbook_add_server_dialog_cancel), sdialog); - - g_object_weak_ref (G_OBJECT (sdialog->window), - addressbook_source_dialog_destroy, sdialog); - - g_object_unref (gconf_client); - - /* make sure we fill in the default values */ - source_to_dialog (sdialog); - - gtk_window_set_type_hint (GTK_WINDOW (sdialog->window), GDK_WINDOW_TYPE_HINT_DIALOG); - - add_folder_modify (sdialog->window, sdialog); - - gtk_widget_show_all (sdialog->window); - - return sdialog; -} - -static void -editor_modify_cb (GtkWidget *item, AddressbookSourceDialog *dialog) -{ - gboolean valid = TRUE; - - valid = display_name_check (dialog); -#ifdef HAVE_LDAP - if (valid) - valid = general_tab_check (dialog); - if (valid) - valid = connecting_tab_check (dialog); - if (valid) - valid = searching_tab_check (dialog); -#endif - - gtk_widget_set_sensitive (dialog->ok_button, valid); -} - -static void -set_advanced_button_state (AddressbookSourceDialog *dialog) -{ - if (dialog->advanced) { - gtk_notebook_set_current_page (GTK_NOTEBOOK(dialog->advanced_button_notebook), 0); -#ifdef NEW_ADVANCED_UI - gtk_notebook_append_page (GTK_NOTEBOOK(dialog->notebook), dialog->objectclasses_tab, dialog->objectclasses_label); - gtk_notebook_append_page (GTK_NOTEBOOK(dialog->notebook), dialog->mappings_tab, dialog->mappings_label); - gtk_notebook_append_page (GTK_NOTEBOOK(dialog->notebook), dialog->dn_customization_tab, dialog->dn_customization_label); -#endif - } - else { -#ifdef NEW_ADVANCED_UI - gtk_notebook_set_current_page (GTK_NOTEBOOK(dialog->advanced_button_notebook), 1); - - /* hide the advanced tabs of the main notebook */ - gtk_notebook_remove_page (GTK_NOTEBOOK(dialog->notebook), 5); - gtk_notebook_remove_page (GTK_NOTEBOOK(dialog->notebook), 4); - gtk_notebook_remove_page (GTK_NOTEBOOK(dialog->notebook), 3); -#endif - } -} - -#ifdef NEW_ADVANCED_UI -static void -advanced_button_clicked (GtkWidget *button, AddressbookSourceDialog *dialog) -{ - dialog->advanced = !dialog->advanced; - set_advanced_button_state (dialog); -} - -static gboolean -do_schema_query (AddressbookSourceDialog *sdialog) -{ - LDAP *ldap; - int ldap_error; - char *schema_dn; - char *attrs[3]; - char **values; - int i; - AddressbookSource *source = addressbook_dialog_get_source (sdialog); - LDAPMessage *resp; - struct timeval timeout; - - ldap = addressbook_ldap_init (sdialog->window, source); - if (!ldap) - goto fail; - - if (LDAP_SUCCESS != addressbook_ldap_auth (sdialog->window, source, ldap)) - goto fail; - - attrs[0] = "subschemaSubentry"; - attrs[1] = NULL; - - ldap_error = addressbook_root_dse_query (sdialog->window, source, ldap, attrs, &resp); - - if (ldap_error != LDAP_SUCCESS) - goto fail; - - values = ldap_get_values (ldap, resp, "subschemaSubentry"); - if (!values || values[0] == NULL) { - e_error_run ((GtkWindow *) sdialog->window, "addressbook:ldap-v3-schema", NULL); - goto fail; - } - - schema_dn = g_strdup (values[0]); - - ldap_value_free (values); - ldap_msgfree (resp); - - attrs[0] = "objectClasses"; - attrs[1] = NULL; - - timeout.tv_sec = (gint) gtk_adjustment_get_value (GTK_RANGE(sdialog->timeout_scale)->adjustment); - timeout.tv_usec = 0; - - ldap_error = ldap_search_ext_s (ldap, schema_dn, LDAP_SCOPE_BASE, - "(objectClass=subschema)", attrs, 0, - NULL, NULL, &timeout, LDAP_NO_LIMIT, &resp); - if (LDAP_SUCCESS != ldap_error) { - e_error_run ((GtkWindow *) sdialog->window, "addressbook:ldap-get-schema", NULL); - goto fail; - } - - if (!(values = ldap_get_values (ldap, resp, "objectClasses"))) { - e_error_run ((GtkWindow *) sdialog->window, "addressbook:ldap-invalid-schema", NULL); - goto fail; - } - - for (i = 0; values[i]; i ++) { - int j; - int code; - const char *err; - LDAPObjectClass *oc = ldap_str2objectclass (values[i], &code, &err, 0); - - if (!oc) - continue; - - /* we fill in the default list of classes here */ - for (j = 0; oc->oc_names[j]; j ++) { - if (!g_strcasecmp (oc->oc_names[j], EVOLUTIONPERSON) || - !g_strcasecmp (oc->oc_names[j], INETORGPERSON) || - !g_strcasecmp (oc->oc_names[j], ORGANIZATIONALPERSON) || - !g_strcasecmp (oc->oc_names[j], PERSON) || - !g_strcasecmp (oc->oc_names[j], CALENTRY) || - !g_strcasecmp (oc->oc_names[j], TOP)) - g_ptr_array_add (sdialog->default_objectclasses, oc); - } - - g_ptr_array_add (sdialog->server_objectclasses, oc); - } - - addressbook_source_free (source); - ldap_unbind_s (ldap); - return TRUE; - - fail: - addressbook_source_free (source); - if (ldap) - ldap_unbind_s (ldap); - return FALSE; -} - -static void -edit_dialog_switch_page (GtkNotebook *notebook, - GtkNotebookPage *page, guint page_num, - AddressbookSourceDialog *sdialog) -{ - if (page_num >= 3 && !sdialog->schema_query_successful) { - int i; - - gtk_widget_set_sensitive (GTK_WIDGET (notebook), FALSE); - - sdialog->schema_query_successful = do_schema_query (sdialog); - - if (sdialog->schema_query_successful) { - /* fill in the objectclasses model */ - for (i = 0; i < sdialog->server_objectclasses->len; i ++) { - LDAPObjectClass *oc = g_ptr_array_index (sdialog->server_objectclasses, i); - e_table_memory_store_insert (E_TABLE_MEMORY_STORE (sdialog->objectclasses_server_model), - -1, oc, oc->oc_names[0]); - } - gtk_widget_set_sensitive (page->child, TRUE); - } - else { - gtk_widget_set_sensitive (page->child, FALSE); - } - - gtk_widget_set_sensitive (GTK_WIDGET (notebook), TRUE); - } -} -#endif - -static gboolean -edit_dialog_store_change (AddressbookSourceDialog *sdialog) -{ - dialog_to_source (sdialog, sdialog->source, FALSE); - - /* check the display name for uniqueness */ - if (FALSE /* XXX */) { - return FALSE; - } - - return TRUE; -} - -static void -edit_dialog_cancel_clicked (GtkWidget *item, AddressbookSourceDialog *sdialog) -{ - gtk_widget_destroy (sdialog->window); -} - -static void -edit_dialog_ok_clicked (GtkWidget *item, AddressbookSourceDialog *sdialog) -{ - if (edit_dialog_store_change (sdialog)) { - gtk_widget_destroy (sdialog->window); - } -} - -GtkWidget* -addressbook_config_edit_source (GtkWidget *parent, ESource *source) -{ - AddressbookSourceDialog *sdialog = g_new0 (AddressbookSourceDialog, 1); - GConfClient *gconf_client; - - gconf_client = gconf_client_get_default (); - sdialog->source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/addressbook/sources"); - g_object_unref (gconf_client); - - sdialog->gui = glade_xml_new (EVOLUTION_GLADEDIR "/" GLADE_FILE_NAME, "account-editor-window", NULL); - sdialog->window = glade_xml_get_widget (sdialog->gui, "account-editor-window"); - gtk_widget_realize (sdialog->window); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (sdialog->window)->vbox), 0); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (sdialog->window)->action_area), 12); - - sdialog->source = source; - sdialog->source_group = e_source_peek_group (source); - - sdialog->display_name = glade_xml_get_widget (sdialog->gui, "account-editor-display-name-entry"); - g_signal_connect (sdialog->display_name, "changed", - G_CALLBACK (editor_modify_cb), sdialog); - - setup_general_tab (sdialog, editor_modify_cb); -#ifdef HAVE_LDAP - setup_connecting_tab (sdialog, editor_modify_cb); - - setup_searching_tab (sdialog, editor_modify_cb); -#endif - - sdialog->notebook = glade_xml_get_widget (sdialog->gui, "account-editor-notebook"); - - sdialog->ok_button = glade_xml_get_widget (sdialog->gui, "account-editor-ok-button"); - sdialog->cancel_button = glade_xml_get_widget (sdialog->gui, "account-editor-cancel-button"); - -#ifdef HAVE_LDAP - if (strcmp ("ldap://", e_source_group_peek_base_uri (sdialog->source_group))) { - gtk_widget_hide (glade_xml_get_widget (sdialog->gui, "account-editor-connecting-vbox")); - gtk_widget_hide (glade_xml_get_widget (sdialog->gui, "account-editor-searching-vbox")); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (sdialog->notebook), FALSE); - gtk_notebook_set_show_border (GTK_NOTEBOOK (sdialog->notebook), FALSE); - gtk_container_set_border_width (GTK_CONTAINER (glade_xml_get_widget (sdialog->gui, "account-editor-general-vbox")), 0); - gtk_window_set_default_size (GTK_WINDOW (sdialog->window), 332, 124); - } else { - gtk_widget_show (glade_xml_get_widget (sdialog->gui, "account-editor-connecting-vbox")); - gtk_widget_show (glade_xml_get_widget (sdialog->gui, "account-editor-searching-vbox")); - } -#else - gtk_widget_hide (glade_xml_get_widget (sdialog->gui, "account-editor-connecting-vbox")); - gtk_widget_hide (glade_xml_get_widget (sdialog->gui, "account-editor-searching-vbox")); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (sdialog->notebook), FALSE); - gtk_notebook_set_show_border (GTK_NOTEBOOK (sdialog->notebook), FALSE); - gtk_container_set_border_width (GTK_CONTAINER (glade_xml_get_widget (sdialog->gui, "account-editor-general-vbox")), 0); -#endif - - source_to_dialog (sdialog); - - set_advanced_button_state (sdialog); - - g_signal_connect (sdialog->ok_button, - "clicked", G_CALLBACK(edit_dialog_ok_clicked), sdialog); - g_signal_connect (sdialog->cancel_button, - "clicked", G_CALLBACK(edit_dialog_cancel_clicked), sdialog); - g_object_weak_ref (G_OBJECT (sdialog->window), - addressbook_source_dialog_destroy, sdialog); - - gtk_widget_set_sensitive (sdialog->ok_button, FALSE); - - gtk_widget_show (sdialog->window); - - return sdialog->window; -} - -GtkWidget* -addressbook_config_create_new_source (GtkWidget *parent) -{ - AddressbookSourceDialog *dialog; - - dialog = addressbook_add_server_dialog (); - - return dialog->window; -} diff --git a/addressbook/gui/component/addressbook-config.h b/addressbook/gui/component/addressbook-config.h deleted file mode 100644 index 8818fd08d7..0000000000 --- a/addressbook/gui/component/addressbook-config.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* addressbook-storage.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Authors: - * Chris Toshok <toshok@ximian.com> - * Chris Lahey <clahey@ximian.com> - **/ - -#ifndef __ADDRESSBOOK_CONFIG_H__ -#define __ADDRESSBOOK_CONFIG_H__ - -#include "evolution-config-control.h" - -typedef enum { - ADDRESSBOOK_LDAP_AUTH_NONE, - ADDRESSBOOK_LDAP_AUTH_SIMPLE_EMAIL, - ADDRESSBOOK_LDAP_AUTH_SIMPLE_BINDDN, -} AddressbookLDAPAuthType; - -typedef enum { - ADDRESSBOOK_LDAP_SCOPE_ONELEVEL, - ADDRESSBOOK_LDAP_SCOPE_SUBTREE, - ADDRESSBOOK_LDAP_SCOPE_BASE, - ADDRESSBOOK_LDAP_SCOPE_LAST -} AddressbookLDAPScopeType; - -typedef enum { - ADDRESSBOOK_LDAP_SSL_ALWAYS, - ADDRESSBOOK_LDAP_SSL_WHENEVER_POSSIBLE, - ADDRESSBOOK_LDAP_SSL_NEVER -} AddressbookLDAPSSLType; - -GtkWidget* addressbook_config_edit_source (GtkWidget *parent, ESource *source); -GtkWidget* addressbook_config_create_new_source (GtkWidget *parent); - -#endif /* __ADDRESSBOOK_CONFIG_H__ */ diff --git a/addressbook/gui/component/addressbook-migrate.c b/addressbook/gui/component/addressbook-migrate.c deleted file mode 100644 index 087a867dbb..0000000000 --- a/addressbook/gui/component/addressbook-migrate.c +++ /dev/null @@ -1,1201 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Copyright (C) 2004, Novell, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Chris Toshok (toshok@ximian.com) - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <glib.h> -#include <string.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> -#include <dirent.h> -#include <fcntl.h> -#include <errno.h> - -#include "addressbook-migrate.h" -#include "e-destination.h" -#include <libebook/e-book.h> -#include <libgnome/gnome-i18n.h> -#include <gal/util/e-util.h> -#include <gal/util/e-xml-utils.h> -#include <gtk/gtkwidget.h> -#include <gtk/gtkvbox.h> -#include <gtk/gtkmain.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkprogressbar.h> -#include <e-util/e-folder-map.h> - -/*#define SLOW_MIGRATION*/ - -typedef struct { - /* this hash table maps old folder uris to new uids. It's - build in migrate_contact_folder and it's used in - migrate_completion_folders. */ - GHashTable *folder_uid_map; - - ESourceList *source_list; - - AddressbookComponent *component; - - GtkWidget *window; - GtkWidget *label; - GtkWidget *folder_label; - GtkWidget *progress; -} MigrationContext; - -static void -setup_progress_dialog (MigrationContext *context) -{ - GtkWidget *vbox, *hbox; - - context->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - gtk_window_set_title (GTK_WINDOW (context->window), _("Migrating...")); - gtk_window_set_modal (GTK_WINDOW (context->window), TRUE); - gtk_container_set_border_width (GTK_CONTAINER (context->window), 6); - - vbox = gtk_vbox_new (FALSE, 6); - gtk_widget_show (vbox); - gtk_container_add (GTK_CONTAINER (context->window), vbox); - - context->label = gtk_label_new (""); - gtk_label_set_line_wrap (GTK_LABEL (context->label), TRUE); - gtk_widget_show (context->label); - gtk_box_pack_start_defaults (GTK_BOX (vbox), context->label); - - hbox = gtk_hbox_new (FALSE, 6); - gtk_widget_show (hbox); - gtk_box_pack_start_defaults (GTK_BOX (vbox), hbox); - - context->folder_label = gtk_label_new (""); - gtk_widget_show (context->folder_label); - gtk_box_pack_start_defaults (GTK_BOX (hbox), context->folder_label); - - context->progress = gtk_progress_bar_new (); - gtk_widget_show (context->progress); - gtk_box_pack_start_defaults (GTK_BOX (hbox), context->progress); - - gtk_widget_show (context->window); -} - -static void -dialog_close (MigrationContext *context) -{ - gtk_widget_destroy (context->window); -} - -static void -dialog_set_label (MigrationContext *context, const char *str) -{ - gtk_label_set_text (GTK_LABEL (context->label), str); - - while (gtk_events_pending ()) - gtk_main_iteration (); - -#ifdef SLOW_MIGRATION - sleep (1); -#endif -} - -static void -dialog_set_folder_name (MigrationContext *context, const char *folder_name) -{ - char *text; - - text = g_strdup_printf (_("Migrating `%s':"), folder_name); - gtk_label_set_text (GTK_LABEL (context->folder_label), text); - g_free (text); - - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (context->progress), 0.0); - - while (gtk_events_pending ()) - gtk_main_iteration (); - -#ifdef SLOW_MIGRATION - sleep (1); -#endif -} - -static void -dialog_set_progress (MigrationContext *context, double percent) -{ - char text[5]; - - snprintf (text, sizeof (text), "%d%%", (int) (percent * 100.0f)); - - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (context->progress), percent); - gtk_progress_bar_set_text (GTK_PROGRESS_BAR (context->progress), text); - - while (gtk_events_pending ()) - gtk_main_iteration (); - -#ifdef SLOW_MIGRATION - sleep (1); -#endif -} - -static gboolean -check_for_conflict (ESourceGroup *group, char *name) -{ - GSList *sources; - GSList *s; - - sources = e_source_group_peek_sources (group); - - for (s = sources; s; s = s->next) { - ESource *source = E_SOURCE (s->data); - - if (!strcmp (e_source_peek_name (source), name)) - return TRUE; - } - - return FALSE; -} - -static char * -get_source_name (ESourceGroup *group, const char *path) -{ - char **p = g_strsplit (path, "/", 0); - int i, j, starting_index; - int num_elements; - gboolean conflict; - GString *s = g_string_new (""); - - for (i = 0; p[i]; i ++) ; - - num_elements = i; - i--; - - /* p[i] is now the last path element */ - - /* check if it conflicts */ - starting_index = i; - do { - g_string_assign (s, ""); - for (j = starting_index; j < num_elements; j += 2) { - if (j != starting_index) - g_string_append_c (s, '_'); - g_string_append (s, p[j]); - } - - conflict = check_for_conflict (group, s->str); - - - /* if there was a conflict back up 2 levels (skipping the /subfolder/ element) */ - if (conflict) - starting_index -= 2; - - /* we always break out if we can't go any further, - regardless of whether or not we conflict. */ - if (starting_index < 0) - break; - - } while (conflict); - - return g_string_free (s, FALSE); -} - -static void -add_to_notes (EContact *contact, EContactField field) -{ - const gchar *old_text; - const gchar *field_text; - gchar *new_text; - - old_text = e_contact_get_const (contact, E_CONTACT_NOTE); - if (old_text && strstr (old_text, e_contact_pretty_name (field))) - return; - - field_text = e_contact_get_const (contact, field); - if (!field_text || !*field_text) - return; - - new_text = g_strdup_printf ("%s%s%s: %s", - old_text ? old_text : "", - old_text && *old_text && - *(old_text + strlen (old_text) - 1) != '\n' ? "\n" : "", - e_contact_pretty_name (field), field_text); - e_contact_set (contact, E_CONTACT_NOTE, new_text); - g_free (new_text); -} - -static void -migrate_contacts (MigrationContext *context, EBook *old_book, EBook *new_book) -{ - EBookQuery *query = e_book_query_any_field_contains (""); - GList *l, *contacts; - int num_added = 0; - int num_contacts; - - /* both books are loaded, start the actual migration */ - e_book_get_contacts (old_book, query, &contacts, NULL); - - num_contacts = g_list_length (contacts); - for (l = contacts; l; l = l->next) { - EContact *contact = l->data; - GError *e = NULL; - GList *attrs, *attr; - - /* do some last minute massaging of the contact's attributes */ - - attrs = e_vcard_get_attributes (E_VCARD (contact)); - for (attr = attrs; attr;) { - EVCardAttribute *a = attr->data; - - /* evo 1.4 used the non-standard X-EVOLUTION-OFFICE attribute, - evo 1.5 uses the third element in the ORG list attribute. */ - if (!strcmp ("X-EVOLUTION-OFFICE", e_vcard_attribute_get_name (a))) { - GList *v = e_vcard_attribute_get_values (a); - GList *next_attr; - - if (v && v->data) - e_contact_set (contact, E_CONTACT_OFFICE, v->data); - - next_attr = attr->next; - e_vcard_remove_attribute (E_VCARD (contact), a); - attr = next_attr; - } - /* evo 1.4 didn't put TYPE=VOICE in for phone numbers. - evo 1.5 does. - - so we search through the attribute params for - either TYPE=VOICE or TYPE=FAX. If we find - either we do nothing. If we find neither, we - add TYPE=VOICE. - */ - else if (!strcmp ("TEL", e_vcard_attribute_get_name (a))) { - GList *params, *param; - gboolean found = FALSE; - - params = e_vcard_attribute_get_params (a); - for (param = params; param; param = param->next) { - EVCardAttributeParam *p = param->data; - if (!strcmp (EVC_TYPE, e_vcard_attribute_param_get_name (p))) { - GList *v = e_vcard_attribute_param_get_values (p); - if (v && v->data) - if (!strcmp ("VOICE", v->data) - || !strcmp ("FAX", v->data)) - found = TRUE; - } - } - - if (!found) - e_vcard_attribute_add_param_with_value (a, - e_vcard_attribute_param_new (EVC_TYPE), - "VOICE"); - attr = attr->next; - } - /* Replace "POSTAL" (1.4) addresses with "OTHER" (1.5) */ - else if (!strcmp ("ADR", e_vcard_attribute_get_name (a))) { - GList *params, *param; - gboolean found = FALSE; - EVCardAttributeParam *p; - - params = e_vcard_attribute_get_params (a); - for (param = params; param; param = param->next) { - p = param->data; - if (!strcmp (EVC_TYPE, e_vcard_attribute_param_get_name (p))) { - GList *v = e_vcard_attribute_param_get_values (p); - if (v && v->data && !strcmp ("POSTAL", v->data)) { - found = TRUE; - break; - } - } - } - - if (found) { - e_vcard_attribute_param_remove_values (p); - e_vcard_attribute_param_add_value (p, "OTHER"); - } - - attr = attr->next; - } - /* this is kinda gross. The new vcard parser - needs ';'s to be escaped by \'s. but the - 1.4 vcard generator would put unescaped xml - (including entities like >) in the value - of attributes, so we need to go through and - escape those ';'s. */ - else if (!strcmp ("EMAIL", e_vcard_attribute_get_name (a))) { - GList *v = e_vcard_attribute_get_values (a); - - if (v && v->data) { - if (!strncmp ((char*)v->data, "<?xml", 5)) { - /* k, this is the nasty part. we glomb all the - value strings back together again (if there is - more than one), then work our magic */ - GString *str = g_string_new (""); - while (v) { - g_string_append (str, v->data); - if (v->next) - g_string_append_c (str, ';'); - v = v->next; - } - - e_vcard_attribute_remove_values (a); - e_vcard_attribute_add_value (a, str->str); - g_string_free (str, TRUE); - } - } - - attr = attr->next; - } - else { - attr = attr->next; - } - } - - if (!e_book_add_contact (new_book, - contact, - &e)) - g_warning ("contact add failed: `%s'", e->message); - - num_added ++; - - dialog_set_progress (context, (double)num_added / num_contacts); - } - - g_list_foreach (contacts, (GFunc)g_object_unref, NULL); - g_list_free (contacts); -} - -static void -migrate_contact_folder_to_source (MigrationContext *context, char *old_path, ESource *new_source) -{ - char *old_uri = g_strdup_printf ("file://%s", old_path); - GError *e = NULL; - - EBook *old_book = NULL, *new_book = NULL; - ESource *old_source; - ESourceGroup *group; - - group = e_source_group_new ("", old_uri); - old_source = e_source_new ("", ""); - e_source_group_add_source (group, old_source, -1); - - dialog_set_folder_name (context, e_source_peek_name (new_source)); - - old_book = e_book_new (old_source, &e); - if (!old_book - || !e_book_open (old_book, TRUE, &e)) { - g_warning ("failed to load source book for migration: `%s'", e->message); - goto finish; - } - - new_book = e_book_new (new_source, &e); - if (!new_book - || !e_book_open (new_book, FALSE, &e)) { - g_warning ("failed to load destination book for migration: `%s'", e->message); - goto finish; - } - - migrate_contacts (context, old_book, new_book); - - finish: - g_object_unref (old_source); - g_object_unref (group); - if (old_book) - g_object_unref (old_book); - if (new_book) - g_object_unref (new_book); - g_free (old_uri); -} - -static void -migrate_contact_folder (MigrationContext *context, char *old_path, ESourceGroup *dest_group, char *source_name) -{ - ESource *new_source; - - new_source = e_source_new (source_name, source_name); - e_source_set_relative_uri (new_source, e_source_peek_uid (new_source)); - e_source_group_add_source (dest_group, new_source, -1); - - g_hash_table_insert (context->folder_uid_map, g_strdup (old_path), g_strdup (e_source_peek_uid (new_source))); - - migrate_contact_folder_to_source (context, old_path, new_source); - - g_object_unref (new_source); -} - -#define LDAP_BASE_URI "ldap://" -#define PERSONAL_RELATIVE_URI "system" - -static void -create_groups (MigrationContext *context, - ESourceGroup **on_this_computer, - ESourceGroup **on_ldap_servers, - ESource **personal_source) -{ - GSList *groups; - ESourceGroup *group; - char *base_uri, *base_uri_proto; - - *on_this_computer = NULL; - *on_ldap_servers = NULL; - *personal_source = NULL; - - base_uri = g_build_filename (addressbook_component_peek_base_directory (context->component), - "addressbook", "local", - NULL); - - base_uri_proto = g_strconcat ("file://", base_uri, NULL); - - groups = e_source_list_peek_groups (context->source_list); - if (groups) { - /* groups are already there, we need to search for things... */ - GSList *g; - - for (g = groups; g; g = g->next) { - - group = E_SOURCE_GROUP (g->data); - - if (!*on_this_computer && !strcmp (base_uri_proto, e_source_group_peek_base_uri (group))) - *on_this_computer = g_object_ref (group); - else if (!*on_ldap_servers && !strcmp (LDAP_BASE_URI, e_source_group_peek_base_uri (group))) - *on_ldap_servers = g_object_ref (group); - } - } - - if (*on_this_computer) { - /* make sure "Personal" shows up as a source under - this group */ - GSList *sources = e_source_group_peek_sources (*on_this_computer); - GSList *s; - for (s = sources; s; s = s->next) { - ESource *source = E_SOURCE (s->data); - if (!strcmp (PERSONAL_RELATIVE_URI, e_source_peek_relative_uri (source))) { - *personal_source = g_object_ref (source); - break; - } - } - } - else { - /* create the local source group */ - group = e_source_group_new (_("On This Computer"), base_uri_proto); - e_source_list_add_group (context->source_list, group, -1); - - *on_this_computer = group; - } - - if (!*personal_source) { - /* Create the default Person addressbook */ - ESource *source = e_source_new (_("Personal"), PERSONAL_RELATIVE_URI); - e_source_group_add_source (*on_this_computer, source, -1); - - *personal_source = source; - } - - if (!*on_ldap_servers) { - /* Create the LDAP source group */ - group = e_source_group_new (_("On LDAP Servers"), LDAP_BASE_URI); - e_source_list_add_group (context->source_list, group, -1); - - *on_ldap_servers = group; - } - - g_free (base_uri_proto); - g_free (base_uri); -} - -static gboolean -migrate_local_folders (MigrationContext *context, ESourceGroup *on_this_computer, ESource *personal_source) -{ - char *old_path = NULL; - GSList *dirs, *l; - char *local_contact_folder = NULL; - - old_path = g_strdup_printf ("%s/evolution/local", g_get_home_dir ()); - - dirs = e_folder_map_local_folders (old_path, "contacts"); - - /* migrate the local addressbook first, to local/system */ - local_contact_folder = g_build_filename (g_get_home_dir (), - "evolution", "local", "Contacts", - NULL); - - for (l = dirs; l; l = l->next) { - char *source_name; - /* we handle the system folder differently */ - if (personal_source && !strcmp ((char*)l->data, local_contact_folder)) { - g_hash_table_insert (context->folder_uid_map, g_strdup (l->data), g_strdup (e_source_peek_uid (personal_source))); - migrate_contact_folder_to_source (context, local_contact_folder, personal_source); - continue; - } - - source_name = get_source_name (on_this_computer, (char*)l->data); - migrate_contact_folder (context, l->data, on_this_computer, source_name); - g_free (source_name); - } - - g_slist_foreach (dirs, (GFunc)g_free, NULL); - g_slist_free (dirs); - g_free (local_contact_folder); - g_free (old_path); - - return TRUE; -} - -static char * -get_string_child (xmlNode *node, - const char *name) -{ - xmlNode *p; - xmlChar *xml_string; - char *retval; - - p = e_xml_get_child_by_name (node, (xmlChar *) name); - if (p == NULL) - return NULL; - - p = e_xml_get_child_by_name (p, (xmlChar *) "text"); - if (p == NULL) /* there's no text between the tags, return the empty string */ - return g_strdup(""); - - xml_string = xmlNodeListGetString (node->doc, p, 1); - retval = g_strdup ((char *) xml_string); - xmlFree (xml_string); - - return retval; -} - -static int -get_integer_child (xmlNode *node, - const char *name, - int defval) -{ - xmlNode *p; - xmlChar *xml_string; - int retval; - - p = e_xml_get_child_by_name (node, (xmlChar *) name); - if (p == NULL) - return defval; - - p = e_xml_get_child_by_name (p, (xmlChar *) "text"); - if (p == NULL) /* there's no text between the tags, return the default */ - return defval; - - xml_string = xmlNodeListGetString (node->doc, p, 1); - retval = atoi (xml_string); - xmlFree (xml_string); - - return retval; -} - -static gboolean -migrate_ldap_servers (MigrationContext *context, ESourceGroup *on_ldap_servers) -{ - char *sources_xml = g_strdup_printf ("%s/evolution/addressbook-sources.xml", - g_get_home_dir ()); - - printf ("trying to migrate from %s\n", sources_xml); - - if (g_file_test (sources_xml, G_FILE_TEST_EXISTS)) { - xmlDoc *doc = xmlParseFile (sources_xml); - xmlNode *root; - xmlNode *child; - int num_contactservers; - int servernum; - - if (!doc) - return FALSE; - - root = xmlDocGetRootElement (doc); - if (root == NULL || strcmp (root->name, "addressbooks") != 0) { - xmlFreeDoc (doc); - return FALSE; - } - - /* count the number of servers, so we can give progress */ - num_contactservers = 0; - for (child = root->children; child; child = child->next) { - if (!strcmp (child->name, "contactserver")) { - num_contactservers++; - } - } - printf ("found %d contact servers to migrate\n", num_contactservers); - - dialog_set_folder_name (context, _("LDAP Servers")); - - servernum = 0; - for (child = root->children; child; child = child->next) { - if (!strcmp (child->name, "contactserver")) { - char *port, *host, *rootdn, *scope, *authmethod, *ssl; - char *emailaddr, *binddn, *limitstr; - int limit; - char *name, *description; - GString *uri = g_string_new (""); - ESource *source; - - name = get_string_child (child, "name"); - description = get_string_child (child, "description"); - port = get_string_child (child, "port"); - host = get_string_child (child, "host"); - rootdn = get_string_child (child, "rootdn"); - scope = get_string_child (child, "scope"); - authmethod = get_string_child (child, "authmethod"); - ssl = get_string_child (child, "ssl"); - emailaddr = get_string_child (child, "emailaddr"); - binddn = get_string_child (child, "binddn"); - limit = get_integer_child (child, "limit", 100); - limitstr = g_strdup_printf ("%d", limit); - - g_string_append_printf (uri, - "%s:%s/%s?"/*trigraph prevention*/"?%s", - host, port, rootdn, scope); - - source = e_source_new (name, uri->str); - e_source_set_property (source, "description", description); - e_source_set_property (source, "limit", limitstr); - e_source_set_property (source, "ssl", ssl); - e_source_set_property (source, "auth", authmethod); - if (emailaddr) - e_source_set_property (source, "email_addr", emailaddr); - if (binddn) - e_source_set_property (source, "binddn", binddn); - - e_source_group_add_source (on_ldap_servers, source, -1); - - g_string_free (uri, TRUE); - g_free (port); - g_free (host); - g_free (rootdn); - g_free (scope); - g_free (authmethod); - g_free (ssl); - g_free (emailaddr); - g_free (binddn); - g_free (limitstr); - g_free (name); - g_free (description); - - servernum++; - dialog_set_progress (context, (double)servernum/num_contactservers); - } - } - - xmlFreeDoc (doc); - } - - g_free (sources_xml); - - return TRUE; -} - -static ESource* -get_source_by_name (ESourceList *source_list, const char *name) -{ - GSList *groups; - GSList *g; - - groups = e_source_list_peek_groups (source_list); - if (!groups) - return NULL; - - for (g = groups; g; g = g->next) { - GSList *sources; - GSList *s; - ESourceGroup *group = E_SOURCE_GROUP (g->data); - - sources = e_source_group_peek_sources (group); - if (!sources) - continue; - - for (s = sources; s; s = s->next) { - ESource *source = E_SOURCE (s->data); - const char *source_name = e_source_peek_name (source); - - if (!strcmp (name, source_name)) - return source; - } - } - - return NULL; -} - -static gboolean -migrate_completion_folders (MigrationContext *context) -{ - char *uris_xml = gconf_client_get_string (addressbook_component_peek_gconf_client (context->component), - "/apps/evolution/addressbook/completion/uris", - NULL); - - printf ("trying to migrate completion folders\n"); - - if (uris_xml) { - xmlDoc *doc = xmlParseMemory (uris_xml, strlen (uris_xml)); - xmlNode *root; - xmlNode *child; - - if (!doc) - return FALSE; - - dialog_set_folder_name (context, _("Autocompletion Settings")); - - root = xmlDocGetRootElement (doc); - if (root == NULL || strcmp (root->name, "EvolutionFolderList") != 0) { - xmlFreeDoc (doc); - return FALSE; - } - - for (child = root->children; child; child = child->next) { - if (!strcmp (child->name, "folder")) { - char *physical_uri = e_xml_get_string_prop_by_name (child, "physical-uri"); - ESource *source = NULL; - - /* if the physical uri is file://... - we look it up in our folder_uid_map - hashtable. If it's a folder we - converted over, we should get back - a uid we can search for. - - if the physical_uri is anything - else, we strip off the args - (anything after ;) before searching - for the uri. */ - - if (!strncmp (physical_uri, "file://", 7)) { - char *uid = g_hash_table_lookup (context->folder_uid_map, - physical_uri + 7); - - if (uid) - source = e_source_list_peek_source_by_uid (context->source_list, uid); - } - else { - char *name = e_xml_get_string_prop_by_name (child, "display-name"); - - source = get_source_by_name (context->source_list, name); - - g_free (name); - } - - if (source) { - e_source_set_property (source, "completion", "true"); - } - else { - g_warning ("found completion folder with uri `%s' that " - "doesn't correspond to anything we migrated.", physical_uri); - } - - g_free (physical_uri); - } - } - - g_free (uris_xml); - } - else { - g_message ("no completion folder settings to migrate"); - } - - return TRUE; -} - -static void -migrate_contact_lists_for_local_folders (MigrationContext *context, ESourceGroup *on_this_computer) -{ - GSList *sources, *s; - - sources = e_source_group_peek_sources (on_this_computer); - for (s = sources; s; s = s->next) { - ESource *source = s->data; - EBook *book; - EBookQuery *query; - GList *l, *contacts; - int num_contacts, num_converted; - - dialog_set_folder_name (context, e_source_peek_name (source)); - - book = e_book_new (source, NULL); - if (!book - || !e_book_open (book, TRUE, NULL)) { - char *uri = e_source_get_uri (source); - g_warning ("failed to migrate contact lists for source %s", uri); - g_free (uri); - continue; - } - - query = e_book_query_any_field_contains (""); - - e_book_get_contacts (book, query, &contacts, NULL); - - num_converted = 0; - num_contacts = g_list_length (contacts); - for (l = contacts; l; l = l->next) { - EContact *contact = l->data; - GError *e = NULL; - GList *attrs, *attr; - gboolean converted = FALSE; - - attrs = e_contact_get_attributes (contact, E_CONTACT_EMAIL); - for (attr = attrs; attr; attr = attr->next) { - EVCardAttribute *a = attr->data; - GList *v = e_vcard_attribute_get_values (a); - - if (v && v->data) { - if (!strncmp ((char*)v->data, "<?xml", 5)) { - EDestination *dest = e_destination_import ((char*)v->data); - - e_destination_export_to_vcard_attribute (dest, a); - - g_object_unref (dest); - - converted = TRUE; - } - } - } - - if (converted) { - e_contact_set_attributes (contact, E_CONTACT_EMAIL, attrs); - - if (!e_book_commit_contact (book, - contact, - &e)) - g_warning ("contact commit failed: `%s'", e->message); - } - - num_converted ++; - - dialog_set_progress (context, (double)num_converted / num_contacts); - } - - g_list_foreach (contacts, (GFunc)g_object_unref, NULL); - g_list_free (contacts); - - g_object_unref (book); - } -} - -static void -migrate_company_phone_for_local_folders (MigrationContext *context, ESourceGroup *on_this_computer) -{ - GSList *sources, *s; - - sources = e_source_group_peek_sources (on_this_computer); - for (s = sources; s; s = s->next) { - ESource *source = s->data; - EBook *book; - EBookQuery *query; - GList *l, *contacts; - int num_contacts, num_converted; - - dialog_set_folder_name (context, e_source_peek_name (source)); - - book = e_book_new (source, NULL); - if (!book - || !e_book_open (book, TRUE, NULL)) { - char *uri = e_source_get_uri (source); - g_warning ("failed to migrate company phone numbers for source %s", uri); - g_free (uri); - continue; - } - - query = e_book_query_any_field_contains (""); - - e_book_get_contacts (book, query, &contacts, NULL); - - num_converted = 0; - num_contacts = g_list_length (contacts); - for (l = contacts; l; l = l->next) { - EContact *contact = l->data; - GError *e = NULL; - GList *attrs, *attr; - gboolean converted = FALSE; - int num_work_voice = 0; - - attrs = e_vcard_get_attributes (E_VCARD (contact)); - for (attr = attrs; attr;) { - EVCardAttribute *a = attr->data; - GList *next_attr = attr->next; - - if (!strcmp ("TEL", e_vcard_attribute_get_name (a))) { - GList *params, *param; - gboolean found_voice = FALSE; - gboolean found_work = FALSE; - - params = e_vcard_attribute_get_params (a); - for (param = params; param; param = param->next) { - EVCardAttributeParam *p = param->data; - if (!strcmp (EVC_TYPE, e_vcard_attribute_param_get_name (p))) { - GList *v = e_vcard_attribute_param_get_values (p); - if (v && v->data) { - if (!strcmp ("VOICE", v->data)) - found_voice = TRUE; - else if (!strcmp ("WORK", v->data)) - found_work = TRUE; - } - } - - if (found_work && found_voice) - num_work_voice++; - - if (num_work_voice == 3) { - GList *v = e_vcard_attribute_get_values (a); - - if (v && v->data) - e_contact_set (contact, E_CONTACT_PHONE_COMPANY, v->data); - - e_vcard_remove_attribute (E_VCARD (contact), a); - - converted = TRUE; - break; - } - } - } - - attr = next_attr; - - if (converted) - break; - } - - if (converted) { - if (!e_book_commit_contact (book, - contact, - &e)) - g_warning ("contact commit failed: `%s'", e->message); - } - - num_converted ++; - - dialog_set_progress (context, (double)num_converted / num_contacts); - } - - g_list_foreach (contacts, (GFunc)g_object_unref, NULL); - g_list_free (contacts); - - g_object_unref (book); - } -} - -static void -migrate_pilot_data (const char *old_path, const char *new_path) -{ - struct dirent *dent; - const char *ext; - char *filename; - DIR *dir; - - if (!(dir = opendir (old_path))) - return; - - while ((dent = readdir (dir))) { - if ((!strncmp (dent->d_name, "pilot-map-", 10) && - ((ext = strrchr (dent->d_name, '.')) && !strcmp (ext, ".xml"))) || - (!strncmp (dent->d_name, "pilot-sync-evolution-addressbook-", 33) && - ((ext = strrchr (dent->d_name, '.')) && !strcmp (ext, ".db")))) { - /* src and dest file formats are identical for both map and changelog files */ - unsigned char inbuf[4096]; - size_t nread, nwritten; - int fd0, fd1; - ssize_t n; - - filename = g_build_filename (old_path, dent->d_name, NULL); - if ((fd0 = open (filename, O_RDONLY)) == -1) { - g_free (filename); - continue; - } - - g_free (filename); - filename = g_build_filename (new_path, dent->d_name, NULL); - if ((fd1 = open (filename, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == -1) { - g_free (filename); - close (fd0); - continue; - } - - do { - do { - n = read (fd0, inbuf, sizeof (inbuf)); - } while (n == -1 && errno == EINTR); - - if (n < 1) - break; - - nread = n; - nwritten = 0; - do { - do { - n = write (fd1, inbuf + nwritten, nread - nwritten); - } while (n == -1 && errno == EINTR); - - if (n > 0) - nwritten += n; - } while (nwritten < nread && n != -1); - - if (n == -1) - break; - } while (1); - - if (n != -1) - n = fsync (fd1); - - if (n == -1) { - g_warning ("Failed to migrate %s: %s", dent->d_name, strerror (errno)); - unlink (filename); - } - - close (fd0); - close (fd1); - g_free (filename); - } - } - - closedir (dir); -} - -static MigrationContext* -migration_context_new (AddressbookComponent *component) -{ - MigrationContext *context = g_new (MigrationContext, 1); - - /* set up the mapping from old uris to new uids */ - context->folder_uid_map = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)g_free); - - e_book_get_addressbooks (&context->source_list, NULL); - - context->component = component; - - return context; -} - -static void -migration_context_free (MigrationContext *context) -{ - e_source_list_sync (context->source_list, NULL); - - g_hash_table_destroy (context->folder_uid_map); - - g_object_unref (context->source_list); - - g_free (context); -} - -int -addressbook_migrate (AddressbookComponent *component, int major, int minor, int revision, GError **err) -{ - ESourceGroup *on_this_computer; - ESourceGroup *on_ldap_servers; - ESource *personal_source; - MigrationContext *context = migration_context_new (component); - gboolean need_dialog = FALSE; - - printf ("addressbook_migrate (%d.%d.%d)\n", major, minor, revision); - - /* we call this unconditionally now - create_groups either - creates the groups/sources or it finds the necessary - groups/sources. */ - create_groups (context, &on_this_computer, &on_ldap_servers, &personal_source); - - /* figure out if we need the dialog displayed */ - if (major == 1 - /* we only need the most recent upgrade point here. - further decomposition will happen below. */ - && (minor < 5 || (minor == 5 && revision <= 10))) - need_dialog = TRUE; - - if (need_dialog) - setup_progress_dialog (context); - - if (major == 1) { - - if (minor < 5 || (minor == 5 && revision <= 2)) { - /* initialize our dialog */ - dialog_set_label (context, - _("The location and hierarchy of the Evolution contact " - "folders has changed since Evolution 1.x.\n\nPlease be " - "patient while Evolution migrates your folders...")); - - if (on_this_computer) - migrate_local_folders (context, on_this_computer, personal_source); - if (on_ldap_servers) - migrate_ldap_servers (context, on_ldap_servers); - - migrate_completion_folders (context); - } - - if (minor < 5 || (minor == 5 && revision <= 7)) { - dialog_set_label (context, - _("The format of mailing list contacts has changed.\n\n" - "Please be patient while Evolution migrates your " - "folders...")); - - migrate_contact_lists_for_local_folders (context, on_this_computer); - } - - if (minor < 5 || (minor == 5 && revision <= 8)) { - dialog_set_label (context, - _("The way Evolution stores some phone numbers has changed.\n\n" - "Please be patient while Evolution migrates your " - "folders...")); - - migrate_company_phone_for_local_folders (context, on_this_computer); - } - - if (minor < 5 || (minor == 5 && revision <= 10)) { - char *old_path, *new_path; - - dialog_set_label (context, _("Evolution's Palm Sync changelog and map files have changed.\n\n" - "Please be patient while Evolution migrates your Pilot Sync data...")); - - old_path = g_build_filename (g_get_home_dir (), "evolution", "local", "Contacts", NULL); - new_path = g_build_filename (addressbook_component_peek_base_directory (component), - "addressbook", "local", "system", NULL); - migrate_pilot_data (old_path, new_path); - g_free (new_path); - g_free (old_path); - } - - /* we only need to do this next step if people ran - older versions of 1.5. We need to clear out the - absolute URI's that were assigned to ESources - during one phase of development, as they take - precedent over relative uris (but aren't updated - when editing an ESource). */ - if (minor == 5 && revision <= 11) { - GSList *g; - for (g = e_source_list_peek_groups (context->source_list); g; g = g->next) { - ESourceGroup *group = g->data; - GSList *s; - - for (s = e_source_group_peek_sources (group); s; s = s->next) { - ESource *source = s->data; - e_source_set_absolute_uri (source, NULL); - } - } - } - } - - if (need_dialog) - dialog_close (context); - - if (on_this_computer) - g_object_unref (on_this_computer); - if (on_ldap_servers) - g_object_unref (on_ldap_servers); - if (personal_source) - g_object_unref (personal_source); - - - migration_context_free (context); - - return TRUE; -} diff --git a/addressbook/gui/component/addressbook-migrate.h b/addressbook/gui/component/addressbook-migrate.h deleted file mode 100644 index dc7c473e12..0000000000 --- a/addressbook/gui/component/addressbook-migrate.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Copyright (C) 2004, Novell, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Chris Toshok (toshok@ximian.com) - */ - -#ifndef _ADDRESSBOOK_MIGRATE_H_ -#define _ADDRESSBOOK_MIGRATE_H_ - -#include "addressbook-component.h" - -struct _GError; - -int addressbook_migrate (AddressbookComponent *component, int major, int minor, int revision, struct _GError **err); - -#endif /* _ADDRESSBOOK_MIGRATE_H_ */ diff --git a/addressbook/gui/component/addressbook-view.c b/addressbook/gui/component/addressbook-view.c deleted file mode 100644 index ef4a24b5e0..0000000000 --- a/addressbook/gui/component/addressbook-view.c +++ /dev/null @@ -1,1393 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* addressbook-view.c - * - * Copyright (C) 2000, 2001, 2002, 2003 Ximian, Inc. - * Copyright (C) 2004 Novell, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Chris Toshok (toshok@ximian.com) - */ - -#include <config.h> - -#include <string.h> -#include <glib.h> -#include <gtk/gtkvbox.h> -#include <gtk/gtknotebook.h> -#include <gtk/gtkwidget.h> -#include <gtk/gtkmessagedialog.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-href.h> -#include <libgnomeui/gnome-uidefs.h> -#include <bonobo/bonobo-generic-factory.h> -#include <bonobo/bonobo-ui-util.h> -#include <bonobo/bonobo-exception.h> -#include <gal/util/e-util.h> -#include <libedataserverui/e-source-selector.h> - -#include "widgets/misc/e-error.h" -#include "widgets/misc/e-task-bar.h" -#include "widgets/misc/e-info-label.h" - - -#include "e-util/e-passwords.h" -#include "e-util/e-icon-factory.h" -#include "shell/e-user-creatable-items-handler.h" - -#include "evolution-shell-component-utils.h" -#include "e-activity-handler.h" -#include "e-contact-editor.h" -#include "addressbook-config.h" -#include "addressbook.h" -#include "addressbook-view.h" -#include "addressbook-component.h" -#include "addressbook/gui/search/e-addressbook-search-dialog.h" -#include "addressbook/gui/widgets/e-addressbook-view.h" -#include "addressbook/gui/widgets/eab-gui-util.h" -#include "addressbook/gui/merging/eab-contact-merging.h" -#include "addressbook/printing/e-contact-print.h" -#include "addressbook/util/eab-book-util.h" -#include "addressbook/gui/widgets/eab-popup.h" -#include "addressbook/gui/widgets/eab-menu.h" - -#define PARENT_TYPE G_TYPE_OBJECT -static GObjectClass *parent_class = NULL; - -/* This is used for the addressbook status bar */ -#define EVOLUTION_CONTACTS_PROGRESS_IMAGE "stock_contact" -static GdkPixbuf *progress_icon = NULL; - -#define d(x) - -struct _AddressbookViewPrivate { - GtkWidget *notebook; - BonoboControl *folder_view_control; - - GtkWidget *statusbar_widget; - EActivityHandler *activity_handler; - - GtkWidget *info_widget; - GtkWidget *sidebar_widget; - GtkWidget *selector; - - GConfClient *gconf_client; - - GHashTable *uid_to_view; - GHashTable *uid_to_editor; - - EBook *book; - guint activity_id; - ESourceList *source_list; - char *passwd; - EUserCreatableItemsHandler *creatable_items_handler; - - EABMenu *menu; -}; - -enum DndTargetType { - DND_TARGET_TYPE_VCARD_LIST, - DND_TARGET_TYPE_SOURCE_VCARD_LIST -}; -#define VCARD_TYPE "text/x-vcard" -#define SOURCE_VCARD_TYPE "text/x-source-vcard" -static GtkTargetEntry drag_types[] = { - { SOURCE_VCARD_TYPE, 0, DND_TARGET_TYPE_SOURCE_VCARD_LIST }, - { VCARD_TYPE, 0, DND_TARGET_TYPE_VCARD_LIST } -}; -static gint num_drag_types = sizeof(drag_types) / sizeof(drag_types[0]); - -static void set_status_message (EABView *eav, const char *message, AddressbookView *view); -static void search_result (EABView *eav, EBookViewStatus status, AddressbookView *view); - -static void activate_source (AddressbookView *view, ESource *source); - -static void addressbook_view_init (AddressbookView *view); -static void addressbook_view_class_init (AddressbookViewClass *klass); -static void addressbook_view_dispose (GObject *object); - -typedef struct { - GtkWidget *editor; - char *uid; - AddressbookView *view; -} EditorUidClosure; - -static void -editor_weak_notify (gpointer data, GObject *o) -{ - EditorUidClosure *closure = data; - AddressbookViewPrivate *priv = closure->view->priv; - - g_hash_table_remove (priv->uid_to_editor, - closure->uid); -} - -static EABView * -get_current_view (AddressbookView *view) -{ - AddressbookViewPrivate *priv = view->priv; - - return EAB_VIEW (gtk_notebook_get_nth_page (GTK_NOTEBOOK (priv->notebook), - gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->notebook)))); -} - -static void -save_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_save_as(v); -} - -static void -view_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_view(v); -} - -static void -search_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - gtk_widget_show(eab_search_dialog_new(v)); -} - -static void -delete_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_delete_selection(v); -} - -static void -print_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_print(v); -} - -static void -print_preview_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_print_preview(v); -} - -static void -stop_loading_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_stop(v); -} - -static void -cut_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_cut(v); -} - -static void -copy_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_copy(v); -} - -static void -paste_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_paste(v); -} - -static void -select_all_contacts_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_select_all (v); -} - -static void -send_contact_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_send (v); -} - -static void -send_contact_to_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_send_to (v); -} - -static void -copy_contact_to_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_copy_to_folder (v); -} - -static void -move_contact_to_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - AddressbookView *view = (AddressbookView *) user_data; - EABView *v = get_current_view (view); - if (v) - eab_view_move_to_folder (v); -} - -static void -forget_passwords_cb (BonoboUIComponent *uih, void *user_data, const char *path) -{ - e_passwords_forget_passwords(); -} - -static void -set_status_message (EABView *eav, const char *message, AddressbookView *view) -{ - AddressbookViewPrivate *priv = view->priv; - EActivityHandler *activity_handler = priv->activity_handler; - - if (!message || !*message) { - if (priv->activity_id != 0) { - e_activity_handler_operation_finished (activity_handler, priv->activity_id); - priv->activity_id = 0; - } - } else if (priv->activity_id == 0) { - char *clientid = g_strdup_printf ("%p", view); - - if (progress_icon == NULL) - progress_icon = e_icon_factory_get_icon (EVOLUTION_CONTACTS_PROGRESS_IMAGE, E_ICON_SIZE_STATUS); - - priv->activity_id = e_activity_handler_operation_started (activity_handler, clientid, - progress_icon, message, TRUE); - - g_free (clientid); - } else { - e_activity_handler_operation_progressing (activity_handler, priv->activity_id, message, -1.0); - } - -} - -static void -set_folder_bar_message (EABView *eav, const char *message, AddressbookView *view) -{ - AddressbookViewPrivate *priv = view->priv; - EABView *current_view = get_current_view (view); - - if (eav == current_view) { - ESource *source = eav->source; - - if (source) { - const char *name = e_source_peek_name (source); - - e_info_label_set_info((EInfoLabel*)priv->info_widget, name, message); - } - } -} - -static void -search_result (EABView *eav, EBookViewStatus status, AddressbookView *view) -{ - eab_search_result_dialog (NULL /* XXX */, status); -} - -static void -update_command_state (EABView *eav, AddressbookView *view) -{ - AddressbookViewPrivate *priv = view->priv; - BonoboUIComponent *uic; - EABMenuTargetSelect *target; - - if (eav != get_current_view (view)) - return; - - g_object_ref (view); - - target = eab_view_get_menu_target(eav, priv->menu); - e_menu_update_target((EMenu *)priv->menu, target); - - uic = bonobo_control_get_ui_component (priv->folder_view_control); - - /* TODO: this stuff can mostly be made to use the target bits instead */ - - if (bonobo_ui_component_get_container (uic) != CORBA_OBJECT_NIL) { -#define SET_SENSITIVE(verb,f) \ - bonobo_ui_component_set_prop (uic, (verb), "sensitive", (f)(eav) ? "1" : "0", NULL) - - SET_SENSITIVE ("/commands/ContactsSaveAsVCard", eab_view_can_save_as); - SET_SENSITIVE ("/commands/ContactsView", eab_view_can_view); - - /* Print Contact */ - SET_SENSITIVE ("/commands/ContactsPrint", eab_view_can_print); - SET_SENSITIVE ("/commands/ContactsPrintPreview", eab_view_can_print); - - /* Delete Contact */ - SET_SENSITIVE ("/commands/ContactDelete", eab_view_can_delete); - SET_SENSITIVE ("/commands/ContactsCut", eab_view_can_cut); - - SET_SENSITIVE ("/commands/ContactsCopy", eab_view_can_copy); - SET_SENSITIVE ("/commands/ContactsPaste", eab_view_can_paste); - SET_SENSITIVE ("/commands/ContactsSelectAll", eab_view_can_select_all); - SET_SENSITIVE ("/commands/ContactsSendContactToOther", eab_view_can_send); - SET_SENSITIVE ("/commands/ContactsSendMessageToContact", eab_view_can_send_to); - SET_SENSITIVE ("/commands/ContactsMoveToFolder", eab_view_can_move_to_folder); - SET_SENSITIVE ("/commands/ContactsCopyToFolder", eab_view_can_copy_to_folder); - - /* Stop */ - SET_SENSITIVE ("/commands/ContactStop", eab_view_can_stop); -#undef SET_SENSITIVE - } - - g_object_unref (view); -} - -static BonoboUIVerb verbs [] = { - BONOBO_UI_UNSAFE_VERB ("ContactsPrint", print_cb), - BONOBO_UI_UNSAFE_VERB ("ContactsPrintPreview", print_preview_cb), - BONOBO_UI_UNSAFE_VERB ("ContactsSaveAsVCard", save_contact_cb), - BONOBO_UI_UNSAFE_VERB ("ContactsView", view_contact_cb), - - BONOBO_UI_UNSAFE_VERB ("ContactDelete", delete_contact_cb), - BONOBO_UI_UNSAFE_VERB ("ContactStop", stop_loading_cb), - - BONOBO_UI_UNSAFE_VERB ("ContactsCut", cut_contacts_cb), - BONOBO_UI_UNSAFE_VERB ("ContactsCopy", copy_contacts_cb), - BONOBO_UI_UNSAFE_VERB ("ContactsPaste", paste_contacts_cb), - BONOBO_UI_UNSAFE_VERB ("ContactsSelectAll", select_all_contacts_cb), - - BONOBO_UI_UNSAFE_VERB ("ContactsSendContactToOther", send_contact_cb), - BONOBO_UI_UNSAFE_VERB ("ContactsSendMessageToContact", send_contact_to_cb), - BONOBO_UI_UNSAFE_VERB ("ContactsMoveToFolder", move_contact_to_cb), - BONOBO_UI_UNSAFE_VERB ("ContactsCopyToFolder", copy_contact_to_cb), - BONOBO_UI_UNSAFE_VERB ("ContactsForgetPasswords", forget_passwords_cb), - /* ContactsViewPreview is a toggle */ - - BONOBO_UI_VERB_END -}; - -static EPixmap pixmaps [] = { - E_PIXMAP ("/menu/File/FileOps/ContactsSaveAsVCard", "stock_save-as", E_ICON_SIZE_MENU), - E_PIXMAP ("/menu/File/Print/ContactsPrint", "stock_print", E_ICON_SIZE_MENU), - E_PIXMAP ("/menu/File/Print/ContactsPrintPreview", "stock_print-preview", E_ICON_SIZE_MENU), - - E_PIXMAP ("/menu/EditPlaceholder/Edit/ContactsCut", "stock_cut", E_ICON_SIZE_MENU), - E_PIXMAP ("/menu/EditPlaceholder/Edit/ContactsCopy", "stock_copy", E_ICON_SIZE_MENU), - E_PIXMAP ("/menu/EditPlaceholder/Edit/ContactsPaste", "stock_paste", E_ICON_SIZE_MENU), - E_PIXMAP ("/menu/EditPlaceholder/Edit/ContactDelete", "stock_delete", E_ICON_SIZE_MENU), - - E_PIXMAP ("/Toolbar/ContactsPrint", "stock_print", E_ICON_SIZE_LARGE_TOOLBAR), - E_PIXMAP ("/Toolbar/ContactDelete", "stock_delete", E_ICON_SIZE_LARGE_TOOLBAR), - - E_PIXMAP_END -}; - -static void -control_activate (BonoboControl *control, - BonoboUIComponent *uic, - AddressbookView *view) -{ - AddressbookViewPrivate *priv = view->priv; - Bonobo_UIContainer remote_ui_container; - EABView *v = get_current_view (view); - - remote_ui_container = bonobo_control_get_remote_ui_container (control, NULL); - bonobo_ui_component_set_container (uic, remote_ui_container, NULL); - bonobo_object_release_unref (remote_ui_container, NULL); - - bonobo_ui_component_add_verb_list_with_data ( - uic, verbs, view); - - bonobo_ui_component_freeze (uic, NULL); - - bonobo_ui_util_set_ui (uic, PREFIX, - EVOLUTION_UIDIR "/evolution-addressbook.xml", - "evolution-addressbook", NULL); - - if (v) - eab_view_setup_menus (v, uic); - - e_pixmaps_update (uic, pixmaps); - - e_user_creatable_items_handler_activate (priv->creatable_items_handler, uic); - - bonobo_ui_component_thaw (uic, NULL); - - if (v) - update_command_state (v, view); -} - -static void -control_activate_cb (BonoboControl *control, - gboolean activate, - AddressbookView *view) -{ - BonoboUIComponent *uic; - EABView *v = get_current_view (view); - - uic = bonobo_control_get_ui_component (control); - g_assert (uic != NULL); - - if (activate) { - control_activate (control, uic, view); - e_menu_activate((EMenu *)view->priv->menu, uic, activate); - if (activate && v && v->model) - eab_model_force_folder_bar_message (v->model); - } else { - e_menu_activate((EMenu *)view->priv->menu, uic, activate); - bonobo_ui_component_unset_container (uic, NULL); - eab_view_discard_menus (v); - } -} - -static void -gather_uids_foreach (char *key, - gpointer value, - GList **list) -{ - (*list) = g_list_prepend (*list, key); -} - -static void -source_list_changed_cb (ESourceList *source_list, AddressbookView *view) -{ - AddressbookViewPrivate *priv = view->priv; - GList *uids, *l; - EABView *v; - - uids = NULL; - g_hash_table_foreach (priv->uid_to_view, (GHFunc)gather_uids_foreach, &uids); - for (l = uids; l; l = l->next) { - char *uid = l->data; - if (e_source_list_peek_source_by_uid (source_list, uid)) { - /* the source still exists, do nothing */ - } - else { - /* the source no longer exists, remove its - view remove it from our hash table. */ - v = g_hash_table_lookup (priv->uid_to_view, - uid); - gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), - gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), - GTK_WIDGET (v))); - g_hash_table_remove (priv->uid_to_view, uid); - } - } - g_list_free (uids); - - uids = NULL; - g_hash_table_foreach (priv->uid_to_editor, (GHFunc)gather_uids_foreach, &uids); - for (l = uids; l; l = l->next) { - char *uid = l->data; - if (e_source_list_peek_source_by_uid (source_list, uid)) { - /* the source still exists, do nothing */ - } - else { - /* the source no longer exists, remove its - editor remove it from our hash table. */ - EditorUidClosure *closure = g_hash_table_lookup (priv->uid_to_editor, - uid); - g_object_weak_unref (G_OBJECT (closure->editor), - editor_weak_notify, closure); - gtk_widget_destroy (closure->editor); - g_hash_table_remove (priv->uid_to_editor, uid); - } - } - g_list_free (uids); - - /* make sure we've got the current view selected and updated - properly */ - v = get_current_view (view); - if (v) { - eab_view_setup_menus (v, bonobo_control_get_ui_component (priv->folder_view_control)); - update_command_state (v, view); - } -} - -static void -load_uri_for_selection (ESourceSelector *selector, - AddressbookView *view) -{ - ESource *selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (selector)); - - if (selected_source != NULL) - activate_source (view, selected_source); -} - -static ESource * -find_first_source (ESourceList *source_list) -{ - GSList *groups, *sources, *l, *m; - - groups = e_source_list_peek_groups (source_list); - for (l = groups; l; l = l->next) { - ESourceGroup *group = l->data; - - sources = e_source_group_peek_sources (group); - for (m = sources; m; m = m->next) { - ESource *source = m->data; - - return source; - } - } - - return NULL; -} - -static void -save_primary_selection (AddressbookView *view) -{ - AddressbookViewPrivate *priv = view->priv; - ESource *source; - - source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->selector)); - if (!source) - return; - - /* Save the selection for next time we start up */ - gconf_client_set_string (priv->gconf_client, - "/apps/evolution/addressbook/display/primary_addressbook", - e_source_peek_uid (source), NULL); -} - -static ESource * -get_primary_source (AddressbookView *view) -{ - AddressbookViewPrivate *priv = view->priv; - ESource *source; - char *uid; - - uid = gconf_client_get_string (priv->gconf_client, - "/apps/evolution/addressbook/display/primary_addressbook", - NULL); - if (uid) { - source = e_source_list_peek_source_by_uid (priv->source_list, uid); - g_free (uid); - } else { - /* Try to create a default if there isn't one */ - source = find_first_source (priv->source_list); - } - - return source; -} - -static void -load_primary_selection (AddressbookView *view) -{ - AddressbookViewPrivate *priv = view->priv; - ESource *source; - - source = get_primary_source (view); - if (source) - e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (priv->selector), source); -} - -/* Folder popup menu callbacks */ -typedef struct { - AddressbookView *view; - ESource *selected_source; - GtkWidget *toplevel; -} BookRemovedClosure; - -static void -book_removed (EBook *book, EBookStatus status, gpointer data) -{ - BookRemovedClosure *closure = data; - AddressbookView *view = closure->view; - AddressbookViewPrivate *priv = view->priv; - ESource *source = closure->selected_source; - GtkWidget *toplevel = closure->toplevel; - - g_free (closure); - - g_object_unref (book); - - if (E_BOOK_ERROR_OK == status) { - /* Remove source */ - if (e_source_selector_source_is_selected (E_SOURCE_SELECTOR (priv->selector), - source)) - e_source_selector_unselect_source (E_SOURCE_SELECTOR (priv->selector), - source); - - e_source_group_remove_source (e_source_peek_group (source), source); - - e_source_list_sync (priv->source_list, NULL); - } - else { - e_error_run (GTK_WINDOW (toplevel), - "addressbook:remove-addressbook", - NULL); - } -} - -static void -delete_addressbook_cb(EPopup *ep, EPopupItem *pitem, void *data) -{ - AddressbookView *view = data; - AddressbookViewPrivate *priv = view->priv; - ESource *selected_source; - EBook *book; - GError *error = NULL; - GtkWindow *toplevel; - - selected_source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->selector)); - if (!selected_source) - return; - - toplevel = (GtkWindow *)gtk_widget_get_toplevel(ep->target->widget); - - if (e_error_run(toplevel, "addressbook:ask-delete-addressbook", e_source_peek_name(selected_source)) != GTK_RESPONSE_YES) - return; - - /* Remove local data */ - book = e_book_new (selected_source, &error); - if (book) { - BookRemovedClosure *closure = g_new (BookRemovedClosure, 1); - - closure->toplevel = (GtkWidget *)toplevel; - closure->view = view; - closure->selected_source = selected_source; - - if (e_book_async_remove (book, book_removed, closure)) { - e_error_run (toplevel, "addressbook:remove-addressbook", NULL); - g_free (closure); - g_object_unref (book); - } - } -} - -static void -new_addressbook_cb(EPopup *ep, EPopupItem *pitem, void *data) -{ - addressbook_config_create_new_source (gtk_widget_get_toplevel(ep->target->widget)); -} - -static void -edit_addressbook_cb(EPopup *ep, EPopupItem *pitem, void *data) -{ - AddressbookView *view = data; - AddressbookViewPrivate *priv = view->priv; - ESource *selected_source; - const char *uid; - EditorUidClosure *closure; - - selected_source = - e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (priv->selector)); - if (!selected_source) - return; - - uid = e_source_peek_uid (selected_source); - - closure = g_hash_table_lookup (priv->uid_to_editor, uid); - if (!closure) { - char *uid_copy = g_strdup (uid); - - closure = g_new (EditorUidClosure, 1); - closure->editor = addressbook_config_edit_source (gtk_widget_get_toplevel(ep->target->widget), selected_source); - closure->uid = uid_copy; - closure->view = view; - - g_hash_table_insert (priv->uid_to_editor, - uid_copy, - closure); - - g_object_weak_ref (G_OBJECT (closure->editor), - editor_weak_notify, closure); - } - - gtk_window_present (GTK_WINDOW (closure->editor)); -} - -/* Callbacks. */ - -static void -primary_source_selection_changed_callback (ESourceSelector *selector, - AddressbookView *view) -{ - load_uri_for_selection (selector, view); - save_primary_selection (view); -} - -static EPopupItem abv_source_popups[] = { - { E_POPUP_ITEM, "10.new", N_("New Address Book"), new_addressbook_cb, NULL, NULL, 0, 0 }, - { E_POPUP_ITEM, "20.delete", N_("Delete"), delete_addressbook_cb, NULL, "stock_delete", 0, EAB_POPUP_SOURCE_USER|EAB_POPUP_SOURCE_PRIMARY }, - { E_POPUP_ITEM, "30.properties", N_("Properties..."), edit_addressbook_cb, NULL, NULL, 0, EAB_POPUP_SOURCE_PRIMARY }, -}; - -static void -abv_source_popup_free(EPopup *ep, GSList *list, void *data) -{ - g_slist_free(list); -} - -static gboolean -popup_event_callback(ESourceSelector *selector, ESource *source, GdkEventButton *event, AddressbookView *view) -{ - EABPopup *ep; - EABPopupTargetSource *t; - GSList *menus = NULL; - int i; - GtkMenu *menu; - - ep = eab_popup_new("com.novell.evolution.addressbook.source.popup"); - t = eab_popup_target_new_source(ep, selector); - t->target.widget = (GtkWidget *)view->priv->notebook; - - for (i=0;i<sizeof(abv_source_popups)/sizeof(abv_source_popups[0]);i++) - menus = g_slist_prepend(menus, &abv_source_popups[i]); - - e_popup_add_items((EPopup *)ep, menus, abv_source_popup_free, view); - - menu = e_popup_create_menu_once((EPopup *)ep, (EPopupTarget *)t, 0); - gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event?event->button:0, event?event->time:gtk_get_current_event_time()); - - return TRUE; -} - -static gboolean -selector_tree_drag_drop (GtkWidget *widget, - GdkDragContext *context, - int x, - int y, - guint time, - AddressbookView *view) -{ - GtkTreeViewColumn *column; - int cell_x; - int cell_y; - GtkTreePath *path; - GtkTreeModel *model; - GtkTreeIter iter; - gpointer data; - - if (!gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), x, y, &path, &column, &cell_x, &cell_y)) - return FALSE; - - model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); - - if (!gtk_tree_model_get_iter (model, &iter, path)) { - gtk_tree_path_free (path); - return FALSE; - } - - gtk_tree_model_get (model, &iter, 0, &data, -1); - - if (E_IS_SOURCE_GROUP (data)) { - g_object_unref (data); - gtk_tree_path_free (path); - return FALSE; - } - - gtk_tree_path_free (path); - return TRUE; -} - -static gboolean -selector_tree_drag_motion (GtkWidget *widget, - GdkDragContext *context, - int x, - int y) -{ - GtkTreePath *path = NULL; - gpointer data = NULL; - GtkTreeViewDropPosition pos; - GtkTreeModel *model; - GtkTreeIter iter; - GdkDragAction action; - - if (!gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (widget), - x, y, &path, &pos)) - goto finish; - - model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); - - if (!gtk_tree_model_get_iter (model, &iter, path)) - goto finish; - - gtk_tree_model_get (model, &iter, 0, &data, -1); - - if (E_IS_SOURCE_GROUP (data) || e_source_get_readonly (data)) - goto finish; - - gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW (widget), path, GTK_TREE_VIEW_DROP_INTO_OR_BEFORE); - action = context->suggested_action; - - finish: - if (path) - gtk_tree_path_free (path); - if (data) - g_object_unref (data); - - gdk_drag_status (context, action, GDK_CURRENT_TIME); - return TRUE; -} - -typedef struct -{ - guint remove_from_source : 1; - guint copy_done : 1; - gint pending_removals; - - EContact *current_contact; - GList *remaining_contacts; - - EBook *source_book; - EBook *target_book; -} -MergeContext; - -static void -destroy_merge_context (MergeContext *merge_context) -{ - if (merge_context->source_book) - g_object_unref (merge_context->source_book); - if (merge_context->target_book) - g_object_unref (merge_context->target_book); - - g_free (merge_context); -} - -static void -removed_contact_cb (EBook *book, EBookStatus status, gpointer closure) -{ - MergeContext *merge_context = closure; - - merge_context->pending_removals--; - - if (merge_context->copy_done && merge_context->pending_removals == 0) { - /* Finished */ - - destroy_merge_context (merge_context); - } -} - -static void -merged_contact_cb (EBook *book, EBookStatus status, const char *id, gpointer closure) -{ - MergeContext *merge_context = closure; - - if (merge_context->remove_from_source && status == E_BOOK_ERROR_OK) { - /* Remove previous contact from source */ - - e_book_async_remove_contact (merge_context->source_book, merge_context->current_contact, - removed_contact_cb, merge_context); - merge_context->pending_removals++; - } - - g_object_unref (merge_context->current_contact); - - if (merge_context->remaining_contacts) { - /* Copy next contact */ - - merge_context->current_contact = merge_context->remaining_contacts->data; - merge_context->remaining_contacts = g_list_delete_link (merge_context->remaining_contacts, - merge_context->remaining_contacts); - eab_merging_book_add_contact (merge_context->target_book, merge_context->current_contact, - merged_contact_cb, merge_context); - } else if (merge_context->pending_removals == 0) { - /* Finished */ - - destroy_merge_context (merge_context); - } else { - /* Finished, but have pending removals */ - - merge_context->copy_done = TRUE; - } -} - -static gboolean -selector_tree_drag_data_received (GtkWidget *widget, - GdkDragContext *context, - gint x, - gint y, - GtkSelectionData *data, - guint info, - guint time, - gpointer user_data) -{ - GtkTreePath *path = NULL; - GtkTreeViewDropPosition pos; - gpointer target = NULL; - GtkTreeModel *model; - GtkTreeIter iter; - gboolean success = FALSE; - EBook *source_book, *target_book; - MergeContext *merge_context; - GList *contactlist; - - if (!gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW (widget), - x, y, &path, &pos)) - goto finish; - - model = gtk_tree_view_get_model (GTK_TREE_VIEW (widget)); - - if (!gtk_tree_model_get_iter (model, &iter, path)) - goto finish; - - gtk_tree_model_get (model, &iter, 0, &target, -1); - - if (E_IS_SOURCE_GROUP (target) || e_source_get_readonly (target)) - goto finish; - - target_book = e_book_new (target, NULL); - if (!target_book) { - g_message (G_STRLOC ":Couldn't create EBook."); - return FALSE; - } - e_book_open (target_book, TRUE, NULL); - - eab_book_and_contact_list_from_string (data->data, &source_book, &contactlist); - - if (source_book) { - if (!e_book_open (source_book, FALSE, NULL)) { - g_warning (G_STRLOC ": Couldn't open source EBook."); - g_object_unref (source_book); - source_book = NULL; - } - } else { - g_warning (G_STRLOC ": No source EBook provided."); - } - - /* Set up merge context */ - - merge_context = g_new0 (MergeContext, 1); - - merge_context->source_book = source_book; - merge_context->target_book = target_book; - - merge_context->current_contact = contactlist->data; - merge_context->remaining_contacts = g_list_delete_link (contactlist, contactlist); - - merge_context->remove_from_source = context->suggested_action == GDK_ACTION_MOVE ? TRUE : FALSE; - - /* Start merge */ - - eab_merging_book_add_contact (target_book, merge_context->current_contact, - merged_contact_cb, merge_context); - - finish: - if (path) - gtk_tree_path_free (path); - if (target) - g_object_unref (target); - - gtk_drag_finish (context, success, context->action == GDK_ACTION_MOVE, time); - - return TRUE; -} - -static void -selector_tree_drag_leave (GtkWidget *widget, GdkDragContext *context, guint time, gpointer data) -{ - gtk_tree_view_set_drag_dest_row(GTK_TREE_VIEW (widget), NULL, GTK_TREE_VIEW_DROP_BEFORE); -} - - -static void -destroy_callback(gpointer data, GObject *where_object_was) -{ - AddressbookView *view = data; - g_object_unref (view); -} - -GType -addressbook_view_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (AddressbookViewClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) addressbook_view_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EABView), - 0, /* n_preallocs */ - (GInstanceInitFunc) addressbook_view_init, - }; - - type = g_type_register_static (PARENT_TYPE, "AddressbookView", &info, 0); - } - - return type; -} - -static void -addressbook_view_class_init (AddressbookViewClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->dispose = addressbook_view_dispose; - - parent_class = g_type_class_peek_parent (klass); -} - -static void -addressbook_view_init (AddressbookView *view) -{ - AddressbookViewPrivate *priv; - GtkWidget *selector_scrolled_window; - - view->priv = - priv = g_new0 (AddressbookViewPrivate, 1); - - priv->gconf_client = addressbook_component_peek_gconf_client (addressbook_component_peek ()); - - priv->uid_to_view = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)g_object_unref); - priv->uid_to_editor = g_hash_table_new_full (g_str_hash, g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)g_free); - - priv->notebook = gtk_notebook_new (); - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (priv->notebook), FALSE); - gtk_notebook_set_show_border (GTK_NOTEBOOK (priv->notebook), FALSE); - - g_object_weak_ref (G_OBJECT (priv->notebook), destroy_callback, view); - - /* Create the control. */ - priv->folder_view_control = bonobo_control_new (priv->notebook); - - gtk_widget_show (priv->notebook); - - e_book_get_addressbooks (&priv->source_list, NULL); - g_signal_connect (priv->source_list, - "changed", - G_CALLBACK (source_list_changed_cb), view); - - priv->creatable_items_handler = e_user_creatable_items_handler_new ("contacts", NULL, NULL); - priv->menu = eab_menu_new("com.novell.evolution.addressbook.view"); - - g_signal_connect (priv->folder_view_control, "activate", - G_CALLBACK (control_activate_cb), view); - - priv->activity_handler = e_activity_handler_new (); - - priv->statusbar_widget = e_task_bar_new (); - gtk_widget_show (priv->statusbar_widget); - - e_activity_handler_attach_task_bar (priv->activity_handler, - E_TASK_BAR (priv->statusbar_widget)); - - priv->info_widget = e_info_label_new("stock_contact"); - e_info_label_set_info((EInfoLabel*)priv->info_widget, _("Contacts"), ""); - gtk_widget_show (priv->info_widget); - - priv->selector = e_source_selector_new (priv->source_list); - - g_signal_connect (priv->selector, "drag-motion", G_CALLBACK (selector_tree_drag_motion), view); - g_signal_connect (priv->selector, "drag-leave", G_CALLBACK (selector_tree_drag_leave), view); - g_signal_connect (priv->selector, "drag-drop", G_CALLBACK (selector_tree_drag_drop), view); - g_signal_connect (priv->selector, "drag-data-received", G_CALLBACK (selector_tree_drag_data_received), view); - gtk_drag_dest_set (priv->selector, GTK_DEST_DEFAULT_ALL, drag_types, num_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE); - - e_source_selector_show_selection (E_SOURCE_SELECTOR (priv->selector), FALSE); - gtk_widget_show (priv->selector); - - selector_scrolled_window = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (selector_scrolled_window), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (selector_scrolled_window), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (selector_scrolled_window), priv->selector); - gtk_widget_show (selector_scrolled_window); - - priv->sidebar_widget = gtk_vbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX (priv->sidebar_widget), priv->info_widget, FALSE, TRUE, 0); - gtk_box_pack_start(GTK_BOX (priv->sidebar_widget), selector_scrolled_window, TRUE, TRUE, 0); - gtk_widget_show (priv->sidebar_widget); - - g_signal_connect_object (priv->selector, "primary_selection_changed", - G_CALLBACK (primary_source_selection_changed_callback), - G_OBJECT (view), 0); - g_signal_connect_object (priv->selector, "popup_event", - G_CALLBACK (popup_event_callback), - G_OBJECT (view), 0); - - load_primary_selection (view); - load_uri_for_selection (E_SOURCE_SELECTOR (priv->selector), view); -} - -static void -destroy_editor (char *key, - gpointer value, - gpointer nada) -{ - EditorUidClosure *closure = value; - - g_object_weak_unref (G_OBJECT (closure->editor), - editor_weak_notify, closure); - - gtk_widget_destroy (GTK_WIDGET (closure->editor)); -} - -static void -addressbook_view_dispose (GObject *object) -{ - AddressbookView *view = ADDRESSBOOK_VIEW (object); - AddressbookViewPrivate *priv = view->priv; - - if (view->priv) { - if (priv->book) - g_object_unref (priv->book); - - g_free(priv->passwd); - - if (priv->source_list) - g_object_unref (priv->source_list); - - if (priv->uid_to_view) - g_hash_table_destroy (priv->uid_to_view); - - if (priv->uid_to_editor) { - g_hash_table_foreach (priv->uid_to_editor, (GHFunc)destroy_editor, NULL); - g_hash_table_destroy (priv->uid_to_editor); - } - - if (priv->creatable_items_handler) - g_object_unref (priv->creatable_items_handler); - - if (priv->menu) - g_object_unref (priv->menu); - - g_free (view->priv); - view->priv = NULL; - } - - if (G_OBJECT_CLASS (parent_class)->dispose) - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -typedef struct { - EABView *view; - ESource *source; -} BookOpenData; - -static void -book_open_cb (EBook *book, EBookStatus status, gpointer closure) -{ - BookOpenData *data = closure; - EABView *view = data->view; - ESource *source = data->source; - - g_free (data); - - /* we always set the "source" property on the EABView, since - we use it to reload a previously failed book. */ - g_object_set(view, - "source", source, - NULL); - - if (status == E_BOOK_ERROR_OK) { - g_object_set(view, - "book", book, - NULL); - - if (view->model) - eab_model_force_folder_bar_message (view->model); - } - else if (status != E_BOOK_ERROR_CANCELLED) { - eab_load_error_dialog (NULL /* XXX */, source, status); - } - - - g_object_unref (source); -} - -static void -activate_source (AddressbookView *view, - ESource *source) -{ - AddressbookViewPrivate *priv = view->priv; - const char *uid; - GtkWidget *uid_view; - EBook *book; - BookOpenData *data; - - uid = e_source_peek_uid (source); - uid_view = g_hash_table_lookup (priv->uid_to_view, uid); - - if (uid_view) { - /* there is a view for this uid. make - sure that the view actually - contains an EBook (if it doesn't - contain an EBook a previous load - failed. try to load it again */ - g_object_get (uid_view, - "book", &book, - NULL); - - if (book) { - g_object_unref (book); - } - else { - g_object_get (uid_view, - "source", &source, - NULL); - - /* source can be NULL here, if - a previous load hasn't - actually made it to - book_open_cb yet. */ - if (source) { - book = e_book_new (source, NULL); - - if (!book) { - g_object_unref (source); - } - else { - data = g_new (BookOpenData, 1); - data->view = g_object_ref (uid_view); - data->source = source; /* transfer the ref we get back from g_object_get */ - - addressbook_load (book, book_open_cb, data); - } - } - } - } - else { - /* we don't have a view for this uid already - set up. */ - GtkWidget *label = gtk_label_new (uid); - GError *error = NULL; - - uid_view = eab_view_new (); - - gtk_widget_show (uid_view); - gtk_widget_show (label); - - g_object_set (uid_view, "type", EAB_VIEW_TABLE, NULL); - - gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), - uid_view, - label); - - g_hash_table_insert (priv->uid_to_view, g_strdup (uid), uid_view); - - g_signal_connect (uid_view, "status_message", - G_CALLBACK(set_status_message), view); - - g_signal_connect (uid_view, "search_result", - G_CALLBACK(search_result), view); - - g_signal_connect (uid_view, "folder_bar_message", - G_CALLBACK(set_folder_bar_message), view); - - g_signal_connect (uid_view, "command_state_change", - G_CALLBACK(update_command_state), view); - - book = e_book_new (source, &error); - - if (book) { - data = g_new (BookOpenData, 1); - data->view = g_object_ref (uid_view); - data->source = g_object_ref (source); - - addressbook_load (book, book_open_cb, data); - } - else { - g_warning ("error loading addressbook : %s", error->message); - g_error_free (error); - } - } - - gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook), - gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook), - uid_view)); - - if (EAB_VIEW (uid_view)->model) - eab_model_force_folder_bar_message (EAB_VIEW (uid_view)->model); - - /* change menus/toolbars to reflect the new view, assuming we are already displayed */ - if (bonobo_ui_component_get_container (bonobo_control_get_ui_component (priv->folder_view_control)) != CORBA_OBJECT_NIL) { - eab_view_setup_menus (EAB_VIEW (uid_view), bonobo_control_get_ui_component (priv->folder_view_control)); - update_command_state (EAB_VIEW (uid_view), view); - } -} - -AddressbookView * -addressbook_view_new (void) -{ - return g_object_new (ADDRESSBOOK_TYPE_VIEW, NULL); -} - -EActivityHandler* -addressbook_view_peek_activity_handler (AddressbookView *view) -{ - g_return_val_if_fail (ADDRESSBOOK_IS_VIEW (view), NULL); - - return view->priv->activity_handler; -} - -GtkWidget* -addressbook_view_peek_info_label (AddressbookView *view) -{ - g_return_val_if_fail (ADDRESSBOOK_IS_VIEW (view), NULL); - - return view->priv->info_widget; -} - -GtkWidget* -addressbook_view_peek_sidebar (AddressbookView *view) -{ - g_return_val_if_fail (ADDRESSBOOK_IS_VIEW (view), NULL); - - return view->priv->sidebar_widget; -} - -GtkWidget* -addressbook_view_peek_statusbar (AddressbookView *view) -{ - g_return_val_if_fail (ADDRESSBOOK_IS_VIEW (view), NULL); - - return view->priv->statusbar_widget; -} - -BonoboControl* -addressbook_view_peek_folder_view (AddressbookView *view) -{ - g_return_val_if_fail (ADDRESSBOOK_IS_VIEW (view), NULL); - - return view->priv->folder_view_control; -} diff --git a/addressbook/gui/component/addressbook-view.h b/addressbook/gui/component/addressbook-view.h deleted file mode 100644 index e2292c4527..0000000000 --- a/addressbook/gui/component/addressbook-view.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* addressbook-view.h - * - * Copyright (C) 2004 Novell, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Chris Toshok <toshok@ximian.com> - */ - -#ifndef _ADDRESSBOOK_VIEW_H_ -#define _ADDRESSBOOK_VIEW_H_ - -#include <bonobo/bonobo-control.h> - -#define ADDRESSBOOK_TYPE_VIEW (addressbook_view_get_type ()) -#define ADDRESSBOOK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), ADDRESSBOOK_TYPE_VIEW, AddressbookView)) -#define ADDRESSBOOK_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), ADDRESSBOOK_TYPE_VIEW, AddressbookViewClass)) -#define ADDRESSBOOK_IS_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ADDRESSBOOK_TYPE_VIEW)) -#define ADDRESSBOOK_IS_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), ADDRESSBOOK_TYPE_VIEW)) - - -typedef struct _AddressbookView AddressbookView; -typedef struct _AddressbookViewPrivate AddressbookViewPrivate; -typedef struct _AddressbookViewClass AddressbookViewClass; - -struct _AddressbookView { - GObject parent; - - AddressbookViewPrivate *priv; -}; - -struct _AddressbookViewClass { - GObjectClass parent_class; -}; - - -GType addressbook_view_get_type (void); - -AddressbookView *addressbook_view_new (void); - -EActivityHandler *addressbook_view_peek_activity_handler (AddressbookView *view); -GtkWidget *addressbook_view_peek_info_label (AddressbookView *view); -GtkWidget *addressbook_view_peek_sidebar (AddressbookView *view); -GtkWidget *addressbook_view_peek_statusbar (AddressbookView *view); -BonoboControl *addressbook_view_peek_folder_view (AddressbookView *view); - -#endif /* _ADDRESSBOOK_VIEW_H_ */ diff --git a/addressbook/gui/component/addressbook.c b/addressbook/gui/component/addressbook.c deleted file mode 100644 index cbf908c17f..0000000000 --- a/addressbook/gui/component/addressbook.c +++ /dev/null @@ -1,298 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* addressbook.c - * - * Copyright (C) 2000, 2001, 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Chris Lahey (clahey@ximian.com) - */ - -#include <config.h> - -#include <string.h> - -#include <gtk/gtkmessagedialog.h> -#include <libgnome/gnome-i18n.h> -#include <libebook/e-book.h> - -#include "e-util/e-passwords.h" - -#include "addressbook.h" - -#define d(x) - -static void addressbook_authenticate (EBook *book, gboolean previous_failure, - ESource *source, EBookCallback cb, gpointer closure); - -typedef struct { - EBookCallback cb; - ESource *source; - gpointer closure; - guint cancelled : 1; -} LoadSourceData; - -static void -free_load_source_data (LoadSourceData *data) -{ - if (data->source) - g_object_unref (data->source); - g_free (data); -} - -/*this function removes of anything present after semicolon -in uri*/ - -static gchar* -remove_parameters_from_uri (gchar *uri) -{ - gchar **components; - gchar *new_uri = NULL; - - components = g_strsplit (uri, ";", 2); - if (components[0]) - new_uri = g_strdup (components[0]); - g_strfreev (components); - return new_uri; -} - -static void -load_source_auth_cb (EBook *book, EBookStatus status, gpointer closure) -{ - LoadSourceData *data = closure; - - if (data->cancelled) { - free_load_source_data (data); - return; - } - - if (status != E_BOOK_ERROR_OK) { - - /* the user clicked cancel in the password dialog */ - if (status == E_BOOK_ERROR_CANCELLED) { - - if (e_book_check_static_capability (book, "anon-access")) { - - GtkWidget *dialog; - - /* XXX "LDAP" has to be removed from the folowing message - so that it wil valid for other servers which provide - anonymous access*/ - - dialog = gtk_message_dialog_new (NULL, - 0, - GTK_MESSAGE_WARNING, - GTK_BUTTONS_OK, - _("Accessing LDAP Server anonymously")); - g_signal_connect (dialog, "response", G_CALLBACK(gtk_widget_destroy), NULL); - gtk_widget_show (dialog); - data->cb (book, E_BOOK_ERROR_OK, data->closure); - free_load_source_data (data); - return; - } - } - else { - gchar *uri = e_source_get_uri (data->source); - gchar *stripped_uri = remove_parameters_from_uri (uri); - const gchar *auth_domain = e_source_get_property (data->source, "auth-domain"); - const gchar *component_name; - - component_name = auth_domain ? auth_domain : "Addressbook"; - - e_passwords_forget_password (component_name, stripped_uri); - addressbook_authenticate (book, TRUE, data->source, load_source_auth_cb, closure); - - g_free (stripped_uri); - g_free (uri); - return; - } - } - - data->cb (book, status, data->closure); - - free_load_source_data (data); -} - -static gboolean -get_remember_password (ESource *source) -{ - const gchar *value; - - value = e_source_get_property (source, "remember_password"); - if (value && !strcasecmp (value, "true")) - return TRUE; - - return FALSE; -} - -static void -set_remember_password (ESource *source, gboolean value) -{ - e_source_set_property (source, "remember_password", - value ? "true" : "false"); -} - -static void -addressbook_authenticate (EBook *book, gboolean previous_failure, ESource *source, - EBookCallback cb, gpointer closure) -{ - const char *password = NULL; - char *pass_dup = NULL; - const gchar *auth; - const gchar *user; - gchar *uri = e_source_get_uri (source); - gchar *stripped_uri = remove_parameters_from_uri (uri); - const gchar *auth_domain = e_source_get_property (source, "auth-domain"); - const gchar *component_name; - - component_name = auth_domain ? auth_domain : "Addressbook"; - g_free (uri); - uri = stripped_uri; - - password = e_passwords_get_password (component_name, uri); - - auth = e_source_get_property (source, "auth"); - - if (auth && !strcmp ("ldap/simple-binddn", auth)) - user = e_source_get_property (source, "binddn"); - else if (auth && !strcmp ("plain/password", auth)) - user = e_source_get_property (source, "user"); - else - user = e_source_get_property (source, "email_addr"); - if (!user) - user = ""; - - if (!password) { - char *prompt; - gboolean remember; - char *failed_auth; - guint32 flags = E_PASSWORDS_REMEMBER_FOREVER|E_PASSWORDS_SECRET|E_PASSWORDS_ONLINE; - - if (previous_failure) { - failed_auth = _("Failed to authenticate.\n"); - flags |= E_PASSWORDS_REPROMPT; - } - else { - failed_auth = ""; - } - - prompt = g_strdup_printf (_("%sEnter password for %s (user %s)"), - failed_auth, e_source_peek_name (source), user); - - remember = get_remember_password (source); - pass_dup = e_passwords_ask_password (prompt, component_name, uri, prompt, - flags, &remember, - NULL); - if (remember != get_remember_password (source)) - set_remember_password (source, remember); - - g_free (prompt); - } - - if (password || pass_dup) { - e_book_async_authenticate_user (book, user, password ? password : pass_dup, - e_source_get_property (source, "auth"), - cb, closure); - g_free (pass_dup); - } - else { - /* they hit cancel */ - cb (book, E_BOOK_ERROR_CANCELLED, closure); - } - - g_free (uri); -} - -static void -load_source_cb (EBook *book, EBookStatus status, gpointer closure) -{ - LoadSourceData *load_source_data = closure; - - if (load_source_data->cancelled) { - free_load_source_data (load_source_data); - return; - } - - if (status == E_BOOK_ERROR_OK && book != NULL) { - const gchar *auth; - - auth = e_source_get_property (load_source_data->source, "auth"); - - /* check if the addressbook needs authentication */ - - if (auth && strcmp (auth, "none")) { - addressbook_authenticate (book, FALSE, load_source_data->source, - load_source_auth_cb, closure); - - return; - } - } - - load_source_data->cb (book, status, load_source_data->closure); - free_load_source_data (load_source_data); -} - -guint -addressbook_load (EBook *book, - EBookCallback cb, gpointer closure) -{ - LoadSourceData *load_source_data = g_new0 (LoadSourceData, 1); - - load_source_data->cb = cb; - load_source_data->closure = closure; - load_source_data->source = g_object_ref (g_object_ref (e_book_get_source (book))); - load_source_data->cancelled = FALSE; - - e_book_async_open (book, FALSE, load_source_cb, load_source_data); - - return GPOINTER_TO_UINT (load_source_data); -} - -void -addressbook_load_cancel (guint id) -{ - LoadSourceData *load_source_data = GUINT_TO_POINTER (id); - - load_source_data->cancelled = TRUE; -} - -static void -default_book_cb (EBook *book, EBookStatus status, gpointer closure) -{ - LoadSourceData *load_source_data = closure; - - if (status == E_BOOK_ERROR_OK) - load_source_data->source = g_object_ref (e_book_get_source (book)); - - load_source_cb (book, status, closure); -} - -void -addressbook_load_default_book (EBookCallback cb, gpointer closure) -{ - LoadSourceData *load_source_data = g_new (LoadSourceData, 1); - EBook *book; - - load_source_data->cb = cb; - load_source_data->source = NULL; - load_source_data->closure = closure; - load_source_data->cancelled = FALSE; - - book = e_book_new_default_addressbook (NULL); - if (!book) - load_source_cb (NULL, E_BOOK_ERROR_OTHER_ERROR, load_source_data); /* XXX we should just use a GError and it's error code here */ - else - e_book_async_open (book, FALSE, default_book_cb, load_source_data); -} diff --git a/addressbook/gui/component/addressbook.h b/addressbook/gui/component/addressbook.h deleted file mode 100644 index a2a475951a..0000000000 --- a/addressbook/gui/component/addressbook.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __ADDRESSBOOK_H__ -#define __ADDRESSBOOK_H__ - -#include <bonobo/bonobo-control.h> -#include <e-util/e-config-listener.h> -#include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-moniker-util.h> -#include <libebook/e-book.h> - -guint addressbook_load (EBook *book, EBookCallback cb, gpointer closure); -void addressbook_load_cancel (guint id); -void addressbook_load_default_book (EBookCallback open_response, gpointer closure); - -#endif /* __ADDRESSBOOK_H__ */ diff --git a/addressbook/gui/component/apps_evolution_addressbook.schemas.in.in b/addressbook/gui/component/apps_evolution_addressbook.schemas.in.in deleted file mode 100644 index 1f835d9414..0000000000 --- a/addressbook/gui/component/apps_evolution_addressbook.schemas.in.in +++ /dev/null @@ -1,70 +0,0 @@ -<gconfschemafile> - <schemalist> - - <!-- Completion uris --> - - <schema> - <key>/schemas/apps/evolution/addressbook/completion/uris</key> - <applyto>/apps/evolution/addressbook/completion/uris</applyto> - <owner>evolution-addressbook</owner> - <type>string</type> - <default></default> - <locale name="C"> - <short>EFolderList XML for the list of completion URIs</short> - <long>EFolderList XML for the list of completion URIs.</long> - </locale> - </schema> - - <schema> - <key>/schemas/apps/evolution/addressbook/completion/minimum_query_length</key> - <applyto>/apps/evolution/addressbook/completion/minimum_query_length</applyto> - <owner>evolution-addressbook</owner> - <type>int</type> - <default>3</default> - <locale name="C"> - <short>The number of characters that must be typed before evolution will attempt to autocomplete</short> - <long>The number of characters that must be typed before evolution will attempt to autocomplete.</long> - </locale> - </schema> - - <!-- Select names last used uri --> - - <schema> - <key>/schemas/apps/evolution/addressbook/select_names/last_used_uri</key> - <applyto>/apps/evolution/addressbook/select_names/last_used_uri</applyto> - <owner>evolution-addressbook</owner> - <type>string</type> - <default></default> - <locale name="C"> - <short>URI for the folder last used in the select names dialog</short> - <long>URI for the folder last used in the select names dialog.</long> - </locale> - </schema> - - <!-- View state --> - - <schema> - <key>/schemas/apps/evolution/addressbook/display/vpane_position</key> - <applyto>/apps/evolution/addressbook/display/vpane_position</applyto> - <owner>evolution-addressbook</owner> - <type>int</type> - <locale name="C"> - <short>Position of the vertical pane in main view</short> - <long>Position of the vertical pane in main view.</long> - </locale> - </schema> - - <schema> - <key>/schemas/apps/evolution/addressbook/display/show_preview</key> - <applyto>/apps/evolution/addressbook/display/show_preview</applyto> - <owner>evolution-addressbook</owner> - <type>bool</type> - <default>true</default> - <locale name="C"> - <short>Show the "Preview" pane</short> - <long>Show the "Preview" pane.</long> - </locale> - </schema> - - </schemalist> -</gconfschemafile> diff --git a/addressbook/gui/component/autocompletion-config.c b/addressbook/gui/component/autocompletion-config.c deleted file mode 100644 index 8161c71166..0000000000 --- a/addressbook/gui/component/autocompletion-config.c +++ /dev/null @@ -1,153 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-config-autocompletion.h - Configuration page for addressbook autocompletion. - * - * Copyright (C) 2003 Novell, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Authors: Chris Toshok <toshok@ximian.com> - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - - -#include "autocompletion-config.h" - -#include "Evolution.h" - -#include <bonobo/bonobo-exception.h> - -#include <libedataserver/e-source-list.h> -#include <libedataserverui/e-source-selector.h> -#include <libgnome/gnome-i18n.h> -#include <gtk/gtkscrolledwindow.h> -#include <gtk/gtktreeselection.h> -#include <gtk/gtkwidget.h> -#include <gtk/gtksignal.h> - - -typedef struct { - EvolutionConfigControl *config_control; - - GtkWidget *control_widget; - - ESourceList *source_list; -} AutocompletionConfig; - -static void -source_selection_changed (ESourceSelector *selector, - AutocompletionConfig *ac) -{ - GSList *selection; - GSList *l; - GSList *groups; - - /* first we clear all the completion flags from all sources */ - for (groups = e_source_list_peek_groups (ac->source_list); groups; groups = groups->next) { - ESourceGroup *group = E_SOURCE_GROUP (groups->data); - GSList *sources; - for (sources = e_source_group_peek_sources (group); sources; sources = sources->next) { - ESource *source = E_SOURCE (sources->data); - - e_source_set_property (source, "completion", NULL); - } - } - - /* then we loop over the selector's selection, setting the - property on those sources */ - selection = e_source_selector_get_selection (selector); - for (l = selection; l; l = l->next) { - e_source_set_property (E_SOURCE (l->data), "completion", "true"); - } - e_source_selector_free_selection (selection); - - e_source_list_sync (ac->source_list, NULL); /* XXX we should pop up a dialog if this fails */ -} - -static void -config_control_destroy_notify (void *data, - GObject *where_the_config_control_was) -{ - AutocompletionConfig *ac = (AutocompletionConfig *) data; - - g_object_unref (ac->source_list); - - g_free (ac); -} - -static void -initialize_selection (AutocompletionConfig *ac) -{ - GSList *groups; - - for (groups = e_source_list_peek_groups (ac->source_list); groups; groups = groups->next) { - ESourceGroup *group = E_SOURCE_GROUP (groups->data); - GSList *sources; - for (sources = e_source_group_peek_sources (group); sources; sources = sources->next) { - ESource *source = E_SOURCE (sources->data); - const char *completion = e_source_get_property (source, "completion"); - if (completion && !g_ascii_strcasecmp (completion, "true")) - e_source_selector_select_source (E_SOURCE_SELECTOR (ac->control_widget), - source); - } - } -} - -EvolutionConfigControl* -autocompletion_config_control_new (void) -{ - AutocompletionConfig *ac; - CORBA_Environment ev; - GtkWidget *scrolledwin; - - ac = g_new0 (AutocompletionConfig, 1); - - CORBA_exception_init (&ev); - - ac->source_list = e_source_list_new_for_gconf_default ("/apps/evolution/addressbook/sources"); - /* XXX should we watch for the source list to change and - update it in the control? what about our local changes? */ - /* g_signal_connect (ac->source_list, "changed", G_CALLBACK (source_list_changed), ac); */ - - scrolledwin = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwin), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwin), - GTK_SHADOW_IN); - - ac->control_widget = e_source_selector_new (ac->source_list); - - gtk_container_add (GTK_CONTAINER (scrolledwin), ac->control_widget); - - initialize_selection (ac); - - gtk_widget_show (ac->control_widget); - gtk_widget_show (scrolledwin); - - ac->config_control = evolution_config_control_new (scrolledwin); - - g_signal_connect (ac->control_widget, "selection_changed", - G_CALLBACK (source_selection_changed), ac); - - g_object_weak_ref (G_OBJECT (ac->config_control), config_control_destroy_notify, ac); - - CORBA_exception_free (&ev); - - return ac->config_control; -} - diff --git a/addressbook/gui/component/autocompletion-config.h b/addressbook/gui/component/autocompletion-config.h deleted file mode 100644 index 86f056477e..0000000000 --- a/addressbook/gui/component/autocompletion-config.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-shell-config-autocompletion.h - Configuration page for addressbook autocompletion. - * - * Copyright (C) 2003 Novell, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Authors: Chris Toshok <toshok@ximian.com> - */ - -#ifndef _AUTOCOMPLETION_CONFIG_H -#define _AUTOCOMPLETION_CONFIG_H - -#include "evolution-config-control.h" - -EvolutionConfigControl* autocompletion_config_control_new (void); - -#endif /* _AUTOCOMPLETION_CONFIG_H */ diff --git a/addressbook/gui/component/component-factory.c b/addressbook/gui/component/component-factory.c deleted file mode 100644 index 382722785e..0000000000 --- a/addressbook/gui/component/component-factory.c +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* component-factory.c - Factory for Evolution's Addressbook component. - * - * Copyright (C) 2002 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli <ettore@ximian.com> - */ - -#include <config.h> - -#include <string.h> -#include "addressbook.h" -#include "addressbook-component.h" -#include "addressbook-config.h" -#include "addressbook-view.h" -#include "autocompletion-config.h" -#include "eab-popup-control.h" -#include "eab-vcard-control.h" -#include "select-names/e-select-names-bonobo.h" -#ifdef ENABLE_SMIME -#include "smime/gui/certificate-manager.h" -#endif -#include <bonobo/bonobo-shlib-factory.h> - - -#define FACTORY_ID "OAFIID:GNOME_Evolution_Addressbook_Factory:" BASE_VERSION - -#define VCARD_CONTROL_ID "OAFIID:GNOME_Evolution_Addressbook_VCard_Control:" BASE_VERSION -#define COMPONENT_ID "OAFIID:GNOME_Evolution_Addressbook_Component:" BASE_VERSION -#define ADDRESS_POPUP_ID "OAFIID:GNOME_Evolution_Addressbook_AddressPopup:" BASE_VERSION -#define SELECT_NAMES_ID "OAFIID:GNOME_Evolution_Addressbook_SelectNames:" BASE_VERSION -#define COMPLETION_CONFIG_CONTROL_ID "OAFIID:GNOME_Evolution_Addressbook_Autocompletion_ConfigControl:" BASE_VERSION -#define CERTIFICATE_MANAGER_CONFIG_CONTROL_ID "OAFIID:GNOME_Evolution_SMime_CertificateManager_ConfigControl:" BASE_VERSION - -#define d(x) - - -static BonoboObject * -factory (BonoboGenericFactory *factory, - const char *component_id, - void *closure) -{ - d(printf ("asked to activate component_id `%s'\n", component_id)); - - if (strcmp (component_id, VCARD_CONTROL_ID) == 0) - return BONOBO_OBJECT (eab_vcard_control_new ()); - if (strcmp (component_id, COMPONENT_ID) == 0) { - BonoboObject *object = BONOBO_OBJECT (addressbook_component_peek ()); - bonobo_object_ref (object); - return object; - } - if (strcmp (component_id, ADDRESS_POPUP_ID) == 0) - return BONOBO_OBJECT (eab_popup_control_new ()); - if (strcmp (component_id, COMPLETION_CONFIG_CONTROL_ID) == 0) - return BONOBO_OBJECT (autocompletion_config_control_new ()); - if (strcmp (component_id, SELECT_NAMES_ID) == 0) - return BONOBO_OBJECT (e_select_names_bonobo_new ()); -#ifdef ENABLE_SMIME - if (strcmp (component_id, CERTIFICATE_MANAGER_CONFIG_CONTROL_ID) == 0) - return BONOBO_OBJECT (certificate_manager_config_control_new ()); -#endif - - g_warning (FACTORY_ID ": Don't know what to do with %s", component_id); - return NULL; -} - -BONOBO_ACTIVATION_SHLIB_FACTORY (FACTORY_ID, "Evolution Addressbook component factory", factory, NULL) diff --git a/addressbook/gui/component/ldap-config.glade b/addressbook/gui/component/ldap-config.glade deleted file mode 100644 index ba26736e04..0000000000 --- a/addressbook/gui/component/ldap-config.glade +++ /dev/null @@ -1,2642 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> - -<widget class="GtkDialog" id="account-editor-window"> - <property name="visible">True</property> - <property name="title" translatable="yes">Address Book Properties</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="has_separator">False</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox7"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area7"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - - <child> - <widget class="GtkButton" id="account-editor-cancel-button"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-6</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="account-editor-ok-button"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-ok</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-5</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkNotebook" id="account-editor-notebook"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="show_tabs">True</property> - <property name="show_border">True</property> - <property name="tab_pos">GTK_POS_TOP</property> - <property name="scrollable">False</property> - <property name="enable_popup">False</property> - - <child> - <widget class="GtkVBox" id="account-editor-general-vbox"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkLabel" id="label564"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Display</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox122"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkLabel" id="label563"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label431"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Name:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">account-editor-display-name-entry</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="account-editor-display-name-entry"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">This is the name for this server that will appear in your Evolution folder list. It is for display purposes only. </property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="account-editor-connecting-vbox"> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkLabel" id="label557"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Server Information</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox123"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkLabel" id="label558"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="table31"> - <property name="visible">True</property> - <property name="n_rows">3</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label554"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Port:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry27</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label556"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Server:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">server-name-entry</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox123"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkLabel" id="label555"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Use secure connection:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">ssl-optionmenu</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="ssl-optionmenu"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child internal-child="menu"> - <widget class="GtkMenu" id="convertwidget41"> - <property name="visible">True</property> - - <child> - <widget class="GtkMenuItem" id="convertwidget42"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">Selecting this option means that Evolution will only connect to your LDAP server if your LDAP server supports SSL or TLS.</property> - <property name="label" translatable="yes">Always</property> - <property name="use_underline">True</property> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="convertwidget43"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">Selecting this option means that Evolution will only try to use SSL/TLS if you are in a insecure environment. For example, if you and your LDAP server are behind a firewall at work, then Evolution doesn't need to use SSL/TLS because your connection is already secure.</property> - <property name="label" translatable="yes">Whenever Possible</property> - <property name="use_underline">True</property> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="convertwidget44"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">Selecting this option means that your server does not support either SSL or TLS. This means that your connection will be insecure, and that you will be vulnerable to security exploits. </property> - <property name="label" translatable="yes">Never</property> - <property name="use_underline">True</property> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">expand|shrink|fill</property> - <property name="y_options">shrink|fill</property> - </packing> - </child> - - <child> - <widget class="GtkCombo" id="port-combo"> - <property name="visible">True</property> - <property name="value_in_list">False</property> - <property name="allow_empty">True</property> - <property name="case_sensitive">False</property> - <property name="enable_arrow_keys">True</property> - <property name="enable_arrows_always">False</property> - - <child internal-child="entry"> - <widget class="GtkEntry" id="entry27"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">This is the port on the LDAP server that Evolution will try to connect to. A list of standard ports has been provided. Ask your system administrator what port you should specify.</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - </child> - - <child internal-child="list"> - <widget class="GtkList" id="convertwidget32"> - <property name="visible">True</property> - <property name="selection_mode">GTK_SELECTION_BROWSE</property> - - <child> - <widget class="GtkListItem" id="listitem16"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">389</property> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="listitem17"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">636</property> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="listitem18"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">3268</property> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="server-name-entry"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">This is the full name of your ldap server. For example, "ldap.mycompany.com".</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label559"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Authentication</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox124"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkLabel" id="label562"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="table32"> - <property name="visible">True</property> - <property name="n_rows">2</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label560"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Log in method:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">auth-optionmenu</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label561"> - <property name="visible">True</property> - <property name="label" translatable="yes">Lo_gin:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">auth-entry</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="auth-optionmenu"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">This is the method evolution will use to authenticate you. Note that setting this to "Email Address" requires anonymous access to your ldap server.</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child internal-child="menu"> - <widget class="GtkMenu" id="convertwidget28"> - <property name="visible">True</property> - - <child> - <widget class="GtkMenuItem" id="convertwidget29"> - <property name="visible">True</property> - <property name="label" translatable="yes">Anonymously</property> - <property name="use_underline">True</property> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="convertwidget30"> - <property name="visible">True</property> - <property name="label" translatable="yes">Using email address</property> - <property name="use_underline">True</property> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="convertwidget31"> - <property name="visible">True</property> - <property name="label" translatable="yes">Using distinguished name (DN)</property> - <property name="use_underline">True</property> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">expand|shrink|fill</property> - <property name="y_options">shrink</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="auth-entry"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">Evolution will use this email address to authenticate you with the server.</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="tab_expand">False</property> - <property name="tab_fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label334"> - <property name="visible">True</property> - <property name="label" translatable="yes">General</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">tab</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="account-editor-searching-vbox"> - <property name="border_width">12</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkLabel" id="label565"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Searching</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox125"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkLabel" id="label571"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="table33"> - <property name="visible">True</property> - <property name="n_rows">3</property> - <property name="n_columns">3</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label569"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label566"> - <property name="visible">True</property> - <property name="label" translatable="yes">Search _base:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">rootdn-entry</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">expand|shrink|fill</property> - <property name="y_options">shrink|fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label567"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Search scope:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">scope-optionmenu</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">expand|shrink|fill</property> - <property name="y_options">shrink|fill</property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="scope-optionmenu"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">The search scope defines how deep you would like the search to extend down the directory tree. A search scope of "sub" will include all entries below your search base. A search scope of "one" will only include the entries one level beneath your base.</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu12"> - - <child> - <widget class="GtkMenuItem" id="menuitem7"> - <property name="visible">True</property> - <property name="label" translatable="yes">One</property> - <property name="use_underline">True</property> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem8"> - <property name="visible">True</property> - <property name="label" translatable="yes">Sub</property> - <property name="use_underline">True</property> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">expand|shrink|fill</property> - <property name="y_options">shrink|fill</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="rootdn-entry"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">The search base is the distinguished name (DN) of the entry where your searches will begin. If you leave this blank, the search will begin at the root of the directory tree.</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">expand|shrink|fill</property> - <property name="y_options">shrink|fill</property> - </packing> - </child> - - <child> - <widget class="GtkButton" id="rootdn-button"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - - <child> - <widget class="GtkAlignment" id="alignment61"> - <property name="visible">True</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - - <child> - <widget class="GtkHBox" id="hbox126"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">2</property> - - <child> - <widget class="GtkImage" id="image10"> - <property name="visible">True</property> - <property name="stock">gtk-find</property> - <property name="icon_size">4</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label568"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Find Possible Search Bases</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">expand|shrink|fill</property> - <property name="y_options">shrink|fill</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label572"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Downloading</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox127"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkLabel" id="label579"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="table34"> - <property name="visible">True</property> - <property name="n_rows">2</property> - <property name="n_columns">3</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkHBox" id="hbox128"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkLabel" id="label575"> - <property name="visible">True</property> - <property name="label" translatable="yes">1</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkHScale" id="timeout-scale"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="draw_value">False</property> - <property name="value_pos">GTK_POS_TOP</property> - <property name="digits">1</property> - <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> - <property name="inverted">False</property> - <property name="adjustment">3 1 5 0.5 1 0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label576"> - <property name="visible">True</property> - <property name="label" translatable="yes">5</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">expand|shrink|fill</property> - <property name="y_options">shrink|fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label574"> - <property name="visible">True</property> - <property name="label" translatable="yes">minutes</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">shrink|fill</property> - <property name="y_options">shrink|fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label578"> - <property name="visible">True</property> - <property name="label" translatable="yes">cards</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">shrink|fill</property> - <property name="y_options">shrink|fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label573"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Timeout:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">timeout-scale</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">shrink|fill</property> - <property name="y_options">shrink|fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label577"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Download limit:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">download-limit-spinbutton</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">shrink|fill</property> - <property name="y_options">shrink|fill</property> - </packing> - </child> - - <child> - <widget class="GtkSpinButton" id="download-limit-spinbutton"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">This is the maximum number of entries to download. Setting this number to be too large will slow down your address book.</property> - <property name="can_focus">True</property> - <property name="climb_rate">1</property> - <property name="digits">0</property> - <property name="numeric">False</property> - <property name="update_policy">GTK_UPDATE_ALWAYS</property> - <property name="snap_to_ticks">False</property> - <property name="wrap">False</property> - <property name="adjustment">0 0 1000 1 10 10</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">expand|shrink|fill</property> - <property name="y_options">shrink|fill</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="tab_expand">False</property> - <property name="tab_fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label344"> - <property name="visible">True</property> - <property name="label" translatable="yes">Details</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">tab</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -<widget class="GtkDialog" id="supported-bases-dialog"> - <property name="visible">False</property> - <property name="title" translatable="yes">Supported Search Bases</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_CENTER</property> - <property name="modal">False</property> - <property name="default_width">320</property> - <property name="default_height">200</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="has_separator">False</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox8"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area8"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - - <child> - <widget class="GtkButton" id="cancelbutton1"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-6</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="okbutton1"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-ok</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-5</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox40"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="Custom" id="supported-bases-table"> - <property name="visible">True</property> - <property name="creation_function">supported_bases_create_table</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Fri, 12 Apr 2002 20:06:45 GMT</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -<widget class="GtkDialog" id="account-add-window"> - <property name="visible">True</property> - <property name="title" translatable="yes">Add Address Book</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="has_separator">False</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox10"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area10"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - - <child> - <widget class="GtkButton" id="cancel-button"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-6</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="ok-button"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">0</property> - - <child> - <widget class="GtkAlignment" id="alignment62"> - <property name="visible">True</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - - <child> - <widget class="GtkHBox" id="hbox129"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">2</property> - - <child> - <widget class="GtkImage" id="image11"> - <property name="visible">True</property> - <property name="stock">gtk-add</property> - <property name="icon_size">4</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label580"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Add Address Book</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - </child> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkNotebook" id="notebook1"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="show_tabs">True</property> - <property name="show_border">True</property> - <property name="tab_pos">GTK_POS_TOP</property> - <property name="scrollable">False</property> - <property name="enable_popup">False</property> - - <child> - <widget class="GtkVBox" id="vbox5"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkHBox" id="hbox19"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkLabel" id="label64"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Type:</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="group-optionmenu"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">-1</property> - - <child> - <widget class="GtkMenu" id="menu11"> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="frame1"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkTable" id="table7"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">1</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkEntry" id="display-name-entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label41"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Name:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">display-name-entry</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label38"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Display</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="server-frame"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkTable" id="table8"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">3</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkEntry" id="server-name-entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label44"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Port:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">port-entry</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkCombo" id="port-combo"> - <property name="visible">True</property> - <property name="value_in_list">False</property> - <property name="allow_empty">True</property> - <property name="case_sensitive">False</property> - <property name="enable_arrow_keys">True</property> - <property name="enable_arrows_always">False</property> - - <child internal-child="entry"> - <widget class="GtkEntry" id="port-entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - </child> - - <child internal-child="list"> - <widget class="GtkList" id="combo-list1"> - <property name="visible">True</property> - <property name="selection_mode">GTK_SELECTION_BROWSE</property> - - <child> - <widget class="GtkListItem" id="listitem11"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">389</property> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="listitem12"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">636</property> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="listitem13"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">3268</property> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox15"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkLabel" id="label50"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Use secure connection:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">ssl-optionmenu</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="ssl-optionmenu"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu9"> - - <child> - <widget class="GtkMenuItem" id="always1"> - <property name="visible">True</property> - <property name="label" translatable="yes">Always</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_always1_activate" last_modification_time="Mon, 29 Mar 2004 21:37:12 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id=""> - <property name="visible">True</property> - <property name="label" translatable="yes">Whenever Possible</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_whenever_possible1_activate" last_modification_time="Mon, 29 Mar 2004 21:37:12 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="never1"> - <property name="visible">True</property> - <property name="label" translatable="yes">Never</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_never1_activate" last_modification_time="Mon, 29 Mar 2004 21:37:12 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="server-name-label"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Server:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">server-name-entry</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label39"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Server Information</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="authentication-frame"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkTable" id="table9"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">2</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label46"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Log in method:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">auth-optionmenu</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label47"> - <property name="visible">True</property> - <property name="label" translatable="yes">Lo_gin:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">auth-entry</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="auth-entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="auth-optionmenu"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu8"> - - <child> - <widget class="GtkMenuItem" id="anonymously1"> - <property name="visible">True</property> - <property name="label" translatable="yes">Anonymously</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_anonymously1_activate" last_modification_time="Mon, 29 Mar 2004 21:27:10 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="email_address2"> - <property name="visible">True</property> - <property name="label" translatable="yes">Email address</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_email_address2_activate" last_modification_time="Mon, 29 Mar 2004 21:27:10 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="distinguished_name2"> - <property name="visible">True</property> - <property name="label" translatable="yes">Distinguished name</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_distinguished_name2_activate" last_modification_time="Mon, 29 Mar 2004 21:27:10 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label49"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Authentication</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="tab_expand">False</property> - <property name="tab_fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="basic-label"> - <property name="visible">True</property> - <property name="label" translatable="yes">Basic</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">tab</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="details-vbox"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkFrame" id="searching-frame"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkTable" id="table10"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">3</property> - <property name="n_columns">3</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label53"> - <property name="visible">True</property> - <property name="label" translatable="yes">Search _base:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">rootdn-entry</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label54"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Search scope:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">scope-optionmenu</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="rootdn-entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkButton" id="rootdn-button"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - - <child> - <widget class="GtkAlignment" id="alignment13"> - <property name="visible">True</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - - <child> - <widget class="GtkHBox" id="hbox16"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">2</property> - - <child> - <widget class="GtkImage" id="image9"> - <property name="visible">True</property> - <property name="stock">gtk-find</property> - <property name="icon_size">4</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label57"> - <property name="visible">True</property> - <property name="label" translatable="yes">Find Possible Search Bases</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="scope-optionmenu"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu10"> - - <child> - <widget class="GtkMenuItem" id="one"> - <property name="visible">True</property> - <property name="label" translatable="yes">One</property> - <property name="use_underline">True</property> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="sub"> - <property name="visible">True</property> - <property name="label" translatable="yes">Sub</property> - <property name="use_underline">True</property> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label55"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label56"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label51"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Searching</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="downloading-frame"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkTable" id="table11"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">2</property> - <property name="n_columns">3</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label58"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Timeout:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">timeout-scale</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label59"> - <property name="visible">True</property> - <property name="label" translatable="yes">minutes</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox17"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkLabel" id="label60"> - <property name="visible">True</property> - <property name="label" translatable="yes">1</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkHScale" id="timeout-scale"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="draw_value">False</property> - <property name="value_pos">GTK_POS_TOP</property> - <property name="digits">1</property> - <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> - <property name="inverted">False</property> - <property name="adjustment">3 1 5 0.5 1 0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label61"> - <property name="visible">True</property> - <property name="label" translatable="yes">5</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label62"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Download limit:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">download-limit-spinbutton</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label63"> - <property name="visible">True</property> - <property name="label" translatable="yes">cards</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkSpinButton" id="download-limit-spinbutton"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="climb_rate">1</property> - <property name="digits">0</property> - <property name="numeric">False</property> - <property name="update_policy">GTK_UPDATE_ALWAYS</property> - <property name="snap_to_ticks">False</property> - <property name="wrap">False</property> - <property name="adjustment">0 0 1000 1 10 10</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label52"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Downloading</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="tab_expand">False</property> - <property name="tab_fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="details-label"> - <property name="visible">True</property> - <property name="label" translatable="yes">Details</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">tab</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -</glade-interface> diff --git a/addressbook/gui/component/select-names/.cvsignore b/addressbook/gui/component/select-names/.cvsignore deleted file mode 100644 index 1520453f86..0000000000 --- a/addressbook/gui/component/select-names/.cvsignore +++ /dev/null @@ -1,15 +0,0 @@ -.deps -.libs -.pure -Makefile -Makefile.in -*.lo -*.la -Evolution-Addressbook-SelectNames-stubs.c -Evolution-Addressbook-SelectNames-skels.c -Evolution-Addressbook-SelectNames-common.c -Evolution-Addressbook-SelectNames.h -GNOME_Evolution_Addressbook_SelectNames*.server -GNOME_Evolution_Addressbook_SelectNames*.server.in -e-select-names-marshal.c -e-select-names-marshal.h diff --git a/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl b/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl deleted file mode 100644 index 6feb6b54bb..0000000000 --- a/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl +++ /dev/null @@ -1,42 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * CORBA interface for the SelectNames dialog. - * - * Authors: - * Ettore Perazzoli <ettore@ximian.com> - * - * Copyright (C) 2000 Ximian, Inc. - */ - -#include <Bonobo.idl> - -module GNOME { -module Evolution { -module Addressbook { - - interface SelectNames : Bonobo::Unknown { - struct Section { - string id; - string title; - }; - - typedef sequence<Section> SectionList; - - exception DuplicateID {}; - exception SectionNotFound {}; - - void addSection (in string id, in string title) - raises (DuplicateID); - void addSectionWithLimit (in string id, in string title, in short limit) - raises (DuplicateID); - - Bonobo::Control getEntryBySection (in string section_id) - raises (SectionNotFound); - - void activateDialog (in string section_id); - }; - - -}; -}; -}; diff --git a/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in b/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in deleted file mode 100644 index 0a9f975463..0000000000 --- a/addressbook/gui/component/select-names/GNOME_Evolution_Addressbook_SelectNames.server.in.in +++ /dev/null @@ -1,31 +0,0 @@ -<oaf_info> - -<!-- -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_SelectNamesFactory:@VERSION@" - type="shlib" - location="@COMPONENTDIR@/libevolution-addressbook.so"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/ObjectFactory:1.0"/> - </oaf_attribute> - - <oaf_attribute name="name" type="string" - _value="Evolution Addressbook name selection interface"/> - -</oaf_server> ---> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_SelectNames:@VERSION@" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_Factory:@VERSION@"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/Evolution/Addressbook/SelectNames:@VERSION@"/> - </oaf_attribute> - - <oaf_attribute name="name" type="string" - _value="Evolution Addressbook name selection interface"/> - -</oaf_server> - -</oaf_info> diff --git a/addressbook/gui/component/select-names/Makefile.am b/addressbook/gui/component/select-names/Makefile.am deleted file mode 100644 index c8d0b83052..0000000000 --- a/addressbook/gui/component/select-names/Makefile.am +++ /dev/null @@ -1,96 +0,0 @@ -# CORBA stuff - -idl_DATA = \ - Evolution-Addressbook-SelectNames.idl - -IDL_GENERATED_H = \ - Evolution-Addressbook-SelectNames.h -IDL_GENERATED_C = \ - Evolution-Addressbook-SelectNames-common.c \ - Evolution-Addressbook-SelectNames-skels.c \ - Evolution-Addressbook-SelectNames-stubs.c -IDL_GENERATED = $(IDL_GENERATED_C) $(IDL_GENERATED_H) - -$(IDL_GENERATED_H): $(idl_DATA) - $(ORBIT_IDL) -I $(srcdir) $(IDL_INCLUDES) \ - $(srcdir)/Evolution-Addressbook-SelectNames.idl -$(IDL_GENERATED_C): $(IDL_GENERATED_H) - -server_in_files = GNOME_Evolution_Addressbook_SelectNames.server.in.in -server_DATA = $(server_in_files:.server.in.in=_$(BASE_VERSION).server) -@EVO_SERVER_RULE@ -@INTLTOOL_SERVER_RULE@ - -INCLUDES = \ - -DG_LOG_DOMAIN=\"evolution-addressbook\" \ - -I$(top_srcdir) \ - -I$(top_builddir) \ - -I$(top_srcdir)/shell \ - -I$(top_builddir)/shell \ - -I$(top_srcdir)/widgets/misc \ - -I$(top_srcdir)/addressbook/gui/minicard \ - -I$(top_srcdir)/addressbook/gui/widgets \ - -I$(top_srcdir)/addressbook/contact-editor \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_builddir)/addressbook/backend \ - -I$(top_srcdir)/addressbook/util \ - -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \ - -DEVOLUTION_DATADIR=\""$(datadir)"\" \ - -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ - -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \ - -DEVOLUTION_UIDIR=\""$(evolutionuidir)"\" \ - -DPREFIX=\""$(prefix)"\" \ - $(EVOLUTION_ADDRESSBOOK_CFLAGS) - -privlib_LTLIBRARIES = libeselectnames.la - -libeselectnames_la_SOURCES = \ - $(IDL_GENERATED) \ - $(MARSHAL_GENERATED) \ - e-select-names-bonobo.c \ - e-select-names-bonobo.h \ - e-select-names-completion.c \ - e-select-names-completion.h \ - e-select-names-config.c \ - e-select-names-config.h \ - e-select-names-config-keys.h \ - e-select-names-manager.c \ - e-select-names-manager.h \ - e-select-names-model.c \ - e-select-names-model.h \ - e-select-names-popup.c \ - e-select-names-popup.h \ - e-select-names-table-model.c \ - e-select-names-table-model.h \ - e-select-names-text-model.c \ - e-select-names-text-model.h \ - e-select-names.c \ - e-select-names.h - -libeselectnames_la_LIBADD = \ - $(EVOLUTION_ADDRESSBOOK_LIBS) - -# We'll need these again when we split out the select names control -# into its own shlib factory, but for now they're redundant. -# -# e-select-names-factory.c -# e-select-names-factory.h - -MARSHAL_GENERATED = e-select-names-marshal.c e-select-names-marshal.h -@EVO_MARSHAL_RULE@ - -glade_DATA = select-names.glade -etspec_DATA = e-select-names.etspec e-select-names-section.etspec - -EXTRA_DIST = \ - $(glade_DATA) \ - $(server_in_files) \ - $(idl_DATA) \ - $(etspec_DATA) \ - e-select-names-marshal.list - -BUILT_SOURCES = $(IDL_GENERATED) $(MARSHAL_GENERATED) $(server_DATA) -CLEANFILES = $(BUILT_SOURCES) - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) diff --git a/addressbook/gui/component/select-names/e-select-names-bonobo.c b/addressbook/gui/component/select-names/e-select-names-bonobo.c deleted file mode 100644 index 9c0245ff46..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-bonobo.c +++ /dev/null @@ -1,600 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-select-names-bonobo.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "e-select-names-bonobo.h" - -#include <bonobo-activation/bonobo-activation-activate.h> - -#include <bonobo/bonobo-property-bag.h> -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-exception.h> -#include <bonobo/bonobo-event-source.h> -#include <bonobo/bonobo-ui-util.h> - -#include <gal/util/e-util.h> -#include <gal/e-text/e-entry.h> -#include <gal/util/e-text-event-processor.h> - -#include "Evolution-Addressbook-SelectNames.h" - -#include "e-select-names-manager.h" -#include "e-select-names-model.h" -#include "e-select-names-text-model.h" -#include "e-select-names-completion.h" - -#include <string.h> - - -#define PARENT_TYPE BONOBO_TYPE_OBJECT -static BonoboObjectClass *parent_class = NULL; - -struct _ESelectNamesBonoboPrivate { - ESelectNamesManager *manager; - BonoboEventSource *event_source; -}; - -enum _EntryPropertyID { - ENTRY_PROPERTY_ID_TEXT, - ENTRY_PROPERTY_ID_ADDRESSES, - ENTRY_PROPERTY_ID_DESTINATIONS, - ENTRY_PROPERTY_ID_ALLOW_CONTACT_LISTS, - ENTRY_PROPERTY_ID_ENTRY_CHANGED -}; -typedef enum _EntryPropertyID EntryPropertyID; - - -/* PropertyBag implementation for the entry widgets. */ - -static void -entry_get_property_fn (BonoboPropertyBag *bag, - BonoboArg *arg, - unsigned int arg_id, - CORBA_Environment *ev, - void *user_data) -{ - GtkWidget *w; - - w = GTK_WIDGET (user_data); - - switch (arg_id) { - case ENTRY_PROPERTY_ID_TEXT: - { - ETextModel *text_model; - text_model = E_TEXT_MODEL (g_object_get_data (G_OBJECT (w), "select_names_text_model")); - g_assert (text_model != NULL); - - BONOBO_ARG_SET_STRING (arg, e_text_model_get_text (text_model)); - break; - } - - case ENTRY_PROPERTY_ID_ADDRESSES: - { - ESelectNamesModel *model; - char *text; - - model = E_SELECT_NAMES_MODEL (g_object_get_data (G_OBJECT (w), "select_names_model")); - g_assert (model != NULL); - - text = e_select_names_model_get_address_text (model, ", "); - BONOBO_ARG_SET_STRING (arg, text); - g_free (text); - } - break; - - case ENTRY_PROPERTY_ID_DESTINATIONS: - { - ESelectNamesModel *model; - char *text; - - model = E_SELECT_NAMES_MODEL (g_object_get_data (G_OBJECT (w), "select_names_model")); - g_assert (model != NULL); - - text = e_select_names_model_export_destinationv (model); - BONOBO_ARG_SET_STRING (arg, text); - g_free (text); - } - break; - - case ENTRY_PROPERTY_ID_ALLOW_CONTACT_LISTS: - { - ESelectNamesCompletion *comp; - comp = E_SELECT_NAMES_COMPLETION (g_object_get_data (G_OBJECT (w), "completion_handler")); - g_assert (comp != NULL); - - BONOBO_ARG_SET_BOOLEAN (arg, e_select_names_completion_get_match_contact_lists (comp)); - break; - } - - case ENTRY_PROPERTY_ID_ENTRY_CHANGED: - /* This is a read-only property. */ - g_assert_not_reached (); - break; - - default: - break; - } -} - -static void -entry_set_property_fn (BonoboPropertyBag *bag, - const BonoboArg *arg, - guint arg_id, - CORBA_Environment *ev, - gpointer user_data) -{ - GtkWidget *w; - - w = GTK_WIDGET (user_data); - - switch (arg_id) { - - case ENTRY_PROPERTY_ID_TEXT: - case ENTRY_PROPERTY_ID_ADDRESSES: - { - ESelectNamesModel *model; - model = E_SELECT_NAMES_MODEL (g_object_get_data (G_OBJECT (w), "select_names_model")); - g_assert (model != NULL); - - e_entry_set_text (E_ENTRY (w), BONOBO_ARG_GET_STRING (arg)); - e_select_names_model_load_contacts (model); - break; - } - - case ENTRY_PROPERTY_ID_DESTINATIONS: - { - ESelectNamesModel *model; - model = E_SELECT_NAMES_MODEL (g_object_get_data (G_OBJECT (w), "select_names_model")); - g_assert (model != NULL); - - e_select_names_model_import_destinationv (model, BONOBO_ARG_GET_STRING (arg)); - e_select_names_model_load_contacts (model); - break; - } - - case ENTRY_PROPERTY_ID_ALLOW_CONTACT_LISTS: - { - ESelectNamesCompletion *comp; - comp = E_SELECT_NAMES_COMPLETION (g_object_get_data (G_OBJECT (w), "completion_handler")); - g_assert (comp != NULL); - - e_select_names_completion_set_match_contact_lists (comp, BONOBO_ARG_GET_BOOLEAN (arg)); - break; - } - - case ENTRY_PROPERTY_ID_ENTRY_CHANGED: - g_object_set_data (G_OBJECT (w), "entry_property_id_changed", GUINT_TO_POINTER (1)); - break; - - default: - break; - } -} - -static void -impl_SelectNames_add_section (PortableServer_Servant servant, - const CORBA_char *id, - const CORBA_char *title, - CORBA_Environment *ev) -{ - ESelectNamesBonobo *select_names; - ESelectNamesBonoboPrivate *priv; - - select_names = E_SELECT_NAMES_BONOBO (bonobo_object (servant)); - priv = select_names->priv; - - e_select_names_manager_add_section (priv->manager, id, title); -} - -static void -impl_SelectNames_add_section_with_limit (PortableServer_Servant servant, - const CORBA_char *id, - const CORBA_char *title, - CORBA_short limit, - CORBA_Environment *ev) -{ - ESelectNamesBonobo *select_names; - ESelectNamesBonoboPrivate *priv; - - select_names = E_SELECT_NAMES_BONOBO (bonobo_object (servant)); - priv = select_names->priv; - - e_select_names_manager_add_section_with_limit (priv->manager, id, title, limit); -} - -static void -entry_changed (GtkWidget *widget, BonoboControl *control) -{ - gboolean changed = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (widget), "entry_property_id_changed")); - - if (!changed) - bonobo_control_set_property (control, NULL, "entry_changed", TC_CORBA_boolean, TRUE, NULL); -} - -static void -manager_changed_cb (ESelectNamesManager *manager, const gchar *section_id, gint changed_working_copy, gpointer closure) -{ - ESelectNamesBonobo *select_names = E_SELECT_NAMES_BONOBO (closure); - BonoboArg *arg; - - arg = bonobo_arg_new (BONOBO_ARG_STRING); - BONOBO_ARG_SET_STRING (arg, section_id); - - bonobo_event_source_notify_listeners_full (select_names->priv->event_source, - "GNOME/Evolution", - "changed", - changed_working_copy ? "working_copy" : "model", - arg, NULL); - - bonobo_arg_release (arg); -} - -static void -manager_ok_cb (ESelectNamesManager *manager, gpointer closure) -{ - ESelectNamesBonobo *select_names = E_SELECT_NAMES_BONOBO (closure); - BonoboArg *arg; - - arg = bonobo_arg_new (BONOBO_ARG_NULL); - - bonobo_event_source_notify_listeners_full (select_names->priv->event_source, - "GNOME/Evolution", - "ok", - "dialog", - arg, - NULL); - - bonobo_arg_release (arg); -} - -static void -copy_cb (BonoboUIComponent *ui, gpointer user_data, const char *command) -{ - EEntry *entry = E_ENTRY (user_data); - - e_text_copy_clipboard (entry->item); -} - -static void -cut_cb (BonoboUIComponent *ui, gpointer user_data, const char *command) -{ - EEntry *entry = E_ENTRY (user_data); - - e_text_cut_clipboard (entry->item); -} - -static void -paste_cb (BonoboUIComponent *ui, gpointer user_data, const char *command) -{ - EEntry *entry = E_ENTRY (user_data); - - e_text_paste_clipboard (entry->item); -} - -static void -select_all_cb (BonoboUIComponent *ui, gpointer user_data, const char *command) -{ - EEntry *entry = E_ENTRY (user_data); - - e_text_select_all (entry->item); -} - -static BonoboUIVerb verbs [] = { - BONOBO_UI_VERB ("EditCut", cut_cb), - BONOBO_UI_VERB ("EditCopy", copy_cb), - BONOBO_UI_VERB ("EditPaste", paste_cb), - BONOBO_UI_VERB ("EditSelectAll", select_all_cb), - BONOBO_UI_VERB_END -}; - -typedef struct { - GtkWidget *widget; - BonoboControl *control; - Bonobo_UIContainer remote_ui_container; - char *ui_xml_path; - char *app_name; - BonoboUIVerb *verbs; - gpointer user_data; -} ControlUIClosure; - -static void -free_closure (ControlUIClosure *closure, - GtkObject *where_object_was) -{ - bonobo_object_release_unref (closure->remote_ui_container, NULL); - g_free (closure->ui_xml_path); - g_free (closure->app_name); - g_free (closure); -} - -static void -merge_menu_items (BonoboControl *control, BonoboUIComponent *uic, ControlUIClosure *closure) -{ - if (closure->remote_ui_container) { - bonobo_ui_component_set_container (uic, closure->remote_ui_container, NULL); - - bonobo_ui_component_add_verb_list_with_data (uic, closure->verbs, closure->user_data); - - bonobo_ui_component_freeze (uic, NULL); - - bonobo_ui_util_set_ui (uic, PREFIX, - closure->ui_xml_path, - closure->app_name, NULL); - - bonobo_ui_component_thaw (uic, NULL); - } -} - -static void -unmerge_menu_items (BonoboControl *control, BonoboUIComponent *uic, ControlUIClosure *closure) -{ - bonobo_ui_component_unset_container (uic, NULL); -} - -static void -control_set_frame_cb (BonoboControl *control, - ControlUIClosure *closure) -{ - Bonobo_ControlFrame frame = bonobo_control_get_control_frame (control, - NULL); - if (!frame) - return; - closure->remote_ui_container = bonobo_control_get_remote_ui_container (control, NULL); -} - -static void -control_activate_cb (BonoboControl *control, - gboolean activate, - ControlUIClosure *closure) -{ - if (activate) - gtk_widget_grab_focus (closure->widget); /* the ECanvas */ -} - -static gboolean -widget_focus_cb (GtkWidget *w, GdkEventFocus *focus, ControlUIClosure *closure) -{ - BonoboUIComponent *uic; - - uic = bonobo_control_get_ui_component (closure->control); - - if (GTK_WIDGET_HAS_FOCUS (w)) { - merge_menu_items (closure->control, uic, closure); - } else { - unmerge_menu_items (closure->control, uic, closure); - } - - return FALSE; -} - -static void -e_bonobo_control_automerge_ui (GtkWidget *w, - BonoboControl *control, - const char *ui_xml_path, - const char *app_name, - BonoboUIVerb *verbs, - gpointer data) -{ - ControlUIClosure *closure; - - g_return_if_fail (GTK_IS_WIDGET (w)); - g_return_if_fail (BONOBO_IS_CONTROL (control)); - g_return_if_fail (ui_xml_path != NULL); - g_return_if_fail (app_name != NULL); - g_return_if_fail (verbs != NULL); - - closure = g_new (ControlUIClosure, 1); - - closure->widget = w; - closure->control = control; - closure->ui_xml_path = g_strdup (ui_xml_path); - closure->app_name = g_strdup (app_name); - closure->verbs = verbs; - closure->user_data = data; - - g_signal_connect (w, "focus_in_event", - G_CALLBACK (widget_focus_cb), closure); - g_signal_connect (w, "focus_out_event", - G_CALLBACK (widget_focus_cb), closure); - g_signal_connect (control, "activate", - G_CALLBACK (control_activate_cb), closure); - g_signal_connect (control, "set_frame", - G_CALLBACK (control_set_frame_cb), closure); - - g_object_weak_ref (G_OBJECT (control), (GWeakNotify)free_closure, closure); -} - -static Bonobo_Control -impl_SelectNames_get_entry_for_section (PortableServer_Servant servant, - const CORBA_char *section_id, - CORBA_Environment *ev) -{ - ESelectNamesBonobo *select_names; - ESelectNamesBonoboPrivate *priv; - GtkWidget *entry_widget; - BonoboControl *control; - BonoboPropertyBag *property_bag; - - select_names = E_SELECT_NAMES_BONOBO (bonobo_object (servant)); - priv = select_names->priv; - - entry_widget = e_select_names_manager_create_entry (priv->manager, section_id); - gtk_widget_show (entry_widget); - - if (entry_widget == NULL) { - CORBA_exception_set (ev, - CORBA_USER_EXCEPTION, - ex_GNOME_Evolution_Addressbook_SelectNames_SectionNotFound, - NULL); - return CORBA_OBJECT_NIL; - } - - control = bonobo_control_new (entry_widget); - - property_bag = bonobo_property_bag_new (entry_get_property_fn, entry_set_property_fn, entry_widget); - bonobo_property_bag_add (property_bag, "text", ENTRY_PROPERTY_ID_TEXT, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - bonobo_property_bag_add (property_bag, "addresses", ENTRY_PROPERTY_ID_ADDRESSES, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - bonobo_property_bag_add (property_bag, "destinations", ENTRY_PROPERTY_ID_DESTINATIONS, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - bonobo_property_bag_add (property_bag, "allow_contact_lists", ENTRY_PROPERTY_ID_ALLOW_CONTACT_LISTS, - BONOBO_ARG_BOOLEAN, NULL, NULL, - BONOBO_PROPERTY_READABLE | BONOBO_PROPERTY_WRITEABLE); - bonobo_property_bag_add (property_bag, "entry_changed", ENTRY_PROPERTY_ID_ENTRY_CHANGED, - BONOBO_ARG_BOOLEAN, NULL, NULL, - BONOBO_PROPERTY_WRITEABLE); - - bonobo_control_set_properties (control, bonobo_object_corba_objref (BONOBO_OBJECT (property_bag)), NULL); - bonobo_object_unref (BONOBO_OBJECT (property_bag)); - - g_signal_connect (entry_widget, "changed", G_CALLBACK (entry_changed), control); - - e_bonobo_control_automerge_ui (GTK_WIDGET (E_ENTRY (entry_widget)->canvas), - control, - EVOLUTION_UIDIR "/evolution-composer-entries.xml", - "evolution-addressbook", - verbs, entry_widget); - - return CORBA_Object_duplicate (bonobo_object_corba_objref (BONOBO_OBJECT (control)), ev); -} - -static void -impl_SelectNames_activate_dialog (PortableServer_Servant servant, - const CORBA_char *section_id, - CORBA_Environment *ev) -{ - ESelectNamesBonobo *select_names; - ESelectNamesBonoboPrivate *priv; - - select_names = E_SELECT_NAMES_BONOBO (bonobo_object (servant)); - priv = select_names->priv; - - e_select_names_manager_activate_dialog (priv->manager, section_id); -} - - -/* GtkObject methods. */ - -static void -impl_dispose (GObject *object) -{ - ESelectNamesBonobo *select_names; - ESelectNamesBonoboPrivate *priv; - - select_names = E_SELECT_NAMES_BONOBO (object); - priv = select_names->priv; - - if (priv) { - if (priv->manager->names) { - gtk_widget_destroy (GTK_WIDGET (priv->manager->names)); - priv->manager->names = NULL; - } - - g_object_unref (priv->manager); - - g_free (priv); - select_names->priv = NULL; - } - - if (G_OBJECT_CLASS (parent_class)->dispose) - G_OBJECT_CLASS (parent_class)->dispose (object); -} - - -static void -e_select_names_bonobo_class_init (ESelectNamesBonoboClass *klass) -{ - GObjectClass *object_class; - POA_GNOME_Evolution_Addressbook_SelectNames__epv *epv; - - object_class = G_OBJECT_CLASS (klass); - parent_class = g_type_class_peek_parent (klass); - - object_class->dispose = impl_dispose; - - epv = &klass->epv; - epv->addSection = impl_SelectNames_add_section; - epv->addSectionWithLimit = impl_SelectNames_add_section_with_limit; - epv->getEntryBySection = impl_SelectNames_get_entry_for_section; - epv->activateDialog = impl_SelectNames_activate_dialog; -} - -static void -e_select_names_bonobo_init (ESelectNamesBonobo *select_names) -{ - ESelectNamesBonoboPrivate *priv; - - priv = g_new (ESelectNamesBonoboPrivate, 1); - - priv->manager = e_select_names_manager_new (); - priv->event_source = NULL; - - g_signal_connect (priv->manager, - "changed", - G_CALLBACK (manager_changed_cb), - select_names); - - g_signal_connect (priv->manager, - "ok", - G_CALLBACK (manager_ok_cb), - select_names); - - select_names->priv = priv; -} - - -static void -e_select_names_bonobo_construct (ESelectNamesBonobo *select_names) -{ - g_return_if_fail (select_names != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_BONOBO (select_names)); - - g_assert (select_names->priv->event_source == NULL); - select_names->priv->event_source = bonobo_event_source_new (); - bonobo_object_add_interface (BONOBO_OBJECT (select_names), BONOBO_OBJECT (select_names->priv->event_source)); -} - -ESelectNamesBonobo * -e_select_names_bonobo_new (void) -{ - ESelectNamesBonobo *select_names; - - select_names = g_object_new (E_TYPE_SELECT_NAMES_BONOBO, NULL); - - e_select_names_bonobo_construct (select_names); - - return select_names; -} - - -BONOBO_TYPE_FUNC_FULL ( - ESelectNamesBonobo, - GNOME_Evolution_Addressbook_SelectNames, - PARENT_TYPE, - e_select_names_bonobo); diff --git a/addressbook/gui/component/select-names/e-select-names-bonobo.h b/addressbook/gui/component/select-names/e-select-names-bonobo.h deleted file mode 100644 index 5b04ed5b2e..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-bonobo.h +++ /dev/null @@ -1,66 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-select-names-bonobo.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef __E_SELECT_NAMES_BONOBO_H__ -#define __E_SELECT_NAMES_BONOBO_H__ - -#include <bonobo/bonobo-object.h> - -#include "Evolution-Addressbook-SelectNames.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_SELECT_NAMES_BONOBO (e_select_names_bonobo_get_type ()) -#define E_SELECT_NAMES_BONOBO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SELECT_NAMES_BONOBO, ESelectNamesBonobo)) -#define E_SELECT_NAMES_BONOBO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_BONOBO, ESelectNamesBonoboClass)) -#define E_IS_SELECT_NAMES_BONOBO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SELECT_NAMES_BONOBO)) -#define E_IS_SELECT_NAMES_BONOBO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_BONOBO)) - - -typedef struct _ESelectNamesBonobo ESelectNamesBonobo; -typedef struct _ESelectNamesBonoboPrivate ESelectNamesBonoboPrivate; -typedef struct _ESelectNamesBonoboClass ESelectNamesBonoboClass; - -struct _ESelectNamesBonobo { - BonoboObject parent; - - ESelectNamesBonoboPrivate *priv; -}; - -struct _ESelectNamesBonoboClass { - BonoboObjectClass parent_class; - - POA_GNOME_Evolution_Addressbook_SelectNames__epv epv; -}; - - -GType e_select_names_bonobo_get_type (void); -ESelectNamesBonobo *e_select_names_bonobo_new (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_SELECT_NAMES_BONOBO_H__ */ diff --git a/addressbook/gui/component/select-names/e-select-names-completion.c b/addressbook/gui/component/select-names/e-select-names-completion.c deleted file mode 100644 index 2bf0341e40..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-completion.c +++ /dev/null @@ -1,1236 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-select-names-completion.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#include <config.h> -#include "e-select-names-completion.h" - -#include <ctype.h> -#include <stdio.h> -#include <string.h> -#include <math.h> - -#include <gtk/gtksignal.h> - -#include <libebook/e-contact.h> -#include <addressbook/util/eab-book-util.h> -#include <addressbook/util/e-destination.h> -#include <addressbook/gui/merging/eab-contact-compare.h> - -#include <e-util/e-sexp.h> - -typedef struct { - EBook *book; - guint book_view_tag; - EBookView *book_view; - ESelectNamesCompletion *comp; - guint contacts_added_tag; - guint seq_complete_tag; - gboolean sequence_complete_received; - - gchar *cached_query_text; - GList *cached_cards; - gboolean cache_complete; - -} ESelectNamesCompletionBookData; - -struct _ESelectNamesCompletionPrivate { - - ESelectNamesTextModel *text_model; - - GList *book_data; - gint books_not_ready; - gint pending_completion_seq; - - gchar *waiting_query; - gint waiting_pos, waiting_limit; - gchar *query_text; - - gboolean match_contact_lists; - - gint minimum_query_length; -}; - -static void e_select_names_completion_class_init (ESelectNamesCompletionClass *); -static void e_select_names_completion_init (ESelectNamesCompletion *); -static void e_select_names_completion_dispose (GObject *object); - -static void e_select_names_completion_got_book_view_cb (EBook *book, EBookStatus status, EBookView *view, gpointer user_data); -static void e_select_names_completion_contacts_added_cb (EBookView *, const GList *cards, gpointer user_data); -static void e_select_names_completion_seq_complete_cb (EBookView *, EBookViewStatus status, gpointer user_data); - -static void e_select_names_completion_do_query (ESelectNamesCompletion *, const gchar *query_text, gint pos, gint limit); - -static void e_select_names_completion_handle_request (ECompletion *, const gchar *txt, gint pos, gint limit); -static void e_select_names_completion_end (ECompletion *); - -static GObjectClass *parent_class; - -static FILE *out; - -/* - * - * Query builders - * - */ - -typedef gchar *(*BookQuerySExp) (ESelectNamesCompletion *); -typedef ECompletionMatch *(*BookQueryMatchTester) (ESelectNamesCompletion *, EDestination *); - -static int -utf8_casefold_collate_len (const gchar *str1, const gchar *str2, int len) -{ - gchar *s1 = g_utf8_casefold(str1, len); - gchar *s2 = g_utf8_casefold(str2, len); - int rv; - - rv = g_utf8_collate (s1, s2); - - g_free (s1); - g_free (s2); - - return rv; -} - -static int -utf8_casefold_collate (const gchar *str1, const gchar *str2) -{ - return utf8_casefold_collate_len (str1, str2, -1); -} - -static void -our_match_destroy (ECompletionMatch *match) -{ - g_object_unref (match->user_data); -} - -static ECompletionMatch * -make_match (EDestination *dest, const gchar *menu_form, double score) -{ - ECompletionMatch *match; -#if notyet - EContact *contact = e_destination_get_contact (dest); -#endif - - match = e_completion_match_new (e_destination_get_name (dest), menu_form, score); - - e_completion_match_set_text (match, e_destination_get_name (dest), menu_form); - - /* Reject any match that has null text fields. */ - if (! (e_completion_match_get_match_text (match) && e_completion_match_get_menu_text (match))) { - g_object_unref (match); - return NULL; - } - -#if notyet - /* XXX toshok - EContact doesn't have the use_score stuff */ - /* Since we sort low to high, we negate so that larger use scores will come first */ - match->sort_major = contact ? -floor (e_contact_get_use_score (contact)) : 0; -#else - match->sort_major = 0; -#endif - - match->sort_minor = e_destination_get_email_num (dest); - - match->user_data = g_object_ref (dest); - - match->destroy = our_match_destroy; - - return match; -} - -/* - * Nickname query - */ - -static gchar * -sexp_nickname (ESelectNamesCompletion *comp) -{ - gchar *query = g_strdup_printf ("(beginswith \"nickname\" \"%s\")", comp->priv->query_text); - - return query; -} - -static ECompletionMatch * -match_nickname (ESelectNamesCompletion *comp, EDestination *dest) -{ - ECompletionMatch *match = NULL; - gint len; - EContact *contact = e_destination_get_contact (dest); - double score; - const char *nickname; - - nickname = e_contact_get_const (contact, E_CONTACT_NICKNAME); - if (nickname == NULL) - return NULL; - - len = g_utf8_strlen (comp->priv->query_text, -1); - if (nickname && !utf8_casefold_collate_len (comp->priv->query_text, nickname, len)) { - const gchar *name; - gchar *str; - - score = len * 2; /* nickname gives 2 points per matching character */ - - if (len == g_utf8_strlen (nickname, -1)) /* boost score on an exact match */ - score *= 10; - - name = e_destination_get_name (dest); - if (name && *name) - str = g_strdup_printf ("'%s' %s <%s>", nickname, name, e_destination_get_email (dest)); - else - str = g_strdup_printf ("'%s' <%s>", nickname, e_destination_get_email (dest)); - - match = make_match (dest, str, score); - g_free (str); - } - - return match; -} - -/* - * E-Mail Query - */ - -static gchar * -sexp_email (ESelectNamesCompletion *comp) -{ - return g_strdup_printf ("(beginswith \"email\" \"%s\")", comp->priv->query_text); -} - -static ECompletionMatch * -match_email (ESelectNamesCompletion *comp, EDestination *dest) -{ - ECompletionMatch *match; - gint len = strlen (comp->priv->query_text); - const gchar *name = e_destination_get_name (dest); - const gchar *email = e_destination_get_email (dest); - double score; - - if (email - && !utf8_casefold_collate_len (comp->priv->query_text, email, len) - && !e_destination_is_evolution_list (dest)) { - - gchar *str; - - score = len * 2; /* 2 points for each matching character */ - - if (name && *name) - str = g_strdup_printf ("<%s> %s", email, name); - else - str = g_strdup (email); - - match = make_match (dest, str, score); - - g_free (str); - - return match; - } - - return NULL; -} - -/* - * Name Query - */ - -static gchar * -name_style_query (ESelectNamesCompletion *comp, const gchar *field) -{ - if (comp && comp->priv->query_text && *comp->priv->query_text) { - gchar *cpy = g_strdup (comp->priv->query_text), *c; - gchar **strv; - gchar *query; - gint i; - GString *out = g_string_new(""); - - for (c = cpy; *c; ++c) { - if (*c == ',') - *c = ' '; - } - - strv = g_strsplit (cpy, " ", 0); - if (strv[0] && strv[1]) - g_string_append(out, "(and "); - for (i=0; strv[i]; ++i) { - if (i==0) - g_string_append(out, "(beginswith "); - else - g_string_append(out, " (beginswith "); - e_sexp_encode_string(out, field); - g_strstrip(strv[i]); - e_sexp_encode_string(out, strv[i]); - g_string_append(out, ")"); - } - if (strv[0] && strv[1]) - g_string_append(out, ")"); - - query = out->str; - g_string_free(out, FALSE); - - g_free (cpy); - g_strfreev (strv); - - return query; - } - - return NULL; -} - -static gchar * -sexp_name (ESelectNamesCompletion *comp) -{ - return name_style_query (comp, "full_name"); -} - -static ECompletionMatch * -match_name (ESelectNamesCompletion *comp, EDestination *dest) -{ - ECompletionMatch *final_match = NULL; - gchar *menu_text = NULL; - EContact *contact; - const gchar *email; - gint match_len = 0; - EABContactMatchType match; - EABContactMatchPart first_match; - double score = 0; - gboolean have_given, have_additional, have_family; - EContactName *contact_name; - - contact = e_destination_get_contact (dest); - - contact_name = e_contact_get (contact, E_CONTACT_NAME); - if (!contact_name) - return NULL; - - email = e_destination_get_email (dest); - - match = eab_contact_compare_name_to_string_full (contact, comp->priv->query_text, TRUE /* yes, allow partial matches */, - NULL, &first_match, &match_len); - - if (match <= EAB_CONTACT_MATCH_NONE) { - e_contact_name_free (contact_name); - return NULL; - } - - score = match_len * 3; /* three points per match character */ - - have_given = contact_name->given && *contact_name->given; - have_additional = contact_name->additional && *contact_name->additional; - have_family = contact_name->family && *contact_name->family; - - if (e_contact_get (contact, E_CONTACT_IS_LIST)) { - - menu_text = e_contact_name_to_string (contact_name); - - } else if (first_match == EAB_CONTACT_MATCH_PART_GIVEN_NAME) { - - if (have_family) - menu_text = g_strdup_printf ("%s %s <%s>", contact_name->given, contact_name->family, email); - else - menu_text = g_strdup_printf ("%s <%s>", contact_name->given, email); - - } else if (first_match == EAB_CONTACT_MATCH_PART_ADDITIONAL_NAME) { - - if (have_given) { - - menu_text = g_strdup_printf ("%s%s%s, %s <%s>", - contact_name->additional, - have_family ? " " : "", - have_family ? contact_name->family : "", - contact_name->given, - email); - } else { - - menu_text = g_strdup_printf ("%s%s%s <%s>", - contact_name->additional, - have_family ? " " : "", - have_family ? contact_name->family : "", - email); - } - - } else if (first_match == EAB_CONTACT_MATCH_PART_FAMILY_NAME) { - - if (have_given) - menu_text = g_strdup_printf ("%s, %s%s%s <%s>", - contact_name->family, - contact_name->given, - have_additional ? " " : "", - have_additional ? contact_name->additional : "", - email); - else - menu_text = g_strdup_printf ("%s <%s>", contact_name->family, email); - - } else { /* something funny happened */ - - menu_text = g_strdup_printf ("<%s> ???", email); - - } - - if (menu_text) { - g_strstrip (menu_text); - final_match = make_match (dest, menu_text, score); - g_free (menu_text); - } - - e_contact_name_free (contact_name); - - return final_match; -} - -/* - * File As Query - */ - -static gchar * -sexp_file_as (ESelectNamesCompletion *comp) -{ - return name_style_query (comp, "file_as"); -} - -static ECompletionMatch * -match_file_as (ESelectNamesCompletion *comp, EDestination *dest) -{ - const gchar *name; - const gchar *email; - gchar *cpy, **strv, *menu_text; - gint i, len; - double score = 0.00001; - ECompletionMatch *match; - - name = e_destination_get_name (dest); - email = e_destination_get_email (dest); - - if (!(name && *name)) - return NULL; - - cpy = g_strdup (comp->priv->query_text); - strv = g_strsplit (cpy, " ", 0); - - for (i=0; strv[i] && score > 0; ++i) { - len = g_utf8_strlen (strv[i], -1); - if (!utf8_casefold_collate_len (name, strv[i], len)) - score += len; /* one point per character of the match */ - else - score = 0; - } - - g_free (cpy); - g_strfreev (strv); - - if (score <= 0) - return NULL; - - menu_text = g_strdup_printf ("%s <%s>", name, email); - g_strstrip (menu_text); - match = make_match (dest, menu_text, score); - g_free (menu_text); - - return match; -} - -typedef struct _BookQuery BookQuery; -struct _BookQuery { - BookQuerySExp builder; - BookQueryMatchTester tester; -}; - -static BookQuery book_queries[] = { - { sexp_nickname, match_nickname}, - { sexp_email, match_email }, - { sexp_name, match_name }, - { sexp_file_as, match_file_as }, -}; -static gint book_query_count = sizeof (book_queries) / sizeof (BookQuery); - -/* - * Build up a big compound sexp corresponding to all of our queries. - */ -static EBookQuery* -book_query_sexp (ESelectNamesCompletion *comp) -{ - gint i, j; - gchar **queryv; - EBookQuery *query; - - g_return_val_if_fail (comp && E_IS_SELECT_NAMES_COMPLETION (comp), NULL); - - if (! (comp->priv->query_text && *comp->priv->query_text)) - return NULL; - - queryv = g_new0 (gchar *, book_query_count+1); - for (i=0, j=0; i<book_query_count; ++i) { - queryv[j] = book_queries[i].builder (comp); - if (queryv[j]) - ++j; - } - - if (j == 0) { - query = NULL; - } else if (j == 1) { - query = e_book_query_from_string (queryv[0]); - queryv[0] = NULL; - } else { - gchar *tmp, *tmp2; - tmp = g_strjoinv (" ", queryv); - tmp2 = g_strdup_printf ("(or %s)", tmp); - query = e_book_query_from_string (tmp2); - g_free (tmp); - g_free (tmp2); - } - - for (i=0; i<book_query_count; ++i) - g_free (queryv[i]); - g_free (queryv); - - return query; -} - -/* - * Sweep across all of our query rules and find the best score/match - * string that applies to a given destination. - */ -static ECompletionMatch * -book_query_score (ESelectNamesCompletion *comp, EDestination *dest) -{ - ECompletionMatch *best_match = NULL; - gint i; - - g_return_val_if_fail (E_IS_SELECT_NAMES_COMPLETION (comp), NULL); - g_return_val_if_fail (E_IS_DESTINATION (dest), NULL); - - if (! (comp->priv->query_text && *comp->priv->query_text)) - return NULL; - - for (i=0; i<book_query_count; ++i) { - - ECompletionMatch *this_match = NULL; - - if (book_queries[i].tester && e_destination_get_contact (dest)) { - this_match = book_queries[i].tester (comp, dest); - } - - if (this_match) { - if (best_match == NULL || this_match->score > best_match->score) { - e_completion_match_unref (best_match); - best_match = this_match; - } else { - e_completion_match_unref (this_match); - } - } - } - - return best_match; -} - -static void -book_query_process_card_list (ESelectNamesCompletion *comp, const GList *contacts) -{ - while (contacts) { - EContact *contact = E_CONTACT (contacts->data); - - if (e_contact_get (contact, E_CONTACT_IS_LIST)) { - - if (comp->priv->match_contact_lists) { - - EDestination *dest = e_destination_new (); - ECompletionMatch *match; - e_destination_set_contact (dest, contact, 0); - match = book_query_score (comp, dest); - if (match && match->score > 0) { - e_completion_found_match (E_COMPLETION (comp), match); - } else { - e_completion_match_unref (match); - } - g_object_unref (dest); - - } - - } - else { - GList *email = e_contact_get (contact, E_CONTACT_EMAIL); - if (email) { - GList *iter; - gint i; - for (i=0, iter = email; iter; ++i, iter = iter->next) { - EDestination *dest = e_destination_new (); - gchar *e; - ECompletionMatch *match; - - e_destination_set_contact (dest, contact, i); - e = iter->data; - - if (e && *e) { - - match = book_query_score (comp, dest); - if (match && match->score > 0) { - e_completion_found_match (E_COMPLETION (comp), match); - } else { - e_completion_match_unref (match); - } - } - - g_object_unref (dest); - } - } - g_list_foreach (email, (GFunc)g_free, NULL); - g_list_free (email); - } - - contacts = contacts->next; - } -} - -/* - * - * ESelectNamesCompletion code - * - */ - - -GType -e_select_names_completion_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (ESelectNamesCompletionClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_select_names_completion_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (ESelectNamesCompletion), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_select_names_completion_init, - }; - - type = g_type_register_static (e_completion_get_type (), "ESelectNamesCompletion", &info, 0); - } - - return type; -} - -static void -e_select_names_completion_class_init (ESelectNamesCompletionClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - ECompletionClass *completion_class = E_COMPLETION_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->dispose = e_select_names_completion_dispose; - - completion_class->request_completion = e_select_names_completion_handle_request; - completion_class->end_completion = e_select_names_completion_end; - - if (getenv ("EVO_DEBUG_SELECT_NAMES_COMPLETION")) { - out = fopen ("/tmp/evo-debug-select-names-completion", "w"); - if (out) - setvbuf (out, NULL, _IONBF, 0); - } -} - -static void -e_select_names_completion_init (ESelectNamesCompletion *comp) -{ - comp->priv = g_new0 (struct _ESelectNamesCompletionPrivate, 1); - comp->priv->match_contact_lists = TRUE; -} - -static void -e_select_names_completion_clear_book_data (ESelectNamesCompletion *comp) -{ - GList *l; - - for (l = comp->priv->book_data; l; l = l->next) { - ESelectNamesCompletionBookData *book_data = l->data; - - if (book_data->contacts_added_tag) { - g_signal_handler_disconnect (book_data->book_view, book_data->contacts_added_tag); - book_data->contacts_added_tag = 0; - } - - if (book_data->seq_complete_tag) { - g_signal_handler_disconnect (book_data->book_view, book_data->seq_complete_tag); - book_data->seq_complete_tag = 0; - } - - g_object_unref (book_data->book); - - if (book_data->book_view) { - e_book_view_stop (book_data->book_view); - g_object_unref (book_data->book_view); - } - - g_free (book_data->cached_query_text); - g_list_foreach (book_data->cached_cards, (GFunc)g_object_unref, NULL); - g_list_free (book_data->cached_cards); - - g_free (book_data); - } - g_list_free (comp->priv->book_data); - comp->priv->book_data = NULL; -} - -static void -e_select_names_completion_dispose (GObject *object) -{ - ESelectNamesCompletion *comp = E_SELECT_NAMES_COMPLETION (object); - - if (comp->priv) { - if (comp->priv->text_model) - g_object_unref (comp->priv->text_model); - - e_select_names_completion_clear_book_data (comp); - - g_free (comp->priv->waiting_query); - g_free (comp->priv->query_text); - - g_free (comp->priv); - comp->priv = NULL; - } - - if (parent_class->dispose) - parent_class->dispose (object); -} - - -/* - * - * EBook/EBookView Callbacks & Query Stuff - * - */ - -static gchar * -clean_query_text (const gchar *s) -{ - gchar *q = g_new (gchar, strlen(s)+1), *t; - - t = q; - while (*s) { - if (*s != ',' && *s != '"') { - *t = *s; - ++t; - } - ++s; - } - *t = '\0'; - - g_strstrip (q); - - return q; -} - -static void -e_select_names_completion_clear_cache (ESelectNamesCompletionBookData *book_data) -{ - if (out) - fprintf (out, "** clearing cache on book %s\n", e_book_get_uri (book_data->book)); - - g_free (book_data->cached_query_text); - g_list_foreach (book_data->cached_cards, (GFunc)g_object_unref, NULL); - g_list_free (book_data->cached_cards); - - book_data->cached_query_text = NULL; - book_data->cached_cards = NULL; -} - -static void -e_select_names_completion_done (ESelectNamesCompletion *comp) -{ - g_free (comp->priv->query_text); - comp->priv->query_text = NULL; - - e_completion_end_search (E_COMPLETION (comp)); /* That's all folks! */ - - /* Need to launch a new completion if another one is pending. */ - if (comp->priv->waiting_query) { - gchar *s = comp->priv->waiting_query; - comp->priv->waiting_query = NULL; - e_completion_begin_search (E_COMPLETION (comp), s, comp->priv->waiting_pos, comp->priv->waiting_limit); - g_free (s); - } -} - -static void -e_select_names_completion_got_book_view_cb (EBook *book, EBookStatus status, EBookView *view, gpointer user_data) -{ - ESelectNamesCompletion *comp; - ESelectNamesCompletionBookData *book_data; - - book_data = (ESelectNamesCompletionBookData*)user_data; - comp = book_data->comp; - - if (status != E_BOOK_ERROR_OK) { - comp->priv->pending_completion_seq--; - if (!comp->priv->pending_completion_seq) - e_select_names_completion_done (comp); - return; - } - - book_data->book_view_tag = 0; - - if (book_data->contacts_added_tag) { - g_signal_handler_disconnect (book_data->book_view, book_data->contacts_added_tag); - book_data->contacts_added_tag = 0; - } - if (book_data->seq_complete_tag) { - g_signal_handler_disconnect (book_data->book_view, book_data->seq_complete_tag); - book_data->seq_complete_tag = 0; - } - - g_object_ref (view); - if (book_data->book_view) { - e_book_view_stop (book_data->book_view); - g_object_unref (book_data->book_view); - } - book_data->book_view = view; - - book_data->contacts_added_tag = - g_signal_connect (view, - "contacts_added", - G_CALLBACK (e_select_names_completion_contacts_added_cb), - book_data); - - book_data->seq_complete_tag = - g_signal_connect (view, - "sequence_complete", - G_CALLBACK (e_select_names_completion_seq_complete_cb), - book_data); - - book_data->sequence_complete_received = FALSE; - - e_book_view_start (view); -} - -static void -e_select_names_completion_contacts_added_cb (EBookView *book_view, const GList *cards, gpointer user_data) -{ - ESelectNamesCompletionBookData *book_data = user_data; - ESelectNamesCompletion *comp = book_data->comp; - - if (e_completion_searching (E_COMPLETION (comp))) { - book_query_process_card_list (comp, cards); - - /* Save the list of matching cards. */ - while (cards) { - book_data->cached_cards = g_list_prepend (book_data->cached_cards, g_object_ref (cards->data)); - cards = g_list_next (cards); - } - } -} - -static void -e_select_names_completion_seq_complete_cb (EBookView *book_view, EBookViewStatus status, gpointer user_data) -{ - ESelectNamesCompletionBookData *book_data = user_data; - ESelectNamesCompletion *comp = book_data->comp; - - if (out) - fprintf (out, "** got sequence_complete (status = %d) on book %s\n", status, e_book_get_uri (book_data->book)); - - /* - * We aren't searching, but the addressbook has changed -- clear our card cache so that - * future completion requests will take the changes into account. - */ - if (! e_completion_searching (E_COMPLETION (comp))) { - if (out) - fprintf (out, "\t we weren't searching, clearing the cache\n"); - e_select_names_completion_clear_cache (book_data); - return; - } - - if (book_data->cached_query_text - && status == E_BOOK_ERROR_OK - && !book_data->cache_complete - && !strcmp (book_data->cached_query_text, comp->priv->query_text)) - book_data->cache_complete = TRUE; - - if (out) - fprintf (out, "\tending search, book_data->cache_complete == %d, cached_cards = %p\n", - book_data->cache_complete, - book_data->cached_cards); - - if (!book_data->sequence_complete_received) { - book_data->sequence_complete_received = TRUE; - - if (book_data->contacts_added_tag) { - g_signal_handler_disconnect (book_data->book_view, book_data->contacts_added_tag); - book_data->contacts_added_tag = 0; - } - if (book_data->seq_complete_tag) { - g_signal_handler_disconnect (book_data->book_view, book_data->seq_complete_tag); - book_data->seq_complete_tag = 0; - } - - if (out) - fprintf (out, "\t %d remaining book view's\n", comp->priv->pending_completion_seq - 1); - - comp->priv->pending_completion_seq --; - if (comp->priv->pending_completion_seq > 0) - return; - } - - e_select_names_completion_done (comp); -} - -static void -e_select_names_completion_stop_query (ESelectNamesCompletion *comp) -{ - GList *l; - - g_return_if_fail (comp && E_IS_SELECT_NAMES_COMPLETION (comp)); - - if (out) - fprintf (out, "stopping query\n"); - - if (comp->priv->waiting_query) { - if (out) - fprintf (out, "stopped waiting query\n"); - g_free (comp->priv->waiting_query); - comp->priv->waiting_query = NULL; - } - - g_free (comp->priv->query_text); - comp->priv->query_text = NULL; - - for (l = comp->priv->book_data; l; l = l->next) { - ESelectNamesCompletionBookData *book_data = l->data; - if (book_data->book_view_tag) { - e_book_cancel (book_data->book, NULL); - book_data->book_view_tag = 0; - } - if (book_data->book_view) { - if (book_data->contacts_added_tag) { - g_signal_handler_disconnect (book_data->book_view, book_data->contacts_added_tag); - book_data->contacts_added_tag = 0; - } - if (book_data->seq_complete_tag) { - g_signal_handler_disconnect (book_data->book_view, book_data->seq_complete_tag); - book_data->seq_complete_tag = 0; - } - - e_book_view_stop (book_data->book_view); - g_object_unref (book_data->book_view); - book_data->book_view = NULL; - } - } - - comp->priv->pending_completion_seq = 0; -} - -static void -e_select_names_completion_start_query (ESelectNamesCompletion *comp, const gchar *query_text) -{ - g_return_if_fail (comp && E_IS_SELECT_NAMES_COMPLETION (comp)); - g_return_if_fail (query_text); - - e_select_names_completion_stop_query (comp); /* Stop any prior queries. */ - - if (comp->priv->books_not_ready == 0) { - EBookQuery *query; - - if (strlen (query_text) < comp->priv->minimum_query_length) { - e_completion_end_search (E_COMPLETION (comp)); - return; - } - - g_free (comp->priv->query_text); - comp->priv->query_text = g_strdup (query_text); - - query = book_query_sexp (comp); - if (query) { - GList *l; - - if (out) - fprintf (out, "\n\n**** starting query: \"%s\"\n", comp->priv->query_text); - - for (l = comp->priv->book_data; l; l = l->next) { - ESelectNamesCompletionBookData *book_data = l->data; - gboolean can_reuse_cached_cards; - - if (out) { - fprintf (out, - "book == %s[\n" - "\tbook_data->cached_query_text == `%s'\n" - "\tbook_data->cache_complete == %d\n" - "\tbook_data->cached_cards == %p\n", - e_book_get_uri (book_data->book), - book_data->cached_query_text, - book_data->cache_complete, - book_data->cached_cards); - } - - /* for lack of a better place, we invalidate the cache here if we - notice that the text is different. */ - if (book_data->cached_query_text - && (strlen (book_data->cached_query_text) > strlen (query_text) - || utf8_casefold_collate_len (book_data->cached_query_text, query_text, - strlen (book_data->cached_query_text)))) - book_data->cache_complete = FALSE; - - can_reuse_cached_cards = (book_data->cached_query_text - && book_data->cache_complete - && book_data->cached_cards != NULL); - - if (can_reuse_cached_cards) { - - if (out) - fprintf (out, "\t*** can reuse cached cards (%d cards cached)!\n", g_list_length (book_data->cached_cards)); - - if (out) - fprintf (out, "\tusing existing query info: %s (vs %s)\n", query_text, book_data->cached_query_text); - book_query_process_card_list (comp, book_data->cached_cards); - } - else { - e_select_names_completion_clear_cache (book_data); - book_data->cached_query_text = g_strdup (query_text); - - book_data->book_view_tag = e_book_async_get_book_view (book_data->book, - query, - NULL, -1, - e_select_names_completion_got_book_view_cb, book_data); - comp->priv->pending_completion_seq++; - } - - if (out) - fprintf (out, "]\n"); - } - - /* if we looped through all the books - and were able to complete based - solely on our cached cards, signal - that the search is over. */ - if (!comp->priv->pending_completion_seq) - e_select_names_completion_done (E_SELECT_NAMES_COMPLETION (comp)); - - e_book_query_unref (query); - } else { - g_free (comp->priv->query_text); - comp->priv->query_text = NULL; - } - } else { - g_free (comp->priv->waiting_query); - comp->priv->waiting_query = g_strdup (query_text); - } -} - -static void -e_select_names_completion_do_query (ESelectNamesCompletion *comp, const gchar *query_text, gint pos, gint limit) -{ - gchar *clean; - - g_return_if_fail (comp != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_COMPLETION (comp)); - - clean = clean_query_text (query_text); - if (! (clean && *clean)) { - g_free (clean); - e_completion_end_search (E_COMPLETION (comp)); - return; - } - - if (out) - fprintf (out, "do_query: %s => %s\n", query_text, clean); - - e_select_names_completion_start_query (comp, clean); - g_free (clean); -} - - -/* - * - * Completion Search Override - a Framework for Christian-Resurrection-Holiday Edible-Chicken-Ova - * - */ - -typedef struct _SearchOverride SearchOverride; -struct _SearchOverride { - const gchar *trigger; - const gchar *text[4]; -}; -static SearchOverride override[] = { - { "why?", { "\"I must create a system, or be enslaved by another man's.\"", - " -- Wiliam Blake, \"Jerusalem\"", - NULL } }, - { "easter-egg?", { "What were you expecting, a flight simulator?", NULL } }, - { NULL, { NULL } } }; - -static gboolean -search_override_check (SearchOverride *over, const gchar *text) -{ - /* The g_utf8_validate is needed because as of 2001-06-11, - * EText doesn't translate from locale->UTF8 when you paste - * into it. - */ - if (over == NULL || text == NULL || !g_utf8_validate (text, -1, NULL)) - return FALSE; - - return !utf8_casefold_collate (over->trigger, text); -} - - -/* - * - * Completion Callbacks - * - */ - -static void -e_select_names_completion_handle_request (ECompletion *comp, const gchar *text, gint pos, gint limit) -{ - ESelectNamesCompletion *selcomp = E_SELECT_NAMES_COMPLETION (comp); - const gchar *str; - gint index, j; - - g_return_if_fail (comp != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_COMPLETION (comp)); - g_return_if_fail (text != NULL); - - if (out) { - fprintf (out, "\n\n**** requesting completion\n"); - fprintf (out, "text=\"%s\" pos=%d limit=%d\n", text, pos, limit); - } - - e_select_names_model_text_pos (selcomp->priv->text_model->source, - selcomp->priv->text_model->seplen, - pos, &index, NULL, NULL); - str = index >= 0 ? e_select_names_model_get_string (selcomp->priv->text_model->source, index) : NULL; - - if (out) - fprintf (out, "index=%d str=\"%s\"\n", index, str); - - if (str == NULL || *str == '\0') { - if (out) - fprintf (out, "aborting empty query\n"); - e_completion_end_search (comp); - return; - } - - for (j=0; override[j].trigger; ++j) { - if (search_override_check (&(override[j]), str)) { - gint k; - - for (k=0; override[j].text[k]; ++k) { - ECompletionMatch *match = g_new (ECompletionMatch, 1); - e_completion_match_construct (match); - e_completion_match_set_text (match, text, override[j].text[k]); - match->score = 1 / (double) (k + 1); - e_completion_found_match (comp, match); - } - - e_completion_end_search (comp); - return; - } - } - - e_select_names_completion_do_query (selcomp, str, pos, limit); -} - -static void -e_select_names_completion_end (ECompletion *comp) -{ - g_return_if_fail (comp != NULL); - g_return_if_fail (E_IS_COMPLETION (comp)); - - if (out) - fprintf (out, "completion ended\n"); -} - -/* - * - * Our Pseudo-Constructor - * - */ - -ECompletion * -e_select_names_completion_new (ESelectNamesTextModel *text_model) -{ - ESelectNamesCompletion *comp; - - g_return_val_if_fail (E_IS_SELECT_NAMES_TEXT_MODEL (text_model), NULL); - - comp = g_object_new (E_TYPE_SELECT_NAMES_COMPLETION, NULL); - - comp->priv->text_model = text_model; - g_object_ref (text_model); - - return E_COMPLETION (comp); -} - -void -e_select_names_completion_add_book (ESelectNamesCompletion *comp, EBook *book) -{ - ESelectNamesCompletionBookData *book_data; - - g_return_if_fail (book != NULL); - - book_data = g_new0 (ESelectNamesCompletionBookData, 1); - book_data->book = book; - book_data->comp = comp; - g_object_ref (book_data->book); - comp->priv->book_data = g_list_append (comp->priv->book_data, book_data); - - /* XXX toshok - this doesn't work properly. need to rethink this next bit. */ - /* if the user is typing as we're adding books, restart the - query after the new book has been added */ - if (comp->priv->query_text && *comp->priv->query_text) { - char *query_text = g_strdup (comp->priv->query_text); - e_select_names_completion_stop_query (comp); - e_select_names_completion_start_query (comp, query_text); - g_free (query_text); - } -} - -void -e_select_names_completion_clear_books (ESelectNamesCompletion *comp) -{ - e_select_names_completion_stop_query (comp); - e_select_names_completion_clear_book_data (comp); -} - -void -e_select_names_completion_set_minimum_query_length (ESelectNamesCompletion *comp, int query_length) -{ - g_return_if_fail (E_IS_SELECT_NAMES_COMPLETION (comp)); - comp->priv->minimum_query_length = query_length; -} - -gboolean -e_select_names_completion_get_match_contact_lists (ESelectNamesCompletion *comp) -{ - g_return_val_if_fail (E_IS_SELECT_NAMES_COMPLETION (comp), FALSE); - return comp->priv->match_contact_lists; -} - - -void -e_select_names_completion_set_match_contact_lists (ESelectNamesCompletion *comp, gboolean x) -{ - g_return_if_fail (E_IS_SELECT_NAMES_COMPLETION (comp)); - comp->priv->match_contact_lists = x; -} - diff --git a/addressbook/gui/component/select-names/e-select-names-completion.h b/addressbook/gui/component/select-names/e-select-names-completion.h deleted file mode 100644 index 97a3f3f5ca..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-completion.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-select-names-completion.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef E_SELECT_NAMES_COMPLETION_H -#define E_SELECT_NAMES_COMPLETION_H - -#include <gal/e-text/e-completion.h> -#include <libebook/e-book.h> -#include "e-select-names-text-model.h" - -G_BEGIN_DECLS - -#define E_TYPE_SELECT_NAMES_COMPLETION (e_select_names_completion_get_type ()) -#define E_SELECT_NAMES_COMPLETION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_SELECT_NAMES_COMPLETION, ESelectNamesCompletion)) -#define E_SELECT_NAMES_COMPLETION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), E_TYPE_SELECT_NAMES_COMPLETION, ESelectNamesCompletionClass)) -#define E_IS_SELECT_NAMES_COMPLETION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_SELECT_NAMES_COMPLETION)) -#define E_IS_SELECT_NAMES_COMPLETION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_SELECT_NAMES_COMPLETION)) - -typedef struct _ESelectNamesCompletion ESelectNamesCompletion; -typedef struct _ESelectNamesCompletionClass ESelectNamesCompletionClass; -struct _ESelectNamesCompletionPrivate; - -struct _ESelectNamesCompletion { - ECompletion parent; - - struct _ESelectNamesCompletionPrivate *priv; -}; - -struct _ESelectNamesCompletionClass { - ECompletionClass parent_class; - -}; - -GType e_select_names_completion_get_type (void); - -ECompletion *e_select_names_completion_new (ESelectNamesTextModel *); -void e_select_names_completion_add_book (ESelectNamesCompletion *, EBook *); -void e_select_names_completion_clear_books (ESelectNamesCompletion *); -void e_select_names_completion_set_minimum_query_length (ESelectNamesCompletion *, int); -gboolean e_select_names_completion_get_match_contact_lists (ESelectNamesCompletion *); -void e_select_names_completion_set_match_contact_lists (ESelectNamesCompletion *, gboolean); - -G_END_DECLS - -#endif /* E_SELECT_NAMES_COMPLETION_H */ diff --git a/addressbook/gui/component/select-names/e-select-names-config-keys.h b/addressbook/gui/component/select-names/e-select-names-config-keys.h deleted file mode 100644 index e0f08c3019..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-config-keys.h +++ /dev/null @@ -1,39 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors : - * JP Rosevear <jpr@ximian.com> - * - * Copyright 2003, Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef _E_SELECT_NAMES_CONFIG_KEYS_H_ -#define _E_SELECT_NAMES_CONFIG_KEYS_H_ - -#include <glib.h> - -G_BEGIN_DECLS - -#define SELECT_NAMES_CONFIG_PREFIX "/apps/evolution/addressbook/completion" - -/* Display settings */ -#define SELECT_NAMES_CONFIG_COMPLETION_BOOKS SELECT_NAMES_CONFIG_PREFIX "/books" -#define SELECT_NAMES_CONFIG_LAST_COMPLETION_BOOK SELECT_NAMES_CONFIG_PREFIX "/last_book" -#define SELECT_NAMES_CONFIG_MIN_QUERY_LENGTH SELECT_NAMES_CONFIG_PREFIX "/minimum_query_length" - -G_END_DECLS - -#endif diff --git a/addressbook/gui/component/select-names/e-select-names-config.c b/addressbook/gui/component/select-names/e-select-names-config.c deleted file mode 100644 index 8335ed7c3b..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-config.c +++ /dev/null @@ -1,117 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Authors : - * Damon Chaplin <damon@ximian.com> - * Rodrigo Moya <rodrigo@ximian.com> - * - * Copyright 2000, Ximian, Inc. - * Copyright 2000, Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> - -#include "e-select-names-config-keys.h" -#include "e-select-names-config.h" - -static GConfClient *config = NULL; - -static void -do_cleanup (void) -{ - g_object_unref (config); - config = NULL; -} - -static void -e_select_names_config_init (void) -{ - if (config) - return; - - config = gconf_client_get_default (); - g_atexit ((GVoidFunc) do_cleanup); - - gconf_client_add_dir (config, SELECT_NAMES_CONFIG_PREFIX, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); -} - -void -e_select_names_config_remove_notification (guint id) -{ - gconf_client_notify_remove (config, id); -} - -char * -e_select_names_config_get_last_completion_book (void) -{ - e_select_names_config_init (); - - return gconf_client_get_string (config, SELECT_NAMES_CONFIG_LAST_COMPLETION_BOOK, NULL); -} - -void -e_select_names_config_set_last_completion_book (const char *last_completion_book) -{ - e_select_names_config_init (); - - gconf_client_set_string (config, SELECT_NAMES_CONFIG_LAST_COMPLETION_BOOK, last_completion_book, NULL); -} - -guint -e_select_names_config_add_notification_last_completion_book (GConfClientNotifyFunc func, gpointer data) -{ - guint id; - - e_select_names_config_init (); - - id = gconf_client_notify_add (config, SELECT_NAMES_CONFIG_LAST_COMPLETION_BOOK, func, data, NULL, NULL); - - return id; -} - -gint -e_select_names_config_get_min_query_length (void) -{ - e_select_names_config_init (); - - return gconf_client_get_int (config, SELECT_NAMES_CONFIG_MIN_QUERY_LENGTH, NULL); -} - - -void -e_select_names_config_set_min_query_length (gint day_end_hour) -{ - e_select_names_config_init (); - - gconf_client_set_int (config, SELECT_NAMES_CONFIG_MIN_QUERY_LENGTH, day_end_hour, NULL); -} - -guint -e_select_names_config_add_notification_min_query_length (GConfClientNotifyFunc func, gpointer data) -{ - guint id; - - e_select_names_config_init (); - - id = gconf_client_notify_add (config, SELECT_NAMES_CONFIG_MIN_QUERY_LENGTH, func, data, NULL, NULL); - - return id; -} diff --git a/addressbook/gui/component/select-names/e-select-names-config.h b/addressbook/gui/component/select-names/e-select-names-config.h deleted file mode 100644 index 12d2c1314d..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-config.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors : - * Damon Chaplin <damon@ximian.com> - * Rodrigo Moya <rodrigo@ximian.com> - * - * Copyright 2000, Ximian, Inc. - * Copyright 2000, Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA - */ - -#ifndef _E_SELECT_NAMES_CONFIG_H_ -#define _E_SELECT_NAMES_CONFIG_H_ - -#include <gconf/gconf-client.h> - -void e_select_names_config_remove_notification (guint id); - -/* The last completion book */ -char *e_select_names_config_get_last_completion_book (void); -void e_select_names_config_set_last_completion_book (const char *last_completion_book); -guint e_select_names_config_add_notification_last_completion_book (GConfClientNotifyFunc func, gpointer data); - - -/* The minimum query length */ -gint e_select_names_config_get_min_query_length (void); -void e_select_names_config_set_min_query_length (gint day_end_hour); -guint e_select_names_config_add_notification_min_query_length (GConfClientNotifyFunc func, gpointer data); - -#endif /* _E_SELECT_NAMES_CONFIG_H_ */ diff --git a/addressbook/gui/component/select-names/e-select-names-factory.c b/addressbook/gui/component/select-names/e-select-names-factory.c deleted file mode 100644 index 9e427513e0..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-factory.c +++ /dev/null @@ -1,59 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-select-names-factory.c - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <bonobo/bonobo-generic-factory.h> - -#include "e-select-names-bonobo.h" -#include "e-select-names-factory.h" - - -#define COMPONENT_FACTORY_ID "OAFIID:GNOME_Evolution_Addressbook_SelectNamesFactory:" BASE_VERSION - -static BonoboGenericFactory *factory = NULL; - - -static BonoboObject * -factory_fn (BonoboGenericFactory *factory, - const char *component_id, - void *closure) -{ - return BONOBO_OBJECT (e_select_names_bonobo_new ()); -} - - -gboolean -e_select_names_factory_init (void) -{ - if (factory != NULL) - return TRUE; - - factory = bonobo_generic_factory_new (COMPONENT_FACTORY_ID, factory_fn, NULL); - - if (factory == NULL) - return FALSE; - - return TRUE; -} diff --git a/addressbook/gui/component/select-names/e-select-names-factory.h b/addressbook/gui/component/select-names/e-select-names-factory.h deleted file mode 100644 index 0fe85c8361..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-factory.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-select-names-factory.h - * - * Copyright (C) 2000 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef _E_SECELT_NAMES_FACTORY_H -#define _E_SECELT_NAMES_FACTORY_H - -#include <glib.h> - -gboolean e_select_names_factory_init (void); - -#endif diff --git a/addressbook/gui/component/select-names/e-select-names-manager.c b/addressbook/gui/component/select-names/e-select-names-manager.c deleted file mode 100644 index 43b69d9149..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-manager.c +++ /dev/null @@ -1,684 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@ximian.com> - * Jon Trowbridge <trow@ximian.com. - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#include <config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <gal/e-text/e-entry.h> - -#include <libgnome/gnome-i18n.h> -#include "e-select-names-config.h" -#include "e-select-names-manager.h" -#include "e-select-names-marshal.h" -#include "e-select-names-model.h" -#include "e-select-names-text-model.h" -#include "e-select-names.h" -#include "e-select-names-completion.h" -#include "e-select-names-popup.h" -#include <addressbook/util/eab-book-util.h> -#include <addressbook/util/e-destination.h> -#include "addressbook/gui/component/addressbook.h" -#include <bonobo/bonobo-object.h> - -#define DEFAULT_MINIMUM_QUERY_LENGTH 3 - -enum { - CHANGED, - OK, - CANCEL, - LAST_SIGNAL -}; - -static guint e_select_names_manager_signals[LAST_SIGNAL] = { 0 }; - -static GObjectClass *parent_class = NULL; - -typedef struct { - char *id; - char *title; - ESelectNamesModel *model; - ESelectNamesModel *original_model; - ESelectNamesManager *manager; - guint changed_tag; -} ESelectNamesManagerSection; - -typedef struct { - char *id; - EEntry *entry; - ESelectNamesManager *manager; - ESelectNamesModel *model; - ECompletion *comp; - guint cleaning_tag; -} ESelectNamesManagerEntry; - -static void e_select_names_manager_init (ESelectNamesManager *manager); -static void e_select_names_manager_class_init (ESelectNamesManagerClass *klass); - -static void e_select_names_manager_dispose (GObject *object); - -/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ - -/* ESelectNamesManagerSection routines */ - -static void -section_model_changed_cb (ESelectNamesModel *model, gpointer closure) -{ - ESelectNamesManagerSection *section = closure; - g_signal_emit (section->manager, - e_select_names_manager_signals[CHANGED], 0, - section->id, - FALSE); -} - -static ESelectNamesManagerSection * -e_select_names_manager_section_new (ESelectNamesManager *manager, - const gchar *id, - const gchar *title, - ESelectNamesModel *model) -{ - ESelectNamesManagerSection *section; - - g_return_val_if_fail (E_IS_SELECT_NAMES_MANAGER (manager), NULL); - g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), NULL); - - section = g_new0 (ESelectNamesManagerSection, 1); - - section->id = g_strdup (id); - section->title = g_strdup (title); - - section->manager = manager; - - section->model = model; - g_object_ref (section->model); - section->changed_tag = - g_signal_connect (section->model, - "changed", - G_CALLBACK (section_model_changed_cb), - section); - - return section; -} - -static void -e_select_names_manager_section_free (ESelectNamesManagerSection *section) -{ - if (section == NULL) - return; - - g_free (section->id); - g_free (section->title); - - if (section->model) { - g_signal_handler_disconnect (section->model, section->changed_tag); - g_object_unref (section->model); - } - - if (section->original_model) { - g_object_unref (section->original_model); - } - - g_free (section); -} - -/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ - -/* ESelectNamesManagerEntry routines */ - -static ESelectNamesManagerEntry * -get_entry_info (EEntry *entry) -{ - g_return_val_if_fail (E_IS_ENTRY (entry), NULL); - return (ESelectNamesManagerEntry *) g_object_get_data (G_OBJECT (entry), "entry_info"); -} - -static void -populate_popup_cb (EEntry *eentry, GdkEventButton *ev, gint pos, GtkWidget *menu, gpointer user_data) -{ - ESelectNamesTextModel *text_model; - - g_object_get (eentry, - "model", &text_model, - NULL); - g_assert (E_IS_SELECT_NAMES_TEXT_MODEL (text_model)); - - e_select_names_populate_popup (menu, text_model, ev, pos, GTK_WIDGET (eentry)); -} - -static void -completion_handler (EEntry *entry, ECompletionMatch *match) -{ - ESelectNamesManagerEntry *mgr_entry; - ESelectNamesTextModel *text_model; - EDestination *dest; - gint i, pos, start_pos, len; - - if (match == NULL || match->user_data == NULL) - return; - - mgr_entry = get_entry_info (entry); - dest = E_DESTINATION (match->user_data); - - /* Sometimes I really long for garbage collection. Reference - counting makes you feel 31337, but sometimes it is just a - bitch. */ - g_object_ref (dest); - - g_object_get (entry, - "model", &text_model, - NULL); - g_assert (E_IS_SELECT_NAMES_TEXT_MODEL (text_model)); - - pos = e_entry_get_position (entry); - e_select_names_model_text_pos (mgr_entry->model, text_model->seplen, pos, &i, NULL, NULL); - e_select_names_model_replace (mgr_entry->model, i, dest); - e_select_names_model_name_pos (mgr_entry->model, text_model->seplen, i, &start_pos, &len); - e_entry_set_position (entry, start_pos+len); -} - -static ESelectNamesManagerEntry * -e_select_names_manager_entry_new (ESelectNamesManager *manager, ESelectNamesModel *model, const gchar *id) -{ - ESelectNamesManagerEntry *entry; - ETextModel *text_model; - GList *l; - - g_return_val_if_fail (E_IS_SELECT_NAMES_MANAGER (manager), NULL); - g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), NULL); - - entry = g_new0 (ESelectNamesManagerEntry, 1); - - entry->id = g_strdup (id); - - entry->entry = E_ENTRY (e_entry_new ()); - text_model = e_select_names_text_model_new (model); - g_object_set(entry->entry, - "model", text_model, /* The entry takes ownership of the text model */ - "editable", TRUE, - "use_ellipsis", TRUE, - "allow_newlines", FALSE, - NULL); - - g_object_ref (entry->entry); - - entry->comp = e_select_names_completion_new (E_SELECT_NAMES_TEXT_MODEL (text_model)); - - for (l = manager->completion_books; l; l = l->next) { - EBook *book = l->data; - e_select_names_completion_add_book (E_SELECT_NAMES_COMPLETION(entry->comp), book); - } - - e_select_names_completion_set_minimum_query_length (E_SELECT_NAMES_COMPLETION(entry->comp), - manager->minimum_query_length); - - e_entry_enable_completion_full (entry->entry, entry->comp, 100, completion_handler); - - entry->manager = manager; - - entry->model = model; - g_object_ref (model); - - g_signal_connect (entry->entry, - "populate_popup", - G_CALLBACK (populate_popup_cb), - entry); - - g_object_set_data (G_OBJECT (entry->entry), "entry_info", entry); - g_object_set_data (G_OBJECT (entry->entry), "select_names_model", model); - g_object_set_data (G_OBJECT (entry->entry), "select_names_text_model", text_model); - g_object_set_data (G_OBJECT (entry->entry), "completion_handler", entry->comp); - - return entry; -} - -static void -e_select_names_manager_entry_free (ESelectNamesManagerEntry *entry) -{ - if (entry == NULL) - return; - - g_free (entry->id); - g_object_unref (entry->model); - g_object_unref (entry->entry); - - if (entry->cleaning_tag) - g_source_remove (entry->cleaning_tag); - - g_free (entry); -} - -/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ - -static void -e_select_names_manager_save_models (ESelectNamesManager *manager) -{ - GList *iter; - - for (iter = manager->sections; iter != NULL; iter = g_list_next (iter)) { - ESelectNamesManagerSection *section = iter->data; - - if (section->original_model == NULL && section->model != NULL) - section->original_model = e_select_names_model_duplicate (section->model); - - } -} - -static void -e_select_names_manager_revert_to_saved_models (ESelectNamesManager *manager) -{ - GList *iter; - - for (iter = manager->sections; iter != NULL; iter = g_list_next (iter)) { - ESelectNamesManagerSection *section = iter->data; - if (section->model && section->original_model) { - e_select_names_model_overwrite_copy (section->model, section->original_model); - g_object_unref (section->original_model); - section->original_model = NULL; - } - } -} - -static void -e_select_names_manager_discard_saved_models (ESelectNamesManager *manager) -{ - GList *iter; - - for (iter = manager->sections; iter != NULL; iter = g_list_next (iter)) { - ESelectNamesManagerSection *section = iter->data; - if (section->original_model) { - g_object_unref (section->original_model); - section->original_model = NULL; - } - } -} - -/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ - -static void -open_book_cb (EBook *book, EBookStatus status, gpointer user_data) -{ - ESelectNamesManager *manager = E_SELECT_NAMES_MANAGER (user_data); - - if (status == E_BOOK_ERROR_OK) { - GList *l; - for (l = manager->entries; l; l = l->next) { - ESelectNamesManagerEntry *entry = l->data; - e_select_names_completion_add_book (E_SELECT_NAMES_COMPLETION(entry->comp), book); - } - - manager->completion_books = g_list_append (manager->completion_books, book); - g_object_ref (book); - } - - g_object_unref (manager); /* unref ourself (matches ref before the load_source call below) */ -} - -static void -update_completion_books (ESelectNamesManager *manager) -{ - GSList *groups; - - /* Add all the completion books */ - for (groups = e_source_list_peek_groups (manager->source_list); groups; groups = groups->next) { - ESourceGroup *group = E_SOURCE_GROUP (groups->data); - GSList *sources; - - for (sources = e_source_group_peek_sources (group); sources; sources = sources->next) { - ESource *source = E_SOURCE (sources->data); - const char *completion = e_source_get_property (source, "completion"); - if (completion && !g_ascii_strcasecmp (completion, "true")) { - EBook *book = e_book_new (source, NULL); - g_object_ref (manager); - addressbook_load (book, open_book_cb, manager); - } - } - } -} - -static void -source_list_changed (ESourceList *source_list, ESelectNamesManager *manager) -{ - GList *l; - - for (l = manager->entries; l; l = l->next) { - ESelectNamesManagerEntry *entry = l->data; - e_select_names_completion_clear_books (E_SELECT_NAMES_COMPLETION (entry->comp)); - } - - g_list_foreach (manager->completion_books, (GFunc)g_object_unref, NULL); - g_list_free (manager->completion_books); - manager->completion_books = NULL; - - update_completion_books (manager); -} - -static void -config_min_query_length_changed_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) -{ - ESelectNamesManager *manager = data; - GList *l; - - manager->minimum_query_length = e_select_names_config_get_min_query_length (); - if (manager->minimum_query_length <= 0) - manager->minimum_query_length = DEFAULT_MINIMUM_QUERY_LENGTH; - - for (l = manager->entries; l; l = l->next) { - ESelectNamesManagerEntry *entry = l->data; - e_select_names_completion_set_minimum_query_length (E_SELECT_NAMES_COMPLETION(entry->comp), - manager->minimum_query_length); - } -} - -/** - * e_select_names_manager_new: - * - * Returns: a new #ESelectNamesManager - */ -ESelectNamesManager * -e_select_names_manager_new (void) -{ - ESelectNamesManager *manager = g_object_new (E_TYPE_SELECT_NAMES_MANAGER, NULL); - - return manager; -} - - -/* - * ESelectNamesManager lifecycle management and vcard loading/saving. - */ - - -void -e_select_names_manager_add_section (ESelectNamesManager *manager, - const char *id, - const char *title) -{ - g_return_if_fail (E_IS_SELECT_NAMES_MANAGER (manager)); - g_return_if_fail (id != NULL); - g_return_if_fail (title != NULL); - - e_select_names_manager_add_section_with_limit (manager, id, title, -1); -} - -void -e_select_names_manager_add_section_with_limit (ESelectNamesManager *manager, - const char *id, - const char *title, - gint limit) -{ - ESelectNamesManagerSection *section; - ESelectNamesModel *model; - - g_return_if_fail (E_IS_SELECT_NAMES_MANAGER (manager)); - g_return_if_fail (id != NULL); - g_return_if_fail (title != NULL); - - model = e_select_names_model_new (); - e_select_names_model_set_limit (model, limit); - - section = e_select_names_manager_section_new (manager, id, title, model); - - manager->sections = g_list_append (manager->sections, section); - - g_object_unref (model); -} - -ESelectNamesModel * -e_select_names_manager_get_source (ESelectNamesManager *manager, - const char *id) -{ - GList *iter; - - g_return_val_if_fail (E_IS_SELECT_NAMES_MANAGER (manager), NULL); - g_return_val_if_fail (id != NULL, NULL); - - for (iter = manager->sections; iter != NULL; iter = g_list_next (iter)) { - ESelectNamesManagerSection *section = iter->data; - if (!strcmp (section->id, id)) - return section->model; - } - return NULL; -} - -GtkWidget * -e_select_names_manager_create_entry (ESelectNamesManager *manager, const char *id) -{ - GList *iter; - - g_return_val_if_fail (E_IS_SELECT_NAMES_MANAGER (manager), NULL); - g_return_val_if_fail (id != NULL, NULL); - - for (iter = manager->sections; iter != NULL; iter = g_list_next (iter)) { - ESelectNamesManagerSection *section = iter->data; - if (!strcmp(section->id, id)) { - ESelectNamesManagerEntry *entry; - - entry = e_select_names_manager_entry_new (manager, section->model, section->id); - manager->entries = g_list_append (manager->entries, entry); - - return GTK_WIDGET(entry->entry); - } - } - - return NULL; -} - -static void -e_select_names_response(ESelectNames *dialog, gint response_id, ESelectNamesManager *manager) -{ - gtk_widget_destroy (GTK_WIDGET (dialog)); - - switch(response_id) { - case GTK_RESPONSE_OK: - e_select_names_manager_discard_saved_models (manager); - g_signal_emit (manager, e_select_names_manager_signals[OK], 0); - break; - - case GTK_RESPONSE_CANCEL: - e_select_names_manager_revert_to_saved_models (manager); - g_signal_emit (manager, e_select_names_manager_signals[CANCEL], 0); - break; - } -} - -static void -clear_widget (gpointer data, GObject *where_object_was) -{ - GtkWidget **widget_ref = data; - *widget_ref = NULL; -} - -void -e_select_names_manager_activate_dialog (ESelectNamesManager *manager, - const char *id) -{ - g_return_if_fail (E_IS_SELECT_NAMES_MANAGER (manager)); - g_return_if_fail (id != NULL); - - if (manager->names) { - - g_assert (GTK_WIDGET_REALIZED (GTK_WIDGET (manager->names))); - e_select_names_set_default (manager->names, id); - gdk_window_show (GTK_WIDGET (manager->names)->window); - gdk_window_raise (GTK_WIDGET (manager->names)->window); - - } else { - - GList *iter; - - manager->names = E_SELECT_NAMES (e_select_names_new ()); - - for (iter = manager->sections; iter != NULL; iter = g_list_next (iter)) { - ESelectNamesManagerSection *section = iter->data; - e_select_names_add_section (manager->names, section->id, section->title, section->model); - } - - e_select_names_set_default (manager->names, id); - - g_signal_connect(manager->names, - "response", - G_CALLBACK(e_select_names_response), - manager); - - g_object_weak_ref (G_OBJECT (manager->names), clear_widget, &manager->names); - - gtk_widget_show(GTK_WIDGET(manager->names)); - } - - e_select_names_manager_save_models (manager); -} - -/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ - -static void -e_select_names_manager_init (ESelectNamesManager *manager) -{ - guint not; - - manager->sections = NULL; - manager->entries = NULL; - - manager->source_list = e_source_list_new_for_gconf_default ("/apps/evolution/addressbook/sources"); - g_signal_connect (manager->source_list, "changed", G_CALLBACK (source_list_changed), manager); - - manager->completion_books = NULL; - - manager->minimum_query_length = e_select_names_config_get_min_query_length (); - - update_completion_books (manager); - - not = e_select_names_config_add_notification_min_query_length (config_min_query_length_changed_cb, manager); - manager->notifications = g_list_append (manager->notifications, GUINT_TO_POINTER (not)); -} - -static void -e_select_names_manager_dispose (GObject *object) -{ - ESelectNamesManager *manager; - - manager = E_SELECT_NAMES_MANAGER (object); - - if (manager->names) { - gtk_widget_destroy (GTK_WIDGET (manager->names)); - manager->names = NULL; - } - - if (manager->sections) { - g_list_foreach (manager->sections, (GFunc) e_select_names_manager_section_free, NULL); - g_list_free (manager->sections); - manager->sections = NULL; - } - - if (manager->entries) { - g_list_foreach (manager->entries, (GFunc) e_select_names_manager_entry_free, NULL); - g_list_free (manager->entries); - manager->entries = NULL; - } - - if (manager->source_list) { - g_object_unref (manager->source_list); - manager->source_list = NULL; - } - - if (manager->completion_books) { - g_list_foreach (manager->completion_books, (GFunc) g_object_unref, NULL); - g_list_free (manager->completion_books); - manager->completion_books = NULL; - } - - if (manager->notifications) { - GList *l; - - for (l = manager->notifications; l; l = l->next) - e_select_names_config_remove_notification (GPOINTER_TO_UINT (l->data)); - g_list_free (manager->notifications); - manager->notifications = NULL; - } - - if (G_OBJECT_CLASS (parent_class)->dispose) - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -static void -e_select_names_manager_class_init (ESelectNamesManagerClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS(klass); - parent_class = g_type_class_peek_parent (klass); - - object_class->dispose = e_select_names_manager_dispose; - - e_select_names_manager_signals[CHANGED] = - g_signal_new ("changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ESelectNamesManagerClass, changed), - NULL, NULL, - e_select_names_marshal_NONE__POINTER_INT, - G_TYPE_NONE, 2, - G_TYPE_POINTER, - G_TYPE_INT); - - e_select_names_manager_signals[OK] = - g_signal_new ("ok", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ESelectNamesManagerClass, ok), - NULL, NULL, - e_select_names_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - e_select_names_manager_signals[CANCEL] = - g_signal_new ("cancel", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ESelectNamesManagerClass, cancel), - NULL, NULL, - e_select_names_marshal_NONE__NONE, - G_TYPE_NONE, 0); -} - -/** - * e_select_names_manager_get_type: - * @void: - * - * Registers the &ESelectNamesManager class if necessary, and returns the type ID - * associated to it. - * - * Return value: The type ID of the &ESelectNamesManager class. - **/ -GType -e_select_names_manager_get_type (void) -{ - static GType manager_type = 0; - - if (!manager_type) { - static const GTypeInfo manager_info = { - sizeof (ESelectNamesManagerClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_select_names_manager_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (ESelectNamesManager), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_select_names_manager_init, - }; - - manager_type = g_type_register_static (G_TYPE_OBJECT, "ESelectNamesManager", &manager_info, 0); - } - - return manager_type; -} - - - diff --git a/addressbook/gui/component/select-names/e-select-names-manager.h b/addressbook/gui/component/select-names/e-select-names-manager.h deleted file mode 100644 index 0830d299d5..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-manager.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@ximian.com> - * - * Copyright (C) 2000 Ximian, Inc. - */ - -#ifndef __E_SELECT_NAMES_MANAGER_H__ -#define __E_SELECT_NAMES_MANAGER_H__ - -#include <stdio.h> -#include <time.h> -#include <gtk/gtkobject.h> -#include <e-util/e-list.h> -#include "e-select-names.h" - -#define E_TYPE_SELECT_NAMES_MANAGER (e_select_names_manager_get_type ()) -#define E_SELECT_NAMES_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SELECT_NAMES_MANAGER, ESelectNamesManager)) -#define E_SELECT_NAMES_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_MANAGER, ESelectNamesManagerClass)) -#define E_IS_SELECT_NAMES_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SELECT_NAMES_MANAGER)) -#define E_IS_SELECT_NAMES_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_MANAGER)) - -typedef struct _ESelectNamesManager ESelectNamesManager; -typedef struct _ESelectNamesManagerClass ESelectNamesManagerClass; - -struct _ESelectNamesManager { - GObject object; - - GList *sections; - GList *entries; - - ESelectNames *names; - - ESourceList *source_list; - GList *completion_books; - - int minimum_query_length; - - GList *notifications; -}; - -struct _ESelectNamesManagerClass { - GObjectClass parent_class; - - void (*changed) (ESelectNamesManager *, const gchar *section_id, gint changed_working_copy); - void (*ok) (ESelectNamesManager *); - void (*cancel) (ESelectNamesManager *); -}; - -ESelectNamesManager *e_select_names_manager_new (void); -void e_select_names_manager_add_section (ESelectNamesManager *manager, - const char *id, - const char *title); -void e_select_names_manager_add_section_with_limit (ESelectNamesManager *manager, - const char *id, - const char *title, - gint limit); -ESelectNamesModel *e_select_names_manager_get_source (ESelectNamesManager *manager, - const char *id); -GtkWidget *e_select_names_manager_create_entry (ESelectNamesManager *manager, - const char *id); -void e_select_names_manager_activate_dialog (ESelectNamesManager *manager, - const char *id); -/* Standard Gtk function */ -GType e_select_names_manager_get_type (void); - -#endif /* ! __E_SELECT_NAMES_MANAGER_H__ */ diff --git a/addressbook/gui/component/select-names/e-select-names-marshal.list b/addressbook/gui/component/select-names/e-select-names-marshal.list deleted file mode 100644 index 8e751dc27d..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-marshal.list +++ /dev/null @@ -1,3 +0,0 @@ -NONE:POINTER,INT -NONE:NONE -NONE:INT,INT,INT diff --git a/addressbook/gui/component/select-names/e-select-names-model.c b/addressbook/gui/component/select-names/e-select-names-model.c deleted file mode 100644 index 49b9e5039d..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-model.c +++ /dev/null @@ -1,792 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@ximian.com> - * Jon Trowbidge <trow@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#include <config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <gtk/gtkmarshal.h> -#include <gtk/gtksignal.h> - -#include <gal/util/e-util.h> -#include <libebook/e-book.h> -#include <libebook/e-contact.h> -#include "e-select-names-model.h" -#include "e-select-names-marshal.h" -#include "eab-book-util.h" - -enum { - E_SELECT_NAMES_MODEL_CHANGED, - E_SELECT_NAMES_MODEL_RESIZED, - E_SELECT_NAMES_MODEL_LAST_SIGNAL -}; - -static guint e_select_names_model_signals[E_SELECT_NAMES_MODEL_LAST_SIGNAL] = { 0 }; - -/* Object argument IDs */ -enum { - ARG_0, - ARG_CONTACT, -}; - -struct _ESelectNamesModelPrivate { - gchar *id; - gchar *title; - - GList *data; /* of EDestination */ - - gint limit; - - gint freeze_count; - gboolean pending_changed; -}; - -static GObjectClass *parent_class = NULL; - -static void e_select_names_model_init (ESelectNamesModel *model); -static void e_select_names_model_class_init (ESelectNamesModelClass *klass); - -static void e_select_names_model_dispose (GObject *object); - -GType -e_select_names_model_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (ESelectNamesModelClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_select_names_model_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (ESelectNamesModel), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_select_names_model_init, - }; - - type = g_type_register_static (G_TYPE_OBJECT, "ESelectNamesModel", &info, 0); - } - - return type; -} - -static void -e_select_names_model_class_init (ESelectNamesModelClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS(klass); - parent_class = g_type_class_peek_parent (klass); - - e_select_names_model_signals[E_SELECT_NAMES_MODEL_CHANGED] = - g_signal_new ("changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ESelectNamesModelClass, changed), - NULL, NULL, - e_select_names_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - e_select_names_model_signals[E_SELECT_NAMES_MODEL_RESIZED] = - g_signal_new ("resized", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (ESelectNamesModelClass, resized), - NULL, NULL, - e_select_names_marshal_NONE__INT_INT_INT, - G_TYPE_NONE, 3, - G_TYPE_INT, - G_TYPE_INT, - G_TYPE_INT); - - klass->changed = NULL; - - object_class->dispose = e_select_names_model_dispose; -} - -/** - * e_select_names_model_init: - */ -static void -e_select_names_model_init (ESelectNamesModel *model) -{ - model->priv = g_new0 (struct _ESelectNamesModelPrivate, 1); - - model->priv->limit = -1; -} - -static void -e_select_names_model_dispose (GObject *object) -{ - ESelectNamesModel *model = E_SELECT_NAMES_MODEL (object); - - if (model->priv) { - g_free (model->priv->title); - g_free (model->priv->id); - - g_list_foreach (model->priv->data, (GFunc) g_object_unref, NULL); - g_list_free (model->priv->data); - - g_free (model->priv); - model->priv = NULL; - } - - if (G_OBJECT_CLASS (parent_class)->dispose) - G_OBJECT_CLASS (parent_class)->dispose (object); -} - - -static void -e_select_names_model_changed (ESelectNamesModel *model) -{ - if (model->priv->freeze_count > 0) { - model->priv->pending_changed = TRUE; - } else { - g_signal_emit (model, e_select_names_model_signals[E_SELECT_NAMES_MODEL_CHANGED], 0); - model->priv->pending_changed = FALSE; - } -} - -/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/ - -ESelectNamesModel * -e_select_names_model_new (void) -{ - ESelectNamesModel *model; - model = g_object_new (E_TYPE_SELECT_NAMES_MODEL, NULL); - return model; -} - -ESelectNamesModel * -e_select_names_model_duplicate (ESelectNamesModel *old) -{ - ESelectNamesModel *model = e_select_names_model_new (); - GList *iter; - - model->priv->id = g_strdup (old->priv->id); - model->priv->title = g_strdup (old->priv->title); - - for (iter = old->priv->data; iter != NULL; iter = g_list_next (iter)) { - EDestination *dup = e_destination_copy (E_DESTINATION (iter->data)); - e_select_names_model_append (model, dup); - } - - model->priv->limit = old->priv->limit; - - return 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->data == NULL) { - - 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, FALSE); - ++i; - iter = g_list_next (iter); - } - - text = g_strjoinv (separator, strv); - - g_free (strv); - - } - - return text; -} - -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->data == NULL) { - - 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 addr_text; -} - -gint -e_select_names_model_count (ESelectNamesModel *model) -{ - g_return_val_if_fail (model != NULL, 0); - g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), 0); - - return g_list_length (model->priv->data); -} - -gint -e_select_names_model_get_limit (ESelectNamesModel *model) -{ - g_return_val_if_fail (model != NULL, 0); - g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), 0); - - return model->priv->limit; -} - -void -e_select_names_model_set_limit (ESelectNamesModel *model, gint limit) -{ - g_return_if_fail (model != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - - model->priv->limit = MAX (limit, -1); -} - -gboolean -e_select_names_model_at_limit (ESelectNamesModel *model) -{ - g_return_val_if_fail (model != NULL, TRUE); - g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), TRUE); - - return model->priv->limit >= 0 && g_list_length (model->priv->data) >= model->priv->limit; -} - -const EDestination * -e_select_names_model_get_destination (ESelectNamesModel *model, gint index) -{ - g_return_val_if_fail (model && E_IS_SELECT_NAMES_MODEL (model), NULL); - g_return_val_if_fail (0 <= index, NULL); - g_return_val_if_fail (index < g_list_length (model->priv->data), NULL); - - return E_DESTINATION (g_list_nth_data (model->priv->data, index)); -} - -gchar * -e_select_names_model_export_destinationv (ESelectNamesModel *model) -{ - EDestination **destv; - gchar *str; - gint i, len = 0; - GList *j; - g_return_val_if_fail (model && E_IS_SELECT_NAMES_MODEL (model), NULL); - - len = g_list_length (model->priv->data); - destv = g_new0 (EDestination *, len+1); - - for (i=0, j = model->priv->data; j != NULL; j = g_list_next (j)) { - EDestination *dest = E_DESTINATION (j->data); - - if (dest) - destv[i++] = dest; - } - - str = e_destination_exportv (destv); - g_free (destv); - - return str; -} - -void -e_select_names_model_import_destinationv (ESelectNamesModel *model, - gchar *destinationv) -{ - EDestination **destv; - gint i; - - g_return_if_fail (model && E_IS_SELECT_NAMES_MODEL (model)); - - destv = e_destination_importv (destinationv); - - e_select_names_model_delete_all (model); - - if (destv == NULL) - return; - - for (i = 0; destv[i]; i++) { - e_select_names_model_append (model, destv[i]); - } - g_free (destv); -} - -EContact * -e_select_names_model_get_contact (ESelectNamesModel *model, gint index) -{ - const EDestination *dest; - - g_return_val_if_fail (model && E_IS_SELECT_NAMES_MODEL (model), NULL); - g_return_val_if_fail (0 <= index, NULL); - g_return_val_if_fail (index < g_list_length (model->priv->data), NULL); - - dest = e_select_names_model_get_destination (model, index); - return dest ? e_destination_get_contact (dest) : NULL; - -} - -const gchar * -e_select_names_model_get_string (ESelectNamesModel *model, gint index) -{ - const EDestination *dest; - - g_return_val_if_fail (model && E_IS_SELECT_NAMES_MODEL (model), NULL); - g_return_val_if_fail (0 <= index, NULL); - g_return_val_if_fail (index < g_list_length (model->priv->data), NULL); - - dest = e_select_names_model_get_destination (model, index); - - return dest ? e_destination_get_textrep (dest, FALSE) : ""; -} - -gboolean -e_select_names_model_contains (ESelectNamesModel *model, const EDestination *dest) -{ - GList *iter; - - g_return_val_if_fail (E_IS_SELECT_NAMES_MODEL (model), FALSE); - g_return_val_if_fail (E_IS_DESTINATION (dest), FALSE); - - for (iter = model->priv->data; iter != NULL; iter = g_list_next (iter)) { - if (iter->data != NULL && e_destination_equal (dest, E_DESTINATION (iter->data))) - return TRUE; - } - - return FALSE; -} - -void -e_select_names_model_insert (ESelectNamesModel *model, gint index, EDestination *dest) -{ - g_return_if_fail (model != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - g_return_if_fail (0 <= index && index <= g_list_length (model->priv->data)); - g_return_if_fail (dest && E_IS_DESTINATION (dest)); - - if (e_select_names_model_at_limit (model)) { - /* FIXME: This is bad. */ - g_object_unref (dest); - return; - } - - model->priv->data = g_list_insert (model->priv->data, dest, index); - - g_object_ref (dest); - - e_select_names_model_changed (model); -} - -void -e_select_names_model_append (ESelectNamesModel *model, EDestination *dest) -{ - g_return_if_fail (model && E_IS_SELECT_NAMES_MODEL (model)); - g_return_if_fail (dest && E_IS_DESTINATION (dest)); - - if (e_select_names_model_at_limit (model)) { - /* FIXME: This is bad. */ - g_object_unref (dest); - return; - } - - model->priv->data = g_list_append (model->priv->data, dest); - - g_object_ref (dest); - - e_select_names_model_changed (model); -} - -void -e_select_names_model_replace (ESelectNamesModel *model, gint index, EDestination *dest) -{ - GList *node; - const gchar *new_str, *old_str; - gint old_strlen=0, new_strlen=0; - - g_return_if_fail (model != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - g_return_if_fail (model->priv->data == NULL || (0 <= index && index < g_list_length (model->priv->data))); - g_return_if_fail (dest && E_IS_DESTINATION (dest)); - - new_str = e_destination_get_textrep (dest, FALSE); - new_strlen = new_str ? strlen (new_str) : 0; - - if (model->priv->data == NULL) { - - model->priv->data = g_list_append (model->priv->data, dest); - g_object_ref (dest); - - } else { - - node = g_list_nth (model->priv->data, index); - - if (node->data != dest) { - - old_str = e_destination_get_textrep (E_DESTINATION (node->data), FALSE); - old_strlen = old_str ? strlen (old_str) : 0; - - g_object_unref (node->data); - - node->data = dest; - g_object_ref (dest); - } - } - - e_select_names_model_changed (model); - - g_signal_emit (model, e_select_names_model_signals[E_SELECT_NAMES_MODEL_RESIZED], 0, - index, old_strlen, new_strlen); -} - -void -e_select_names_model_delete (ESelectNamesModel *model, gint index) -{ - GList *node; - EDestination *dest; - - g_return_if_fail (model != NULL); - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - g_return_if_fail (0 <= index && index < g_list_length (model->priv->data)); - - node = g_list_nth (model->priv->data, index); - dest = E_DESTINATION (node->data); - - g_object_unref (dest); - - model->priv->data = g_list_remove_link (model->priv->data, node); - g_list_free_1 (node); - - e_select_names_model_changed (model); -} - -void -e_select_names_model_clean (ESelectNamesModel *model, gboolean clean_last_entry) -{ - GList *iter, *next; - gboolean changed = FALSE; - - g_return_if_fail (model != NULL && E_IS_SELECT_NAMES_MODEL (model)); - - iter = model->priv->data; - - while (iter) { - 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_empty (dest)) { - if (dest) - g_object_unref (dest); - model->priv->data = g_list_remove_link (model->priv->data, iter); - g_list_free_1 (iter); - changed = TRUE; - } - - iter = next; - } - - if (changed) - e_select_names_model_changed (model); -} - -void -e_select_names_model_delete_all (ESelectNamesModel *model) -{ - g_return_if_fail (model != NULL && E_IS_SELECT_NAMES_MODEL (model)); - - g_list_foreach (model->priv->data, (GFunc)g_object_unref, model); - g_list_free (model->priv->data); - model->priv->data = NULL; - - e_select_names_model_changed (model); -} - -void -e_select_names_model_overwrite_copy (ESelectNamesModel *dest, ESelectNamesModel *src) -{ - gint i, len; - - g_return_if_fail (dest && E_IS_SELECT_NAMES_MODEL (dest)); - g_return_if_fail (src && E_IS_SELECT_NAMES_MODEL (src)); - - if (src == dest) - return; - - e_select_names_model_delete_all (dest); - len = e_select_names_model_count (src); - for (i = 0; i < len; ++i) { - const EDestination *d = e_select_names_model_get_destination (src, i); - if (d) - e_select_names_model_append (dest, e_destination_copy (d)); - } -} - -void -e_select_names_model_merge (ESelectNamesModel *dest, ESelectNamesModel *src) -{ - gint i, len; - - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (dest)); - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (src)); - - if (src == dest) - return; - - len = e_select_names_model_count (src); - for (i = 0; i < len; ++i) { - const EDestination *d = e_select_names_model_get_destination (src, i); - if (d && !e_select_names_model_contains (dest, d)) - e_select_names_model_append (dest, e_destination_copy (d)); - } -} - -typedef struct { - EDestination *dest; - ESelectNamesModel *model; -} ModelDestClosure; - -static void -name_and_email_simple_query_cb (EBook *book, EBookStatus status, GList *contacts, gpointer closure) -{ - ModelDestClosure *c = closure; - EDestination *dest = c->dest; - ESelectNamesModel *model = c->model; - EContact *contact; - int num_non_list_contacts = 0; - GList *l; - - g_free (c); - - if (status == E_BOOK_ERROR_OK) { - for (l = contacts; l; l = l->next) { - EContact *c = E_CONTACT (l->data); - if (!e_contact_get (c, E_CONTACT_IS_LIST)) { - num_non_list_contacts++; - contact = c; - } - } - - if (num_non_list_contacts == 1) { - const char *email = e_destination_get_email (dest); - int email_num = 0; - - if (email && *email) { - GList *email_list = e_contact_get (contact, E_CONTACT_EMAIL); - GList *l; - - for (l = email_list; l; l = l->next) { - if (!g_ascii_strcasecmp (email, l->data)) - break; - email_num++; - } - if (l == NULL) - email_num = -1; - } - - if (email_num >= 0) { - e_destination_set_contact (dest, contact, email_num); - e_select_names_model_changed (model); - } - } - } - - - g_object_unref (dest); - g_object_unref (model); - g_object_unref (book); -} - -static void -book_opened (EBook *book, EBookStatus status, gpointer closure) -{ - ESelectNamesModel *model = closure; - GList *iter; - - for (iter = model->priv->data; iter != NULL; iter = g_list_next (iter)) { - ModelDestClosure *c = g_new (ModelDestClosure, 1); - - c->dest = g_object_ref (E_DESTINATION (iter->data)); - c->model = g_object_ref (model); - - if (e_destination_is_evolution_list (c->dest)) - continue; - - if (e_destination_get_contact (c->dest)) - continue; - - g_object_ref (book); - - eab_name_and_email_query (book, - e_destination_get_name (c->dest), - e_destination_get_email (c->dest), - name_and_email_simple_query_cb, - c); - } - - - g_object_unref (model); - g_object_unref (book); -} - -void -e_select_names_model_load_contacts (ESelectNamesModel *model) -{ - EBook *book; - - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - - if (model->priv->data) { - g_object_ref (model); - - book = e_book_new_default_addressbook (NULL); - - e_book_async_open (book, TRUE, book_opened, model); - } -} - -void -e_select_names_cancel_contacts_load (ESelectNamesModel *model) -{ -} - - -void -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 (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); - str = e_destination_get_textrep (E_DESTINATION (iter->data), FALSE); - len = str ? g_utf8_strlen (str, -1) : 0; - ++i; - iter = g_list_next (iter); - } - - if (i <= index) { - rp = -1; - len = 0; - } - - if (pos) - *pos = rp; - if (length) - *length = len; -} - -void -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 (E_IS_SELECT_NAMES_MODEL (model)); - g_return_if_fail (seplen > 0); - - iter = model->priv->data; - - while (iter != NULL) { - str = e_destination_get_textrep (E_DESTINATION (iter->data), FALSE); - len = str ? g_utf8_strlen (str, -1) : 0; - - if (sp <= pos && pos <= sp + len + adj) { - break; - } - - sp += len + adj + 1; - adj = seplen-1; - ++i; - - iter = g_list_next (iter); - } - - if (i != 0) - sp += seplen-1; /* skip past "magic space" */ - - if (iter == NULL) { -#if 0 - g_print ("text_pos ended NULL\n"); -#endif - i = -1; - sp = -1; - len = 0; - } else { -#if 0 - g_print ("text_pos got index %d\n", i); -#endif - } - - if (index) - *index = i; - if (start_pos) - *start_pos = sp; - if (length) - *length = len; -} - -void -e_select_names_model_freeze (ESelectNamesModel *model) -{ - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - - ++model->priv->freeze_count; -} - -void -e_select_names_model_thaw (ESelectNamesModel *model) -{ - g_return_if_fail (E_IS_SELECT_NAMES_MODEL (model)); - g_return_if_fail (model->priv->freeze_count > 0); - - --model->priv->freeze_count; - if (model->priv->pending_changed) - e_select_names_model_changed (model); -} diff --git a/addressbook/gui/component/select-names/e-select-names-model.h b/addressbook/gui/component/select-names/e-select-names-model.h deleted file mode 100644 index 10bede3f85..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-model.h +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * Authors: - * Chris Lahey <clahey@ximian.com> - * Jon Trowbridge <trow@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#ifndef __E_SELECT_NAMES_MODEL_H__ -#define __E_SELECT_NAMES_MODEL_H__ - -#include <time.h> -#include <gtk/gtkobject.h> -#include <stdio.h> -#include <e-util/e-list.h> -#include <libebook/e-contact.h> -#include <addressbook/util/e-destination.h> - -#define E_TYPE_SELECT_NAMES_MODEL (e_select_names_model_get_type ()) -#define E_SELECT_NAMES_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SELECT_NAMES_MODEL, ESelectNamesModel)) -#define E_SELECT_NAMES_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_MODEL, ESelectNamesModelClass)) -#define E_IS_SELECT_NAMES_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SELECT_NAMES_MODEL)) -#define E_IS_SELECT_NAMES_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_MODEL)) - -typedef struct _ESelectNamesModel ESelectNamesModel; -typedef struct _ESelectNamesModelClass ESelectNamesModelClass; -struct _ESelectNamesModelPrivate; - -struct _ESelectNamesModel { - GObject object; - - struct _ESelectNamesModelPrivate *priv; -}; - -struct _ESelectNamesModelClass { - GObjectClass parent_class; - - void (*changed) (ESelectNamesModel *model); - void (*resized) (ESelectNamesModel *model, gint index, gint old_len, gint new_len); -}; - -GType e_select_names_model_get_type (void); - -ESelectNamesModel *e_select_names_model_new (void); -ESelectNamesModel *e_select_names_model_duplicate (ESelectNamesModel *old); - -gchar *e_select_names_model_get_textification (ESelectNamesModel *model, const char *separator); -gchar *e_select_names_model_get_address_text (ESelectNamesModel *model, const char *separator); - -gint e_select_names_model_count (ESelectNamesModel *model); -gint e_select_names_model_get_limit (ESelectNamesModel *model); -void e_select_names_model_set_limit (ESelectNamesModel *model, gint limit); -gboolean e_select_names_model_at_limit (ESelectNamesModel *model); - -const EDestination *e_select_names_model_get_destination (ESelectNamesModel *model, gint index); -gchar *e_select_names_model_export_destinationv (ESelectNamesModel *model); -void e_select_names_model_import_destinationv (ESelectNamesModel *model, - gchar *destinationv); -EContact *e_select_names_model_get_contact (ESelectNamesModel *model, gint index); -const gchar *e_select_names_model_get_string (ESelectNamesModel *model, gint index); - -gboolean e_select_names_model_contains (ESelectNamesModel *model, const EDestination *dest); - -void e_select_names_model_insert (ESelectNamesModel *model, gint index, EDestination *dest); -void e_select_names_model_append (ESelectNamesModel *model, EDestination *dest); -void e_select_names_model_replace (ESelectNamesModel *model, gint index, EDestination *dest); -void e_select_names_model_delete (ESelectNamesModel *model, gint index); -void e_select_names_model_delete_all (ESelectNamesModel *model); -void e_select_names_model_overwrite_copy (ESelectNamesModel *dest, ESelectNamesModel *src); -void e_select_names_model_merge (ESelectNamesModel *dest, ESelectNamesModel *src); - -void e_select_names_model_clean (ESelectNamesModel *model, gboolean clean_last_entry); - -void e_select_names_model_name_pos (ESelectNamesModel *model, gint seplen, gint index, gint *pos, gint *length); -void e_select_names_model_text_pos (ESelectNamesModel *model, gint seplen, gint pos, gint *index, gint *start_pos, gint *length); - -void e_select_names_model_load_contacts (ESelectNamesModel *model); -void e_select_names_cancel_contacts_load (ESelectNamesModel *model); - -/* This is a mildly annoying freeze/thaw pair, in that it only applies to the 'changed' - signal and not to 'resized'. This could cause unexpected results in some cases. */ -void e_select_names_model_freeze (ESelectNamesModel *model); -void e_select_names_model_thaw (ESelectNamesModel *model); - - -#endif /* ! __E_SELECT_NAMES_MODEL_H__ */ diff --git a/addressbook/gui/component/select-names/e-select-names-popup.c b/addressbook/gui/component/select-names/e-select-names-popup.c deleted file mode 100644 index 8251ed4ea1..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-popup.c +++ /dev/null @@ -1,393 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-select-names-popup.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#include <config.h> - -#include <stdio.h> -#include <string.h> - -#include <glib.h> -#include <gtk/gtkimage.h> -#include <gtk/gtkmenuitem.h> -#include <gtk/gtkimagemenuitem.h> -#include <gtk/gtkcheckmenuitem.h> -#include <gtk/gtkradiomenuitem.h> -#include <gtk/gtkseparatormenuitem.h> -#include <libgnome/gnome-i18n.h> - -#include <addressbook/util/eab-book-util.h> -#include <addressbook/gui/contact-editor/e-contact-editor.h> -#include <addressbook/gui/contact-list-editor/e-contact-list-editor.h> -#include <addressbook/gui/contact-editor/e-contact-quick-add.h> -#include "eab-gui-util.h" -#include "e-select-names-popup.h" -#include <e-util/e-icon-factory.h> - -#define LIST_ICON_NAME "stock_contact-list" -#define CONTACT_ICON_NAME "stock_contact" - -typedef struct _PopupInfo PopupInfo; -struct _PopupInfo { - ESelectNamesTextModel *text_model; - EDestination *dest; - gint pos; - gint index; -}; - -static PopupInfo * -popup_info_new (ESelectNamesTextModel *text_model, EDestination *dest, gint pos, gint index) -{ - PopupInfo *info = g_new0 (PopupInfo, 1); - info->text_model = text_model; - info->dest = dest; - info->pos = pos; - info->index = index; - - if (text_model) - g_object_ref (text_model); - - if (dest) - g_object_ref (dest); - - return info; -} - -static void -popup_info_free (PopupInfo *info) -{ - if (info) { - - if (info->text_model) - g_object_unref (info->text_model); - - if (info->dest) - g_object_unref (info->dest); - - g_free (info); - } -} - -static void -popup_info_cleanup (GtkWidget *w, gpointer info) -{ - g_signal_handlers_disconnect_matched (G_OBJECT (w), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, info); - - popup_info_free ((PopupInfo *) info); -} - -/* You are in a maze of twisty little callbacks, all alike... */ - -#if TOO_MANY_MENU_ITEMS -static void -make_contact_editor_cb (EBook *book, gpointer user_data) -{ - if (book) { - EDestination *dest = E_DESTINATION (user_data); - EContact *contact; - - contact = (EContact *) e_destination_get_contact (dest); - if (e_contact_get (contact, E_CONTACT_IS_LIST)) { - EContactListEditor *ce; - ce = e_addressbook_show_contact_list_editor (book, contact, FALSE, TRUE); - e_contact_list_editor_raise (ce); - } - else { - EContactEditor *ce; - ce = e_addressbook_show_contact_editor (book, contact, FALSE, TRUE); - e_contact_editor_raise (ce); - } - g_object_unref (dest); - } -} - -static void -edit_contact_info_cb (GtkWidget *w, gpointer user_data) -{ - PopupInfo *info = (PopupInfo *) user_data; - if (info == NULL) - return; - - g_object_ref (info->dest); - e_book_use_default_book (make_contact_editor_cb, (gpointer) info->dest); -} -#endif - -static void -change_email_num_cb (GtkWidget *w, gpointer user_data) -{ - PopupInfo *info = (PopupInfo *) user_data; - gint n; - EDestination *dest; - - if (info == NULL) - return; - - if (! GTK_CHECK_MENU_ITEM (w)->active) - return; - - n = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (w), "number")); - - if (n != e_destination_get_email_num (info->dest)) { - dest = e_destination_new (); - e_destination_set_contact (dest, e_destination_get_contact (info->dest), n); - e_select_names_model_replace (info->text_model->source, info->index, dest); - } -} - -#if TOO_MANY_MENU_ITEMS -static void -remove_recipient_cb (GtkWidget *w, gpointer user_data) -{ - PopupInfo *info = (PopupInfo *) user_data; - e_select_names_model_delete (info->text_model->source, info->index); -} - -static void -remove_all_recipients_cb (GtkWidget *w, gpointer user_data) -{ - PopupInfo *info = (PopupInfo *) user_data; - e_select_names_model_delete_all (info->text_model->source); -} - -static void -toggle_html_mail_cb (GtkWidget *w, gpointer user_data) -{ - PopupInfo *info = (PopupInfo *) user_data; - GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM (w); - const EDestination *dest; - - if (info == NULL) - return; - - dest = info->dest; - - item = GTK_CHECK_MENU_ITEM (item); - e_destination_set_html_mail_pref ((EDestination *) dest, item->active); -} -#endif - -static void -populate_popup_contact (GtkWidget *pop, gboolean list, PopupInfo *info) -{ - GdkPixbuf *pixbuf; - GtkWidget *image; - EContact *contact; - GtkWidget *menuitem; - GList *email_list; - - contact = e_destination_get_contact (info->dest); - -#if TOO_MANY_MENU_ITEMS - menuitem = gtk_separator_menu_item_new(); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); - - menuitem = gtk_menu_item_new_with_label (_("Remove All")); - g_signal_connect (menuitem, "activate", - G_CALLBACK (remove_all_recipients_cb), - info); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); - - menuitem = gtk_menu_item_new_with_label (_("Remove")); - g_signal_connect (menuitem, "activate", - G_CALLBACK (remove_recipient_cb), - info); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); - - menuitem = gtk_menu_item_new_with_label (list ? _("View Contact List") : _("View Contact Info")); - g_signal_connect (menuitem, "activate", - G_CALLBACK (edit_contact_info_cb), - info); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); - - menuitem = gtk_check_menu_item_new_with_label (_("Send HTML Mail?")); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), - e_destination_get_html_mail_pref (info->dest)); - g_signal_connect (menuitem, "toggled", - G_CALLBACK (toggle_html_mail_cb), - info); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); -#endif - - email_list = e_contact_get (contact, E_CONTACT_EMAIL); - - if (email_list) { - menuitem = gtk_separator_menu_item_new(); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); - - if (g_list_length (email_list) > 1) { - GList *l; - GSList *radiogroup = NULL; - gint n = e_destination_get_email_num (info->dest); - gint j = g_list_length (email_list) - 1; - - for (l = g_list_last (email_list); l; l = l->prev) { - char *email = l->data; - char *label = NULL; - - label = g_strdup (email); - - if (list) { - menuitem = gtk_menu_item_new_with_label (label); - } - else { - menuitem = gtk_radio_menu_item_new_with_label (radiogroup, label); - g_signal_connect (menuitem, "toggled", - G_CALLBACK (change_email_num_cb), - info); - if (j == n) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), TRUE); - - g_object_set_data (G_OBJECT (menuitem), "number", GINT_TO_POINTER (j)); - radiogroup = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); - } - - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); - - j--; - - g_free (label); - } - } else { - menuitem = gtk_menu_item_new_with_label (e_destination_get_email (info->dest)); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); - } - - g_list_foreach (email_list, (GFunc)g_free, NULL); - g_list_free (email_list); - } - - menuitem = gtk_separator_menu_item_new (); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); - - pixbuf = e_icon_factory_get_icon (list ? LIST_ICON_NAME : CONTACT_ICON_NAME, E_ICON_SIZE_MENU); - image = gtk_image_new_from_pixbuf (pixbuf); - g_object_unref (pixbuf); - gtk_widget_show (image); - menuitem = gtk_image_menu_item_new_with_label (e_destination_get_name (info->dest)); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menuitem), - image); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); -} - -static void -quick_add_cb (GtkWidget *w, gpointer user_data) -{ - PopupInfo *info = (PopupInfo *) user_data; - e_contact_quick_add_free_form (e_destination_get_address (info->dest), NULL, NULL); -} - -static void -populate_popup_nocontact (GtkWidget *pop, PopupInfo *info) -{ - const gchar *str; - GtkWidget *menuitem; - - menuitem = gtk_separator_menu_item_new (); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); - - menuitem = gtk_menu_item_new_with_label (_("Add to Contacts")); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); - g_signal_connect (menuitem, "activate", - G_CALLBACK (quick_add_cb), - info); - -#if TOO_MANY_MENU_ITEMS - menuitem = gtk_check_menu_item_new_with_label (_("Send HTML Mail?")); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), - e_destination_get_html_mail_pref (info->dest)); - g_signal_connect (menuitem, "toggled", - G_CALLBACK (toggle_html_mail_cb), - info); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); -#endif - - menuitem = gtk_separator_menu_item_new (); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); - - str = e_destination_get_name (info->dest); - if (! (str && *str)) - str = e_destination_get_email (info->dest); - if (! (str && *str)) - str = _("Unnamed Contact"); - - menuitem = gtk_menu_item_new_with_label (str); - gtk_widget_show (menuitem); - gtk_menu_shell_prepend (GTK_MENU_SHELL (pop), menuitem); -} - -void -e_select_names_populate_popup (GtkWidget *menu, ESelectNamesTextModel *text_model, - GdkEventButton *ev, gint pos, GtkWidget *for_widget) -{ - ESelectNamesModel *model; - PopupInfo *info; - EDestination *dest; - gint index; - - g_return_if_fail (GTK_IS_MENU_SHELL (menu)); - g_return_if_fail (E_IS_SELECT_NAMES_TEXT_MODEL (text_model)); - g_return_if_fail (ev); - g_return_if_fail (0 <= pos); - - model = text_model->source; - - e_select_names_model_text_pos (model, text_model->seplen, pos, &index, NULL, NULL); - if (index < 0 || index >= e_select_names_model_count (model)) - return; - - /* XXX yuck, why does this return a const? */ - dest = (EDestination *)e_select_names_model_get_destination (model, index); - if (e_destination_empty (dest)) - return; - - info = popup_info_new (text_model, dest, pos, index); - - if (e_destination_get_contact (dest)) { - populate_popup_contact (menu, e_destination_is_evolution_list (dest), info); - } else { - populate_popup_nocontact (menu, info); - } - - /* Clean up our info item after we've made our selection. */ - g_signal_connect (menu, - "selection-done", - G_CALLBACK (popup_info_cleanup), - info); -} diff --git a/addressbook/gui/component/select-names/e-select-names-popup.h b/addressbook/gui/component/select-names/e-select-names-popup.h deleted file mode 100644 index 531275190b..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-popup.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-select-names-popup.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef __E_SELECT_NAMES_POPUP_H__ -#define __E_SELECT_NAMES_POPUP_H__ - -#include "e-select-names-text-model.h" - -void e_select_names_populate_popup (GtkWidget *menu, ESelectNamesTextModel *text_model, - GdkEventButton *ev, gint pos, GtkWidget *for_widget); - -#endif /* __E_SELECT_NAMES_POPUP_H__ */ - diff --git a/addressbook/gui/component/select-names/e-select-names-section.etspec b/addressbook/gui/component/select-names/e-select-names-section.etspec deleted file mode 100644 index 9d7b038892..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-section.etspec +++ /dev/null @@ -1,7 +0,0 @@ -<ETableSpecification no-headers="true" cursor-mode="line" alternating-row-colors="false"> - <ETableColumn model_col= "0" _title="Name" expansion="1.0" minimum_width="20" resizable="true" cell="string" compare="collate" search="string"/> - <ETableState> - <column source="0"/> - <grouping> <leaf column="0" ascending="true"/> </grouping> - </ETableState> -</ETableSpecification> 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 deleted file mode 100644 index dd824a6322..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-table-model.c +++ /dev/null @@ -1,366 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@ximian.com> - * - * Copyright (C) 2000 Ximian, Inc. - */ - -#include <config.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <gtk/gtksignal.h> -#include <gal/util/e-util.h> -#include <libgnome/gnome-i18n.h> -#include <libebook/e-contact.h> -#include "e-select-names-table-model.h" - -/* Object argument IDs */ -enum { - PROP_0, - PROP_SOURCE, -}; - -static void e_select_names_table_model_init (ESelectNamesTableModel *model); -static void e_select_names_table_model_class_init (ESelectNamesTableModelClass *klass); - -static void e_select_names_table_model_dispose (GObject *object); -static void e_select_names_table_model_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_select_names_table_model_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void e_select_names_table_model_model_changed (ESelectNamesModel *source, - ESelectNamesTableModel *model); - -static ETableModelClass *parent_class = NULL; - -static void -e_select_names_table_model_add_source (ESelectNamesTableModel *model, - ESelectNamesModel *source) -{ - model->source = source; - if (model->source) - g_object_ref(model->source); - model->source_changed_id = g_signal_connect(model->source, "changed", - G_CALLBACK(e_select_names_table_model_model_changed), - model); -} - -static void -e_select_names_table_model_drop_source (ESelectNamesTableModel *model) -{ - if (model->source_changed_id) - g_signal_handler_disconnect(model->source, model->source_changed_id); - if (model->source) - g_object_unref(model->source); - model->source = NULL; - model->source_changed_id = 0; -} - -/** - * e_select_names_table_model_get_type: - * @void: - * - * Registers the &ESelectNamesTableModel class if necessary, and returns the type ID - * associated to it. - * - * Return value: The type ID of the &ESelectNamesTableModel class. - **/ -GType -e_select_names_table_model_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (ESelectNamesTableModelClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_select_names_table_model_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (ESelectNamesTableModel), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_select_names_table_model_init, - }; - - type = g_type_register_static (e_table_model_get_type (), "ESelectNamesTableModel", &info, 0); - } - - return type; -} - -/** - * e_select_names_table_model_new: - * @VCard: a string in vCard format - * - * Returns: a new #ESelectNamesTableModel that wraps the @VCard. - */ -ETableModel * -e_select_names_table_model_new (ESelectNamesModel *source) -{ - ETableModel *model = g_object_new (E_TYPE_SELECT_NAMES_TABLE_MODEL, NULL); - g_object_set(model, - "source", source, - NULL); - return model; -} - -static void -fill_in_info (ESelectNamesTableModel *model) -{ - if (model->source) { - int count = e_select_names_model_count (model->source); - gint i; - - model->count = count; - model->data = g_new(ESelectNamesTableModelData, count); - - for (i = 0; i < count; ++i) { - const EDestination *dest = e_select_names_model_get_destination (model->source, i); - EContact *contact = dest ? e_destination_get_contact (dest) : NULL; - - if (contact) { - model->data[i].name = e_contact_get(contact, E_CONTACT_NAME_OR_ORG); - if (model->data[i].name == 0) - model->data[i].name = g_strdup(""); - model->data[i].email = e_contact_get(contact, E_CONTACT_EMAIL_1); - if (model->data[i].email == 0) - model->data[i].email = g_strdup(""); - } else { - const gchar *name = e_destination_get_name (dest); - const gchar *email = e_destination_get_email (dest); - - model->data[i].name = g_strdup (name && *name ? name : email); - model->data[i].email = g_strdup (email); - } - } - } else { - model->count = 0; - } -} - -static void -clear_info (ESelectNamesTableModel *model) -{ - if (model->data) { - 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; -} - -/* - * ESelectNamesTableModel lifecycle management and vcard loading/saving. - */ - -static void -e_select_names_table_model_dispose (GObject *object) -{ - ESelectNamesTableModel *model; - - model = E_SELECT_NAMES_TABLE_MODEL (object); - - e_select_names_table_model_drop_source (model); - clear_info(model); - - if (G_OBJECT_CLASS (parent_class)->dispose) - G_OBJECT_CLASS (parent_class)->dispose (object); -} - -/* This function returns the number of columns in our ETableModel. */ -static int -e_select_names_table_model_col_count (ETableModel *etc) -{ - return 3; -} - -/* 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) { - fill_in_info(e_select_names_table_model); - } - 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; - case 2: - /* underline column*/ - return (void*)TRUE; - 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) -{ - e_table_model_pre_change(E_TABLE_MODEL(model)); - clear_info(model); - e_table_model_changed(E_TABLE_MODEL(model)); -} - -/* Set_arg handler for the model */ -static void -e_select_names_table_model_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - ESelectNamesTableModel *model; - - model = E_SELECT_NAMES_TABLE_MODEL (object); - - switch (prop_id) { - case PROP_SOURCE: - e_select_names_table_model_drop_source (model); - e_select_names_table_model_add_source (model, E_SELECT_NAMES_MODEL(g_value_get_object (value))); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -/* Get_arg handler for the model */ -static void -e_select_names_table_model_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - ESelectNamesTableModel *model; - - model = E_SELECT_NAMES_TABLE_MODEL (object); - - switch (prop_id) { - case PROP_SOURCE: - g_value_set_object (value, model->source); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -/** - * e_select_names_table_model_init: - */ -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) -{ - GObjectClass *object_class; - ETableModelClass *table_model_class; - - object_class = G_OBJECT_CLASS(klass); - table_model_class = E_TABLE_MODEL_CLASS(klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->dispose = e_select_names_table_model_dispose; - object_class->get_property = e_select_names_table_model_get_property; - object_class->set_property = e_select_names_table_model_set_property; - - g_object_class_install_property (object_class, PROP_SOURCE, - g_param_spec_object ("source", - _("Source"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_SELECT_NAMES_MODEL, - G_PARAM_READWRITE)); - - 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 deleted file mode 100644 index 1fd1026f19..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-table-model.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@ximian.com> - * - * Copyright (C) 2000 Ximian, Inc. - */ - -#ifndef __E_SELECT_NAMES_TABLE_MODEL_H__ -#define __E_SELECT_NAMES_TABLE_MODEL_H__ - -#include <time.h> -#include <stdio.h> -#include <gtk/gtkobject.h> -#include <gal/e-table/e-table-model.h> -#include "e-select-names-model.h" - -#define E_TYPE_SELECT_NAMES_TABLE_MODEL (e_select_names_table_model_get_type ()) -#define E_SELECT_NAMES_TABLE_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SELECT_NAMES_TABLE_MODEL, ESelectNamesTableModel)) -#define E_SELECT_NAMES_TABLE_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_TABLE_MODEL, ESelectNamesTableModelClass)) -#define E_IS_SELECT_NAMES_TABLE_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SELECT_NAMES_TABLE_MODEL)) -#define E_IS_SELECT_NAMES_TABLE_MODEL_CLASS(klass) (G_TYPE_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; - -struct _ESelectNamesTableModel { - ETableModel parent; - - ESelectNamesModel *source; - int source_changed_id; - - int count; - ESelectNamesTableModelData *data; /* This is used as an array. */ -}; - -struct _ESelectNamesTableModelClass { - ETableModelClass parent_class; -}; - -ETableModel *e_select_names_table_model_new (ESelectNamesModel *source); - -/* Standard Gtk function */ -GType e_select_names_table_model_get_type (void); - -#endif /* ! __E_SELECT_NAMES_TABLE_MODEL_H__ */ 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 deleted file mode 100644 index 5d0a1edf36..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-text-model.c +++ /dev/null @@ -1,856 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@ximian.com> - * Jon Trowbridge <trow@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#include <config.h> - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> - -#include <gal/e-text/e-text-model-repos.h> -#include <libgnome/gnome-i18n.h> - -#include <addressbook/gui/contact-editor/e-contact-editor.h> -#include "e-select-names-text-model.h" -#include "eab-gui-util.h" - -static FILE *out = NULL; /* stream for debugging spew */ - -/* Object argument IDs */ -enum { - PROP_0, - PROP_SOURCE, -}; - -static void e_select_names_text_model_class_init (ESelectNamesTextModelClass *klass); -static void e_select_names_text_model_init (ESelectNamesTextModel *model); -static void e_select_names_text_model_dispose (GObject *object); -static void e_select_names_text_model_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_select_names_text_model_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); - -static void e_select_names_text_model_set_source (ESelectNamesTextModel *model, ESelectNamesModel *source); - -static const gchar *e_select_names_text_model_get_text (ETextModel *model); -static void e_select_names_text_model_set_text (ETextModel *model, const gchar *text); -static void e_select_names_text_model_insert (ETextModel *model, gint position, const gchar *text); -static void e_select_names_text_model_insert_length (ETextModel *model, gint position, const gchar *text, gint length); -static void e_select_names_text_model_delete (ETextModel *model, gint position, gint length); - -static gint e_select_names_text_model_obj_count (ETextModel *model); -static const gchar *e_select_names_text_model_get_nth_obj (ETextModel *model, gint n, gint *len); -static void e_select_names_text_model_activate_obj (ETextModel *model, gint n); - - -static ETextModelClass *parent_class; -#define PARENT_TYPE e_text_model_get_type() - -/** - * e_select_names_text_model_get_type: - * @void: - * - * Registers the &ESelectNamesTextModel class if necessary, and returns the type ID - * associated to it. - * - * Return value: The type ID of the &ESelectNamesTextModel class. - **/ -GtkType -e_select_names_text_model_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (ESelectNamesTextModelClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_select_names_text_model_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (ESelectNamesTextModel), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_select_names_text_model_init, - }; - - type = g_type_register_static (PARENT_TYPE, "ESelectNamesTextModel", &info, 0); - } - - return type; -} - -static void -e_select_names_text_model_class_init (ESelectNamesTextModelClass *klass) -{ - GObjectClass *object_class; - ETextModelClass *text_model_class; - - object_class = G_OBJECT_CLASS(klass); - text_model_class = E_TEXT_MODEL_CLASS(klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->dispose = e_select_names_text_model_dispose; - object_class->get_property = e_select_names_text_model_get_property; - object_class->set_property = e_select_names_text_model_set_property; - - g_object_class_install_property (object_class, PROP_SOURCE, - g_param_spec_object ("source", - _("Source"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_SELECT_NAMES_MODEL, - G_PARAM_READWRITE)); - - text_model_class->get_text = e_select_names_text_model_get_text; - text_model_class->set_text = e_select_names_text_model_set_text; - text_model_class->insert = e_select_names_text_model_insert; - text_model_class->insert_length = e_select_names_text_model_insert_length; - text_model_class->delete = e_select_names_text_model_delete; - - text_model_class->obj_count = e_select_names_text_model_obj_count; - text_model_class->get_nth_obj = e_select_names_text_model_get_nth_obj; - text_model_class->object_activated = e_select_names_text_model_activate_obj; - - if (getenv ("EVO_DEBUG_SELECT_NAMES_TEXT_MODEL")) { - out = fopen ("/tmp/evo-debug-select-names-text-model", "w"); - if (out) - setvbuf (out, NULL, _IONBF, 0); - } -} - -static void -dump_model (ESelectNamesTextModel *text_model) -{ - ESelectNamesModel *model = text_model->source; - gint i; - - if (out == NULL) - return; - - fprintf (out, "\n*** Model State: count=%d\n", e_select_names_model_count (model)); - - for (i=0; i<e_select_names_model_count (model); ++i) - fprintf (out, "[%d] \"%s\" %s\n", i, - e_select_names_model_get_string (model, i), - e_select_names_model_get_contact (model, i) ? "<contact>" : ""); - fprintf (out, "\n"); -} - -static void -e_select_names_text_model_init (ESelectNamesTextModel *model) -{ - const gchar *default_sep; - - model->last_magic_comma_pos = -1; - - if (getenv ("EVOLUTION_DISABLE_MAGIC_COMMA")) - default_sep = ","; - else - default_sep = ", "; - - e_select_names_text_model_set_separator (model, default_sep); -} - -static void -e_select_names_text_model_dispose (GObject *object) -{ - ESelectNamesTextModel *model; - - model = E_SELECT_NAMES_TEXT_MODEL (object); - - if (model->text) { - g_free (model->text); - model->text = NULL; - } - if (model->sep) { - g_free (model->sep); - model->sep = NULL; - } - - e_select_names_text_model_set_source (model, NULL); - - if (G_OBJECT_CLASS(parent_class)->dispose) - G_OBJECT_CLASS(parent_class)->dispose(object); -} - -static void -e_select_names_text_model_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - ESelectNamesTextModel *model; - - model = E_SELECT_NAMES_TEXT_MODEL (object); - - switch (prop_id) { - case PROP_SOURCE: - e_select_names_text_model_set_source(model, E_SELECT_NAMES_MODEL (g_value_get_object(value))); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_select_names_text_model_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - ESelectNamesTextModel *model; - - model = E_SELECT_NAMES_TEXT_MODEL (object); - - switch (prop_id) { - case PROP_SOURCE: - g_value_set_object (value, model->source); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -resize_cb (ESelectNamesModel *source, gint index, gint old_len, gint new_len, ETextModel *model) -{ - EReposDeleteShift repos_del; - EReposInsertShift repos_ins; - gint pos; - gint seplen = E_SELECT_NAMES_TEXT_MODEL (model)->seplen; - - e_select_names_model_name_pos (source, seplen, index, &pos, NULL); - - if (new_len < old_len) { - - repos_del.model = model; - repos_del.pos = pos; - repos_del.len = old_len - new_len; - e_text_model_reposition (model, e_repos_delete_shift, &repos_del); - - } else if (old_len < new_len) { - - repos_ins.model = model; - repos_ins.pos = pos; - repos_ins.len = new_len - old_len; - e_text_model_reposition (model, e_repos_insert_shift, &repos_ins); - - } -} - -static void -changed_cb (ESelectNamesModel *source, ETextModel *model) -{ - ESelectNamesTextModel *text_model = E_SELECT_NAMES_TEXT_MODEL (model); - - g_free (text_model->text); - text_model->text = NULL; - - e_text_model_changed (model); -} - - -static void -e_select_names_text_model_set_source (ESelectNamesTextModel *model, - ESelectNamesModel *source) -{ - if (source == model->source) - return; - - if (model->source) { - g_signal_handler_disconnect (model->source, model->source_changed_id); - g_signal_handler_disconnect (model->source, model->source_resize_id); - g_object_unref (model->source); - } - - model->source = source; - - if (model->source) { - g_object_ref (model->source); - model->source_changed_id = g_signal_connect (model->source, - "changed", - G_CALLBACK (changed_cb), - model); - model->source_resize_id = g_signal_connect (model->source, - "resized", - G_CALLBACK (resize_cb), - model); - } -} - -ETextModel * -e_select_names_text_model_new (ESelectNamesModel *source) -{ - ETextModel *model = g_object_new (E_TYPE_SELECT_NAMES_TEXT_MODEL, NULL); - e_select_names_text_model_set_source (E_SELECT_NAMES_TEXT_MODEL (model), source); - return model; -} - -void -e_select_names_text_model_set_separator (ESelectNamesTextModel *model, const char *sep) -{ - g_return_if_fail (E_IS_SELECT_NAMES_TEXT_MODEL (model)); - g_return_if_fail (sep && *sep); - - g_free (model->sep); - model->sep = g_strdup (sep); - model->seplen = g_utf8_strlen (sep, -1); -} - -static const gchar * -e_select_names_text_model_get_text (ETextModel *model) -{ - ESelectNamesTextModel *snm = E_SELECT_NAMES_TEXT_MODEL(model); - - if (snm == NULL) - return ""; - else if (snm->text == NULL) - snm->text = e_select_names_model_get_textification (snm->source, snm->sep); - - return snm->text; -} - -static void -e_select_names_text_model_set_text (ETextModel *model, const gchar *text) -{ - ESelectNamesTextModel *snm = E_SELECT_NAMES_TEXT_MODEL(model); - - e_select_names_model_delete_all (snm->source); - e_select_names_text_model_insert (model, 0, text); -} - -static void -e_select_names_text_model_insert (ETextModel *model, gint position, const gchar *text) -{ - e_select_names_text_model_insert_length (model, position, text, g_utf8_strlen (text, -1)); -} - -static void -e_select_names_text_model_insert_length (ETextModel *model, gint pos, const gchar *text, gint length) -{ - ESelectNamesTextModel *text_model = E_SELECT_NAMES_TEXT_MODEL (model); - ESelectNamesModel *source = text_model->source; - const char *t; - gchar *tmp; - - if (out) { - tmp = g_strndup (text, length); - fprintf (out, ">> insert \"%s\" (len=%d) at %d\n", tmp, length, pos); - g_free (tmp); - } - - tmp = e_select_names_model_get_textification (source, text_model->sep); - pos = CLAMP (pos, 0, g_utf8_strlen (tmp, -1)); - g_free (tmp); - - /* We want to control all cursor motions ourselves, rather than taking hints - from the ESelectNamesModel. */ - g_signal_handler_block (source, text_model->source_resize_id); - - /* We handle this one character at a time. */ - - for (t = text; length >= 0; t = g_utf8_next_char (t), length--) { - gint index, start_pos, text_len; - gboolean inside_quote = FALSE; - gunichar ut = g_utf8_get_char (t); - - if (ut == 0) - break; - - text_model->last_magic_comma_pos = -1; - - if (out) - fprintf (out, "processing [%d]\n", ut); - - e_select_names_model_text_pos (source, text_model->seplen, pos, &index, &start_pos, &text_len); - - if (out) - fprintf (out, "index=%d start_pos=%d text_len=%d\n", index, start_pos, text_len); - - /* Is this a quoted or an unquoted separator we are dealing with? */ - if (ut == g_utf8_get_char(text_model->sep) && index >= 0) { - const EDestination *dest = e_select_names_model_get_destination (source, index); - if (dest) { - const gchar *str = e_destination_get_textrep (dest, FALSE); - int j; - const char *jp; - - if (out) - fprintf (out, "str=%s pos=%d\n", str, pos); - - for (jp = str, j = 0; j<pos-start_pos && *jp; jp = g_utf8_next_char (jp), ++j) { - if (*jp == '"') { - inside_quote = !inside_quote; - if (out) - fprintf (out, "flip to %d at %d\n", start_pos+j, inside_quote); - } - } - } - if (out) - fprintf (out, inside_quote ? "inside quote\n" : "not inside quote\n"); - } - - - if (ut == g_utf8_get_char (text_model->sep) && !inside_quote) { - - /* This is the case of hitting , first thing in an empty entry */ - if (index == -1) { - EReposAbsolute repos; - - e_select_names_model_insert (source, 0, e_destination_new ()); - e_select_names_model_insert (source, 0, e_destination_new ()); - - repos.model = model; - repos.pos = -1; /* At end */ - e_text_model_reposition (model, e_repos_absolute, &repos); - - - } else if (pos <= start_pos || pos == start_pos + text_len) { - EReposInsertShift repos; - gint ins_point = index; - - if (text_len != 0 && pos == start_pos + text_len) - ++ins_point; - - /* Block adjacent blank cards. */ - if (! ((ins_point < e_select_names_model_count (source) && - (e_select_names_model_get_string (source, ins_point) == NULL)) - || (ins_point > 0 && (e_select_names_model_get_string (source, ins_point-1) == NULL)))) { - - e_select_names_model_insert (source, ins_point, e_destination_new ()); - - repos.model = model; - repos.pos = pos; - repos.len = text_model->seplen; - e_text_model_reposition (model, e_repos_insert_shift, &repos); - pos += text_model->seplen; - } - - } else { - EReposInsertShift repos; - gint offset = MAX (pos - start_pos, 0); - const gchar *str = e_select_names_model_get_string (source, index); - gchar *str1 = g_strndup (str, offset); - gchar *str2 = g_strdup (str+offset); - EDestination *d1 = e_destination_new (), *d2 = e_destination_new (); - - e_destination_set_raw (d1, str1); - e_destination_set_raw (d2, str2); - - e_select_names_model_replace (source, index, d1); - e_select_names_model_insert (source, index+1, d2); - - g_free (str1); - g_free (str2); - - repos.model = model; - repos.pos = pos; - repos.len = text_model->seplen; - e_text_model_reposition (model, e_repos_insert_shift, &repos); - pos += text_model->seplen; - } - - if (text_model->seplen > 1) - text_model->last_magic_comma_pos = pos; - - } else { - EReposInsertShift repos; - gint offset = MAX (pos - start_pos, 0); - const gchar *str; - GString *new_str = g_string_new (NULL); - gint this_length = 1; - gboolean whitespace = g_unichar_isspace (ut); - - str = index >= 0 ? e_select_names_model_get_string (source, index) : NULL; - if (str && *str) { - if (pos <= start_pos) { - if (whitespace) { - /* swallow leading whitespace */ - this_length = 0; - } else { - /* Adjust for our "magic white space" */ - /* FIXME: This code does the wrong thing if seplen > 2 */ - g_string_append_unichar (new_str, ut); - g_string_append (new_str, pos < start_pos ? " " : ""); - g_string_append (new_str, str); - if (pos < start_pos) - ++this_length; - } - } else { - const char *u; - int n; - for (u = str, n = 0; n < offset; u = g_utf8_next_char (u), n++) - g_string_append_unichar (new_str, g_utf8_get_char (u)); - g_string_append_unichar (new_str, ut); - g_string_append (new_str, u); - } - } else { - if (whitespace) { - /* swallow leading whitespace */ - this_length = 0; - } else { - g_string_append_unichar (new_str, ut); - } - } - - if (new_str->len) { - - EDestination *dest; - dest = e_destination_new (); - e_destination_set_raw (dest, new_str->str); - e_select_names_model_replace (source, index, dest); - - if (this_length > 0) { - repos.model = model; - repos.pos = pos; - repos.len = this_length; - e_text_model_reposition (model, e_repos_insert_shift, &repos); - - pos += this_length; - } - } - g_string_free (new_str, TRUE); - } - } - - dump_model (text_model); - - g_signal_handler_unblock (source, text_model->source_resize_id); -} - - -static void -e_select_names_text_model_delete (ETextModel *model, gint pos, gint length) -{ - ESelectNamesTextModel *text_model = E_SELECT_NAMES_TEXT_MODEL (model); - ESelectNamesModel *source = text_model->source; - gint index, start_pos, text_len, offset; - - if (out) { - const gchar *str = e_select_names_model_get_textification (source, text_model->sep); - gint i, len; - - fprintf (out, ">> delete %d at pos %d\n", length, pos); - - len = strlen (str); - for (i=0; i<pos && i<len; ++i) - fprintf (out, "%c", str[i]); - fprintf (out, "["); - for (i=pos; i<pos+length && i<len; ++i) - fprintf (out, "%c", str[i]); - fprintf (out, "]"); - for (i=pos+length; i<len; ++i) - fprintf (out, "%c", str[i]); - fprintf (out, "\n"); - } - - if (length < 0) - return; - - if (text_model->last_magic_comma_pos == pos+1 && length == 1) { - pos -= text_model->seplen-1; - if (pos >= 0) - length = text_model->seplen; - text_model->last_magic_comma_pos = -1; - } - - e_select_names_model_text_pos (source, text_model->seplen, pos, &index, &start_pos, &text_len); - - if (out) - fprintf (out, "index=%d, start_pos=%d, text_len=%d\n", index, start_pos, text_len); - - /* We want to control all cursor motions ourselves, rather than taking hints - from the ESelectNamesModel. */ - g_signal_handler_block (source, E_SELECT_NAMES_TEXT_MODEL (model)->source_resize_id); - - /* First, we handle a few tricky cases. */ - - if (pos < start_pos) { - EReposAbsolute repos; - - repos.model = model; - repos.pos = pos; - e_text_model_reposition (model, e_repos_absolute, &repos); - - length -= start_pos - pos; - - if (length > 0) - e_select_names_text_model_delete (model, start_pos, length); - goto finished; - } - - if (pos == start_pos + text_len) { - /* We are positioned right at the end of an entry, possibly right in front of a comma. */ - - if (index+1 < e_select_names_model_count (source)) { - EReposDeleteShift repos; - EDestination *new_dest; - const gchar *str1 = e_select_names_model_get_string (source, index); - const gchar *str2 = e_select_names_model_get_string (source, index+1); - gchar *new_str; - - while (str1 && *str1 && isspace ((gint) *str1)) - ++str1; - while (str2 && *str2 && isspace ((gint) *str2)) - ++str2; - - if (str1 && str2) - new_str = g_strdup_printf ("%s%s%s", str1, text_model->sep+1, str2); - else if (str1) - new_str = g_strdup (str1); - else if (str2) - new_str = g_strdup (str2); - else - new_str = g_strdup (""); - - if (out) - fprintf (out, "joining \"%s\" and \"%s\" to \"%s\"\n", str1, str2, new_str); - - e_select_names_model_delete (source, index+1); - - new_dest = e_destination_new (); - e_destination_set_raw (new_dest, new_str); - e_select_names_model_replace (source, index, new_dest); - g_free (new_str); - - repos.model = model; - repos.pos = pos; - repos.len = text_model->seplen; - - e_text_model_reposition (model, e_repos_delete_shift, &repos); - - if (length > 1) - e_select_names_text_model_delete (model, pos, length-1); - } else { - /* If we are at the end of the last entry (which we must be if we end up in this block), - we can just do nothing. So this else-block is here just to give us a place to - put this comment. */ - } - - goto finished; - } - - if (pos + length > start_pos + text_len) { - /* Uh oh... our changes straddle two objects. */ - - if (pos == start_pos) { /* Delete the whole thing */ - EReposDeleteShift repos; - - e_select_names_model_delete (source, index); - - if (out) - fprintf (out, "deleted all of %d\n", index); - - repos.model = model; - repos.pos = pos; - repos.len = text_len + text_model->seplen; - - e_text_model_reposition (model, e_repos_delete_shift, &repos); - - length -= text_len + text_model->seplen; - if (length > 0) - e_select_names_text_model_delete (model, pos, length); - - } else { - /* Delete right up to the end, and then call e_select_names_text_model_delete again - to finish the job. */ - gint len1, len2; - - len1 = text_len - (pos - start_pos); - len2 = length - len1; - - if (out) - fprintf (out, "two-stage delete: %d, %d\n", len1, len2); - - - e_select_names_text_model_delete (model, pos, len1); - e_select_names_text_model_delete (model, pos, len2); - } - - goto finished; - } - - /* Our changes are confined to just one entry. */ - if (length > 0) { - const gchar *str; - gchar *new_str; - - offset = pos - start_pos; - - str = e_select_names_model_get_string (source, index); - - if (str) { - const char *p; - char *np; - int i; - EReposDeleteShift repos; - EDestination *dest; - - new_str = g_new0 (char, strlen (str) * 6 + 1); /* worse case it can't be any longer than this */ - - /* copy the region before the deletion */ - for (p = str, i = 0, np = new_str; i < offset; i++) { - gunichar ch; - - ch = g_utf8_get_char (p); - g_unichar_to_utf8 (ch, np); - - np = g_utf8_next_char (np); - p = g_utf8_next_char (p); - } - - /* skip the deleted segment */ - for (i = 0; i < length; i++) - p = g_utf8_next_char (p); - - /* copy the region after the deletion */ - for (; *p; p = g_utf8_next_char (p)) { - gunichar ch; - - ch = g_utf8_get_char (p); - g_unichar_to_utf8 (ch, np); - - np = g_utf8_next_char (np); - } - - dest = e_destination_new (); - e_destination_set_raw (dest, new_str); - e_select_names_model_replace (source, index, dest); - - if (out) - fprintf (out, "new_str: \"%s\"\n", new_str); - - g_free (new_str); - - repos.model = model; - repos.pos = pos; - repos.len = length; - - e_text_model_reposition (model, e_repos_delete_shift, &repos); - - } else { - EReposDeleteShift repos; - - e_select_names_model_delete (source, index); - - if (out) - fprintf (out, "deleted %d\n", index); - - - repos.model = model; - repos.pos = pos; - repos.len = text_model->seplen; - - e_text_model_reposition (model, e_repos_delete_shift, &repos); - } - } - - finished: - E_SELECT_NAMES_TEXT_MODEL (model)->last_magic_comma_pos = -1; - g_signal_handler_unblock (source, E_SELECT_NAMES_TEXT_MODEL (model)->source_resize_id); - dump_model (E_SELECT_NAMES_TEXT_MODEL (model)); -} - -static gint -e_select_names_text_model_obj_count (ETextModel *model) -{ - ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL (model)->source; - gint i, count; - - count = i = e_select_names_model_count (source); - while (i > 0) { - const EDestination *dest; - --i; - dest = e_select_names_model_get_destination (source, i); - if (e_destination_get_contact (dest) == NULL) - --count; - } - - return count; -} - -static gint -nth_obj_index (ESelectNamesModel *source, gint n) -{ - gint i, N; - - i = 0; - N = e_select_names_model_count (source); - - do { - const EDestination *dest = e_select_names_model_get_destination (source, i); - if (e_destination_get_contact (dest)) - --n; - ++i; - } while (n >= 0 && i < N); - - if (i <= N) - --i; - else - i = -1; - - return i; -} - -static const gchar * -e_select_names_text_model_get_nth_obj (ETextModel *model, gint n, gint *len) -{ - ESelectNamesTextModel *text_model = E_SELECT_NAMES_TEXT_MODEL (model); - ESelectNamesModel *source = text_model->source; - gint i, pos; - - i = nth_obj_index (source, n); - if (i < 0) - return NULL; - - e_select_names_model_name_pos (source, text_model->seplen, i, &pos, len); - if (pos < 0) - return NULL; - - if (text_model->text == NULL) - text_model->text = e_select_names_model_get_textification (source, text_model->sep); - return g_utf8_offset_to_pointer (text_model->text, pos); -} - -static void -e_select_names_text_model_activate_obj (ETextModel *model, gint n) -{ - ESelectNamesModel *source = E_SELECT_NAMES_TEXT_MODEL (model)->source; - EContact *contact; - EBook *book; - gint i; - - i = nth_obj_index (source, n); - g_return_if_fail (i >= 0); - - contact = e_select_names_model_get_contact (source, i); - g_return_if_fail (contact != NULL); - - /* XXX unfortunately we don't have an e_contact_get_book call - anymore, so we can't query for the addressbook that the - contact came from. however, since we're bringing up a - read-only contact editor, it really doesn't matter what we - show in the source option menu, does it? */ - book = e_book_new_system_addressbook (NULL); - g_return_if_fail (book != NULL); - - /* present read-only contact editor when someone double clicks from here */ - if (e_contact_get (contact, E_CONTACT_IS_LIST)) { - EContactListEditor *ce; - ce = eab_show_contact_list_editor (book, contact, FALSE, FALSE); - eab_editor_raise (EAB_EDITOR (ce)); - } - else { - EContactEditor *ce; - ce = eab_show_contact_editor (book, contact, FALSE, FALSE); - eab_editor_raise (EAB_EDITOR (ce)); - } - - g_object_unref (book); -} - - - diff --git a/addressbook/gui/component/select-names/e-select-names-text-model.h b/addressbook/gui/component/select-names/e-select-names-text-model.h deleted file mode 100644 index eec062aee6..0000000000 --- a/addressbook/gui/component/select-names/e-select-names-text-model.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: - * Chris Lahey <clahey@ximian.com> - * Jon Trowbridge <trow@ximian.com> - * - * Copyright (C) 2000, 2001 Ximian, Inc. - */ - -#ifndef __E_SELECT_NAMES_TEXT_MODEL_H__ -#define __E_SELECT_NAMES_TEXT_MODEL_H__ - -#include <time.h> -#include <stdio.h> -#include <gtk/gtkobject.h> -#include <gal/e-text/e-text-model.h> -#include "e-select-names-model.h" - -#define E_TYPE_SELECT_NAMES_TEXT_MODEL (e_select_names_text_model_get_type ()) -#define E_SELECT_NAMES_TEXT_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SELECT_NAMES_TEXT_MODEL, ESelectNamesTextModel)) -#define E_SELECT_NAMES_TEXT_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES_TEXT_MODEL, ESelectNamesTextModelClass)) -#define E_IS_SELECT_NAMES_TEXT_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SELECT_NAMES_TEXT_MODEL)) -#define E_IS_SELECT_NAMES_TEXT_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_SELECT_NAMES_TEXT_MODEL)) - -typedef struct _ESelectNamesTextModel ESelectNamesTextModel; -typedef struct _ESelectNamesTextModelClass ESelectNamesTextModelClass; - -struct _ESelectNamesTextModel { - ETextModel parent; - - ESelectNamesModel *source; - gint source_changed_id; - gint source_resize_id; - - gchar *text; - - gchar *sep; - gint seplen; - - gint last_magic_comma_pos; -}; - -struct _ESelectNamesTextModelClass { - ETextModelClass parent_class; -}; - -ETextModel *e_select_names_text_model_new (ESelectNamesModel *source); -void e_select_names_text_model_set_separator (ESelectNamesTextModel *model, const char *sep); - -/* Standard Gtk function */ -GType e_select_names_text_model_get_type (void); - -#endif /* ! __E_SELECT_NAMES_TEXT_MODEL_H__ */ diff --git a/addressbook/gui/component/select-names/e-select-names.c b/addressbook/gui/component/select-names/e-select-names.c deleted file mode 100644 index 6b13637299..0000000000 --- a/addressbook/gui/component/select-names/e-select-names.c +++ /dev/null @@ -1,861 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-select-names.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> -#include <string.h> -#include <glib.h> -#include <gtk/gtkalignment.h> -#include <gtk/gtkentry.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkstock.h> -#include <libgnome/gnome-i18n.h> - -#include <gal/e-table/e-table-simple.h> -#include <gal/e-table/e-table-without.h> - -#include <libebook/e-book.h> -#include <libebook/e-contact.h> -#include <addressbook/gui/widgets/e-addressbook-model.h> -#include <addressbook/gui/widgets/e-addressbook-table-adapter.h> -#include <addressbook/util/eab-book-util.h> -#include <addressbook/gui/component/addressbook-component.h> -#include <addressbook/gui/component/addressbook.h> -#include <addressbook/gui/widgets/eab-popup.h> - -#include "e-select-names-config.h" -#include "e-select-names.h" -#include "e-select-names-table-model.h" -#include <gal/widgets/e-categories-master-list-option-menu.h> -#include <gal/e-text/e-entry.h> -#include <e-util/e-categories-master-list-wombat.h> -#include "e-util/e-sexp.h" - -static void e_select_names_init (ESelectNames *names); -static void e_select_names_class_init (ESelectNamesClass *klass); -static void e_select_names_dispose (GObject *object); -static void update_query (GtkWidget *widget, ESelectNames *e_select_names); -static char *get_query_string (ESelectNames *e_select_names); - -static void sync_table_and_models (ESelectNamesModel *triggering_model, ESelectNames *esl); - -static GtkDialogClass *parent_class = NULL; -#define PARENT_TYPE gtk_dialog_get_type() - -/* The arguments we take */ -enum { - ARG_0, -}; - -typedef struct { - char *title; - ESelectNamesModel *source; - ESelectNamesTableModel *table_model; - ESelectNames *names; - GtkWidget *label; - GtkWidget *button; - GtkWidget *recipient_table; - gulong changed_id; -} ESelectNamesChild; - -GType -e_select_names_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (ESelectNamesClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_select_names_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (ESelectNames), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_select_names_init, - }; - - type = g_type_register_static (PARENT_TYPE, "ESelectNames", &info, 0); - } - - return type; -} - -static void -e_select_names_class_init (ESelectNamesClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->dispose = e_select_names_dispose; -} - -GtkWidget *e_addressbook_create_ebook_table(char *name, char *string1, char *string2, int num1, int num2); - -static void -search_result (EABModel *model, EBookViewStatus status, ESelectNames *esn) -{ - sync_table_and_models (NULL, esn); -} - -static void -set_book(EBook *book, EBookStatus status, ESelectNames *esn) -{ - char *query_str = get_query_string (esn); - g_object_set(esn->model, - "book", book, - "query", query_str, - NULL); - g_free (query_str); - g_object_unref(book); - g_object_unref(esn->model); - g_object_unref(esn); -} - -static ESource * -find_first_source (ESourceList *source_list) -{ - GSList *groups, *sources, *l, *m; - - groups = e_source_list_peek_groups (source_list); - for (l = groups; l; l = l->next) { - ESourceGroup *group = l->data; - - sources = e_source_group_peek_sources (group); - for (m = sources; m; m = m->next) { - ESource *source = m->data; - - return source; - } - } - - return NULL; -} - -static void -addressbook_model_set_source (ESelectNames *e_select_names, EABModel *model, ESource *source) -{ - EBook *book; - - book = e_book_new(source, NULL); - - g_object_ref(e_select_names); - g_object_ref(model); - - addressbook_load (book, (EBookCallback) set_book, e_select_names); -} - -static void * -contact_key (const EContact *contact) -{ - EBook *book = NULL; - const gchar *book_uri; - - if (contact == NULL) - return NULL; - - g_assert (E_IS_CONTACT (contact)); - -#if notyet - /* XXX we need a way to reproduce this here somehow.. or at - least make sure we never collide between two contacts in - different books. */ - book = e_contact_get_book (contact); -#endif - book_uri = book ? e_book_get_uri (book) : "NoBook"; - return g_strdup_printf ("%s|%s", book_uri ? book_uri : "NoURI", (char*)e_contact_get_const ((EContact*)contact, E_CONTACT_UID)); -} - -static void -sync_one_model (gpointer k, gpointer val, gpointer closure) -{ - ETableWithout *etw = E_TABLE_WITHOUT (closure); - ESelectNamesChild *child = val; - ESelectNamesModel *model = child->source; - gint i, count; - EContact *contact; - void *key; - - count = e_select_names_model_count (model); - for (i = 0; i < count; ++i) { - contact = e_select_names_model_get_contact (model, i); - if (contact) { - key = contact_key (contact); - e_table_without_hide (etw, key); - g_free (key); - } - } -} - -static void -sync_table_and_models (ESelectNamesModel *triggering_model, ESelectNames *esl) -{ - e_table_without_show_all (E_TABLE_WITHOUT (esl->without)); - g_hash_table_foreach (esl->children, sync_one_model, esl->without); -} - -static void -real_add_address_cb (int model_row, gpointer closure) -{ - ESelectNamesChild *child = closure; - ESelectNames *names = child->names; - const EContact *contact; - EDestination *dest = e_destination_new (); - gint mapped_row; - - mapped_row = e_table_subset_view_to_model_row (E_TABLE_SUBSET (names->without), model_row); - - contact = eab_model_contact_at (EAB_MODEL(names->model), mapped_row); - - if (contact != NULL) { - e_destination_set_contact (dest, (EContact*)contact, 0); - - e_select_names_model_append (child->source, dest); - e_select_names_model_clean (child->source, FALSE); - } -} - -static void -real_add_address(ESelectNames *names, ESelectNamesChild *child) -{ - e_select_names_model_freeze (child->source); - e_table_selected_row_foreach(e_table_scrolled_get_table(names->table), - real_add_address_cb, child); - e_select_names_model_thaw (child->source); -} - -static void -add_address(ETable *table, int row, int col, GdkEvent *event, ESelectNames *names) -{ - ESelectNamesChild *child; - - child = g_hash_table_lookup(names->children, names->def); - if (child) { - real_add_address(names, child); - } -} - -static void -sensitize_button (gpointer key, gpointer data, gpointer user_data) -{ - gboolean *sensitive = user_data; - ESelectNamesChild *child = data; - - gtk_widget_set_sensitive (child->button, *sensitive); -} - -static void -selection_change (ETable *table, ESelectNames *names) -{ - gboolean sensitive; - - sensitive = e_table_selected_count (table) > 0; - - g_hash_table_foreach (names->children, sensitize_button, &sensitive); -} - -static void * -esn_get_key_fn (ETableModel *source, int row, void *closure) -{ - EABModel *model = EAB_MODEL (closure); - const EContact *contact = eab_model_contact_at (model, row); - void *key = contact_key (contact); - return key; -} - -static void * -esn_dup_key_fn (const void *key, void *closure) -{ - void *dup = (void *) g_strdup ((const gchar *) key); - return dup; -} - -static void -esn_free_gotten_key_fn (void *key, void *closure) -{ - g_free (key); -} - -static void -esn_free_duped_key_fn (void *key, void *closure) -{ - g_free (key); -} - -GtkWidget * -e_addressbook_create_ebook_table(char *name, char *string1, char *string2, int num1, int num2) -{ - ETableModel *adapter; - ETableModel *without; - EABModel *model; - GtkWidget *table; - - model = eab_model_new (); - adapter = E_TABLE_MODEL (eab_table_adapter_new (model)); - - g_object_set(model, - "editable", FALSE, - NULL); - - without = e_table_without_new (adapter, - g_str_hash, - g_str_equal, - esn_get_key_fn, - esn_dup_key_fn, - esn_free_gotten_key_fn, - esn_free_duped_key_fn, - model); - - table = e_table_scrolled_new_from_spec_file (without, - NULL, - EVOLUTION_ETSPECDIR "/e-select-names.etspec", - NULL); - - g_object_set_data(G_OBJECT(table), "adapter", adapter); - g_object_set_data(G_OBJECT(table), "without", without); - g_object_set_data(G_OBJECT(table), "model", model); - - return table; -} - -static void -source_selected (ESourceOptionMenu *menu, ESource *source, ESelectNames *e_select_names) -{ - addressbook_model_set_source (e_select_names, e_select_names->model, source); - e_select_names_config_set_last_completion_book (e_source_peek_uid (source)); -} - -static char * -get_query_string (ESelectNames *e_select_names) -{ - char *category = ""; - const char *search = ""; - EBookQuery *query; - EBookQuery *q_array[4]; - char *query_str; - int i; - - if (e_select_names->categories) { - category = e_categories_master_list_option_menu_get_category (E_CATEGORIES_MASTER_LIST_OPTION_MENU (e_select_names->categories)); - } - if (e_select_names->select_entry) { - search = gtk_entry_get_text (GTK_ENTRY (e_select_names->select_entry)); - } - - i = 0; - q_array[i++] = e_book_query_field_test (E_CONTACT_EMAIL, E_BOOK_QUERY_CONTAINS, ""); - if (category && *category) - q_array[i++] = e_book_query_field_test (E_CONTACT_CATEGORY_LIST, E_BOOK_QUERY_IS, category); - if (search && *search) - q_array[i++] = e_book_query_orv (e_book_query_field_test (E_CONTACT_EMAIL, E_BOOK_QUERY_BEGINS_WITH, search), - e_book_query_field_test (E_CONTACT_FULL_NAME, E_BOOK_QUERY_BEGINS_WITH, search), - e_book_query_field_test (E_CONTACT_NICKNAME, E_BOOK_QUERY_BEGINS_WITH, search), - e_book_query_field_test (E_CONTACT_FILE_AS, E_BOOK_QUERY_BEGINS_WITH, search), - NULL); - if (i > 1) { - query = e_book_query_and (i, q_array, TRUE); - } - else { - query = q_array[0]; - } - query_str = e_book_query_to_string (query); - e_book_query_unref (query); - return query_str; -} - - -static void -update_query (GtkWidget *widget, ESelectNames *e_select_names) -{ - char *query_str = get_query_string (e_select_names); - printf ("query_str = %s\n", query_str); - g_object_set (e_select_names->model, - "query", query_str, - NULL); - g_free (query_str); -} - -static void -status_message (EABModel *model, const gchar *message, ESelectNames *e_select_names) -{ - if (message == NULL) - gtk_label_set_text (GTK_LABEL (e_select_names->status_message), ""); - else - gtk_label_set_text (GTK_LABEL (e_select_names->status_message), message); -} - -static void -categories_changed (GtkWidget *widget, ESelectNames *e_select_names) -{ - update_query (widget, e_select_names); -} - -static void -select_entry_changed (GtkWidget *widget, ESelectNames *e_select_names) -{ - if (e_select_names->select_entry) { - const char *select_string = gtk_entry_get_text (GTK_ENTRY (e_select_names->select_entry)); - char *select_strcoll_string = g_utf8_collate_key (select_string, -1); - int count; - ETable *table; - int i; - - table = e_table_scrolled_get_table (e_select_names->table); - - count = e_table_model_row_count (e_select_names->without); - - for (i = 0; i < count; i++) { - int model_row = e_table_view_to_model_row (table, i); - char *row_strcoll_string = - g_utf8_collate_key (e_table_model_value_at (e_select_names->without, - E_CONTACT_FULL_NAME, - model_row), - -1); - if (strcmp (select_strcoll_string, row_strcoll_string) <= 0) { - g_free (row_strcoll_string); - break; - } - g_free (row_strcoll_string); - } - g_free (select_strcoll_string); - if (i == count) - i --; - - if (count > 0) { - i = e_table_view_to_model_row (table, i); - e_table_set_cursor_row (table, i); - } - } -} - -GtkWidget *e_select_names_create_categories (gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2); - -GtkWidget * -e_select_names_create_categories (gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2) -{ - ECategoriesMasterList *ecml; - GtkWidget *option_menu; - - ecml = e_categories_master_list_wombat_new (); - option_menu = e_categories_master_list_option_menu_new (ecml); - g_object_unref (ecml); - - return option_menu; -} - -static void -clear_widget (gpointer data, GObject *where_object_was) -{ - GtkWidget **widget_ref = data; - *widget_ref = NULL; -} - -static void -e_select_names_init (ESelectNames *e_select_names) -{ - GladeXML *gui; - GtkWidget *widget, *button, *table, *esom; - ESource *source = NULL; - char *uid; - - gui = glade_xml_new (EVOLUTION_GLADEDIR "/select-names.glade", NULL, NULL); - widget = glade_xml_get_widget (gui, "select-names-box"); - if (!widget) { - g_object_unref (gui); - return; - } - gtk_widget_ref (widget); - gtk_container_remove (GTK_CONTAINER (widget->parent), widget); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (e_select_names)->vbox), widget, TRUE, TRUE, 0); - gtk_widget_unref (widget); - - gtk_dialog_add_buttons (GTK_DIALOG (e_select_names), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); - - gtk_window_set_modal (GTK_WINDOW (e_select_names), FALSE); - gtk_window_set_default_size (GTK_WINDOW (e_select_names), 472, 512); - gtk_window_set_title (GTK_WINDOW (e_select_names), _("Select Contacts from Address Book")); - gtk_window_set_resizable (GTK_WINDOW (e_select_names), TRUE); - gtk_dialog_set_has_separator (GTK_DIALOG (e_select_names), FALSE); - gtk_container_set_border_width (GTK_CONTAINER (e_select_names), 4); - - /* FIXME What to do on error/NULL ? */ - e_select_names->source_list = e_source_list_new_for_gconf_default ("/apps/evolution/addressbook/sources"); - - e_select_names->gui = gui; - - /* Add the source menu */ - esom = e_source_option_menu_new (e_select_names->source_list); - g_signal_connect (esom, "source_selected", G_CALLBACK (source_selected), e_select_names); - gtk_widget_show (esom); - - table = glade_xml_get_widget (gui, "show_contacts_table"); - gtk_table_attach (GTK_TABLE (table), esom, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 0, 0); - - /* Set up the rest of the widgets */ - e_select_names->children = g_hash_table_new(g_str_hash, g_str_equal); - e_select_names->child_count = 0; - e_select_names->def = NULL; - - gtk_dialog_set_default_response (GTK_DIALOG (e_select_names), - GTK_RESPONSE_OK); - - e_select_names->table = E_TABLE_SCROLLED(glade_xml_get_widget(gui, "table-source")); - e_select_names->model = g_object_get_data(G_OBJECT(e_select_names->table), "model"); - e_select_names->adapter = g_object_get_data(G_OBJECT(e_select_names->table), "adapter"); - e_select_names->without = g_object_get_data(G_OBJECT(e_select_names->table), "without"); - gtk_widget_show (GTK_WIDGET (e_select_names->table)); - - e_select_names->status_message = glade_xml_get_widget (gui, "status-message"); - if (e_select_names->status_message && !GTK_IS_LABEL (e_select_names->status_message)) - e_select_names->status_message = NULL; - if (e_select_names->status_message) { - e_select_names->status_id = g_signal_connect (e_select_names->model, "status_message", - G_CALLBACK (status_message), e_select_names); - g_object_weak_ref (G_OBJECT (e_select_names->status_message), clear_widget, &e_select_names->status_message); - } - - e_select_names->search_id = g_signal_connect (e_select_names->model, - "search_result", G_CALLBACK (search_result), - e_select_names); - - e_select_names->categories = glade_xml_get_widget (gui, "custom-categories"); - if (e_select_names->categories && !E_IS_CATEGORIES_MASTER_LIST_OPTION_MENU (e_select_names->categories)) - e_select_names->categories = NULL; - if (e_select_names->categories) { - g_signal_connect(e_select_names->categories, "changed", - G_CALLBACK(categories_changed), e_select_names); - g_object_weak_ref (G_OBJECT (e_select_names->categories), clear_widget, &e_select_names->categories); - } - gtk_widget_show (e_select_names->categories); - - e_select_names->select_entry = glade_xml_get_widget (gui, "entry-select"); - if (e_select_names->select_entry && !GTK_IS_ENTRY (e_select_names->select_entry)) - e_select_names->select_entry = NULL; - if (e_select_names->select_entry) { - g_signal_connect(e_select_names->select_entry, "changed", - G_CALLBACK(select_entry_changed), e_select_names); - g_signal_connect(e_select_names->select_entry, "activate", - G_CALLBACK(update_query), e_select_names); - g_object_weak_ref (G_OBJECT (e_select_names->select_entry), clear_widget, &e_select_names->select_entry); - } - - button = glade_xml_get_widget (gui, "button-find"); - if (button && GTK_IS_BUTTON (button)) - g_signal_connect(button, "clicked", - G_CALLBACK(update_query), e_select_names); - - g_signal_connect (e_table_scrolled_get_table (e_select_names->table), "double_click", - G_CALLBACK (add_address), e_select_names); - g_signal_connect (e_table_scrolled_get_table (e_select_names->table), "selection_change", - G_CALLBACK (selection_change), e_select_names); - selection_change (e_table_scrolled_get_table (e_select_names->table), e_select_names); - - /* Select a source for to display initially */ - uid = e_select_names_config_get_last_completion_book (); - if (uid) { - source = e_source_list_peek_source_by_uid (e_select_names->source_list, uid); - g_free (uid); - } - - if (!source) - source = find_first_source (e_select_names->source_list); - - /* FIXME What if we still can't find a source? */ - e_source_option_menu_select (E_SOURCE_OPTION_MENU (esom), source); - -} - -static void e_select_names_child_free(char *key, ESelectNamesChild *child, ESelectNames *e_select_names) -{ - g_signal_handler_disconnect(child->source, child->changed_id); - - g_free(child->title); - g_object_unref(child->table_model); - g_object_unref(child->source); - g_free(key); - g_free(child); -} - -static void -e_select_names_dispose (GObject *object) -{ - ESelectNames *e_select_names = E_SELECT_NAMES(object); - - if (e_select_names->source_list) { - g_object_unref (e_select_names->source_list); - e_select_names->source_list = NULL; - } - - if (e_select_names->status_id) { - g_signal_handler_disconnect(e_select_names->model, e_select_names->status_id); - e_select_names->status_id = 0; - } - - if (e_select_names->search_id) { - g_signal_handler_disconnect(e_select_names->model, e_select_names->search_id); - e_select_names->search_id = 0; - } - - if (e_select_names->gui) { - g_object_unref(e_select_names->gui); - e_select_names->gui = NULL; - } - - if (e_select_names->children) { - g_hash_table_foreach(e_select_names->children, (GHFunc) e_select_names_child_free, e_select_names); - g_hash_table_destroy(e_select_names->children); - e_select_names->children = NULL; - } - - if (e_select_names->without) { - g_object_unref(e_select_names->without); - e_select_names->without = NULL; - } - if (e_select_names->adapter) { - g_object_unref(e_select_names->adapter); - e_select_names->adapter = NULL; - } - if (e_select_names->model) { - g_object_unref(e_select_names->model); - e_select_names->model = NULL; - } - - if (e_select_names->def) { - g_free(e_select_names->def); - e_select_names->def = NULL; - } - - if (G_OBJECT_CLASS(parent_class)->dispose) - G_OBJECT_CLASS(parent_class)->dispose(object); -} - -GtkWidget* -e_select_names_new (void) -{ - ESelectNames *e_select_names; - - e_select_names = g_object_new (E_TYPE_SELECT_NAMES, NULL); - - return GTK_WIDGET (e_select_names); -} - -static void -button_clicked(GtkWidget *button, ESelectNamesChild *child) -{ - real_add_address(child->names, child); -} - -static void -remove_address(ETable *table, int row, int col, GdkEvent *event, ESelectNamesChild *child) -{ - e_select_names_model_delete (child->source, row); -} - -static void -remove_cb (EPopup *ep, EPopupItem *pitem, void *data) -{ - EABPopupTargetSelectNames *t = (EABPopupTargetSelectNames *)ep->target; - - e_select_names_model_delete (t->model, t->row); -} - -static EPopupItem esn_select_popups[] = { - { E_POPUP_ITEM, "20.delete", N_("Remove"), remove_cb, NULL, NULL, 0, 0 }, -}; - -static void -esn_select_popup_free (EPopup *ep, GSList *list, void *data) -{ - g_slist_free (list); -} - -static void -section_right_click_cb (ETable *et, int row, int col, GdkEvent *ev, ESelectNamesChild *child) -{ - EABPopup *ep; - EABPopupTargetSelectNames *t; - GSList *menus = NULL; - int i; - GtkMenu *menu; - - ep = eab_popup_new("com.novell.evolution.addressbook.selectNames.popup"); - t = eab_popup_target_new_select_names(ep, child->source, row); - t->target.widget = (GtkWidget *)et; - - for (i=0;i<sizeof(esn_select_popups)/sizeof(esn_select_popups[0]);i++) - menus = g_slist_prepend(menus, &esn_select_popups[i]); - - e_popup_add_items((EPopup *)ep, menus, esn_select_popup_free, NULL); - - menu = e_popup_create_menu_once((EPopup *)ep, (EPopupTarget *)t, 0); - gtk_menu_popup(menu, NULL, NULL, NULL, NULL, ev->button.button, ev->button.time); -} - -void -e_select_names_add_section (ESelectNames *e_select_names, - const char *name, const char *id, - ESelectNamesModel *source) -{ - ESelectNamesChild *child; - GtkWidget *button; - GtkWidget *label; - GtkWidget *alignment; - GtkTable *table; - char *label_text; - ETable *etable; - ETableExtras *extras; - ECell *string_cell; - - GtkWidget *sw; - - if (g_hash_table_lookup(e_select_names->children, id)) { - return; - } - - table = GTK_TABLE(glade_xml_get_widget (e_select_names->gui, "table-recipients")); - - child = g_new(ESelectNamesChild, 1); - - child->names = e_select_names; - child->title = g_strdup (_(name)); - - child->table_model = (ESelectNamesTableModel*)e_select_names_table_model_new (source); - - child->source = source; - g_object_ref(child->source); - - alignment = gtk_alignment_new(0, 0, 1, 0); - - label_text = g_strconcat (child->title, " ->", NULL); - - label = gtk_label_new (""); - - gtk_label_set_markup (GTK_LABEL(label), label_text); - - g_free (label_text); - - button = gtk_button_new (); - gtk_container_add (GTK_CONTAINER (button), label); - child->label = label; - child->button = button; - - gtk_container_add(GTK_CONTAINER(alignment), button); - gtk_widget_show_all(alignment); - g_signal_connect(button, "clicked", - G_CALLBACK(button_clicked), child); - gtk_table_attach(table, alignment, - 0, 1, - e_select_names->child_count, - e_select_names->child_count + 1, - GTK_FILL, GTK_FILL, - 0, 0); - - etable = e_table_scrolled_get_table (e_select_names->table); - gtk_widget_set_sensitive (button, e_table_selected_count (etable) > 0); - - extras = e_table_extras_new (); - string_cell = e_table_extras_get_cell (extras, "string"); - - g_object_set (string_cell, - "underline_column", 2, - NULL); - - sw = e_table_scrolled_new_from_spec_file (E_TABLE_MODEL (child->table_model), - extras, - EVOLUTION_ETSPECDIR "/e-select-names-section.etspec", - NULL); - g_object_unref (extras); - - child->recipient_table = GTK_WIDGET (e_table_scrolled_get_table (E_TABLE_SCROLLED (sw))); - - g_signal_connect (child->recipient_table, - "right_click", - G_CALLBACK (section_right_click_cb), - child); - - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - - g_signal_connect(child->recipient_table, "double_click", - G_CALLBACK(remove_address), child); - - child->changed_id = g_signal_connect (child->source, - "changed", - G_CALLBACK (sync_table_and_models), - e_select_names); - - gtk_widget_show_all (sw); - - gtk_table_attach(table, sw, - 1, 2, - e_select_names->child_count, - e_select_names->child_count + 1, - GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, - 0, 0); - - g_hash_table_insert(e_select_names->children, g_strdup(id), child); - - sync_table_and_models (child->source, e_select_names); - - e_select_names->child_count++; -} - -void -e_select_names_set_default (ESelectNames *e_select_names, - const char *id) -{ - ESelectNamesChild *child; - - if (e_select_names->def) { - child = g_hash_table_lookup(e_select_names->children, e_select_names->def); - if (child) { - GtkWidget *label = child->label; - - /* set the previous default to non-bold */ - gtk_label_set_markup (GTK_LABEL (label), child->title); - } - } - - g_free(e_select_names->def); - e_select_names->def = g_strdup(id); - - if (e_select_names->def) { - child = g_hash_table_lookup(e_select_names->children, e_select_names->def); - if (child) { - GtkWidget *label = child->label; - char *markup = g_strconcat ("<b>", child->title, "</b>", NULL); - - /* set the new default to bold */ - gtk_label_set_markup (GTK_LABEL (label), markup); - g_free (markup); - } - } -} diff --git a/addressbook/gui/component/select-names/e-select-names.etspec b/addressbook/gui/component/select-names/e-select-names.etspec deleted file mode 100644 index 45899e1f23..0000000000 --- a/addressbook/gui/component/select-names/e-select-names.etspec +++ /dev/null @@ -1,7 +0,0 @@ -<ETableSpecification no-headers="true" cursor-mode="line"> - <ETableColumn model_col= "86" _title="Name" expansion="1.0" minimum_width="20" resizable="true" cell="string" compare="collate" search="string"/> - <ETableState> - <column source="0"/> - <grouping> <leaf column="0" ascending="true"/> </grouping> - </ETableState> -</ETableSpecification> diff --git a/addressbook/gui/component/select-names/e-select-names.h b/addressbook/gui/component/select-names/e-select-names.h deleted file mode 100644 index 664735f74a..0000000000 --- a/addressbook/gui/component/select-names/e-select-names.h +++ /dev/null @@ -1,101 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-select-names.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_SELECT_NAMES_H__ -#define __E_SELECT_NAMES_H__ - -#include <glib.h> -#include <gtk/gtkwidget.h> -#include <gtk/gtkdialog.h> -#include <glade/glade.h> -#include <gal/e-table/e-table.h> -#include <gal/e-table/e-table-scrolled.h> -#include <libedataserver/e-source-list.h> -#include <libedataserverui/e-source-option-menu.h> - -#include "e-addressbook-model.h" - -#include "e-select-names-model.h" - -G_BEGIN_DECLS - -/* ESelectNames - A dialog displaying information about a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - */ - -#define E_TYPE_SELECT_NAMES (e_select_names_get_type ()) -#define E_SELECT_NAMES(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_SELECT_NAMES, ESelectNames)) -#define E_SELECT_NAMES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_SELECT_NAMES, ESelectNamesClass)) -#define E_IS_SELECT_NAMES(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_SELECT_NAMES)) -#define E_IS_SELECT_NAMES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_SELECT_NAMES)) - -typedef struct _ESelectNames ESelectNames; -typedef struct _ESelectNamesClass ESelectNamesClass; -typedef struct _ESelectNamesFolder ESelectNamesFolder; - -struct _ESelectNames -{ - GtkDialog parent; - - ESourceList *source_list; - - /* item specific fields */ - GladeXML *gui; - - GHashTable *children; /* Of type char * to ESelectNamesChild */ - int child_count; - ETableScrolled *table; - ETableModel *adapter; - ETableModel *without; - EABModel *model; - GtkWidget *categories; - GtkWidget *select_entry; - GtkWidget *status_message; - char *def; - ESelectNamesFolder *current_folder; - - /* signal handlers */ - gulong status_id; - gulong search_id; -}; - -struct _ESelectNamesClass -{ - GtkDialogClass parent_class; -}; - - -GType e_select_names_get_type (void); - -GtkWidget *e_select_names_new (void); - -void e_select_names_add_section (ESelectNames *e_select_names, - const char *name, - const char *id, - ESelectNamesModel *source); -void e_select_names_set_default (ESelectNames *e_select_names, - const char *id); - -G_END_DECLS - -#endif /* __E_SELECT_NAMES_H__ */ diff --git a/addressbook/gui/component/select-names/recipient.glade b/addressbook/gui/component/select-names/recipient.glade deleted file mode 100644 index edcf6bbab0..0000000000 --- a/addressbook/gui/component/select-names/recipient.glade +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd" > - -<glade-interface> - <widget class="GtkWindow" id="window1"> - <property name="visible">no</property> - <property name="title" translatable="yes">window1</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="modal">no</property> - <property name="allow_shrink">no</property> - <property name="allow_grow">yes</property> - <property name="window-position">GTK_WIN_POS_NONE</property> - - <child> - <widget class="GtkHBox" id="hbox-top"> - <property name="homogeneous">no</property> - <property name="spacing">4</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkAlignment" id="alignment1"> - <property name="xalign">1.08033e-07</property> - <property name="yalign">0</property> - <property name="xscale">1</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkButton" id="text-button"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">-></property> - <property name="visible">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - </child> - </widget> -</glade-interface> diff --git a/addressbook/gui/component/select-names/select-names.glade b/addressbook/gui/component/select-names/select-names.glade deleted file mode 100644 index 205400de08..0000000000 --- a/addressbook/gui/component/select-names/select-names.glade +++ /dev/null @@ -1,443 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> -<requires lib="gnome"/> - -<widget class="GtkDialog" id="dialog-top"> - <property name="border_width">3</property> - <property name="title" translatable="yes">Select Contacts from Address Book</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">True</property> - <property name="default_width">417</property> - <property name="default_height">332</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="decorated">True</property> - <property name="skip_taskbar_hint">False</property> - <property name="skip_pager_hint">False</property> - <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> - <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> - <property name="has_separator">False</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox1"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - - <child> - <widget class="GtkButton" id="button4"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="has_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <property name="response_id">-6</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="button5"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-ok</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <property name="response_id">-5</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="select-names-box"> - <property name="border_width">4</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkLabel" id="label33"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Show Contacts</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox2"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkLabel" id="label35"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="show_contacts_table"> - <property name="visible">True</property> - <property name="n_rows">3</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">12</property> - - <child> - <widget class="GtkLabel" id="label30"> - <property name="visible">True</property> - <property name="label" translatable="yes">Address _Book:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label31"> - <property name="visible">True</property> - <property name="label" translatable="yes">C_ategory:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="Custom" id="custom-categories"> - <property name="visible">True</property> - <property name="creation_function">e_select_names_create_categories</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Tue, 19 Feb 2002 23:06:24 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">expand|shrink|fill</property> - <property name="y_options">shrink|fill</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox1"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkEntry" id="entry-select"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkButton" id="button-find"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_Find</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label39"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Search:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-select</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label37"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label36"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Contacts</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox3"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkLabel" id="label38"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox8"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="Custom" id="table-source"> - <property name="visible">True</property> - <property name="creation_function">e_addressbook_create_ebook_table</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Sat, 10 Jun 2000 22:02:57 GMT</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <placeholder/> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="table-recipients"> - <property name="visible">True</property> - <property name="n_rows">3</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">18</property> - <property name="column_spacing">12</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="status-message"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">3</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -</glade-interface> diff --git a/addressbook/gui/contact-editor/.cvsignore b/addressbook/gui/contact-editor/.cvsignore deleted file mode 100644 index ddbd38bb6e..0000000000 --- a/addressbook/gui/contact-editor/.cvsignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.libs -.pure -Makefile -Makefile.in -*.lo -*.la -contact-editor-test -contact-editor.gladep -e-contact-editor-marshal.c -e-contact-editor-marshal.h diff --git a/addressbook/gui/contact-editor/Makefile.am b/addressbook/gui/contact-editor/Makefile.am deleted file mode 100644 index 376aa65205..0000000000 --- a/addressbook/gui/contact-editor/Makefile.am +++ /dev/null @@ -1,50 +0,0 @@ -INCLUDES = \ - -I$(top_srcdir) \ - -I$(top_srcdir)/addressbook/ \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_builddir)/addressbook/backend \ - -I$(top_srcdir)/addressbook/gui/merging \ - -I$(top_srcdir)/widgets/e-table \ - -I$(top_builddir)/shell \ - -I$(top_srcdir)/camel \ - -I$(top_builddir)/camel \ - -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ - -DEVOLUTION_DATADIR=\""$(datadir)"\" \ - -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \ - -DEVOLUTION_UIDIR=\""$(evolutionuidir)\"" \ - -DPREFIX=\""$(prefix)"\" \ - -DG_LOG_DOMAIN=\"contact-editor\" \ - $(EVOLUTION_ADDRESSBOOK_CFLAGS) - -noinst_LTLIBRARIES = \ - libecontacteditor.la - -libecontacteditor_la_SOURCES = \ - $(MARSHAL_GENERATED) \ - eab-editor.c \ - eab-editor.h \ - e-contact-editor-im.c \ - e-contact-editor-im.h \ - e-contact-editor-address.c \ - e-contact-editor-address.h \ - e-contact-editor-fullname.c \ - e-contact-editor-fullname.h \ - e-contact-editor.c \ - e-contact-editor.h \ - e-contact-quick-add.c \ - e-contact-quick-add.h - -MARSHAL_GENERATED = e-contact-editor-marshal.c e-contact-editor-marshal.h -@EVO_MARSHAL_RULE@ - -glade_DATA = \ - im.glade \ - contact-editor.glade \ - fulladdr.glade \ - fullname.glade - -BUILT_SOURCES = $(MARSHAL_GENERATED) -CLEANFILES = $(BUILT_SOURCES) - -EXTRA_DIST= $(glade_DATA) \ - e-contact-editor-marshal.list diff --git a/addressbook/gui/contact-editor/contact-editor.glade b/addressbook/gui/contact-editor/contact-editor.glade deleted file mode 100644 index 2f1cd4e10f..0000000000 --- a/addressbook/gui/contact-editor/contact-editor.glade +++ /dev/null @@ -1,3563 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> - -<widget class="GtkDialog" id="contact editor"> - <property name="title" translatable="yes">Contact Editor</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="has_separator">False</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox1"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - - <child> - <widget class="GtkButton" id="button-help"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-help</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-11</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="button-cancel"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-6</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="button-ok"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="has_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-ok</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-5</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkNotebook" id="notebook11"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="show_tabs">True</property> - <property name="show_border">True</property> - <property name="tab_pos">GTK_POS_TOP</property> - <property name="scrollable">False</property> - <property name="enable_popup">False</property> - - <child> - <widget class="GtkVBox" id="vbox33"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">1</property> - - <child> - <widget class="GtkHBox" id="hbox55"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkButton" id="button-image"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - - <child> - <widget class="Custom" id="image-chooser"> - <property name="visible">True</property> - <property name="creation_function">eab_create_image_chooser_widget</property> - <property name="string1">stock_person</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Tue, 13 Apr 2004 20:51:33 GMT</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="table83"> - <property name="visible">True</property> - <property name="n_rows">3</property> - <property name="n_columns">4</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label-nickname"> - <property name="visible">True</property> - <property name="label" translatable="yes">Ni_ckname:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-nickname</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-fullname"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="accellabel-fileas"> - <property name="visible">True</property> - <property name="label" translatable="yes">_File under:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-file-as</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="where-label"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Where:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkButton" id="button-categories"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_Categories</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-categories"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">4</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-nickname"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkCombo" id="combo-file-as"> - <property name="visible">True</property> - <property name="value_in_list">False</property> - <property name="allow_empty">True</property> - <property name="case_sensitive">False</property> - <property name="enable_arrow_keys">True</property> - <property name="enable_arrows_always">False</property> - - <child internal-child="entry"> - <widget class="GtkEntry" id="entry-file-as"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - </child> - - <child internal-child="list"> - <widget class="GtkList" id="list14"> - <property name="visible">True</property> - <property name="selection_mode">GTK_SELECTION_BROWSE</property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="Custom" id="source-option-menu-source"> - <property name="visible">True</property> - <property name="creation_function">e_contact_editor_create_source_option_menu</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Tue, 13 Apr 2004 20:47:50 GMT</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkButton" id="button-fullname"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Full _Name...</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkHSeparator" id="hseparator10"> - <property name="visible">True</property> - </widget> - <packing> - <property name="padding">6</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox34"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">10</property> - - <child> - <widget class="GtkFrame" id="frame65"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkTable" id="table85"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">3</property> - <property name="n_columns">4</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-email-1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu169"> - - <child> - <widget class="GtkMenuItem" id="menuitem380"> - <property name="visible">True</property> - <property name="label" translatable="yes">Work</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem381"> - <property name="visible">True</property> - <property name="label" translatable="yes">Personal</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-email-2"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu170"> - - <child> - <widget class="GtkMenuItem" id="menuitem382"> - <property name="visible">True</property> - <property name="label" translatable="yes">Work</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem383"> - <property name="visible">True</property> - <property name="label" translatable="yes">Personal</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-email-2"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-email-3"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu171"> - - <child> - <widget class="GtkMenuItem" id="menuitem384"> - <property name="visible">True</property> - <property name="label" translatable="yes">Work</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem385"> - <property name="visible">True</property> - <property name="label" translatable="yes">Personal</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-email-4"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu172"> - - <child> - <widget class="GtkMenuItem" id="menuitem386"> - <property name="visible">True</property> - <property name="label" translatable="yes">Work</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem387"> - <property name="visible">True</property> - <property name="label" translatable="yes">Personal</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-email-1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-email-3"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-email-4"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkCheckButton" id="checkbutton-htmlmail"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Wants to receive HTML mail</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="active">False</property> - <property name="inconsistent">False</property> - <property name="draw_indicator">True</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">4</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label400"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Email</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox38"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="GtkFrame" id="frame64"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkVBox" id="vbox37"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkTable" id="table84"> - <property name="visible">True</property> - <property name="n_rows">2</property> - <property name="n_columns">4</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkEntry" id="entry-phone-1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-phone-2"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-phone-4"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-phone-3"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-phone-1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu179"> - - <child> - <widget class="GtkMenuItem" id="menuitem412"> - <property name="visible">True</property> - <property name="label" translatable="yes">Work</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem413"> - <property name="visible">True</property> - <property name="label" translatable="yes">Personal</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-phone-2"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu180"> - - <child> - <widget class="GtkMenuItem" id="menuitem414"> - <property name="visible">True</property> - <property name="label" translatable="yes">Work</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem415"> - <property name="visible">True</property> - <property name="label" translatable="yes">Personal</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-phone-3"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu181"> - - <child> - <widget class="GtkMenuItem" id="menuitem416"> - <property name="visible">True</property> - <property name="label" translatable="yes">Work</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem417"> - <property name="visible">True</property> - <property name="label" translatable="yes">Personal</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-phone-4"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu182"> - - <child> - <widget class="GtkMenuItem" id="menuitem418"> - <property name="visible">True</property> - <property name="label" translatable="yes">Work</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem419"> - <property name="visible">True</property> - <property name="label" translatable="yes">Personal</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="table-phone-extended"> - <property name="n_rows">2</property> - <property name="n_columns">4</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-phone-5"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu187"> - - <child> - <widget class="GtkMenuItem" id="menuitem430"> - <property name="visible">True</property> - <property name="label" translatable="yes">Work</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem431"> - <property name="visible">True</property> - <property name="label" translatable="yes">Personal</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-phone-6"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu188"> - - <child> - <widget class="GtkMenuItem" id="menuitem432"> - <property name="visible">True</property> - <property name="label" translatable="yes">Work</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem433"> - <property name="visible">True</property> - <property name="label" translatable="yes">Personal</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-phone-5"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-phone-6"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-phone-7"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu189"> - - <child> - <widget class="GtkMenuItem" id="menuitem434"> - <property name="visible">True</property> - <property name="label" translatable="yes">Work</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem435"> - <property name="visible">True</property> - <property name="label" translatable="yes">Personal</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-phone-8"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu190"> - - <child> - <widget class="GtkMenuItem" id="menuitem436"> - <property name="visible">True</property> - <property name="label" translatable="yes">Work</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_work2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem437"> - <property name="visible">True</property> - <property name="label" translatable="yes">Personal</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_personal2_activate" last_modification_time="Fri, 12 Mar 2004 19:27:14 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-phone-7"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-phone-8"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkHBox" id="hbox56"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">4</property> - - <child> - <widget class="GtkLabel" id="label399"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Telephone</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkButton" id="button-phone-expand"> - <property name="width_request">20</property> - <property name="height_request">20</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="relief">GTK_RELIEF_NONE</property> - - <child> - <widget class="GtkArrow" id="arrow-phone-expand"> - <property name="visible">True</property> - <property name="arrow_type">GTK_ARROW_RIGHT</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="frame66"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkTable" id="table86"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">2</property> - <property name="n_columns">4</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-im-service-1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu173"> - - <child> - <widget class="GtkMenuItem" id="menuitem388"> - <property name="visible">True</property> - <property name="label" translatable="yes">AIM</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_aim1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem389"> - <property name="visible">True</property> - <property name="label" translatable="yes">Novell Groupwise</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_novell_groupwise1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem390"> - <property name="visible">True</property> - <property name="label" translatable="yes">MSN Messenger</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_msn_messenger1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-im-name-1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-im-service-2"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu174"> - - <child> - <widget class="GtkMenuItem" id="menuitem391"> - <property name="visible">True</property> - <property name="label" translatable="yes">AIM</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_aim1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem392"> - <property name="visible">True</property> - <property name="label" translatable="yes">Novell Groupwise</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_novell_groupwise1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem393"> - <property name="visible">True</property> - <property name="label" translatable="yes">MSN Messenger</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_msn_messenger1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-im-name-2"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-im-service-3"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu175"> - - <child> - <widget class="GtkMenuItem" id="menuitem394"> - <property name="visible">True</property> - <property name="label" translatable="yes">AIM</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_aim1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem395"> - <property name="visible">True</property> - <property name="label" translatable="yes">Novell Groupwise</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_novell_groupwise1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem396"> - <property name="visible">True</property> - <property name="label" translatable="yes">MSN Messenger</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_msn_messenger1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-im-name-3"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optionmenu-im-service-4"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">0</property> - - <child> - <widget class="GtkMenu" id="menu183"> - - <child> - <widget class="GtkMenuItem" id="menuitem420"> - <property name="visible">True</property> - <property name="label" translatable="yes">AIM</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_aim1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem421"> - <property name="visible">True</property> - <property name="label" translatable="yes">Novell Groupwise</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_novell_groupwise1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/> - </widget> - </child> - - <child> - <widget class="GtkMenuItem" id="menuitem422"> - <property name="visible">True</property> - <property name="label" translatable="yes">MSN Messenger</property> - <property name="use_underline">True</property> - <signal name="activate" handler="on_msn_messenger1_activate" last_modification_time="Fri, 12 Mar 2004 18:38:59 GMT"/> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-im-name-4"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label404"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Instant Messaging</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="tab_expand">True</property> - <property name="tab_fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label405"> - <property name="visible">True</property> - <property name="label" translatable="yes">Contact</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">tab</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox35"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkFrame" id="frame67"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkTable" id="table87"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">5</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="accellabel-homepage"> - <property name="visible">True</property> - <property name="label" translatable="yes">Home Page:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-caluri"> - <property name="visible">True</property> - <property name="label" translatable="yes">Calendar:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-fburl"> - <property name="visible">True</property> - <property name="label" translatable="yes">Free/Busy:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-videourl"> - <property name="visible">True</property> - <property name="label" translatable="yes">Video Chat:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="Custom" id="entry-homepage"> - <property name="visible">True</property> - <property name="creation_function">e_contact_editor_create_web</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Tue, 13 Apr 2004 22:04:21 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="Custom" id="entry-caluri"> - <property name="visible">True</property> - <property name="creation_function">e_contact_editor_create_web</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Tue, 13 Apr 2004 22:04:51 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="Custom" id="entry-fburl"> - <property name="visible">True</property> - <property name="creation_function">e_contact_editor_create_web</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Tue, 13 Apr 2004 22:05:05 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="Custom" id="entry-videourl"> - <property name="visible">True</property> - <property name="creation_function">e_contact_editor_create_web</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Tue, 13 Apr 2004 22:05:30 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-weblog"> - <property name="visible">True</property> - <property name="label" translatable="yes">Web Log:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="Custom" id="entry-weblog"> - <property name="visible">True</property> - <property name="creation_function">e_contact_editor_create_web</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Tue, 13 Apr 2004 22:04:21 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label410"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Web Addresses</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="frame68"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkTable" id="table88"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">3</property> - <property name="n_columns">4</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label-profession"> - <property name="visible">True</property> - <property name="label" translatable="yes">Profession:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-profession"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-jobtitle"> - <property name="visible">True</property> - <property name="label" translatable="yes">Title:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-jobtitle"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-company"> - <property name="visible">True</property> - <property name="label" translatable="yes">Company:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-company"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-department"> - <property name="visible">True</property> - <property name="label" translatable="yes">Department:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-department"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-manager"> - <property name="visible">True</property> - <property name="label" translatable="yes">Manager:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-manager"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-assistant"> - <property name="visible">True</property> - <property name="label" translatable="yes">Assistant:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-assistant"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label417"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Job</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="frame69"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkTable" id="table89"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">3</property> - <property name="n_columns">4</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkScrolledWindow" id="scrolledwindow41"> - <property name="height_request">38</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="shadow_type">GTK_SHADOW_IN</property> - <property name="window_placement">GTK_CORNER_TOP_LEFT</property> - - <child> - <widget class="GtkTextView" id="text-comments"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="justification">GTK_JUSTIFY_LEFT</property> - <property name="wrap_mode">GTK_WRAP_NONE</property> - <property name="cursor_visible">True</property> - <property name="pixels_above_lines">0</property> - <property name="pixels_below_lines">0</property> - <property name="pixels_inside_wrap">0</property> - <property name="left_margin">0</property> - <property name="right_margin">0</property> - <property name="indent">0</property> - <property name="text" translatable="yes"></property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">4</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-comments"> - <property name="visible">True</property> - <property name="label" translatable="yes">Notes:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-office"> - <property name="visible">True</property> - <property name="label" translatable="yes">Office:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-spouse"> - <property name="visible">True</property> - <property name="label" translatable="yes">Spouse:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-office"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-spouse"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-birthday"> - <property name="visible">True</property> - <property name="label" translatable="yes">Birthday:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-anniversary"> - <property name="visible">True</property> - <property name="label" translatable="yes">Anniversary:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="Custom" id="dateedit-anniversary"> - <property name="visible">True</property> - <property name="creation_function">e_contact_editor_create_date</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Tue, 13 Apr 2004 23:56:03 GMT</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="Custom" id="dateedit-birthday"> - <property name="visible">True</property> - <property name="creation_function">e_contact_editor_create_date</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Tue, 13 Apr 2004 23:55:46 GMT</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label421"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Miscellaneous</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="tab_expand">False</property> - <property name="tab_fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label422"> - <property name="visible">True</property> - <property name="label" translatable="yes">Personal Information</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">tab</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox36"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">12</property> - - <child> - <widget class="GtkFrame" id="frame70"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkTable" id="table90"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">4</property> - <property name="n_columns">4</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label-home-city"> - <property name="visible">True</property> - <property name="label" translatable="yes">City:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-home-city"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-home-zip"> - <property name="visible">True</property> - <property name="label" translatable="yes">Zip/Postal Code:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-home-zip"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-home-state"> - <property name="visible">True</property> - <property name="label" translatable="yes">State/Province:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-home-state"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-home-country"> - <property name="visible">True</property> - <property name="label" translatable="yes">Country:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-home-country"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-home-address"> - <property name="visible">True</property> - <property name="label" translatable="yes">Address:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkScrolledWindow" id="scrolledwindow42"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="shadow_type">GTK_SHADOW_IN</property> - <property name="window_placement">GTK_CORNER_TOP_LEFT</property> - - <child> - <widget class="GtkTextView" id="textview-home-address"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="justification">GTK_JUSTIFY_LEFT</property> - <property name="wrap_mode">GTK_WRAP_NONE</property> - <property name="cursor_visible">True</property> - <property name="pixels_above_lines">0</property> - <property name="pixels_below_lines">0</property> - <property name="pixels_inside_wrap">0</property> - <property name="left_margin">0</property> - <property name="right_margin">0</property> - <property name="indent">0</property> - <property name="text" translatable="yes"></property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">3</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-home-pobox"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-home-pobox"> - <property name="visible">True</property> - <property name="label" translatable="yes">PO Box:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label429"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Home</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="frame71"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkTable" id="table91"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">4</property> - <property name="n_columns">4</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label-work-city"> - <property name="visible">True</property> - <property name="label" translatable="yes">City:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-work-city"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-work-state"> - <property name="visible">True</property> - <property name="label" translatable="yes">State/Province:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-work-state"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-work-zip"> - <property name="visible">True</property> - <property name="label" translatable="yes">Zip/Postal Code:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-work-zip"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-work-country"> - <property name="visible">True</property> - <property name="label" translatable="yes">Country:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-work-country"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-work-address"> - <property name="visible">True</property> - <property name="label" translatable="yes">Address:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkScrolledWindow" id="scrolledwindow43"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="shadow_type">GTK_SHADOW_IN</property> - <property name="window_placement">GTK_CORNER_TOP_LEFT</property> - - <child> - <widget class="GtkTextView" id="textview-work-address"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="justification">GTK_JUSTIFY_LEFT</property> - <property name="wrap_mode">GTK_WRAP_NONE</property> - <property name="cursor_visible">True</property> - <property name="pixels_above_lines">0</property> - <property name="pixels_below_lines">0</property> - <property name="pixels_inside_wrap">0</property> - <property name="left_margin">0</property> - <property name="right_margin">0</property> - <property name="indent">0</property> - <property name="text" translatable="yes"></property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">3</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-work-pobox"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-work-pobox"> - <property name="visible">True</property> - <property name="label" translatable="yes">PO Box:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label436"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Work</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="frame72"> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - - <child> - <widget class="GtkTable" id="table92"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">4</property> - <property name="n_columns">4</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label-other-city"> - <property name="visible">True</property> - <property name="label" translatable="yes">City:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-other-city"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-other-address"> - <property name="visible">True</property> - <property name="label" translatable="yes">Address:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-other-state"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-other-state"> - <property name="visible">True</property> - <property name="label" translatable="yes">State/Province:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-other-zip"> - <property name="visible">True</property> - <property name="label" translatable="yes">Zip/Postal Code:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-other-zip"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-other-country"> - <property name="visible">True</property> - <property name="label" translatable="yes">Country:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-other-country"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkScrolledWindow" id="scrolledwindow44"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="shadow_type">GTK_SHADOW_IN</property> - <property name="window_placement">GTK_CORNER_TOP_LEFT</property> - - <child> - <widget class="GtkTextView" id="textview-other-address"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="justification">GTK_JUSTIFY_LEFT</property> - <property name="wrap_mode">GTK_WRAP_NONE</property> - <property name="cursor_visible">True</property> - <property name="pixels_above_lines">0</property> - <property name="pixels_below_lines">0</property> - <property name="pixels_inside_wrap">0</property> - <property name="left_margin">0</property> - <property name="right_margin">0</property> - <property name="indent">0</property> - <property name="text" translatable="yes"></property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">3</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-other-pobox"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-other-pobox"> - <property name="visible">True</property> - <property name="label" translatable="yes">PO Box:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label444"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Other</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="tab_expand">False</property> - <property name="tab_fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label437"> - <property name="visible">True</property> - <property name="label" translatable="yes">Mailing Address</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">tab</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -</glade-interface> diff --git a/addressbook/gui/contact-editor/e-contact-editor-address.c b/addressbook/gui/contact-editor/e-contact-editor-address.c deleted file mode 100644 index 375bf5a197..0000000000 --- a/addressbook/gui/contact-editor/e-contact-editor-address.c +++ /dev/null @@ -1,627 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-contact-editor-address.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> - -#include <e-contact-editor-address.h> -#include <e-util/e-icon-factory.h> - -#include <glib.h> -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-util.h> -#include <gal/widgets/e-gui-utils.h> -#include <gtk/gtkcombo.h> -#include <gtk/gtkentry.h> -#include <gtk/gtkstock.h> -#include <gtk/gtklabel.h> -#include <string.h> -#include <stdlib.h> -#include <locale.h> - -static void e_contact_editor_address_init (EContactEditorAddress *card); -static void e_contact_editor_address_class_init (EContactEditorAddressClass *klass); -static void e_contact_editor_address_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_contact_editor_address_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void e_contact_editor_address_dispose (GObject *object); - -static void fill_in_info(EContactEditorAddress *editor); -static void extract_info(EContactEditorAddress *editor); - -static GtkDialogClass *parent_class = NULL; - -/* The arguments we take */ -enum { - PROP_0, - PROP_ADDRESS, - PROP_EDITABLE -}; - -GType -e_contact_editor_address_get_type (void) -{ - static GType contact_editor_address_type = 0; - - if (!contact_editor_address_type) { - static const GTypeInfo contact_editor_address_info = { - sizeof (EContactEditorAddressClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_contact_editor_address_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EContactEditorAddress), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_contact_editor_address_init, - }; - - contact_editor_address_type = g_type_register_static (GTK_TYPE_DIALOG, "EContactEditorAddress", &contact_editor_address_info, 0); - } - - return contact_editor_address_type; -} - -static void -e_contact_editor_address_class_init (EContactEditorAddressClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - - parent_class = g_type_class_ref (GTK_TYPE_DIALOG); - - object_class->set_property = e_contact_editor_address_set_property; - object_class->get_property = e_contact_editor_address_get_property; - object_class->dispose = e_contact_editor_address_dispose; - - g_object_class_install_property (object_class, PROP_ADDRESS, - g_param_spec_boxed ("address", - _("Address"), - /*_( */"XXX blurb" /*)*/, - e_contact_address_get_type (), - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EDITABLE, - g_param_spec_boolean ("editable", - _("Editable"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); -} - -static GList * -add_to_tab_order(GList *list, GladeXML *gui, char *name) -{ - GtkWidget *widget = glade_xml_get_widget(gui, name); - return g_list_prepend(list, widget); -} - -static void -setup_tab_order(GladeXML *gui) -{ - GtkWidget *container; - GList *list = NULL; - - container = glade_xml_get_widget(gui, "table-checkaddress"); - - if (container) { - list = add_to_tab_order(list, gui, "entry-city"); - list = add_to_tab_order(list, gui, "entry-region"); - list = add_to_tab_order(list, gui, "entry-code"); - list = add_to_tab_order(list, gui, "combo-country"); - list = g_list_reverse(list); - e_container_change_tab_order(GTK_CONTAINER(container), list); - g_list_free(list); - } -} - -static char * countries [] = { - N_("United States"), - N_("Afghanistan"), - N_("Albania"), - N_("Algeria"), - N_("American Samoa"), - N_("Andorra"), - N_("Angola"), - N_("Anguilla"), - N_("Antarctica"), - N_("Antigua And Barbuda"), - N_("Argentina"), - N_("Armenia"), - N_("Aruba"), - N_("Australia"), - N_("Austria"), - N_("Azerbaijan"), - N_("Bahamas"), - N_("Bahrain"), - N_("Bangladesh"), - N_("Barbados"), - N_("Belarus"), - N_("Belgium"), - N_("Belize"), - N_("Benin"), - N_("Bermuda"), - N_("Bhutan"), - N_("Bolivia"), - N_("Bosnia And Herzegowina"), - N_("Botswana"), - N_("Bouvet Island"), - N_("Brazil"), - N_("British Indian Ocean Territory"), - N_("Brunei Darussalam"), - N_("Bulgaria"), - N_("Burkina Faso"), - N_("Burundi"), - N_("Cambodia"), - N_("Cameroon"), - N_("Canada"), - N_("Cape Verde"), - N_("Cayman Islands"), - N_("Central African Republic"), - N_("Chad"), - N_("Chile"), - N_("China"), - N_("Christmas Island"), - N_("Cocos (Keeling) Islands"), - N_("Colombia"), - N_("Comoros"), - N_("Congo"), - N_("Congo, The Democratic Republic Of The"), - N_("Cook Islands"), - N_("Costa Rica"), - N_("Cote d'Ivoire"), - N_("Croatia"), - N_("Cuba"), - N_("Cyprus"), - N_("Czech Republic"), - N_("Denmark"), - N_("Djibouti"), - N_("Dominica"), - N_("Dominican Republic"), - N_("Ecuador"), - N_("Egypt"), - N_("El Salvador"), - N_("Equatorial Guinea"), - N_("Eritrea"), - N_("Estonia"), - N_("Ethiopia"), - N_("Falkland Islands"), - N_("Faroe Islands"), - N_("Fiji"), - N_("Finland"), - N_("France"), - N_("French Guiana"), - N_("French Polynesia"), - N_("French Southern Territories"), - N_("Gabon"), - N_("Gambia"), - N_("Georgia"), - N_("Germany"), - N_("Ghana"), - N_("Gibraltar"), - N_("Greece"), - N_("Greenland"), - N_("Grenada"), - N_("Guadeloupe"), - N_("Guam"), - N_("Guatemala"), - N_("Guernsey"), - N_("Guinea"), - N_("Guinea-bissau"), - N_("Guyana"), - N_("Haiti"), - N_("Heard And McDonald Islands"), - N_("Holy See"), - N_("Honduras"), - N_("Hong Kong"), - N_("Hungary"), - N_("Iceland"), - N_("India"), - N_("Indonesia"), - N_("Iran"), - N_("Iraq"), - N_("Ireland"), - N_("Isle of Man"), - N_("Israel"), - N_("Italy"), - N_("Jamaica"), - N_("Japan"), - N_("Jersey"), - N_("Jordan"), - N_("Kazakhstan"), - N_("Kenya"), - N_("Kiribati"), - N_("Korea, Democratic People's Republic Of"), - N_("Korea, Republic Of"), - N_("Kuwait"), - N_("Kyrgyzstan"), - N_("Laos"), - N_("Latvia"), - N_("Lebanon"), - N_("Lesotho"), - N_("Liberia"), - N_("Libya"), - N_("Liechtenstein"), - N_("Lithuania"), - N_("Luxembourg"), - N_("Macao"), - N_("Macedonia"), - N_("Madagascar"), - N_("Malawi"), - N_("Malaysia"), - N_("Maldives"), - N_("Mali"), - N_("Malta"), - N_("Marshall Islands"), - N_("Martinique"), - N_("Mauritania"), - N_("Mauritius"), - N_("Mayotte"), - N_("Mexico"), - N_("Micronesia"), - N_("Moldova, Republic Of"), - N_("Monaco"), - N_("Mongolia"), - N_("Montserrat"), - N_("Morocco"), - N_("Mozambique"), - N_("Myanmar"), - N_("Namibia"), - N_("Nauru"), - N_("Nepal"), - N_("Netherlands"), - N_("Netherlands Antilles"), - N_("New Caledonia"), - N_("New Zealand"), - N_("Nicaragua"), - N_("Niger"), - N_("Nigeria"), - N_("Niue"), - N_("Norfolk Island"), - N_("Northern Mariana Islands"), - N_("Norway"), - N_("Oman"), - N_("Pakistan"), - N_("Palau"), - N_("Palestinian Territory"), - N_("Panama"), - N_("Papua New Guinea"), - N_("Paraguay"), - N_("Peru"), - N_("Philippines"), - N_("Pitcairn"), - N_("Poland"), - N_("Portugal"), - N_("Puerto Rico"), - N_("Qatar"), - N_("Reunion"), - N_("Romania"), - N_("Russian Federation"), - N_("Rwanda"), - N_("Saint Kitts And Nevis"), - N_("Saint Lucia"), - N_("Saint Vincent And The Grena-dines"), - N_("Samoa"), - N_("San Marino"), - N_("Sao Tome And Principe"), - N_("Saudi Arabia"), - N_("Senegal"), - N_("Serbia And Montenegro"), - N_("Seychelles"), - N_("Sierra Leone"), - N_("Singapore"), - N_("Slovakia"), - N_("Slovenia"), - N_("Solomon Islands"), - N_("Somalia"), - N_("South Africa"), - N_("South Georgia And The South Sandwich Islands"), - N_("Spain"), - N_("Sri Lanka"), - N_("St. Helena"), - N_("St. Pierre And Miquelon"), - N_("Sudan"), - N_("Suriname"), - N_("Svalbard And Jan Mayen Islands"), - N_("Swaziland"), - N_("Sweden"), - N_("Switzerland"), - N_("Syria"), - N_("Taiwan"), - N_("Tajikistan"), - N_("Tanzania, United Republic Of"), - N_("Thailand"), - N_("Timor-Leste"), - N_("Togo"), - N_("Tokelau"), - N_("Tonga"), - N_("Trinidad And Tobago"), - N_("Tunisia"), - N_("Turkey"), - N_("Turkmenistan"), - N_("Turks And Caicos Islands"), - N_("Tuvalu"), - N_("Uganda"), - N_("Ukraine"), - N_("United Arab Emirates"), - N_("United Kingdom"), - N_("United States Minor Outlying Islands"), - N_("Uruguay"), - N_("Uzbekistan"), - N_("Vanuatu"), - N_("Venezuela"), - N_("Viet Nam"), - N_("Virgin Islands, British"), - N_("Virgin Islands, U.S."), - N_("Wallis And Futuna Islands"), - N_("Western Sahara"), - N_("Yemen"), - N_("Zambia"), - N_("Zimbabwe"), - NULL -}; - -static int -compare_func (const void *voida, const void *voidb) -{ - char * const *stringa = voida, * const *stringb = voidb; - - return strcoll (*stringa, *stringb); -} - -static void -fill_in_countries (GladeXML *gui) -{ - GtkCombo *combo; - combo = (GtkCombo *) glade_xml_get_widget(gui, "combo-country"); - if (combo && GTK_IS_COMBO (combo)) { - static gboolean sorted = FALSE; - static GList *country_list; - if (!sorted) { - int i; - char *locale; - - for (i = 0; countries[i]; i++) { - countries[i] = _(countries[i]); - } - - locale = setlocale (LC_COLLATE, NULL); - qsort (countries + 1, i - 1, sizeof (countries[0]), compare_func); - country_list = NULL; - for (i = 0; countries[i]; i++) { - country_list = g_list_prepend (country_list, countries[i]); - } - country_list = g_list_reverse (country_list); - sorted = TRUE; - } - gtk_combo_set_popdown_strings (combo, country_list); - } -} - -static void -e_contact_editor_address_init (EContactEditorAddress *e_contact_editor_address) -{ - GladeXML *gui; - GtkWidget *widget; - GList *icon_list; - - gtk_dialog_add_buttons (GTK_DIALOG (e_contact_editor_address), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); - - gtk_window_set_resizable(GTK_WINDOW(e_contact_editor_address), TRUE); - - e_contact_editor_address->address = NULL; - - gui = glade_xml_new (EVOLUTION_GLADEDIR "/fulladdr.glade", NULL, NULL); - e_contact_editor_address->gui = gui; - - setup_tab_order (gui); - fill_in_countries (gui); - - widget = glade_xml_get_widget(gui, "dialog-checkaddress"); - gtk_window_set_title (GTK_WINDOW (e_contact_editor_address), - GTK_WINDOW (widget)->title); - - widget = glade_xml_get_widget(gui, "table-checkaddress"); - g_object_ref(widget); - gtk_container_remove(GTK_CONTAINER(widget->parent), widget); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (e_contact_editor_address)->vbox), widget, TRUE, TRUE, 0); - g_object_unref(widget); - - icon_list = e_icon_factory_get_icon_list ("stock_contact"); - if (icon_list) { - gtk_window_set_icon_list (GTK_WINDOW (e_contact_editor_address), icon_list); - g_list_foreach (icon_list, (GFunc) g_object_unref, NULL); - g_list_free (icon_list); - } -} - -void -e_contact_editor_address_dispose (GObject *object) -{ - EContactEditorAddress *e_contact_editor_address = E_CONTACT_EDITOR_ADDRESS(object); - - if (e_contact_editor_address->gui) { - g_object_unref(e_contact_editor_address->gui); - e_contact_editor_address->gui = NULL; - } - - if (e_contact_editor_address->address) { - e_contact_address_free (e_contact_editor_address->address); - e_contact_editor_address->address = NULL; - } - - if (G_OBJECT_CLASS (parent_class)->dispose) - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -GtkWidget* -e_contact_editor_address_new (const EContactAddress *address) -{ - GtkWidget *widget = g_object_new (E_TYPE_CONTACT_EDITOR_ADDRESS, NULL); - - g_object_set (widget, - "address", address, - NULL); - - return widget; -} - -static void -e_contact_editor_address_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - EContactEditorAddress *e_contact_editor_address; - - e_contact_editor_address = E_CONTACT_EDITOR_ADDRESS (object); - - switch (prop_id){ - case PROP_ADDRESS: - if (e_contact_editor_address->address) - g_boxed_free (e_contact_address_get_type (), e_contact_editor_address->address); - - e_contact_editor_address->address = g_value_dup_boxed (value); - fill_in_info (e_contact_editor_address); - break; - case PROP_EDITABLE: { - int i; - char *widget_names[] = { - "entry-street", - "entry-city", - "entry-ext", - "entry-po", - "entry-region", - "combo-country", - "entry-code", - "label-street", - "label-city", - "label-ext", - "label-po", - "label-region", - "label-country", - "label-code", - NULL - }; - e_contact_editor_address->editable = g_value_get_boolean (value) ? TRUE : FALSE; - for (i = 0; widget_names[i] != NULL; i ++) { - GtkWidget *w = glade_xml_get_widget(e_contact_editor_address->gui, widget_names[i]); - if (GTK_IS_ENTRY (w)) { - gtk_editable_set_editable (GTK_EDITABLE (w), - e_contact_editor_address->editable); - } - else if (GTK_IS_COMBO (w)) { - gtk_editable_set_editable (GTK_EDITABLE (GTK_COMBO (w)->entry), - e_contact_editor_address->editable); - gtk_widget_set_sensitive (GTK_COMBO (w)->button, e_contact_editor_address->editable); - } - else if (GTK_IS_LABEL (w)) { - gtk_widget_set_sensitive (w, e_contact_editor_address->editable); - } - } - break; - } - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_contact_editor_address_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - EContactEditorAddress *e_contact_editor_address; - - e_contact_editor_address = E_CONTACT_EDITOR_ADDRESS (object); - - switch (prop_id) { - case PROP_ADDRESS: - extract_info (e_contact_editor_address); - g_value_set_static_boxed (value, e_contact_editor_address->address); - break; - case PROP_EDITABLE: - g_value_set_boolean (value, e_contact_editor_address->editable ? TRUE : FALSE); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -fill_in_field(EContactEditorAddress *editor, char *field, char *string) -{ - GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field)); - if (entry) { - if (string) - gtk_entry_set_text(entry, string); - else - gtk_entry_set_text(entry, ""); - } -} - -static void -fill_in_info(EContactEditorAddress *editor) -{ - EContactAddress *address = editor->address; - - if (address) { - fill_in_field (editor, "entry-street" , address->street ); - fill_in_field (editor, "entry-po" , address->po ); - fill_in_field (editor, "entry-ext" , address->ext ); - fill_in_field (editor, "entry-city" , address->locality); - fill_in_field (editor, "entry-region" , address->region ); - fill_in_field (editor, "entry-code" , address->code ); - fill_in_field (editor, "entry-country", address->country ); - } -} - -static char * -extract_field(EContactEditorAddress *editor, char *field) -{ - GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field)); - if (entry) - return g_strdup (gtk_entry_get_text(entry)); - else - return NULL; -} - -static void -extract_info(EContactEditorAddress *editor) -{ - EContactAddress *address = editor->address; - - if (address) { - g_boxed_free (e_contact_address_get_type (), address); - } - - address = g_new0 (EContactAddress, 1); - editor->address = address; - - address->street = extract_field(editor, "entry-street" ); - address->po = extract_field(editor, "entry-po" ); - address->ext = extract_field(editor, "entry-ext" ); - address->locality = extract_field(editor, "entry-city" ); - address->region = extract_field(editor, "entry-region" ); - address->code = extract_field(editor, "entry-code" ); - address->country = extract_field(editor, "entry-country"); -} diff --git a/addressbook/gui/contact-editor/e-contact-editor-address.h b/addressbook/gui/contact-editor/e-contact-editor-address.h deleted file mode 100644 index 30fefa0e56..0000000000 --- a/addressbook/gui/contact-editor/e-contact-editor-address.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-editor-address.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_CONTACT_EDITOR_ADDRESS_H__ -#define __E_CONTACT_EDITOR_ADDRESS_H__ - -#include <gtk/gtkdialog.h> -#include <glade/glade.h> -#include <libebook/e-contact.h> - -G_BEGIN_DECLS - -/* EContactEditorAddress - A dialog displaying information about a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - * name ECardName * RW The card currently being edited. Returns a copy. - */ - -#define E_TYPE_CONTACT_EDITOR_ADDRESS (e_contact_editor_address_get_type ()) -#define E_CONTACT_EDITOR_ADDRESS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CONTACT_EDITOR_ADDRESS, EContactEditorAddress)) -#define E_CONTACT_EDITOR_ADDRESS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CONTACT_EDITOR_ADDRESS, EContactEditorAddressClass)) -#define E_IS_CONTACT_EDITOR_ADDRESS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CONTACT_EDITOR_ADDRESS)) -#define E_IS_CONTACT_EDITOR_ADDRESS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_CONTACT_EDITOR_ADDRESS)) - - -typedef struct _EContactEditorAddress EContactEditorAddress; -typedef struct _EContactEditorAddressClass EContactEditorAddressClass; - -struct _EContactEditorAddress -{ - GtkDialog parent; - - /* item specific fields */ - EContactAddress *address; - - guint editable : 1; - - GladeXML *gui; -}; - -struct _EContactEditorAddressClass -{ - GtkDialogClass parent_class; -}; - - -GtkWidget *e_contact_editor_address_new (const EContactAddress *address); -GType e_contact_editor_address_get_type (void); - -G_END_DECLS - -#endif /* __E_CONTACT_EDITOR_ADDRESS_H__ */ diff --git a/addressbook/gui/contact-editor/e-contact-editor-fullname.c b/addressbook/gui/contact-editor/e-contact-editor-fullname.c deleted file mode 100644 index 1847a463f1..0000000000 --- a/addressbook/gui/contact-editor/e-contact-editor-fullname.c +++ /dev/null @@ -1,303 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * eab-contact-editor-phones.c - * Copyright (C) 2003 Ximian, Inc. - * Author: Chris Toshok <toshok@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> -#include "e-contact-editor-fullname.h" -#include <e-util/e-icon-factory.h> -#include <libgnome/gnome-util.h> -#include <libgnome/gnome-i18n.h> -#include <gtk/gtkcombo.h> -#include <gtk/gtkstock.h> -#include <gtk/gtkentry.h> -#include <gtk/gtklabel.h> - -static void e_contact_editor_fullname_init (EContactEditorFullname *card); -static void e_contact_editor_fullname_class_init (EContactEditorFullnameClass *klass); -static void e_contact_editor_fullname_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_contact_editor_fullname_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void e_contact_editor_fullname_dispose (GObject *object); - -static void fill_in_info(EContactEditorFullname *editor); -static void extract_info(EContactEditorFullname *editor); - -static GtkDialogClass *parent_class = NULL; - -/* The arguments we take */ -enum { - PROP_0, - PROP_NAME, - PROP_EDITABLE -}; - -GType -e_contact_editor_fullname_get_type (void) -{ - static GType contact_editor_fullname_type = 0; - - if (!contact_editor_fullname_type) { - static const GTypeInfo contact_editor_fullname_info = { - sizeof (EContactEditorFullnameClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_contact_editor_fullname_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EContactEditorFullname), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_contact_editor_fullname_init, - }; - - contact_editor_fullname_type = g_type_register_static (GTK_TYPE_DIALOG, "EContactEditorFullname", &contact_editor_fullname_info, 0); - } - - return contact_editor_fullname_type; -} - -static void -e_contact_editor_fullname_class_init (EContactEditorFullnameClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - - parent_class = g_type_class_ref (GTK_TYPE_DIALOG); - - object_class->set_property = e_contact_editor_fullname_set_property; - object_class->get_property = e_contact_editor_fullname_get_property; - object_class->dispose = e_contact_editor_fullname_dispose; - - g_object_class_install_property (object_class, PROP_NAME, - g_param_spec_pointer ("name", - _("Name"), - /*_( */"XXX blurb" /*)*/, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EDITABLE, - g_param_spec_boolean ("editable", - _("Editable"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); -} - -static void -e_contact_editor_fullname_init (EContactEditorFullname *e_contact_editor_fullname) -{ - GladeXML *gui; - GtkWidget *widget; - GList *icon_list; - - gtk_widget_realize (GTK_WIDGET (e_contact_editor_fullname)); - gtk_dialog_set_has_separator (GTK_DIALOG (e_contact_editor_fullname), - FALSE); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (e_contact_editor_fullname)->vbox), 0); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (e_contact_editor_fullname)->action_area), 12); - - gtk_dialog_add_buttons (GTK_DIALOG (e_contact_editor_fullname), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); - - gtk_window_set_resizable(GTK_WINDOW(e_contact_editor_fullname), TRUE); - - e_contact_editor_fullname->name = NULL; - gui = glade_xml_new (EVOLUTION_GLADEDIR "/fullname.glade", NULL, NULL); - e_contact_editor_fullname->gui = gui; - - widget = glade_xml_get_widget(gui, "dialog-checkfullname"); - gtk_window_set_title (GTK_WINDOW (e_contact_editor_fullname), - GTK_WINDOW (widget)->title); - - widget = glade_xml_get_widget(gui, "table-checkfullname"); - g_object_ref(widget); - gtk_container_remove(GTK_CONTAINER(widget->parent), widget); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (e_contact_editor_fullname)->vbox), widget, TRUE, TRUE, 0); - g_object_unref(widget); - - icon_list = e_icon_factory_get_icon_list ("stock_contact"); - if (icon_list) { - gtk_window_set_icon_list (GTK_WINDOW (e_contact_editor_fullname), icon_list); - g_list_foreach (icon_list, (GFunc) g_object_unref, NULL); - g_list_free (icon_list); - } -} - -void -e_contact_editor_fullname_dispose (GObject *object) -{ - EContactEditorFullname *e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME(object); - - if (e_contact_editor_fullname->gui) { - g_object_unref(e_contact_editor_fullname->gui); - e_contact_editor_fullname->gui = NULL; - } - - if (e_contact_editor_fullname->name) { - e_contact_name_free(e_contact_editor_fullname->name); - e_contact_editor_fullname->name = NULL; - } - - if (G_OBJECT_CLASS (parent_class)->dispose) - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -GtkWidget* -e_contact_editor_fullname_new (const EContactName *name) -{ - GtkWidget *widget = g_object_new (E_TYPE_CONTACT_EDITOR_FULLNAME, NULL); - - g_object_set (widget, - "name", name, - NULL); - return widget; -} - -static void -e_contact_editor_fullname_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - EContactEditorFullname *e_contact_editor_fullname; - - e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (object); - - switch (prop_id){ - case PROP_NAME: - e_contact_name_free(e_contact_editor_fullname->name); - - if (g_value_get_pointer (value) != NULL) { - e_contact_editor_fullname->name = e_contact_name_copy(g_value_get_pointer (value)); - fill_in_info(e_contact_editor_fullname); - } - else { - e_contact_editor_fullname->name = NULL; - } - break; - case PROP_EDITABLE: { - int i; - char *widget_names[] = { - "combo-title", - "combo-suffix", - "entry-first", - "entry-middle", - "entry-last", - "label-title", - "label-suffix", - "label-first", - "label-middle", - "label-last", - NULL - }; - e_contact_editor_fullname->editable = g_value_get_boolean (value) ? TRUE : FALSE; - for (i = 0; widget_names[i] != NULL; i ++) { - GtkWidget *w = glade_xml_get_widget(e_contact_editor_fullname->gui, widget_names[i]); - if (GTK_IS_ENTRY (w)) { - gtk_editable_set_editable (GTK_EDITABLE (w), - e_contact_editor_fullname->editable); - } - else if (GTK_IS_COMBO (w)) { - gtk_editable_set_editable (GTK_EDITABLE (GTK_COMBO (w)->entry), - e_contact_editor_fullname->editable); - gtk_widget_set_sensitive (GTK_COMBO (w)->button, e_contact_editor_fullname->editable); - } - else if (GTK_IS_LABEL (w)) { - gtk_widget_set_sensitive (w, e_contact_editor_fullname->editable); - } - } - break; - } - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_contact_editor_fullname_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - EContactEditorFullname *e_contact_editor_fullname; - - e_contact_editor_fullname = E_CONTACT_EDITOR_FULLNAME (object); - - switch (prop_id) { - case PROP_NAME: - extract_info(e_contact_editor_fullname); - g_value_set_pointer (value, e_contact_name_copy(e_contact_editor_fullname->name)); - break; - case PROP_EDITABLE: - g_value_set_boolean (value, e_contact_editor_fullname->editable ? TRUE : FALSE); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -fill_in_field(EContactEditorFullname *editor, char *field, char *string) -{ - GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field)); - if (entry) { - if (string) - gtk_entry_set_text(entry, string); - else - gtk_entry_set_text(entry, ""); - } -} - -static void -fill_in_info(EContactEditorFullname *editor) -{ - EContactName *name = editor->name; - if (name) { - fill_in_field(editor, "entry-title", name->prefixes); - fill_in_field(editor, "entry-first", name->given); - fill_in_field(editor, "entry-middle", name->additional); - fill_in_field(editor, "entry-last", name->family); - fill_in_field(editor, "entry-suffix", name->suffixes); - } -} - -static char * -extract_field(EContactEditorFullname *editor, char *field) -{ - GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field)); - if (entry) - return g_strdup (gtk_entry_get_text(entry)); - else - return NULL; -} - -static void -extract_info(EContactEditorFullname *editor) -{ - EContactName *name = editor->name; - if (!name) { - name = e_contact_name_new(); - editor->name = name; - } - - name->prefixes = extract_field(editor, "entry-title" ); - name->given = extract_field(editor, "entry-first" ); - name->additional = extract_field(editor, "entry-middle"); - name->family = extract_field(editor, "entry-last" ); - name->suffixes = extract_field(editor, "entry-suffix"); -} diff --git a/addressbook/gui/contact-editor/e-contact-editor-fullname.h b/addressbook/gui/contact-editor/e-contact-editor-fullname.h deleted file mode 100644 index 0b254c789c..0000000000 --- a/addressbook/gui/contact-editor/e-contact-editor-fullname.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-editor-fullname.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_CONTACT_EDITOR_FULLNAME_H__ -#define __E_CONTACT_EDITOR_FULLNAME_H__ - -#include <gtk/gtkdialog.h> -#include <glade/glade.h> -#include <libebook/e-contact.h> - -G_BEGIN_DECLS - -/* EContactEditorFullname - A dialog displaying information about a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - * name ECardName * RW The card currently being edited. Returns a copy. - */ - -#define E_TYPE_CONTACT_EDITOR_FULLNAME (e_contact_editor_fullname_get_type ()) -#define E_CONTACT_EDITOR_FULLNAME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CONTACT_EDITOR_FULLNAME, EContactEditorFullname)) -#define E_CONTACT_EDITOR_FULLNAME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CONTACT_EDITOR_FULLNAME, EContactEditorFullnameClass)) -#define E_IS_CONTACT_EDITOR_FULLNAME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CONTACT_EDITOR_FULLNAME)) -#define E_IS_CONTACT_EDITOR_FULLNAME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_CONTACT_EDITOR_FULLNAME)) - - -typedef struct _EContactEditorFullname EContactEditorFullname; -typedef struct _EContactEditorFullnameClass EContactEditorFullnameClass; - -struct _EContactEditorFullname -{ - GtkDialog parent; - - /* item specific fields */ - EContactName *name; - GladeXML *gui; - - /* Whether the dialog will accept modifications */ - guint editable : 1; -}; - -struct _EContactEditorFullnameClass -{ - GtkDialogClass parent_class; -}; - - -GtkWidget *e_contact_editor_fullname_new(const EContactName *name); -GType e_contact_editor_fullname_get_type (void); - -G_END_DECLS - -#endif /* __E_CONTACT_EDITOR_FULLNAME_H__ */ diff --git a/addressbook/gui/contact-editor/e-contact-editor-im.c b/addressbook/gui/contact-editor/e-contact-editor-im.c deleted file mode 100644 index b77fefd88b..0000000000 --- a/addressbook/gui/contact-editor/e-contact-editor-im.c +++ /dev/null @@ -1,490 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-contact-editor-im.c - * Copyright (C) 2003 Ximian, Inc. - * Author: Christian Hammond <chipx86@gnupdate.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> -#include "e-contact-editor-im.h" -#include <libgnome/gnome-util.h> -#include <libgnome/gnome-i18n.h> -#include <gtk/gtkbox.h> -#include <gtk/gtkentry.h> -#include <gtk/gtkhbox.h> -#include <gtk/gtkimage.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkmenuitem.h> -#include <gtk/gtkoptionmenu.h> -#include <gtk/gtksizegroup.h> -#include <gtk/gtkstock.h> -#include <string.h> -#include <e-util/e-icon-factory.h> - -static void e_contact_editor_im_init (EContactEditorIm *card); -static void e_contact_editor_im_class_init (EContactEditorImClass *klass); -static void e_contact_editor_im_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_contact_editor_im_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void e_contact_editor_im_dispose (GObject *object); - -static void fill_in_info(EContactEditorIm *editor); -static void extract_info(EContactEditorIm *editor); - -static GtkDialogClass *parent_class = NULL; - -/* The arguments we take */ -enum { - PROP_0, - PROP_SERVICE, - PROP_LOCATION, - PROP_USERNAME, - PROP_EDITABLE -}; - -#define FIRST_IM_TYPE E_CONTACT_IM_AIM -#define LAST_IM_TYPE E_CONTACT_IM_ICQ - -static const char *im_labels[] = { - N_("AOL Instant Messenger"), - N_("Novell Groupwise"), - N_("Jabber"), - N_("Yahoo Messenger"), - N_("MSN Messenger"), - N_("ICQ") -}; - -static const char *im_images[] = { - "im-aim", - "im-nov", - "im-jabber", - "im-yahoo", - "im-msn", - "im-icq" -}; - -GType -e_contact_editor_im_get_type (void) -{ - static GType contact_editor_im_type = 0; - - if (!contact_editor_im_type) { - static const GTypeInfo contact_editor_im_info = { - sizeof (EContactEditorImClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_contact_editor_im_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EContactEditorIm), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_contact_editor_im_init, - }; - - contact_editor_im_type = g_type_register_static (GTK_TYPE_DIALOG, "EContactEditorIm", &contact_editor_im_info, 0); - } - - return contact_editor_im_type; -} - -static void -e_contact_editor_im_class_init (EContactEditorImClass *klass) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (klass); - - parent_class = g_type_class_ref (GTK_TYPE_DIALOG); - - object_class->set_property = e_contact_editor_im_set_property; - object_class->get_property = e_contact_editor_im_get_property; - object_class->dispose = e_contact_editor_im_dispose; - - g_object_class_install_property (object_class, PROP_SERVICE, - g_param_spec_int ("service", - _("Service"), - /*_( */"XXX blurb" /*)*/, - FIRST_IM_TYPE, - LAST_IM_TYPE, - FIRST_IM_TYPE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_LOCATION, - g_param_spec_string ("location", - _("Location"), - /*_( */"XXX blurb" /*)*/, - "HOME", - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_USERNAME, - g_param_spec_string ("username", - _("Username"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EDITABLE, - g_param_spec_boolean ("editable", - _("Editable"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); -} - -static void -service_changed_cb(GtkWidget *optmenu, EContactEditorIm *editor) -{ - editor->service = gtk_option_menu_get_history(GTK_OPTION_MENU(optmenu)) + FIRST_IM_TYPE; -} - -static void -location_changed_cb(GtkWidget *optmenu, EContactEditorIm *editor) -{ - int i = gtk_option_menu_get_history(GTK_OPTION_MENU(optmenu)); - - if (editor->location != NULL) - g_free(editor->location); - - if (i == 0) - editor->location = g_strdup("HOME"); - else if (i == 1) - editor->location = g_strdup("WORK"); - else - editor->location = NULL; -} - -static void -setup_service_optmenu(EContactEditorIm *editor) -{ - GtkWidget *optmenu; - GtkWidget *menu; - GtkWidget *hbox; - GtkWidget *item; - GtkWidget *label; - GtkWidget *image; - GdkPixbuf *pixbuf; - GtkSizeGroup *sg; - int i; - - optmenu = glade_xml_get_widget(editor->gui, "optmenu-service"); - g_signal_connect(G_OBJECT(optmenu), "changed", - G_CALLBACK(service_changed_cb), editor); - - menu = gtk_menu_new(); - gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu); - gtk_widget_show(menu); - - sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - - for (i = 0; i < G_N_ELEMENTS(im_labels); i++) { - item = gtk_menu_item_new(); - - hbox = gtk_hbox_new(FALSE, 4); - gtk_container_add(GTK_CONTAINER(item), hbox); - gtk_widget_show(hbox); - - pixbuf = e_icon_factory_get_icon (im_images[i], E_ICON_SIZE_MENU); - - if (pixbuf != NULL) { - image = gtk_image_new_from_pixbuf(pixbuf); - - g_object_unref(G_OBJECT(pixbuf)); - } - else - image = gtk_image_new(); - - gtk_size_group_add_widget(sg, image); - - gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); - gtk_widget_show(image); - - label = gtk_label_new(im_labels[i]); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); - gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); - gtk_widget_show(label); - - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - gtk_widget_show(item); - } -} - -static void -setup_location_optmenu(EContactEditorIm *editor) -{ - GtkWidget *item; - GtkWidget *optmenu; - GtkWidget *menu; - - optmenu = glade_xml_get_widget(editor->gui, "optmenu-location"); - - g_signal_connect(G_OBJECT(optmenu), "changed", - G_CALLBACK(location_changed_cb), editor); - - menu = gtk_menu_new(); - gtk_option_menu_set_menu(GTK_OPTION_MENU(optmenu), menu); - gtk_widget_show(menu); - - item = gtk_menu_item_new_with_label(_("Home")); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - gtk_widget_show(item); - - item = gtk_menu_item_new_with_label(_("Work")); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - gtk_widget_show(item); - - item = gtk_menu_item_new_with_label(_("Other")); - gtk_menu_shell_append(GTK_MENU_SHELL(menu), item); - gtk_widget_show(item); -} - -static void -e_contact_editor_im_init (EContactEditorIm *e_contact_editor_im) -{ - GladeXML *gui; - GtkWidget *widget; - GList *icon_list; - - gtk_dialog_add_buttons (GTK_DIALOG (e_contact_editor_im), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); - gtk_dialog_set_has_separator (GTK_DIALOG (e_contact_editor_im), FALSE); - - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (e_contact_editor_im)->action_area), 12); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (e_contact_editor_im)->vbox), 0); - - gtk_window_set_resizable(GTK_WINDOW(e_contact_editor_im), TRUE); - - e_contact_editor_im->service = FIRST_IM_TYPE; - e_contact_editor_im->location = g_strdup("HOME"); - e_contact_editor_im->username = NULL; - gui = glade_xml_new (EVOLUTION_GLADEDIR "/im.glade", NULL, NULL); - e_contact_editor_im->gui = gui; - - widget = glade_xml_get_widget(gui, "dialog-im"); - gtk_window_set_title (GTK_WINDOW (e_contact_editor_im), - GTK_WINDOW (widget)->title); - - widget = glade_xml_get_widget(gui, "table-im"); - g_object_ref(widget); - gtk_container_remove(GTK_CONTAINER(widget->parent), widget); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (e_contact_editor_im)->vbox), widget, TRUE, TRUE, 0); - g_object_unref(widget); - - setup_service_optmenu(e_contact_editor_im); - setup_location_optmenu(e_contact_editor_im); - - gtk_widget_grab_focus(glade_xml_get_widget(gui, "entry-username")); - - /* set the icon */ - icon_list = e_icon_factory_get_icon_list ("stock_contact"); - if (icon_list) { - gtk_window_set_icon_list (GTK_WINDOW (e_contact_editor_im), icon_list); - g_list_foreach (icon_list, (GFunc) g_object_unref, NULL); - g_list_free (icon_list); - } -} - -void -e_contact_editor_im_dispose (GObject *object) -{ - EContactEditorIm *e_contact_editor_im = E_CONTACT_EDITOR_IM(object); - - if (e_contact_editor_im->gui) { - g_object_unref(e_contact_editor_im->gui); - e_contact_editor_im->gui = NULL; - } - - if (e_contact_editor_im->location) { - g_free(e_contact_editor_im->location); - e_contact_editor_im->location = NULL; - } - - if (e_contact_editor_im->username) { - g_free(e_contact_editor_im->username); - e_contact_editor_im->username = NULL; - } - - if (G_OBJECT_CLASS (parent_class)->dispose) - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -GtkWidget* -e_contact_editor_im_new (EContactField service, const char *location, const char *username) -{ - GtkWidget *widget = g_object_new (E_TYPE_CONTACT_EDITOR_IM, NULL); - g_object_set (widget, - "service", GINT_TO_POINTER(service), - "location", location, - "username", username, - NULL); - return widget; -} - -static void -e_contact_editor_im_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - EContactEditorIm *e_contact_editor_im; - const char *str; - - e_contact_editor_im = E_CONTACT_EDITOR_IM (object); - - switch (prop_id){ - case PROP_SERVICE: - e_contact_editor_im->service = g_value_get_int(value); - fill_in_info(e_contact_editor_im); - break; - - case PROP_LOCATION: - if (e_contact_editor_im->location != NULL) - g_free(e_contact_editor_im->location); - - str = g_value_get_string(value); - - if (str == NULL) - e_contact_editor_im->location = NULL; - else if (!g_ascii_strcasecmp(str, "HOME")) - e_contact_editor_im->location = g_strdup("HOME"); - else if (!g_ascii_strcasecmp(str, "WORK")) - e_contact_editor_im->location = g_strdup("WORK"); - else - e_contact_editor_im->location = NULL; - - fill_in_info(e_contact_editor_im); - break; - - case PROP_USERNAME: - if (e_contact_editor_im->username != NULL) - g_free(e_contact_editor_im->username); - - e_contact_editor_im->username = g_strdup(g_value_get_string(value)); - fill_in_info(e_contact_editor_im); - break; - - case PROP_EDITABLE: { - int i; - char *widget_names[] = { - "optmenu-service", - "optmenu-location", - "entry-username", - "label-service", - "label-location", - "label-username", - NULL - }; - e_contact_editor_im->editable = g_value_get_boolean (value) ? TRUE : FALSE; - for (i = 0; widget_names[i] != NULL; i ++) { - GtkWidget *w = glade_xml_get_widget(e_contact_editor_im->gui, widget_names[i]); - if (GTK_IS_ENTRY (w)) { - gtk_editable_set_editable (GTK_EDITABLE (w), - e_contact_editor_im->editable); - } - else { - gtk_widget_set_sensitive (w, e_contact_editor_im->editable); - } - } - break; - } - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_contact_editor_im_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - EContactEditorIm *e_contact_editor_im; - - e_contact_editor_im = E_CONTACT_EDITOR_IM (object); - - switch (prop_id) { - case PROP_SERVICE: - g_value_set_int (value, e_contact_editor_im->service); - break; - case PROP_LOCATION: - g_value_set_string (value, e_contact_editor_im->location); - break; - case PROP_USERNAME: - extract_info(e_contact_editor_im); - g_value_set_string (value, e_contact_editor_im->username); - break; - case PROP_EDITABLE: - g_value_set_boolean (value, e_contact_editor_im->editable ? TRUE : FALSE); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -fill_in_field(EContactEditorIm *editor, char *field, char *string) -{ - GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field)); - if (entry) { - if (string) - gtk_entry_set_text(entry, string); - else - gtk_entry_set_text(entry, ""); - } -} - -static void -fill_in_info(EContactEditorIm *editor) -{ - GtkWidget *optmenu; - - fill_in_field(editor, "entry-username", editor->username); - - optmenu = glade_xml_get_widget(editor->gui, "optmenu-service"); - - if (optmenu != NULL) - gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), editor->service - FIRST_IM_TYPE); - - optmenu = glade_xml_get_widget(editor->gui, "optmenu-location"); - - if (optmenu != NULL) - gtk_option_menu_set_history(GTK_OPTION_MENU(optmenu), - (editor->location == NULL ? 2 : - !strcmp(editor->location, "WORK") ? 1 : 0)); -} - -static char * -extract_field(EContactEditorIm *editor, char *field) -{ - GtkEntry *entry = GTK_ENTRY(glade_xml_get_widget(editor->gui, field)); - if (entry) - return g_strdup (gtk_entry_get_text(entry)); - else - return NULL; -} - -static void -extract_info(EContactEditorIm *editor) -{ - if (editor->username != NULL) - g_free(editor->username); - - editor->username = extract_field(editor, "entry-username"); - - /* - * NOTE: We don't need to handle the option menus. - * These are set by the callbacks. - */ -} diff --git a/addressbook/gui/contact-editor/e-contact-editor-im.h b/addressbook/gui/contact-editor/e-contact-editor-im.h deleted file mode 100644 index da5bd652b2..0000000000 --- a/addressbook/gui/contact-editor/e-contact-editor-im.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-editor-add-im.h - * Copyright (C) 2003 Ximian, Inc. - * Author: Christian Hammond <chipx86@gnupdate.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_CONTACT_EDITOR_IM_H__ -#define __E_CONTACT_EDITOR_IM_H__ - -#include <gtk/gtkdialog.h> -#include <glade/glade.h> -#include <libebook/e-contact.h> - -G_BEGIN_DECLS - -/* EContactEditorIm - A dialog allowing the user to add an IM account to a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - * service EContactField RW The field of the IM service. - * location char * RW The location type. - * username char * RW The username of the account. - */ - -#define E_TYPE_CONTACT_EDITOR_IM (e_contact_editor_im_get_type ()) -#define E_CONTACT_EDITOR_IM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CONTACT_EDITOR_IM, EContactEditorIm)) -#define E_CONTACT_EDITOR_IM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CONTACT_EDITOR_IM, EContactEditorImClass)) -#define E_IS_CONTACT_EDITOR_IM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CONTACT_EDITOR_IM)) -#define E_IS_CONTACT_EDITOR_IM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_CONTACT_EDITOR_IM)) - - -typedef struct _EContactEditorIm EContactEditorIm; -typedef struct _EContactEditorImClass EContactEditorImClass; - -struct _EContactEditorIm -{ - GtkDialog parent; - - /* item specific fields */ - EContactField service; - char *location; - char *username; - GladeXML *gui; - - /* Whether the dialog will accept modifications */ - guint editable : 1; -}; - -struct _EContactEditorImClass -{ - GtkDialogClass parent_class; -}; - - -GtkWidget *e_contact_editor_im_new(EContactField service, const char *location, const char *username); -GType e_contact_editor_im_get_type (void); - -G_END_DECLS - -#endif /* __E_CONTACT_EDITOR_IM_H__ */ - diff --git a/addressbook/gui/contact-editor/e-contact-editor-marshal.list b/addressbook/gui/contact-editor/e-contact-editor-marshal.list deleted file mode 100644 index 58b2640de5..0000000000 --- a/addressbook/gui/contact-editor/e-contact-editor-marshal.list +++ /dev/null @@ -1,2 +0,0 @@ -NONE:INT,OBJECT -NONE:NONE diff --git a/addressbook/gui/contact-editor/e-contact-editor.c b/addressbook/gui/contact-editor/e-contact-editor.c deleted file mode 100644 index c21e78c6a2..0000000000 --- a/addressbook/gui/contact-editor/e-contact-editor.c +++ /dev/null @@ -1,3397 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-contact-editor.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> - -#include "eab-editor.h" -#include "e-contact-editor.h" - -#include <string.h> -#include <time.h> -#include <gtk/gtkcheckbutton.h> -#include <gtk/gtkcheckmenuitem.h> -#include <gtk/gtkcombo.h> -#include <gtk/gtktextview.h> -#include <gtk/gtkmessagedialog.h> -#include <gtk/gtkstock.h> -#include <gtk/gtkentry.h> -#include <gtk/gtklabel.h> -#include <libgnomeui/gnome-window-icon.h> -#include <libgnome/gnome-util.h> -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-help.h> - -#include <gdk-pixbuf/gdk-pixbuf.h> -#include <gal/widgets/e-categories.h> -#include <gal/widgets/e-gui-utils.h> -#include <gal/e-text/e-entry.h> - -#include <libebook/e-address-western.h> -#include <libedataserverui/e-source-option-menu.h> - -#include <e-util/e-categories-master-list-wombat.h> - -#include <camel/camel.h> - -#include "addressbook/gui/component/addressbook.h" -#include "addressbook/printing/e-contact-print.h" -#include "addressbook/printing/e-contact-print-envelope.h" -#include "addressbook/gui/widgets/eab-gui-util.h" -#include "e-util/e-gui-utils.h" -#include "widgets/misc/e-error.h" -#include "widgets/misc/e-dateedit.h" -#include "widgets/misc/e-image-chooser.h" -#include "widgets/misc/e-url-entry.h" -#include "shell/evolution-shell-component-utils.h" -#include "e-util/e-icon-factory.h" - -#include "eab-contact-merging.h" - -#include "e-contact-editor-address.h" -#include "e-contact-editor-im.h" -#include "e-contact-editor-fullname.h" -#include "e-contact-editor-marshal.h" - -#define EMAIL_SLOTS 4 -#define PHONE_SLOTS 8 -#define IM_SLOTS 4 -#define ADDRESS_SLOTS 3 - -#define EVOLUTION_UI_SLOT_PARAM "X-EVOLUTION-UI-SLOT" - -/* IM columns */ -enum { - COLUMN_IM_ICON, - COLUMN_IM_SERVICE, - COLUMN_IM_SCREENNAME, - COLUMN_IM_LOCATION, - COLUMN_IM_LOCATION_TYPE, - COLUMN_IM_SERVICE_FIELD, - NUM_IM_COLUMNS -}; - - -static void e_contact_editor_init (EContactEditor *editor); -static void e_contact_editor_class_init (EContactEditorClass *klass); -static void e_contact_editor_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_contact_editor_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void e_contact_editor_dispose (GObject *object); - -static void e_contact_editor_raise (EABEditor *editor); -static void e_contact_editor_show (EABEditor *editor); -static void e_contact_editor_save_contact (EABEditor *editor, gboolean should_close); -static void e_contact_editor_close (EABEditor *editor); -static gboolean e_contact_editor_is_valid (EABEditor *editor); -static gboolean e_contact_editor_is_changed (EABEditor *editor); -static GtkWindow* e_contact_editor_get_window (EABEditor *editor); - -static void save_contact (EContactEditor *ce, gboolean should_close); -static void entry_activated (EContactEditor *editor); - -static void set_entry_text(EContactEditor *editor, GtkEntry *entry, const char *string); - -static EABEditorClass *parent_class = NULL; - -/* The arguments we take */ -enum { - PROP_0, - PROP_SOURCE_BOOK, - PROP_TARGET_BOOK, - PROP_CONTACT, - PROP_IS_NEW_CONTACT, - PROP_EDITABLE, - PROP_CHANGED, - PROP_WRITABLE_FIELDS -}; - -enum { - DYNAMIC_LIST_EMAIL, - DYNAMIC_LIST_PHONE, - DYNAMIC_LIST_ADDRESS -}; - -static struct { - EContactField field_id; - const gchar *type_1; - const gchar *type_2; -} -phones [] = { - { E_CONTACT_PHONE_ASSISTANT, EVC_X_ASSISTANT, NULL }, - { E_CONTACT_PHONE_BUSINESS, "WORK", "VOICE" }, - { E_CONTACT_PHONE_BUSINESS_FAX, "WORK", "FAX" }, - { E_CONTACT_PHONE_CALLBACK, EVC_X_CALLBACK, NULL }, - { E_CONTACT_PHONE_CAR, "CAR", NULL }, - { E_CONTACT_PHONE_COMPANY, "X-EVOLUTION-COMPANY", NULL }, - { E_CONTACT_PHONE_HOME, "HOME", "VOICE" }, - { E_CONTACT_PHONE_HOME_FAX, "HOME", "FAX" }, - { E_CONTACT_PHONE_ISDN, "ISDN", NULL }, - { E_CONTACT_PHONE_MOBILE, "CELL", NULL }, - { E_CONTACT_PHONE_OTHER, "VOICE", NULL }, - { E_CONTACT_PHONE_OTHER_FAX, "FAX", NULL }, - { E_CONTACT_PHONE_PAGER, "PAGER", NULL }, - { E_CONTACT_PHONE_PRIMARY, "PREF", NULL }, - { E_CONTACT_PHONE_RADIO, EVC_X_RADIO, NULL }, - { E_CONTACT_PHONE_TELEX, EVC_X_TELEX, NULL }, - { E_CONTACT_PHONE_TTYTDD, EVC_X_TTYTDD, NULL } -}; - -/* Defaults from the table above */ -gint phones_default [] = { 1, 6, 9, 2, 7, 12, 10, 10 }; - -static EContactField addresses [] = { - E_CONTACT_ADDRESS_WORK, - E_CONTACT_ADDRESS_HOME, - E_CONTACT_ADDRESS_OTHER -}; - -static EContactField address_labels [] = { - E_CONTACT_ADDRESS_LABEL_WORK, - E_CONTACT_ADDRESS_LABEL_HOME, - E_CONTACT_ADDRESS_LABEL_OTHER -}; - -static gchar *address_name [] = { - "work", - "home", - "other" -}; - -static struct { - EContactField field; - gchar *pretty_name; -} -im_service [] = -{ - { E_CONTACT_IM_AIM, N_ ("AIM") }, - { E_CONTACT_IM_JABBER, N_ ("Jabber") }, - { E_CONTACT_IM_YAHOO, N_ ("Yahoo") }, - { E_CONTACT_IM_MSN, N_ ("MSN") }, - { E_CONTACT_IM_ICQ, N_ ("ICQ") }, - { E_CONTACT_IM_GROUPWISE, N_ ("GroupWise") } -}; - -/* Defaults from the table above */ -gint im_service_default [] = { 0, 2, 4, 5 }; - -static struct { - gchar *name; - gchar *pretty_name; -} -common_location [] = -{ - { "WORK", N_ ("Work") }, - { "HOME", N_ ("Home") }, - { "OTHER", N_ ("Other") } -}; - -/* Default from the table above */ -gint email_default [] = { 0, 1, 2, 2 }; - -#define STRING_IS_EMPTY(x) (!(x) || !(*(x))) -#define STRING_MAKE_NON_NULL(x) ((x) ? (x) : "") - -GType -e_contact_editor_get_type (void) -{ - static GType contact_editor_type = 0; - - if (!contact_editor_type) { - static const GTypeInfo contact_editor_info = { - sizeof (EContactEditorClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_contact_editor_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EContactEditor), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_contact_editor_init, - }; - - contact_editor_type = g_type_register_static (EAB_TYPE_EDITOR, "EContactEditor", &contact_editor_info, 0); - } - - return contact_editor_type; -} - -static void -e_contact_editor_class_init (EContactEditorClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - EABEditorClass *editor_class = EAB_EDITOR_CLASS (klass); - - parent_class = g_type_class_ref (EAB_TYPE_EDITOR); - - object_class->set_property = e_contact_editor_set_property; - object_class->get_property = e_contact_editor_get_property; - object_class->dispose = e_contact_editor_dispose; - - editor_class->raise = e_contact_editor_raise; - editor_class->show = e_contact_editor_show; - editor_class->close = e_contact_editor_close; - editor_class->is_valid = e_contact_editor_is_valid; - editor_class->save_contact = e_contact_editor_save_contact; - editor_class->is_changed = e_contact_editor_is_changed; - editor_class->get_window = e_contact_editor_get_window; - - g_object_class_install_property (object_class, PROP_SOURCE_BOOK, - g_param_spec_object ("source_book", - _("Source Book"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_BOOK, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_TARGET_BOOK, - g_param_spec_object ("target_book", - _("Target Book"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_BOOK, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_CONTACT, - g_param_spec_object ("contact", - _("Contact"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_CONTACT, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_IS_NEW_CONTACT, - g_param_spec_boolean ("is_new_contact", - _("Is New Contact"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_WRITABLE_FIELDS, - g_param_spec_object ("writable_fields", - _("Writable Fields"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_LIST, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EDITABLE, - g_param_spec_boolean ("editable", - _("Editable"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_CHANGED, - g_param_spec_boolean ("changed", - _("Changed"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); -} - -static void -entry_activated (EContactEditor *editor) -{ - save_contact (editor, TRUE); -} - -/* FIXME: Linear time... */ -static gboolean -is_field_supported (EContactEditor *editor, EContactField field_id) -{ - EList *fields; - const gchar *field; - EIterator *iter; - - fields = editor->writable_fields; - if (!fields) - return FALSE; - - field = e_contact_field_name (field_id); - if (!field) - return FALSE; - - for (iter = e_list_get_iterator (fields); - e_iterator_is_valid (iter); - e_iterator_next (iter)) { - const gchar *this_field = e_iterator_get (iter); - - if (!this_field) - continue; - - if (!strcmp (field, this_field)) - return TRUE; - } - - return FALSE; -} - -/* This function tells you whether name_to_style will make sense. */ -static gboolean -style_makes_sense (const EContactName *name, const gchar *company, int style) -{ - switch (style) { - case 0: /* Fall Through */ - case 1: - return TRUE; - case 2: - if (company && *company) - return TRUE; - else - return FALSE; - case 3: /* Fall Through */ - case 4: - if (company && *company && name && ((name->given && *name->given) || (name->family && *name->family))) - return TRUE; - else - return FALSE; - default: - return FALSE; - } -} - -static char * -name_to_style (const EContactName *name, const gchar *company, int style) -{ - char *string; - char *strings[4], **stringptr; - char *substring; - switch (style) { - case 0: - stringptr = strings; - if (name) { - if (name->family && *name->family) - *(stringptr++) = name->family; - if (name->given && *name->given) - *(stringptr++) = name->given; - } - *stringptr = NULL; - string = g_strjoinv(", ", strings); - break; - case 1: - stringptr = strings; - if (name) { - if (name->given && *name->given) - *(stringptr++) = name->given; - if (name->family && *name->family) - *(stringptr++) = name->family; - } - *stringptr = NULL; - string = g_strjoinv(" ", strings); - break; - case 2: - string = g_strdup(company); - break; - case 3: /* Fall Through */ - case 4: - stringptr = strings; - if (name) { - if (name->family && *name->family) - *(stringptr++) = name->family; - if (name->given && *name->given) - *(stringptr++) = name->given; - } - *stringptr = NULL; - substring = g_strjoinv(", ", strings); - if (!(company && *company)) - company = ""; - if (style == 3) - string = g_strdup_printf("%s (%s)", substring, company); - else - string = g_strdup_printf("%s (%s)", company, substring); - g_free(substring); - break; - default: - string = g_strdup(""); - } - return string; -} - -static int -file_as_get_style (EContactEditor *editor) -{ - GtkEntry *file_as = GTK_ENTRY(glade_xml_get_widget(editor->gui, "entry-file-as")); - GtkEntry *company_w = GTK_ENTRY (glade_xml_get_widget (editor->gui, "entry-company")); - char *filestring; - char *trystring; - EContactName *name = editor->name; - const gchar *company; - int i; - int style; - - if (!(file_as && GTK_IS_ENTRY(file_as))) - return -1; - - company = gtk_entry_get_text (GTK_ENTRY (company_w)); - filestring = g_strdup (gtk_entry_get_text (file_as)); - - style = -1; - for (i = 0; i < 5; i++) { - trystring = name_to_style (name, company, i); - if (!strcmp(trystring, filestring)) { - g_free(trystring); - g_free(filestring); - return i; - } - g_free(trystring); - } - g_free (filestring); - return -1; -} - -static void -file_as_set_style (EContactEditor *editor, int style) -{ - char *string; - int i; - GList *strings = NULL; - GtkEntry *file_as = GTK_ENTRY (glade_xml_get_widget (editor->gui, "entry-file-as")); - GtkEntry *company_w = GTK_ENTRY (glade_xml_get_widget (editor->gui, "entry-company")); - GtkWidget *widget; - const gchar *company; - - if (!(file_as && GTK_IS_ENTRY (file_as))) - return; - - company = gtk_entry_get_text (GTK_ENTRY (company_w)); - - if (style == -1) { - string = g_strdup (gtk_entry_get_text(file_as)); - strings = g_list_append (strings, string); - } - - widget = glade_xml_get_widget (editor->gui, "combo-file-as"); - - for (i = 0; i < 5; i++) { - if (style_makes_sense (editor->name, company, i)) { - char *u; - u = name_to_style (editor->name, company, i); - if (!STRING_IS_EMPTY (u)) - strings = g_list_append (strings, u); - else - g_free (u); - } - } - - if (widget && GTK_IS_COMBO (widget)) { - GtkCombo *combo = GTK_COMBO (widget); - gtk_combo_set_popdown_strings (combo, strings); - g_list_foreach (strings, (GFunc) g_free, NULL); - g_list_free (strings); - } - - if (style != -1) { - string = name_to_style (editor->name, company, style); - set_entry_text (editor, file_as, string); - g_free (string); - } -} - -static void -name_entry_changed (GtkWidget *widget, EContactEditor *editor) -{ - int style = 0; - const char *string; - - style = file_as_get_style (editor); - e_contact_name_free (editor->name); - string = gtk_entry_get_text (GTK_ENTRY (widget)); - editor->name = e_contact_name_from_string (string); - file_as_set_style (editor, style); -} - -static void -file_as_entry_changed (GtkWidget *widget, EContactEditor *editor) -{ - char *string = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1); - char *title; - - if (string && *string) - title = string; - else - title = _("Contact Editor"); - - gtk_window_set_title (GTK_WINDOW (editor->app), title); - g_free (string); -} - -static void -company_entry_changed (GtkWidget *widget, EContactEditor *editor) -{ - int style = 0; - - style = file_as_get_style (editor); - file_as_set_style (editor, style); -} - -static void -update_file_as_combo (EContactEditor *editor) -{ - file_as_set_style (editor, file_as_get_style (editor)); -} - -static void -fill_in_source_field (EContactEditor *editor) -{ - GtkWidget *source_menu; - ESource *source; - - if (!editor->target_book) - return; - - source_menu = glade_xml_get_widget (editor->gui, "source-option-menu-source"); - source = e_book_get_source (editor->target_book); - - e_source_option_menu_select (E_SOURCE_OPTION_MENU (source_menu), source); -} - -static void -sensitize_ok (EContactEditor *ce) -{ - GtkWidget *widget; - gboolean allow_save; - - allow_save = ce->target_editable && ce->changed ? TRUE : FALSE; - - widget = glade_xml_get_widget (ce->gui, "button-ok"); - gtk_widget_set_sensitive (widget, allow_save); -} - -static void -object_changed (GObject *object, EContactEditor *editor) -{ - if (!editor->target_editable) { - g_warning ("non-editable contact editor has an editable field in it."); - return; - } - - if (!editor->changed) { - editor->changed = TRUE; - sensitize_ok (editor); - } -} - -static void -image_chooser_changed (GtkWidget *widget, EContactEditor *editor) -{ - editor->image_set = TRUE; -} - -static void -set_entry_text (EContactEditor *editor, GtkEntry *entry, const gchar *string) -{ - const char *oldstring = gtk_entry_get_text (entry); - - if (!string) - string = ""; - - if (strcmp (string, oldstring)) { - g_signal_handlers_block_matched (entry, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, editor); - gtk_entry_set_text (entry, string); - g_signal_handlers_unblock_matched (entry, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, editor); - } -} - -static void -set_option_menu_history (EContactEditor *editor, GtkOptionMenu *option_menu, gint history) -{ - g_signal_handlers_block_matched (option_menu, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, editor); - gtk_option_menu_set_history (option_menu, history); - g_signal_handlers_unblock_matched (option_menu, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, editor); -} - -static void -init_email_record_location (EContactEditor *editor, gint record) -{ - GtkWidget *location_option_menu; - GtkWidget *location_menu; - GtkWidget *email_entry; - gchar *widget_name; - gint i; - - widget_name = g_strdup_printf ("entry-email-%d", record); - email_entry = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - widget_name = g_strdup_printf ("optionmenu-email-%d", record); - location_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - location_menu = gtk_menu_new (); - - for (i = 0; i < G_N_ELEMENTS (common_location); i++) { - GtkWidget *item; - - item = gtk_menu_item_new_with_label (common_location [i].pretty_name); - gtk_menu_shell_append (GTK_MENU_SHELL (location_menu), item); - } - - gtk_widget_show_all (location_menu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (location_option_menu), location_menu); - - g_signal_connect (location_option_menu, "changed", G_CALLBACK (object_changed), editor); - g_signal_connect (email_entry, "changed", G_CALLBACK (object_changed), editor); - g_signal_connect_swapped (email_entry, "activate", G_CALLBACK (entry_activated), editor); -} - -static void -init_email (EContactEditor *editor) -{ - gint i; - - for (i = 1; i <= EMAIL_SLOTS; i++) - init_email_record_location (editor, i); -} - -static void -fill_in_email_record (EContactEditor *editor, gint record, const gchar *address, gint location) -{ - GtkWidget *location_option_menu; - GtkWidget *email_entry; - gchar *widget_name; - - widget_name = g_strdup_printf ("optionmenu-email-%d", record); - location_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - widget_name = g_strdup_printf ("entry-email-%d", record); - email_entry = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - set_option_menu_history (editor, GTK_OPTION_MENU (location_option_menu), - location >= 0 ? location : email_default [record - 1]); - set_entry_text (editor, GTK_ENTRY (email_entry), address ? address : ""); -} - -static void -extract_email_record (EContactEditor *editor, gint record, gchar **address, gint *location) -{ - GtkWidget *location_option_menu; - GtkWidget *email_entry; - gchar *widget_name; - - widget_name = g_strdup_printf ("optionmenu-email-%d", record); - location_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - widget_name = g_strdup_printf ("entry-email-%d", record); - email_entry = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - *address = g_strdup (gtk_entry_get_text (GTK_ENTRY (email_entry))); - *location = gtk_option_menu_get_history (GTK_OPTION_MENU (location_option_menu)); -} - -static const gchar * -email_index_to_location (gint index) -{ - return common_location [index].name; -} - -static const gchar * -im_index_to_location (gint index) -{ - return common_location [index].name; -} - -static void -phone_index_to_type (gint index, const gchar **type_1, const gchar **type_2) -{ - *type_1 = phones [index].type_1; - *type_2 = phones [index].type_2; -} - -static gint -get_email_location (EVCardAttribute *attr) -{ - gint i; - - for (i = 0; i < G_N_ELEMENTS (common_location); i++) { - if (e_vcard_attribute_has_type (attr, common_location [i].name)) - return i; - } - - return -1; -} - -static gint -get_im_location (EVCardAttribute *attr) -{ - gint i; - - for (i = 0; i < G_N_ELEMENTS (common_location); i++) { - if (e_vcard_attribute_has_type (attr, common_location [i].name)) - return i; - } - - return -1; -} - -static gint -get_phone_type (EVCardAttribute *attr) -{ - gint i; - - for (i = 0; i < G_N_ELEMENTS (phones); i++) { - if (e_vcard_attribute_has_type (attr, phones [i].type_1) && - (phones [i].type_2 == NULL || e_vcard_attribute_has_type (attr, phones [i].type_2))) - return i; - } - - return -1; -} - -static EVCardAttributeParam * -get_ui_slot_param (EVCardAttribute *attr) -{ - EVCardAttributeParam *param = NULL; - GList *param_list; - GList *l; - - param_list = e_vcard_attribute_get_params (attr); - - for (l = param_list; l; l = g_list_next (l)) { - const gchar *str; - - param = l->data; - - str = e_vcard_attribute_param_get_name (param); - if (!strcasecmp (str, EVOLUTION_UI_SLOT_PARAM)) - break; - - param = NULL; - } - - return param; -} - -static gint -get_ui_slot (EVCardAttribute *attr) -{ - EVCardAttributeParam *param; - gint slot = -1; - - param = get_ui_slot_param (attr); - - if (param) { - GList *value_list; - - value_list = e_vcard_attribute_param_get_values (param); - slot = atoi (value_list->data); - } - - return slot; -} - -static void -set_ui_slot (EVCardAttribute *attr, gint slot) -{ - EVCardAttributeParam *param; - gchar *slot_str; - - param = get_ui_slot_param (attr); - if (!param) { - param = e_vcard_attribute_param_new (EVOLUTION_UI_SLOT_PARAM); - e_vcard_attribute_add_param (attr, param); - } - - e_vcard_attribute_param_remove_values (param); - - slot_str = g_strdup_printf ("%d", slot); - e_vcard_attribute_param_add_value (param, slot_str); - g_free (slot_str); -} - -static gint -alloc_ui_slot (EContactEditor *editor, const gchar *widget_base, gint preferred_slot, gint num_slots) -{ - gchar *widget_name; - GtkWidget *widget; - const gchar *entry_contents; - gint i; - - /* See if we can get the preferred slot */ - - if (preferred_slot >= 1) { - widget_name = g_strdup_printf ("%s-%d", widget_base, preferred_slot); - widget = glade_xml_get_widget (editor->gui, widget_name); - entry_contents = gtk_entry_get_text (GTK_ENTRY (widget)); - g_free (widget_name); - - if (STRING_IS_EMPTY (entry_contents)) - return preferred_slot; - } - - /* Find first empty slot */ - - for (i = 1; i <= num_slots; i++) { - widget_name = g_strdup_printf ("%s-%d", widget_base, i); - widget = glade_xml_get_widget (editor->gui, widget_name); - entry_contents = gtk_entry_get_text (GTK_ENTRY (widget)); - g_free (widget_name); - - if (STRING_IS_EMPTY (entry_contents)) - return i; - } - - return -1; -} - -static void -free_attr_list (GList *attr_list) -{ - GList *l; - - for (l = attr_list; l; l = g_list_next (l)) { - EVCardAttribute *attr = l->data; - e_vcard_attribute_free (attr); - } - - g_list_free (attr_list); -} - -static void -fill_in_email (EContactEditor *editor) -{ - GList *email_attr_list; - GList *l; - gint record_n; - - /* Clear */ - - for (record_n = 1; record_n <= EMAIL_SLOTS; record_n++) { - fill_in_email_record (editor, record_n, NULL, -1); - } - - /* Fill in */ - - email_attr_list = e_contact_get_attributes (editor->contact, E_CONTACT_EMAIL); - - for (record_n = 1, l = email_attr_list; l && record_n <= EMAIL_SLOTS; l = g_list_next (l)) { - EVCardAttribute *attr = l->data; - gchar *email_address; - gint slot; - - email_address = e_vcard_attribute_get_value (attr); - slot = alloc_ui_slot (editor, "entry-email", get_ui_slot (attr), EMAIL_SLOTS); - if (slot < 1) - break; - - fill_in_email_record (editor, slot, email_address, - get_email_location (attr)); - - record_n++; - } -} - -static void -extract_email (EContactEditor *editor) -{ - GList *attr_list = NULL; - GList *old_attr_list; - GList *l, *l_next; - gint i; - - for (i = 1; i <= EMAIL_SLOTS; i++) { - gchar *address; - gint location; - - extract_email_record (editor, i, &address, &location); - - if (!STRING_IS_EMPTY (address)) { - EVCardAttribute *attr; - attr = e_vcard_attribute_new ("", e_contact_vcard_attribute (E_CONTACT_EMAIL)); - - if (location >= 0) - e_vcard_attribute_add_param_with_value (attr, - e_vcard_attribute_param_new (EVC_TYPE), - email_index_to_location (location)); - - e_vcard_attribute_add_value (attr, address); - set_ui_slot (attr, i); - - attr_list = g_list_append (attr_list, attr); - } - - g_free (address); - } - - /* Splice in the old attributes, minus the EMAIL_SLOTS first */ - - old_attr_list = e_contact_get_attributes (editor->contact, E_CONTACT_EMAIL); - for (l = old_attr_list, i = 1; l && i <= EMAIL_SLOTS; l = l_next, i++) { - l_next = g_list_next (l); - - e_vcard_attribute_free (l->data); - g_list_delete_link (l, l); - } - - old_attr_list = l; - attr_list = g_list_concat (attr_list, old_attr_list); - - e_contact_set_attributes (editor->contact, E_CONTACT_EMAIL, attr_list); - - free_attr_list (attr_list); -} - -static void -sensitize_email_record (EContactEditor *editor, gint record, gboolean enabled) -{ - GtkWidget *location_option_menu; - GtkWidget *email_entry; - gchar *widget_name; - - widget_name = g_strdup_printf ("optionmenu-email-%d", record); - location_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - widget_name = g_strdup_printf ("entry-email-%d", record); - email_entry = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - gtk_widget_set_sensitive (location_option_menu, enabled); - gtk_editable_set_editable (GTK_EDITABLE (email_entry), enabled); -} - -static void -sensitize_email (EContactEditor *editor) -{ - gint i; - - for (i = 1; i <= EMAIL_SLOTS; i++) { - gboolean enabled = TRUE; - - if (!editor->target_editable) - enabled = FALSE; - - if (E_CONTACT_FIRST_EMAIL_ID + i - 1 <= E_CONTACT_LAST_EMAIL_ID && - !is_field_supported (editor, E_CONTACT_FIRST_EMAIL_ID + i - 1)) - enabled = FALSE; - - sensitize_email_record (editor, i, enabled); - } -} - -/* EContact can get attributes by field ID only, and there is none for TEL, so we need this */ -static GList * -get_attributes_named (EVCard *vcard, const gchar *attr_name) -{ - GList *attr_list_in; - GList *attr_list_out = NULL; - GList *l; - - attr_list_in = e_vcard_get_attributes (vcard); - - for (l = attr_list_in; l; l = g_list_next (l)) { - EVCardAttribute *attr = l->data; - const gchar *name; - - name = e_vcard_attribute_get_name (attr); - - if (!strcasecmp (attr_name, name)) { - attr_list_out = g_list_append (attr_list_out, e_vcard_attribute_copy (attr)); - } - } - - return attr_list_out; -} - -/* EContact can set attributes by field ID only, and there is none for TEL, so we need this */ -static void -set_attributes_named (EVCard *vcard, const gchar *attr_name, GList *attr_list) -{ - GList *l; - - e_vcard_remove_attributes (vcard, NULL, attr_name); - - for (l = attr_list; l; l = g_list_next (l)) { - EVCardAttribute *attr = l->data; - - e_vcard_add_attribute (vcard, e_vcard_attribute_copy (attr)); - } -} - -static void -expand_phone (EContactEditor *editor, gboolean expanded) -{ - GtkWidget *phone_ext_table; - GtkWidget *phone_ext_arrow; - - phone_ext_table = glade_xml_get_widget (editor->gui, "table-phone-extended"); - phone_ext_arrow = glade_xml_get_widget (editor->gui, "arrow-phone-expand"); - - if (expanded) { - gtk_arrow_set (GTK_ARROW (phone_ext_arrow), GTK_ARROW_DOWN, GTK_SHADOW_NONE); - gtk_widget_show (phone_ext_table); - } else { - gtk_arrow_set (GTK_ARROW (phone_ext_arrow), GTK_ARROW_RIGHT, GTK_SHADOW_NONE); - gtk_widget_hide (phone_ext_table); - } -} - -static void -fill_in_phone_record (EContactEditor *editor, gint record, const gchar *phone, gint phone_type) -{ - GtkWidget *phone_type_option_menu; - GtkWidget *phone_entry; - gchar *widget_name; - - widget_name = g_strdup_printf ("optionmenu-phone-%d", record); - phone_type_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - widget_name = g_strdup_printf ("entry-phone-%d", record); - phone_entry = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - set_option_menu_history (editor, GTK_OPTION_MENU (phone_type_option_menu), - phone_type >= 0 ? phone_type : - phones_default [record - 1]); - set_entry_text (editor, GTK_ENTRY (phone_entry), phone ? phone : ""); - - if (phone && *phone && record >= 5) - expand_phone (editor, TRUE); -} - -static void -extract_phone_record (EContactEditor *editor, gint record, gchar **phone, gint *phone_type) -{ - GtkWidget *phone_type_option_menu; - GtkWidget *phone_entry; - gchar *widget_name; - - widget_name = g_strdup_printf ("optionmenu-phone-%d", record); - phone_type_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - widget_name = g_strdup_printf ("entry-phone-%d", record); - phone_entry = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - *phone = g_strdup (gtk_entry_get_text (GTK_ENTRY (phone_entry))); - *phone_type = gtk_option_menu_get_history (GTK_OPTION_MENU (phone_type_option_menu)); -} - -static void -fill_in_phone (EContactEditor *editor) -{ - GList *phone_attr_list; - GList *l; - gint record_n; - - /* Clear */ - - for (record_n = 1; record_n <= PHONE_SLOTS; record_n++) { - fill_in_phone_record (editor, record_n, NULL, -1); - } - - /* Fill in */ - - phone_attr_list = get_attributes_named (E_VCARD (editor->contact), "TEL"); - - for (record_n = 1, l = phone_attr_list; l && record_n <= PHONE_SLOTS; l = g_list_next (l)) { - EVCardAttribute *attr = l->data; - gchar *phone; - gint slot; - - phone = e_vcard_attribute_get_value (attr); - slot = alloc_ui_slot (editor, "entry-phone", get_ui_slot (attr), PHONE_SLOTS); - if (slot < 1) - break; - - fill_in_phone_record (editor, slot, phone, - get_phone_type (attr)); - - record_n++; - } -} - -static void -extract_phone (EContactEditor *editor) -{ - GList *attr_list = NULL; - GList *old_attr_list; - GList *l, *l_next; - gint i; - - for (i = 1; i <= PHONE_SLOTS; i++) { - gchar *phone; - gint phone_type; - - extract_phone_record (editor, i, &phone, &phone_type); - - if (!STRING_IS_EMPTY (phone)) { - EVCardAttribute *attr; - - attr = e_vcard_attribute_new ("", "TEL"); - - if (phone_type >= 0) { - const gchar *type_1; - const gchar *type_2; - - phone_index_to_type (phone_type, &type_1, &type_2); - - e_vcard_attribute_add_param_with_value ( - attr, e_vcard_attribute_param_new (EVC_TYPE), type_1); - - if (type_2) - e_vcard_attribute_add_param_with_value ( - attr, e_vcard_attribute_param_new (EVC_TYPE), type_2); - - } - - e_vcard_attribute_add_value (attr, phone); - set_ui_slot (attr, i); - - attr_list = g_list_append (attr_list, attr); - } - - g_free (phone); - } - - /* Splice in the old attributes, minus the PHONE_SLOTS first */ - - old_attr_list = get_attributes_named (E_VCARD (editor->contact), "TEL"); - for (l = old_attr_list, i = 1; l && i <= PHONE_SLOTS; l = l_next, i++) { - l_next = g_list_next (l); - - e_vcard_attribute_free (l->data); - g_list_delete_link (l, l); - } - - old_attr_list = l; - attr_list = g_list_concat (attr_list, old_attr_list); - - set_attributes_named (E_VCARD (editor->contact), "TEL", attr_list); - - free_attr_list (attr_list); -} - -static void -init_phone_record_type (EContactEditor *editor, gint record) -{ - GtkWidget *phone_type_option_menu; - GtkWidget *phone_type_menu; - GtkWidget *phone_entry; - gchar *widget_name; - gint i; - - widget_name = g_strdup_printf ("entry-phone-%d", record); - phone_entry = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - widget_name = g_strdup_printf ("optionmenu-phone-%d", record); - phone_type_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - phone_type_menu = gtk_menu_new (); - - for (i = 0; i < G_N_ELEMENTS (phones); i++) { - GtkWidget *item; - - item = gtk_menu_item_new_with_label (e_contact_pretty_name (phones [i].field_id)); - gtk_menu_shell_append (GTK_MENU_SHELL (phone_type_menu), item); - } - - gtk_widget_show_all (phone_type_menu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (phone_type_option_menu), phone_type_menu); - - g_signal_connect (phone_type_option_menu, "changed", G_CALLBACK (object_changed), editor); - g_signal_connect (phone_entry, "changed", G_CALLBACK (object_changed), editor); - g_signal_connect_swapped (phone_entry, "activate", G_CALLBACK (entry_activated), editor); -} - -static void -init_phone (EContactEditor *editor) -{ - gint i; - - expand_phone (editor, FALSE); - - for (i = 1; i <= PHONE_SLOTS; i++) - init_phone_record_type (editor, i); -} - -static void -sensitize_phone_types (EContactEditor *editor, GtkWidget *option_menu) -{ - GtkWidget *menu; - GList *item_list, *l; - gint i; - - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (option_menu)); - l = item_list = gtk_container_get_children (GTK_CONTAINER (menu)); - - for (i = 0; i < G_N_ELEMENTS (phones); i++) { - GtkWidget *widget; - - if (!l) { - g_warning (G_STRLOC ": Unexpected end of phone items in option menu"); - return; - } - - widget = l->data; - gtk_widget_set_sensitive (widget, is_field_supported (editor, phones [i].field_id)); - - l = g_list_next (l); - } -} - -static void -sensitize_phone_record (EContactEditor *editor, gint record, gboolean enabled) -{ - GtkWidget *phone_type_option_menu; - GtkWidget *phone_entry; - gchar *widget_name; - - widget_name = g_strdup_printf ("optionmenu-phone-%d", record); - phone_type_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - widget_name = g_strdup_printf ("entry-phone-%d", record); - phone_entry = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - gtk_widget_set_sensitive (phone_type_option_menu, enabled); - gtk_editable_set_editable (GTK_EDITABLE (phone_entry), enabled); - - sensitize_phone_types (editor, phone_type_option_menu); -} - -static void -sensitize_phone (EContactEditor *editor) -{ - gint i; - - for (i = 1; i <= PHONE_SLOTS; i++) { - gboolean enabled = TRUE; - - if (!editor->target_editable) - enabled = FALSE; - - sensitize_phone_record (editor, i, enabled); - } -} - -static void -init_im_record_location (EContactEditor *editor, gint record) -{ - GtkWidget *location_option_menu; - GtkWidget *location_menu; - GtkWidget *name_entry; - gchar *widget_name; - gint i; - - widget_name = g_strdup_printf ("entry-im-name-%d", record); - name_entry = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - -#ifdef ENABLE_IM_LOCATION - widget_name = g_strdup_printf ("optionmenu-im-location-%d", record); - location_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - location_menu = gtk_menu_new (); - - for (i = 0; i < G_N_ELEMENTS (common_location); i++) { - GtkWidget *item; - - item = gtk_menu_item_new_with_label (common_location [i].pretty_name); - gtk_menu_shell_append (GTK_MENU_SHELL (location_menu), item); - } - - gtk_widget_show_all (location_menu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (location_option_menu), location_menu); - - g_signal_connect (location_option_menu, "changed", G_CALLBACK (object_changed), editor); -#endif - - g_signal_connect (name_entry, "changed", G_CALLBACK (object_changed), editor); - g_signal_connect_swapped (name_entry, "activate", G_CALLBACK (entry_activated), editor); -} - -static void -init_im_record_service (EContactEditor *editor, gint record) -{ - GtkWidget *service_option_menu; - GtkWidget *service_menu; - gchar *widget_name; - gint i; - - widget_name = g_strdup_printf ("optionmenu-im-service-%d", record); - service_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - service_menu = gtk_menu_new (); - - for (i = 0; i < G_N_ELEMENTS (im_service); i++) { - GtkWidget *item; - - item = gtk_menu_item_new_with_label (im_service [i].pretty_name); - gtk_menu_shell_append (GTK_MENU_SHELL (service_menu), item); - } - - gtk_widget_show_all (service_menu); - gtk_option_menu_set_menu (GTK_OPTION_MENU (service_option_menu), service_menu); - - g_signal_connect (service_option_menu, "changed", G_CALLBACK (object_changed), editor); -} - -static void -init_im (EContactEditor *editor) -{ - gint i; - - for (i = 1; i <= IM_SLOTS; i++) { - init_im_record_service (editor, i); - init_im_record_location (editor, i); - } -} - -static void -fill_in_im_record (EContactEditor *editor, gint record, gint service, const gchar *name, gint location) -{ - GtkWidget *service_option_menu; -#ifdef ENABLE_IM_LOCATION - GtkWidget *location_option_menu; -#endif - GtkWidget *name_entry; - gchar *widget_name; - - widget_name = g_strdup_printf ("optionmenu-im-service-%d", record); - service_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - -#ifdef ENABLE_IM_LOCATION - widget_name = g_strdup_printf ("optionmenu-im-location-%d", record); - location_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); -#endif - - widget_name = g_strdup_printf ("entry-im-name-%d", record); - name_entry = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - -#ifdef ENABLE_IM_LOCATION - set_option_menu_history (editor, GTK_OPTION_MENU (location_option_menu), - location >= 0 ? location : 0); -#endif - set_option_menu_history (editor, GTK_OPTION_MENU (service_option_menu), - service >= 0 ? service : im_service_default [record - 1]); - set_entry_text (editor, GTK_ENTRY (name_entry), name ? name : ""); -} - -static void -fill_in_im (EContactEditor *editor) -{ - GList *im_attr_list; - GList *l; - gint record_n; - gint i; - - /* Clear */ - - for (record_n = 1 ; record_n <= IM_SLOTS; record_n++) { - fill_in_im_record (editor, record_n, -1, NULL, -1); - } - - /* Fill in */ - - for (record_n = 1, i = 0; i < G_N_ELEMENTS (im_service); i++) { - im_attr_list = e_contact_get_attributes (editor->contact, im_service [i].field); - - for (l = im_attr_list; l && record_n <= IM_SLOTS; l = g_list_next (l)) { - EVCardAttribute *attr = l->data; - gchar *im_name; - gint slot; - - im_name = e_vcard_attribute_get_value (attr); - slot = alloc_ui_slot (editor, "entry-im-name", get_ui_slot (attr), IM_SLOTS); - if (slot < 1) - break; - - fill_in_im_record (editor, slot, i, im_name, - get_im_location (attr)); - - record_n++; - } - } -} - -static void -extract_im_record (EContactEditor *editor, gint record, gint *service, gchar **name, gint *location) -{ - GtkWidget *service_option_menu; -#ifdef ENABLE_IM_LOCATION - GtkWidget *location_option_menu; -#endif - GtkWidget *name_entry; - gchar *widget_name; - - widget_name = g_strdup_printf ("optionmenu-im-service-%d", record); - service_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - -#ifdef ENABLE_IM_LOCATION - widget_name = g_strdup_printf ("optionmenu-im-location-%d", record); - location_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); -#endif - - widget_name = g_strdup_printf ("entry-im-name-%d", record); - name_entry = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - *name = g_strdup (gtk_entry_get_text (GTK_ENTRY (name_entry))); - *service = gtk_option_menu_get_history (GTK_OPTION_MENU (service_option_menu)); -#ifdef ENABLE_IM_LOCATION - *location = gtk_option_menu_get_history (GTK_OPTION_MENU (location_option_menu)); -#else - *location = 1; /* set everything to HOME */ -#endif -} - -static void -extract_im (EContactEditor *editor) -{ - GList **service_attr_list; - gint remaining_slots = IM_SLOTS; - gint i; - - service_attr_list = g_new0 (GList *, G_N_ELEMENTS (im_service)); - - for (i = 1; i <= IM_SLOTS; i++) { - EVCardAttribute *attr; - gchar *name; - gint service; - gint location; - - extract_im_record (editor, i, &service, &name, &location); - - if (!STRING_IS_EMPTY (name)) { - attr = e_vcard_attribute_new ("", e_contact_vcard_attribute (im_service [service].field)); - - if (location >= 0) - e_vcard_attribute_add_param_with_value (attr, - e_vcard_attribute_param_new (EVC_TYPE), - im_index_to_location (location)); - - e_vcard_attribute_add_value (attr, name); - set_ui_slot (attr, i); - - service_attr_list [service] = g_list_append (service_attr_list [service], attr); - } - - g_free (name); - } - - for (i = 0; i < G_N_ELEMENTS (im_service); i++) { - GList *old_service_attr_list; - gint filled_in_slots; - GList *l, *l_next; - gint j; - - /* Splice in the old attributes, minus the filled_in_slots first */ - - old_service_attr_list = e_contact_get_attributes (editor->contact, im_service [i].field); - filled_in_slots = MIN (remaining_slots, g_list_length (old_service_attr_list)); - remaining_slots -= filled_in_slots; - - for (l = old_service_attr_list, j = 0; l && j < filled_in_slots; l = l_next, j++) { - l_next = g_list_next (l); - - e_vcard_attribute_free (l->data); - g_list_delete_link (l, l); - } - - old_service_attr_list = l; - service_attr_list [i] = g_list_concat (service_attr_list [i], old_service_attr_list); - - e_contact_set_attributes (editor->contact, im_service [i].field, - service_attr_list [i]); - - free_attr_list (service_attr_list [i]); - } - - g_free (service_attr_list); -} - -static void -sensitize_im_record (EContactEditor *editor, gint record, gboolean enabled) -{ - GtkWidget *service_option_menu; -#ifdef ENABLE_IM_LOCATION - GtkWidget *location_option_menu; -#endif - GtkWidget *name_entry; - gchar *widget_name; - - widget_name = g_strdup_printf ("optionmenu-im-service-%d", record); - service_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - -#ifdef ENABLE_IM_LOCATION - widget_name = g_strdup_printf ("optionmenu-im-location-%d", record); - location_option_menu = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); -#endif - - widget_name = g_strdup_printf ("entry-im-name-%d", record); - name_entry = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - gtk_widget_set_sensitive (service_option_menu, enabled); -#ifdef ENABLE_IM_LOCATION - gtk_widget_set_sensitive (location_option_menu, enabled); -#endif - gtk_editable_set_editable (GTK_EDITABLE (name_entry), enabled); -} - -static void -sensitize_im (EContactEditor *editor) -{ - gint i; - - for (i = 1; i <= IM_SLOTS; i++) { - gboolean enabled = TRUE; - - if (!editor->target_editable) - enabled = FALSE; - - sensitize_im_record (editor, i, enabled); - } -} - -static void -init_address_textview (EContactEditor *editor, gint record) -{ - gchar *textview_name; - GtkWidget *textview; - GtkTextBuffer *text_buffer; - - textview_name = g_strdup_printf ("textview-%s-address", address_name [record]); - textview = glade_xml_get_widget (editor->gui, textview_name); - g_free (textview_name); - - text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview)); - g_signal_connect (text_buffer, "changed", G_CALLBACK (object_changed), editor); -} - -static void -init_address_field (EContactEditor *editor, gint record, const gchar *widget_field_name) -{ - gchar *entry_name; - GtkWidget *entry; - - entry_name = g_strdup_printf ("entry-%s-%s", address_name [record], widget_field_name); - entry = glade_xml_get_widget (editor->gui, entry_name); - g_free (entry_name); - - g_signal_connect (entry, "changed", G_CALLBACK (object_changed), editor); - g_signal_connect_swapped (entry, "activate", G_CALLBACK (entry_activated), editor); -} - -static void -init_address_record (EContactEditor *editor, gint record) -{ - init_address_textview (editor, record); - init_address_field (editor, record, "city"); - init_address_field (editor, record, "state"); - init_address_field (editor, record, "zip"); - init_address_field (editor, record, "country"); - init_address_field (editor, record, "pobox"); -} - -static void -init_address (EContactEditor *editor) -{ - gint i; - - for (i = 0; i < ADDRESS_SLOTS; i++) - init_address_record (editor, i); -} - -static void -fill_in_address_textview (EContactEditor *editor, gint record, EContactAddress *address) -{ - gchar *textview_name; - GtkWidget *textview; - GtkTextBuffer *text_buffer; - GtkTextIter iter; - - textview_name = g_strdup_printf ("textview-%s-address", address_name [record]); - textview = glade_xml_get_widget (editor->gui, textview_name); - g_free (textview_name); - - text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview)); - gtk_text_buffer_set_text (text_buffer, address->street ? address->street : "", -1); - - gtk_text_buffer_get_end_iter (text_buffer, &iter); - gtk_text_buffer_insert (text_buffer, &iter, "\n", -1); - gtk_text_buffer_insert (text_buffer, &iter, address->ext ? address->ext : "", -1); -} - -static void -fill_in_address_label_textview (EContactEditor *editor, gint record, const gchar *label) -{ - gchar *textview_name; - GtkWidget *textview; - GtkTextBuffer *text_buffer; - - textview_name = g_strdup_printf ("textview-%s-address", address_name [record]); - textview = glade_xml_get_widget (editor->gui, textview_name); - g_free (textview_name); - - text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview)); - gtk_text_buffer_set_text (text_buffer, label ? label : "", -1); -} - -static void -fill_in_address_field (EContactEditor *editor, gint record, const gchar *widget_field_name, - const gchar *string) -{ - gchar *entry_name; - GtkWidget *entry; - - entry_name = g_strdup_printf ("entry-%s-%s", address_name [record], widget_field_name); - entry = glade_xml_get_widget (editor->gui, entry_name); - g_free (entry_name); - - set_entry_text (editor, GTK_ENTRY (entry), string); -} - -static void -fill_in_address_record (EContactEditor *editor, gint record) -{ - EContactAddress *address; - gchar *address_label; - - address = e_contact_get (editor->contact, addresses [record]); - address_label = e_contact_get (editor->contact, address_labels [record]); - - if (address && - (!STRING_IS_EMPTY (address->street) || - !STRING_IS_EMPTY (address->ext) || - !STRING_IS_EMPTY (address->locality) || - !STRING_IS_EMPTY (address->region) || - !STRING_IS_EMPTY (address->code) || - !STRING_IS_EMPTY (address->po) || - !STRING_IS_EMPTY (address->country))) { - fill_in_address_textview (editor, record, address); - fill_in_address_field (editor, record, "city", address->locality); - fill_in_address_field (editor, record, "state", address->region); - fill_in_address_field (editor, record, "zip", address->code); - fill_in_address_field (editor, record, "country", address->country); - fill_in_address_field (editor, record, "pobox", address->po); - } else if (!STRING_IS_EMPTY (address_label)) { - fill_in_address_label_textview (editor, record, address_label); - } - - g_free (address_label); - if (address) - g_boxed_free (e_contact_address_get_type (), address); -} - -static void -fill_in_address (EContactEditor *editor) -{ - gint i; - - for (i = 0; i < ADDRESS_SLOTS; i++) - fill_in_address_record (editor, i); -} - -static void -extract_address_textview (EContactEditor *editor, gint record, EContactAddress *address) -{ - gchar *textview_name; - GtkWidget *textview; - GtkTextBuffer *text_buffer; - GtkTextIter iter_1, iter_2; - - textview_name = g_strdup_printf ("textview-%s-address", address_name [record]); - textview = glade_xml_get_widget (editor->gui, textview_name); - g_free (textview_name); - - text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview)); - gtk_text_buffer_get_start_iter (text_buffer, &iter_1); - - /* Skip blank lines */ - while (gtk_text_iter_get_chars_in_line (&iter_1) < 1 && - !gtk_text_iter_is_end (&iter_1)) - gtk_text_iter_forward_line (&iter_1); - - if (gtk_text_iter_is_end (&iter_1)) - return; - - iter_2 = iter_1; - gtk_text_iter_forward_to_line_end (&iter_2); - - /* Extract street (first line of text) */ - address->street = gtk_text_iter_get_text (&iter_1, &iter_2); - - iter_1 = iter_2; - gtk_text_iter_forward_line (&iter_1); - - if (gtk_text_iter_is_end (&iter_1)) - return; - - gtk_text_iter_forward_to_end (&iter_2); - - /* Extract extended address (remaining lines of text) */ - address->ext = gtk_text_iter_get_text (&iter_1, &iter_2); -} - -static gchar * -extract_address_field (EContactEditor *editor, gint record, const gchar *widget_field_name) -{ - gchar *entry_name; - GtkWidget *entry; - - entry_name = g_strdup_printf ("entry-%s-%s", address_name [record], widget_field_name); - entry = glade_xml_get_widget (editor->gui, entry_name); - g_free (entry_name); - - return g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); -} - -static gchar * -append_to_address_label (gchar *address_label, const gchar *part, gboolean newline) -{ - gchar *new_address_label; - - if (STRING_IS_EMPTY (part)) - return address_label; - - if (address_label) - new_address_label = g_strjoin (newline ? "\n" : ", ", address_label, part, NULL); - else - new_address_label = g_strdup (part); - - g_free (address_label); - return new_address_label; -} - -static void -set_address_label (EContact *contact, EContactField field, EContactAddress *address) -{ - gchar *address_label = NULL; - - if (address) { - address_label = append_to_address_label (address_label, address->street, TRUE); - address_label = append_to_address_label (address_label, address->ext, TRUE); - address_label = append_to_address_label (address_label, address->locality, TRUE); - address_label = append_to_address_label (address_label, address->region, FALSE); - address_label = append_to_address_label (address_label, address->code, TRUE); - address_label = append_to_address_label (address_label, address->po, TRUE); - address_label = append_to_address_label (address_label, address->country, TRUE); - } - - e_contact_set (contact, field, address_label); - g_free (address_label); -} - -static void -extract_address_record (EContactEditor *editor, gint record) -{ - EContactAddress *address; - - address = g_new0 (EContactAddress, 1); - - extract_address_textview (editor, record, address); - address->locality = extract_address_field (editor, record, "city"); - address->region = extract_address_field (editor, record, "state"); - address->code = extract_address_field (editor, record, "zip"); - address->country = extract_address_field (editor, record, "country"); - address->po = extract_address_field (editor, record, "pobox"); - - if (!STRING_IS_EMPTY (address->street) || - !STRING_IS_EMPTY (address->ext) || - !STRING_IS_EMPTY (address->locality) || - !STRING_IS_EMPTY (address->region) || - !STRING_IS_EMPTY (address->code) || - !STRING_IS_EMPTY (address->po) || - !STRING_IS_EMPTY (address->country)) { - e_contact_set (editor->contact, addresses [record], address); - set_address_label (editor->contact, address_labels [record], address); - } - else { - e_contact_set (editor->contact, addresses [record], NULL); - set_address_label (editor->contact, address_labels [record], NULL); - } - - g_boxed_free (e_contact_address_get_type (), address); -} - -static void -extract_address (EContactEditor *editor) -{ - gint i; - - for (i = 0; i < ADDRESS_SLOTS; i++) - extract_address_record (editor, i); -} - -static void -sensitize_address_textview (EContactEditor *editor, gint record, gboolean enabled) -{ - gchar *widget_name; - GtkWidget *textview; - GtkWidget *label; - - widget_name = g_strdup_printf ("textview-%s-address", address_name [record]); - textview = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - widget_name = g_strdup_printf ("label-%s-address", address_name [record]); - label = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), enabled); - gtk_widget_set_sensitive (label, enabled); -} - -static void -sensitize_address_field (EContactEditor *editor, gint record, const gchar *widget_field_name, - gboolean enabled) -{ - gchar *widget_name; - GtkWidget *entry; - GtkWidget *label; - - widget_name = g_strdup_printf ("entry-%s-%s", address_name [record], widget_field_name); - entry = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - widget_name = g_strdup_printf ("label-%s-%s", address_name [record], widget_field_name); - label = glade_xml_get_widget (editor->gui, widget_name); - g_free (widget_name); - - gtk_editable_set_editable (GTK_EDITABLE (entry), enabled); - gtk_widget_set_sensitive (label, enabled); -} - -static void -sensitize_address_record (EContactEditor *editor, gint record, gboolean enabled) -{ - sensitize_address_textview (editor, record, enabled); - sensitize_address_field (editor, record, "city", enabled); - sensitize_address_field (editor, record, "state", enabled); - sensitize_address_field (editor, record, "zip", enabled); - sensitize_address_field (editor, record, "country", enabled); - sensitize_address_field (editor, record, "pobox", enabled); -} - -static void -sensitize_address (EContactEditor *editor) -{ - gint i; - - for (i = 0; i < ADDRESS_SLOTS; i++) { - gboolean enabled = TRUE; - - if (!editor->target_editable || - !(is_field_supported (editor, addresses [i]) || - is_field_supported (editor, address_labels[i]))) - enabled = FALSE; - - sensitize_address_record (editor, i, enabled); - } -} - -typedef struct { - char *widget_name; - gint field_id; /* EContactField or -1 */ - gboolean process_data; /* If we should extract/fill in contents */ - gboolean desensitize_for_read_only; -} -FieldMapping; - -/* Table of widgets that interact with simple fields. This table is used to: - * - * - Fill in data. - * - Extract data. - * - Set sensitivity based on backend capabilities. - * - Set sensitivity based on book writeability. */ - -static FieldMapping simple_field_map [] = { - { "entry-homepage", E_CONTACT_HOMEPAGE_URL, TRUE, TRUE }, - { "accellabel-homepage", E_CONTACT_HOMEPAGE_URL, FALSE, TRUE }, - - { "entry-jobtitle", E_CONTACT_TITLE, TRUE, TRUE }, - { "label-jobtitle", E_CONTACT_TITLE, FALSE, TRUE }, - - { "entry-company", E_CONTACT_ORG, TRUE, TRUE }, - { "label-company", E_CONTACT_ORG, FALSE, TRUE }, - - { "entry-department", E_CONTACT_ORG_UNIT, TRUE, TRUE }, - { "label-department", E_CONTACT_ORG_UNIT, FALSE, TRUE }, - - { "entry-profession", E_CONTACT_ROLE, TRUE, TRUE }, - { "label-profession", E_CONTACT_ROLE, FALSE, TRUE }, - - { "entry-manager", E_CONTACT_MANAGER, TRUE, TRUE }, - { "label-manager", E_CONTACT_MANAGER, FALSE, TRUE }, - - { "entry-assistant", E_CONTACT_ASSISTANT, TRUE, TRUE }, - { "label-assistant", E_CONTACT_ASSISTANT, FALSE, TRUE }, - - { "entry-nickname", E_CONTACT_NICKNAME, TRUE, TRUE }, - { "label-nickname", E_CONTACT_NICKNAME, FALSE, TRUE }, - - { "dateedit-birthday", E_CONTACT_BIRTH_DATE, TRUE, TRUE }, - { "label-birthday", E_CONTACT_BIRTH_DATE, FALSE, TRUE }, - - { "dateedit-anniversary", E_CONTACT_ANNIVERSARY, TRUE, TRUE }, - { "label-anniversary", E_CONTACT_ANNIVERSARY, FALSE, TRUE }, - - { "entry-spouse", E_CONTACT_SPOUSE, TRUE, TRUE }, - { "label-spouse", E_CONTACT_SPOUSE, FALSE, TRUE }, - - { "entry-office", E_CONTACT_OFFICE, TRUE, TRUE }, - { "label-office", E_CONTACT_OFFICE, FALSE, TRUE }, - - { "text-comments", E_CONTACT_NOTE, TRUE, TRUE }, - { "label-comments", E_CONTACT_NOTE, FALSE, TRUE }, - - { "entry-fullname", E_CONTACT_FULL_NAME, TRUE, TRUE }, - { "button-fullname", E_CONTACT_FULL_NAME, FALSE, TRUE }, - - { "entry-categories", E_CONTACT_CATEGORIES, TRUE, TRUE }, - { "button-categories", E_CONTACT_CATEGORIES, FALSE, TRUE }, - - { "entry-weblog", E_CONTACT_BLOG_URL, TRUE, TRUE }, - { "label-weblog", E_CONTACT_BLOG_URL, FALSE, TRUE }, - - { "entry-caluri", E_CONTACT_CALENDAR_URI, TRUE, TRUE }, - { "label-caluri", E_CONTACT_CALENDAR_URI, FALSE, TRUE }, - - { "entry-fburl", E_CONTACT_FREEBUSY_URL, TRUE, TRUE }, - { "label-fburl", E_CONTACT_FREEBUSY_URL, FALSE, TRUE }, - - { "entry-videourl", E_CONTACT_VIDEO_URL, TRUE, TRUE }, - { "label-videourl", E_CONTACT_VIDEO_URL, FALSE, TRUE }, - - { "checkbutton-htmlmail", E_CONTACT_WANTS_HTML, TRUE, TRUE }, - - { "image-chooser", E_CONTACT_PHOTO, TRUE, TRUE }, - { "button-image", E_CONTACT_PHOTO, FALSE, TRUE }, - - { "combo-file-as", E_CONTACT_FILE_AS, FALSE, TRUE }, - { "entry-file-as", E_CONTACT_FILE_AS, TRUE, TRUE }, - { "accellabel-fileas", E_CONTACT_FILE_AS, FALSE, TRUE }, -}; - -static void -init_simple_field (EContactEditor *editor, GtkWidget *widget) -{ - GObject *changed_object = NULL; - - if (GTK_IS_ENTRY (widget)) { - changed_object = G_OBJECT (widget); - g_signal_connect_swapped (widget, "activate", G_CALLBACK (entry_activated), editor); - } - else if (GTK_IS_TEXT_VIEW (widget)) { - changed_object = G_OBJECT (gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget))); - } - else if (E_IS_URL_ENTRY (widget)) { - changed_object = G_OBJECT (e_url_entry_get_entry (E_URL_ENTRY (widget))); - g_signal_connect_swapped (GTK_WIDGET (changed_object), "activate", - G_CALLBACK (entry_activated), editor); - } - else if (E_IS_DATE_EDIT (widget)) { - changed_object = G_OBJECT (widget); - } - else if (E_IS_IMAGE_CHOOSER (widget)) { - changed_object = G_OBJECT (widget); - g_signal_connect (widget, "changed", G_CALLBACK (image_chooser_changed), editor); - } - else if (GTK_IS_TOGGLE_BUTTON (widget)) { - g_signal_connect (widget, "toggled", G_CALLBACK (object_changed), editor); - } - - if (changed_object) - g_signal_connect (changed_object, "changed", G_CALLBACK (object_changed), editor); -} - -static void -fill_in_simple_field (EContactEditor *editor, GtkWidget *widget, gint field_id) -{ - EContact *contact; - - contact = editor->contact; - - g_signal_handlers_block_matched (widget, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, editor); - - if (GTK_IS_ENTRY (widget)) { - gchar *text = e_contact_get (contact, field_id); - gtk_entry_set_text (GTK_ENTRY (widget), STRING_MAKE_NON_NULL (text)); - g_free (text); - } - else if (GTK_IS_TEXT_VIEW (widget)) { - GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)); - gchar *text = e_contact_get (contact, field_id); - gtk_text_buffer_set_text (buffer, STRING_MAKE_NON_NULL (text), -1); - g_free (text); - } - else if (E_IS_URL_ENTRY (widget)) { - GtkWidget *entry = e_url_entry_get_entry (E_URL_ENTRY (widget)); - gchar *text = e_contact_get (contact, field_id); - gtk_entry_set_text (GTK_ENTRY (entry), STRING_MAKE_NON_NULL (text)); - g_free (text); - } - else if (E_IS_DATE_EDIT (widget)) { - EContactDate *date = e_contact_get (contact, field_id); - if (date) - e_date_edit_set_date (E_DATE_EDIT (widget), - date->year, - date->month, - date->day); - else - e_date_edit_set_time (E_DATE_EDIT (widget), -1); - - e_contact_date_free (date); - } - else if (E_IS_IMAGE_CHOOSER (widget)) { - EContactPhoto *photo = e_contact_get (contact, field_id); - if (photo) { - e_image_chooser_set_image_data (E_IMAGE_CHOOSER (widget), - photo->data, - photo->length); - editor->image_set = TRUE; - } - else { - gchar *file_name = e_icon_factory_get_icon_filename ("stock_person", 48); - e_image_chooser_set_from_file (E_IMAGE_CHOOSER (widget), file_name); - editor->image_set = FALSE; - g_free (file_name); - } - - e_contact_photo_free (photo); - } - else if (GTK_IS_TOGGLE_BUTTON (widget)) { - gboolean val = (gboolean) e_contact_get (contact, field_id); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), val); - } - else { - g_warning (G_STRLOC ": Unhandled widget class in mappings!"); - } - - g_signal_handlers_unblock_matched (widget, G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, editor); -} - -static void -extract_simple_field (EContactEditor *editor, GtkWidget *widget, gint field_id) -{ - EContact *contact; - - contact = editor->contact; - - if (GTK_IS_ENTRY (widget)) { - const gchar *text = gtk_entry_get_text (GTK_ENTRY (widget)); - e_contact_set (contact, field_id, (gchar *) text); - } - else if (GTK_IS_TEXT_VIEW (widget)) { - GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (widget)); - GtkTextIter start, end; - gchar *text; - - gtk_text_buffer_get_start_iter (buffer, &start); - gtk_text_buffer_get_end_iter (buffer, &end); - text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); - - e_contact_set (contact, field_id, text); - g_free (text); - } - else if (E_IS_URL_ENTRY (widget)) { - GtkWidget *entry = e_url_entry_get_entry (E_URL_ENTRY (widget)); - const gchar *text = gtk_entry_get_text (GTK_ENTRY (entry)); - e_contact_set (contact, field_id, (gchar *) text); - } - else if (E_IS_DATE_EDIT (widget)) { - EContactDate date; - if (e_date_edit_get_date (E_DATE_EDIT (widget), - &date.year, - &date.month, - &date.day)) - e_contact_set (contact, field_id, &date); - else - e_contact_set (contact, field_id, NULL); - } - else if (E_IS_IMAGE_CHOOSER (widget)) { - EContactPhoto photo; - - if (editor->image_set && - e_image_chooser_get_image_data (E_IMAGE_CHOOSER (widget), - &photo.data, &photo.length)) { - e_contact_set (contact, field_id, &photo); - g_free (photo.data); - } - else { - e_contact_set (contact, E_CONTACT_PHOTO, NULL); - } - } - else if (GTK_IS_TOGGLE_BUTTON (widget)) { - gboolean val = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)); - e_contact_set (contact, field_id, (gpointer) val); - } - else { - g_warning (G_STRLOC ": Unhandled widget class in mappings!"); - } -} - -static void -sensitize_simple_field (GtkWidget *widget, gboolean enabled) -{ - if (GTK_IS_ENTRY (widget)) - gtk_editable_set_editable (GTK_EDITABLE (widget), enabled); - else if (GTK_IS_TEXT_VIEW (widget)) - gtk_text_view_set_editable (GTK_TEXT_VIEW (widget), enabled); - else if (E_IS_URL_ENTRY (widget)) { - GtkWidget *entry = e_url_entry_get_entry (E_URL_ENTRY (widget)); - gtk_editable_set_editable (GTK_EDITABLE (entry), enabled); - } - else if (E_IS_DATE_EDIT (widget)) - e_date_edit_set_editable (E_DATE_EDIT (widget), enabled); - else - gtk_widget_set_sensitive (widget, enabled); -} - -static void -init_simple (EContactEditor *editor) -{ - GtkWidget *widget; - gint i; - - for (i = 0; i < G_N_ELEMENTS (simple_field_map); i++) { - GtkWidget *widget; - - widget = glade_xml_get_widget (editor->gui, simple_field_map [i].widget_name); - if (!widget) - continue; - - init_simple_field (editor, widget); - } - - /* --- Special cases --- */ - - /* Update file_as */ - - widget = glade_xml_get_widget (editor->gui, "entry-fullname"); - g_signal_connect (widget, "changed", G_CALLBACK (name_entry_changed), editor); - widget = glade_xml_get_widget (editor->gui, "entry-file-as"); - g_signal_connect (widget, "changed", G_CALLBACK (file_as_entry_changed), editor); - widget = glade_xml_get_widget (editor->gui, "entry-company"); - g_signal_connect (widget, "changed", G_CALLBACK (company_entry_changed), editor); -} - -static void -fill_in_simple (EContactEditor *editor) -{ - EContactName *name; - gint i; - - for (i = 0; i < G_N_ELEMENTS (simple_field_map); i++) { - GtkWidget *widget; - - if (simple_field_map [i].field_id < 0 || - !simple_field_map [i].process_data) - continue; - - widget = glade_xml_get_widget (editor->gui, simple_field_map [i].widget_name); - if (!widget) - continue; - - fill_in_simple_field (editor, widget, simple_field_map [i].field_id); - } - - /* --- Special cases --- */ - - /* Update broken-up name */ - - g_object_get (editor->contact, - "name", &name, - NULL); - - if (editor->name) - e_contact_name_free (editor->name); - - editor->name = name; - - /* Update file_as combo options */ - - update_file_as_combo (editor); -} - -static void -extract_simple (EContactEditor *editor) -{ - gint i; - - for (i = 0; i < G_N_ELEMENTS (simple_field_map); i++) { - GtkWidget *widget; - - if (simple_field_map [i].field_id < 0 || - !simple_field_map [i].process_data) - continue; - - widget = glade_xml_get_widget (editor->gui, simple_field_map [i].widget_name); - if (!widget) - continue; - - extract_simple_field (editor, widget, simple_field_map [i].field_id); - } - - /* Special cases */ - - e_contact_set (editor->contact, E_CONTACT_NAME, editor->name); -} - -static void -sensitize_simple (EContactEditor *editor) -{ - gint i; - - for (i = 0; i < G_N_ELEMENTS (simple_field_map); i++) { - GtkWidget *widget; - gboolean enabled = TRUE; - - widget = glade_xml_get_widget (editor->gui, simple_field_map [i].widget_name); - if (!widget) - continue; - - if (simple_field_map [i].field_id >= 0 && - !is_field_supported (editor, simple_field_map [i].field_id)) - enabled = FALSE; - - if (simple_field_map [i].desensitize_for_read_only && - !editor->target_editable) - enabled = FALSE; - - sensitize_simple_field (widget, enabled); - } -} - -static void -fill_in_all (EContactEditor *editor) -{ - fill_in_source_field (editor); - fill_in_simple (editor); - fill_in_email (editor); - fill_in_phone (editor); - fill_in_im (editor); - fill_in_address (editor); -} - -static void -extract_all (EContactEditor *editor) -{ - extract_simple (editor); - extract_email (editor); - extract_phone (editor); - extract_im (editor); - extract_address (editor); -} - -static void -sensitize_all (EContactEditor *editor) -{ - sensitize_ok (editor); - sensitize_simple (editor); - sensitize_email (editor); - sensitize_phone (editor); - sensitize_im (editor); - sensitize_address (editor); -} - -static void -init_all (EContactEditor *editor) -{ - init_simple (editor); - init_email (editor); - init_phone (editor); - init_im (editor); - init_address (editor); -} - -static void -new_target_cb (EBook *new_book, EBookStatus status, EContactEditor *editor) -{ - editor->load_source_id = 0; - editor->load_book = NULL; - - if (status != E_BOOK_ERROR_OK || new_book == NULL) { - GtkWidget *source_option_menu; - - eab_load_error_dialog (NULL, e_book_get_source (new_book), status); - - source_option_menu = glade_xml_get_widget (editor->gui, "source-option-menu-source"); - e_source_option_menu_select (E_SOURCE_OPTION_MENU (source_option_menu), - e_book_get_source (editor->target_book)); - - if (new_book) - g_object_unref (new_book); - return; - } - - g_object_set (editor, "target_book", new_book, NULL); - g_object_unref (new_book); -} - -static void -cancel_load (EContactEditor *editor) -{ - if (editor->load_source_id) { - addressbook_load_cancel (editor->load_source_id); - editor->load_source_id = 0; - - g_object_unref (editor->load_book); - editor->load_book = NULL; - } -} - -static void -source_selected (GtkWidget *source_option_menu, ESource *source, EContactEditor *editor) -{ - cancel_load (editor); - - if (e_source_equal (e_book_get_source (editor->target_book), source)) - return; - - if (e_source_equal (e_book_get_source (editor->source_book), source)) { - g_object_set (editor, "target_book", editor->source_book, NULL); - return; - } - - editor->load_book = e_book_new (source, NULL); - editor->load_source_id = addressbook_load (editor->load_book, - (EBookCallback) new_target_cb, editor); -} - -static void -full_name_clicked (GtkWidget *button, EContactEditor *editor) -{ - GtkDialog *dialog = GTK_DIALOG (e_contact_editor_fullname_new (editor->name)); - gboolean fullname_supported; - int result; - - fullname_supported = is_field_supported (editor, E_CONTACT_FULL_NAME); - - g_object_set (dialog, - "editable", fullname_supported & editor->target_editable, - NULL); - gtk_widget_show (GTK_WIDGET(dialog)); - result = gtk_dialog_run (dialog); - gtk_widget_hide (GTK_WIDGET (dialog)); - - if (fullname_supported && editor->target_editable && result == GTK_RESPONSE_OK) { - EContactName *name; - GtkWidget *fname_widget; - int style = 0; - - g_object_get (dialog, - "name", &name, - NULL); - - style = file_as_get_style(editor); - - fname_widget = glade_xml_get_widget(editor->gui, "entry-fullname"); - if (fname_widget && GTK_IS_ENTRY (fname_widget)) { - char *full_name = e_contact_name_to_string(name); - const char *old_full_name = gtk_entry_get_text (GTK_ENTRY(fname_widget)); - - if (strcmp (full_name, old_full_name)) - gtk_entry_set_text (GTK_ENTRY (fname_widget), full_name); - g_free(full_name); - } - - e_contact_name_free(editor->name); - editor->name = name; - - file_as_set_style(editor, style); - } - gtk_widget_destroy (GTK_WIDGET (dialog)); -} - -static void -categories_clicked (GtkWidget *button, EContactEditor *editor) -{ - char *categories = NULL; - GtkDialog *dialog; - int result; - GtkWidget *entry = glade_xml_get_widget(editor->gui, "entry-categories"); - ECategoriesMasterList *ecml; - if (entry && GTK_IS_ENTRY(entry)) - categories = g_strdup (gtk_entry_get_text(GTK_ENTRY(entry))); - else if (editor->contact) - categories = e_contact_get (editor->contact, E_CONTACT_CATEGORIES); - - if (!(dialog = GTK_DIALOG (e_categories_new (categories)))) { - e_error_run (NULL, "addressbook:edit-categories", NULL); - g_free (categories); - return; - } - - ecml = e_categories_master_list_wombat_new (); - g_object_set (dialog, - "header", _("This contact belongs to these categories:"), - "ecml", ecml, - NULL); - g_object_unref (ecml); - gtk_widget_show(GTK_WIDGET(dialog)); - result = gtk_dialog_run (dialog); - g_free (categories); - if (result == GTK_RESPONSE_OK) { - g_object_get (dialog, - "categories", &categories, - NULL); - if (entry && GTK_IS_ENTRY(entry)) - gtk_entry_set_text (GTK_ENTRY (entry), categories); - else - e_contact_set (editor->contact, E_CONTACT_CATEGORIES, categories); - - g_free(categories); - } - gtk_widget_destroy(GTK_WIDGET(dialog)); -} - -static void -image_selected (EContactEditor *editor) -{ - gchar *file_name; - GtkWidget *image_chooser; - -#ifdef USE_GTKFILECHOOSER - file_name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (editor->file_selector)); -#else - file_name = (gchar *) gtk_file_selection_get_filename (GTK_FILE_SELECTION (editor->file_selector)); -#endif - - if (!file_name) - return; - - image_chooser = glade_xml_get_widget (editor->gui, "image-chooser"); - - g_signal_handlers_block_by_func (image_chooser, image_chooser_changed, editor); - e_image_chooser_set_from_file (E_IMAGE_CHOOSER (image_chooser), file_name); - g_signal_handlers_unblock_by_func (image_chooser, image_chooser_changed, editor); - - editor->image_set = TRUE; - object_changed (G_OBJECT (image_chooser), editor); -} - -static void -image_cleared (EContactEditor *editor) -{ - GtkWidget *image_chooser; - gchar *file_name; - - image_chooser = glade_xml_get_widget (editor->gui, "image-chooser"); - - file_name = e_icon_factory_get_icon_filename ("stock_person", 48); - - g_signal_handlers_block_by_func (image_chooser, image_chooser_changed, editor); - e_image_chooser_set_from_file (E_IMAGE_CHOOSER (image_chooser), file_name); - g_signal_handlers_unblock_by_func (image_chooser, image_chooser_changed, editor); - - g_free (file_name); - - editor->image_set = FALSE; - object_changed (G_OBJECT (image_chooser), editor); -} - -#ifdef USE_GTKFILECHOOSER - -static void -file_chooser_response (GtkWidget *widget, gint response, EContactEditor *editor) -{ - if (response == GTK_RESPONSE_ACCEPT) - image_selected (editor); - else if (response == GTK_RESPONSE_NO) - image_cleared (editor); - - gtk_widget_hide (editor->file_selector); -} - -#endif - -static gboolean -file_selector_deleted (GtkWidget *widget) -{ - gtk_widget_hide (widget); - return TRUE; -} - -static void -image_clicked (GtkWidget *button, EContactEditor *editor) -{ - GtkWidget *clear_button; - GtkWidget *dialog; - const gchar *title = _("Please select an image for this contact"); - const gchar *no_image = _("No image"); - - if (!editor->file_selector) { -#ifdef USE_GTKFILECHOOSER - editor->file_selector = gtk_file_chooser_dialog_new (title, - GTK_WINDOW (editor->app), - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - no_image, GTK_RESPONSE_NO, - NULL); - gtk_dialog_set_default_response (GTK_DIALOG (editor->file_selector), GTK_RESPONSE_ACCEPT); - - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (editor->file_selector), g_get_home_dir ()); - - g_signal_connect (editor->file_selector, "response", - G_CALLBACK (file_chooser_response), editor); -#else - /* Create the selector */ - - editor->file_selector = gtk_file_selection_new (title); - - dialog = GTK_FILE_SELECTION (editor->file_selector)->fileop_dialog; - - clear_button = gtk_dialog_add_button (GTK_DIALOG (editor->file_selector), no_image, 0); - - g_signal_connect_swapped (GTK_OBJECT (GTK_FILE_SELECTION (editor->file_selector)->ok_button), - "clicked", G_CALLBACK (image_selected), editor); - - g_signal_connect_swapped (clear_button, - "clicked", G_CALLBACK (image_cleared), editor); - - /* Ensure that the dialog box gets hidden when the user clicks a button */ - - g_signal_connect_swapped (GTK_OBJECT (GTK_FILE_SELECTION (editor->file_selector)->ok_button), - "clicked", G_CALLBACK (gtk_widget_hide), editor->file_selector); - - g_signal_connect_swapped (GTK_OBJECT (GTK_FILE_SELECTION (editor->file_selector)->cancel_button), - "clicked", G_CALLBACK (gtk_widget_hide), editor->file_selector); - - g_signal_connect_swapped (clear_button, - "clicked", G_CALLBACK (gtk_widget_hide), editor->file_selector); -#endif - - g_signal_connect_after (editor->file_selector, - "delete-event", G_CALLBACK (file_selector_deleted), - editor->file_selector); - } - - /* Display the dialog */ - - gtk_window_present (GTK_WINDOW (editor->file_selector)); -} - -typedef struct { - EContactEditor *ce; - gboolean should_close; - gchar *new_id; -} EditorCloseStruct; - -static void -contact_moved_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs) -{ - EContactEditor *ce = ecs->ce; - gboolean should_close = ecs->should_close; - - gtk_widget_set_sensitive (ce->app, TRUE); - ce->in_async_call = FALSE; - - e_contact_set (ce->contact, E_CONTACT_UID, ecs->new_id); - - eab_editor_contact_deleted (EAB_EDITOR (ce), status, ce->contact); - - ce->is_new_contact = FALSE; - - if (should_close) { - eab_editor_close (EAB_EDITOR (ce)); - } - else { - ce->changed = FALSE; - - g_object_ref (ce->target_book); - g_object_unref (ce->source_book); - ce->source_book = ce->target_book; - - sensitize_all (ce); - } - - g_object_unref (ce); - g_free (ecs->new_id); - g_free (ecs); -} - -static void -contact_added_cb (EBook *book, EBookStatus status, const char *id, EditorCloseStruct *ecs) -{ - EContactEditor *ce = ecs->ce; - gboolean should_close = ecs->should_close; - - if (ce->source_book != ce->target_book && e_book_is_writable (ce->source_book) && - status == E_BOOK_ERROR_OK && ce->is_new_contact == FALSE) { - ecs->new_id = g_strdup (id); - e_book_async_remove_contact (ce->source_book, ce->contact, - (EBookCallback) contact_moved_cb, ecs); - return; - } - - gtk_widget_set_sensitive (ce->app, TRUE); - ce->in_async_call = FALSE; - - e_contact_set (ce->contact, E_CONTACT_UID, (char *) id); - - eab_editor_contact_added (EAB_EDITOR (ce), status, ce->contact); - - if (status == E_BOOK_ERROR_OK) { - ce->is_new_contact = FALSE; - - if (should_close) { - eab_editor_close (EAB_EDITOR (ce)); - } - else { - ce->changed = FALSE; - sensitize_all (ce); - } - } - - g_object_unref (ce); - g_free (ecs); -} - -static void -contact_modified_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs) -{ - EContactEditor *ce = ecs->ce; - gboolean should_close = ecs->should_close; - - gtk_widget_set_sensitive (ce->app, TRUE); - ce->in_async_call = FALSE; - - eab_editor_contact_modified (EAB_EDITOR (ce), status, ce->contact); - - if (status == E_BOOK_ERROR_OK) { - if (should_close) { - eab_editor_close (EAB_EDITOR (ce)); - } - else { - ce->changed = FALSE; - sensitize_all (ce); - } - } - - g_object_unref (ce); - g_free (ecs); -} - -/* Emits the signal to request saving a contact */ -static void -real_save_contact (EContactEditor *ce, gboolean should_close) -{ - EditorCloseStruct *ecs; - - ecs = g_new0 (EditorCloseStruct, 1); - ecs->ce = ce; - g_object_ref (ecs->ce); - - ecs->should_close = should_close; - - gtk_widget_set_sensitive (ce->app, FALSE); - ce->in_async_call = TRUE; - - if (ce->source_book != ce->target_book) { - /* Two-step move; add to target, then remove from source */ - eab_merging_book_add_contact (ce->target_book, ce->contact, - (EBookIdCallback) contact_added_cb, ecs); - } else { - if (ce->is_new_contact) - eab_merging_book_add_contact (ce->target_book, ce->contact, - (EBookIdCallback) contact_added_cb, ecs); - else - eab_merging_book_commit_contact (ce->target_book, ce->contact, - (EBookCallback) contact_modified_cb, ecs); - } -} - -static void -save_contact (EContactEditor *ce, gboolean should_close) -{ - extract_all (ce); - if (!ce->target_book) - return; - - if (!e_contact_editor_is_valid (EAB_EDITOR (ce))) - return; - - if (ce->target_editable && !e_book_is_writable (ce->source_book)) { - if (e_error_run (GTK_WINDOW (ce->app), "addressbook:prompt-move", NULL) == GTK_RESPONSE_NO) - return; - } - - real_save_contact (ce, should_close); -} - -static void -e_contact_editor_save_contact (EABEditor *editor, gboolean should_close) -{ - save_contact (E_CONTACT_EDITOR (editor), should_close); -} - -/* Closes the dialog box and emits the appropriate signals */ -static void -e_contact_editor_close (EABEditor *editor) -{ - EContactEditor *ce = E_CONTACT_EDITOR (editor); - - if (ce->app != NULL) { - gtk_widget_destroy (ce->app); - ce->app = NULL; - eab_editor_closed (editor); - } -} - -/* insert checks here (date format, for instance, etc.) */ -static gboolean -e_contact_editor_is_valid (EABEditor *editor) -{ - EContactEditor *ce = E_CONTACT_EDITOR (editor); - GtkWidget *widget; - gboolean validation_error = FALSE; - GString *errmsg = g_string_new (_("The contact data is invalid:\n\n")); - - widget = glade_xml_get_widget (ce->gui, "dateedit-birthday"); - if (!(e_date_edit_date_is_valid (E_DATE_EDIT (widget)))) { - g_string_append_printf (errmsg, "'%s' has an invalid format", - e_contact_pretty_name (E_CONTACT_BIRTH_DATE)); - validation_error = TRUE; - } - - widget = glade_xml_get_widget (ce->gui, "dateedit-anniversary"); - if (!(e_date_edit_date_is_valid (E_DATE_EDIT (widget)))) { - g_string_append_printf (errmsg, "%s'%s' has an invalid format", - validation_error ? ",\n" : "", - e_contact_pretty_name (E_CONTACT_ANNIVERSARY)); - validation_error = TRUE; - } - - widget = glade_xml_get_widget (ce->gui, "entry-file-as"); - if (STRING_IS_EMPTY (gtk_entry_get_text (GTK_ENTRY (widget)))) { - g_string_append_printf (errmsg, "%s'%s' is empty", - validation_error ? ",\n" : "", - e_contact_pretty_name (E_CONTACT_FILE_AS)); - validation_error = TRUE; - } - - if (validation_error) { - g_string_append (errmsg, "."); - e_error_run (GTK_WINDOW (ce->app), "addressbook:generic-error", - _("Invalid contact."), errmsg->str, NULL); - g_string_free (errmsg, TRUE); - return FALSE; - } - else { - g_string_free (errmsg, TRUE); - return TRUE; - } -} - -static gboolean -e_contact_editor_is_changed (EABEditor *editor) -{ - return E_CONTACT_EDITOR (editor)->changed; -} - -static GtkWindow* -e_contact_editor_get_window (EABEditor *editor) -{ - return GTK_WINDOW (E_CONTACT_EDITOR (editor)->app); -} - -static void -file_save_and_close_cb (GtkWidget *widget, gpointer data) -{ - EContactEditor *ce; - - ce = E_CONTACT_EDITOR (data); - save_contact (ce, TRUE); -} - -static void -file_cancel_cb (GtkWidget *widget, gpointer data) -{ - EContactEditor *ce = E_CONTACT_EDITOR (data); - - eab_editor_close (EAB_EDITOR (ce)); -} - -/* Callback used when the dialog box is destroyed */ -static gint -app_delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data) -{ - EContactEditor *ce; - - ce = E_CONTACT_EDITOR (data); - - /* if we're saving, don't allow the dialog to close */ - if (ce->in_async_call) - return TRUE; - - if (ce->changed) { - switch (eab_prompt_save_dialog (GTK_WINDOW (ce->app))) { - case GTK_RESPONSE_YES: - if (!eab_editor_is_valid (EAB_EDITOR (ce))) - return TRUE; - - eab_editor_save_contact (EAB_EDITOR (ce), TRUE); - return TRUE; - - case GTK_RESPONSE_NO: - break; - - case GTK_RESPONSE_CANCEL: - default: - return TRUE; - - } - } - - eab_editor_close (EAB_EDITOR (ce)); - return TRUE; -} - -static void -show_help_cb (GtkWidget *widget, gpointer data) -{ - GError *error = NULL; - - gnome_help_display_desktop (NULL, - "evolution-" BASE_VERSION, - "evolution-" BASE_VERSION ".xml", - "usage-contact-cards", - &error); - if (error != NULL) - g_warning ("%s", error->message); -} - -static GList * -add_to_tab_order(GList *list, GladeXML *gui, char *name) -{ - GtkWidget *widget = glade_xml_get_widget(gui, name); - return g_list_prepend(list, widget); -} - -static void -setup_tab_order(GladeXML *gui) -{ - GtkWidget *container; - GList *list = NULL; - - container = glade_xml_get_widget(gui, "table-contact-editor-general"); - - if (container) { - list = add_to_tab_order(list, gui, "entry-fullname"); - list = add_to_tab_order(list, gui, "entry-jobtitle"); - list = add_to_tab_order(list, gui, "entry-company"); - list = add_to_tab_order(list, gui, "combo-file-as"); - list = add_to_tab_order(list, gui, "entry-phone-1"); - list = add_to_tab_order(list, gui, "entry-phone-2"); - list = add_to_tab_order(list, gui, "entry-phone-3"); - list = add_to_tab_order(list, gui, "entry-phone-4"); - - list = add_to_tab_order(list, gui, "entry-email1"); - list = add_to_tab_order(list, gui, "alignment-htmlmail"); - list = add_to_tab_order(list, gui, "entry-web"); - list = add_to_tab_order(list, gui, "entry-homepage"); - list = add_to_tab_order(list, gui, "button-fulladdr"); - list = add_to_tab_order(list, gui, "text-address"); - list = g_list_reverse(list); - e_container_change_tab_order(GTK_CONTAINER(container), list); - g_list_free(list); - } -} - -static void -expand_phone_toggle (EContactEditor *ce) -{ - GtkWidget *phone_ext_table; - - phone_ext_table = glade_xml_get_widget (ce->gui, "table-phone-extended"); - expand_phone (ce, GTK_WIDGET_VISIBLE (phone_ext_table) ? FALSE : TRUE); -} - -static void -e_contact_editor_init (EContactEditor *e_contact_editor) -{ - GladeXML *gui; - GtkWidget *widget, *label; - char *icon_path; - - e_contact_editor->name = e_contact_name_new(); - - e_contact_editor->contact = NULL; - e_contact_editor->changed = FALSE; - e_contact_editor->image_set = FALSE; - e_contact_editor->in_async_call = FALSE; - e_contact_editor->target_editable = TRUE; - - e_contact_editor->load_source_id = 0; - e_contact_editor->load_book = NULL; - - gui = glade_xml_new (EVOLUTION_GLADEDIR "/contact-editor.glade", NULL, NULL); - e_contact_editor->gui = gui; - - setup_tab_order(gui); - - e_contact_editor->app = glade_xml_get_widget (gui, "contact editor"); - widget = e_contact_editor->app; - - gtk_window_set_type_hint (GTK_WINDOW (widget), GDK_WINDOW_TYPE_HINT_NORMAL); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (widget)->vbox), 0); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (widget)->action_area), 12); - - init_all (e_contact_editor); - - widget = glade_xml_get_widget (e_contact_editor->gui, "button-image"); - g_signal_connect (widget, "clicked", G_CALLBACK (image_clicked), e_contact_editor); - - widget = glade_xml_get_widget(e_contact_editor->gui, "button-fullname"); - g_signal_connect (widget, "clicked", G_CALLBACK (full_name_clicked), e_contact_editor); - widget = glade_xml_get_widget(e_contact_editor->gui, "button-categories"); - g_signal_connect (widget, "clicked", G_CALLBACK (categories_clicked), e_contact_editor); - widget = glade_xml_get_widget (e_contact_editor->gui, "source-option-menu-source"); - g_signal_connect (widget, "source_selected", G_CALLBACK (source_selected), e_contact_editor); - label = glade_xml_get_widget (e_contact_editor->gui, "where-label"); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), widget); - widget = glade_xml_get_widget (e_contact_editor->gui, "button-ok"); - g_signal_connect (widget, "clicked", G_CALLBACK (file_save_and_close_cb), e_contact_editor); - widget = glade_xml_get_widget (e_contact_editor->gui, "button-cancel"); - g_signal_connect (widget, "clicked", G_CALLBACK (file_cancel_cb), e_contact_editor); - widget = glade_xml_get_widget (e_contact_editor->gui, "button-help"); - g_signal_connect (widget, "clicked", G_CALLBACK (show_help_cb), e_contact_editor); - widget = glade_xml_get_widget (e_contact_editor->gui, "button-phone-expand"); - g_signal_connect_swapped (widget, "clicked", G_CALLBACK (expand_phone_toggle), e_contact_editor); - - widget = glade_xml_get_widget (e_contact_editor->gui, "entry-fullname"); - if (widget) - gtk_widget_grab_focus (widget); - - /* Connect to the deletion of the dialog */ - - g_signal_connect (e_contact_editor->app, "delete_event", - GTK_SIGNAL_FUNC (app_delete_event_cb), e_contact_editor); - - /* set the icon */ - icon_path = g_build_filename (EVOLUTION_IMAGESDIR, "evolution-contacts-mini.png", NULL); - gnome_window_icon_set_from_file (GTK_WINDOW (e_contact_editor->app), icon_path); - g_free (icon_path); - - /* show window */ - gtk_widget_show (e_contact_editor->app); -} - -void -e_contact_editor_dispose (GObject *object) -{ - EContactEditor *e_contact_editor = E_CONTACT_EDITOR(object); - - if (e_contact_editor->file_selector != NULL) { - gtk_widget_destroy (e_contact_editor->file_selector); - e_contact_editor->file_selector = NULL; - } - - if (e_contact_editor->writable_fields) { - g_object_unref(e_contact_editor->writable_fields); - e_contact_editor->writable_fields = NULL; - } - - if (e_contact_editor->contact) { - g_object_unref(e_contact_editor->contact); - e_contact_editor->contact = NULL; - } - - if (e_contact_editor->source_book) { - g_object_unref(e_contact_editor->source_book); - e_contact_editor->source_book = NULL; - } - - if (e_contact_editor->target_book) { - g_signal_handler_disconnect (e_contact_editor->target_book, e_contact_editor->target_editable_id); - g_object_unref(e_contact_editor->target_book); - e_contact_editor->target_book = NULL; - } - - if (e_contact_editor->name) { - e_contact_name_free(e_contact_editor->name); - e_contact_editor->name = NULL; - } - - if (e_contact_editor->gui) { - g_object_unref(e_contact_editor->gui); - e_contact_editor->gui = NULL; - } - - cancel_load (e_contact_editor); - - if (G_OBJECT_CLASS (parent_class)->dispose) - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -static void -supported_fields_cb (EBook *book, EBookStatus status, - EList *fields, EContactEditor *ce) -{ - if (!g_slist_find ((GSList*)eab_editor_get_all_editors (), ce)) { - g_warning ("supported_fields_cb called for book that's still around, but contact editor that's been destroyed."); - return; - } - - g_object_set (ce, - "writable_fields", fields, - NULL); - - eab_editor_show (EAB_EDITOR (ce)); - - sensitize_all (ce); -} - -static void -contact_editor_destroy_notify (void *data, - GObject *where_the_object_was) -{ - eab_editor_remove (EAB_EDITOR (data)); -} - -EContactEditor * -e_contact_editor_new (EBook *book, - EContact *contact, - gboolean is_new_contact, - gboolean editable) -{ - EContactEditor *ce; - - g_return_val_if_fail (E_IS_BOOK (book), NULL); - g_return_val_if_fail (E_IS_CONTACT (contact), NULL); - - ce = g_object_new (E_TYPE_CONTACT_EDITOR, NULL); - - eab_editor_add (EAB_EDITOR (ce)); - g_object_weak_ref (G_OBJECT (ce), contact_editor_destroy_notify, ce); - - g_object_set (ce, - "source_book", book, - "contact", contact, - "is_new_contact", is_new_contact, - "editable", editable, - NULL); - - if (book) - e_book_async_get_supported_fields (book, (EBookEListCallback)supported_fields_cb, ce); - - return ce; -} - -static void -writable_changed (EBook *book, gboolean writable, EContactEditor *ce) -{ - int new_target_editable; - gboolean changed = FALSE; - - new_target_editable = e_book_is_writable (ce->target_book); - - if (ce->target_editable != new_target_editable) - changed = TRUE; - - ce->target_editable = new_target_editable; - - if (changed) - sensitize_all (ce); -} - -static void -e_contact_editor_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) -{ - EContactEditor *editor; - - editor = E_CONTACT_EDITOR (object); - - switch (prop_id){ - case PROP_SOURCE_BOOK: { - gboolean writable; - gboolean changed = FALSE; - EBook *source_book; - - source_book = E_BOOK (g_value_get_object (value)); - - if (source_book == editor->source_book) - break; - - if (editor->source_book) - g_object_unref(editor->source_book); - - editor->source_book = source_book; - g_object_ref (editor->source_book); - - if (!editor->target_book) { - editor->target_book = editor->source_book; - g_object_ref (editor->target_book); - - editor->target_editable_id = g_signal_connect (editor->target_book, "writable_status", - G_CALLBACK (writable_changed), editor); - - e_book_async_get_supported_fields (editor->target_book, - (EBookEListCallback) supported_fields_cb, editor); - } - - writable = e_book_is_writable (editor->target_book); - if (writable != editor->target_editable) { - editor->target_editable = writable; - changed = TRUE; - } - - if (changed) - sensitize_all (editor); - - break; - } - - case PROP_TARGET_BOOK: { - gboolean writable; - gboolean changed = FALSE; - EBook *target_book; - - target_book = E_BOOK (g_value_get_object (value)); - - if (target_book == editor->target_book) - break; - - if (editor->target_book) { - g_signal_handler_disconnect (editor->target_book, editor->target_editable_id); - g_object_unref(editor->target_book); - } - - editor->target_book = target_book; - g_object_ref (editor->target_book); - - editor->target_editable_id = g_signal_connect (editor->target_book, "writable_status", - G_CALLBACK (writable_changed), editor); - - e_book_async_get_supported_fields (editor->target_book, - (EBookEListCallback) supported_fields_cb, editor); - - if (!editor->is_new_contact) - editor->changed = TRUE; - - writable = e_book_is_writable (editor->target_book); - - if (writable != editor->target_editable) { - editor->target_editable = writable; - changed = TRUE; - } - - if (changed) - sensitize_all (editor); - - /* If we're trying to load a new target book, cancel that here. */ - cancel_load (editor); - break; - } - - case PROP_CONTACT: - if (editor->contact) - g_object_unref(editor->contact); - editor->contact = e_contact_duplicate(E_CONTACT(g_value_get_object (value))); - fill_in_all (editor); - editor->changed = FALSE; - break; - - case PROP_IS_NEW_CONTACT: - editor->is_new_contact = g_value_get_boolean (value) ? TRUE : FALSE; - break; - - case PROP_EDITABLE: { - gboolean new_value = g_value_get_boolean (value) ? TRUE : FALSE; - gboolean changed = (editor->target_editable != new_value); - - editor->target_editable = new_value; - - if (changed) - sensitize_all (editor); - break; - } - - case PROP_CHANGED: { - gboolean new_value = g_value_get_boolean (value) ? TRUE : FALSE; - gboolean changed = (editor->changed != new_value); - - editor->changed = new_value; - - if (changed) - sensitize_ok (editor); - break; - } - case PROP_WRITABLE_FIELDS: - if (editor->writable_fields) - g_object_unref(editor->writable_fields); - - editor->writable_fields = g_value_get_object (value); - if (editor->writable_fields) - g_object_ref (editor->writable_fields); - else - editor->writable_fields = e_list_new(NULL, NULL, NULL); - - sensitize_all (editor); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_contact_editor_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) -{ - EContactEditor *e_contact_editor; - - e_contact_editor = E_CONTACT_EDITOR (object); - - switch (prop_id) { - case PROP_SOURCE_BOOK: - g_value_set_object (value, e_contact_editor->source_book); - break; - - case PROP_TARGET_BOOK: - g_value_set_object (value, e_contact_editor->target_book); - break; - - case PROP_CONTACT: - extract_all (e_contact_editor); - g_value_set_object (value, e_contact_editor->contact); - break; - - case PROP_IS_NEW_CONTACT: - g_value_set_boolean (value, e_contact_editor->is_new_contact ? TRUE : FALSE); - break; - - case PROP_EDITABLE: - g_value_set_boolean (value, e_contact_editor->target_editable ? TRUE : FALSE); - break; - - case PROP_CHANGED: - g_value_set_boolean (value, e_contact_editor->changed ? TRUE : FALSE); - break; - - case PROP_WRITABLE_FIELDS: - if (e_contact_editor->writable_fields) - g_value_set_object (value, e_list_duplicate (e_contact_editor->writable_fields)); - else - g_value_set_object (value, NULL); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -/** - * e_contact_editor_raise: - * @config: The %EContactEditor object. - * - * Raises the dialog associated with this %EContactEditor object. - */ -static void -e_contact_editor_raise (EABEditor *editor) -{ - EContactEditor *ce = E_CONTACT_EDITOR (editor); - - if (GTK_WIDGET (ce->app)->window) - gdk_window_raise (GTK_WIDGET (ce->app)->window); -} - -/** - * e_contact_editor_show: - * @ce: The %EContactEditor object. - * - * Shows the dialog associated with this %EContactEditor object. - */ -static void -e_contact_editor_show (EABEditor *editor) -{ - EContactEditor *ce = E_CONTACT_EDITOR (editor); - gtk_widget_show (ce->app); -} - -GtkWidget * -e_contact_editor_create_date(gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2); - -GtkWidget * -e_contact_editor_create_date(gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2) -{ - GtkWidget *widget = e_date_edit_new (); - e_date_edit_set_allow_no_date_set (E_DATE_EDIT (widget), - TRUE); - e_date_edit_set_show_time (E_DATE_EDIT (widget), FALSE); - e_date_edit_set_time (E_DATE_EDIT (widget), -1); - gtk_widget_show (widget); - return widget; -} - -GtkWidget * -e_contact_editor_create_web(gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2); - -GtkWidget * -e_contact_editor_create_web(gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2) -{ - GtkWidget *widget = e_url_entry_new (); - gtk_widget_show (widget); - return widget; -} - -GtkWidget * -e_contact_editor_create_source_option_menu (gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2); - -GtkWidget * -e_contact_editor_create_source_option_menu (gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2) -{ - GtkWidget *menu; - GConfClient *gconf_client; - ESourceList *source_list; - - gconf_client = gconf_client_get_default (); - source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/addressbook/sources"); - - menu = e_source_option_menu_new (source_list); - g_object_unref (source_list); - - gtk_widget_show (menu); - return menu; -} diff --git a/addressbook/gui/contact-editor/e-contact-editor.h b/addressbook/gui/contact-editor/e-contact-editor.h deleted file mode 100644 index 6474e3c3a0..0000000000 --- a/addressbook/gui/contact-editor/e-contact-editor.h +++ /dev/null @@ -1,114 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-editor.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_CONTACT_EDITOR_H__ -#define __E_CONTACT_EDITOR_H__ - -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-app-helper.h> -#include <bonobo/bonobo-ui-component.h> -#include <glade/glade.h> - -#include "addressbook/gui/contact-editor/eab-editor.h" - -#include <libebook/e-book.h> -#include <libebook/e-contact.h> - -#include <gtk/gtktreeview.h> -#include <gtk/gtkliststore.h> - -G_BEGIN_DECLS - -/* EContactEditor - A dialog displaying information about a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - * card ECard * RW The card currently being edited - */ - -#define E_TYPE_CONTACT_EDITOR (e_contact_editor_get_type ()) -#define E_CONTACT_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CONTACT_EDITOR, EContactEditor)) -#define E_CONTACT_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CONTACT_EDITOR, EContactEditorClass)) -#define E_IS_CONTACT_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CONTACT_EDITOR)) -#define E_IS_CONTACT_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_CONTACT_EDITOR)) - - -typedef struct _EContactEditor EContactEditor; -typedef struct _EContactEditorClass EContactEditorClass; - -struct _EContactEditor -{ - EABEditor object; - - /* item specific fields */ - EBook *source_book; - EBook *target_book; - EContact *contact; - - /* UI handler */ - BonoboUIComponent *uic; - - GladeXML *gui; - GtkWidget *app; - - GtkWidget *file_selector; - - EContactName *name; - - /* Whether we are editing a new contact or an existing one */ - guint is_new_contact : 1; - - /* Whether the image chooser widget has been changed. */ - guint image_set : 1; - - /* Whether the contact has been changed since bringing up the contact editor */ - guint changed : 1; - - /* Whether the contact editor will accept modifications, save */ - guint target_editable : 1; - - /* Whether an async wombat call is in progress */ - guint in_async_call : 1; - - EList *writable_fields; - - /* ID for async load_source call */ - guint load_source_id; - EBook *load_book; - - /* signal ids for "writable_status" */ - int target_editable_id; -}; - -struct _EContactEditorClass -{ - EABEditorClass parent_class; -}; - -EContactEditor *e_contact_editor_new (EBook *book, - EContact *contact, - gboolean is_new_contact, - gboolean editable); -GType e_contact_editor_get_type (void); - -G_END_DECLS - -#endif /* __E_CONTACT_EDITOR_H__ */ diff --git a/addressbook/gui/contact-editor/e-contact-quick-add.c b/addressbook/gui/contact-editor/e-contact-quick-add.c deleted file mode 100644 index a317075450..0000000000 --- a/addressbook/gui/contact-editor/e-contact-quick-add.c +++ /dev/null @@ -1,447 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-contact-quick-add.c - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#include <config.h> -#include <ctype.h> -#include <string.h> -#include <glib.h> -#include <gtk/gtkentry.h> -#include <gtk/gtklabel.h> -#include <gtk/gtktable.h> -#include <gtk/gtkdialog.h> -#include <gtk/gtkstock.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-app.h> -#include <libebook/e-book.h> -#include <libebook/e-contact.h> -#include <addressbook/gui/component/addressbook.h> -#include <addressbook/util/eab-book-util.h> -#include "e-contact-editor.h" -#include "e-contact-quick-add.h" -#include "eab-contact-merging.h" - -typedef struct _QuickAdd QuickAdd; -struct _QuickAdd { - gchar *name; - gchar *email; - EContact *contact; - - EContactQuickAddCallback cb; - gpointer closure; - - GtkWidget *name_entry; - GtkWidget *email_entry; - - gint refs; - -}; - -static QuickAdd * -quick_add_new (void) -{ - QuickAdd *qa = g_new0 (QuickAdd, 1); - qa->contact = e_contact_new (); - qa->refs = 1; - return qa; -} - -static void -quick_add_ref (QuickAdd *qa) -{ - if (qa) { - ++qa->refs; - } -} - -static void -quick_add_unref (QuickAdd *qa) -{ - if (qa) { - --qa->refs; - if (qa->refs == 0) { - g_free (qa->name); - g_free (qa->email); - g_object_unref (qa->contact); - g_free (qa); - } - } -} - -static void -quick_add_set_name (QuickAdd *qa, const gchar *name) -{ - if (name == qa->name) - return; - - g_free (qa->name); - qa->name = g_strdup (name); - - e_contact_set (qa->contact, E_CONTACT_FULL_NAME, (char *) name); -} - -static void -quick_add_set_email (QuickAdd *qa, const gchar *email) -{ - if (email == qa->email) - return; - - g_free (qa->email); - qa->email = g_strdup (email); - - e_contact_set (qa->contact, E_CONTACT_EMAIL_1, (char*)email); -} - -static void -merge_cb (EBook *book, EBookStatus status, gpointer closure) -{ - QuickAdd *qa = (QuickAdd *) closure; - - if (status == E_BOOK_ERROR_OK) { - eab_merging_book_add_contact (book, qa->contact, NULL, NULL); - if (qa->cb) - qa->cb (qa->contact, qa->closure); - g_object_unref (book); - } else { - /* Something went wrong. */ - if (book) - g_object_unref (book); - if (qa->cb) - qa->cb (NULL, qa->closure); - } - - quick_add_unref (qa); -} - -static void -quick_add_merge_contact (QuickAdd *qa) -{ - quick_add_ref (qa); - - addressbook_load_default_book (merge_cb, qa); -} - - -/* - * Raise a contact editor with all fields editable, and hook up all signals accordingly. - */ - -static void -contact_added_cb (EContactEditor *ce, EBookStatus status, EContact *contact, gpointer closure) -{ - QuickAdd *qa = (QuickAdd *) g_object_get_data (G_OBJECT (ce), "quick_add"); - - if (qa) { - - if (qa->cb) - qa->cb (qa->contact, qa->closure); - - /* We don't need to unref qa because we set_data_full below */ - g_object_set_data (G_OBJECT (ce), "quick_add", NULL); - } -} - -static void -editor_closed_cb (GtkWidget *w, gpointer closure) -{ - QuickAdd *qa = (QuickAdd *) g_object_get_data (G_OBJECT (w), "quick_add"); - - if (qa) - /* We don't need to unref qa because we set_data_full below */ - g_object_set_data (G_OBJECT (w), "quick_add", NULL); - - g_object_unref (w); -} - -static void -ce_have_book (EBook *book, EBookStatus status, gpointer closure) -{ - QuickAdd *qa = (QuickAdd *) closure; - - if (status != E_BOOK_ERROR_OK) { - if (book) - g_object_unref (book); - g_warning ("Couldn't open local address book."); - quick_add_unref (qa); - } else { - EContactEditor *contact_editor = e_contact_editor_new (book, qa->contact, TRUE, TRUE /* XXX */); - - /* mark it as changed so the Save buttons are enabled when we bring up the dialog. */ - g_object_set (contact_editor, - "changed", TRUE, - NULL); - - /* We pass this via object data, so that we don't get a dangling pointer referenced if both - the "contact_added" and "editor_closed" get emitted. (Which, based on a backtrace in bugzilla, - I think can happen and cause a crash. */ - g_object_set_data_full (G_OBJECT (contact_editor), "quick_add", qa, - (GDestroyNotify) quick_add_unref); - - g_signal_connect (contact_editor, - "contact_added", - G_CALLBACK (contact_added_cb), - NULL); - g_signal_connect (contact_editor, - "editor_closed", - G_CALLBACK (editor_closed_cb), - NULL); - - g_object_unref (book); - } -} - -static void -edit_contact (QuickAdd *qa) -{ - addressbook_load_default_book (ce_have_book, qa); -} - -#define QUICK_ADD_RESPONSE_EDIT_FULL 2 - -static void -clicked_cb (GtkWidget *w, gint button, gpointer closure) -{ - QuickAdd *qa = (QuickAdd *) closure; - - /* Get data out of entries. */ - if (button == GTK_RESPONSE_OK || button == QUICK_ADD_RESPONSE_EDIT_FULL) { - gchar *name = NULL; - gchar *email = NULL; - - if (qa->name_entry) { - gchar *tmp; - tmp = gtk_editable_get_chars (GTK_EDITABLE (qa->name_entry), 0, -1); - name = tmp; - } - - if (qa->email_entry) { - gchar *tmp; - tmp = gtk_editable_get_chars (GTK_EDITABLE (qa->email_entry), 0, -1); - email = tmp; - } - - quick_add_set_name (qa, name); - quick_add_set_email (qa, email); - - g_free (name); - g_free (email); - } - - gtk_widget_destroy (w); - - if (button == GTK_RESPONSE_OK) { - - /* OK */ - quick_add_merge_contact (qa); - - } else if (button == QUICK_ADD_RESPONSE_EDIT_FULL) { - - /* EDIT FULL */ - edit_contact (qa); - - } else { - /* CANCEL */ - quick_add_unref (qa); - } - -} - -static GtkWidget * -build_quick_add_dialog (QuickAdd *qa) -{ - GtkWidget *dialog; - GtkTable *table; - const gint xpad=6, ypad=6; - - g_return_val_if_fail (qa != NULL, NULL); - - dialog = gtk_dialog_new_with_buttons (_("Contact Quick-Add"), - NULL, /* XXX */ - (GtkDialogFlags) 0, - _("_Edit Full"), QUICK_ADD_RESPONSE_EDIT_FULL, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); - - g_signal_connect (dialog, "response", G_CALLBACK (clicked_cb), qa); - - qa->name_entry = gtk_entry_new (); - if (qa->name) - gtk_entry_set_text (GTK_ENTRY (qa->name_entry), qa->name); - - - qa->email_entry = gtk_entry_new (); - if (qa->email) - gtk_entry_set_text (GTK_ENTRY (qa->email_entry), qa->email); - - table = GTK_TABLE (gtk_table_new (2, 2, FALSE)); - - gtk_table_attach (table, gtk_label_new_with_mnemonic (_("_Full Name:")), - 0, 1, 0, 1, - 0, 0, xpad, ypad); - gtk_table_attach (table, qa->name_entry, - 1, 2, 0, 1, - GTK_EXPAND | GTK_FILL, GTK_EXPAND, xpad, ypad); - gtk_table_attach (table, gtk_label_new_with_mnemonic (_("E-_mail:")), - 0, 1, 1, 2, - 0, 0, xpad, ypad); - gtk_table_attach (table, qa->email_entry, - 1, 2, 1, 2, - GTK_EXPAND | GTK_FILL, GTK_EXPAND, xpad, ypad); - gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), - 6); - - gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox),6); - - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), - GTK_WIDGET (table), - TRUE, TRUE, 6); - gtk_widget_show_all (GTK_WIDGET (table)); - - - return dialog; -} - -void -e_contact_quick_add (const gchar *in_name, const gchar *email, - EContactQuickAddCallback cb, gpointer closure) -{ - QuickAdd *qa; - GtkWidget *dialog; - gchar *name = NULL; - gint len; - - /* We need to have *something* to work with. */ - if (in_name == NULL && email == NULL) { - if (cb) - cb (NULL, closure); - return; - } - - if (in_name) { - name = g_strdup (in_name); - - /* Remove extra whitespace and the quotes some mailers put around names. */ - g_strstrip (name); - len = strlen (name); - if ((name[0] == '\'' && name[len-1] == '\'') || (name[0] == '"' && name[len-1] == '"')) { - name[0] = ' '; - name[len-1] = ' '; - } - g_strstrip (name); - } - - qa = quick_add_new (); - qa->cb = cb; - qa->closure = closure; - if (name) - quick_add_set_name (qa, name); - if (email) - quick_add_set_email (qa, email); - - dialog = build_quick_add_dialog (qa); - gtk_widget_show_all (dialog); - - g_free (name); -} - -void -e_contact_quick_add_free_form (const gchar *text, EContactQuickAddCallback cb, gpointer closure) -{ - gchar *name=NULL, *email=NULL; - const gchar *last_at, *s; - gboolean in_quote; - - if (text == NULL) { - e_contact_quick_add (NULL, NULL, cb, closure); - return; - } - - /* Look for things that look like e-mail addresses embedded in text */ - in_quote = FALSE; - last_at = NULL; - for (s = text; *s; ++s) { - if (*s == '@' && !in_quote) - last_at = s; - else if (*s == '"') - in_quote = !in_quote; - } - - - if (last_at == NULL) { - /* No at sign, so we treat it all as the name */ - name = g_strdup (text); - } else { - gboolean bad_char = FALSE; - - /* walk backwards to whitespace or a < or a quote... */ - while (last_at >= text && !bad_char - && !(isspace ((gint) *last_at) || *last_at == '<' || *last_at == '"')) { - /* Check for some stuff that can't appear in a legal e-mail address. */ - if (*last_at == '[' - || *last_at == ']' - || *last_at == '(' - || *last_at == ')') - bad_char = TRUE; - --last_at; - } - if (last_at < text) - last_at = text; - - /* ...and then split the text there */ - if (!bad_char) { - if (text < last_at) - name = g_strndup (text, last_at-text); - email = g_strdup (last_at); - } - } - - /* If all else has failed, make it the name. */ - if (name == NULL && email == NULL) - name = g_strdup (text); - - - - /* Clean up email, remove bracketing <>s */ - if (email && *email) { - gboolean changed = FALSE; - g_strstrip (email); - if (*email == '<') { - *email = ' '; - changed = TRUE; - } - if (email[strlen (email)-1] == '>') { - email[strlen (email)-1] = ' '; - changed = TRUE; - } - if (changed) - g_strstrip (email); - } - - - e_contact_quick_add (name, email, cb, closure); - g_free (name); - g_free (email); -} diff --git a/addressbook/gui/contact-editor/e-contact-quick-add.h b/addressbook/gui/contact-editor/e-contact-quick-add.h deleted file mode 100644 index a969211915..0000000000 --- a/addressbook/gui/contact-editor/e-contact-quick-add.h +++ /dev/null @@ -1,40 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-contact-quick-add.h - * - * Copyright (C) 2001 Ximian, Inc. - * - * Developed by Jon Trowbridge <trow@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef __E_CONTACT_QUICK_ADD_H__ -#define __E_CONTACT_QUICK_ADD_H__ - -#include <libebook/e-contact.h> - -typedef void (*EContactQuickAddCallback) (EContact *new_contact, gpointer closure); - -void e_contact_quick_add (const gchar *name, const gchar *email, - EContactQuickAddCallback cb, gpointer closure); - -void e_contact_quick_add_free_form (const gchar *text, EContactQuickAddCallback cb, gpointer closure); - -#endif /* __E_CONTACT_QUICK_ADD_H__ */ - diff --git a/addressbook/gui/contact-editor/eab-editor.c b/addressbook/gui/contact-editor/eab-editor.c deleted file mode 100644 index 4f535e47c8..0000000000 --- a/addressbook/gui/contact-editor/eab-editor.c +++ /dev/null @@ -1,390 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* eab-editor.c - * Copyright (C) 2004 Novell, Inc. - * Author: Chris Toshok <toshok@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gtk/gtkstock.h> -#include <gtk/gtkmessagedialog.h> -#include <libgnome/gnome-i18n.h> - -#include "eab-editor.h" -#include "addressbook/gui/widgets/eab-gui-util.h" -#include "e-contact-editor-marshal.h" - -static void eab_editor_default_show (EABEditor *editor); -static void eab_editor_default_raise (EABEditor *editor); -static void eab_editor_default_close (EABEditor *editor); -static void eab_editor_class_init (EABEditorClass *klass); -static void eab_editor_init (EABEditor *editor); - -/* Signal IDs */ -enum { - CONTACT_ADDED, - CONTACT_MODIFIED, - CONTACT_DELETED, - EDITOR_CLOSED, - LAST_SIGNAL -}; - -static GSList *all_editors = NULL; - -static GtkObjectClass *parent_class = NULL; - -static guint editor_signals[LAST_SIGNAL]; - -GType -eab_editor_get_type (void) -{ - static GType editor_type = 0; - - if (!editor_type) { - static const GTypeInfo editor_info = { - sizeof (EABEditorClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) eab_editor_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EABEditor), - 0, /* n_preallocs */ - (GInstanceInitFunc) eab_editor_init, - }; - - editor_type = g_type_register_static (G_TYPE_OBJECT, "EABEditor", &editor_info, 0); - } - - return editor_type; -} - -static void -eab_editor_default_show (EABEditor *editor) -{ - g_warning ("abstract eab_editor_show called"); -} - -static void -eab_editor_default_close (EABEditor *editor) -{ - g_warning ("abstract eab_editor_close called"); -} - -static void -eab_editor_default_raise (EABEditor *editor) -{ - g_warning ("abstract eab_editor_raise called"); -} - -static void -eab_editor_default_save_contact (EABEditor *editor, gboolean should_close) -{ - g_warning ("abstract eab_editor_save_contact called"); -} - -static gboolean -eab_editor_default_is_valid (EABEditor *editor) -{ - g_warning ("abstract eab_editor_is_valid called"); - return FALSE; -} - -static gboolean -eab_editor_default_is_changed (EABEditor *editor) -{ - g_warning ("abstract eab_editor_is_changed called"); - return FALSE; -} - -static GtkWindow* -eab_editor_default_get_window (EABEditor *editor) -{ - g_warning ("abstract eab_editor_get_window called"); - return NULL; -} - -static void -eab_editor_class_init (EABEditorClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - parent_class = g_type_class_ref (G_TYPE_OBJECT); - - klass->show = eab_editor_default_show; - klass->close = eab_editor_default_close; - klass->raise = eab_editor_default_raise; - klass->save_contact = eab_editor_default_save_contact; - klass->is_valid = eab_editor_default_is_valid; - klass->is_changed = eab_editor_default_is_changed; - klass->get_window = eab_editor_default_get_window; - - editor_signals[CONTACT_ADDED] = - g_signal_new ("contact_added", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EABEditorClass, contact_added), - NULL, NULL, - e_contact_editor_marshal_NONE__INT_OBJECT, - G_TYPE_NONE, 2, - G_TYPE_INT, G_TYPE_OBJECT); - - editor_signals[CONTACT_MODIFIED] = - g_signal_new ("contact_modified", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EABEditorClass, contact_modified), - NULL, NULL, - e_contact_editor_marshal_NONE__INT_OBJECT, - G_TYPE_NONE, 2, - G_TYPE_INT, G_TYPE_OBJECT); - - editor_signals[CONTACT_DELETED] = - g_signal_new ("contact_deleted", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EABEditorClass, contact_deleted), - NULL, NULL, - e_contact_editor_marshal_NONE__INT_OBJECT, - G_TYPE_NONE, 2, - G_TYPE_INT, G_TYPE_OBJECT); - - editor_signals[EDITOR_CLOSED] = - g_signal_new ("editor_closed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EABEditorClass, editor_closed), - NULL, NULL, - e_contact_editor_marshal_NONE__NONE, - G_TYPE_NONE, 0); -} - -static void -eab_editor_init (EABEditor *editor) -{ -} - - - -void -eab_editor_show (EABEditor *editor) -{ - g_return_if_fail (EAB_IS_EDITOR (editor)); - - if (EAB_EDITOR_GET_CLASS(editor)->show) - EAB_EDITOR_GET_CLASS(editor)->show (editor); -} - -void -eab_editor_close (EABEditor *editor) -{ - g_return_if_fail (EAB_IS_EDITOR (editor)); - - if (EAB_EDITOR_GET_CLASS(editor)->close) - EAB_EDITOR_GET_CLASS(editor)->close (editor); -} - -void -eab_editor_raise (EABEditor *editor) -{ - g_return_if_fail (EAB_IS_EDITOR (editor)); - - if (EAB_EDITOR_GET_CLASS(editor)->raise) - EAB_EDITOR_GET_CLASS(editor)->raise (editor); -} - -void -eab_editor_save_contact (EABEditor *editor, gboolean should_close) -{ - g_return_if_fail (EAB_IS_EDITOR (editor)); - - if (EAB_EDITOR_GET_CLASS(editor)->save_contact) - EAB_EDITOR_GET_CLASS(editor)->save_contact (editor, should_close); -} - -gboolean -eab_editor_is_changed (EABEditor *editor) -{ - g_return_val_if_fail (EAB_IS_EDITOR (editor), FALSE); - - if (EAB_EDITOR_GET_CLASS(editor)->is_changed) - return EAB_EDITOR_GET_CLASS(editor)->is_changed (editor); - else - return FALSE; -} - -gboolean -eab_editor_is_valid (EABEditor *editor) -{ - g_return_val_if_fail (EAB_IS_EDITOR (editor), FALSE); - - if (EAB_EDITOR_GET_CLASS(editor)->is_valid) - return EAB_EDITOR_GET_CLASS(editor)->is_valid (editor); - else - return FALSE; -} - -GtkWindow* -eab_editor_get_window (EABEditor *editor) -{ - g_return_val_if_fail (EAB_IS_EDITOR (editor), NULL); - - if (EAB_EDITOR_GET_CLASS(editor)->get_window) - return EAB_EDITOR_GET_CLASS(editor)->get_window (editor); - else - return NULL; -} - -gboolean -eab_editor_prompt_to_save_changes (EABEditor *editor, GtkWindow *window) -{ - if (!eab_editor_is_changed (editor)) - return TRUE; - - switch (eab_prompt_save_dialog (window)) { - case GTK_RESPONSE_YES: - if (!eab_editor_is_valid (editor)) { - return FALSE; - } - eab_editor_save_contact (editor, FALSE); - return TRUE; - case GTK_RESPONSE_NO: - return TRUE; - case GTK_RESPONSE_CANCEL: - default: - return FALSE; - } -} - -gboolean -eab_editor_request_close_all (void) -{ - GSList *p; - GSList *pnext; - gboolean retval; - - retval = TRUE; - for (p = all_editors; p != NULL; p = pnext) { - EABEditor *editor = EAB_EDITOR (p->data); - GtkWindow *window = eab_editor_get_window (editor); - - pnext = p->next; - - eab_editor_raise (editor); - if (! eab_editor_prompt_to_save_changes (editor, window)) { - retval = FALSE; - break; - } - eab_editor_close (editor); - } - - return retval; -} - -const GSList* -eab_editor_get_all_editors (void) -{ - return all_editors; -} - -gboolean -eab_editor_confirm_delete (GtkWindow *parent) -{ - GtkWidget *dialog; - gint result; - - dialog = gtk_message_dialog_new (parent, - 0, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, -#if notyet - /* XXX we really need to handle the plural case here.. */ - (plural - ? _("Are you sure you want\n" - "to delete these contacts?")) -#endif - _("Are you sure you want\n" - "to delete this contact?")); - - gtk_dialog_add_buttons (GTK_DIALOG (dialog), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_DELETE, GTK_RESPONSE_ACCEPT, - NULL); - - result = gtk_dialog_run(GTK_DIALOG (dialog)); - - gtk_widget_destroy (dialog); - - return (result == GTK_RESPONSE_ACCEPT); -} - - -void -eab_editor_contact_added (EABEditor *editor, EBookStatus status, EContact *contact) -{ - g_return_if_fail (EAB_IS_EDITOR (editor)); - g_return_if_fail (E_IS_CONTACT (contact)); - - g_signal_emit (editor, editor_signals[CONTACT_ADDED], 0, - status, contact); -} - -void -eab_editor_contact_modified (EABEditor *editor, EBookStatus status, EContact *contact) -{ - g_return_if_fail (EAB_IS_EDITOR (editor)); - g_return_if_fail (E_IS_CONTACT (contact)); - - g_signal_emit (editor, editor_signals[CONTACT_MODIFIED], 0, - status, contact); -} - -void -eab_editor_contact_deleted (EABEditor *editor, EBookStatus status, EContact *contact) -{ - g_return_if_fail (EAB_IS_EDITOR (editor)); - g_return_if_fail (E_IS_CONTACT (contact)); - - g_signal_emit (editor, editor_signals[CONTACT_DELETED], 0, - status, contact); -} - -void -eab_editor_closed (EABEditor *editor) -{ - g_return_if_fail (EAB_IS_EDITOR (editor)); - - g_signal_emit (editor, editor_signals[EDITOR_CLOSED], 0); -} - -void -eab_editor_add (EABEditor *editor) -{ - g_return_if_fail (EAB_IS_EDITOR (editor)); - - all_editors = g_slist_prepend (all_editors, editor); -} - -void -eab_editor_remove (EABEditor *editor) -{ - g_return_if_fail (EAB_IS_EDITOR (editor)); - - all_editors = g_slist_remove (all_editors, editor); -} diff --git a/addressbook/gui/contact-editor/eab-editor.h b/addressbook/gui/contact-editor/eab-editor.h deleted file mode 100644 index 6c1afccf21..0000000000 --- a/addressbook/gui/contact-editor/eab-editor.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* eab-editor.h - * Copyright (C) 2004 Novell, Inc. - * Author: Chris Toshok <toshok@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __EAB_EDITOR_H__ -#define __EAB_EDITOR_H__ - -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-app-helper.h> -#include <bonobo/bonobo-ui-component.h> -#include <glade/glade.h> - -#include <libebook/e-book.h> -#include <libebook/e-contact.h> - -#include <gtk/gtktreeview.h> -#include <gtk/gtkliststore.h> - -G_BEGIN_DECLS - -/* EABEditor - A dialog displaying information about a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - * card ECard * RW The card currently being edited - */ - -#define EAB_TYPE_EDITOR (eab_editor_get_type ()) -#define EAB_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EAB_TYPE_EDITOR, EABEditor)) -#define EAB_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EAB_TYPE_EDITOR, EABEditorClass)) -#define EAB_IS_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EAB_TYPE_EDITOR)) -#define EAB_IS_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EAB_TYPE_EDITOR)) -#define EAB_EDITOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EAB_EDITOR_TYPE, EABEditorClass)) - - -typedef struct _EABEditor EABEditor; -typedef struct _EABEditorClass EABEditorClass; - -struct _EABEditor -{ - GObject parent; -}; - -struct _EABEditorClass -{ - GObjectClass parent_class; - - /* virtual functions */ - void (* show) (EABEditor *editor); - void (* close) (EABEditor *editor); - void (* raise) (EABEditor *editor); - void (* save_contact) (EABEditor *editor, gboolean should_close); - gboolean (* is_valid) (EABEditor *editor); - gboolean (* is_changed) (EABEditor *editor); - GtkWindow* (* get_window) (EABEditor *editor); - - /* signals */ - void (* contact_added) (EABEditor *editor, EBookStatus status, EContact *contact); - void (* contact_modified) (EABEditor *editor, EBookStatus status, EContact *contact); - void (* contact_deleted) (EABEditor *editor, EBookStatus status, EContact *contact); - void (* editor_closed) (EABEditor *editor); -}; - -GType eab_editor_get_type (void); - -/* virtual functions */ -void eab_editor_show (EABEditor *editor); -void eab_editor_close (EABEditor *editor); -void eab_editor_raise (EABEditor *editor); -void eab_editor_save_contact (EABEditor *editor, gboolean should_close); -gboolean eab_editor_is_valid (EABEditor *editor); -gboolean eab_editor_is_changed (EABEditor *editor); -GtkWindow* eab_editor_get_window (EABEditor *editor); - -gboolean eab_editor_prompt_to_save_changes (EABEditor *editor, GtkWindow *window); -gboolean eab_editor_confirm_delete (GtkWindow *parent); - -/* these four generate EABEditor signals */ -void eab_editor_contact_added (EABEditor *editor, EBookStatus status, EContact *contact); -void eab_editor_contact_modified (EABEditor *editor, EBookStatus status, EContact *contact); -void eab_editor_contact_deleted (EABEditor *editor, EBookStatus status, EContact *contact); -void eab_editor_closed (EABEditor *editor); - -/* these maintain the global list of editors so we can prompt the user - if there are unsaved changes when they exit. */ -void eab_editor_add (EABEditor *editor); -void eab_editor_remove (EABEditor *editor); -gboolean eab_editor_request_close_all (void); -const GSList* eab_editor_get_all_editors (void); - -G_END_DECLS - -#endif /* __E_CONTACT_EDITOR_H__ */ diff --git a/addressbook/gui/contact-editor/fulladdr.glade b/addressbook/gui/contact-editor/fulladdr.glade deleted file mode 100644 index c7767b9751..0000000000 --- a/addressbook/gui/contact-editor/fulladdr.glade +++ /dev/null @@ -1,446 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> - -<widget class="GtkDialog" id="dialog-checkaddress"> - <property name="title" translatable="yes">Full Address</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">True</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="has_separator">True</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="vbox-container"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">8</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="hbuttonbox1"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - - <child> - <widget class="GtkButton" id="button1"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="has_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-ok</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">0</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="button2"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">0</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="table-checkaddress"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="n_rows">4</property> - <property name="n_columns">4</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label-street"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Address:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-street</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-city"> - <property name="visible">True</property> - <property name="label" translatable="yes">Ci_ty:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-city</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-city"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-ext"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-po"> - <property name="visible">True</property> - <property name="label" translatable="yes">_PO Box:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-po</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-ext"> - <property name="visible">True</property> - <property name="label" translatable="yes">Address _2:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-ext</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-po"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-street"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">4</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-region"> - <property name="visible">True</property> - <property name="label" translatable="yes">_State/Province:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-region</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-region"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkCombo" id="combo-country"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="value_in_list">False</property> - <property name="allow_empty">True</property> - <property name="case_sensitive">False</property> - <property name="enable_arrow_keys">True</property> - <property name="enable_arrows_always">False</property> - - <child internal-child="entry"> - <widget class="GtkEntry" id="entry-country"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - </child> - - <child internal-child="list"> - <widget class="GtkList" id="convertwidget1"> - <property name="visible">True</property> - <property name="selection_mode">GTK_SELECTION_BROWSE</property> - - <child> - <widget class="GtkListItem" id="convertwidget2"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget3"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-code"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-code"> - <property name="visible">True</property> - <property name="label" translatable="yes">_ZIP Code:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-code</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-country"> - <property name="visible">True</property> - <property name="label" translatable="yes">Countr_y:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-country</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -</glade-interface> diff --git a/addressbook/gui/contact-editor/fullname.glade b/addressbook/gui/contact-editor/fullname.glade deleted file mode 100644 index f2ae7c92eb..0000000000 --- a/addressbook/gui/contact-editor/fullname.glade +++ /dev/null @@ -1,681 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> - -<widget class="GtkDialog" id="dialog-checkfullname"> - <property name="title" translatable="yes">Full Name</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">True</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="decorated">True</property> - <property name="skip_taskbar_hint">False</property> - <property name="skip_pager_hint">False</property> - <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> - <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> - <property name="has_separator">False</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="vbox-container"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">8</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="hbuttonbox1"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - - <child> - <widget class="GtkButton" id="button1"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-ok</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <property name="response_id">0</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="button2"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <property name="response_id">0</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="table-checkfullname"> - <property name="border_width">12</property> - <property name="visible">True</property> - <property name="n_rows">5</property> - <property name="n_columns">3</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkCombo" id="combo-title"> - <property name="visible">True</property> - <property name="value_in_list">False</property> - <property name="allow_empty">True</property> - <property name="case_sensitive">False</property> - <property name="enable_arrow_keys">True</property> - <property name="enable_arrows_always">False</property> - - <child internal-child="entry"> - <widget class="GtkEntry" id="entry-title"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - </child> - - <child internal-child="list"> - <widget class="GtkList" id="convertwidget1"> - <property name="visible">True</property> - <property name="selection_mode">GTK_SELECTION_BROWSE</property> - - <child> - <widget class="GtkListItem" id="convertwidget2"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget3"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="convertwidget4"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget5"> - <property name="visible">True</property> - <property name="label" translatable="yes">Mr.</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="convertwidget6"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget7"> - <property name="visible">True</property> - <property name="label" translatable="yes">Mrs.</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="convertwidget8"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget9"> - <property name="visible">True</property> - <property name="label" translatable="yes">Ms.</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="convertwidget10"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget11"> - <property name="visible">True</property> - <property name="label" translatable="yes">Miss</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="convertwidget12"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget13"> - <property name="visible">True</property> - <property name="label" translatable="yes">Dr.</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="convertwidget14"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget15"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkCombo" id="combo-suffix"> - <property name="visible">True</property> - <property name="value_in_list">False</property> - <property name="allow_empty">True</property> - <property name="case_sensitive">False</property> - <property name="enable_arrow_keys">True</property> - <property name="enable_arrows_always">False</property> - - <child internal-child="entry"> - <widget class="GtkEntry" id="entry-suffix"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - </child> - - <child internal-child="list"> - <widget class="GtkList" id="convertwidget16"> - <property name="visible">True</property> - <property name="selection_mode">GTK_SELECTION_BROWSE</property> - - <child> - <widget class="GtkListItem" id="convertwidget17"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget18"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="convertwidget19"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget20"> - <property name="visible">True</property> - <property name="label" translatable="yes">Sr.</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="convertwidget21"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget22"> - <property name="visible">True</property> - <property name="label" translatable="yes">Jr.</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="convertwidget23"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget24"> - <property name="visible">True</property> - <property name="label" translatable="yes">I</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="convertwidget25"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget26"> - <property name="visible">True</property> - <property name="label" translatable="yes">II</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="convertwidget27"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget28"> - <property name="visible">True</property> - <property name="label" translatable="yes">III</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="convertwidget29"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget30"> - <property name="visible">True</property> - <property name="label" translatable="yes">Esq.</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - - <child> - <widget class="GtkListItem" id="convertwidget31"> - <property name="visible">True</property> - - <child> - <widget class="GtkLabel" id="convertwidget32"> - <property name="visible">True</property> - <property name="label" translatable="yes"></property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - </child> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-first"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-middle"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-last"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">3</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-first"> - <property name="visible">True</property> - <property name="label" translatable="yes">_First:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-first</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-title"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Title:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-title</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-middle"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Middle:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-middle</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-last"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Last:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-last</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-suffix"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Suffix:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-suffix</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -</glade-interface> diff --git a/addressbook/gui/contact-editor/im.glade b/addressbook/gui/contact-editor/im.glade deleted file mode 100644 index eb8832e8f1..0000000000 --- a/addressbook/gui/contact-editor/im.glade +++ /dev/null @@ -1,206 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> - -<widget class="GtkDialog" id="dialog-im"> - <property name="title" translatable="yes">Add IM Account</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">True</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="has_separator">False</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox1"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">2</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - - <child> - <widget class="GtkButton" id="cancelbutton1"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-6</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="okbutton1"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-ok</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-5</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="table-im"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="n_rows">3</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">12</property> - - <child> - <widget class="GtkLabel" id="label-service"> - <property name="visible">True</property> - <property name="label" translatable="yes">_IM Service:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">optmenu-service</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optmenu-service"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">-1</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-username"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Account name:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">entry-username</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry-username"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label-location"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Location:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">optmenu-location</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkOptionMenu" id="optmenu-location"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="history">-1</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -</glade-interface> diff --git a/addressbook/gui/contact-editor/test-editor.c b/addressbook/gui/contact-editor/test-editor.c deleted file mode 100644 index 4a8c111563..0000000000 --- a/addressbook/gui/contact-editor/test-editor.c +++ /dev/null @@ -1,142 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * test-editor.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include <stdlib.h> -#include <gtk/gtkmain.h> -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-ui-init.h> -#include <glade/glade.h> -#include "e-contact-editor.h" -#include "ebook/e-card.h" - -#define TEST_VCARD \ -"BEGIN:VCARD -" \ -"FN:Nat -" \ -"N:Friedman;Nat;D;Mr. -" \ -"BDAY:1977-08-06 -" \ -"TEL;WORK:617 679 1984 -" \ -"TEL;CELL:123 456 7890 -" \ -"EMAIL;INTERNET:nat@nat.org -" \ -"EMAIL;INTERNET:nat@ximian.com -" \ -"ADR;WORK;POSTAL:P.O. Box 101;;;Any Town;CA;91921-1234; -" \ -"ADR;HOME;POSTAL;INTL:P.O. Box 202;;;Any Town 2;MI;12344-4321;USA -" \ -"END:VCARD -" \ -" -" - -static char * -read_file (char *name) -{ - int len; - char buff[65536]; - char line[1024]; - FILE *f; - - f = fopen (name, "r"); - if (f == NULL) - g_error ("Unable to open %s!\n", name); - - len = 0; - while (fgets (line, sizeof (line), f) != NULL) { - strcpy (buff + len, line); - len += strlen (line); - } - - fclose (f); - - return g_strdup (buff); -} - -/* Callback used when a contact editor is closed */ -static void -editor_closed_cb (EContactEditor *ce, gpointer data) -{ - static int count = 2; - - count--; - g_object_unref (ce); - - if (count == 0) - exit (0); -} - -#if 0 -static void about_callback( GtkWidget *widget, gpointer data ) -{ - - const gchar *authors[] = - { - "Christopher James Lahey <clahey@umich.edu>", - NULL - }; - - GtkWidget *about = - gnome_about_new ( _( "Contact Editor Test" ), VERSION, - _( "Copyright (C) 2000, Ximian, Inc." ), - authors, - _( "This should test the contact editor canvas item" ), - NULL); - gtk_widget_show (about); -} -#endif - -int main( int argc, char *argv[] ) -{ - char *cardstr; - EContactEditor *ce; - - gnome_program_init("Contact Editor Test", VERSION, LIBGNOMEUI_MODULE, argc, argv, NULL); - - glade_init (); - - cardstr = NULL; - if (argc == 2) - cardstr = read_file (argv [1]); - - if (cardstr == NULL) - cardstr = TEST_VCARD; - - ce = e_contact_editor_new (NULL, e_card_new_with_default_charset (cardstr, "ISO-8859-1"), TRUE, FALSE); - g_signal_connect (ce, "editor_closed", - G_CALLBACK (editor_closed_cb), NULL); - - ce = e_contact_editor_new (NULL, e_card_new_with_default_charset (cardstr, "ISO-8859-1"), TRUE, FALSE); - g_signal_connect (ce, "editor_closed", - G_CALLBACK (editor_closed_cb), NULL); - - gtk_main(); - - /* Not reached. */ - return 0; -} diff --git a/addressbook/gui/contact-list-editor/.cvsignore b/addressbook/gui/contact-list-editor/.cvsignore deleted file mode 100644 index 1fe141cc30..0000000000 --- a/addressbook/gui/contact-list-editor/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -Evolution-Addressbook-SelectNames.h -Makefile.in -Makefile -.deps -.pure -e-contact-list-editor-marshal.c -e-contact-list-editor-marshal.h diff --git a/addressbook/gui/contact-list-editor/Makefile.am b/addressbook/gui/contact-list-editor/Makefile.am deleted file mode 100644 index 5df78b3eac..0000000000 --- a/addressbook/gui/contact-list-editor/Makefile.am +++ /dev/null @@ -1,49 +0,0 @@ -IDL = Evolution-Addressbook-SelectNames.idl - -IDL_GENERATED_H = \ - Evolution-Addressbook-SelectNames.h - -selectnamesdir = $(top_srcdir)/addressbook/gui/component/select-names - -$(IDL_GENERATED_H): $(selectnamesdir)/$(IDL) - $(ORBIT_IDL) --nostubs --noskels --nocommon $(IDL_INCLUDES) $(selectnamesdir)/$(IDL) - -INCLUDES = \ - -I$(top_srcdir) \ - -I$(top_srcdir)/addressbook/ \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_builddir)/addressbook/backend \ - -I$(top_srcdir)/addressbook/gui/merging \ - -I$(top_srcdir)/addressbook/gui/contact-editor \ - -I$(top_builddir)/shell \ - -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ - -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \ - -DEVOLUTION_DATADIR=\""$(datadir)"\" \ - -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \ - -DEVOLUTION_UIDIR=\""$(evolutionuidir)\"" \ - -DPREFIX=\""$(prefix)"\" \ - -DG_LOG_DOMAIN=\"contact-list-editor\" \ - $(EVOLUTION_ADDRESSBOOK_CFLAGS) - -noinst_LTLIBRARIES = \ - libecontactlisteditor.la - -libecontactlisteditor_la_SOURCES = \ - $(MARSHAL_GENERATED) \ - e-contact-list-editor.c \ - e-contact-list-editor.h \ - e-contact-list-model.c \ - e-contact-list-model.h - -MARSHAL_GENERATED = e-contact-list-editor-marshal.c e-contact-list-editor-marshal.h -@EVO_MARSHAL_RULE@ - -glade_DATA = contact-list-editor.glade -etspec_DATA = e-contact-list-editor.etspec - -BUILT_SOURCES = $(MARSHAL_GENERATED) $(IDL_GENERATED_H) -CLEANFILES = $(BUILT_SOURCES) - -EXTRA_DIST = $(glade_DATA) \ - $(etspec_DATA) \ - e-contact-list-editor-marshal.list diff --git a/addressbook/gui/contact-list-editor/contact-list-editor.glade b/addressbook/gui/contact-list-editor/contact-list-editor.glade deleted file mode 100644 index 30760f6108..0000000000 --- a/addressbook/gui/contact-list-editor/contact-list-editor.glade +++ /dev/null @@ -1,425 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> - -<widget class="GtkDialog" id="contact list editor"> - <property name="visible">True</property> - <property name="title" translatable="yes">Contact List Editor</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="has_separator">True</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox1"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - - <child> - <widget class="GtkButton" id="cancel-button"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-6</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="ok-button"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-ok</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">-5</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox8"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkHBox" id="hbox6"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkTable" id="table1"> - <property name="visible">True</property> - <property name="n_rows">2</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="GtkLabel" id="label10"> - <property name="visible">True</property> - <property name="label" translatable="yes">_List name:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="mnemonic_widget">list-name-entry</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="list-name-entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="source-label"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Where:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="Custom" id="source-option-menu-source"> - <property name="visible">True</property> - <property name="creation_function">e_contact_list_editor_create_source_option_menu</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Tue, 01 Jun 2004 18:22:38 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="Custom" id="list-image"> - <property name="visible">True</property> - <property name="creation_function">eab_create_image_chooser_widget</property> - <property name="string1">stock_addressbook</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Sat, 23 Jun 2001 05:59:21 GMT</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="frame3"> - <property name="border_width">3</property> - <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_ETCHED_IN</property> - - <child> - <widget class="GtkHBox" id="hbox7"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkVBox" id="vbox9"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkLabel" id="label11"> - <property name="visible">True</property> - <property name="label" translatable="yes">_Type an email address or drag a contact into the list below:</property> - <property name="use_underline">True</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="email-entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">True</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char" translatable="yes">*</property> - <property name="activates_default">False</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="Custom" id="contact-list-table"> - <property name="visible">True</property> - <property name="creation_function">e_contact_list_editor_create_table</property> - <property name="string1"></property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Sat, 23 Jun 2001 06:00:16 GMT</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkCheckButton" id="visible-addrs-checkbutton"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_Hide addresses when sending mail to this list</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="active">False</property> - <property name="inconsistent">False</property> - <property name="draw_indicator">True</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox10"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="GtkLabel" id="label12"> - <property name="visible">True</property> - <property name="label" translatable="yes"> -</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkVButtonBox" id="vbuttonbox4"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_START</property> - <property name="spacing">6</property> - - <child> - <widget class="GtkButton" id="add-email-button"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">Add an email to the List</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-add</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="remove-button"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">Remove an email address from the List</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-remove</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="select-button"> - <property name="visible">True</property> - <property name="tooltip" translatable="yes">Insert email adresses from Adress Book</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Select</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label11"> - <property name="visible">True</property> - <property name="label" translatable="yes">Members</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -</glade-interface> diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor-marshal.list b/addressbook/gui/contact-list-editor/e-contact-list-editor-marshal.list deleted file mode 100644 index 8d94a0bf3b..0000000000 --- a/addressbook/gui/contact-list-editor/e-contact-list-editor-marshal.list +++ /dev/null @@ -1,4 +0,0 @@ -INT:OBJECT -NONE:INT,OBJECT -NONE:INT,OBJECT -NONE:NONE diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.c b/addressbook/gui/contact-list-editor/e-contact-list-editor.c deleted file mode 100644 index 07b6598b08..0000000000 --- a/addressbook/gui/contact-list-editor/e-contact-list-editor.c +++ /dev/null @@ -1,1127 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-list-editor.c - * Copyright (C) 2001 Ximian, Inc. - * Author: Chris Toshok <toshok@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> - -#include "e-contact-list-editor.h" -#include <e-util/e-icon-factory.h> - -#include <string.h> - -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-window-icon.h> -#include <gtk/gtkentry.h> -#include <gtk/gtktogglebutton.h> -#include <gtk/gtkdialog.h> - -#include <libedataserverui/e-source-option-menu.h> - -#include <gal/e-table/e-table-scrolled.h> -#include <libgnomevfs/gnome-vfs-ops.h> - -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-widget.h> -#include <bonobo/bonobo-exception.h> - -#include "shell/evolution-shell-component-utils.h" - -#include "widgets/misc/e-image-chooser.h" - -#include "addressbook/gui/component/addressbook.h" -#include "addressbook/gui/widgets/eab-gui-util.h" -#include "addressbook/util/eab-book-util.h" -#include "Evolution-Addressbook-SelectNames.h" - -#include "eab-editor.h" -#include "e-contact-editor.h" -#include "e-contact-list-model.h" -#include "e-contact-list-editor-marshal.h" - -static void e_contact_list_editor_init (EContactListEditor *editor); -static void e_contact_list_editor_class_init (EContactListEditorClass *klass); -static void e_contact_list_editor_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_contact_list_editor_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void e_contact_list_editor_dispose (GObject *object); - -static void e_contact_list_editor_show (EABEditor *editor); -static void e_contact_list_editor_raise (EABEditor *editor); -static void e_contact_list_editor_close (EABEditor *editor); -static void e_contact_list_editor_save_contact (EABEditor *editor, gboolean should_close); -static gboolean e_contact_list_editor_is_valid (EABEditor *editor); -static gboolean e_contact_list_editor_is_changed (EABEditor *editor); -static GtkWindow* e_contact_list_editor_get_window (EABEditor *editor); - -static void set_editable (EContactListEditor *editor); -static void command_state_changed (EContactListEditor *editor); -static void extract_info(EContactListEditor *editor); -static void fill_in_info(EContactListEditor *editor); - -static void add_email_cb (GtkWidget *w, EContactListEditor *editor); -static void remove_entry_cb (GtkWidget *w, EContactListEditor *editor); -static void select_cb (GtkWidget *w, EContactListEditor *editor); -static void list_name_changed_cb (GtkWidget *w, EContactListEditor *editor); -static void list_image_changed_cb (GtkWidget *w, EContactListEditor *editor); -static void visible_addrs_toggled_cb (GtkWidget *w, EContactListEditor *editor); -static void source_selected (GtkWidget *source_option_menu, ESource *source, EContactListEditor *editor); - -static void close_cb (GtkWidget *widget, EContactListEditor *editor); -static void save_and_close_cb (GtkWidget *widget, EContactListEditor *editor); - -static gint app_delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data); -static gboolean table_drag_drop_cb (ETable *table, int row, int col, GdkDragContext *context, - gint x, gint y, guint time, EContactListEditor *editor); -static gboolean table_drag_motion_cb (ETable *table, int row, int col, GdkDragContext *context, - gint x, gint y, guint time, EContactListEditor *editor); -static void table_drag_data_received_cb (ETable *table, int row, int col, - GdkDragContext *context, - gint x, gint y, - GtkSelectionData *selection_data, guint info, guint time, - EContactListEditor *editor); - -static EABEditorClass *parent_class = NULL; - -enum DndTargetType { - DND_TARGET_TYPE_VCARD, -}; -#define VCARD_TYPE "text/x-vcard" - -static GtkTargetEntry list_drag_types[] = { - { VCARD_TYPE, 0, DND_TARGET_TYPE_VCARD }, -}; -static const int num_list_drag_types = sizeof (list_drag_types) / sizeof (list_drag_types[0]); - -/* The arguments we take */ -enum { - PROP_0, - PROP_BOOK, - PROP_CONTACT, - PROP_IS_NEW_LIST, - PROP_EDITABLE -}; - -GType -e_contact_list_editor_get_type (void) -{ - static GType cle_type = 0; - - if (!cle_type) { - static const GTypeInfo cle_info = { - sizeof (EContactListEditorClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_contact_list_editor_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EContactListEditor), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_contact_list_editor_init, - }; - - cle_type = g_type_register_static (EAB_TYPE_EDITOR, "EContactListEditor", &cle_info, 0); - } - - return cle_type; -} - - -static void -e_contact_list_editor_class_init (EContactListEditorClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - EABEditorClass *editor_class = EAB_EDITOR_CLASS (klass); - - parent_class = g_type_class_ref (EAB_TYPE_EDITOR); - - editor_class->show = e_contact_list_editor_show; - editor_class->raise = e_contact_list_editor_raise; - editor_class->close = e_contact_list_editor_close; - editor_class->save_contact = e_contact_list_editor_save_contact; - editor_class->is_valid = e_contact_list_editor_is_valid; - editor_class->is_changed = e_contact_list_editor_is_changed; - editor_class->get_window = e_contact_list_editor_get_window; - - object_class->set_property = e_contact_list_editor_set_property; - object_class->get_property = e_contact_list_editor_get_property; - object_class->dispose = e_contact_list_editor_dispose; - - g_object_class_install_property (object_class, PROP_BOOK, - g_param_spec_object ("book", - _("Book"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_BOOK, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_CONTACT, - g_param_spec_object ("contact", - _("Contact"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_CONTACT, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_IS_NEW_LIST, - g_param_spec_boolean ("is_new_list", - _("Is New List"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EDITABLE, - g_param_spec_boolean ("editable", - _("Editable"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); -} - -static void -e_contact_list_editor_init (EContactListEditor *editor) -{ - GladeXML *gui; - GList *icon_list; - - editor->contact = NULL; - editor->changed = FALSE; - editor->image_set = FALSE; - editor->editable = TRUE; - editor->allows_contact_lists = TRUE; - editor->in_async_call = FALSE; - editor->is_new_list = FALSE; - - editor->load_source_id = 0; - editor->load_book = NULL; - - gui = glade_xml_new (EVOLUTION_GLADEDIR "/contact-list-editor.glade", NULL, NULL); - editor->gui = gui; - - editor->app = glade_xml_get_widget (gui, "contact list editor"); - - editor->table = glade_xml_get_widget (gui, "contact-list-table"); - editor->model = g_object_get_data (G_OBJECT(editor->table), "model"); - - /* XXX need this for libglade-2 it seems */ - gtk_widget_show (editor->table); - - editor->add_button = glade_xml_get_widget (editor->gui, "add-email-button"); - editor->remove_button = glade_xml_get_widget (editor->gui, "remove-button"); - editor->select_button = glade_xml_get_widget (editor->gui, "select-button"); - - editor->email_entry = glade_xml_get_widget (gui, "email-entry"); - editor->list_name_entry = glade_xml_get_widget (gui, "list-name-entry"); - editor->list_image = glade_xml_get_widget (gui, "list-image"); - editor->visible_addrs_checkbutton = glade_xml_get_widget (gui, "visible-addrs-checkbutton"); - editor->source_menu = glade_xml_get_widget (gui, "source-option-menu-source"); - - editor->ok_button = glade_xml_get_widget (gui, "ok-button"); - editor->cancel_button = glade_xml_get_widget (gui, "cancel-button"); - - /* connect signals */ - g_signal_connect (editor->add_button, - "clicked", G_CALLBACK(add_email_cb), editor); - g_signal_connect (editor->email_entry, - "activate", G_CALLBACK(add_email_cb), editor); - g_signal_connect (editor->remove_button, - "clicked", G_CALLBACK(remove_entry_cb), editor); - g_signal_connect (editor->select_button, - "clicked", G_CALLBACK(select_cb), editor); - g_signal_connect (editor->list_name_entry, - "changed", G_CALLBACK(list_name_changed_cb), editor); - g_signal_connect (editor->visible_addrs_checkbutton, - "toggled", G_CALLBACK(visible_addrs_toggled_cb), editor); - - e_table_drag_dest_set (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)), - 0, list_drag_types, num_list_drag_types, GDK_ACTION_LINK); - - g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)), - "table_drag_motion", G_CALLBACK(table_drag_motion_cb), editor); - g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)), - "table_drag_drop", G_CALLBACK (table_drag_drop_cb), editor); - g_signal_connect (e_table_scrolled_get_table (E_TABLE_SCROLLED (editor->table)), - "table_drag_data_received", G_CALLBACK(table_drag_data_received_cb), editor); - - g_signal_connect (editor->ok_button, - "clicked", G_CALLBACK(save_and_close_cb), editor); - g_signal_connect (editor->cancel_button, - "clicked", G_CALLBACK(close_cb), editor); - - - g_signal_connect (editor->list_image, - "changed", G_CALLBACK(list_image_changed_cb), editor); - - g_signal_connect (editor->source_menu, - "source_selected", G_CALLBACK (source_selected), editor); - - command_state_changed (editor); - - /* Connect to the deletion of the dialog */ - g_signal_connect (editor->app, "delete_event", - G_CALLBACK (app_delete_event_cb), editor); - - gtk_dialog_set_has_separator (GTK_DIALOG (editor->app), FALSE); - - /* set the icon */ - icon_list = e_icon_factory_get_icon_list ("stock_contact-list"); - if (icon_list) { - gtk_window_set_icon_list (GTK_WINDOW (editor->app), icon_list); - g_list_foreach (icon_list, (GFunc) g_object_unref, NULL); - g_list_free (icon_list); - } - - gtk_widget_show_all (editor->app); -} - -static void -new_target_cb (EBook *new_book, EBookStatus status, EContactListEditor *editor) -{ - editor->load_source_id = 0; - editor->load_book = NULL; - - if (status != E_BOOK_ERROR_OK || new_book == NULL) { - eab_load_error_dialog (NULL, e_book_get_source (new_book), status); - - e_source_option_menu_select (E_SOURCE_OPTION_MENU (editor->source_menu), - e_book_get_source (editor->book)); - - if (new_book) - g_object_unref (new_book); - return; - } - - g_object_set (editor, "book", new_book, NULL); - g_object_unref (new_book); -} - -static void -cancel_load (EContactListEditor *editor) -{ - if (editor->load_source_id) { - addressbook_load_cancel (editor->load_source_id); - editor->load_source_id = 0; - - g_object_unref (editor->load_book); - editor->load_book = NULL; - } -} - -static void -source_selected (GtkWidget *source_option_menu, ESource *source, EContactListEditor *editor) -{ - cancel_load (editor); - - if (e_source_equal (e_book_get_source (editor->book), source)) - return; - - editor->load_book = e_book_new (source, NULL); - editor->load_source_id = addressbook_load (editor->load_book, - (EBookCallback) new_target_cb, editor); -} - -static void -e_contact_list_editor_dispose (GObject *object) -{ - cancel_load (E_CONTACT_LIST_EDITOR (object)); - - if (G_OBJECT_CLASS (parent_class)->dispose) - (* G_OBJECT_CLASS (parent_class)->dispose) (object); - -} - -typedef struct { - EContactListEditor *cle; - gboolean should_close; -} EditorCloseStruct; - -static void -list_added_cb (EBook *book, EBookStatus status, const char *id, EditorCloseStruct *ecs) -{ - EContactListEditor *cle = ecs->cle; - gboolean should_close = ecs->should_close; - - if (cle->app) - gtk_widget_set_sensitive (cle->app, TRUE); - cle->in_async_call = FALSE; - - e_contact_set (cle->contact, E_CONTACT_UID, (char*)id); - - eab_editor_contact_added (EAB_EDITOR (cle), status, cle->contact); - - if (status == E_BOOK_ERROR_OK) { - cle->is_new_list = FALSE; - - if (should_close) - eab_editor_close (EAB_EDITOR (cle)); - else - command_state_changed (cle); - } - - g_object_unref (cle); - g_free (ecs); -} - -static void -list_modified_cb (EBook *book, EBookStatus status, EditorCloseStruct *ecs) -{ - EContactListEditor *cle = ecs->cle; - gboolean should_close = ecs->should_close; - - if (cle->app) - gtk_widget_set_sensitive (cle->app, TRUE); - cle->in_async_call = FALSE; - - eab_editor_contact_modified (EAB_EDITOR (cle), status, cle->contact); - - if (status == E_BOOK_ERROR_OK) { - if (should_close) - eab_editor_close (EAB_EDITOR (cle)); - } - - g_object_unref (cle); /* release ref held for ebook callback */ - g_free (ecs); -} - -static void -save_contact (EContactListEditor *cle, gboolean should_close) -{ - extract_info (cle); - - if (cle->book) { - EditorCloseStruct *ecs = g_new(EditorCloseStruct, 1); - - ecs->cle = cle; - g_object_ref (cle); - ecs->should_close = should_close; - - if (cle->app) - gtk_widget_set_sensitive (cle->app, FALSE); - cle->in_async_call = TRUE; - - if (cle->is_new_list) - e_book_async_add_contact (cle->book, cle->contact, (EBookIdCallback)list_added_cb, ecs); - else - e_book_async_commit_contact (cle->book, cle->contact, (EBookCallback)list_modified_cb, ecs); - - cle->changed = FALSE; - } -} - -static gboolean -is_named (EContactListEditor *editor) -{ - char *string = gtk_editable_get_chars(GTK_EDITABLE (editor->list_name_entry), 0, -1); - gboolean named = FALSE; - - if (string && *string) { - named = TRUE; - } - - g_free (string); - - return named; -} - -static void -e_contact_list_editor_save_contact (EABEditor *editor, gboolean should_close) -{ - EContactListEditor *cle = E_CONTACT_LIST_EDITOR (editor); - - save_contact (editor, should_close); -} - -static gboolean -e_contact_list_editor_is_valid (EABEditor *editor) -{ - EContactListEditor *cle = E_CONTACT_LIST_EDITOR (editor); - - return is_named (cle); -} - -static gboolean -e_contact_list_editor_is_changed (EABEditor *editor) -{ - EContactListEditor *cle = E_CONTACT_LIST_EDITOR (editor); - - return cle->changed; -} - -static GtkWindow* -e_contact_list_editor_get_window (EABEditor *editor) -{ - return GTK_WINDOW (E_CONTACT_LIST_EDITOR (editor)->app); -} - -static void -close_cb (GtkWidget *widget, EContactListEditor *cle) -{ - if (!eab_editor_prompt_to_save_changes (EAB_EDITOR (cle), GTK_WINDOW (cle->app))) - return; - - eab_editor_close (EAB_EDITOR (cle)); -} - -static void -save_and_close_cb (GtkWidget *widget, EContactListEditor *cle) -{ - save_contact (cle, TRUE); -} - -static void -contact_list_editor_destroy_notify (gpointer data, - GObject *where_the_object_was) -{ - eab_editor_remove (EAB_EDITOR (data)); -} - -EContactListEditor * -e_contact_list_editor_new (EBook *book, - EContact *list_contact, - gboolean is_new_list, - gboolean editable) -{ - EContactListEditor *ce = g_object_new (E_TYPE_CONTACT_LIST_EDITOR, NULL); - - eab_editor_add (EAB_EDITOR (ce)); - g_object_weak_ref (G_OBJECT (ce), contact_list_editor_destroy_notify, ce); - - g_object_set (ce, - "book", book, - "contact", list_contact, - "is_new_list", is_new_list, - "editable", editable, - NULL); - - return ce; -} - -static void -e_contact_list_editor_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - EContactListEditor *editor; - - editor = E_CONTACT_LIST_EDITOR (object); - - switch (prop_id){ - case PROP_BOOK: { - gboolean changed; - - if (editor->book) - g_object_unref (editor->book); - editor->book = E_BOOK(g_value_get_object (value)); - g_object_ref (editor->book); - /* XXX more here about editable/etc. */ - - changed = (editor->allows_contact_lists != e_book_check_static_capability (editor->book, - "contact-lists")); - editor->allows_contact_lists = e_book_check_static_capability (editor->book, - "contact-lists"); - - if (changed) { - set_editable (editor); - command_state_changed (editor); - } - break; - } - case PROP_CONTACT: - if (editor->contact) - g_object_unref (editor->contact); - editor->contact = e_contact_duplicate(E_CONTACT(g_value_get_object (value))); - fill_in_info(editor); - editor->changed = FALSE; - command_state_changed (editor); - break; - case PROP_IS_NEW_LIST: { - gboolean new_value = g_value_get_boolean (value); - gboolean changed = (editor->is_new_list != new_value); - - editor->is_new_list = new_value; - - if (changed) - command_state_changed (editor); - break; - } - case PROP_EDITABLE: { - gboolean new_value = g_value_get_boolean (value); - gboolean changed = (editor->editable != new_value); - - editor->editable = new_value; - - if (changed) { - set_editable (editor); - command_state_changed (editor); - } - break; - } - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_contact_list_editor_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - EContactListEditor *editor; - - editor = E_CONTACT_LIST_EDITOR (object); - - switch (prop_id) { - case PROP_BOOK: - g_value_set_object (value, editor->book); - break; - - case PROP_CONTACT: - extract_info(editor); - g_value_set_object (value, editor->contact); - break; - - case PROP_IS_NEW_LIST: - g_value_set_boolean (value, editor->is_new_list); - break; - - case PROP_EDITABLE: - g_value_set_boolean (value, editor->editable); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_contact_list_editor_show (EABEditor *editor) -{ - EContactListEditor *cle = E_CONTACT_LIST_EDITOR (editor); - gtk_widget_show (cle->app); -} - -static void -e_contact_list_editor_raise (EABEditor *editor) -{ - EContactListEditor *cle = E_CONTACT_LIST_EDITOR (editor); - gdk_window_raise (GTK_WIDGET (cle->app)->window); -} - -static void -e_contact_list_editor_close (EABEditor *editor) -{ - EContactListEditor *cle = E_CONTACT_LIST_EDITOR (editor); - g_assert (cle->app != NULL); - - gtk_widget_destroy (cle->app); - cle->app = NULL; - - eab_editor_closed (EAB_EDITOR (cle)); -} - -GtkWidget * -e_contact_list_editor_create_table(gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2); - -GtkWidget * -e_contact_list_editor_create_table(gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2) -{ - - ETableModel *model; - GtkWidget *table; - - model = e_contact_list_model_new (); - - table = e_table_scrolled_new_from_spec_file (model, - NULL, - EVOLUTION_ETSPECDIR "/e-contact-list-editor.etspec", - NULL); - - g_object_set_data(G_OBJECT(table), "model", model); - - return table; -} - -static void -add_to_model (EContactListEditor *editor, EDestination **cards) -{ - int i; - - for (i = 0; cards[i] != NULL; i++) { - e_contact_list_model_add_destination (E_CONTACT_LIST_MODEL(editor->model), cards[i]); - } -} - -static void -select_names_ok_cb (BonoboListener *listener, const char *event_name, const CORBA_any *arg, - CORBA_Environment *ev, gpointer data) -{ - EContactListEditor *ce; - EDestination **destv; - Bonobo_Control corba_control; - GtkWidget *control_widget; - char *string = NULL; - - ce = E_CONTACT_LIST_EDITOR (data); - - corba_control = GNOME_Evolution_Addressbook_SelectNames_getEntryBySection (ce->corba_select_names, - "Members", ev); - control_widget = bonobo_widget_new_control_from_objref (corba_control, CORBA_OBJECT_NIL); - - bonobo_widget_get_property (BONOBO_WIDGET (control_widget), "destinations", - TC_CORBA_string, &string, NULL); - - destv = e_destination_importv (string); - if (destv) { - add_to_model (ce, destv); - g_free (destv); - } - - ce->changed = TRUE; - command_state_changed (ce); -} - -static gboolean -setup_corba (EContactListEditor *editor) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - editor->corba_select_names = bonobo_activation_activate_from_id (SELECT_NAMES_OAFIID, 0, NULL, &ev); - - /* OAF seems to be broken -- it can return a CORBA_OBJECT_NIL without - raising an exception in `ev'. */ - if (ev._major != CORBA_NO_EXCEPTION || editor->corba_select_names == CORBA_OBJECT_NIL) { - CORBA_exception_free (&ev); - return FALSE; - } - - GNOME_Evolution_Addressbook_SelectNames_addSection ( - editor->corba_select_names, "Members", gettext ("Members"), &ev); - - bonobo_event_source_client_add_listener (editor->corba_select_names, - (BonoboListenerCallbackFn) select_names_ok_cb, - "GNOME/Evolution:ok:dialog", NULL, editor); - - CORBA_exception_free (&ev); - - return TRUE; -} - -static void -select_cb (GtkWidget *w, EContactListEditor *editor) -{ - CORBA_Environment ev; - - if(!setup_corba (editor)) - return; - - CORBA_exception_init (&ev); - - GNOME_Evolution_Addressbook_SelectNames_activateDialog ( - editor->corba_select_names, _("Required Participants"), &ev); - - CORBA_exception_free (&ev); -} - -GtkWidget * -e_contact_list_editor_create_source_option_menu (gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2); - -GtkWidget * -e_contact_list_editor_create_source_option_menu (gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2) -{ - - GtkWidget *menu; - GConfClient *gconf_client; - ESourceList *source_list; - - gconf_client = gconf_client_get_default (); - source_list = e_source_list_new_for_gconf (gconf_client, "/apps/evolution/addressbook/sources"); - - menu = e_source_option_menu_new (source_list); - g_object_unref (source_list); - - gtk_widget_show (menu); - return menu; -} - -static void -add_email_cb (GtkWidget *w, EContactListEditor *editor) -{ - GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (editor->table)); - const char *text = gtk_entry_get_text (GTK_ENTRY(editor->email_entry)); - - if (text && *text) { - e_contact_list_model_add_email (E_CONTACT_LIST_MODEL(editor->model), text); - - /* Skip to the end of the list */ - if (adj->upper - adj->lower > adj->page_size) - gtk_adjustment_set_value (adj, adj->upper); - - editor->changed = TRUE; - - } - - gtk_entry_set_text (GTK_ENTRY(editor->email_entry), ""); - command_state_changed (editor); -} - -static void -remove_row (int model_row, EContactListEditor *editor) -{ - e_contact_list_model_remove_row (E_CONTACT_LIST_MODEL (editor->model), model_row); -} - -static void -remove_entry_cb (GtkWidget *w, EContactListEditor *editor) -{ - e_table_selected_row_foreach (e_table_scrolled_get_table(E_TABLE_SCROLLED(editor->table)), - (EForeachFunc)remove_row, editor); - editor->changed = TRUE; - command_state_changed (editor); -} - -static void -list_name_changed_cb (GtkWidget *w, EContactListEditor *editor) -{ - char *string = gtk_editable_get_chars(GTK_EDITABLE (w), 0, -1); - char *title; - - editor->changed = TRUE; - - if (string && *string) - title = string; - else - title = _("Contact List Editor"); - - gtk_window_set_title (GTK_WINDOW (editor->app), title); - - g_free (string); - - command_state_changed (editor); -} - -static void -list_image_changed_cb (GtkWidget *w, EContactListEditor *editor) -{ - editor->image_set = TRUE; - editor->changed = TRUE; - command_state_changed (editor); -} - -static void -visible_addrs_toggled_cb (GtkWidget *w, EContactListEditor *editor) -{ - editor->changed = TRUE; - command_state_changed (editor); -} - -static void -set_editable (EContactListEditor *editor) -{ - gtk_widget_set_sensitive (editor->email_entry, editor->editable && editor->allows_contact_lists); - gtk_widget_set_sensitive (editor->list_name_entry, editor->editable && editor->allows_contact_lists); - gtk_widget_set_sensitive (editor->add_button, editor->editable && editor->allows_contact_lists); - gtk_widget_set_sensitive (editor->remove_button, editor->editable && editor->allows_contact_lists); - gtk_widget_set_sensitive (editor->select_button, editor->editable && editor->allows_contact_lists); - gtk_widget_set_sensitive (editor->table, editor->editable && editor->allows_contact_lists); -} - -/* Callback used when the editor is destroyed */ -static gint -app_delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data) -{ - EContactListEditor *ce; - - ce = E_CONTACT_LIST_EDITOR (data); - - /* if we're in an async call, don't allow the dialog to close */ - if (ce->in_async_call) - return TRUE; - - if (!eab_editor_prompt_to_save_changes (EAB_EDITOR (ce), GTK_WINDOW (ce->app))) - return TRUE; - - eab_editor_close (EAB_EDITOR (ce)); - return TRUE; -} - -static gboolean -table_drag_motion_cb (ETable *table, int row, int col, - GdkDragContext *context, - gint x, gint y, guint time, EContactListEditor *editor) -{ - GList *p; - - for (p = context->targets; p != NULL; p = p->next) { - char *possible_type; - - possible_type = gdk_atom_name (GDK_POINTER_TO_ATOM (p->data)); - if (!strcmp (possible_type, VCARD_TYPE)) { - g_free (possible_type); - gdk_drag_status (context, GDK_ACTION_LINK, time); - return TRUE; - } - - g_free (possible_type); - } - - return FALSE; -} - -static gboolean -table_drag_drop_cb (ETable *table, int row, int col, - GdkDragContext *context, - gint x, gint y, guint time, EContactListEditor *editor) -{ - GList *p; - - for (p = context->targets; p != NULL; p = p->next) { - char *possible_type; - - possible_type = gdk_atom_name (GDK_POINTER_TO_ATOM (p->data)); - if (!strcmp (possible_type, VCARD_TYPE)) { - g_free (possible_type); - break; - } - - g_free (possible_type); - } - - - if (p) { - gtk_drag_get_data (GTK_WIDGET (table), context, - GDK_POINTER_TO_ATOM (p->data), - time); - return TRUE; - } - - return FALSE; -} - -static void -table_drag_data_received_cb (ETable *table, int row, int col, - GdkDragContext *context, - gint x, gint y, - GtkSelectionData *selection_data, - guint info, guint time, EContactListEditor *editor) -{ - GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (editor->table)); - char *target_type; - gboolean changed = FALSE; - gboolean handled = FALSE; - - target_type = gdk_atom_name (selection_data->target); - - if (!strcmp (target_type, VCARD_TYPE)) { - - GList *contact_list = eab_contact_list_from_string (selection_data->data); - GList *c; - - if (contact_list) - handled = TRUE; - - for (c = contact_list; c; c = c->next) { - EContact *contact = c->data; - - if (!e_contact_get (contact, E_CONTACT_IS_LIST)) { - e_contact_list_model_add_contact (E_CONTACT_LIST_MODEL (editor->model), - contact, - 0 /* Hard-wired for default e-mail */); - - changed = TRUE; - } - } - g_list_foreach (contact_list, (GFunc)g_object_unref, NULL); - g_list_free (contact_list); - - /* Skip to the end of the list */ - if (adj->upper - adj->lower > adj->page_size) - gtk_adjustment_set_value (adj, adj->upper); - - if (changed) { - editor->changed = TRUE; - command_state_changed (editor); - } - } - - gtk_drag_finish (context, handled, FALSE, time); -} - -static void -command_state_changed (EContactListEditor *editor) -{ - gboolean valid = eab_editor_is_valid (EAB_EDITOR (editor)); - - /* FIXME set the ok button to ok */ - gtk_widget_set_sensitive (editor->ok_button, valid && editor->allows_contact_lists); - gtk_widget_set_sensitive (editor->source_menu, editor->is_new_list); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "source-label"), editor->is_new_list); -} - -static void -extract_info(EContactListEditor *editor) -{ - EContact *contact = editor->contact; - if (contact) { - int i; - char *image_data; - gsize image_data_len; - char *string = gtk_editable_get_chars(GTK_EDITABLE (editor->list_name_entry), 0, -1); - - if (string && *string) { - e_contact_set (contact, E_CONTACT_FILE_AS, string); - e_contact_set (contact, E_CONTACT_FULL_NAME, string); - } - - g_free (string); - - e_contact_set (contact, E_CONTACT_IS_LIST, GINT_TO_POINTER (TRUE)); - e_contact_set (contact, E_CONTACT_LIST_SHOW_ADDRESSES, - GINT_TO_POINTER (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(editor->visible_addrs_checkbutton)))); - - e_vcard_remove_attributes (E_VCARD (contact), "", EVC_EMAIL); - - /* then refill it from the contact list model */ - for (i = 0; i < e_table_model_row_count (editor->model); i ++) { - const EDestination *dest = e_contact_list_model_get_destination (E_CONTACT_LIST_MODEL (editor->model), i); - EVCardAttribute *attr; - - attr = e_vcard_attribute_new (NULL, EVC_EMAIL); - - e_vcard_add_attribute (E_VCARD (contact), attr); - - e_destination_export_to_vcard_attribute ((EDestination*)dest, attr); - } - - if (editor->image_set - && e_image_chooser_get_image_data (E_IMAGE_CHOOSER (editor->list_image), - &image_data, - &image_data_len)) { - EContactPhoto photo; - - photo.data = image_data; - photo.length = image_data_len; - - e_contact_set (contact, E_CONTACT_LOGO, &photo); - g_free (image_data); - } - else { - e_contact_set (contact, E_CONTACT_LOGO, NULL); - } - } -} - -static void -fill_in_info(EContactListEditor *editor) -{ - if (editor->contact) { - EContactPhoto *photo; - char *file_as; - gboolean show_addresses = FALSE; - gboolean is_evolution_list = FALSE; - GList *email_list; - GList *iter; - - file_as = e_contact_get_const (editor->contact, E_CONTACT_FILE_AS); - email_list = e_contact_get_attributes (editor->contact, E_CONTACT_EMAIL); - is_evolution_list = GPOINTER_TO_INT (e_contact_get (editor->contact, E_CONTACT_IS_LIST)); - show_addresses = GPOINTER_TO_INT (e_contact_get (editor->contact, E_CONTACT_LIST_SHOW_ADDRESSES)); - - gtk_editable_delete_text (GTK_EDITABLE (editor->list_name_entry), 0, -1); - if (file_as) { - int position = 0; - gtk_editable_insert_text (GTK_EDITABLE (editor->list_name_entry), file_as, strlen (file_as), &position); - g_free (file_as); - } - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(editor->visible_addrs_checkbutton), !show_addresses); - - e_contact_list_model_remove_all (E_CONTACT_LIST_MODEL (editor->model)); - - for (iter = email_list; iter; iter = iter->next) { - EVCardAttribute *attr = iter->data; - GList *p; - EDestination *list_dest = e_destination_new (); - char *contact_uid = NULL; - char *email = NULL; - char *name = NULL; - int email_num = -1; - gboolean html_pref = FALSE; - - for (p = e_vcard_attribute_get_params (attr); p; p = p->next) { - EVCardAttributeParam *param = p->data; - const char *param_name = e_vcard_attribute_param_get_name (param); - if (!g_ascii_strcasecmp (param_name, - EVC_X_DEST_CONTACT_UID)) { - GList *v = e_vcard_attribute_param_get_values (param); - contact_uid = v ? v->data : NULL; - } - else if (!g_ascii_strcasecmp (param_name, - EVC_X_DEST_EMAIL_NUM)) { - GList *v = e_vcard_attribute_param_get_values (param); - email_num = v ? atoi (v->data) : -1; - } - else if (!g_ascii_strcasecmp (param_name, - EVC_X_DEST_NAME)) { - GList *v = e_vcard_attribute_param_get_values (param); - name = v ? v->data : NULL; - } - else if (!g_ascii_strcasecmp (param_name, - EVC_X_DEST_EMAIL)) { - GList *v = e_vcard_attribute_param_get_values (param); - email = v ? v->data : NULL; - } - else if (!g_ascii_strcasecmp (param_name, - EVC_X_DEST_HTML_MAIL)) { - GList *v = e_vcard_attribute_param_get_values (param); - html_pref = v ? !g_ascii_strcasecmp (v->data, "true") : FALSE; - } - } - - if (contact_uid) e_destination_set_contact_uid (list_dest, contact_uid, email_num); - if (name) e_destination_set_name (list_dest, name); - if (email) e_destination_set_email (list_dest, email); - e_destination_set_html_mail_pref (list_dest, html_pref); - - e_contact_list_model_add_destination (E_CONTACT_LIST_MODEL (editor->model), list_dest); - } - - g_list_foreach (email_list, (GFunc) e_vcard_attribute_free, NULL); - g_list_free (email_list); - - photo = e_contact_get (editor->contact, E_CONTACT_LOGO); - if (photo) { - e_image_chooser_set_image_data (E_IMAGE_CHOOSER (editor->list_image), photo->data, photo->length); - e_contact_photo_free (photo); - } - } - - if (editor->book) { - ESource *source; - - source = e_book_get_source (editor->book); - e_source_option_menu_select (E_SOURCE_OPTION_MENU (editor->source_menu), source); - gtk_widget_set_sensitive (editor->source_menu, editor->is_new_list); - gtk_widget_set_sensitive (glade_xml_get_widget (editor->gui, "source-label"), editor->is_new_list); - } -} diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.etspec b/addressbook/gui/contact-list-editor/e-contact-list-editor.etspec deleted file mode 100644 index 6d5f4f2514..0000000000 --- a/addressbook/gui/contact-list-editor/e-contact-list-editor.etspec +++ /dev/null @@ -1,7 +0,0 @@ -<ETableSpecification no-headers="true" cursor-mode="line" selection-mode="single"> -<ETableColumn model_col= "0" _title="Contact" expansion="1.0" minimum_width="20" resizable="true" cell="string" compare="string" /> - <ETableState> - <column source="0"/> - <grouping> </grouping> - </ETableState> -</ETableSpecification> diff --git a/addressbook/gui/contact-list-editor/e-contact-list-editor.h b/addressbook/gui/contact-list-editor/e-contact-list-editor.h deleted file mode 100644 index ca6aef85bc..0000000000 --- a/addressbook/gui/contact-list-editor/e-contact-list-editor.h +++ /dev/null @@ -1,124 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-list-editor.h - * Copyright (C) 2001 Ximian, Inc. - * Author: Chris Toshok <toshok@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_CONTACT_LIST_EDITOR_H__ -#define __E_CONTACT_LIST_EDITOR_H__ - -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-app-helper.h> -#include <bonobo/bonobo-ui-component.h> -#include <glade/glade.h> -#include <gal/e-table/e-table-model.h> - -#include "addressbook/gui/contact-editor/eab-editor.h" - -#include <libebook/e-book.h> -#include <libebook/e-contact.h> -#include "addressbook/util/e-destination.h" - -G_BEGIN_DECLS - -#define E_TYPE_CONTACT_LIST_EDITOR (e_contact_list_editor_get_type ()) -#define E_CONTACT_LIST_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_CONTACT_LIST_EDITOR, EContactListEditor)) -#define E_CONTACT_LIST_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_CONTACT_LIST_EDITOR, EContactListEditorClass)) -#define E_IS_CONTACT_LIST_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_CONTACT_LIST_EDITOR)) -#define E_IS_CONTACT_LIST_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_CONTACT_LIST_EDITOR)) - -#define SELECT_NAMES_OAFIID "OAFIID:GNOME_Evolution_Addressbook_SelectNames:" BASE_VERSION - -typedef struct _EContactListEditor EContactListEditor; -typedef struct _EContactListEditorClass EContactListEditorClass; - -struct _EContactListEditor -{ - EABEditor parent; - - /* item specific fields */ - EBook *book; - - EContact *contact; - - /* UI handler */ - BonoboUIComponent *uic; - - GladeXML *gui; - GtkWidget *app; - - GtkWidget *table; - ETableModel *model; - GtkWidget *email_entry; - GtkWidget *list_name_entry; - GtkWidget *add_button; - GtkWidget *remove_button; - GtkWidget *select_button; - GtkWidget *list_image_button; - GtkWidget *visible_addrs_checkbutton; - GtkWidget *list_image; - GtkWidget *source_menu; - GtkWidget *ok_button; - GtkWidget *cancel_button; - - /* FIXME: Unfortunately, we can't use the proper name here, as it'd - * create a circular dependency. The long-term solution would be to - * move the select-names component out of the component/ dir so it can - * be built before sources using this. - * - * GNOME_Evolution_Addressbook_SelectNames corba_select_names; */ - gpointer corba_select_names; - - /* Whether we are editing a new contact or an existing one */ - guint is_new_list : 1; - - /* Whether the image chooser widget has been changed. */ - guint image_set : 1; - - /* Whether the contact has been changed since bringing up the contact editor */ - guint changed : 1; - - /* Whether the contact editor will accept modifications */ - guint editable : 1; - - /* Whether the target book accepts storing of contact lists */ - guint allows_contact_lists : 1; - - /* Whether an async wombat call is in progress */ - guint in_async_call : 1; - - /* ID for async load_source call */ - guint load_source_id; - EBook *load_book; -}; - -struct _EContactListEditorClass -{ - EABEditorClass parent_class; -}; - -EContactListEditor *e_contact_list_editor_new (EBook *book, - EContact *list_contact, - gboolean is_new_list, - gboolean editable); -GType e_contact_list_editor_get_type (void); - -gboolean e_contact_list_editor_request_close_all (void); - -G_END_DECLS - - -#endif /* __E_CONTACT_LIST_EDITOR_H__ */ diff --git a/addressbook/gui/contact-list-editor/e-contact-list-model.c b/addressbook/gui/contact-list-editor/e-contact-list-model.c deleted file mode 100644 index 4560413c19..0000000000 --- a/addressbook/gui/contact-list-editor/e-contact-list-model.c +++ /dev/null @@ -1,284 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -#include <config.h> -#include <string.h> -#include "e-contact-list-model.h" -#include "widgets/misc/e-error.h" - -#include <gtk/gtkmessagedialog.h> -#define PARENT_TYPE e_table_model_get_type() -static ETableModelClass *parent_class; - -#define COLS 1 - -/* This function returns the number of columns in our ETableModel. */ -static int -contact_list_col_count (ETableModel *etc) -{ - return COLS; -} - -/* This function returns the number of rows in our ETableModel. */ -static int -contact_list_row_count (ETableModel *etc) -{ - EContactListModel *model = E_CONTACT_LIST_MODEL (etc); - return model->data_count; -} - -/* This function returns the value at a particular point in our ETableModel. */ -static void * -contact_list_value_at (ETableModel *etc, int col, int row) -{ - EContactListModel *model = E_CONTACT_LIST_MODEL (etc); - - return (void *) e_destination_get_textrep (model->data[row], TRUE); -} - -/* This function sets the value at a particular point in our ETableModel. */ -static void -contact_list_set_value_at (ETableModel *etc, int col, int row, const void *val) -{ - /* nothing */ -} - -/* This function returns whether a particular cell is editable. */ -static gboolean -contact_list_is_cell_editable (ETableModel *etc, int col, int row) -{ - return FALSE; -} - -/* This function duplicates the value passed to it. */ -static void * -contact_list_duplicate_value (ETableModel *etc, int col, const void *value) -{ - return g_strdup(value); -} - -/* This function frees the value passed to it. */ -static void -contact_list_free_value (ETableModel *etc, int col, void *value) -{ - g_free(value); -} - -static void * -contact_list_initialize_value (ETableModel *etc, int col) -{ - return g_strdup(""); -} - -static gboolean -contact_list_value_is_empty (ETableModel *etc, int col, const void *value) -{ - return !(value && *(char *)value); -} - -static char * -contact_list_value_to_string (ETableModel *etc, int col, const void *value) -{ - return g_strdup(value); -} - -static void -contact_list_model_dispose (GObject *o) -{ - EContactListModel *model = E_CONTACT_LIST_MODEL (o); - int i; - - if (model->data != NULL) { - for (i = 0; i < model->data_count; i ++) { - g_object_unref (model->data[i]); - } - g_free (model->data); - model->data = NULL; - } - - model->data_count = 0; - model->data_alloc = 0; - - (* G_OBJECT_CLASS (parent_class)->dispose) (o); -} - -static void -e_contact_list_model_class_init (GObjectClass *object_class) -{ - ETableModelClass *model_class = (ETableModelClass *) object_class; - - parent_class = g_type_class_ref (PARENT_TYPE); - - object_class->dispose = contact_list_model_dispose; - - model_class->column_count = contact_list_col_count; - model_class->row_count = contact_list_row_count; - model_class->value_at = contact_list_value_at; - model_class->set_value_at = contact_list_set_value_at; - model_class->is_cell_editable = contact_list_is_cell_editable; - model_class->duplicate_value = contact_list_duplicate_value; - model_class->free_value = contact_list_free_value; - model_class->initialize_value = contact_list_initialize_value; - model_class->value_is_empty = contact_list_value_is_empty; - model_class->value_to_string = contact_list_value_to_string; -} - -static void -e_contact_list_model_init (GObject *object) -{ - EContactListModel *model = E_CONTACT_LIST_MODEL(object); - - model->data_alloc = 10; - model->data_count = 0; - model->data = g_new (EDestination*, model->data_alloc); -} - -GType -e_contact_list_model_get_type (void) -{ - static GType cle_type = 0; - - if (!cle_type) { - static const GTypeInfo cle_info = { - sizeof (EContactListModelClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_contact_list_model_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EContactListModel), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_contact_list_model_init, - }; - - cle_type = g_type_register_static (E_TABLE_MODEL_TYPE, "EContactListModel", &cle_info, 0); - } - - return cle_type; -} - -void -e_contact_list_model_construct (EContactListModel *model) -{ -} - -ETableModel * -e_contact_list_model_new () -{ - EContactListModel *model; - - model = g_object_new (E_TYPE_CONTACT_LIST_MODEL, NULL); - - e_contact_list_model_construct (model); - - return E_TABLE_MODEL(model); -} - -void -e_contact_list_model_add_destination (EContactListModel *model, EDestination *dest) -{ - g_return_if_fail (E_IS_CONTACT_LIST_MODEL (model)); - g_return_if_fail (E_IS_DESTINATION (dest)); - - e_table_model_pre_change (E_TABLE_MODEL (model)); - - if (model->data_count + 1 >= model->data_alloc) { - model->data_alloc *= 2; - model->data = g_renew (EDestination*, model->data, model->data_alloc); - } - - model->data[model->data_count ++] = dest; - g_object_ref (dest); - - e_table_model_row_inserted (E_TABLE_MODEL (model), model->data_count - 1); -} - -void -e_contact_list_model_add_email (EContactListModel *model, - const char *email) -{ - EDestination *new_dest; - char *list_email; - int row; - int row_count; - - g_return_if_fail (E_IS_CONTACT_LIST_MODEL (model)); - g_return_if_fail (email != NULL); - - row_count = e_table_model_row_count (E_TABLE_MODEL (model)); - - for (row = 0; row < row_count; row++) { - list_email = (char *) e_table_model_value_at (E_TABLE_MODEL (model), 1, row); - - if (strcmp (list_email, email) == 0) { - if (e_error_run (NULL, "addressbook:ask-list-add-exists", - email) != GTK_RESPONSE_YES) - return; - break; - } - } - - new_dest = e_destination_new (); - e_destination_set_email (new_dest, email); - - e_contact_list_model_add_destination (model, new_dest); -} - -void -e_contact_list_model_add_contact (EContactListModel *model, - EContact *contact, - int email_num) -{ - EDestination *new_dest; - - g_return_if_fail (E_IS_CONTACT_LIST_MODEL (model)); - g_return_if_fail (E_IS_CONTACT (contact)); - - new_dest = e_destination_new (); - e_destination_set_contact (new_dest, contact, email_num); - - e_contact_list_model_add_destination (model, new_dest); -} - -void -e_contact_list_model_remove_row (EContactListModel *model, int row) -{ - g_return_if_fail (E_IS_CONTACT_LIST_MODEL (model)); - g_return_if_fail (0 <= row && row < model->data_count); - - e_table_model_pre_change (E_TABLE_MODEL (model)); - - g_object_unref (model->data[row]); - memmove (model->data + row, model->data + row + 1, sizeof (EDestination*) * (model->data_count - row - 1)); - model->data_count --; - - e_table_model_row_deleted (E_TABLE_MODEL (model), row); -} - -void -e_contact_list_model_remove_all (EContactListModel *model) -{ - int i; - - g_return_if_fail (E_IS_CONTACT_LIST_MODEL (model)); - - e_table_model_pre_change (E_TABLE_MODEL (model)); - - for (i = 0; i < model->data_count; i ++) { - g_object_unref (model->data[i]); - model->data[i] = NULL; - } - - model->data_count = 0; - - e_table_model_changed (E_TABLE_MODEL (model)); -} - - -const EDestination * -e_contact_list_model_get_destination (EContactListModel *model, int row) -{ - g_return_val_if_fail (E_IS_CONTACT_LIST_MODEL (model), NULL); - g_return_val_if_fail (0 <= row && row < model->data_count, NULL); - - return model->data[row]; -} diff --git a/addressbook/gui/contact-list-editor/e-contact-list-model.h b/addressbook/gui/contact-list-editor/e-contact-list-model.h deleted file mode 100644 index 0c01dfa7ed..0000000000 --- a/addressbook/gui/contact-list-editor/e-contact-list-model.h +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#ifndef _E_CONTACT_LIST_MODEL_H_ -#define _E_CONTACT_LIST_MODEL_H_ - -#include <gal/e-table/e-table-model.h> -#include <libebook/e-contact.h> -#include "addressbook/util/e-destination.h" - -G_BEGIN_DECLS - -#define E_TYPE_CONTACT_LIST_MODEL (e_contact_list_model_get_type ()) -#define E_CONTACT_LIST_MODEL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_CONTACT_LIST_MODEL, EContactListModel)) -#define E_CONTACT_LIST_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_CONTACT_LIST_MODEL, EContactListModelClass)) -#define E_IS_CONTACT_LIST_MODEL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_CONTACT_LIST_MODEL)) -#define E_IS_CONTACT_LIST_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_CONTACT_LIST_MODEL)) - -typedef struct _EContactListModel EContactListModel; -typedef struct _EContactListModelClass EContactListModelClass; - -struct _EContactListModel { - ETableModel parent; - - EDestination **data; - int data_count; - int data_alloc; -}; - - -struct _EContactListModelClass { - ETableModelClass parent_class; -}; - - -GType e_contact_list_model_get_type (void); -void e_contact_list_model_construct (EContactListModel *model); -ETableModel *e_contact_list_model_new (void); - -void e_contact_list_model_add_destination (EContactListModel *model, EDestination *dest); -void e_contact_list_model_add_email (EContactListModel *model, const char *email); -void e_contact_list_model_add_contact (EContactListModel *model, EContact *contact, int email_num); - -void e_contact_list_model_remove_row (EContactListModel *model, int row); -void e_contact_list_model_remove_all (EContactListModel *model); - -const EDestination *e_contact_list_model_get_destination (EContactListModel *model, int row); - -G_END_DECLS - -#endif /* _E_CONTACT_LIST_MODEL_H_ */ diff --git a/addressbook/gui/merging/.cvsignore b/addressbook/gui/merging/.cvsignore deleted file mode 100644 index b6fa83ca4c..0000000000 --- a/addressbook/gui/merging/.cvsignore +++ /dev/null @@ -1,8 +0,0 @@ -.deps -.libs -.pure -Makefile -Makefile.in -*.lo -*.la -*.gladep diff --git a/addressbook/gui/merging/Makefile.am b/addressbook/gui/merging/Makefile.am deleted file mode 100644 index f1d589ad00..0000000000 --- a/addressbook/gui/merging/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -INCLUDES = \ - -DG_LOG_DOMAIN=\"eab-contact-merging\" \ - -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ - -I$(top_srcdir) \ - -I$(top_srcdir)/addressbook \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_builddir)/addressbook/backend \ - $(EVOLUTION_ADDRESSBOOK_CFLAGS) - -noinst_LTLIBRARIES = \ - libeabbookmerging.la - -libeabbookmerging_la_SOURCES = \ - eab-contact-compare.c \ - eab-contact-compare.h \ - eab-contact-merging.c \ - eab-contact-merging.h - - -glade_DATA = eab-contact-duplicate-detected.glade \ - eab-contact-commit-duplicate-detected.glade - -EXTRA_DIST = \ - $(glade_DATA) diff --git a/addressbook/gui/merging/eab-contact-commit-duplicate-detected.glade b/addressbook/gui/merging/eab-contact-commit-duplicate-detected.glade deleted file mode 100644 index 3ad86b40ba..0000000000 --- a/addressbook/gui/merging/eab-contact-commit-duplicate-detected.glade +++ /dev/null @@ -1,212 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> - -<widget class="GtkDialog" id="dialog-duplicate-contact"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="title" translatable="yes">Duplicate Contact Detected</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="has_separator">True</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox1"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - - <child> - <widget class="GtkButton" id="button3"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">1</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="button4"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-add</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">0</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="table1"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="n_rows">5</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="Custom" id="custom-old-contact"> - <property name="visible">True</property> - <property name="creation_function">_eab_contact_merging_create_contact_display</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Sun, 05 Oct 2003 03:54:20 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="label" translatable="yes">The changed email or name of this contact already -exists in this folder. Would you like to add it anyway?</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label3"> - <property name="visible">True</property> - <property name="label" translatable="yes">Conflicting Contact:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label4"> - <property name="visible">True</property> - <property name="label" translatable="yes">Changed Contact:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="Custom" id="custom-new-contact"> - <property name="visible">True</property> - <property name="creation_function">_eab_contact_merging_create_contact_display</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Sun, 05 Oct 2003 03:53:42 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - - <child> - <widget class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="xalign">0.5</property> - <property name="yalign">0</property> - <property name="xscale">1</property> - <property name="yscale">0</property> - - <child> - <widget class="Custom" id="custom2"> - <property name="visible">True</property> - <property name="creation_function">e_create_image_widget</property> - <property name="string1">stock_person</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Fri, 08 Jun 2001 00:18:39 GMT</property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">5</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -</glade-interface> diff --git a/addressbook/gui/merging/eab-contact-compare.c b/addressbook/gui/merging/eab-contact-compare.c deleted file mode 100644 index 4244f3fbff..0000000000 --- a/addressbook/gui/merging/eab-contact-compare.c +++ /dev/null @@ -1,798 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * eab-contact-compare.c - * - * Copyright (C) 2001, 2002, 2003 Ximian, Inc. - * - * Authors: Jon Trowbridge <trow@ximian.com> - * Chris Toshok <toshok@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#include <config.h> -#include <ctype.h> -#include <string.h> -#include "util/eab-book-util.h" -#include "../component/addressbook.h" -#include "eab-contact-compare.h" - -/* This is an "optimistic" combiner: the best of the two outcomes is - selected. */ -static EABContactMatchType -combine_comparisons (EABContactMatchType prev, - EABContactMatchType new_info) -{ - if (new_info == EAB_CONTACT_MATCH_NOT_APPLICABLE) - return prev; - return (EABContactMatchType) MAX ((gint) prev, (gint) new_info); -} - - -/*** Name comparisons ***/ - -/* This *so* doesn't belong here... at least not implemented in a - sucky way like this. But it can be fixed later. */ - -/* This is very Anglocentric. */ -static gchar *name_synonyms[][2] = { - { "jon", "john" }, /* Ah, the hacker's perogative */ - { "joseph", "joe" }, - { "robert", "bob" }, - { "gene", "jean" }, - { "jesse", "jessie" }, - { "ian", "iain" }, - { "richard", "dick" }, - { "william", "bill" }, - { "william", "will" }, - { "anthony", "tony" }, - { "michael", "mike" }, - { "eric", "erik" }, - { "elizabeth", "liz" }, - { "jeff", "geoff" }, - { "jeff", "geoffrey" }, - { "tom", "thomas" }, - { "dave", "david" }, - { "jim", "james" }, - { "abigal", "abby" }, - { "amanda", "amy" }, - { "amanda", "manda" }, - { "jennifer", "jenny" }, - { "christopher", "chris" }, - { "rebecca", "becca" }, - { "rebecca", "becky" }, - { "anderson", "andersen" }, - { "johnson", "johnsen" }, - /* We could go on and on... */ - /* We should add soundex here. */ - { NULL, NULL } -}; - -static gboolean -name_fragment_match (const gchar *a, const gchar *b, gboolean strict) -{ - gint len; - - if (!(a && b && *a && *b)) - return FALSE; - - /* If we are in 'strict' mode, b must match the beginning of a. - So "Robert", "Rob" would match, but "Robert", "Robbie" wouldn't. - - If strict is FALSE, it is sufficient for the strings to share - some leading characters. In this case, "Robert" and "Robbie" - would match, as would "Dave" and "Dan". */ - - if (strict) { - len = g_utf8_strlen (b, -1); - } else { - len = MIN (g_utf8_strlen (a, -1), g_utf8_strlen (b, -1)); - } - - return !e_utf8_casefold_collate_len (a, b, len); -} - -static gboolean -name_fragment_match_with_synonyms (const gchar *a, const gchar *b, gboolean strict) -{ - gint i; - - if (!(a && b && *a && *b)) - return FALSE; - - if (name_fragment_match (a, b, strict)) - return TRUE; - - /* Check for nicknames. Yes, the linear search blows. */ - for (i=0; name_synonyms[i][0]; ++i) { - - if (!e_utf8_casefold_collate (name_synonyms[i][0], a) - && !e_utf8_casefold_collate (name_synonyms[i][1], b)) - return TRUE; - - if (!e_utf8_casefold_collate (name_synonyms[i][0], b) - && !e_utf8_casefold_collate (name_synonyms[i][1], a)) - return TRUE; - } - - return FALSE; -} - -EABContactMatchType -eab_contact_compare_name_to_string (EContact *contact, const gchar *str) -{ - return eab_contact_compare_name_to_string_full (contact, str, FALSE, NULL, NULL, NULL); -} - -EABContactMatchType -eab_contact_compare_name_to_string_full (EContact *contact, const gchar *str, gboolean allow_partial_matches, - gint *matched_parts_out, EABContactMatchPart *first_matched_part_out, gint *matched_character_count_out) -{ - gchar **namev, **givenv = NULL, **addv = NULL, **familyv = NULL; - - gint matched_parts = EAB_CONTACT_MATCH_PART_NONE; - EABContactMatchPart first_matched_part = EAB_CONTACT_MATCH_PART_NONE; - EABContactMatchPart this_part_match = EAB_CONTACT_MATCH_PART_NOT_APPLICABLE; - EABContactMatchType match_type; - EContactName *contact_name; - - gint match_count = 0, matched_character_count = 0, fragment_count; - gint i, j; - gchar *str_cpy, *s; - - g_return_val_if_fail (E_IS_CONTACT (contact), EAB_CONTACT_MATCH_NOT_APPLICABLE); - - if (!e_contact_get_const (contact, E_CONTACT_FULL_NAME)) - return EAB_CONTACT_MATCH_NOT_APPLICABLE; - if (str == NULL) - return EAB_CONTACT_MATCH_NOT_APPLICABLE; - - str_cpy = s = g_strdup (str); - while (*s) { - if (*s == ',' || *s == '"') - *s = ' '; - ++s; - } - namev = g_strsplit (str_cpy, " ", 0); - g_free (str_cpy); - - contact_name = e_contact_get (contact, E_CONTACT_NAME); - - if (contact_name->given) - givenv = g_strsplit (contact_name->given, " ", 0); - if (contact_name->additional) - addv = g_strsplit (contact_name->additional, " ", 0); - if (contact_name->family) - familyv = g_strsplit (contact_name->family, " ", 0); - - e_contact_name_free (contact_name); - - fragment_count = 0; - for (i = 0; givenv && givenv[i]; ++i) - ++fragment_count; - for (i = 0; addv && addv[i]; ++i) - ++fragment_count; - for (i = 0; familyv && familyv[i]; ++i) - ++fragment_count; - - for (i = 0; namev[i] && this_part_match != EAB_CONTACT_MATCH_PART_NONE; ++i) { - - if (*namev[i]) { - - this_part_match = EAB_CONTACT_MATCH_PART_NONE; - - /* When we are allowing partials, we are strict about the matches we allow. - Does this make sense? Not really, but it does the right thing for the purposes - of completion. */ - - if (givenv && this_part_match == EAB_CONTACT_MATCH_PART_NONE) { - for (j = 0; givenv[j]; ++j) { - if (name_fragment_match_with_synonyms (givenv[j], namev[i], allow_partial_matches)) { - - this_part_match = EAB_CONTACT_MATCH_PART_GIVEN_NAME; - - /* We remove a piece of a name once it has been matched against, so - that "john john" won't match "john doe". */ - g_free (givenv[j]); - givenv[j] = g_strdup (""); - break; - } - } - } - - if (addv && this_part_match == EAB_CONTACT_MATCH_PART_NONE) { - for (j = 0; addv[j]; ++j) { - if (name_fragment_match_with_synonyms (addv[j], namev[i], allow_partial_matches)) { - - this_part_match = EAB_CONTACT_MATCH_PART_ADDITIONAL_NAME; - - g_free (addv[j]); - addv[j] = g_strdup (""); - break; - } - } - } - - if (familyv && this_part_match == EAB_CONTACT_MATCH_PART_NONE) { - for (j = 0; familyv[j]; ++j) { - if (allow_partial_matches ? name_fragment_match_with_synonyms (familyv[j], namev[i], allow_partial_matches) - : !e_utf8_casefold_collate (familyv[j], namev[i])) { - - this_part_match = EAB_CONTACT_MATCH_PART_FAMILY_NAME; - - g_free (familyv[j]); - familyv[j] = g_strdup (""); - break; - } - } - } - - if (this_part_match != EAB_CONTACT_MATCH_PART_NONE) { - ++match_count; - matched_character_count += g_utf8_strlen (namev[i], -1); - matched_parts |= this_part_match; - if (first_matched_part == EAB_CONTACT_MATCH_PART_NONE) - first_matched_part = this_part_match; - } - } - } - - match_type = EAB_CONTACT_MATCH_NONE; - - if (this_part_match != EAB_CONTACT_MATCH_PART_NONE) { - - if (match_count > 0) - match_type = EAB_CONTACT_MATCH_VAGUE; - - if (fragment_count == match_count) { - - match_type = EAB_CONTACT_MATCH_EXACT; - - } else if (fragment_count == match_count + 1) { - - match_type = EAB_CONTACT_MATCH_PARTIAL; - - } - } - - if (matched_parts_out) - *matched_parts_out = matched_parts; - if (first_matched_part_out) - *first_matched_part_out = first_matched_part; - if (matched_character_count_out) - *matched_character_count_out = matched_character_count; - - g_strfreev (namev); - g_strfreev (givenv); - g_strfreev (addv); - g_strfreev (familyv); - - return match_type; -} - -EABContactMatchType -eab_contact_compare_file_as (EContact *contact1, EContact *contact2) -{ - EABContactMatchType match_type; - gchar *a, *b; - - g_return_val_if_fail (E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); - g_return_val_if_fail (E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); - - a = e_contact_get (contact1, E_CONTACT_FILE_AS); - b = e_contact_get (contact2, E_CONTACT_FILE_AS); - - if (a == NULL || b == NULL) { - g_free (a); - g_free (b); - return EAB_CONTACT_MATCH_NOT_APPLICABLE; - } - - if (!strcmp (a, b)) - match_type = EAB_CONTACT_MATCH_EXACT; - else if (g_utf8_validate (a, -1, NULL) && g_utf8_validate (b, -1, NULL) && - !g_utf8_collate (a, b)) - match_type = EAB_CONTACT_MATCH_PARTIAL; - else - match_type = EAB_CONTACT_MATCH_NONE; - - g_free (a); - g_free (b); - return match_type; -} - -EABContactMatchType -eab_contact_compare_name (EContact *contact1, EContact *contact2) -{ - EContactName *a, *b; - gint matches=0, possible=0; - gboolean given_match = FALSE, additional_match = FALSE, family_match = FALSE; - - g_return_val_if_fail (E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); - g_return_val_if_fail (E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); - - a = e_contact_get (contact1, E_CONTACT_NAME); - b = e_contact_get (contact2, E_CONTACT_NAME); - - if (a == NULL || b == NULL) { - g_free (a); - g_free (b); - return EAB_CONTACT_MATCH_NOT_APPLICABLE; - } - - if (a->given && b->given && *a->given && *b->given) { - ++possible; - if (name_fragment_match_with_synonyms (a->given, b->given, FALSE /* both inputs are complete */)) { - ++matches; - given_match = TRUE; - } - } - - if (a->additional && b->additional && *a->additional && *b->additional) { - ++possible; - if (name_fragment_match_with_synonyms (a->additional, b->additional, FALSE /* both inputs are complete */)) { - ++matches; - additional_match = TRUE; - } - } - - if (a->family && b->family && *a->family && *b->family) { - ++possible; - /* We don't allow "loose matching" (i.e. John vs. Jon) on family names */ - if (! e_utf8_casefold_collate (a->family, b->family)) { - ++matches; - family_match = TRUE; - } - } - - e_contact_name_free (a); - e_contact_name_free (b); - - /* Now look at the # of matches and try to intelligently map - an EAB_CONTACT_MATCH_* type to it. Special consideration is given - to family-name matches. */ - - if (possible == 0) - return EAB_CONTACT_MATCH_NOT_APPLICABLE; - - if (possible == 1) - return family_match ? EAB_CONTACT_MATCH_VAGUE : EAB_CONTACT_MATCH_NONE; - - if (possible == matches) - return family_match ? EAB_CONTACT_MATCH_EXACT : EAB_CONTACT_MATCH_PARTIAL; - - if (possible == matches+1) - return family_match ? EAB_CONTACT_MATCH_VAGUE : EAB_CONTACT_MATCH_NONE; - - return EAB_CONTACT_MATCH_NONE; -} - - -/*** Nickname Comparisons ***/ - -EABContactMatchType -eab_contact_compare_nickname (EContact *contact1, EContact *contact2) -{ - g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); - g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); - - return EAB_CONTACT_MATCH_NOT_APPLICABLE; -} - - - -/*** E-mail Comparisons ***/ - -static gboolean -match_email_username (const gchar *addr1, const gchar *addr2) -{ - gint c1, c2; - if (addr1 == NULL || addr2 == NULL) - return FALSE; - - while (*addr1 && *addr2 && *addr1 != '@' && *addr2 != '@') { - c1 = isupper (*addr1) ? tolower (*addr1) : *addr1; - c2 = isupper (*addr2) ? tolower (*addr2) : *addr2; - if (c1 != c2) - return FALSE; - ++addr1; - ++addr2; - } - - return *addr1 == *addr2; -} - -static gboolean -match_email_hostname (const gchar *addr1, const gchar *addr2) -{ - gint c1, c2; - gboolean seen_at1, seen_at2; - if (addr1 == NULL || addr2 == NULL) - return FALSE; - - /* Walk to the end of each string. */ - seen_at1 = FALSE; - if (*addr1) { - while (*addr1) { - if (*addr1 == '@') - seen_at1 = TRUE; - ++addr1; - } - --addr1; - } - - seen_at2 = FALSE; - if (*addr2) { - while (*addr2) { - if (*addr2 == '@') - seen_at2 = TRUE; - ++addr2; - } - --addr2; - } - - if (!seen_at1 && !seen_at2) - return TRUE; - if (!seen_at1 || !seen_at2) - return FALSE; - - while (*addr1 != '@' && *addr2 != '@') { - c1 = isupper (*addr1) ? tolower (*addr1) : *addr1; - c2 = isupper (*addr2) ? tolower (*addr2) : *addr2; - if (c1 != c2) - return FALSE; - --addr1; - --addr2; - } - - /* This will match bob@foo.ximian.com and bob@ximian.com */ - return *addr1 == '.' || *addr2 == '.'; -} - -static EABContactMatchType -compare_email_addresses (const gchar *addr1, const gchar *addr2) -{ - if (addr1 == NULL || *addr1 == 0 || - addr2 == NULL || *addr2 == 0) - return EAB_CONTACT_MATCH_NOT_APPLICABLE; - - if (match_email_username (addr1, addr2)) - return match_email_hostname (addr1, addr2) ? EAB_CONTACT_MATCH_EXACT : EAB_CONTACT_MATCH_VAGUE; - - return EAB_CONTACT_MATCH_NONE; -} - -EABContactMatchType -eab_contact_compare_email (EContact *contact1, EContact *contact2) -{ - EABContactMatchType match = EAB_CONTACT_MATCH_NOT_APPLICABLE; - GList *contact1_email, *contact2_email; - GList *i1, *i2; - - g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); - g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); - - contact1_email = e_contact_get (contact1, E_CONTACT_EMAIL); - contact2_email = e_contact_get (contact2, E_CONTACT_EMAIL); - - if (contact1_email == NULL || contact2_email == NULL) { - g_list_foreach (contact1_email, (GFunc)g_free, NULL); - g_list_free (contact1_email); - - g_list_foreach (contact2_email, (GFunc)g_free, NULL); - g_list_free (contact2_email); - return EAB_CONTACT_MATCH_NOT_APPLICABLE; - } - - i1 = contact1_email; - - /* Do pairwise-comparisons on all of the e-mail addresses. If - we find an exact match, there is no reason to keep - checking. */ - while (i1 && match != EAB_CONTACT_MATCH_EXACT) { - char *addr1 = (char *) i1->data; - - i2 = contact2_email; - while (i2 && match != EAB_CONTACT_MATCH_EXACT) { - char *addr2 = (char *) i2->data; - - match = combine_comparisons (match, compare_email_addresses (addr1, addr2)); - - i2 = i2->next; - } - - i1 = i1->next; - } - - g_list_foreach (contact1_email, (GFunc)g_free, NULL); - g_list_free (contact1_email); - - g_list_foreach (contact2_email, (GFunc)g_free, NULL); - g_list_free (contact2_email); - - return match; -} - -EABContactMatchType -eab_contact_compare_address (EContact *contact1, EContact *contact2) -{ - g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); - g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); - - /* Unimplemented */ - - return EAB_CONTACT_MATCH_NOT_APPLICABLE; -} - -EABContactMatchType -eab_contact_compare_telephone (EContact *contact1, EContact *contact2) -{ - g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); - g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); - - /* Unimplemented */ - - return EAB_CONTACT_MATCH_NOT_APPLICABLE; -} - -EABContactMatchType -eab_contact_compare (EContact *contact1, EContact *contact2) -{ - EABContactMatchType result; - - g_return_val_if_fail (contact1 && E_IS_CONTACT (contact1), EAB_CONTACT_MATCH_NOT_APPLICABLE); - g_return_val_if_fail (contact2 && E_IS_CONTACT (contact2), EAB_CONTACT_MATCH_NOT_APPLICABLE); - - result = EAB_CONTACT_MATCH_NONE; - result = combine_comparisons (result, eab_contact_compare_name (contact1, contact2)); - result = combine_comparisons (result, eab_contact_compare_nickname (contact1, contact2)); - result = combine_comparisons (result, eab_contact_compare_email (contact1, contact2)); - result = combine_comparisons (result, eab_contact_compare_address (contact1, contact2)); - result = combine_comparisons (result, eab_contact_compare_telephone (contact1, contact2)); - result = combine_comparisons (result, eab_contact_compare_file_as (contact1, contact2)); - - return result; -} - -typedef struct _MatchSearchInfo MatchSearchInfo; -struct _MatchSearchInfo { - EContact *contact; - GList *avoid; - EABContactMatchQueryCallback cb; - gpointer closure; -}; - -static void -match_search_info_free (MatchSearchInfo *info) -{ - if (info) { - g_object_unref (info->contact); - - /* This should already have been deallocated, but just in case... */ - if (info->avoid) { - g_list_foreach (info->avoid, (GFunc) g_object_unref, NULL); - g_list_free (info->avoid); - info->avoid = NULL; - } - - g_free (info); - } -} - -static void -query_cb (EBook *book, EBookStatus status, GList *contacts, gpointer closure) -{ - /* XXX we need to free contacts */ - MatchSearchInfo *info = (MatchSearchInfo *) closure; - EABContactMatchType best_match = EAB_CONTACT_MATCH_NONE; - EContact *best_contact = NULL; - GList *remaining_contacts = NULL; - const GList *i; - - if (status != E_BOOK_ERROR_OK) { - info->cb (info->contact, NULL, EAB_CONTACT_MATCH_NONE, info->closure); - match_search_info_free (info); - return; - } - - /* remove the contacts we're to avoid from the list, if they're present */ - for (i = contacts; i != NULL; i = g_list_next (i)) { - EContact *this_contact = E_CONTACT (i->data); - const gchar *this_uid; - GList *iterator; - gboolean avoid = FALSE; - - this_uid = e_contact_get_const (this_contact, E_CONTACT_UID); - if (!this_uid) - continue; - - for (iterator = info->avoid; iterator; iterator = iterator->next) { - const gchar *avoid_uid; - - avoid_uid = e_contact_get_const (iterator->data, E_CONTACT_UID); - if (!avoid_uid) - continue; - - if (!strcmp (avoid_uid, this_uid)) { - avoid = TRUE; - break; - } - } - if (!avoid) - remaining_contacts = g_list_prepend (remaining_contacts, this_contact); - } - - remaining_contacts = g_list_reverse (remaining_contacts); - - for (i = remaining_contacts; i != NULL; i = g_list_next (i)) { - EContact *this_contact = E_CONTACT (i->data); - EABContactMatchType this_match = eab_contact_compare (info->contact, this_contact); - if ((gint)this_match > (gint)best_match) { - best_match = this_match; - best_contact = this_contact; - } - } - - g_list_free (remaining_contacts); - - info->cb (info->contact, best_contact, best_match, info->closure); - match_search_info_free (info); -} - -#define MAX_QUERY_PARTS 10 -static void -use_common_book_cb (EBook *book, gpointer closure) -{ - MatchSearchInfo *info = (MatchSearchInfo *) closure; - EContact *contact = info->contact; - EContactName *contact_name; - GList *contact_email; - gchar *query_parts[MAX_QUERY_PARTS]; - gint p=0; - gchar *contact_file_as, *qj; - EBookQuery *query = NULL; - int i; - - if (book == NULL) { - info->cb (info->contact, NULL, EAB_CONTACT_MATCH_NONE, info->closure); - match_search_info_free (info); - return; - } - - contact_file_as = e_contact_get (contact, E_CONTACT_FILE_AS); - if (contact_file_as) { - query_parts [p++] = g_strdup_printf ("(contains \"file_as\" \"%s\")", contact_file_as); - g_free (contact_file_as); - } - - contact_name = e_contact_get (contact, E_CONTACT_NAME); - if (contact_name) { - if (contact_name->given && *contact_name->given) - query_parts[p++] = g_strdup_printf ("(contains \"full_name\" \"%s\")", contact_name->given); - - if (contact_name->additional && *contact_name->additional) - query_parts[p++] = g_strdup_printf ("(contains \"full_name\" \"%s\")", contact_name->additional); - - if (contact_name->family && *contact_name->family) - query_parts[p++] = g_strdup_printf ("(contains \"full_name\" \"%s\")", contact_name->family); - - e_contact_name_free (contact_name); - } - - contact_email = e_contact_get (contact, E_CONTACT_EMAIL); - if (contact_email) { - GList *iter; - for (iter = contact_email; iter && p < MAX_QUERY_PARTS; iter = iter->next) { - gchar *addr = g_strdup (iter->data); - if (addr && *addr) { - gchar *s = addr; - while (*s) { - if (*s == '@') { - *s = '\0'; - break; - } - ++s; - } - query_parts[p++] = g_strdup_printf ("(beginswith \"email\" \"%s\")", addr); - g_free (addr); - } - } - } - g_list_foreach (contact_email, (GFunc)g_free, NULL); - g_list_free (contact_email); - - - /* Build up our full query from the parts. */ - query_parts[p] = NULL; - qj = g_strjoinv (" ", query_parts); - for(i = 0; query_parts[i] != NULL; i++) - g_free(query_parts[i]); - if (p > 1) { - char *s; - s = g_strdup_printf ("(or %s)", qj); - query = e_book_query_from_string (s); - g_free (s); - } - else if (p == 1) { - query = e_book_query_from_string (qj); - } - else { - query = NULL; - } - - if (query) - e_book_async_get_contacts (book, query, query_cb, info); - else - query_cb (book, E_BOOK_ERROR_OK, NULL, info); - - g_free (qj); - if (query) - e_book_query_unref (query); -} - -void -eab_contact_locate_match (EContact *contact, EABContactMatchQueryCallback cb, gpointer closure) -{ - MatchSearchInfo *info; - - g_return_if_fail (contact && E_IS_CONTACT (contact)); - g_return_if_fail (cb != NULL); - - info = g_new (MatchSearchInfo, 1); - info->contact = contact; - g_object_ref (contact); - info->cb = cb; - info->closure = closure; - info->avoid = NULL; - - addressbook_load_default_book ((EBookCallback) use_common_book_cb, info); -} - -/** - * e_contact_locate_match_full: - * @book: The book to look in. If this is NULL, use the default - * addressbook. - * @contact: The contact to compare to. - * @avoid: A list of contacts to not match. These will not show up in the search. - * @cb: The function to call. - * @closure: The closure to add to the call. - * - * Look for the best match and return it using the EABContactMatchQueryCallback. - **/ -void -eab_contact_locate_match_full (EBook *book, EContact *contact, GList *avoid, EABContactMatchQueryCallback cb, gpointer closure) -{ - MatchSearchInfo *info; - - g_return_if_fail (contact && E_IS_CONTACT (contact)); - g_return_if_fail (cb != NULL); - - info = g_new (MatchSearchInfo, 1); - info->contact = contact; - g_object_ref (contact); - info->cb = cb; - info->closure = closure; - info->avoid = g_list_copy (avoid); - g_list_foreach (info->avoid, (GFunc) g_object_ref, NULL); - - if (book) - use_common_book_cb (book, info); - else - addressbook_load_default_book ((EBookCallback) use_common_book_cb, info); -} - diff --git a/addressbook/gui/merging/eab-contact-compare.h b/addressbook/gui/merging/eab-contact-compare.h deleted file mode 100644 index 153e44aef1..0000000000 --- a/addressbook/gui/merging/eab-contact-compare.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * eab-contact-compare.h - * - * Copyright (C) 2001,2002,2003 Ximian, Inc. - * - * Authors: Jon Trowbridge <trow@ximian.com> - * Chris Toshok <toshok@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef __EAB_CONTACT_COMPARE_H__ -#define __EAB_CONTACT_COMPARE_H__ - -#include <libebook/e-book.h> -#include <libebook/e-contact.h> - -typedef enum { - EAB_CONTACT_MATCH_NOT_APPLICABLE = 0, - EAB_CONTACT_MATCH_NONE = 1, - EAB_CONTACT_MATCH_VAGUE = 2, - EAB_CONTACT_MATCH_PARTIAL = 3, - EAB_CONTACT_MATCH_EXACT = 4 -} EABContactMatchType; - -typedef enum { - EAB_CONTACT_MATCH_PART_NOT_APPLICABLE = -1, - EAB_CONTACT_MATCH_PART_NONE = 0, - EAB_CONTACT_MATCH_PART_GIVEN_NAME = 1<<0, - EAB_CONTACT_MATCH_PART_ADDITIONAL_NAME = 1<<2, - EAB_CONTACT_MATCH_PART_FAMILY_NAME = 1<<3 -} EABContactMatchPart; - -typedef void (*EABContactMatchQueryCallback) (EContact *contact, EContact *match, EABContactMatchType type, gpointer closure); - -EABContactMatchType eab_contact_compare_name_to_string (EContact *contact, const gchar *str); - -EABContactMatchType eab_contact_compare_name_to_string_full (EContact *contact, const gchar *str, - gboolean allow_partial_matches, - gint *matched_parts, EABContactMatchPart *first_matched_part, - gint *matched_character_count); - -EABContactMatchType eab_contact_compare_file_as (EContact *contact1, EContact *contact2); -EABContactMatchType eab_contact_compare_name (EContact *contact1, EContact *contact2); -EABContactMatchType eab_contact_compare_nickname (EContact *contact1, EContact *contact2); -EABContactMatchType eab_contact_compare_email (EContact *contact1, EContact *contact2); -EABContactMatchType eab_contact_compare_address (EContact *contact1, EContact *contact2); -EABContactMatchType eab_contact_compare_telephone (EContact *contact1, EContact *contact2); - -EABContactMatchType eab_contact_compare (EContact *contact1, EContact *contact2); - -void eab_contact_locate_match (EContact *contact, EABContactMatchQueryCallback cb, gpointer closure); -void eab_contact_locate_match_full (EBook *book, EContact *contact, GList *avoid, EABContactMatchQueryCallback cb, gpointer closure); - - - -#endif /* __E_CONTACT_COMPARE_H__ */ - diff --git a/addressbook/gui/merging/eab-contact-duplicate-detected.glade b/addressbook/gui/merging/eab-contact-duplicate-detected.glade deleted file mode 100644 index f1095f9db0..0000000000 --- a/addressbook/gui/merging/eab-contact-duplicate-detected.glade +++ /dev/null @@ -1,212 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd"> - -<glade-interface> - -<widget class="GtkDialog" id="dialog-duplicate-contact"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="title" translatable="yes">Duplicate Contact Detected</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="window_position">GTK_WIN_POS_NONE</property> - <property name="modal">False</property> - <property name="resizable">True</property> - <property name="destroy_with_parent">False</property> - <property name="has_separator">True</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox1"> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">6</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - - <child> - <widget class="GtkButton" id="button4"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">1</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="button3"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-add</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="response_id">0</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkTable" id="table1"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="n_rows">5</property> - <property name="n_columns">2</property> - <property name="homogeneous">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">6</property> - - <child> - <widget class="Custom" id="custom-old-contact"> - <property name="visible">True</property> - <property name="creation_function">_eab_contact_merging_create_contact_display</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Sun, 05 Oct 2003 03:55:10 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="label" translatable="yes">The name or email address of this contact already exists -in this folder. Would you like to add it anyway?</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label3"> - <property name="visible">True</property> - <property name="label" translatable="yes">Original Contact:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label4"> - <property name="visible">True</property> - <property name="label" translatable="yes">New Contact:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="Custom" id="custom-new-contact"> - <property name="visible">True</property> - <property name="creation_function">_eab_contact_merging_create_contact_display</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Sun, 05 Oct 2003 03:54:50 GMT</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - </packing> - </child> - - <child> - <widget class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="xalign">0.5</property> - <property name="yalign">0</property> - <property name="xscale">1</property> - <property name="yscale">0</property> - - <child> - <widget class="Custom" id="custom2"> - <property name="visible">True</property> - <property name="creation_function">e_create_image_widget</property> - <property name="string1">stock_person</property> - <property name="int1">0</property> - <property name="int2">0</property> - <property name="last_modification_time">Fri, 08 Jun 2001 00:18:39 GMT</property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">5</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - </widget> - </child> -</widget> - -</glade-interface> diff --git a/addressbook/gui/merging/eab-contact-merging.c b/addressbook/gui/merging/eab-contact-merging.c deleted file mode 100644 index 685739ed89..0000000000 --- a/addressbook/gui/merging/eab-contact-merging.c +++ /dev/null @@ -1,240 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Code for checking for duplicates when doing EContact work. - * - * Authors: - * Christopher James Lahey <clahey@ximian.com> - * Chris Toshok <toshok@ximian.com> - * - * Copyright (C) 2001, 2002, 2003, Ximian, Inc. - */ - -#include <config.h> - -#include "eab-contact-merging.h" -#include "eab-contact-compare.h" -#include <glade/glade.h> -#include <gtk/gtksignal.h> -#include "addressbook/gui/widgets/eab-contact-display.h" - -typedef enum { - E_CONTACT_MERGING_ADD, - E_CONTACT_MERGING_COMMIT -} EContactMergingOpType; - -typedef struct { - EContactMergingOpType op; - EBook *book; - EContact *contact; - GList *avoid; - EBookIdCallback id_cb; - EBookCallback cb; - gpointer closure; -} EContactMergingLookup; - -static void match_query_callback (EContact *contact, EContact *match, EABContactMatchType type, gpointer closure); - -#define SIMULTANEOUS_MERGING_REQUESTS 20 - -static GList *merging_queue = NULL; -static int running_merge_requests = 0; - - -static void -add_lookup (EContactMergingLookup *lookup) -{ - if (running_merge_requests < SIMULTANEOUS_MERGING_REQUESTS) { - running_merge_requests++; - eab_contact_locate_match_full (lookup->book, lookup->contact, lookup->avoid, match_query_callback, lookup); - } - else { - merging_queue = g_list_append (merging_queue, lookup); - } -} - -static void -finished_lookup (void) -{ - running_merge_requests--; - - while (running_merge_requests < SIMULTANEOUS_MERGING_REQUESTS) { - EContactMergingLookup *lookup; - - if (!merging_queue) - break; - - lookup = merging_queue->data; - - merging_queue = g_list_remove_link (merging_queue, merging_queue); - - running_merge_requests++; - eab_contact_locate_match_full (lookup->book, lookup->contact, lookup->avoid, match_query_callback, lookup); - } -} - -static void -free_lookup (EContactMergingLookup *lookup) -{ - g_object_unref (lookup->book); - g_object_unref (lookup->contact); - g_list_free (lookup->avoid); - - g_free (lookup); -} - -static void -final_id_cb (EBook *book, EBookStatus status, const char *id, gpointer closure) -{ - EContactMergingLookup *lookup = closure; - - if (lookup->id_cb) - lookup->id_cb (lookup->book, status, id, lookup->closure); - - free_lookup (lookup); - - finished_lookup (); -} - -static void -final_cb (EBook *book, EBookStatus status, gpointer closure) -{ - EContactMergingLookup *lookup = closure; - - if (lookup->cb) - lookup->cb (lookup->book, status, lookup->closure); - - free_lookup (lookup); - - finished_lookup (); -} - -static void -doit (EContactMergingLookup *lookup) -{ - if (lookup->op == E_CONTACT_MERGING_ADD) - e_book_async_add_contact (lookup->book, lookup->contact, final_id_cb, lookup); - else if (lookup->op == E_CONTACT_MERGING_COMMIT) - e_book_async_commit_contact (lookup->book, lookup->contact, final_cb, lookup); -} - -static void -cancelit (EContactMergingLookup *lookup) -{ - if (lookup->op == E_CONTACT_MERGING_ADD) { - if (lookup->id_cb) - final_id_cb (lookup->book, E_BOOK_ERROR_CANCELLED, NULL, lookup); - } else if (lookup->op == E_CONTACT_MERGING_COMMIT) { - if (lookup->cb) - final_cb (lookup->book, E_BOOK_ERROR_CANCELLED, lookup); - } -} - -static void -response (GtkWidget *dialog, int response, EContactMergingLookup *lookup) -{ - gtk_widget_destroy (dialog); - - switch (response) { - case 0: - doit (lookup); - break; - case 1: - cancelit (lookup); - break; - } -} - -static void -match_query_callback (EContact *contact, EContact *match, EABContactMatchType type, gpointer closure) -{ - EContactMergingLookup *lookup = closure; - - if ((gint) type <= (gint) EAB_CONTACT_MATCH_VAGUE) { - doit (lookup); - } else { - GladeXML *ui; - - GtkWidget *widget; - - if (lookup->op == E_CONTACT_MERGING_ADD) - ui = glade_xml_new (EVOLUTION_GLADEDIR "/eab-contact-duplicate-detected.glade", NULL, NULL); - else if (lookup->op == E_CONTACT_MERGING_COMMIT) - ui = glade_xml_new (EVOLUTION_GLADEDIR "/eab-contact-commit-duplicate-detected.glade", NULL, NULL); - else { - doit (lookup); - return; - } - - widget = glade_xml_get_widget (ui, "custom-old-contact"); - eab_contact_display_render (EAB_CONTACT_DISPLAY (widget), - match, EAB_CONTACT_DISPLAY_RENDER_COMPACT); - - widget = glade_xml_get_widget (ui, "custom-new-contact"); - eab_contact_display_render (EAB_CONTACT_DISPLAY (widget), - contact, EAB_CONTACT_DISPLAY_RENDER_COMPACT); - - widget = glade_xml_get_widget (ui, "dialog-duplicate-contact"); - - g_signal_connect (widget, "response", - G_CALLBACK (response), lookup); - - gtk_widget_show_all (widget); - } -} - -gboolean -eab_merging_book_add_contact (EBook *book, - EContact *contact, - EBookIdCallback cb, - gpointer closure) -{ - EContactMergingLookup *lookup; - - lookup = g_new (EContactMergingLookup, 1); - - lookup->op = E_CONTACT_MERGING_ADD; - lookup->book = g_object_ref (book); - lookup->contact = g_object_ref (contact); - lookup->id_cb = cb; - lookup->closure = closure; - lookup->avoid = NULL; - - add_lookup (lookup); - - return TRUE; -} - -gboolean -eab_merging_book_commit_contact (EBook *book, - EContact *contact, - EBookCallback cb, - gpointer closure) -{ - EContactMergingLookup *lookup; - - lookup = g_new (EContactMergingLookup, 1); - - lookup->op = E_CONTACT_MERGING_COMMIT; - lookup->book = g_object_ref (book); - lookup->contact = g_object_ref (contact); - lookup->cb = cb; - lookup->closure = closure; - lookup->avoid = g_list_append (NULL, contact); - - add_lookup (lookup); - - return TRUE; -} - -GtkWidget * -_eab_contact_merging_create_contact_display(gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2); - -GtkWidget * -_eab_contact_merging_create_contact_display(gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2) -{ - return eab_contact_display_new(); -} diff --git a/addressbook/gui/merging/eab-contact-merging.h b/addressbook/gui/merging/eab-contact-merging.h deleted file mode 100644 index 80a7717ce8..0000000000 --- a/addressbook/gui/merging/eab-contact-merging.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * The Evolution addressbook client object. - * - * Authors: - * Christopher James Lahey <clahey@ximian.com> - * Chris Toshok <toshok@ximian.com> - * - * Copyright (C) 2001, 2002, 2003 Ximian, Inc. - */ - -#ifndef __E_CONTACT_MERGING_H__ -#define __E_CONTACT_MERGING_H__ - -#include <libebook/e-book.h> - -G_BEGIN_DECLS - -gboolean eab_merging_book_add_contact (EBook *book, - EContact *contact, - EBookIdCallback cb, - gpointer closure); -gboolean eab_merging_book_commit_contact (EBook *book, - EContact *contact, - EBookCallback cb, - gpointer closure); - -G_END_DECLS - -#endif /* ! __EAB_CONTACT_MERGING_H__ */ diff --git a/addressbook/gui/search/.cvsignore b/addressbook/gui/search/.cvsignore deleted file mode 100644 index d6c55c7345..0000000000 --- a/addressbook/gui/search/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -.deps -.libs -.pure -Makefile -Makefile.in -*.lo -*.la diff --git a/addressbook/gui/search/Makefile.am b/addressbook/gui/search/Makefile.am deleted file mode 100644 index 391039d81f..0000000000 --- a/addressbook/gui/search/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -ruledir = $(privdatadir) -rule_DATA = addresstypes.xml - -EXTRA_DIST = addresstypes.xml - -INCLUDES = \ - -DG_LOG_DOMAIN=\"e-addressbook-search\" \ - -I$(top_srcdir) \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_builddir)/addressbook/backend \ - -I$(top_srcdir)/addressbook/contact-editor \ - -I$(top_srcdir)/widgets/e-text \ - -I$(top_srcdir)/widgets/misc \ - -I$(top_builddir)/shell \ - -DSEARCH_RULE_DIR=\"$(ruledir)\" \ - $(EVOLUTION_ADDRESSBOOK_CFLAGS) - -noinst_LTLIBRARIES = \ - libeaddressbooksearch.la - -libeaddressbooksearch_la_SOURCES = \ - e-addressbook-search-dialog.c \ - e-addressbook-search-dialog.h diff --git a/addressbook/gui/search/addresstypes.xml b/addressbook/gui/search/addresstypes.xml deleted file mode 100644 index 4adbfd694b..0000000000 --- a/addressbook/gui/search/addresstypes.xml +++ /dev/null @@ -1,83 +0,0 @@ -<?xml version="1.0"?> -<filterdescription> -<partset> - <part name="name"> - <title>Name</title> - <input type="optionlist" name="name-type"> - <option value="contains"> - <title>contains</title> - <code>(contains "full_name" ${name})</code> - </option> - <option value="not contains"> - <title>does not contain</title> - <code>(not (contains "full_name" ${name}))</code> - </option> - <option value="is"> - <title>is</title> - <code>(is "full_name" ${name})))</code> - </option> - <option value="is not"> - <title>is not</title> - <code>(not (is "full_name" ${name}))</code> - </option> - <option value="begin"> - <title>begins with</title> - <code>(beginswith "full_name" ${name})</code> - </option> - <option value="end"> - <title>ends in</title> - <code>(endswith "full_name" ${name})</code> - </option> - </input> - <input type="string" name="name"/> - </part> - <part name="email"> - <title>Email</title> - <input type="optionlist" name="email-type"> - <option value="contains"> - <title>contains</title> - <code>(contains "email" ${email})</code> - </option> - <option value="not contains"> - <title>does not contain</title> - <code>(not (contains "email" ${email}))</code> - </option> - <option value="is"> - <title>is</title> - <code>(is "email" ${email})</code> - </option> - <option value="is not"> - <title>is not</title> - <code>(not (is "email" ${email}))</code> - </option> - </input> - <input type="address" name="email"/> - </part> - <part name="category"> - <title>Category</title> - <input type="optionlist" name="category-type"> - <option value="contains"> - <title>contains</title> - <code>(contains "category_list" ${category})</code> - </option> - <option value="not contains"> - <title>does not contain</title> - <code>(not (contains "category_list" ${category}))</code> - </option> - <option value="is"> - <title>is</title> - <code>(is "category_list" ${category})</code> - </option> - <option value="is not"> - <title>is not</title> - <code>(not (is "category_list" ${category}))</code> - </option> - </input> - <input type="string" name="category"/> - </part> - <part name="sexp"> - <title>Expression</title> - <input type="code" name="code"/> - </part> -</partset> -</filterdescription> diff --git a/addressbook/gui/search/e-addressbook-search-dialog.c b/addressbook/gui/search/e-addressbook-search-dialog.c deleted file mode 100644 index 857c7a666c..0000000000 --- a/addressbook/gui/search/e-addressbook-search-dialog.c +++ /dev/null @@ -1,200 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-addressbook-search-dialog.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> - -#include <gtk/gtkbox.h> -#include <gtk/gtkentry.h> -#include <gtk/gtkstock.h> -#include <libgnome/gnome-i18n.h> -#include "gal/util/e-util.h" - -#include "e-addressbook-search-dialog.h" - - -static void eab_search_dialog_init (EABSearchDialog *widget); -static void eab_search_dialog_class_init (EABSearchDialogClass *klass); -static void eab_search_dialog_dispose (GObject *object); - -static GtkDialog *parent_class = NULL; - -#define PARENT_TYPE GTK_TYPE_DIALOG - -E_MAKE_TYPE (eab_search_dialog, - "EABSearchDialog", - EABSearchDialog, - eab_search_dialog_class_init, - eab_search_dialog_init, - PARENT_TYPE) - -enum -{ - PROP_VIEW = 1 -}; - -static GtkWidget * -get_widget (EABSearchDialog *view) -{ - RuleContext *context; - FilterRule *rule; - - context = eab_view_peek_search_context (view->view); - rule = eab_view_peek_search_rule (view->view); - - if (!context || !rule) { - g_warning ("Could not get search context."); - return gtk_entry_new (); - } - - return filter_rule_get_widget (rule, context); -} - -static void -eab_search_dialog_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) -{ - EABSearchDialog *search_dialog; - - search_dialog = EAB_SEARCH_DIALOG (object); - - switch (property_id) { - case PROP_VIEW: - search_dialog->view = g_value_get_object (value); - search_dialog->search = get_widget (search_dialog); - gtk_container_set_border_width (GTK_CONTAINER (search_dialog->search), 12); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (search_dialog)->vbox), - search_dialog->search, TRUE, TRUE, 0); - gtk_widget_show (search_dialog->search); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -eab_search_dialog_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) -{ - EABSearchDialog *search_dialog; - - search_dialog = EAB_SEARCH_DIALOG (object); - - switch (property_id) { - case PROP_VIEW: - g_value_set_object (value, search_dialog->view); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -eab_search_dialog_class_init (EABSearchDialogClass *klass) -{ - GObjectClass *object_class; - - object_class = (GObjectClass*) klass; - - parent_class = g_type_class_ref (PARENT_TYPE); - - object_class->set_property = eab_search_dialog_set_property; - object_class->get_property = eab_search_dialog_get_property; - object_class->dispose = eab_search_dialog_dispose; - - g_object_class_install_property (object_class, PROP_VIEW, - g_param_spec_object ("view", NULL, NULL, E_TYPE_AB_VIEW, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); -} - -static char * -get_query (EABSearchDialog *view) -{ - FilterRule *rule; - GString *out = g_string_new(""); - char *ret; - - rule = eab_view_peek_search_rule (view->view); - - filter_rule_build_code(rule, out); - ret = out->str; - printf("Searching using %s\n", ret); - g_string_free(out, FALSE); - return ret; -} - -static void -dialog_response (GtkWidget *widget, int response_id, EABSearchDialog *dialog) -{ - char *query; - - if (response_id == GTK_RESPONSE_OK) { - query = get_query(dialog); - g_object_set(dialog->view, - "query", query, - NULL); - g_free(query); - } - - gtk_widget_destroy(GTK_WIDGET (dialog)); -} - -static void -eab_search_dialog_init (EABSearchDialog *view) -{ - GtkDialog *dialog = GTK_DIALOG (view); - - gtk_widget_realize (GTK_WIDGET (dialog)); - gtk_dialog_set_has_separator (dialog, FALSE); - gtk_container_set_border_width (GTK_CONTAINER (dialog->vbox), 0); - gtk_container_set_border_width (GTK_CONTAINER (dialog->action_area), 12); - - gtk_window_set_default_size (GTK_WINDOW (view), 550, 400); - gtk_window_set_title(GTK_WINDOW(view), _("Advanced Search")); - - gtk_dialog_add_buttons (dialog, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - /*GTK_STOCK_SAVE, GTK_RESPONSE_APPLY,*/ - GTK_STOCK_OK, GTK_RESPONSE_OK, - NULL); - - gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK); - - g_signal_connect(dialog, "response", - G_CALLBACK(dialog_response), view); -} - -GtkWidget * -eab_search_dialog_new (EABView *addr_view) -{ - EABSearchDialog *view = g_object_new (EAB_SEARCH_DIALOG_TYPE, "view", addr_view, NULL); - - return GTK_WIDGET(view); -} - -static void -eab_search_dialog_dispose (GObject *object) -{ - EABSearchDialog *view; - - view = EAB_SEARCH_DIALOG (object); - - G_OBJECT_CLASS(parent_class)->dispose (object); -} diff --git a/addressbook/gui/search/e-addressbook-search-dialog.h b/addressbook/gui/search/e-addressbook-search-dialog.h deleted file mode 100644 index 1321409f94..0000000000 --- a/addressbook/gui/search/e-addressbook-search-dialog.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-minicard-view-widget.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __EAB_SEARCH_DIALOG_H__ -#define __EAB_SEARCH_DIALOG_H__ - -#include <libebook/e-book.h> - -#include "addressbook/gui/widgets/e-addressbook-view.h" -#include "filter/rule-context.h" -#include "filter/filter-rule.h" -#include <gtk/gtkdialog.h> - -G_BEGIN_DECLS - -#define EAB_SEARCH_DIALOG_TYPE (eab_search_dialog_get_type ()) -#define EAB_SEARCH_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EAB_SEARCH_DIALOG_TYPE, EABSearchDialog)) -#define EAB_SEARCH_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EAB_SEARCH_DIALOG_TYPE, EABSearchDialogClass)) -#define E_IS_ADDRESSBOOK_SEARCH_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EAB_SEARCH_DIALOG_TYPE)) -#define E_IS_ADDRESSBOOK_SEARCH_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), EAB_SEARCH_DIALOG_TYPE)) - - -typedef struct _EABSearchDialog EABSearchDialog; -typedef struct _EABSearchDialogClass EABSearchDialogClass; - -struct _EABSearchDialog -{ - GtkDialog parent; - - GtkWidget *search; - EABView *view; -}; - -struct _EABSearchDialogClass -{ - GtkDialogClass parent_class; -}; - -GType eab_search_dialog_get_type (void); - -GtkWidget *eab_search_dialog_new (EABView *view); - -G_END_DECLS - -#endif /* __EAB_SEARCH_DIALOG_H__ */ diff --git a/addressbook/gui/widgets/.cvsignore b/addressbook/gui/widgets/.cvsignore deleted file mode 100644 index b67f65e6c3..0000000000 --- a/addressbook/gui/widgets/.cvsignore +++ /dev/null @@ -1,19 +0,0 @@ -.deps -.libs -.pure -Makefile -Makefile.in -*.lo -*.la -minicard-label-test -minicard-test -minicard-view-test -minicard-widget-test -reflow-test -eab-marshal.c -eab-marshal.h -Evolution-Composer-stubs.c -Evolution-Composer-skels.c -Evolution-Composer-common.c -Evolution-Composer.h - diff --git a/addressbook/gui/widgets/Makefile.am b/addressbook/gui/widgets/Makefile.am deleted file mode 100644 index b54045a5c8..0000000000 --- a/addressbook/gui/widgets/Makefile.am +++ /dev/null @@ -1,96 +0,0 @@ -ruledir = $(privdatadir) - -INCLUDES = \ - -DG_LOG_DOMAIN=\"eab-widgets\" \ - -DEVOLUTION_ETSPECDIR=\""$(etspecdir)"\" \ - -DEVOLUTION_IMAGESDIR=\""$(imagesdir)"\" \ - -DEVOLUTION_GALVIEWSDIR=\""$(viewsdir)"\" \ - -I$(top_srcdir) \ - -I$(top_srcdir)/addressbook \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_builddir)/addressbook/backend \ - -I$(top_srcdir)/addressbook/gui/contact-editor \ - -I$(top_srcdir)/addressbook/gui/merging \ - -I$(top_srcdir)/addressbook/gui/component \ - -I$(top_srcdir)/widgets/misc \ - -I$(top_builddir)/shell \ - -DSEARCH_RULE_DIR=\"$(ruledir)\" \ - $(EVOLUTION_ADDRESSBOOK_CFLAGS) - -CORBA_COMPOSER_SOURCE_H = \ - Evolution-Composer.h -CORBA_COMPOSER_SOURCE_C = \ - Evolution-Composer-common.c \ - Evolution-Composer-skels.c \ - Evolution-Composer-stubs.c -CORBA_COMPOSER_IDL = $(srcdir)/../../../composer/Evolution-Composer.idl - -$(CORBA_COMPOSER_SOURCE_H): $(CORBA_COMPOSER_IDL) - $(ORBIT_IDL) -I $(srcdir) $(IDL_INCLUDES) $(CORBA_COMPOSER_IDL) - -$(CORBA_COMPOSER_SOURCE_C): $(CORBA_COMPOSER_SOURCE_H) - -CORBA_SOURCE_H = $(CORBA_COMPOSER_SOURCE_H) -CORBA_SOURCE_C = $(CORBA_COMPOSER_SOURCE_C) -CORBA_SOURCE = $(CORBA_SOURCE_H) $(CORBA_SOURCE_C) - -noinst_LTLIBRARIES = \ - libeabwidgets.la - -libeabwidgets_la_SOURCES = \ - $(CORBA_SOURCE) \ - $(MARSHAL_GENERATED) \ - eab-contact-display.c \ - eab-contact-display.h \ - eab-gui-util.c \ - eab-gui-util.h \ - eab-menu.c \ - eab-menu.h \ - eab-popup.c \ - eab-popup.h \ - eab-popup-control.c \ - eab-popup-control.h \ - eab-vcard-control.c \ - eab-vcard-control.h \ - e-minicard.c \ - e-minicard.h \ - e-minicard-label.c \ - e-minicard-label.h \ - e-minicard-view.c \ - e-minicard-view.h \ - e-minicard-view-widget.c \ - e-minicard-view-widget.h \ - e-addressbook-reflow-adapter.c \ - e-addressbook-reflow-adapter.h \ - e-addressbook-table-adapter.c \ - e-addressbook-table-adapter.h \ - e-addressbook-model.c \ - e-addressbook-model.h \ - e-addressbook-view.c \ - e-addressbook-view.h \ - gal-view-minicard.c \ - gal-view-minicard.h \ - gal-view-factory-minicard.c \ - gal-view-factory-minicard.h - -#TREEVIEW_SOURCES= e-addressbook-treeview-adapter.c \ -# e-addressbook-treeview-adapter.h \ -# gal-view-factory-treeview.c \ -# gal-view-factory-treeview.h \ -# gal-view-treeview.c \ -# gal-view-treeview.h - -MARSHAL_GENERATED = eab-marshal.c eab-marshal.h -@EVO_MARSHAL_RULE@ - -BUILT_SOURCES = $(CORBA_SOURCE) $(MARSHAL_GENERATED) -CLEANFILES = $(BUILT_SOURCES) - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) - -etspec_DATA= e-addressbook-view.etspec - -EXTRA_DIST = \ - $(etspec_DATA) \ - eab-marshal.list diff --git a/addressbook/gui/widgets/e-addressbook-model.c b/addressbook/gui/widgets/e-addressbook-model.c deleted file mode 100644 index e6f4ecb868..0000000000 --- a/addressbook/gui/widgets/e-addressbook-model.c +++ /dev/null @@ -1,720 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * - * Author: - * Christopher James Lahey <clahey@ximian.com> - * - * (C) 1999 Ximian, Inc. - */ - -#include <config.h> -#include "eab-marshal.h" -#include "e-addressbook-model.h" -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/xmlmemory.h> -#include <gnome.h> -#include <gal/widgets/e-gui-utils.h> -#include "eab-gui-util.h" - -#define PARENT_TYPE G_TYPE_OBJECT -static GObjectClass *parent_class; - -/* - * EABModel callbacks - * These are the callbacks that define the behavior of our custom model. - */ -static void eab_model_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void eab_model_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); - - -enum { - PROP_0, - PROP_BOOK, - PROP_QUERY, - PROP_EDITABLE, -}; - -enum { - WRITABLE_STATUS, - STATUS_MESSAGE, - SEARCH_STARTED, - SEARCH_RESULT, - FOLDER_BAR_MESSAGE, - CONTACT_ADDED, - CONTACT_REMOVED, - CONTACT_CHANGED, - MODEL_CHANGED, - STOP_STATE_CHANGED, - BACKEND_DIED, - LAST_SIGNAL -}; - -static guint eab_model_signals [LAST_SIGNAL] = {0, }; - -static void -free_data (EABModel *model) -{ - if (model->data) { - int i; - - for ( i = 0; i < model->data_count; i++ ) { - g_object_unref (model->data[i]); - } - - g_free(model->data); - model->data = NULL; - model->data_count = 0; - model->allocated_count = 0; - } -} - -static void -remove_book_view(EABModel *model) -{ - if (model->book_view && model->create_contact_id) - g_signal_handler_disconnect (model->book_view, - model->create_contact_id); - if (model->book_view && model->remove_contact_id) - g_signal_handler_disconnect (model->book_view, - model->remove_contact_id); - if (model->book_view && model->modify_contact_id) - g_signal_handler_disconnect (model->book_view, - model->modify_contact_id); - if (model->book_view && model->status_message_id) - g_signal_handler_disconnect (model->book_view, - model->status_message_id); - if (model->book_view && model->sequence_complete_id) - g_signal_handler_disconnect (model->book_view, - model->sequence_complete_id); - - model->create_contact_id = 0; - model->remove_contact_id = 0; - model->modify_contact_id = 0; - model->status_message_id = 0; - model->sequence_complete_id = 0; - - model->search_in_progress = FALSE; - - if (model->book_view) { - e_book_view_stop (model->book_view); - g_object_unref (model->book_view); - model->book_view = NULL; - } -} - -static void -addressbook_dispose(GObject *object) -{ - EABModel *model = EAB_MODEL(object); - - remove_book_view(model); - free_data (model); - - if (model->book) { - if (model->writable_status_id) - g_signal_handler_disconnect (model->book, - model->writable_status_id); - model->writable_status_id = 0; - - if (model->backend_died_id) - g_signal_handler_disconnect (model->book, - model->backend_died_id); - model->backend_died_id = 0; - - g_object_unref (model->book); - model->book = NULL; - } - - if (model->query) { - e_book_query_unref (model->query); - model->query = NULL; - } - - if (G_OBJECT_CLASS(parent_class)->dispose) - G_OBJECT_CLASS(parent_class)->dispose(object); -} - -static void -update_folder_bar_message (EABModel *model) -{ - int count; - char *message; - - count = model->data_count; - - switch (count) { - case 0: - message = g_strdup (_("No contacts")); - break; - default: - message = g_strdup_printf (ngettext("%d contact", "%d contacts", count), count); - break; - } - - g_signal_emit (model, - eab_model_signals [FOLDER_BAR_MESSAGE], 0, - message); - - g_free (message); -} - -static void -create_contact(EBookView *book_view, - const GList *contacts, - EABModel *model) -{ - int old_count = model->data_count; - int length = g_list_length ((GList *)contacts); - - if (model->data_count + length > model->allocated_count) { - while (model->data_count + length > model->allocated_count) - model->allocated_count = model->allocated_count * 2 + 1; - model->data = g_renew(EContact *, model->data, model->allocated_count); - } - - for ( ; contacts; contacts = contacts->next) { - model->data[model->data_count++] = contacts->data; - g_object_ref (contacts->data); - } - - g_signal_emit (model, - eab_model_signals [CONTACT_ADDED], 0, - old_count, model->data_count - old_count); - - update_folder_bar_message (model); -} - -static void -remove_contact(EBookView *book_view, - GList *ids, - EABModel *model) -{ - /* XXX we should keep a hash around instead of this O(n*m) loop */ - int i = 0; - GList *l; - - for (l = ids; l; l = l->next) { - char *id = l->data; - for ( i = 0; i < model->data_count; i++) { - if ( !strcmp(e_contact_get_const (model->data[i], E_CONTACT_UID), id) ) { - g_object_unref (model->data[i]); - memmove(model->data + i, model->data + i + 1, (model->data_count - i - 1) * sizeof (EContact *)); - model->data_count--; - - g_signal_emit (model, - eab_model_signals [CONTACT_REMOVED], 0, - i); - - break; - } - } - } - - update_folder_bar_message (model); -} - -static void -modify_contact(EBookView *book_view, - const GList *contacts, - EABModel *model) -{ - for ( ; contacts; contacts = contacts->next) { - int i; - for ( i = 0; i < model->data_count; i++) { - if ( !strcmp(e_contact_get_const(model->data[i], E_CONTACT_UID), - e_contact_get_const(E_CONTACT(contacts->data), E_CONTACT_UID)) ) { - g_object_unref (model->data[i]); - model->data[i] = e_contact_duplicate(E_CONTACT(contacts->data)); - g_signal_emit (model, - eab_model_signals [CONTACT_CHANGED], 0, - i); - break; - } - } - } -} - -static void -status_message (EBookView *book_view, - char* status, - EABModel *model) -{ - g_signal_emit (model, - eab_model_signals [STATUS_MESSAGE], 0, - status); -} - -static void -sequence_complete (EBookView *book_view, - EBookViewStatus status, - EABModel *model) -{ - model->search_in_progress = FALSE; - status_message (book_view, NULL, model); - g_signal_emit (model, - eab_model_signals [SEARCH_RESULT], 0, - status); - g_signal_emit (model, - eab_model_signals [STOP_STATE_CHANGED], 0); -} - -static void -writable_status (EBook *book, - gboolean writable, - EABModel *model) -{ - if (!model->editable_set) { - model->editable = writable; - - g_signal_emit (model, - eab_model_signals [WRITABLE_STATUS], 0, - writable); - } -} - -static void -backend_died (EBook *book, - EABModel *model) -{ - g_signal_emit (model, - eab_model_signals [BACKEND_DIED], 0); -} - -static void -eab_model_class_init (GObjectClass *object_class) -{ - parent_class = g_type_class_ref (PARENT_TYPE); - - object_class->dispose = addressbook_dispose; - object_class->set_property = eab_model_set_property; - object_class->get_property = eab_model_get_property; - - g_object_class_install_property (object_class, PROP_BOOK, - g_param_spec_object ("book", - _("Book"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_BOOK, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_QUERY, - g_param_spec_string ("query", - _("Query"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EDITABLE, - g_param_spec_boolean ("editable", - _("Editable"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - eab_model_signals [WRITABLE_STATUS] = - g_signal_new ("writable_status", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABModelClass, writable_status), - NULL, NULL, - eab_marshal_NONE__BOOL, - G_TYPE_NONE, - 1, G_TYPE_BOOLEAN); - - eab_model_signals [STATUS_MESSAGE] = - g_signal_new ("status_message", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABModelClass, status_message), - NULL, NULL, - eab_marshal_NONE__POINTER, - G_TYPE_NONE, - 1, G_TYPE_POINTER); - - eab_model_signals [SEARCH_STARTED] = - g_signal_new ("search_started", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABModelClass, search_started), - NULL, NULL, - eab_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - eab_model_signals [SEARCH_RESULT] = - g_signal_new ("search_result", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABModelClass, search_result), - NULL, NULL, - eab_marshal_NONE__INT, - G_TYPE_NONE, 1, G_TYPE_INT); - - eab_model_signals [FOLDER_BAR_MESSAGE] = - g_signal_new ("folder_bar_message", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABModelClass, folder_bar_message), - NULL, NULL, - eab_marshal_NONE__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - - eab_model_signals [CONTACT_ADDED] = - g_signal_new ("contact_added", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABModelClass, contact_added), - NULL, NULL, - eab_marshal_NONE__INT_INT, - G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); - - eab_model_signals [CONTACT_REMOVED] = - g_signal_new ("contact_removed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABModelClass, contact_removed), - NULL, NULL, - eab_marshal_NONE__INT, - G_TYPE_NONE, 1, G_TYPE_INT); - - eab_model_signals [CONTACT_CHANGED] = - g_signal_new ("contact_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABModelClass, contact_changed), - NULL, NULL, - eab_marshal_NONE__INT, - G_TYPE_NONE, 1, G_TYPE_INT); - - eab_model_signals [MODEL_CHANGED] = - g_signal_new ("model_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABModelClass, model_changed), - NULL, NULL, - eab_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - eab_model_signals [STOP_STATE_CHANGED] = - g_signal_new ("stop_state_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABModelClass, stop_state_changed), - NULL, NULL, - eab_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - eab_model_signals [BACKEND_DIED] = - g_signal_new ("backend_died", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABModelClass, backend_died), - NULL, NULL, - eab_marshal_NONE__NONE, - G_TYPE_NONE, 0); -} - -static void -eab_model_init (GObject *object) -{ - EABModel *model = EAB_MODEL(object); - model->book = NULL; - model->query = e_book_query_any_field_contains (""); - model->book_view = NULL; - model->create_contact_id = 0; - model->remove_contact_id = 0; - model->modify_contact_id = 0; - model->status_message_id = 0; - model->writable_status_id = 0; - model->backend_died_id = 0; - model->sequence_complete_id = 0; - model->data = NULL; - model->data_count = 0; - model->allocated_count = 0; - model->search_in_progress = FALSE; - model->editable = FALSE; - model->editable_set = FALSE; - model->first_get_view = TRUE; -} - -static void -book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, gpointer closure) -{ - EABModel *model = closure; - - if (status != E_BOOK_ERROR_OK) { - eab_error_dialog (_("Error getting book view"), status); - return; - } - - remove_book_view (model); - free_data (model); - - model->book_view = book_view; - if (model->book_view) - g_object_ref (model->book_view); - model->create_contact_id = g_signal_connect(model->book_view, - "contacts_added", - G_CALLBACK (create_contact), - model); - model->remove_contact_id = g_signal_connect(model->book_view, - "contacts_removed", - G_CALLBACK (remove_contact), - model); - model->modify_contact_id = g_signal_connect(model->book_view, - "contacts_changed", - G_CALLBACK(modify_contact), - model); - model->status_message_id = g_signal_connect(model->book_view, - "status_message", - G_CALLBACK(status_message), - model); - model->sequence_complete_id = g_signal_connect(model->book_view, - "sequence_complete", - G_CALLBACK(sequence_complete), - model); - - model->search_in_progress = TRUE; - g_signal_emit (model, - eab_model_signals [MODEL_CHANGED], 0); - g_signal_emit (model, - eab_model_signals [SEARCH_STARTED], 0); - g_signal_emit (model, - eab_model_signals [STOP_STATE_CHANGED], 0); - - e_book_view_start (model->book_view); -} - -static void -get_view (EABModel *model) -{ - gboolean success; - - if (model->book && model->query) { - ESource *source; - const char *limit_str; - int limit = -1; - - source = e_book_get_source (model->book); - - limit_str = e_source_get_property (source, "limit"); - if (limit_str && *limit_str) - limit = atoi (limit_str); - - remove_book_view(model); - - if (model->first_get_view) { - model->first_get_view = FALSE; - - if (e_book_check_static_capability (model->book, "do-initial-query")) { - success = e_book_async_get_book_view (model->book, model->query, NULL, limit, book_view_loaded, model); - } else { - free_data (model); - - g_signal_emit (model, - eab_model_signals [MODEL_CHANGED], 0); - g_signal_emit (model, - eab_model_signals [STOP_STATE_CHANGED], 0); - return; - } - } - else - success = e_book_async_get_book_view (model->book, model->query, NULL, limit, book_view_loaded, model); - - } -} - -static gboolean -get_view_idle (EABModel *model) -{ - model->book_view_idle_id = 0; - get_view (model); - g_object_unref (model); - return FALSE; -} - - -EContact * -eab_model_get_contact(EABModel *model, - int row) -{ - if (model->data && 0 <= row && row < model->data_count) { - return e_contact_duplicate (model->data[row]); - } - return NULL; -} - -static void -eab_model_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) -{ - EABModel *model; - gboolean need_get_book_view = FALSE; - - model = EAB_MODEL (object); - - switch (prop_id){ - case PROP_BOOK: - if (model->book) { - if (model->writable_status_id) - g_signal_handler_disconnect (model->book, - model->writable_status_id); - model->writable_status_id = 0; - - if (model->backend_died_id) - g_signal_handler_disconnect (model->book, - model->backend_died_id); - model->backend_died_id = 0; - - g_object_unref (model->book); - } - model->book = E_BOOK(g_value_get_object (value)); - if (model->book) { - model->writable_status_id = - g_signal_connect (model->book, - "writable_status", - G_CALLBACK (writable_status), model); - model->backend_died_id = - g_signal_connect (model->book, - "backend_died", - G_CALLBACK (backend_died), model); - - if (!model->editable_set) { - model->editable = e_book_is_writable (model->book); - - g_signal_emit (model, - eab_model_signals [WRITABLE_STATUS], 0, - model->editable); - } - - model->first_get_view = TRUE; - g_object_ref (model->book); - need_get_book_view = TRUE; - } - break; - case PROP_QUERY: - if (model->query) - e_book_query_unref (model->query); - model->query = e_book_query_from_string (g_value_get_string (value)); - need_get_book_view = TRUE; - break; - case PROP_EDITABLE: - model->editable = g_value_get_boolean (value); - model->editable_set = TRUE; - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } - - if (need_get_book_view) { - if (!model->book_view_idle_id) { - g_object_ref (model); - model->book_view_idle_id = g_idle_add ((GSourceFunc)get_view_idle, model); - } - } - -} - -static void -eab_model_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) -{ - EABModel *eab_model; - - eab_model = EAB_MODEL (object); - - switch (prop_id) { - case PROP_BOOK: - g_value_set_object (value, eab_model->book); - break; - case PROP_QUERY: { - char *query_string = e_book_query_to_string (eab_model->query); - g_value_set_string (value, query_string); - break; - } - case PROP_EDITABLE: - g_value_set_boolean (value, eab_model->editable); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -GType -eab_model_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (EABModelClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) eab_model_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EABModel), - 0, /* n_preallocs */ - (GInstanceInitFunc) eab_model_init, - }; - - type = g_type_register_static (PARENT_TYPE, "EABModel", &info, 0); - } - - return type; -} - -EABModel* -eab_model_new (void) -{ - EABModel *et; - - et = g_object_new (EAB_TYPE_MODEL, NULL); - - return et; -} - -void eab_model_stop (EABModel *model) -{ - remove_book_view(model); - g_signal_emit (model, - eab_model_signals [STOP_STATE_CHANGED], 0); - g_signal_emit (model, - eab_model_signals [STATUS_MESSAGE], 0, - "Search Interrupted."); -} - -gboolean -eab_model_can_stop (EABModel *model) -{ - return model->search_in_progress; -} - -void -eab_model_force_folder_bar_message (EABModel *model) -{ - update_folder_bar_message (model); -} - -int -eab_model_contact_count (EABModel *model) -{ - return model->data_count; -} - -const EContact * -eab_model_contact_at (EABModel *model, int index) -{ - return model->data[index]; -} - -gboolean -eab_model_editable (EABModel *model) -{ - return model->editable; -} - -EBook * -eab_model_get_ebook (EABModel *model) -{ - return model->book; -} diff --git a/addressbook/gui/widgets/e-addressbook-model.h b/addressbook/gui/widgets/e-addressbook-model.h deleted file mode 100644 index e5ebb83dab..0000000000 --- a/addressbook/gui/widgets/e-addressbook-model.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#ifndef _EAB_MODEL_H_ -#define _EAB_MODEL_H_ - -#include <glib.h> -#include <glib-object.h> -#include <libebook/e-book.h> -#include <libebook/e-book-view.h> - -#define EAB_TYPE_MODEL (eab_model_get_type ()) -#define EAB_MODEL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EAB_TYPE_MODEL, EABModel)) -#define EAB_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), EAB_TYPE_MODEL, EABModelClass)) -#define E_IS_ADDRESSBOOK_MODEL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EAB_TYPE_MODEL)) -#define E_IS_ADDRESSBOOK_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EAB_TYPE_MODEL)) - -typedef struct _EABModel EABModel; -typedef struct _EABModelClass EABModelClass; - -struct _EABModel { - GObject parent; - - /* item specific fields */ - EBook *book; - EBookQuery *query; - EBookView *book_view; - - int book_view_idle_id; - - EContact **data; - int data_count; - int allocated_count; - - int create_contact_id, remove_contact_id, modify_contact_id; - int status_message_id, writable_status_id, sequence_complete_id; - int backend_died_id; - - guint search_in_progress : 1; - guint editable : 1; - guint editable_set : 1; - guint first_get_view : 1; -}; - - -struct _EABModelClass { - GObjectClass parent_class; - - /* - * Signals - */ - void (*writable_status) (EABModel *model, gboolean writable); - void (*search_started) (EABModel *model); - void (*search_result) (EABModel *model, EBookViewStatus status); - void (*status_message) (EABModel *model, const gchar *message); - void (*folder_bar_message) (EABModel *model, const gchar *message); - void (*contact_added) (EABModel *model, gint index, gint count); - void (*contact_removed) (EABModel *model, gint index); - void (*contact_changed) (EABModel *model, gint index); - void (*model_changed) (EABModel *model); - void (*stop_state_changed) (EABModel *model); - void (*backend_died) (EABModel *model); -}; - - -GType eab_model_get_type (void); -EABModel *eab_model_new (void); - -/* Returns object with ref count of 1. */ -EContact *eab_model_get_contact (EABModel *model, - int row); -EBook *eab_model_get_ebook (EABModel *model); - -void eab_model_stop (EABModel *model); -gboolean eab_model_can_stop (EABModel *model); - -void eab_model_force_folder_bar_message (EABModel *model); - -int eab_model_contact_count (EABModel *model); -const EContact *eab_model_contact_at (EABModel *model, - int index); -gboolean eab_model_editable (EABModel *model); - -#endif /* _EAB_MODEL_H_ */ diff --git a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c b/addressbook/gui/widgets/e-addressbook-reflow-adapter.c deleted file mode 100644 index 4d935198d1..0000000000 --- a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c +++ /dev/null @@ -1,516 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - - -#include <config.h> -#include <string.h> - -#include <libgnome/gnome-i18n.h> -#include "eab-marshal.h" -#include "e-addressbook-reflow-adapter.h" -#include "e-addressbook-model.h" -#include "e-addressbook-view.h" -#include "eab-gui-util.h" - -#include "e-minicard.h" -#include <gal/widgets/e-gui-utils.h> -#include "addressbook/printing/e-contact-print.h" -#include "addressbook/printing/e-contact-print-envelope.h" - - -struct _EAddressbookReflowAdapterPrivate { - EABModel *model; - - gboolean loading; - - int create_contact_id, remove_contact_id, modify_contact_id, model_changed_id; - int search_started_id, search_result_id; -}; - -#define PARENT_TYPE e_reflow_model_get_type() -static EReflowModel *parent_class; - -#define d(x) - -enum { - PROP_0, - PROP_BOOK, - PROP_QUERY, - PROP_EDITABLE, - PROP_MODEL, -}; - -enum { - DRAG_BEGIN, - LAST_SIGNAL -}; - -static guint e_addressbook_reflow_adapter_signals [LAST_SIGNAL] = {0, }; - -static void -unlink_model(EAddressbookReflowAdapter *adapter) -{ - EAddressbookReflowAdapterPrivate *priv = adapter->priv; - - if (priv->model && priv->create_contact_id) - g_signal_handler_disconnect (priv->model, - priv->create_contact_id); - if (priv->model && priv->remove_contact_id) - g_signal_handler_disconnect (priv->model, - priv->remove_contact_id); - if (priv->model && priv->modify_contact_id) - g_signal_handler_disconnect (priv->model, - priv->modify_contact_id); - if (priv->model && priv->model_changed_id) - g_signal_handler_disconnect (priv->model, - priv->model_changed_id); - if (priv->model && priv->search_started_id) - g_signal_handler_disconnect (priv->model, - priv->search_started_id); - if (priv->model && priv->search_result_id) - g_signal_handler_disconnect (priv->model, - priv->search_result_id); - - priv->create_contact_id = 0; - priv->remove_contact_id = 0; - priv->modify_contact_id = 0; - priv->model_changed_id = 0; - priv->search_started_id = 0; - priv->search_result_id = 0; - - if (priv->model) - g_object_unref (priv->model); - - priv->model = NULL; -} - - -static int -text_height (PangoLayout *layout, const gchar *text) -{ - int height; - - pango_layout_set_text (layout, text, -1); - - pango_layout_get_pixel_size (layout, NULL, &height); - - return height; -} - -static void -addressbook_dispose(GObject *object) -{ - EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object); - - unlink_model (adapter); -} - -static void -addressbook_set_width (EReflowModel *erm, int width) -{ -} - -/* This function returns the number of items in our EReflowModel. */ -static int -addressbook_count (EReflowModel *erm) -{ - EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm); - EAddressbookReflowAdapterPrivate *priv = adapter->priv; - - return eab_model_contact_count (priv->model); -} - -/* This function returns the height of the minicontact in question */ -static int -addressbook_height (EReflowModel *erm, int i, GnomeCanvasGroup *parent) -{ - EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm); - EAddressbookReflowAdapterPrivate *priv = adapter->priv; - EContactField field; - int count = 0; - char *string; - EContact *contact = (EContact*)eab_model_contact_at (priv->model, i); - PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET (GNOME_CANVAS_ITEM (parent)->canvas), ""); - int height; - - string = e_contact_get(contact, E_CONTACT_FILE_AS); - height = text_height (layout, string ? string : "") + 10.0; - g_free(string); - - for(field = E_CONTACT_FULL_NAME; field != E_CONTACT_LAST_SIMPLE_STRING && count < 5; field++) { - - if (field == E_CONTACT_FAMILY_NAME || field == E_CONTACT_GIVEN_NAME) - continue; - - string = e_contact_get(contact, field); - if (string && *string) { - int this_height; - int field_text_height; - - this_height = text_height (layout, e_contact_pretty_name(field)); - - field_text_height = text_height (layout, string); - if (this_height < field_text_height) - this_height = field_text_height; - - this_height += 3; - - height += this_height; - count ++; - } - g_free (string); - } - height += 2; - - g_object_unref (layout); - - return height; -} - -static int -addressbook_compare (EReflowModel *erm, int n1, int n2) -{ - EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm); - EAddressbookReflowAdapterPrivate *priv = adapter->priv; - EContact *contact1, *contact2; - - if (priv->loading) { - return n1-n2; - } - else { - contact1 = (EContact*)eab_model_contact_at (priv->model, n1); - contact2 = (EContact*)eab_model_contact_at (priv->model, n2); - - if (contact1 && contact2) { - const char *file_as1, *file_as2; - file_as1 = e_contact_get_const (contact1, E_CONTACT_FILE_AS); - file_as2 = e_contact_get_const (contact2, E_CONTACT_FILE_AS); - if (file_as1 && file_as2) - return g_utf8_collate(file_as1, file_as2); - if (file_as1) - return -1; - if (file_as2) - return 1; - return strcmp(e_contact_get_const (contact1, E_CONTACT_UID), - e_contact_get_const (contact2, E_CONTACT_UID)); - } - if (contact1) - return -1; - if (contact2) - return 1; - return 0; - } -} - -static int -adapter_drag_begin (EMinicard *card, GdkEvent *event, EAddressbookReflowAdapter *adapter) -{ - gint ret_val = 0; - - g_signal_emit (adapter, - e_addressbook_reflow_adapter_signals[DRAG_BEGIN], 0, - event, &ret_val); - - return ret_val; -} - -static GnomeCanvasItem * -addressbook_incarnate (EReflowModel *erm, int i, GnomeCanvasGroup *parent) -{ - EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm); - EAddressbookReflowAdapterPrivate *priv = adapter->priv; - GnomeCanvasItem *item; - - item = gnome_canvas_item_new(parent, - e_minicard_get_type(), - "contact", eab_model_contact_at (priv->model, i), - "editable", eab_model_editable (priv->model), - NULL); - -#if 0 - g_signal_connect (item, "selected", - G_CALLBACK(card_selected), 0, emvm); -#endif - - g_signal_connect (item, "drag_begin", - G_CALLBACK(adapter_drag_begin), adapter); - - return item; -} - -static void -addressbook_reincarnate (EReflowModel *erm, int i, GnomeCanvasItem *item) -{ - EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(erm); - EAddressbookReflowAdapterPrivate *priv = adapter->priv; - - gnome_canvas_item_set(item, - "contact", eab_model_contact_at (priv->model, i), - NULL); -} - -static void -create_contact (EABModel *model, - gint index, gint count, - EAddressbookReflowAdapter *adapter) -{ - e_reflow_model_items_inserted (E_REFLOW_MODEL (adapter), - index, - count); -} - -static void -remove_contact (EABModel *model, - gint index, - EAddressbookReflowAdapter *adapter) -{ - e_reflow_model_item_removed (E_REFLOW_MODEL (adapter), index); -} - -static void -modify_contact (EABModel *model, - gint index, - EAddressbookReflowAdapter *adapter) -{ - e_reflow_model_item_changed (E_REFLOW_MODEL (adapter), index); -} - -static void -model_changed (EABModel *model, - EAddressbookReflowAdapter *adapter) -{ - e_reflow_model_changed (E_REFLOW_MODEL (adapter)); -} - -static void -search_started (EABModel *model, - EAddressbookReflowAdapter *adapter) -{ - EAddressbookReflowAdapterPrivate *priv = adapter->priv; - - priv->loading = TRUE; -} - -static void -search_result (EABModel *model, - EBookViewStatus status, - EAddressbookReflowAdapter *adapter) -{ - EAddressbookReflowAdapterPrivate *priv = adapter->priv; - - priv->loading = FALSE; - - e_reflow_model_comparison_changed (E_REFLOW_MODEL (adapter)); -} - -static void -addressbook_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) -{ - EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object); - EAddressbookReflowAdapterPrivate *priv = adapter->priv; - - switch (prop_id) { - case PROP_BOOK: - g_object_set (priv->model, - "book", g_value_get_object (value), - NULL); - break; - case PROP_QUERY: - g_object_set (priv->model, - "query", g_value_get_string (value), - NULL); - break; - case PROP_EDITABLE: - g_object_set (priv->model, - "editable", g_value_get_boolean (value), - NULL); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -addressbook_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) -{ - EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object); - EAddressbookReflowAdapterPrivate *priv = adapter->priv; - - switch (prop_id) { - case PROP_BOOK: { - g_object_get_property (G_OBJECT (priv->model), - "book", value); - break; - } - case PROP_QUERY: { - g_object_get_property (G_OBJECT (priv->model), - "query", value); - break; - } - case PROP_EDITABLE: { - g_object_get_property (G_OBJECT (priv->model), - "editable", value); - break; - } - case PROP_MODEL: - g_value_set_object (value, priv->model); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_addressbook_reflow_adapter_class_init (GObjectClass *object_class) -{ - EReflowModelClass *model_class = (EReflowModelClass *) object_class; - - parent_class = g_type_class_peek_parent (object_class); - - object_class->set_property = addressbook_set_property; - object_class->get_property = addressbook_get_property; - object_class->dispose = addressbook_dispose; - - g_object_class_install_property (object_class, PROP_BOOK, - g_param_spec_object ("book", - _("Book"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_BOOK, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_QUERY, - g_param_spec_string ("query", - _("Query"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EDITABLE, - g_param_spec_boolean ("editable", - _("Editable"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_MODEL, - g_param_spec_object ("model", - _("Model"), - /*_( */"XXX blurb" /*)*/, - EAB_TYPE_MODEL, - G_PARAM_READABLE)); - - e_addressbook_reflow_adapter_signals [DRAG_BEGIN] = - g_signal_new ("drag_begin", - G_OBJECT_CLASS_TYPE(object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EAddressbookReflowAdapterClass, drag_begin), - NULL, NULL, - eab_marshal_INT__POINTER, - G_TYPE_INT, 1, G_TYPE_POINTER); - - model_class->set_width = addressbook_set_width; - model_class->count = addressbook_count; - model_class->height = addressbook_height; - model_class->compare = addressbook_compare; - model_class->incarnate = addressbook_incarnate; - model_class->reincarnate = addressbook_reincarnate; -} - -static void -e_addressbook_reflow_adapter_init (GtkObject *object) -{ - EAddressbookReflowAdapter *adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(object); - EAddressbookReflowAdapterPrivate *priv; - - priv = adapter->priv = g_new0 (EAddressbookReflowAdapterPrivate, 1); - - priv->loading = FALSE; - priv->create_contact_id = 0; - priv->remove_contact_id = 0; - priv->modify_contact_id = 0; - priv->model_changed_id = 0; - priv->search_started_id = 0; - priv->search_result_id = 0; -} - -GType -e_addressbook_reflow_adapter_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (EAddressbookReflowAdapterClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_addressbook_reflow_adapter_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EAddressbookReflowAdapter), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_addressbook_reflow_adapter_init, - }; - - type = g_type_register_static (PARENT_TYPE, "EAddressbookReflowAdapter", &info, 0); - } - - return type; -} - -void -e_addressbook_reflow_adapter_construct (EAddressbookReflowAdapter *adapter, - EABModel *model) -{ - EAddressbookReflowAdapterPrivate *priv = adapter->priv; - - priv->model = model; - g_object_ref (priv->model); - - priv->create_contact_id = g_signal_connect(priv->model, - "contact_added", - G_CALLBACK(create_contact), - adapter); - priv->remove_contact_id = g_signal_connect(priv->model, - "contact_removed", - G_CALLBACK(remove_contact), - adapter); - priv->modify_contact_id = g_signal_connect(priv->model, - "contact_changed", - G_CALLBACK(modify_contact), - adapter); - priv->model_changed_id = g_signal_connect(priv->model, - "model_changed", - G_CALLBACK(model_changed), - adapter); - priv->search_started_id = g_signal_connect(priv->model, - "search_started", - G_CALLBACK(search_started), - adapter); - priv->search_result_id = g_signal_connect(priv->model, - "search_result", - G_CALLBACK(search_result), - adapter); -} - -EReflowModel * -e_addressbook_reflow_adapter_new (EABModel *model) -{ - EAddressbookReflowAdapter *et; - - et = g_object_new (E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER, NULL); - - e_addressbook_reflow_adapter_construct (et, model); - - return E_REFLOW_MODEL(et); -} - - -EContact * -e_addressbook_reflow_adapter_get_contact (EAddressbookReflowAdapter *adapter, - int index) -{ - EAddressbookReflowAdapterPrivate *priv = adapter->priv; - - return eab_model_get_contact (priv->model, index); -} diff --git a/addressbook/gui/widgets/e-addressbook-reflow-adapter.h b/addressbook/gui/widgets/e-addressbook-reflow-adapter.h deleted file mode 100644 index 1321b27bb4..0000000000 --- a/addressbook/gui/widgets/e-addressbook-reflow-adapter.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#ifndef _E_ADDRESSBOOK_REFLOW_ADAPTER_H_ -#define _E_ADDRESSBOOK_REFLOW_ADAPTER_H_ - -#include <gal/widgets/e-reflow-model.h> -#include <libebook/e-contact.h> -#include "e-addressbook-model.h" - -#define E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER (e_addressbook_reflow_adapter_get_type ()) -#define E_ADDRESSBOOK_REFLOW_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER, EAddressbookReflowAdapter)) -#define E_ADDRESSBOOK_REFLOW_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER, EAddressbookReflowAdapterClass)) -#define E_IS_ADDRESSBOOK_REFLOW_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER)) -#define E_IS_ADDRESSBOOK_REFLOW_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER)) - -typedef struct _EAddressbookReflowAdapter EAddressbookReflowAdapter; -typedef struct _EAddressbookReflowAdapterPrivate EAddressbookReflowAdapterPrivate; -typedef struct _EAddressbookReflowAdapterClass EAddressbookReflowAdapterClass; - -struct _EAddressbookReflowAdapter { - EReflowModel parent; - - EAddressbookReflowAdapterPrivate *priv; -}; - - -struct _EAddressbookReflowAdapterClass { - EReflowModelClass parent_class; - - /* - * Signals - */ - gint (* drag_begin) (EAddressbookReflowAdapter *adapter, GdkEvent *event); -}; - - -GType e_addressbook_reflow_adapter_get_type (void); -void e_addressbook_reflow_adapter_construct (EAddressbookReflowAdapter *adapter, - EABModel *model); -EReflowModel *e_addressbook_reflow_adapter_new (EABModel *model); - -/* Returns object with ref count of 1. */ -EContact *e_addressbook_reflow_adapter_get_contact (EAddressbookReflowAdapter *adapter, - int index); -#endif /* _E_ADDRESSBOOK_REFLOW_ADAPTER_H_ */ diff --git a/addressbook/gui/widgets/e-addressbook-table-adapter.c b/addressbook/gui/widgets/e-addressbook-table-adapter.c deleted file mode 100644 index c3fadfdf23..0000000000 --- a/addressbook/gui/widgets/e-addressbook-table-adapter.c +++ /dev/null @@ -1,347 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -#include <config.h> -#include "e-addressbook-model.h" -#include "e-addressbook-table-adapter.h" -#include "eab-contact-merging.h" -#include "eab-gui-util.h" -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/xmlmemory.h> -#include <gnome.h> - -struct _EAddressbookTableAdapterPrivate { - EABModel *model; - - int create_contact_id, remove_contact_id, modify_contact_id, model_changed_id; -}; - -#define PARENT_TYPE e_table_model_get_type() -static ETableModelClass *parent_class; - -#define COLS (E_CONTACT_FIELD_LAST) - -static void -unlink_model(EAddressbookTableAdapter *adapter) -{ - EAddressbookTableAdapterPrivate *priv = adapter->priv; - - g_signal_handler_disconnect (priv->model, - priv->create_contact_id); - g_signal_handler_disconnect (priv->model, - priv->remove_contact_id); - g_signal_handler_disconnect (priv->model, - priv->modify_contact_id); - g_signal_handler_disconnect (priv->model, - priv->model_changed_id); - - priv->create_contact_id = 0; - priv->remove_contact_id = 0; - priv->modify_contact_id = 0; - priv->model_changed_id = 0; - - g_object_unref (priv->model); - - priv->model = NULL; -} - -static void -addressbook_dispose(GObject *object) -{ - EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(object); - - if (adapter->priv) { - unlink_model(adapter); - - g_free (adapter->priv); - adapter->priv = NULL; - } - - if (G_OBJECT_CLASS (parent_class)->dispose) - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - -/* This function returns the number of columns in our ETableModel. */ -static int -addressbook_col_count (ETableModel *etc) -{ - return COLS; -} - -/* This function returns the number of rows in our ETableModel. */ -static int -addressbook_row_count (ETableModel *etc) -{ - EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etc); - EAddressbookTableAdapterPrivate *priv = adapter->priv; - - return eab_model_contact_count (priv->model); -} - -/* This function returns the value at a particular point in our ETableModel. */ -static void * -addressbook_value_at (ETableModel *etc, int col, int row) -{ - EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etc); - EAddressbookTableAdapterPrivate *priv = adapter->priv; - const char *value; - - if ( col >= COLS || row >= eab_model_contact_count (priv->model) ) - return NULL; - - value = e_contact_get_const((EContact*)eab_model_contact_at (priv->model, row), col); - - return (void *)(value ? value : ""); -} - -/* This function sets the value at a particular point in our ETableModel. */ -static void -contact_modified_cb (EBook* book, EBookStatus status, - gpointer user_data) -{ - if (status != E_BOOK_ERROR_OK) - eab_error_dialog (_("Error modifying card"), status); -} - -static void -addressbook_set_value_at (ETableModel *etc, int col, int row, const void *val) -{ - EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etc); - EAddressbookTableAdapterPrivate *priv = adapter->priv; - - if (eab_model_editable (priv->model)) { - EContact *contact; - - if (col >= COLS || row >= eab_model_contact_count (priv->model)) - return; - - contact = eab_model_get_contact (priv->model, row); - if (!contact) - return; - - e_table_model_pre_change(etc); - - e_contact_set(contact, col, (void *) val); - eab_merging_book_commit_contact (eab_model_get_ebook (priv->model), - contact, contact_modified_cb, NULL); - - g_object_unref (contact); - - /* XXX do we need this? shouldn't the commit_contact generate a changed signal? */ - e_table_model_cell_changed(etc, col, row); - } -} - -/* This function returns whether a particular cell is editable. */ -static gboolean -addressbook_is_cell_editable (ETableModel *etc, int col, int row) -{ -#if 0 - EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etc); - EAddressbookTableAdapterPrivate *priv = adapter->priv; - const EContact *contact; - - if (row >= 0 && row < eab_model_contact_count (priv->model)) - contact = eab_model_contact_at (priv->model, row); - else - contact = NULL; - - if (!eab_model_editable(priv->model)) - return FALSE; - else if (contact && e_contact_get ((EContact *) contact, E_CONTACT_IS_LIST)) - /* we only allow editing of the name and file as for - lists */ - return col == E_CONTACT_FULL_NAME || col == E_CONTACT_FILE_AS; - else - return col < E_CONTACT_LAST_SIMPLE_STRING; -#endif - - return FALSE; -} - -static void -addressbook_append_row (ETableModel *etm, ETableModel *source, gint row) -{ - EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(etm); - EAddressbookTableAdapterPrivate *priv = adapter->priv; - EContact *contact; - int col; - - contact = e_contact_new (); - - for (col = 1; col < E_CONTACT_LAST_SIMPLE_STRING; col++) { - const void *val = e_table_model_value_at (source, col, row); - e_contact_set (contact, col, (void *) val); - } - - eab_merging_book_add_contact (eab_model_get_ebook (priv->model), contact, NULL, NULL); - - g_object_unref (contact); -} - -/* This function duplicates the value passed to it. */ -static void * -addressbook_duplicate_value (ETableModel *etc, int col, const void *value) -{ - return g_strdup(value); -} - -/* This function frees the value passed to it. */ -static void -addressbook_free_value (ETableModel *etc, int col, void *value) -{ - g_free(value); -} - -static void * -addressbook_initialize_value (ETableModel *etc, int col) -{ - return g_strdup(""); -} - -static gboolean -addressbook_value_is_empty (ETableModel *etc, int col, const void *value) -{ - return !(value && *(char *)value); -} - -static char * -addressbook_value_to_string (ETableModel *etc, int col, const void *value) -{ - return g_strdup(value); -} - -static void -eab_table_adapter_class_init (GObjectClass *object_class) -{ - ETableModelClass *model_class = (ETableModelClass *) object_class; - - parent_class = g_type_class_peek_parent (object_class); - - object_class->dispose = addressbook_dispose; - - model_class->column_count = addressbook_col_count; - model_class->row_count = addressbook_row_count; - model_class->value_at = addressbook_value_at; - model_class->set_value_at = addressbook_set_value_at; - model_class->is_cell_editable = addressbook_is_cell_editable; - model_class->append_row = addressbook_append_row; - model_class->duplicate_value = addressbook_duplicate_value; - model_class->free_value = addressbook_free_value; - model_class->initialize_value = addressbook_initialize_value; - model_class->value_is_empty = addressbook_value_is_empty; - model_class->value_to_string = addressbook_value_to_string; -} - -static void -eab_table_adapter_init (GObject *object) -{ - EAddressbookTableAdapter *adapter = EAB_TABLE_ADAPTER(object); - EAddressbookTableAdapterPrivate *priv; - - priv = adapter->priv = g_new0 (EAddressbookTableAdapterPrivate, 1); - - priv->create_contact_id = 0; - priv->remove_contact_id = 0; - priv->modify_contact_id = 0; - priv->model_changed_id = 0; -} - - -static void -create_contact (EABModel *model, - gint index, gint count, - EAddressbookTableAdapter *adapter) -{ - e_table_model_pre_change (E_TABLE_MODEL (adapter)); - e_table_model_rows_inserted (E_TABLE_MODEL (adapter), index, count); -} - -static void -remove_contact (EABModel *model, - gint index, - EAddressbookTableAdapter *adapter) -{ - e_table_model_pre_change (E_TABLE_MODEL (adapter)); - e_table_model_rows_deleted (E_TABLE_MODEL (adapter), index, 1); -} - -static void -modify_contact (EABModel *model, - gint index, - EAddressbookTableAdapter *adapter) -{ - e_table_model_pre_change (E_TABLE_MODEL (adapter)); - e_table_model_row_changed (E_TABLE_MODEL (adapter), index); -} - -static void -model_changed (EABModel *model, - EAddressbookTableAdapter *adapter) -{ - e_table_model_pre_change (E_TABLE_MODEL (adapter)); - e_table_model_changed (E_TABLE_MODEL (adapter)); -} - -GType -eab_table_adapter_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (EAddressbookTableAdapterClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) eab_table_adapter_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EAddressbookTableAdapter), - 0, /* n_preallocs */ - (GInstanceInitFunc) eab_table_adapter_init, - }; - - type = g_type_register_static (PARENT_TYPE, "EAddressbookTableAdapter", &info, 0); - } - - return type; -} - -void -eab_table_adapter_construct (EAddressbookTableAdapter *adapter, - EABModel *model) -{ - EAddressbookTableAdapterPrivate *priv = adapter->priv; - - priv->model = model; - g_object_ref (priv->model); - - priv->create_contact_id = g_signal_connect(priv->model, - "contact_added", - G_CALLBACK(create_contact), - adapter); - priv->remove_contact_id = g_signal_connect(priv->model, - "contact_removed", - G_CALLBACK(remove_contact), - adapter); - priv->modify_contact_id = g_signal_connect(priv->model, - "contact_changed", - G_CALLBACK(modify_contact), - adapter); - priv->model_changed_id = g_signal_connect(priv->model, - "model_changed", - G_CALLBACK(model_changed), - adapter); -} - -ETableModel * -eab_table_adapter_new (EABModel *model) -{ - EAddressbookTableAdapter *et; - - et = g_object_new(E_TYPE_AB_TABLE_ADAPTER, NULL); - - eab_table_adapter_construct (et, model); - - return E_TABLE_MODEL(et); -} diff --git a/addressbook/gui/widgets/e-addressbook-table-adapter.h b/addressbook/gui/widgets/e-addressbook-table-adapter.h deleted file mode 100644 index cf139e2bee..0000000000 --- a/addressbook/gui/widgets/e-addressbook-table-adapter.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#ifndef _EAB_TABLE_ADAPTER_H_ -#define _EAB_TABLE_ADAPTER_H_ - -#include <gal/e-table/e-table-model.h> -#include <libebook/e-book.h> -#include <libebook/e-book-view.h> - -#define E_TYPE_AB_TABLE_ADAPTER (eab_table_adapter_get_type ()) -#define EAB_TABLE_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_AB_TABLE_ADAPTER, EAddressbookTableAdapter)) -#define EAB_TABLE_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_AB_TABLE_ADAPTER, EAddressbookTableAdapterClass)) -#define E_IS_ADDRESSBOOK_TABLE_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_AB_TABLE_ADAPTER)) -#define E_IS_ADDRESSBOOK_TABLE_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_AB_TABLE_ADAPTER)) - -typedef struct _EAddressbookTableAdapter EAddressbookTableAdapter; -typedef struct _EAddressbookTableAdapterPrivate EAddressbookTableAdapterPrivate; -typedef struct _EAddressbookTableAdapterClass EAddressbookTableAdapterClass; - -struct _EAddressbookTableAdapter { - ETableModel parent; - - EAddressbookTableAdapterPrivate *priv; -}; - - -struct _EAddressbookTableAdapterClass { - ETableModelClass parent_class; -}; - - -GType eab_table_adapter_get_type (void); -void eab_table_adapter_construct (EAddressbookTableAdapter *adapter, - EABModel *model); -ETableModel *eab_table_adapter_new (EABModel *model); - -#endif /* _EAB_TABLE_ADAPTER_H_ */ diff --git a/addressbook/gui/widgets/e-addressbook-treeview-adapter.c b/addressbook/gui/widgets/e-addressbook-treeview-adapter.c deleted file mode 100644 index 2d0c4b8c93..0000000000 --- a/addressbook/gui/widgets/e-addressbook-treeview-adapter.c +++ /dev/null @@ -1,621 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -#include <config.h> -#include "e-addressbook-model.h" -#include "e-addressbook-treeview-adapter.h" -#include "e-card-merging.h" -#include "eab-gui-util.h" -#include <gtk/gtktreednd.h> -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/xmlmemory.h> - -struct _EAddressbookTreeViewAdapterPrivate { - EAddressbookModel *model; - - gint stamp; - - ECardSimple **simples; - int count; - - int create_card_id, remove_card_id, modify_card_id, model_changed_id; -}; - -#define PARENT_TYPE G_TYPE_OBJECT -GObjectClass *parent_class; - -#define COLS (E_CARD_SIMPLE_FIELD_LAST) - -static void -unlink_model(EAddressbookTreeViewAdapter *adapter) -{ - EAddressbookTreeViewAdapterPrivate *priv = adapter->priv; - int i; - - g_signal_handler_disconnect (priv->model, - priv->create_card_id); - g_signal_handler_disconnect (priv->model, - priv->remove_card_id); - g_signal_handler_disconnect (priv->model, - priv->modify_card_id); - g_signal_handler_disconnect (priv->model, - priv->model_changed_id); - - priv->create_card_id = 0; - priv->remove_card_id = 0; - priv->modify_card_id = 0; - priv->model_changed_id = 0; - - /* free up the existing mapping if there is one */ - if (priv->simples) { - for (i = 0; i < priv->count; i ++) - g_object_unref (priv->simples[i]); - g_free (priv->simples); - priv->simples = NULL; - } - - g_object_unref (priv->model); - - priv->model = NULL; -} - -static void -build_simple_mapping(EAddressbookTreeViewAdapter *adapter) -{ - EAddressbookTreeViewAdapterPrivate *priv = adapter->priv; - int i; - - /* free up the existing mapping if there is one */ - if (priv->simples) { - for (i = 0; i < priv->count; i ++) - g_object_unref (priv->simples[i]); - g_free (priv->simples); - } - - /* build up our mapping to ECardSimple*'s */ - priv->count = e_addressbook_model_card_count (priv->model); - priv->simples = g_new (ECardSimple*, priv->count); - for (i = 0; i < priv->count; i ++) { - priv->simples[i] = e_card_simple_new (e_addressbook_model_card_at (priv->model, i)); - g_object_ref (priv->simples[i]); - } -} - -static void -addressbook_destroy(GtkObject *object) -{ - EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER(object); - - unlink_model(adapter); - - g_free (adapter->priv); - adapter->priv = NULL; - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - -#if 0 -static void -addressbook_set_value_at (ETableModel *etc, int col, int row, const void *val) -{ - EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etc); - EAddressbookTableAdapterPrivate *priv = adapter->priv; - if (e_addressbook_model_editable (priv->model)) { - ECard *card; - - if ( col >= COLS|| row >= e_addressbook_model_card_count (priv->model) ) - return; - - e_table_model_pre_change(etc); - - e_card_simple_set(priv->simples[row], - col, - val); - g_object_get(priv->simples[row], - "card", &card, - NULL); - - e_card_merging_book_commit_card(e_addressbook_model_get_ebook(priv->model), - card, card_modified_cb, NULL); - - /* XXX do we need this? shouldn't the commit_card generate a changed signal? */ - e_table_model_cell_changed(etc, col, row); - } -} - -/* This function returns whether a particular cell is editable. */ -static gboolean -addressbook_is_cell_editable (ETableModel *etc, int col, int row) -{ - EAddressbookTableAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etc); - EAddressbookTableAdapterPrivate *priv = adapter->priv; - ECard *card; - - if (row >= 0 && row < e_addressbook_model_card_count (priv->model)) - card = e_addressbook_model_card_at (priv->model, row); - else - card = NULL; - - if (!e_addressbook_model_editable(priv->model)) - return FALSE; - else if (card && e_card_evolution_list (card)) - /* we only allow editing of the name and file as for - lists */ - return col == E_CARD_SIMPLE_FIELD_FULL_NAME || col == E_CARD_SIMPLE_FIELD_FILE_AS; - else - return col < E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING; -} - -static void -addressbook_append_row (ETableModel *etm, ETableModel *source, gint row) -{ - EAddressbookTableAdapter *adapter = E_ADDRESSBOOK_TABLE_ADAPTER(etm); - EAddressbookTableAdapterPrivate *priv = adapter->priv; - ECard *card; - ECardSimple *simple; - int col; - - card = e_card_new(""); - simple = e_card_simple_new(card); - - for (col = 0; col < E_CARD_SIMPLE_FIELD_LAST_SIMPLE_STRING; col++) { - const void *val = e_table_model_value_at(source, col, row); - e_card_simple_set(simple, col, val); - } - e_card_simple_sync_card(simple); - e_card_merging_book_add_card (e_addressbook_model_get_ebook (priv->model), card, NULL, NULL); - g_object_unref (simple); - g_object_unref (card); -} -#endif - -static void -e_addressbook_treeview_adapter_class_init (GtkObjectClass *object_class) -{ - parent_class = g_type_class_peek_parent (object_class); - - object_class->destroy = addressbook_destroy; -} - -static void -e_addressbook_treeview_adapter_init (GtkObject *object) -{ - EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER(object); - EAddressbookTreeViewAdapterPrivate *priv; - - priv = adapter->priv = g_new0 (EAddressbookTreeViewAdapterPrivate, 1); - - priv->create_card_id = 0; - priv->remove_card_id = 0; - priv->modify_card_id = 0; - priv->model_changed_id = 0; - priv->simples = NULL; - priv->count = 0; -} - -static void -get_iter (EAddressbookTreeViewAdapter *adapter, gint index, GtkTreeIter *iter) -{ - EAddressbookTreeViewAdapterPrivate *priv = adapter->priv; - - iter->stamp = priv->stamp; - iter->user_data = GINT_TO_POINTER (index); -} - -static void -create_card (EAddressbookModel *model, - gint index, gint count, - EAddressbookTreeViewAdapter *adapter) -{ - EAddressbookTreeViewAdapterPrivate *priv = adapter->priv; - int i; - - priv->count += count; - priv->simples = g_renew(ECardSimple *, priv->simples, priv->count); - memmove (priv->simples + index + count, priv->simples + index, (priv->count - index - count) * sizeof (ECardSimple *)); - - for (i = 0; i < count; i ++) { - GtkTreeIter iter; - GtkTreePath *path; - - priv->simples[index + i] = e_card_simple_new (e_addressbook_model_card_at (priv->model, index + i)); - - get_iter (adapter, index + i, &iter); - path = gtk_tree_model_get_path (GTK_TREE_MODEL (adapter), &iter); - - gtk_tree_model_row_inserted (GTK_TREE_MODEL (adapter), path, &iter); - gtk_tree_model_row_changed (GTK_TREE_MODEL (adapter), path, &iter); - - gtk_tree_path_free (path); - } -} - -static void -remove_card (EAddressbookModel *model, - gint index, - EAddressbookTreeViewAdapter *adapter) -{ - EAddressbookTreeViewAdapterPrivate *priv = adapter->priv; - GtkTreeIter iter; - GtkTreePath *path; - - g_object_unref (priv->simples[index]); - memmove (priv->simples + index, priv->simples + index + 1, (priv->count - index - 1) * sizeof (ECardSimple *)); - priv->count --; - get_iter (adapter, index, &iter); - path = gtk_tree_model_get_path (GTK_TREE_MODEL (adapter), &iter); - - gtk_tree_model_row_deleted (GTK_TREE_MODEL (adapter), path); - - gtk_tree_path_free (path); -} - -static void -modify_card (EAddressbookModel *model, - gint index, - EAddressbookTreeViewAdapter *adapter) -{ - EAddressbookTreeViewAdapterPrivate *priv = adapter->priv; - GtkTreeIter iter; - GtkTreePath *path; - - g_object_unref (priv->simples[index]); - priv->simples[index] = e_card_simple_new (e_addressbook_model_card_at (priv->model, index)); - - get_iter (adapter, index, &iter); - path = gtk_tree_model_get_path (GTK_TREE_MODEL (adapter), &iter); - - gtk_tree_model_row_changed (GTK_TREE_MODEL (adapter), path, &iter); - - gtk_tree_path_free (path); -} - -static void -model_changed (EAddressbookModel *model, - EAddressbookTreeViewAdapter *adapter) -{ - int i; - - /* there has *got* to be an easier/faster way to do this... */ - for (i = 0; i < adapter->priv->count; i++) { - remove_card (model, i, adapter); - } - - build_simple_mapping (adapter); - - if (adapter->priv->count) { - printf ("AIIEEEEEE\n"); - } - - /* XXX this isn't right either, we need to add the new cards */ -} - -static GtkTreeModelFlags -adapter_get_flags (GtkTreeModel *tree_model) -{ - g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), 0); - - return GTK_TREE_MODEL_LIST_ONLY; -} - -static gint -adapter_get_n_columns (GtkTreeModel *tree_model) -{ - g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), 0); - - return COLS; -} - -static GType -adapter_get_column_type (GtkTreeModel *tree_model, - gint index) -{ - g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), G_TYPE_INVALID); - g_return_val_if_fail (index < COLS && index >= 0, G_TYPE_INVALID); - - return G_TYPE_STRING; -} - -static gboolean -adapter_get_iter (GtkTreeModel *tree_model, - GtkTreeIter *iter, - GtkTreePath *path) -{ - EAddressbookTreeViewAdapter *adapter; - GSList *list; - gint i; - - g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), FALSE); - g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE); - - adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model); - - i = gtk_tree_path_get_indices (path)[0]; - - if (i >= adapter->priv->count) - return FALSE; - - iter->stamp = adapter->priv->stamp; - iter->user_data = GINT_TO_POINTER (i); - - return TRUE; -} - -static GtkTreePath * -adapter_get_path (GtkTreeModel *tree_model, - GtkTreeIter *iter) -{ - EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model); - GtkTreePath *retval; - - g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), NULL); - g_return_val_if_fail (iter->stamp == adapter->priv->stamp, NULL); - - - if (GPOINTER_TO_INT (iter->user_data) >= adapter->priv->count) - return NULL; - - retval = gtk_tree_path_new (); - gtk_tree_path_append_index (retval, GPOINTER_TO_INT (iter->user_data)); - return retval; -} - -static void -adapter_get_value (GtkTreeModel *tree_model, - GtkTreeIter *iter, - gint column, - GValue *value) -{ - EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model); - ECardSimple *simple; - gint tmp_column = column; - const char *v; - - g_return_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model)); - g_return_if_fail (column < COLS); - g_return_if_fail (adapter->priv->stamp == iter->stamp); - - simple = adapter->priv->simples [ GPOINTER_TO_INT (iter->user_data) ]; - - v = e_card_simple_get_const(simple, column); - - g_value_init (value, G_TYPE_STRING); - g_value_set_string (value, (v ? v : "")); -} - -static gboolean -adapter_iter_next (GtkTreeModel *tree_model, - GtkTreeIter *iter) -{ - EAddressbookTreeViewAdapter *adapter; - - g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), FALSE); - g_return_val_if_fail (E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model)->priv->stamp == iter->stamp, FALSE); - - adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model); - - iter->user_data = GINT_TO_POINTER (GPOINTER_TO_INT (iter->user_data) + 1); - - return (GPOINTER_TO_INT (iter->user_data) < adapter->priv->count); -} - -static gboolean -adapter_iter_children (GtkTreeModel *tree_model, - GtkTreeIter *iter, - GtkTreeIter *parent) -{ - EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model); - - /* this is a list, nodes have no children */ - if (parent) - return FALSE; - - /* but if parent == NULL we return the list itself as children of the - * "root" - */ - if (adapter->priv->count) { - iter->stamp = adapter->priv->stamp; - iter->user_data = GINT_TO_POINTER (0); - return TRUE; - } - else - return FALSE; -} - -static gboolean -adapter_iter_has_child (GtkTreeModel *tree_model, - GtkTreeIter *iter) -{ - return FALSE; -} - -static gint -adapter_iter_n_children (GtkTreeModel *tree_model, - GtkTreeIter *iter) -{ - EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model); - - g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), -1); - if (iter == NULL) - return adapter->priv->count; - - g_return_val_if_fail (adapter->priv->stamp == iter->stamp, -1); - return 0; -} - -static gboolean -adapter_iter_nth_child (GtkTreeModel *tree_model, - GtkTreeIter *iter, - GtkTreeIter *parent, - gint n) -{ - EAddressbookTreeViewAdapter *adapter = E_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model); - - g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (tree_model), FALSE); - - if (parent) - return FALSE; - - if (n < adapter->priv->count) { - iter->stamp = adapter->priv->stamp; - iter->user_data = GINT_TO_POINTER (n); - return TRUE; - } - else - return FALSE; -} - -static gboolean -adapter_iter_parent (GtkTreeModel *tree_model, - GtkTreeIter *iter, - GtkTreeIter *child) -{ - return FALSE; -} - -static void -adapter_tree_model_init (GtkTreeModelIface *iface) -{ - iface->get_flags = adapter_get_flags; - iface->get_n_columns = adapter_get_n_columns; - iface->get_column_type = adapter_get_column_type; - iface->get_iter = adapter_get_iter; - iface->get_path = adapter_get_path; - iface->get_value = adapter_get_value; - iface->iter_next = adapter_iter_next; - iface->iter_children = adapter_iter_children; - iface->iter_has_child = adapter_iter_has_child; - iface->iter_n_children = adapter_iter_n_children; - iface->iter_nth_child = adapter_iter_nth_child; - iface->iter_parent = adapter_iter_parent; -} - -static gboolean -adapter_drag_data_delete (GtkTreeDragSource *drag_source, - GtkTreePath *path) -{ - g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (drag_source), FALSE); - - return FALSE; -} - -static gboolean -adapter_drag_data_get (GtkTreeDragSource *drag_source, - GtkTreePath *path, - GtkSelectionData *selection_data) -{ - g_return_val_if_fail (E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER (drag_source), FALSE); - - /* Note that we don't need to handle the GTK_TREE_MODEL_ROW - * target, because the default handler does it for us, but - * we do anyway for the convenience of someone maybe overriding the - * default handler. - */ - - if (gtk_tree_set_row_drag_data (selection_data, - GTK_TREE_MODEL (drag_source), - path)) { - return TRUE; - } - else { - if (selection_data->target == gdk_atom_intern ("text/x-vcard", FALSE)) { - printf ("HI THERE\n"); - } - } - - return FALSE; -} - -static void -adapter_drag_source_init (GtkTreeDragSourceIface *iface) -{ - iface->drag_data_delete = adapter_drag_data_delete; - iface->drag_data_get = adapter_drag_data_get; -} - -GType -e_addressbook_treeview_adapter_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo adapter_info = { - sizeof (EAddressbookTreeViewAdapterClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_addressbook_treeview_adapter_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EAddressbookTreeViewAdapter), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_addressbook_treeview_adapter_init, - }; - - static const GInterfaceInfo tree_model_info = { - (GInterfaceInitFunc) adapter_tree_model_init, - NULL, - NULL - }; - - static const GInterfaceInfo drag_source_info = { - (GInterfaceInitFunc) adapter_drag_source_init, - NULL, - NULL - }; - - type = g_type_register_static (PARENT_TYPE, "EAddressbookTreeViewAdapter", &adapter_info, 0); - - g_type_add_interface_static (type, - GTK_TYPE_TREE_MODEL, - &tree_model_info); - - g_type_add_interface_static (type, - GTK_TYPE_TREE_DRAG_SOURCE, - &drag_source_info); - } - - return type; -} - -void -e_addressbook_treeview_adapter_construct (EAddressbookTreeViewAdapter *adapter, - EAddressbookModel *model) -{ - EAddressbookTreeViewAdapterPrivate *priv = adapter->priv; - - priv->model = model; - g_object_ref (priv->model); - - priv->stamp = g_random_int (); - - priv->create_card_id = g_signal_connect(priv->model, - "card_added", - G_CALLBACK(create_card), - adapter); - priv->remove_card_id = g_signal_connect(priv->model, - "card_removed", - G_CALLBACK(remove_card), - adapter); - priv->modify_card_id = g_signal_connect(priv->model, - "card_changed", - G_CALLBACK(modify_card), - adapter); - priv->model_changed_id = g_signal_connect(priv->model, - "model_changed", - G_CALLBACK(model_changed), - adapter); - - build_simple_mapping (adapter); -} - -GtkTreeModel * -e_addressbook_treeview_adapter_new (EAddressbookModel *model) -{ - EAddressbookTreeViewAdapter *et; - - et = g_object_new(E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER, NULL); - - e_addressbook_treeview_adapter_construct (et, model); - - return (GtkTreeModel*)et; -} diff --git a/addressbook/gui/widgets/e-addressbook-treeview-adapter.h b/addressbook/gui/widgets/e-addressbook-treeview-adapter.h deleted file mode 100644 index 2c4370dee3..0000000000 --- a/addressbook/gui/widgets/e-addressbook-treeview-adapter.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -#ifndef _E_ADDRESSBOOK_TREEVIEW_ADAPTER_H_ -#define _E_ADDRESSBOOK_TREEVIEW_ADAPTER_H_ - -#include <gtk/gtktreemodel.h> -#include "addressbook/backend/ebook/e-book.h" -#include "addressbook/backend/ebook/e-book-view.h" -#include "addressbook/backend/ebook/e-card-simple.h" - -#define E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER (e_addressbook_treeview_adapter_get_type ()) -#define E_ADDRESSBOOK_TREEVIEW_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER, EAddressbookTreeViewAdapter)) -#define E_ADDRESSBOOK_TREEVIEW_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER, EAddressbookTreeViewAdapterClass)) -#define E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER)) -#define E_IS_ADDRESSBOOK_TREEVIEW_ADAPTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_ADDRESSBOOK_TREEVIEW_ADAPTER)) - -/* Virtual Column list: - 0 Email - 1 Full Name - 2 Street - 3 Phone -*/ - -typedef struct _EAddressbookTreeViewAdapter EAddressbookTreeViewAdapter; -typedef struct _EAddressbookTreeViewAdapterPrivate EAddressbookTreeViewAdapterPrivate; -typedef struct _EAddressbookTreeViewAdapterClass EAddressbookTreeViewAdapterClass; - -struct _EAddressbookTreeViewAdapter { - GObject parent; - - EAddressbookTreeViewAdapterPrivate *priv; -}; - - -struct _EAddressbookTreeViewAdapterClass { - GObjectClass parent_class; -}; - - -GType e_addressbook_treeview_adapter_get_type (void); -void e_addressbook_treeview_adapter_construct (EAddressbookTreeViewAdapter *adapter, - EAddressbookModel *model); -GtkTreeModel *e_addressbook_treeview_adapter_new (EAddressbookModel *model); - -#endif /* _E_ADDRESSBOOK_TABLE_ADAPTER_H_ */ diff --git a/addressbook/gui/widgets/e-addressbook-view.c b/addressbook/gui/widgets/e-addressbook-view.c deleted file mode 100644 index a0207e1281..0000000000 --- a/addressbook/gui/widgets/e-addressbook-view.c +++ /dev/null @@ -1,2196 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-addressbook-view.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * Chris Toshok <toshok@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> - -#include <gtk/gtk.h> - -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-util.h> -#include <gtk/gtkscrolledwindow.h> -#include <gal/e-table/e-table-scrolled.h> -#include <gal/e-table/e-table-model.h> -#include <gal/widgets/e-gui-utils.h> -#include <gal/menus/gal-view-factory-etable.h> -#include <gal/menus/gal-view-etable.h> -#include <gal/util/e-xml-utils.h> -#include <libgnomeui/gnome-dialog-util.h> - -#include <libgnomeprint/gnome-print.h> -#include <libgnomeprint/gnome-print-job.h> -#include <libgnomeprintui/gnome-print-dialog.h> -#include <libgnomeprintui/gnome-print-job-preview.h> - -#include "addressbook/printing/e-contact-print.h" -#include "addressbook/printing/e-contact-print-envelope.h" -#include "addressbook/gui/search/e-addressbook-search-dialog.h" -#include "addressbook/gui/widgets/eab-popup.h" -#include "addressbook/gui/widgets/eab-menu.h" - -#include "e-util/e-categories-master-list-wombat.h" -#include "e-util/e-sexp.h" - -#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW -#include <gal/widgets/e-treeview-selection-model.h> -#include "gal-view-factory-treeview.h" -#include "gal-view-treeview.h" -#endif -#include "gal-view-minicard.h" -#include "gal-view-factory-minicard.h" - -#include "eab-marshal.h" -#include "e-addressbook-view.h" -#include "e-addressbook-model.h" -#include "eab-gui-util.h" -#include "util/eab-book-util.h" -#include "e-addressbook-table-adapter.h" -#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW -#include "e-addressbook-treeview-adapter.h" -#endif -#include "eab-contact-merging.h" - -#include "widgets/misc/e-error.h" - -#include "e-contact-editor.h" -#include <gdk/gdkkeysyms.h> -#include <ctype.h> -#include <string.h> - -#include <libxml/tree.h> -#include <libxml/parser.h> - -#define SHOW_ALL_SEARCH "(contains \"x-evolution-any-field\" \"\")" - -#define d(x) - -static void eab_view_init (EABView *card); -static void eab_view_class_init (EABViewClass *klass); - -static void eab_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void eab_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); - -static void eab_view_dispose (GObject *object); -static void change_view_type (EABView *view, EABViewType view_type); - -static void status_message (GtkObject *object, const gchar *status, EABView *eav); -static void search_result (GtkObject *object, EBookViewStatus status, EABView *eav); -static void folder_bar_message (GtkObject *object, const gchar *status, EABView *eav); -static void stop_state_changed (GtkObject *object, EABView *eav); -static void writable_status (GtkObject *object, gboolean writable, EABView *eav); -static void backend_died (GtkObject *object, EABView *eav); -static void contact_changed (EABModel *model, gint index, EABView *eav); -static void contact_removed (EABModel *model, gint index, EABView *eav); -static GList *get_selected_contacts (EABView *view); - -static void command_state_change (EABView *eav); - -static void selection_clear_event (GtkWidget *invisible, GdkEventSelection *event, - EABView *view); -static void selection_received (GtkWidget *invisible, GtkSelectionData *selection_data, - guint time, EABView *view); -static void selection_get (GtkWidget *invisible, GtkSelectionData *selection_data, - guint info, guint time_stamp, EABView *view); -static void invisible_destroyed (gpointer data, GObject *where_object_was); - -static void make_suboptions (EABView *view); -static void query_changed (ESearchBar *esb, EABView *view); -static void search_activated (ESearchBar *esb, EABView *view); -static void search_menu_activated (ESearchBar *esb, int id, EABView *view); -static void connect_master_list_changed (EABView *view); -static ECategoriesMasterList *get_master_list (void); - -#define PARENT_TYPE GTK_TYPE_VBOX -static GtkVBoxClass *parent_class = NULL; - -/* The arguments we take */ -enum { - PROP_0, - PROP_BOOK, - PROP_SOURCE, - PROP_QUERY, - PROP_TYPE, -}; - -enum { - STATUS_MESSAGE, - SEARCH_RESULT, - FOLDER_BAR_MESSAGE, - COMMAND_STATE_CHANGE, - LAST_SIGNAL -}; - -enum DndTargetType { - DND_TARGET_TYPE_SOURCE_VCARD, - DND_TARGET_TYPE_VCARD -}; -#define VCARD_TYPE "text/x-vcard" -#define SOURCE_VCARD_TYPE "text/x-source-vcard" -static GtkTargetEntry drag_types[] = { - { SOURCE_VCARD_TYPE, 0, DND_TARGET_TYPE_SOURCE_VCARD }, - { VCARD_TYPE, 0, DND_TARGET_TYPE_VCARD } -}; -static const int num_drag_types = sizeof (drag_types) / sizeof (drag_types[0]); - -static guint eab_view_signals [LAST_SIGNAL] = {0, }; - -static GdkAtom clipboard_atom = GDK_NONE; - -static GalViewCollection *collection = NULL; - -enum { - ESB_FULL_NAME, - ESB_EMAIL, - ESB_CATEGORY, - ESB_ANY, - ESB_ADVANCED -}; - -static ESearchBarItem addressbook_search_option_items[] = { - { N_("Name begins with"), ESB_FULL_NAME, NULL }, - { N_("Email begins with"), ESB_EMAIL, NULL }, - { N_("Category is"), ESB_CATEGORY, NULL }, /* We attach subitems below */ - { N_("Any field contains"), ESB_ANY, NULL }, - { N_("Advanced..."), ESB_ADVANCED, NULL }, - { NULL, -1, NULL } -}; - -static ESearchBarItem addressbook_search_items[] = { - { N_("Advanced..."), ESB_ADVANCED, NULL }, - { NULL, -1, NULL }, -}; - -GType -eab_view_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (EABViewClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) eab_view_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EABView), - 0, /* n_preallocs */ - (GInstanceInitFunc) eab_view_init, - }; - - type = g_type_register_static (PARENT_TYPE, "EABView", &info, 0); - } - - return type; -} - -static void -eab_view_class_init (EABViewClass *klass) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - - object_class = G_OBJECT_CLASS(klass); - widget_class = GTK_WIDGET_CLASS(klass); - - parent_class = gtk_type_class (PARENT_TYPE); - - object_class->set_property = eab_view_set_property; - object_class->get_property = eab_view_get_property; - object_class->dispose = eab_view_dispose; - - g_object_class_install_property (object_class, PROP_BOOK, - g_param_spec_object ("book", - _("Book"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_BOOK, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_SOURCE, - g_param_spec_object ("source", - _("Source"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_SOURCE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_QUERY, - g_param_spec_string ("query", - _("Query"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_TYPE, - g_param_spec_int ("type", - _("Type"), - /*_( */"XXX blurb" /*)*/, - EAB_VIEW_NONE, - EAB_VIEW_TABLE, - EAB_VIEW_NONE, - G_PARAM_READWRITE)); - - eab_view_signals [STATUS_MESSAGE] = - g_signal_new ("status_message", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABViewClass, status_message), - NULL, NULL, - eab_marshal_NONE__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - - eab_view_signals [SEARCH_RESULT] = - g_signal_new ("search_result", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABViewClass, search_result), - NULL, NULL, - eab_marshal_NONE__INT, - G_TYPE_NONE, 1, G_TYPE_INT); - - eab_view_signals [FOLDER_BAR_MESSAGE] = - g_signal_new ("folder_bar_message", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABViewClass, folder_bar_message), - NULL, NULL, - eab_marshal_NONE__POINTER, - G_TYPE_NONE, 1, G_TYPE_POINTER); - - eab_view_signals [COMMAND_STATE_CHANGE] = - g_signal_new ("command_state_change", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EABViewClass, command_state_change), - NULL, NULL, - eab_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - if (!clipboard_atom) - clipboard_atom = gdk_atom_intern ("CLIPBOARD", FALSE); - - /* init the accessibility support for e_addressbook_view */ - eab_view_a11y_init(); -} - -static void -eab_view_init (EABView *eav) -{ - eav->view_type = EAB_VIEW_NONE; - - eav->model = NULL; - eav->object = NULL; - eav->widget = NULL; - eav->contact_display_window = NULL; - eav->contact_display = NULL; - eav->displayed_contact = -1; - - eav->view_instance = NULL; - eav->view_menus = NULL; - eav->current_view = NULL; - eav->uic = NULL; - - eav->book = NULL; - eav->source = NULL; - eav->query = NULL; - - eav->invisible = NULL; - eav->clipboard_contacts = NULL; -} - -static void -eab_view_dispose (GObject *object) -{ - EABView *eav = EAB_VIEW(object); - - if (eav->model) { - g_signal_handlers_disconnect_matched (eav->model, - G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, - object); - g_object_unref (eav->model); - eav->model = NULL; - } - - if (eav->book) { - g_object_unref (eav->book); - eav->book = NULL; - } - - if (eav->source) { - g_object_unref (eav->source); - eav->source = NULL; - } - - if (eav->query) { - g_free(eav->query); - eav->query = NULL; - } - - eav->uic = NULL; - - if (eav->view_instance) { - g_object_unref (eav->view_instance); - eav->view_instance = NULL; - } - - if (eav->view_menus) { - g_object_unref (eav->view_menus); - eav->view_menus = NULL; - } - - if (eav->clipboard_contacts) { - g_list_foreach (eav->clipboard_contacts, (GFunc)g_object_unref, NULL); - g_list_free (eav->clipboard_contacts); - eav->clipboard_contacts = NULL; - } - - if (eav->invisible) { - gtk_widget_destroy (eav->invisible); - eav->invisible = NULL; - } - - if (eav->ecml_changed_id != 0) { - g_signal_handler_disconnect (get_master_list(), - eav->ecml_changed_id); - eav->ecml_changed_id = 0; - } - - if (G_OBJECT_CLASS(parent_class)->dispose) - G_OBJECT_CLASS(parent_class)->dispose(object); -} - -static void -set_paned_position (EABView *eav) -{ - GConfClient *gconf_client; - gint pos; - - /* XXX this should use the addressbook's global gconf client */ - gconf_client = gconf_client_get_default (); - pos = gconf_client_get_int (gconf_client, "/apps/evolution/addressbook/display/vpane_position", NULL); - if (pos < 1) - pos = 144; - - gtk_paned_set_position (GTK_PANED (eav->paned), pos); - - g_object_unref (gconf_client); -} - -static gboolean -get_paned_position (EABView *eav) -{ - GConfClient *gconf_client; - gint pos; - - /* XXX this should use the addressbook's global gconf client */ - gconf_client = gconf_client_get_default (); - - pos = gtk_paned_get_position (GTK_PANED (eav->paned)); - gconf_client_set_int (gconf_client, "/apps/evolution/addressbook/display/vpane_position", pos, NULL); - - g_object_unref (gconf_client); - - return FALSE; -} - -GtkWidget* -eab_view_new (void) -{ - GtkWidget *widget = GTK_WIDGET (g_object_new (E_TYPE_AB_VIEW, NULL)); - EABView *eav = EAB_VIEW (widget); - FilterPart *part; - - /* create our model */ - eav->model = eab_model_new (); - - g_signal_connect (eav->model, "status_message", - G_CALLBACK (status_message), eav); - g_signal_connect (eav->model, "search_result", - G_CALLBACK (search_result), eav); - g_signal_connect (eav->model, "folder_bar_message", - G_CALLBACK (folder_bar_message), eav); - g_signal_connect (eav->model, "stop_state_changed", - G_CALLBACK (stop_state_changed), eav); - g_signal_connect (eav->model, "writable_status", - G_CALLBACK (writable_status), eav); - g_signal_connect (eav->model, "backend_died", - G_CALLBACK (backend_died), eav); - g_signal_connect (eav->model, "contact_changed", - G_CALLBACK (contact_changed), eav); - g_signal_connect (eav->model, "contact_removed", - G_CALLBACK (contact_removed), eav); - - eav->editable = FALSE; - eav->query = g_strdup (SHOW_ALL_SEARCH); - - /* create our search bar */ - eav->search = E_SEARCH_BAR (e_search_bar_new (NULL, addressbook_search_option_items)); - e_search_bar_set_menu (eav->search, addressbook_search_items); - make_suboptions (eav); - connect_master_list_changed (eav); - g_signal_connect (eav->search, "query_changed", - G_CALLBACK (query_changed), eav); - g_signal_connect (eav->search, "search_activated", - G_CALLBACK (search_activated), eav); - g_signal_connect (eav->search, "menu_activated", - G_CALLBACK (search_menu_activated), eav); - gtk_box_pack_start (GTK_BOX (eav), GTK_WIDGET (eav->search), FALSE, FALSE, 0); - gtk_widget_show (GTK_WIDGET (eav->search)); - gtk_widget_set_sensitive (GTK_WIDGET (eav->search), FALSE); - - /* create the search context */ - eav->search_context = rule_context_new (); - rule_context_add_part_set (eav->search_context, "partset", filter_part_get_type (), - rule_context_add_part, rule_context_next_part); - rule_context_load (eav->search_context, SEARCH_RULE_DIR "/addresstypes.xml", ""); - - eav->search_rule = filter_rule_new (); - part = rule_context_next_part (eav->search_context, NULL); - - if (part == NULL) - g_warning ("Could not load addressbook search; no parts."); - else - filter_rule_add_part (eav->search_rule, filter_part_clone (part)); - - /* create the paned window and contact display */ - eav->paned = gtk_vpaned_new (); - gtk_box_pack_start (GTK_BOX (eav), eav->paned, TRUE, TRUE, 0); - g_signal_connect_swapped (eav->paned, "button_release_event", - G_CALLBACK (get_paned_position), eav); - - eav->contact_display = eab_contact_display_new (); - eav->contact_display_window = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (eav->contact_display_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (eav->contact_display_window), GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (eav->contact_display_window), eav->contact_display); - gtk_paned_add2 (GTK_PANED (eav->paned), eav->contact_display_window); - gtk_widget_show (eav->contact_display); - gtk_widget_show (eav->contact_display_window); - gtk_widget_show (eav->paned); - - /* gtk selection crap */ - eav->invisible = gtk_invisible_new (); - - gtk_selection_add_target (eav->invisible, - clipboard_atom, - GDK_SELECTION_TYPE_STRING, - 0); - - g_signal_connect (eav->invisible, "selection_get", - G_CALLBACK (selection_get), - eav); - g_signal_connect (eav->invisible, "selection_clear_event", - G_CALLBACK (selection_clear_event), - eav); - g_signal_connect (eav->invisible, "selection_received", - G_CALLBACK (selection_received), - eav); - g_object_weak_ref (G_OBJECT (eav->invisible), invisible_destroyed, eav); - - return widget; -} - -RuleContext * -eab_view_peek_search_context (EABView *view) -{ - return view->search_context; -} - -FilterRule * -eab_view_peek_search_rule (EABView *view) -{ - return view->search_rule; -} - -static void -writable_status (GtkObject *object, gboolean writable, EABView *eav) -{ - eav->editable = writable; - command_state_change (eav); -} - -static void -init_collection (void) -{ - GalViewFactory *factory; - ETableSpecification *spec; - char *galview; - - if (collection == NULL) { - collection = gal_view_collection_new(); - - gal_view_collection_set_title (collection, _("Address Book")); - - galview = gnome_util_prepend_user_home("/.evolution/addressbook/views"); - gal_view_collection_set_storage_directories - (collection, - EVOLUTION_GALVIEWSDIR "/addressbook/", - galview); - g_free(galview); - - spec = e_table_specification_new(); - e_table_specification_load_from_file (spec, EVOLUTION_ETSPECDIR "/e-addressbook-view.etspec"); - - factory = gal_view_factory_etable_new (spec); - g_object_unref (spec); - gal_view_collection_add_factory (collection, factory); - g_object_unref (factory); - - factory = gal_view_factory_minicard_new(); - gal_view_collection_add_factory (collection, factory); - g_object_unref (factory); - -#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - factory = gal_view_factory_treeview_new (); - gal_view_collection_add_factory (collection, factory); - g_object_unref (factory); -#endif - - gal_view_collection_load(collection); - } -} - -static void -set_view_preview (EABView *view) -{ - /* XXX this should use the addressbook's global gconf client */ - GConfClient *gconf_client; - gboolean state; - - gconf_client = gconf_client_get_default(); - state = gconf_client_get_bool(gconf_client, "/apps/evolution/addressbook/display/show_preview", NULL); - bonobo_ui_component_set_prop (view->uic, - "/commands/ContactsViewPreview", - "state", - state ? "1" : "0", NULL); - - eab_view_show_contact_preview (view, state); - - g_object_unref (gconf_client); -} - -static void -display_view(GalViewInstance *instance, - GalView *view, - gpointer data) -{ - EABView *address_view = data; - if (GAL_IS_VIEW_ETABLE(view)) { - change_view_type (address_view, EAB_VIEW_TABLE); - gal_view_etable_attach_table (GAL_VIEW_ETABLE(view), e_table_scrolled_get_table(E_TABLE_SCROLLED(address_view->widget))); - } - else if (GAL_IS_VIEW_MINICARD(view)) { - change_view_type (address_view, EAB_VIEW_MINICARD); - gal_view_minicard_attach (GAL_VIEW_MINICARD (view), E_MINICARD_VIEW_WIDGET (address_view->object)); - } -#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - else if (GAL_IS_VIEW_TREEVIEW (view)) { - change_view_type (address_view, EAB_VIEW_TREEVIEW); - gal_view_treeview_attach (GAL_VIEW_TREEVIEW(view), GTK_TREE_VIEW (address_view->object)); - } -#endif - address_view->current_view = view; - - set_paned_position (address_view); - set_view_preview (address_view); -} - -static void -view_preview(BonoboUIComponent *uic, const char *path, Bonobo_UIComponent_EventType type, const char *state, void *data) -{ - /* XXX this should use the addressbook's global gconf client */ - GConfClient *gconf_client; - EABView *view = EAB_VIEW (data); - - if (type != Bonobo_UIComponent_STATE_CHANGED) - return; - - gconf_client = gconf_client_get_default(); - gconf_client_set_bool(gconf_client, "/apps/evolution/addressbook/display/show_preview", state[0] != '0', NULL); - - eab_view_show_contact_preview(view, state[0] != '0'); - - g_object_unref (gconf_client); -} - -static void -setup_menus (EABView *view) -{ - if (view->book && view->view_instance == NULL) { - init_collection (); - view->view_instance = gal_view_instance_new (collection, e_book_get_uri (view->book)); - } - - if (view->view_instance && view->uic) { - view->view_menus = gal_view_menus_new(view->view_instance); - gal_view_menus_apply(view->view_menus, view->uic, NULL); - - display_view (view->view_instance, gal_view_instance_get_current_view (view->view_instance), view); - - g_signal_connect(view->view_instance, "display_view", - G_CALLBACK (display_view), view); - } - - bonobo_ui_component_add_listener(view->uic, "ContactsViewPreview", view_preview, view); - - set_view_preview (view); -} - -static void -eab_view_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) -{ - EABView *eav = EAB_VIEW(object); - - switch (prop_id){ - case PROP_BOOK: - if (eav->book) { - g_object_unref (eav->book); - } - if (g_value_get_object (value)) { - eav->book = E_BOOK(g_value_get_object (value)); - g_object_ref (eav->book); - gtk_widget_set_sensitive (GTK_WIDGET (eav->search), TRUE); - } - else { - eav->book = NULL; - gtk_widget_set_sensitive (GTK_WIDGET (eav->search), FALSE); - } - - if (eav->view_instance) { - g_object_unref (eav->view_instance); - eav->view_instance = NULL; - } - - g_object_set(eav->model, - "book", eav->book, - NULL); - - setup_menus (eav); - - break; - case PROP_SOURCE: - if (eav->source) { - g_warning ("EABView at present does not support multiple writes on the \"source\" property."); - break; - } - else { - if (g_value_get_object (value)) { - eav->source = E_SOURCE(g_value_get_object (value)); - g_object_ref (eav->source); - } - else { - eav->source = NULL; - } - } - break; - case PROP_QUERY: -#if 0 /* This code will mess up ldap a bit. We need to think about the ramifications of this more. */ - if ((g_value_get_string (value) == NULL && !strcmp (eav->query, SHOW_ALL_SEARCH)) || - (g_value_get_string (value) != NULL && !strcmp (eav->query, g_value_get_string (value)))) - break; -#endif - g_free(eav->query); - eav->query = g_strdup(g_value_get_string (value)); - if (!eav->query) - eav->query = g_strdup (SHOW_ALL_SEARCH); - g_object_set(eav->model, - "query", eav->query, - NULL); - break; - case PROP_TYPE: - change_view_type(eav, g_value_get_int (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -eab_view_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) -{ - EABView *eav = EAB_VIEW(object); - - switch (prop_id) { - case PROP_BOOK: - if (eav->book) - g_value_set_object (value, eav->book); - else - g_value_set_object (value, NULL); - break; - case PROP_SOURCE: - if (eav->source) - g_value_set_object (value, eav->source); - else - g_value_set_object (value, NULL); - break; - - case PROP_QUERY: - g_value_set_string (value, eav->query); - break; - case PROP_TYPE: - g_value_set_int (value, eav->view_type); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static ESelectionModel* -get_selection_model (EABView *view) -{ - if (view->view_type == EAB_VIEW_TABLE) - return e_table_get_selection_model (e_table_scrolled_get_table (E_TABLE_SCROLLED(view->widget))); - else if (view->view_type == EAB_VIEW_MINICARD) - return e_minicard_view_widget_get_selection_model (E_MINICARD_VIEW_WIDGET(view->object)); -#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - else if (view->view_type == EAB_VIEW_TREEVIEW) - return e_treeview_get_selection_model (GTK_TREE_VIEW (view->object)); -#endif - g_return_val_if_reached (NULL); -} - -/* Popup menu stuff */ -typedef struct { - EABView *view; - gpointer closure; -} ContactAndBook; - -static ESelectionModel* -contact_and_book_get_selection_model (ContactAndBook *contact_and_book) -{ - return get_selection_model (contact_and_book->view); -} - -static GList * -get_contact_list (EABPopupTargetSelect *t) -{ - GList *list = NULL; - int i; - - for (i=0;i<t->cards->len;i++) - list = g_list_prepend(list, t->cards->pdata[i]); - - return list; -} - -static void -save_as (EPopup *ep, EPopupItem *pitem, void *data) -{ - /*ContactAndBook *contact_and_book = data;*/ - GList *contacts = get_contact_list ((EABPopupTargetSelect *)ep->target); - - if (contacts) { - eab_contact_list_save(_("Save as VCard..."), contacts, NULL); - g_list_free(contacts); - } -} - -static void -send_as (EPopup *ep, EPopupItem *pitem, void *data) -{ - /*ContactAndBook *contact_and_book = data;*/ - GList *contacts = get_contact_list ((EABPopupTargetSelect *)ep->target); - - if (contacts) { - eab_send_contact_list(contacts, EAB_DISPOSITION_AS_ATTACHMENT); - g_list_free(contacts); - } -} - -static void -send_to (EPopup *ep, EPopupItem *pitem, void *data) -{ - /*ContactAndBook *contact_and_book = data;*/ - GList *contacts = get_contact_list ((EABPopupTargetSelect *)ep->target); - - if (contacts) { - eab_send_contact_list(contacts, EAB_DISPOSITION_AS_TO); - g_list_free(contacts); - } -} - -static void -print (EPopup *ep, EPopupItem *pitem, void *data) -{ - /*ContactAndBook *contact_and_book = data;*/ - EABPopupTargetSelect *t = (EABPopupTargetSelect *)ep->target; - - if (t->cards->len == 1) { - gtk_widget_show(e_contact_print_contact_dialog_new(t->cards->pdata[0])); - } else { - GList *contacts = get_contact_list(t); - - gtk_widget_show(e_contact_print_contact_list_dialog_new(contacts)); - g_list_free(contacts); - } -} - -static void -copy (EPopup *ep, EPopupItem *pitem, void *data) -{ - ContactAndBook *contact_and_book = data; - - eab_view_copy (contact_and_book->view); -} - -static void -paste (EPopup *ep, EPopupItem *pitem, void *data) -{ - ContactAndBook *contact_and_book = data; - - eab_view_paste (contact_and_book->view); -} - -static void -cut (EPopup *ep, EPopupItem *pitem, void *data) -{ - ContactAndBook *contact_and_book = data; - - eab_view_cut (contact_and_book->view); -} - -static void -delete (EPopup *ep, EPopupItem *pitem, void *data) -{ - ContactAndBook *contact_and_book = data; - - eab_view_delete_selection(contact_and_book->view); -} - -static void -copy_to_folder (EPopup *ep, EPopupItem *pitem, void *data) -{ - ContactAndBook *contact_and_book = data; - - eab_view_copy_to_folder (contact_and_book->view); -} - -static void -move_to_folder (EPopup *ep, EPopupItem *pitem, void *data) -{ - ContactAndBook *contact_and_book = data; - - eab_view_move_to_folder (contact_and_book->view); -} - -static void -new_card (EPopup *ep, EPopupItem *pitem, void *data) -{ - /*ContactAndBook *contact_and_book = data;*/ - EContact *contact = e_contact_new(); - - eab_show_contact_editor (((EABPopupTargetSelect *)ep->target)->book, contact, TRUE, TRUE); - g_object_unref (contact); -} - -static void -new_list (EPopup *ep, EPopupItem *pitem, void *data) -{ - /*ContactAndBook *contact_and_book = data;*/ - EContact *contact = e_contact_new (); - - eab_show_contact_list_editor (((EABPopupTargetSelect *)ep->target)->book, contact, TRUE, TRUE); - g_object_unref(contact); -} - -static EPopupItem eabv_popup_items[] = { - { E_POPUP_ITEM, "10.new", N_("New Contact..."), new_card, NULL, "stock_contact", 0, EAB_POPUP_SELECT_EDITABLE}, - { E_POPUP_ITEM, "15.newlist", N_("New Contact List..."), new_list, NULL, "stock_contact-list", 0, EAB_POPUP_SELECT_EDITABLE }, - - { E_POPUP_BAR, "20.bar" }, - { E_POPUP_ITEM, "30.saveas", N_("Save as VCard..."), save_as, NULL, "stock_save-as", 0, EAB_POPUP_SELECT_ANY }, - { E_POPUP_ITEM, "40.forward", N_("Forward Contact"), send_as, NULL, "stock_mail-forward", 0, EAB_POPUP_SELECT_ANY }, - { E_POPUP_ITEM, "50.mailto", N_("Send Message to Contact"), send_to, NULL, "stock_mail-send", 0, EAB_POPUP_SELECT_ANY|EAB_POPUP_SELECT_EMAIL }, - { E_POPUP_ITEM, "60.print", N_("Print"), print, NULL, "stock_print", 0, EAB_POPUP_SELECT_ANY }, - - { E_POPUP_BAR, "70.bar" }, - { E_POPUP_ITEM, "80.copyto", N_("Copy to Address Book..."), copy_to_folder, NULL, NULL, 0, EAB_POPUP_SELECT_ANY }, - { E_POPUP_ITEM, "90.moveto", N_("Move to Address Book..."), move_to_folder, NULL, NULL, 0, EAB_POPUP_SELECT_ANY|EAB_POPUP_SELECT_EDITABLE }, - - { E_POPUP_BAR, "a0.bar" }, - { E_POPUP_BAR, "b0.cut", N_("Cut"), cut, NULL, "stock_cut", 0, EAB_POPUP_SELECT_ANY|EAB_POPUP_SELECT_EDITABLE }, - { E_POPUP_ITEM, "c0.copy", N_("Copy"), copy, NULL, "stock_copy", 0, EAB_POPUP_SELECT_ANY }, - { E_POPUP_ITEM, "d0.paste", N_("Paste"), paste, NULL, "stock_paste", 0, EAB_POPUP_SELECT_EDITABLE }, - { E_POPUP_ITEM, "e0.delete", N_("Delete"), delete, NULL, "stock_delete", 0, EAB_POPUP_SELECT_EDITABLE|EAB_POPUP_SELECT_ANY }, -}; - -static void -get_card_1(gint model_row, void *data) -{ - ContactAndBook *contact_and_book = data; - EContact *contact; - - contact = eab_model_get_contact(contact_and_book->view->model, model_row); - if (contact) - g_ptr_array_add((GPtrArray *)contact_and_book->closure, contact); -} - -static void -eabv_popup_free(EPopup *ep, GSList *list, void *data) -{ - ContactAndBook *cab = data; - ESelectionModel *selection; - - /* NB: this looks strange to me */ - selection = contact_and_book_get_selection_model(cab); - if (selection) - e_selection_model_right_click_up(selection); - - g_slist_free(list); - g_object_unref(cab->view); - g_free(cab); -} - -static void -do_popup_menu(EABView *view, GdkEvent *event) -{ - EABPopup *ep; - EABPopupTargetSelect *t; - GSList *menus = NULL; - int i; - GtkMenu *menu; - GPtrArray *cards = g_ptr_array_new(); - ContactAndBook *contact_and_book; - ESelectionModel *selection_model; - - contact_and_book = g_new(ContactAndBook, 1); - contact_and_book->view = view; - g_object_ref(contact_and_book->view); - - selection_model = contact_and_book_get_selection_model(contact_and_book); - if (selection_model) { - contact_and_book->closure = cards; - e_selection_model_foreach(selection_model, get_card_1, contact_and_book); - } - - ep = eab_popup_new("com.novell.evolution.addressbook.view.popup"); - t = eab_popup_target_new_select(ep, view->book, !eab_model_editable(view->model), cards); - t->target.widget = (GtkWidget *)view; - - for (i=0;i<sizeof(eabv_popup_items)/sizeof(eabv_popup_items[0]);i++) - menus = g_slist_prepend(menus, &eabv_popup_items[i]); - - e_popup_add_items((EPopup *)ep, menus, eabv_popup_free, contact_and_book); - - menu = e_popup_create_menu_once((EPopup *)ep, (EPopupTarget *)t, 0); - gtk_menu_popup(menu, NULL, NULL, NULL, NULL, event?event->button.button:0, event?event->button.time:gtk_get_current_event_time()); -} - -static void -render_contact (int row, EABView *view) -{ - EContact *contact = eab_model_get_contact (view->model, row); - - view->displayed_contact = row; - - eab_contact_display_render (EAB_CONTACT_DISPLAY (view->contact_display), contact, - EAB_CONTACT_DISPLAY_RENDER_NORMAL); -} - -static void -selection_changed (GObject *o, EABView *view) -{ - ESelectionModel *selection_model; - - command_state_change (view); - - selection_model = get_selection_model (view); - - if (e_selection_model_selected_count (selection_model) == 1) - e_selection_model_foreach (selection_model, - (EForeachFunc)render_contact, view); - else { - view->displayed_contact = -1; - eab_contact_display_render (EAB_CONTACT_DISPLAY (view->contact_display), NULL, - EAB_CONTACT_DISPLAY_RENDER_NORMAL); - } - -} - -static void -table_double_click(ETableScrolled *table, gint row, gint col, GdkEvent *event, EABView *view) -{ - if (E_IS_ADDRESSBOOK_TABLE_ADAPTER(view->object)) { - EABModel *model = view->model; - EContact *contact = eab_model_get_contact (model, row); - EBook *book; - - g_object_get(model, - "book", &book, - NULL); - - g_assert (E_IS_BOOK (book)); - - if (e_contact_get (contact, E_CONTACT_IS_LIST)) - eab_show_contact_list_editor (book, contact, FALSE, view->editable); - else - eab_show_contact_editor (book, contact, FALSE, view->editable); - - g_object_unref (book); - g_object_unref (contact); - } -} - -static gint -table_right_click(ETableScrolled *table, gint row, gint col, GdkEvent *event, EABView *view) -{ - do_popup_menu(view, event); - return TRUE; -} - -static gint -table_white_space_event(ETableScrolled *table, GdkEvent *event, EABView *view) -{ - if (event->type == GDK_BUTTON_PRESS && ((GdkEventButton *)event)->button == 3) { - do_popup_menu(view, event); - return TRUE; - } else { - return FALSE; - } -} - -static void -table_drag_data_get (ETable *table, - int row, - int col, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint info, - guint time, - gpointer user_data) -{ - EABView *view = user_data; - GList *contact_list; - - if (!E_IS_ADDRESSBOOK_TABLE_ADAPTER(view->object)) - return; - - contact_list = get_selected_contacts (view); - - switch (info) { - case DND_TARGET_TYPE_VCARD: { - char *value; - - value = eab_contact_list_to_string (contact_list); - - gtk_selection_data_set (selection_data, - selection_data->target, - 8, - value, strlen (value)); - break; - } - case DND_TARGET_TYPE_SOURCE_VCARD: { - char *value; - - value = eab_book_and_contact_list_to_string (view->book, contact_list); - - gtk_selection_data_set (selection_data, - selection_data->target, - 8, - value, strlen (value)); - break; - } - } - - g_list_foreach (contact_list, (GFunc) g_object_unref, NULL); - g_list_free (contact_list); -} - -static void -emit_status_message (EABView *eav, const gchar *status) -{ - g_signal_emit (eav, - eab_view_signals [STATUS_MESSAGE], 0, - status); -} - -static void -emit_search_result (EABView *eav, EBookViewStatus status) -{ - g_signal_emit (eav, - eab_view_signals [SEARCH_RESULT], 0, - status); -} - -static void -emit_folder_bar_message (EABView *eav, const gchar *message) -{ - g_signal_emit (eav, - eab_view_signals [FOLDER_BAR_MESSAGE], 0, - message); -} - -static void -status_message (GtkObject *object, const gchar *status, EABView *eav) -{ - emit_status_message (eav, status); -} - -static void -search_result (GtkObject *object, EBookViewStatus status, EABView *eav) -{ - emit_search_result (eav, status); -} - -static void -folder_bar_message (GtkObject *object, const gchar *status, EABView *eav) -{ - emit_folder_bar_message (eav, status); -} - -static void -stop_state_changed (GtkObject *object, EABView *eav) -{ - command_state_change (eav); -} - -static void -command_state_change (EABView *eav) -{ - /* Reffing during emission is unnecessary. Gtk automatically refs during an emission. */ - g_signal_emit (eav, eab_view_signals [COMMAND_STATE_CHANGE], 0); -} - -static void -backend_died (GtkObject *object, EABView *eav) -{ - e_error_run (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (eav))), - "addressbook:backend-died", e_book_get_uri (eav->book), NULL); -} - -static void -contact_changed (EABModel *model, gint index, EABView *eav) -{ - if (eav->displayed_contact == index) { - /* if the contact that's presently displayed is changed, re-render it */ - render_contact (index, eav); - } -} - -static void -contact_removed (EABModel *model, gint index, EABView *eav) -{ - if (eav->displayed_contact == index) { - /* if the contact that's presently displayed is changed, clear the display */ - eab_contact_display_render (EAB_CONTACT_DISPLAY (eav->contact_display), NULL, - EAB_CONTACT_DISPLAY_RENDER_NORMAL); - eav->displayed_contact = -1; - } -} - -static void -minicard_right_click (EMinicardView *minicard_view_item, GdkEvent *event, EABView *view) -{ - do_popup_menu(view, event); -} - -static void -create_minicard_view (EABView *view) -{ - GtkWidget *scrolled_window; - GtkWidget *minicard_view; - EAddressbookReflowAdapter *adapter; - - adapter = E_ADDRESSBOOK_REFLOW_ADAPTER(e_addressbook_reflow_adapter_new (view->model)); - minicard_view = e_minicard_view_widget_new(adapter); - - g_signal_connect(minicard_view, "selection_change", - G_CALLBACK(selection_changed), view); - - g_signal_connect(minicard_view, "right_click", - G_CALLBACK(minicard_right_click), view); - - scrolled_window = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - - view->object = G_OBJECT(minicard_view); - view->widget = scrolled_window; - - gtk_container_add (GTK_CONTAINER (scrolled_window), minicard_view); - gtk_widget_show (minicard_view); - - gtk_widget_show_all( GTK_WIDGET(scrolled_window) ); - - gtk_paned_add1 (GTK_PANED (view->paned), scrolled_window); - - e_reflow_model_changed (E_REFLOW_MODEL (adapter)); -} - -static void -create_table_view (EABView *view) -{ - ETableModel *adapter; - GtkWidget *table; - - adapter = eab_table_adapter_new(view->model); - - /* Here we create the table. We give it the three pieces of - the table we've created, the header, the model, and the - initial layout. It does the rest. */ - table = e_table_scrolled_new_from_spec_file (adapter, NULL, EVOLUTION_ETSPECDIR "/e-addressbook-view.etspec", NULL); - - view->object = G_OBJECT(adapter); - view->widget = table; - - g_signal_connect(e_table_scrolled_get_table(E_TABLE_SCROLLED(table)), "double_click", - G_CALLBACK(table_double_click), view); - g_signal_connect(e_table_scrolled_get_table(E_TABLE_SCROLLED(table)), "right_click", - G_CALLBACK(table_right_click), view); - g_signal_connect(e_table_scrolled_get_table(E_TABLE_SCROLLED(table)), "white_space_event", - G_CALLBACK(table_white_space_event), view); - g_signal_connect(e_table_scrolled_get_table(E_TABLE_SCROLLED(table)), "selection_change", - G_CALLBACK(selection_changed), view); - - /* drag & drop signals */ - e_table_drag_source_set (E_TABLE(E_TABLE_SCROLLED(table)->table), GDK_BUTTON1_MASK, - drag_types, num_drag_types, GDK_ACTION_MOVE | GDK_ACTION_COPY); - - g_signal_connect (E_TABLE_SCROLLED(table)->table, - "table_drag_data_get", - G_CALLBACK (table_drag_data_get), - view); - - gtk_paned_add1 (GTK_PANED (view->paned), table); - - gtk_widget_show( GTK_WIDGET(table) ); -} - -#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW -static void -treeview_row_activated(GtkTreeView *treeview, - GtkTreePath *path, GtkTreeViewColumn *column, - EABView *view) -{ - EABModel *model = view->model; - int row = gtk_tree_path_get_indices (path)[0]; - ECard *card = eab_model_get_card(model, row); - EBook *book; - - g_object_get(model, - "book", &book, - NULL); - - g_assert (E_IS_BOOK (book)); - - if (e_card_evolution_list (card)) - eab_show_contact_list_editor (book, card, FALSE, view->editable); - else - eab_show_contact_editor (book, card, FALSE, view->editable); - - g_object_unref (book); - g_object_unref (card); -} - -static void -create_treeview_view (EABView *view) -{ - GtkTreeModel *adapter; - ECardSimple *simple; - GtkWidget *treeview; - GtkWidget *scrolled; - int i; - - simple = e_card_simple_new(NULL); - - adapter = eab_treeview_adapter_new(view->model); - - scrolled = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow (GTK_SCROLLED_WINDOW (scrolled), GTK_SHADOW_IN); - treeview = gtk_tree_view_new_with_model (adapter); - - gtk_widget_show (treeview); - - gtk_container_add (GTK_CONTAINER (scrolled), treeview); - - for (i = 0; i < 15; i ++) { - GtkTreeViewColumn *column = - gtk_tree_view_column_new_with_attributes (e_card_simple_get_name (simple, i), - gtk_cell_renderer_text_new (), - "text", i, - NULL); - - gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column); - } - - view->object = G_OBJECT(treeview); - view->widget = scrolled; - - gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)), GTK_SELECTION_MULTIPLE); - gtk_tree_view_enable_model_drag_source (GTK_TREE_VIEW (treeview), - GDK_BUTTON1_MASK, - drag_types, - num_drag_types, - GDK_ACTION_MOVE); - - g_signal_connect(treeview, "row_activated", - G_CALLBACK (treeview_row_activated), view); -#if 0 - g_signal_connect(e_table_scrolled_get_table(E_TABLE_SCROLLED(table)), "right_click", - G_CALLBACK(table_right_click), view); - - /* drag & drop signals */ - e_table_drag_source_set (E_TABLE(E_TABLE_SCROLLED(table)->table), GDK_BUTTON1_MASK, - drag_types, num_drag_types, GDK_ACTION_MOVE); - - g_signal_connect (E_TABLE_SCROLLED(table)->table, - "table_drag_data_get", - G_CALLBACK (table_drag_data_get), - view); -#endif - - - g_signal_connect(e_treeview_get_selection_model (GTK_TREE_VIEW (treeview)), "selection_changed", - G_CALLBACK(selection_changed), view); - - gtk_paned_add1 (GTK_PANED (view->paned), scrolled); - - gtk_widget_show( GTK_WIDGET(scrolled) ); - - g_object_unref (simple); -} -#endif - -static void -change_view_type (EABView *view, EABViewType view_type) -{ - if (view_type == view->view_type) - return; - - if (view->widget) { - gtk_container_remove (GTK_CONTAINER (view->paned), view->widget); - view->widget = NULL; - } - view->object = NULL; - - switch (view_type) { - case EAB_VIEW_TABLE: - create_table_view (view); - break; - case EAB_VIEW_MINICARD: - create_minicard_view (view); - break; -#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - case EAB_VIEW_TREEVIEW: - create_treeview_view (view); - break; -#endif - default: - g_warning ("view_type not recognized."); - return; - } - - view->view_type = view_type; - - command_state_change (view); -} - - - -static void -search_activated (ESearchBar *esb, EABView *v) -{ - ECategoriesMasterList *master_list; - char *search_word, *search_query; - const char *category_name; - int search_type, subid; - - g_message ("in search_activated"); - - g_object_get(esb, - "text", &search_word, - "item_id", &search_type, - NULL); - - if (search_type == ESB_ADVANCED) { - gtk_widget_show(eab_search_dialog_new(v)); - } - else { - if ((search_word && strlen (search_word)) || search_type == ESB_CATEGORY) { - GString *s = g_string_new (""); - e_sexp_encode_string (s, search_word); - switch (search_type) { - case ESB_ANY: - search_query = g_strdup_printf ("(contains \"x-evolution-any-field\" %s)", - s->str); - break; - case ESB_FULL_NAME: - search_query = g_strdup_printf ("(beginswith \"full_name\" %s)", - s->str); - break; - case ESB_EMAIL: - search_query = g_strdup_printf ("(beginswith \"email\" %s)", - s->str); - break; - case ESB_CATEGORY: - subid = e_search_bar_get_subitem_id (esb); - - if (subid < 0 || subid == G_MAXINT) { - /* match everything */ - search_query = g_strdup ("(contains \"x-evolution-any-field\" \"\")"); - } else { - master_list = get_master_list (); - category_name = e_categories_master_list_nth (master_list, subid); - search_query = g_strdup_printf ("(is \"category_list\" \"%s\")", category_name); - } - break; - default: - search_query = g_strdup ("(contains \"x-evolution-any-field\" \"\")"); - break; - } - g_string_free (s, TRUE); - } else - search_query = g_strdup ("(contains \"x-evolution-any-field\" \"\")"); - - if (search_query) - g_object_set (v, - "query", search_query, - NULL); - - g_free (search_query); - } - - g_free (search_word); -} - -static void -search_menu_activated (ESearchBar *esb, int id, EABView *view) -{ - if (id == ESB_ADVANCED) - gtk_widget_show(eab_search_dialog_new(view)); -} - -static void -query_changed (ESearchBar *esb, EABView *view) -{ - int search_type; - - search_type = e_search_bar_get_item_id(esb); - if (search_type == ESB_ADVANCED) - gtk_widget_show(eab_search_dialog_new(view)); -} - -static int -compare_subitems (const void *a, const void *b) -{ - const ESearchBarSubitem *subitem_a = a; - const ESearchBarSubitem *subitem_b = b; - char *collate_a, *collate_b; - int ret; - - collate_a = g_utf8_collate_key (subitem_a->text, -1); - collate_b = g_utf8_collate_key (subitem_b->text, -1); - - ret = strcmp (collate_a, collate_b); - - g_free (collate_a); - g_free (collate_b); - - return ret; -} - -static void -make_suboptions (EABView *view) -{ - ESearchBarSubitem *subitems, *s; - ECategoriesMasterList *master_list; - gint i, N; - - master_list = get_master_list (); - N = e_categories_master_list_count (master_list); - subitems = g_new (ESearchBarSubitem, N+2); - - subitems[0].id = G_MAXINT; - subitems[0].text = g_strdup (_("Any Category")); - subitems[0].translate = FALSE; - - for (i=0; i<N; ++i) { - const char *category = e_categories_master_list_nth (master_list, i); - - subitems[i+1].id = i; - subitems[i+1].text = g_strdup (category); - subitems[i+1].translate = FALSE; - } - subitems[N+1].id = -1; - subitems[N+1].text = NULL; - - qsort (subitems + 1, N, sizeof (subitems[0]), compare_subitems); - - e_search_bar_set_suboption (view->search, ESB_CATEGORY, subitems); - - for (s = subitems; s->id != -1; s++) { - if (s->text) - g_free (s->text); - } - g_free (subitems); -} - -static void -ecml_changed (ECategoriesMasterList *ecml, EABView *view) -{ - make_suboptions (view); -} - -static ECategoriesMasterList * -get_master_list (void) -{ - static ECategoriesMasterList *category_list = NULL; - - if (category_list == NULL) - category_list = e_categories_master_list_wombat_new (); - return category_list; -} - -static void -connect_master_list_changed (EABView *view) -{ - view->ecml_changed_id = - g_signal_connect (get_master_list(), "changed", - G_CALLBACK (ecml_changed), view); -} - - - -typedef struct { - GtkWidget *table; - GObject *printable; -} EContactPrintDialogWeakData; - -static void -e_contact_print_destroy(gpointer data, GObject *where_object_was) -{ - EContactPrintDialogWeakData *weak_data = data; - g_object_unref (weak_data->printable); - g_object_unref (weak_data->table); - g_free (weak_data); -} - -static void -e_contact_print_button(GtkDialog *dialog, gint response, gpointer data) -{ - GnomePrintJob *master; - GnomePrintContext *pc; - EPrintable *printable = g_object_get_data(G_OBJECT(dialog), "printable"); - GtkWidget *preview; - switch( response ) { - case GNOME_PRINT_DIALOG_RESPONSE_PRINT: - master = gnome_print_job_new(gnome_print_dialog_get_config ( GNOME_PRINT_DIALOG(dialog) )); - pc = gnome_print_job_get_context( master ); - e_printable_reset(printable); - while (e_printable_data_left(printable)) { - gnome_print_beginpage (pc, "Contacts"); - if (gnome_print_gsave(pc) == -1) - /* FIXME */; - if (gnome_print_translate(pc, 72, 72) == -1) - /* FIXME */; - e_printable_print_page(printable, - pc, - 6.5 * 72, - 5 * 72, - TRUE); - if (gnome_print_grestore(pc) == -1) - /* FIXME */; - if (gnome_print_showpage(pc) == -1) - /* FIXME */; - } - gnome_print_job_close(master); - gnome_print_job_print(master); - g_object_unref (master); - gtk_widget_destroy((GtkWidget *)dialog); - break; - case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW: - master = gnome_print_job_new (gnome_print_dialog_get_config ( GNOME_PRINT_DIALOG(dialog) )); - pc = gnome_print_job_get_context( master ); - e_printable_reset(printable); - while (e_printable_data_left(printable)) { - gnome_print_beginpage (pc, "Contacts"); - if (gnome_print_gsave(pc) == -1) - /* FIXME */; - if (gnome_print_translate(pc, 72, 72) == -1) - /* FIXME */; - e_printable_print_page(printable, - pc, - 6.5 * 72, - 9 * 72, - TRUE); - if (gnome_print_grestore(pc) == -1) - /* FIXME */; - if (gnome_print_showpage(pc) == -1) - /* FIXME */; - } - gnome_print_job_close(master); - preview = GTK_WIDGET(gnome_print_job_preview_new(master, "Print Preview")); - gtk_widget_show_all(preview); - g_object_unref (master); - break; - case GNOME_PRINT_DIALOG_RESPONSE_CANCEL: - default: - gtk_widget_destroy((GtkWidget *)dialog); - break; - } -} - -void -eab_view_show_contact_preview (EABView *view, gboolean show) -{ - g_return_if_fail (view && E_IS_ADDRESSBOOK_VIEW (view)); - - if (show) - gtk_widget_show (view->contact_display_window); - else - gtk_widget_hide (view->contact_display_window); -} - -void -eab_view_setup_menus (EABView *view, - BonoboUIComponent *uic) -{ - - g_return_if_fail (view != NULL); - g_return_if_fail (E_IS_ADDRESSBOOK_VIEW (view)); - g_return_if_fail (uic != NULL); - g_return_if_fail (BONOBO_IS_UI_COMPONENT (uic)); - - init_collection (); - - view->uic = uic; - - setup_menus (view); - - /* XXX toshok - yeah this really doesn't belong here, but it - needs to happen at the same time and takes the uic */ - e_search_bar_set_ui_component (view->search, uic); -} - -/** - * eab_view_discard_menus: - * @view: An addressbook view. - * - * Makes an addressbook view discard its GAL view menus and its views instance - * objects. This should be called when the corresponding Bonobo component is - * deactivated. - **/ -void -eab_view_discard_menus (EABView *view) -{ - g_return_if_fail (view != NULL); - g_return_if_fail (E_IS_ADDRESSBOOK_VIEW (view)); - g_return_if_fail (view->view_instance); - - if (view->view_menus) { - gal_view_menus_unmerge (view->view_menus, NULL); - - g_object_unref (view->view_menus); - view->view_menus = NULL; - } - - if (view->view_instance) { - g_object_unref (view->view_instance); - view->view_instance = NULL; - } - - view->uic = NULL; -} - -void -eab_view_print(EABView *view) -{ - if (view->view_type == EAB_VIEW_MINICARD) { - char *query; - EBook *book; - GtkWidget *print; - - g_object_get (view->model, - "query", &query, - "book", &book, - NULL); - print = e_contact_print_dialog_new(book, query); - g_free(query); - gtk_widget_show_all(print); - } - else if (view->view_type == EAB_VIEW_TABLE) { - GtkWidget *dialog; - EPrintable *printable; - ETable *etable; - EContactPrintDialogWeakData *weak_data; - - dialog = gnome_print_dialog_new(NULL, "Print cards", GNOME_PRINT_DIALOG_RANGE | GNOME_PRINT_DIALOG_COPIES); - gnome_print_dialog_construct_range_any(GNOME_PRINT_DIALOG(dialog), GNOME_PRINT_RANGE_ALL | GNOME_PRINT_RANGE_SELECTION, - NULL, NULL, NULL); - - g_object_get(view->widget, "table", &etable, NULL); - printable = e_table_get_printable(etable); - g_object_ref (printable); - gtk_object_sink (GTK_OBJECT (printable)); - g_object_unref(etable); - g_object_ref (view->widget); - - g_object_set_data (G_OBJECT (dialog), "table", view->widget); - g_object_set_data (G_OBJECT (dialog), "printable", printable); - - g_signal_connect(dialog, - "response", G_CALLBACK(e_contact_print_button), NULL); - - weak_data = g_new (EContactPrintDialogWeakData, 1); - - weak_data->table = view->widget; - weak_data->printable = G_OBJECT (printable); - - g_object_weak_ref (G_OBJECT (dialog), e_contact_print_destroy, weak_data); - - gtk_widget_show(dialog); - } -#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - else if (view->view_type == EAB_VIEW_TREEVIEW) { - /* XXX */ - } -#endif -} - -void -eab_view_print_preview(EABView *view) -{ - if (view->view_type == EAB_VIEW_MINICARD) { - char *query; - EBook *book; - - g_object_get (view->model, - "query", &query, - "book", &book, - NULL); - e_contact_print_preview(book, query); - g_free(query); - } else if (view->view_type == EAB_VIEW_TABLE) { - EPrintable *printable; - ETable *etable; - GnomePrintJob *master; - GnomePrintContext *pc; - GnomePrintConfig *config; - GtkWidget *preview; - - g_object_get(view->widget, "table", &etable, NULL); - printable = e_table_get_printable(etable); - g_object_unref(etable); - g_object_ref (printable); - gtk_object_sink (GTK_OBJECT (printable)); - - master = gnome_print_job_new(NULL); - config = gnome_print_job_get_config (master); - gnome_print_config_set_int (config, GNOME_PRINT_KEY_NUM_COPIES, 1); - pc = gnome_print_job_get_context( master ); - e_printable_reset(printable); - while (e_printable_data_left(printable)) { - gnome_print_beginpage (pc, "Contacts"); - if (gnome_print_gsave(pc) == -1) - /* FIXME */; - if (gnome_print_translate(pc, 72, 72) == -1) - /* FIXME */; - e_printable_print_page(printable, - pc, - 6.5 * 72, - 9 * 72, - TRUE); - if (gnome_print_grestore(pc) == -1) - /* FIXME */; - if (gnome_print_showpage(pc) == -1) - /* FIXME */; - } - gnome_print_job_close(master); - preview = GTK_WIDGET(gnome_print_job_preview_new(master, "Print Preview")); - gtk_widget_show_all(preview); - g_object_unref (master); - g_object_unref (printable); - } -#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - else if (view->view_type == EAB_VIEW_TREEVIEW) { - /* XXX */ - } -#endif -} - -void -eab_view_delete_selection(EABView *view) -{ - GList *list, *l; - - if (!eab_editor_confirm_delete(GTK_WINDOW(gtk_widget_get_toplevel(view->widget)))) - return; - - list = get_selected_contacts(view); - if (e_book_check_static_capability (view->book, "bulk-remove")) { - GList *ids = NULL; - - for (l=list;l;l=g_list_next(l)) { - EContact *contact = l->data; - - ids = g_list_prepend (ids, (char*)e_contact_get_const (contact, E_CONTACT_UID)); - } - - /* Remove the cards all at once. */ - /* XXX no callback specified... ugh */ - e_book_async_remove_contacts (view->book, - ids, - NULL, - NULL); - - g_list_free (ids); - } - else { - for (l=list;l;l=g_list_next(l)) { - EContact *contact = l->data; - /* Remove the card. */ - /* XXX no callback specified... ugh */ - e_book_async_remove_contact (view->book, - contact, - NULL, - NULL); - } - } - - e_free_object_list(list); -} - -static void -invisible_destroyed (gpointer data, GObject *where_object_was) -{ - EABView *view = data; - view->invisible = NULL; -} - -static void -selection_get (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint info, - guint time_stamp, - EABView *view) -{ - char *value; - - value = eab_contact_list_to_string (view->clipboard_contacts); - - gtk_selection_data_set (selection_data, GDK_SELECTION_TYPE_STRING, - 8, value, strlen (value)); - -} - -static void -selection_clear_event (GtkWidget *invisible, - GdkEventSelection *event, - EABView *view) -{ - if (view->clipboard_contacts) { - g_list_foreach (view->clipboard_contacts, (GFunc)g_object_unref, NULL); - g_list_free (view->clipboard_contacts); - view->clipboard_contacts = NULL; - } -} - -static void -selection_received (GtkWidget *invisible, - GtkSelectionData *selection_data, - guint time, - EABView *view) -{ - if (selection_data->length <= 0 || selection_data->type != GDK_SELECTION_TYPE_STRING) { - return; - } else { - GList *contact_list; - GList *l; - char *str = NULL; - - if (selection_data->data [selection_data->length - 1] != 0) { - str = g_malloc0 (selection_data->length + 1); - memcpy (str, selection_data->data, selection_data->length); - contact_list = eab_contact_list_from_string (str); - } else - contact_list = eab_contact_list_from_string (selection_data->data); - - for (l = contact_list; l; l = l->next) { - EContact *contact = l->data; - - /* XXX NULL for a callback /sigh */ - eab_merging_book_add_contact (view->book, contact, NULL /* XXX */, NULL); - } - - g_list_foreach (contact_list, (GFunc)g_object_unref, NULL); - g_list_free (contact_list); - g_free (str); - } -} - -static void -add_to_list (int model_row, gpointer closure) -{ - GList **list = closure; - *list = g_list_prepend (*list, GINT_TO_POINTER (model_row)); -} - -static GList * -get_selected_contacts (EABView *view) -{ - GList *list; - GList *iterator; - ESelectionModel *selection = get_selection_model (view); - - list = NULL; - e_selection_model_foreach (selection, add_to_list, &list); - - for (iterator = list; iterator; iterator = iterator->next) { - iterator->data = eab_model_get_contact (view->model, GPOINTER_TO_INT (iterator->data)); - } - list = g_list_reverse (list); - return list; -} - -void -eab_view_save_as (EABView *view) -{ - GList *list = get_selected_contacts (view); - if (list) - eab_contact_list_save (_("Save as VCard..."), list, NULL); - e_free_object_list(list); -} - -void -eab_view_view (EABView *view) -{ - GList *list = get_selected_contacts (view); - eab_show_multiple_contacts (view->book, list, view->editable); - e_free_object_list(list); -} - -void -eab_view_send (EABView *view) -{ - GList *list = get_selected_contacts (view); - if (list) - eab_send_contact_list (list, EAB_DISPOSITION_AS_ATTACHMENT); - e_free_object_list(list); -} - -void -eab_view_send_to (EABView *view) -{ - GList *list = get_selected_contacts (view); - if (list) - eab_send_contact_list (list, EAB_DISPOSITION_AS_TO); - e_free_object_list(list); -} - -void -eab_view_cut (EABView *view) -{ - eab_view_copy (view); - eab_view_delete_selection (view); -} - -void -eab_view_copy (EABView *view) -{ - view->clipboard_contacts = get_selected_contacts (view); - - gtk_selection_owner_set (view->invisible, clipboard_atom, GDK_CURRENT_TIME); -} - -void -eab_view_paste (EABView *view) -{ - gtk_selection_convert (view->invisible, clipboard_atom, - GDK_SELECTION_TYPE_STRING, - GDK_CURRENT_TIME); -} - -void -eab_view_select_all (EABView *view) -{ - ESelectionModel *model = get_selection_model (view); - - g_return_if_fail (model); - - e_selection_model_select_all (model); -} - -void -eab_view_show_all(EABView *view) -{ - g_object_set(view, - "query", NULL, - NULL); -} - -void -eab_view_stop(EABView *view) -{ - if (view) - eab_model_stop (view->model); -} - -static void -view_transfer_contacts (EABView *view, gboolean delete_from_source) -{ - EBook *book; - GList *contacts; - GtkWindow *parent_window; - - g_object_get(view->model, - "book", &book, - NULL); - contacts = get_selected_contacts (view); - parent_window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))); - - eab_transfer_contacts (book, contacts, delete_from_source, parent_window); - g_object_unref(book); -} - -void -eab_view_copy_to_folder (EABView *view) -{ - view_transfer_contacts (view, FALSE); -} - -void -eab_view_move_to_folder (EABView *view) -{ - view_transfer_contacts (view, TRUE); -} - - -static gboolean -eab_view_selection_nonempty (EABView *view) -{ - ESelectionModel *selection_model; - - selection_model = get_selection_model (view); - if (selection_model == NULL) - return FALSE; - - return e_selection_model_selected_count (selection_model) != 0; -} - -gboolean -eab_view_can_create (EABView *view) -{ - return view ? eab_model_editable (view->model) : FALSE; -} - -gboolean -eab_view_can_print (EABView *view) -{ - return view && view->model ? eab_model_contact_count (view->model) : FALSE; -} - -gboolean -eab_view_can_save_as (EABView *view) -{ - return view ? eab_view_selection_nonempty (view) : FALSE; -} - -gboolean -eab_view_can_view (EABView *view) -{ - return view ? eab_view_selection_nonempty (view) : FALSE; -} - -gboolean -eab_view_can_send (EABView *view) -{ - return view ? eab_view_selection_nonempty (view) : FALSE; -} - -gboolean -eab_view_can_send_to (EABView *view) -{ - return view ? eab_view_selection_nonempty (view) : FALSE; -} - -gboolean -eab_view_can_delete (EABView *view) -{ - return view ? eab_view_selection_nonempty (view) && eab_model_editable (view->model) : FALSE; -} - -gboolean -eab_view_can_cut (EABView *view) -{ - return view ? eab_view_selection_nonempty (view) && eab_model_editable (view->model) : FALSE; -} - -gboolean -eab_view_can_copy (EABView *view) -{ - return view ? eab_view_selection_nonempty (view) : FALSE; -} - -gboolean -eab_view_can_paste (EABView *view) -{ - return view ? eab_model_editable (view->model) : FALSE; -} - -gboolean -eab_view_can_select_all (EABView *view) -{ - return view ? eab_model_contact_count (view->model) != 0 : FALSE; -} - -gboolean -eab_view_can_stop (EABView *view) -{ - return view ? eab_model_can_stop (view->model) : FALSE; -} - -gboolean -eab_view_can_copy_to_folder (EABView *view) -{ - return view ? eab_view_selection_nonempty (view) : FALSE; -} - -gboolean -eab_view_can_move_to_folder (EABView *view) -{ - return view ? eab_view_selection_nonempty (view) && eab_model_editable (view->model) : FALSE; -} - -EABMenuTargetSelect * -eab_view_get_menu_target (EABView *view, EABMenu *menu) -{ - GPtrArray *cards = g_ptr_array_new(); - ESelectionModel *selection_model; - EABMenuTargetSelect *t; - - selection_model = get_selection_model (view); - if (selection_model) { - ContactAndBook cab; - - cab.view = view; - cab.closure = cards; - e_selection_model_foreach(selection_model, get_card_1, &cab); - } - - t = eab_menu_target_new_select(menu, view->book, !eab_model_editable(view->model), cards); - t->target.widget = (GtkWidget *)view; - - return t; -} diff --git a/addressbook/gui/widgets/e-addressbook-view.etspec b/addressbook/gui/widgets/e-addressbook-view.etspec deleted file mode 100644 index caddf081f8..0000000000 --- a/addressbook/gui/widgets/e-addressbook-view.etspec +++ /dev/null @@ -1,58 +0,0 @@ -<ETableSpecification draw-grid="true" cursor-mode="line"> - <ETableColumn model_col= "2" _title="File As" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col= "3" _title="Full Name" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col= "4" _title="Given Name" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col= "5" _title="Family Name" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col= "6" _title="Nickname" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - - <ETableColumn model_col= "7" _title="Email" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col= "8" _title="Email 2" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col= "9" _title="Email 3" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - - <ETableColumn model_col= "15" _title="Assistant Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col= "16" _title="Business Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col= "17" _title="Business Phone 2" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="18" _title="Business Fax" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="19" _title="Callback Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="20" _title="Car Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="21" _title="Company Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="22" _title="Home Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="23" _title="Home Phone 2" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="24" _title="Home Fax" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="25" _title="ISDN Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="26" _title="Mobile Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="27" _title="Other Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="28" _title="Other Fax" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="29" _title="Pager" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="30" _title="Primary Phone" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="31" _title="Radio" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="32" _title="Telex" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="33" _title="TTYTDD" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - - <ETableColumn model_col="34" _title="Organization" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="35" _title="Unit" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="36" _title="Office" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="37" _title="Title" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="38" _title="Role" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="39" _title="Manager" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="40" _title="Assistant" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - - <ETableColumn model_col="41" _title="Web Site" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="42" _title="Journal" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - - <ETableColumn model_col="43" _title="Categories" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - - <ETableColumn model_col="48" _title="Spouse" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - <ETableColumn model_col="49" _title="Note" expansion="1.0" minimum_width="75" resizable="true" cell="string" compare="string"/> - - <ETableState> - <column source="0"/> - <column source="1"/> - <column source="5"/> - <column source="23"/> - <column source="36"/> - <grouping> - <leaf column="0" ascending="true"/> - </grouping> - </ETableState> -</ETableSpecification> diff --git a/addressbook/gui/widgets/e-addressbook-view.h b/addressbook/gui/widgets/e-addressbook-view.h deleted file mode 100644 index a55406915e..0000000000 --- a/addressbook/gui/widgets/e-addressbook-view.h +++ /dev/null @@ -1,164 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-addressbook-view.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __EAB_VIEW_H__ -#define __EAB_VIEW_H__ - -#include <gtk/gtkvbox.h> -#include <bonobo/bonobo-ui-component.h> -#include <gal/menus/gal-view-instance.h> -#include <libebook/e-book.h> -#include "e-addressbook-model.h" -#include "eab-contact-display.h" -#include "widgets/menus/gal-view-menus.h" -#include "widgets/misc/e-search-bar.h" -#include "widgets/misc/e-filter-bar.h" - -G_BEGIN_DECLS - -struct _EABMenu; -struct _EABMenuTargetSelect; - -/* EABView - A card displaying information about a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - */ - -#define E_TYPE_AB_VIEW (eab_view_get_type ()) -#define EAB_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_AB_VIEW, EABView)) -#define EAB_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_AB_VIEW, EABViewClass)) -#define E_IS_ADDRESSBOOK_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_AB_VIEW)) -#define E_IS_ADDRESSBOOK_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_AB_VIEW)) - -typedef enum { - EAB_VIEW_NONE, /* initialized to this */ - EAB_VIEW_MINICARD, - EAB_VIEW_TABLE, -#ifdef WITH_ADDRESSBOOK_VIEW_TREEVIEW - ,EAB_VIEW_TREEVIEW -#endif -} EABViewType; - - -typedef struct _EABView EABView; -typedef struct _EABViewClass EABViewClass; - -struct _EABView -{ - GtkVBox parent; - - /* item specific fields */ - EABViewType view_type; - - EABModel *model; - - GtkWidget *invisible; - GList *clipboard_contacts; - - EBook *book; - ESource *source; - char *query; - guint editable : 1; - - gint displayed_contact; - - GObject *object; - GtkWidget *widget; - - GtkWidget *contact_display_window; - GtkWidget *contact_display; - GtkWidget *paned; - - /* Menus handler and the view instance */ - GalViewInstance *view_instance; - GalViewMenus *view_menus; - GalView *current_view; - BonoboUIComponent *uic; - - /* the search bar and related machinery */ - ESearchBar *search; - gint ecml_changed_id; - RuleContext *search_context; - FilterRule *search_rule; -}; - -struct _EABViewClass -{ - GtkVBoxClass parent_class; - - /* - * Signals - */ - void (*status_message) (EABView *view, const gchar *message); - void (*search_result) (EABView *view, EBookViewStatus status); - void (*folder_bar_message) (EABView *view, const gchar *message); - void (*command_state_change) (EABView *view); -}; - -GtkWidget *eab_view_new (void); -GType eab_view_get_type (void); - -void eab_view_show_contact_preview (EABView *view, gboolean show); - -void eab_view_setup_menus (EABView *view, - BonoboUIComponent *uic); -void eab_view_discard_menus (EABView *view); - -RuleContext *eab_view_peek_search_context (EABView *view); -FilterRule *eab_view_peek_search_rule (EABView *view); - -void eab_view_save_as (EABView *view); -void eab_view_view (EABView *view); -void eab_view_send (EABView *view); -void eab_view_send_to (EABView *view); -void eab_view_print (EABView *view); -void eab_view_print_preview (EABView *view); -void eab_view_delete_selection (EABView *view); -void eab_view_cut (EABView *view); -void eab_view_copy (EABView *view); -void eab_view_paste (EABView *view); -void eab_view_select_all (EABView *view); -void eab_view_show_all (EABView *view); -void eab_view_stop (EABView *view); -void eab_view_copy_to_folder (EABView *view); -void eab_view_move_to_folder (EABView *view); - -gboolean eab_view_can_create (EABView *view); -gboolean eab_view_can_print (EABView *view); -gboolean eab_view_can_save_as (EABView *view); -gboolean eab_view_can_view (EABView *view); -gboolean eab_view_can_send (EABView *view); -gboolean eab_view_can_send_to (EABView *view); -gboolean eab_view_can_delete (EABView *view); -gboolean eab_view_can_cut (EABView *view); -gboolean eab_view_can_copy (EABView *view); -gboolean eab_view_can_paste (EABView *view); -gboolean eab_view_can_select_all (EABView *view); -gboolean eab_view_can_stop (EABView *view); -gboolean eab_view_can_copy_to_folder (EABView *view); -gboolean eab_view_can_move_to_folder (EABView *view); - -struct _EABMenuTargetSelect *eab_view_get_menu_target (EABView *view, struct _EABMenu *menu); - -G_END_DECLS; - -#endif /* __EAB_VIEW_H__ */ diff --git a/addressbook/gui/widgets/e-minicard-label.c b/addressbook/gui/widgets/e-minicard-label.c deleted file mode 100644 index df1465349e..0000000000 --- a/addressbook/gui/widgets/e-minicard-label.c +++ /dev/null @@ -1,508 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-minicard-label.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> - -#include "e-minicard-label.h" -#include "eab-marshal.h" - -#include <gtk/gtksignal.h> -#include <libgnomecanvas/gnome-canvas-rect-ellipse.h> -#include <libgnome/gnome-i18n.h> -#include <gal/util/e-util.h> -#include <gal/e-text/e-text.h> -#include <gal/widgets/e-canvas.h> -#include <gal/widgets/e-canvas-utils.h> -#include <gdk/gdkkeysyms.h> - -static void e_minicard_label_init (EMinicardLabel *card); -static void e_minicard_label_class_init (EMinicardLabelClass *klass); -static void e_minicard_label_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_minicard_label_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static gboolean e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event); -static void e_minicard_label_realize (GnomeCanvasItem *item); -static void e_minicard_label_unrealize (GnomeCanvasItem *item); -static void e_minicard_label_reflow(GnomeCanvasItem *item, int flags); -static void e_minicard_label_style_set (EMinicardLabel *label, GtkStyle *previous_style); - -static void e_minicard_label_resize_children( EMinicardLabel *e_minicard_label ); - -static void set_colors (EMinicardLabel *label); - -static GnomeCanvasGroupClass *parent_class = NULL; - -/* The arguments we take */ -enum { - PROP_0, - PROP_WIDTH, - PROP_HEIGHT, - PROP_HAS_FOCUS, - PROP_FIELD, - PROP_FIELDNAME, - PROP_TEXT_MODEL, - PROP_MAX_FIELD_NAME_WIDTH, - PROP_EDITABLE -}; - -enum { - STYLE_SET, - LAST_SIGNAL -}; - -static guint e_minicard_label_signals [LAST_SIGNAL] = {0, }; - -GType -e_minicard_label_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (EMinicardLabelClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_minicard_label_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EMinicardLabel), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_minicard_label_init, - }; - - type = g_type_register_static (gnome_canvas_group_get_type (), "EMinicardLabel", &info, 0); - } - - return type; -} - -static void -e_minicard_label_class_init (EMinicardLabelClass *klass) -{ - GObjectClass *object_class; - GnomeCanvasItemClass *item_class; - - object_class = G_OBJECT_CLASS (klass); - item_class = (GnomeCanvasItemClass *) klass; - - klass->style_set = e_minicard_label_style_set; - - parent_class = g_type_class_peek_parent (klass); - - object_class->set_property = e_minicard_label_set_property; - object_class->get_property = e_minicard_label_get_property; - /* object_class->destroy = e_minicard_label_destroy; */ - - g_object_class_install_property (object_class, PROP_WIDTH, - g_param_spec_double ("width", - _("Width"), - /*_( */"XXX blurb" /*)*/, - 0.0, G_MAXDOUBLE, 10.0, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_HEIGHT, - g_param_spec_double ("height", - _("Height"), - /*_( */"XXX blurb" /*)*/, - 0.0, G_MAXDOUBLE, 10.0, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_HAS_FOCUS, - g_param_spec_boolean ("has_focus", - _("Has Focus"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_FIELD, - g_param_spec_string ("field", - _("Field"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_FIELDNAME, - g_param_spec_string ("fieldname", - _("Field Name"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_TEXT_MODEL, - g_param_spec_object ("text_model", - _("Text Model"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_TEXT_MODEL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_MAX_FIELD_NAME_WIDTH, - g_param_spec_double ("max_field_name_length", - _("Max field name length"), - /*_( */"XXX blurb" /*)*/, - -1.0, G_MAXDOUBLE, -1.0, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EDITABLE, - g_param_spec_boolean ("editable", - _("Editable"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - e_minicard_label_signals [STYLE_SET] = - g_signal_new ("style_set", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EMinicardLabelClass, style_set), - NULL, NULL, - eab_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, - GTK_TYPE_STYLE); - - /* GnomeCanvasItem method overrides */ - item_class->realize = e_minicard_label_realize; - item_class->unrealize = e_minicard_label_unrealize; - item_class->event = e_minicard_label_event; -} - -static void -e_minicard_label_init (EMinicardLabel *minicard_label) -{ - minicard_label->width = 10; - minicard_label->height = 10; - minicard_label->rect = NULL; - minicard_label->fieldname = NULL; - minicard_label->field = NULL; - - minicard_label->max_field_name_length = -1; - - e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(minicard_label), e_minicard_label_reflow); -} - -static void -e_minicard_label_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) -{ - EMinicardLabel *e_minicard_label; - GnomeCanvasItem *item; - - e_minicard_label = E_MINICARD_LABEL (object); - item = GNOME_CANVAS_ITEM (object); - - switch (prop_id){ - case PROP_WIDTH: - e_minicard_label->width = g_value_get_double (value); - e_minicard_label_resize_children(e_minicard_label); - e_canvas_item_request_reflow (item); - break; - case PROP_HAS_FOCUS: - if (e_minicard_label->field && (g_value_get_boolean (value) != E_FOCUS_NONE)) - e_canvas_item_grab_focus(e_minicard_label->field, FALSE); - break; - case PROP_FIELD: - gnome_canvas_item_set( e_minicard_label->field, "text", g_value_get_string (value), NULL ); - break; - case PROP_FIELDNAME: - gnome_canvas_item_set( e_minicard_label->fieldname, "text", g_value_get_string (value), NULL ); - break; - case PROP_TEXT_MODEL: - gnome_canvas_item_set( e_minicard_label->field, "model", g_value_get_object (value), NULL); - break; - case PROP_MAX_FIELD_NAME_WIDTH: - e_minicard_label->max_field_name_length = g_value_get_double (value); - break; - case PROP_EDITABLE: - e_minicard_label->editable = g_value_get_boolean (value); - g_object_set (e_minicard_label->field, "editable", FALSE /* e_minicard_label->editable */, NULL); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_minicard_label_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) -{ - EMinicardLabel *e_minicard_label; - - e_minicard_label = E_MINICARD_LABEL (object); - - switch (prop_id) { - case PROP_WIDTH: - g_value_set_double (value, e_minicard_label->width); - break; - case PROP_HEIGHT: - g_value_set_double (value, e_minicard_label->height); - break; - case PROP_HAS_FOCUS: - g_value_set_boolean (value, e_minicard_label->has_focus ? E_FOCUS_CURRENT : E_FOCUS_NONE); - break; - case PROP_FIELD: - g_object_get_property (G_OBJECT (e_minicard_label->field), - "text", value); - break; - case PROP_FIELDNAME: - g_object_get_property (G_OBJECT (e_minicard_label->fieldname), - "text", value); - break; - case PROP_TEXT_MODEL: - g_object_get_property (G_OBJECT (e_minicard_label->field), - "model", value); - break; - case PROP_MAX_FIELD_NAME_WIDTH: - g_value_set_double (value, e_minicard_label->max_field_name_length); - break; - case PROP_EDITABLE: - g_value_set_boolean (value, e_minicard_label->editable); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_minicard_label_realize (GnomeCanvasItem *item) -{ - EMinicardLabel *e_minicard_label; - GnomeCanvasGroup *group; - - e_minicard_label = E_MINICARD_LABEL (item); - group = GNOME_CANVAS_GROUP( item ); - - if (GNOME_CANVAS_ITEM_CLASS( parent_class )->realize) - (* GNOME_CANVAS_ITEM_CLASS( parent_class )->realize) (item); - - e_canvas_item_request_reflow(item); - - e_minicard_label->rect = - gnome_canvas_item_new( group, - gnome_canvas_rect_get_type(), - "x1", (double) 0, - "y1", (double) 0, - "x2", (double) e_minicard_label->width - 1, - "y2", (double) e_minicard_label->height - 1, - "outline_color", NULL, - NULL ); - e_minicard_label->fieldname = - gnome_canvas_item_new( group, - e_text_get_type(), - "anchor", GTK_ANCHOR_NW, - "clip_width", (double) ( e_minicard_label->width / 2 - 4 ), - "clip", TRUE, - "use_ellipsis", TRUE, - "fill_color", "black", - "draw_background", FALSE, - "im_context", E_CANVAS (item->canvas)->im_context, - NULL ); - e_canvas_item_move_absolute(e_minicard_label->fieldname, 2, 1); - - e_minicard_label->field = - gnome_canvas_item_new( group, - e_text_get_type(), - "anchor", GTK_ANCHOR_NW, - "clip_width", (double) ( ( e_minicard_label->width + 1 ) / 2 - 4 ), - "clip", TRUE, - "use_ellipsis", TRUE, - "fill_color", "black", - "editable", FALSE, /* e_minicard_label->editable, */ - "draw_background", FALSE, - "im_context", E_CANVAS (item->canvas)->im_context, - NULL ); - e_canvas_item_move_absolute(e_minicard_label->field, ( e_minicard_label->width / 2 + 2), 1); - - set_colors (e_minicard_label); - - e_canvas_item_request_reflow(item); -} - -static void -e_minicard_label_unrealize (GnomeCanvasItem *item) -{ - EMinicardLabel *e_minicard_label; - - e_minicard_label = E_MINICARD_LABEL (item); - - if (GNOME_CANVAS_ITEM_CLASS( parent_class )->unrealize) - (* GNOME_CANVAS_ITEM_CLASS( parent_class )->unrealize) (item); -} - -static gboolean -e_minicard_label_event (GnomeCanvasItem *item, GdkEvent *event) -{ - EMinicardLabel *e_minicard_label; - - e_minicard_label = E_MINICARD_LABEL (item); - - switch( event->type ) { - case GDK_KEY_PRESS: - if (event->key.keyval == GDK_Escape) { - GnomeCanvasItem *parent; - - e_text_cancel_editing (E_TEXT (e_minicard_label->field)); - - parent = GNOME_CANVAS_ITEM (e_minicard_label)->parent; - if (parent) - e_canvas_item_grab_focus(parent, FALSE); - } - break; - case GDK_FOCUS_CHANGE: { - GdkEventFocus *focus_event = (GdkEventFocus *) event; - - e_minicard_label->has_focus = focus_event->in; - set_colors (e_minicard_label); - - g_object_set (e_minicard_label->field, - "handle_popup", e_minicard_label->has_focus, - NULL); - break; - } - case GDK_BUTTON_PRESS: - case GDK_BUTTON_RELEASE: - case GDK_MOTION_NOTIFY: - case GDK_ENTER_NOTIFY: - case GDK_LEAVE_NOTIFY: { - gboolean return_val; - g_signal_emit_by_name(e_minicard_label->field, "event", event, &return_val); - return return_val; - } - default: - break; - } - - if (GNOME_CANVAS_ITEM_CLASS( parent_class )->event) - return (* GNOME_CANVAS_ITEM_CLASS( parent_class )->event) (item, event); - else - return 0; -} - -static void -e_minicard_label_resize_children(EMinicardLabel *e_minicard_label) -{ - double left_width; - if (e_minicard_label->max_field_name_length != -1 && ((e_minicard_label->width / 2) - 4 > e_minicard_label->max_field_name_length)) - left_width = e_minicard_label->max_field_name_length; - else - left_width = e_minicard_label->width / 2 - 4; - - gnome_canvas_item_set( e_minicard_label->fieldname, - "clip_width", (double) MAX ( left_width, 0 ), - NULL ); - gnome_canvas_item_set( e_minicard_label->field, - "clip_width", (double) MAX ( e_minicard_label->width - 8 - left_width, 0 ), - NULL ); -} - -static void -set_colors (EMinicardLabel *label) -{ - if ( (GTK_OBJECT_FLAGS( label ) & GNOME_CANVAS_ITEM_REALIZED) ) { - GtkWidget *canvas = GTK_WIDGET (GNOME_CANVAS_ITEM (label)->canvas); - GtkStyle *style = gtk_widget_get_style (canvas); - if (label->has_focus) { - gnome_canvas_item_set (label->rect, - "outline_color_gdk", &style->mid[GTK_STATE_SELECTED], - "fill_color_gdk", &style->bg[GTK_STATE_NORMAL], - NULL); - - gnome_canvas_item_set (label->field, - "fill_color_gdk", &canvas->style->text[GTK_STATE_NORMAL], - NULL); - - gnome_canvas_item_set (label->fieldname, - "fill_color_gdk", &canvas->style->text[GTK_STATE_NORMAL], - NULL); - } - else { - gnome_canvas_item_set (label->rect, - "outline_color_gdk", NULL, - "fill_color_gdk", NULL, - NULL); - - gnome_canvas_item_set (label->field, - "fill_color_gdk", &canvas->style->text[GTK_STATE_NORMAL], - NULL); - - gnome_canvas_item_set (label->fieldname, - "fill_color_gdk", &canvas->style->text[GTK_STATE_NORMAL], - NULL); - } - } -} - -static void -e_minicard_label_style_set (EMinicardLabel *label, GtkStyle *previous_style) -{ - set_colors (label); -} - -static void -e_minicard_label_reflow(GnomeCanvasItem *item, int flags) -{ - EMinicardLabel *e_minicard_label = E_MINICARD_LABEL(item); - - gint old_height; - gdouble text_height; - gdouble left_width; - - old_height = e_minicard_label->height; - - g_object_get(e_minicard_label->fieldname, - "text_height", &text_height, - NULL); - - e_minicard_label->height = text_height; - - - g_object_get(e_minicard_label->field, - "text_height", &text_height, - NULL); - - if (e_minicard_label->height < text_height) - e_minicard_label->height = text_height; - e_minicard_label->height += 3; - - gnome_canvas_item_set( e_minicard_label->rect, - "x2", (double) e_minicard_label->width - 1, - "y2", (double) e_minicard_label->height - 1, - NULL ); - - gnome_canvas_item_set( e_minicard_label->fieldname, - "clip_height", (double) e_minicard_label->height - 3, - NULL ); - - if (e_minicard_label->max_field_name_length != -1 && ((e_minicard_label->width / 2) - 4 > e_minicard_label->max_field_name_length)) - left_width = e_minicard_label->max_field_name_length; - else - left_width = e_minicard_label->width / 2 - 4; - - e_canvas_item_move_absolute(e_minicard_label->field, left_width + 6, 1); - - if (old_height != e_minicard_label->height) - e_canvas_item_request_parent_reflow(item); -} - -GnomeCanvasItem * -e_minicard_label_new(GnomeCanvasGroup *parent) -{ - GnomeCanvasItem *item = gnome_canvas_item_new(parent, e_minicard_label_get_type(), NULL); - return item; -} - diff --git a/addressbook/gui/widgets/e-minicard-label.h b/addressbook/gui/widgets/e-minicard-label.h deleted file mode 100644 index d914cb30bb..0000000000 --- a/addressbook/gui/widgets/e-minicard-label.h +++ /dev/null @@ -1,86 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-minicard-label.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_MINICARD_LABEL_H__ -#define __E_MINICARD_LABEL_H__ - -#include <glib.h> -#include <libgnomecanvas/gnome-canvas.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -/* EMinicardLabel - A label doing focus with non-marching ants. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - * width double RW width of the label - * height double R height of the label - * field string RW text in the field label - * fieldname string RW text in the fieldname label - */ - -#define E_TYPE_MINICARD_LABEL (e_minicard_label_get_type ()) -#define E_MINICARD_LABEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MINICARD_LABEL, EMinicardLabel)) -#define E_MINICARD_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MINICARD_LABEL, EMiniCardLabelClass)) -#define E_IS_MINICARD_LABEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MINICARD_LABEL)) -#define E_IS_MINICARD_LABEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MINICARD_LABEL)) - - -typedef struct _EMinicardLabel EMinicardLabel; -typedef struct _EMinicardLabelClass EMinicardLabelClass; - -struct _EMinicardLabel -{ - GnomeCanvasGroup parent; - - /* item specific fields */ - double width; - double height; - double max_field_name_length; - guint editable : 1; - GnomeCanvasItem *fieldname; - GnomeCanvasItem *field; - GnomeCanvasItem *rect; - - gboolean has_focus; -}; - -struct _EMinicardLabelClass -{ - GnomeCanvasGroupClass parent_class; - - void (* style_set) (EMinicardLabel *label, GtkStyle *previous_style); -}; - - -GType e_minicard_label_get_type (void); -GnomeCanvasItem *e_minicard_label_new(GnomeCanvasGroup *parent); -void e_minicard_label_construct (GnomeCanvasItem *item); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __E_MINICARD_LABEL_H__ */ diff --git a/addressbook/gui/widgets/e-minicard-view-widget.c b/addressbook/gui/widgets/e-minicard-view-widget.c deleted file mode 100644 index ff1bdc1f06..0000000000 --- a/addressbook/gui/widgets/e-minicard-view-widget.c +++ /dev/null @@ -1,440 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-minicard-view-widget.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> - -#include <gtk/gtksignal.h> -#include <gal/widgets/e-canvas-background.h> -#include <gal/widgets/e-canvas.h> -#include <libgnome/gnome-i18n.h> - -#include "eab-marshal.h" -#include "e-minicard-view-widget.h" - -static void e_minicard_view_widget_init (EMinicardViewWidget *widget); -static void e_minicard_view_widget_class_init (EMinicardViewWidgetClass *klass); -static void e_minicard_view_widget_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_minicard_view_widget_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void e_minicard_view_widget_dispose (GObject *object); -static void e_minicard_view_widget_reflow (ECanvas *canvas); -static void e_minicard_view_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation); -static void e_minicard_view_widget_style_set (GtkWidget *widget, GtkStyle *previous_style); -static void e_minicard_view_widget_realize (GtkWidget *widget); - -static ECanvasClass *parent_class = NULL; - -/* The arguments we take */ -enum { - PROP_0, - PROP_BOOK, - PROP_QUERY, - PROP_EDITABLE, - PROP_COLUMN_WIDTH -}; - -enum { - SELECTION_CHANGE, - COLUMN_WIDTH_CHANGED, - RIGHT_CLICK, - LAST_SIGNAL -}; - -static guint signals [LAST_SIGNAL] = {0, }; - -GType -e_minicard_view_widget_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (EMinicardViewWidgetClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_minicard_view_widget_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EMinicardViewWidget), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_minicard_view_widget_init, - }; - - type = g_type_register_static (e_canvas_get_type (), "EMinicardViewWidget", &info, 0); - } - - return type; -} - -static void -e_minicard_view_widget_class_init (EMinicardViewWidgetClass *klass) -{ - GObjectClass *object_class; - GtkWidgetClass *widget_class; - ECanvasClass *canvas_class; - - object_class = (GObjectClass*) klass; - widget_class = GTK_WIDGET_CLASS (klass); - canvas_class = E_CANVAS_CLASS (klass); - - parent_class = gtk_type_class (e_canvas_get_type ()); - - object_class->set_property = e_minicard_view_widget_set_property; - object_class->get_property = e_minicard_view_widget_get_property; - object_class->dispose = e_minicard_view_widget_dispose; - - g_object_class_install_property (object_class, PROP_BOOK, - g_param_spec_object ("book", - _("Book"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_BOOK, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_QUERY, - g_param_spec_string ("query", - _("Query"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EDITABLE, - g_param_spec_boolean ("editable", - _("Editable"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_COLUMN_WIDTH, - g_param_spec_double ("column_width", - _("Column Width"), - /*_( */"XXX blurb" /*)*/, - 0.0, G_MAXDOUBLE, 150.0, - G_PARAM_READWRITE)); - - signals [SELECTION_CHANGE] = - g_signal_new ("selection_change", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EMinicardViewWidgetClass, selection_change), - NULL, NULL, - eab_marshal_NONE__NONE, - G_TYPE_NONE, 0); - - signals [COLUMN_WIDTH_CHANGED] = - g_signal_new ("column_width_changed", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EMinicardViewWidgetClass, column_width_changed), - NULL, NULL, - eab_marshal_NONE__DOUBLE, - G_TYPE_NONE, 1, G_TYPE_DOUBLE); - - signals [RIGHT_CLICK] = - g_signal_new ("right_click", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EMinicardViewWidgetClass, right_click), - NULL, NULL, - eab_marshal_INT__POINTER, - G_TYPE_INT, 1, G_TYPE_POINTER); - - widget_class->style_set = e_minicard_view_widget_style_set; - widget_class->realize = e_minicard_view_widget_realize; - widget_class->size_allocate = e_minicard_view_widget_size_allocate; - - canvas_class->reflow = e_minicard_view_widget_reflow; - - klass->selection_change = NULL; - klass->column_width_changed = NULL; - klass->right_click = NULL; -} - -static void -e_minicard_view_widget_init (EMinicardViewWidget *view) -{ - view->emv = NULL; - - view->book = NULL; - view->query = NULL; - view->editable = FALSE; - view->column_width = 150; -} - -GtkWidget * -e_minicard_view_widget_new (EAddressbookReflowAdapter *adapter) -{ - EMinicardViewWidget *widget = E_MINICARD_VIEW_WIDGET (g_object_new (e_minicard_view_widget_get_type (), NULL)); - - widget->adapter = adapter; - g_object_ref (widget->adapter); - - return GTK_WIDGET (widget); -} - -static void -e_minicard_view_widget_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - EMinicardViewWidget *emvw; - - emvw = E_MINICARD_VIEW_WIDGET (object); - - switch (prop_id){ - case PROP_BOOK: - if (emvw->book) - g_object_unref (emvw->book); - if (g_value_get_object (value)) { - emvw->book = E_BOOK(g_value_get_object (value)); - if (emvw->book) - g_object_ref(emvw->book); - } else - emvw->book = NULL; - if (emvw->emv) - g_object_set(emvw->emv, - "book", emvw->book, - NULL); - break; - case PROP_QUERY: - emvw->query = g_strdup(g_value_get_string (value)); - if (emvw->emv) - g_object_set(emvw->emv, - "query", emvw->query, - NULL); - break; - case PROP_EDITABLE: - emvw->editable = g_value_get_boolean (value); - if (emvw->emv) - g_object_set (emvw->emv, - "editable", emvw->editable, - NULL); - break; - case PROP_COLUMN_WIDTH: - emvw->column_width = g_value_get_double (value); - if (emvw->emv) { - g_object_set (emvw->emv, - "column_width", emvw->column_width, - NULL); - } - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_minicard_view_widget_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - EMinicardViewWidget *emvw; - - emvw = E_MINICARD_VIEW_WIDGET (object); - - switch (prop_id) { - case PROP_BOOK: - g_value_set_object (value, emvw->book); - break; - case PROP_QUERY: - g_value_set_string (value, emvw->query); - break; - case PROP_EDITABLE: - g_value_set_boolean (value, emvw->editable); - break; - case PROP_COLUMN_WIDTH: - g_value_set_double (value, emvw->column_width); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_minicard_view_widget_dispose (GObject *object) -{ - EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(object); - - if (view->book) { - g_object_unref (view->book); - view->book = NULL; - } - if (view->query) { - g_free(view->query); - view->query = NULL; - } - - if (view->adapter) { - g_object_unref (view->adapter); - view->adapter = NULL; - } - - if (G_OBJECT_CLASS(parent_class)->dispose) - G_OBJECT_CLASS(parent_class)->dispose (object); -} - -static void -selection_change (ESelectionModel *esm, EMinicardViewWidget *widget) -{ - g_signal_emit (widget, - signals [SELECTION_CHANGE], 0); -} - -static void -selection_row_change (ESelectionModel *esm, int row, EMinicardViewWidget *widget) -{ - gboolean selected = e_selection_model_is_row_selected (esm, row); - - /* we only handle the selected case here */ - if (!selected) - return; - - selection_change (esm, widget); -} - -static void -column_width_changed (ESelectionModel *esm, double width, EMinicardViewWidget *widget) -{ - g_signal_emit (widget, - signals [COLUMN_WIDTH_CHANGED], 0, width); -} - -static guint -right_click (EMinicardView *view, GdkEvent *event, EMinicardViewWidget *widget) -{ - guint ret_val; - g_signal_emit (widget, - signals [RIGHT_CLICK], 0, - event, &ret_val); - return ret_val; -} - -static void -e_minicard_view_widget_style_set (GtkWidget *widget, GtkStyle *previous_style) -{ - EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(widget); - - if (view->background) - gnome_canvas_item_set (view->background, - "fill_color_gdk", &widget->style->base[GTK_STATE_NORMAL], - NULL ); - - if (GTK_WIDGET_CLASS(parent_class)->style_set) - GTK_WIDGET_CLASS(parent_class)->style_set (widget, previous_style); -} - - -static void -e_minicard_view_widget_realize (GtkWidget *widget) -{ - EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(widget); - GtkStyle *style = gtk_widget_get_style (widget); - - view->background = gnome_canvas_item_new(gnome_canvas_root( GNOME_CANVAS(view) ), - e_canvas_background_get_type(), - "fill_color_gdk", &style->base[GTK_STATE_NORMAL], - NULL ); - - view->emv = gnome_canvas_item_new( - gnome_canvas_root( GNOME_CANVAS(view) ), - e_minicard_view_get_type(), - "height", (double) 100, - "minimum_width", (double) 100, - "adapter", view->adapter, - "column_width", view->column_width, - NULL ); - - g_signal_connect (E_REFLOW(view->emv)->selection, - "selection_changed", - G_CALLBACK (selection_change), view); - g_signal_connect (E_REFLOW(view->emv)->selection, - "selection_row_changed", - G_CALLBACK (selection_row_change), view); - g_signal_connect (view->emv, - "column_width_changed", - G_CALLBACK (column_width_changed), view); - g_signal_connect (view->emv, - "right_click", - G_CALLBACK (right_click), view); - - if (GTK_WIDGET_CLASS(parent_class)->realize) - GTK_WIDGET_CLASS(parent_class)->realize (widget); -} - -static void -e_minicard_view_widget_size_allocate(GtkWidget *widget, GtkAllocation *allocation) -{ - if (GTK_WIDGET_CLASS(parent_class)->size_allocate) - GTK_WIDGET_CLASS(parent_class)->size_allocate (widget, allocation); - - if (GTK_WIDGET_REALIZED(widget)) { - double width; - EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(widget); - - gnome_canvas_item_set( view->emv, - "height", (double) allocation->height, - NULL ); - gnome_canvas_item_set( view->emv, - "minimum_width", (double) allocation->width, - NULL ); - g_object_get(view->emv, - "width", &width, - NULL); - width = MAX(width, allocation->width); - gnome_canvas_set_scroll_region (GNOME_CANVAS (view), 0, 0, width - 1, allocation->height - 1); - } -} - -static void -e_minicard_view_widget_reflow(ECanvas *canvas) -{ - double width; - EMinicardViewWidget *view = E_MINICARD_VIEW_WIDGET(canvas); - - if (E_CANVAS_CLASS(parent_class)->reflow) - E_CANVAS_CLASS(parent_class)->reflow (canvas); - - g_object_get(view->emv, - "width", &width, - NULL); - width = MAX(width, GTK_WIDGET(canvas)->allocation.width); - gnome_canvas_set_scroll_region(GNOME_CANVAS(canvas), 0, 0, width - 1, GTK_WIDGET(canvas)->allocation.height - 1); -} - -ESelectionModel * -e_minicard_view_widget_get_selection_model (EMinicardViewWidget *view) -{ - if (view->emv) - return E_SELECTION_MODEL (E_REFLOW (view->emv)->selection); - else - return NULL; -} - -EMinicardView * -e_minicard_view_widget_get_view (EMinicardViewWidget *view) -{ - if (view->emv) - return E_MINICARD_VIEW (view->emv); - else - return NULL; -} diff --git a/addressbook/gui/widgets/e-minicard-view-widget.h b/addressbook/gui/widgets/e-minicard-view-widget.h deleted file mode 100644 index ef8401b88c..0000000000 --- a/addressbook/gui/widgets/e-minicard-view-widget.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-minicard-view-widget.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_MINICARD_VIEW_WIDGET_H__ -#define __E_MINICARD_VIEW_WIDGET_H__ - -#include <gal/widgets/e-canvas.h> -#include <libebook/e-book.h> -#include "e-minicard-view.h" - -G_BEGIN_DECLS - -#define E_TYPE_MINICARD_VIEW_WIDGET (e_minicard_view_widget_get_type ()) -#define E_MINICARD_VIEW_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MINICARD_VIEW_WIDGET, EMinicardViewWidget)) -#define E_MINICARD_VIEW_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MINICARD_VIEW_WIDGET, EMinicardViewWidgetClass)) -#define E_IS_MINICARD_VIEW_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MINICARD_VIEW_WIDGET)) -#define E_IS_MINICARD_VIEW_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MINICARD_VIEW_WIDGET)) - - -typedef struct _EMinicardViewWidget EMinicardViewWidget; -typedef struct _EMinicardViewWidgetClass EMinicardViewWidgetClass; - -struct _EMinicardViewWidget -{ - ECanvas parent; - - GnomeCanvasItem *background; - GnomeCanvasItem *emv; - - EAddressbookReflowAdapter *adapter; - - EBook *book; - char *query; - guint editable : 1; - - double column_width; -}; - -struct _EMinicardViewWidgetClass -{ - ECanvasClass parent_class; - void (*selection_change) (EMinicardViewWidget *emvw); - void (*column_width_changed) (EMinicardViewWidget *emvw, double width); - guint (*right_click) (EMinicardViewWidget *emvw); -}; - - -GType e_minicard_view_widget_get_type (void); -GtkWidget *e_minicard_view_widget_new (EAddressbookReflowAdapter *adapter); - -/* Get parts of the view widget. */ -ESelectionModel *e_minicard_view_widget_get_selection_model (EMinicardViewWidget *view); -EMinicardView *e_minicard_view_widget_get_view (EMinicardViewWidget *view); - -G_END_DECLS - -#endif /* __E_MINICARD_VIEW_WIDGET_H__ */ diff --git a/addressbook/gui/widgets/e-minicard-view.c b/addressbook/gui/widgets/e-minicard-view.c deleted file mode 100644 index 6cae674c98..0000000000 --- a/addressbook/gui/widgets/e-minicard-view.c +++ /dev/null @@ -1,609 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-minicard-view.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> - -#include "e-minicard-view.h" - -#include "eab-gui-util.h" -#include "eab-marshal.h" -#include "util/eab-book-util.h" - -#include <gtk/gtkselection.h> -#include <gtk/gtkdnd.h> -#include <gal/widgets/e-canvas.h> -#include <libgnome/gnome-i18n.h> -#include <string.h> - -static void e_minicard_view_drag_data_get(GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint info, - guint time, - EMinicardView *view); - -static EReflowClass *parent_class = NULL; -#define PARENT_TYPE (E_REFLOW_TYPE) - -/* The arguments we take */ -enum { - PROP_0, - PROP_ADAPTER, - PROP_BOOK, - PROP_QUERY, - PROP_EDITABLE -}; - - -enum { - RIGHT_CLICK, - LAST_SIGNAL -}; - -static guint signals [LAST_SIGNAL] = {0, }; - -enum DndTargetType { - DND_TARGET_TYPE_VCARD_LIST, - DND_TARGET_TYPE_SOURCE_VCARD_LIST -}; -#define VCARD_LIST_TYPE "text/x-vcard" -#define SOURCE_VCARD_LIST_TYPE "text/x-source-vcard" -static GtkTargetEntry drag_types[] = { - { SOURCE_VCARD_LIST_TYPE, 0, DND_TARGET_TYPE_SOURCE_VCARD_LIST }, - { VCARD_LIST_TYPE, 0, DND_TARGET_TYPE_VCARD_LIST } -}; -static gint num_drag_types = sizeof(drag_types) / sizeof(drag_types[0]); - -static void -e_minicard_view_drag_data_get(GtkWidget *widget, - GdkDragContext *context, - GtkSelectionData *selection_data, - guint info, - guint time, - EMinicardView *view) -{ - if (!E_IS_MINICARD_VIEW(view)) - return; - - switch (info) { - case DND_TARGET_TYPE_VCARD_LIST: { - char *value; - - value = eab_contact_list_to_string (view->drag_list); - - gtk_selection_data_set (selection_data, - selection_data->target, - 8, - value, strlen (value)); - break; - } - case DND_TARGET_TYPE_SOURCE_VCARD_LIST: { - EBook *book; - char *value; - - g_object_get (view->adapter, "book", &book, NULL); - value = eab_book_and_contact_list_to_string (book, view->drag_list); - - gtk_selection_data_set (selection_data, - selection_data->target, - 8, - value, strlen (value)); - break; - } - } -} - -static void -clear_drag_data (EMinicardView *view) -{ - g_list_foreach (view->drag_list, (GFunc)g_object_unref, NULL); - g_list_free (view->drag_list); - view->drag_list = NULL; -} - -static int -e_minicard_view_drag_begin (EAddressbookReflowAdapter *adapter, GdkEvent *event, EMinicardView *view) -{ - GdkDragContext *context; - GtkTargetList *target_list; - GdkDragAction actions = GDK_ACTION_MOVE | GDK_ACTION_COPY; - - clear_drag_data (view); - - view->drag_list = e_minicard_view_get_card_list (view); - - g_print ("dragging %d card(s)\n", g_list_length (view->drag_list)); - - target_list = gtk_target_list_new (drag_types, num_drag_types); - - context = gtk_drag_begin (GTK_WIDGET (GNOME_CANVAS_ITEM (view)->canvas), - target_list, actions, 1/*XXX*/, event); - - if (!view->canvas_drag_data_get_id) - view->canvas_drag_data_get_id = g_signal_connect (GNOME_CANVAS_ITEM (view)->canvas, - "drag_data_get", - G_CALLBACK (e_minicard_view_drag_data_get), - view); - - gtk_drag_set_icon_default (context); - - return TRUE; -} - -static void -set_empty_message (EMinicardView *view) -{ - char *empty_message; - gboolean editable = FALSE; - - if (view->adapter) { - g_object_get (view->adapter, - "editable", &editable, - NULL); - } - - if (editable) - empty_message = _("\n\nThere are no items to show in this view.\n\n" - "Double-click here to create a new Contact."); - else - empty_message = _("\n\nThere are no items to show in this view."); - - g_object_set (view, - "empty_message", empty_message, - NULL); -} - -static void -writable_status_change (EABModel *model, gboolean writable, EMinicardView *view) -{ - set_empty_message (view); -} - -static void -adapter_changed (EMinicardView *view) -{ - set_empty_message (view); - - g_signal_connect (view->adapter, "drag_begin", - G_CALLBACK (e_minicard_view_drag_begin), view); -} - -static void -e_minicard_view_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - EMinicardView *view; - - view = E_MINICARD_VIEW (object); - - switch (prop_id){ - case PROP_ADAPTER: - if (view->adapter) { - if (view->writable_status_id) { - EABModel *model; - g_object_get (view->adapter, - "model", &model, - NULL); - if (model) { - g_signal_handler_disconnect (model, view->writable_status_id); - } - } - - g_object_unref (view->adapter); - } - view->writable_status_id = 0; - view->adapter = g_value_get_object (value); - g_object_ref (view->adapter); - adapter_changed (view); - g_object_set (view, - "model", view->adapter, - NULL); - if (view->adapter) { - EABModel *model; - g_object_get (view->adapter, - "model", &model, - NULL); - if (model) { - view->writable_status_id = - g_signal_connect (model, "writable_status", - G_CALLBACK (writable_status_change), view); - } - - } - break; - case PROP_BOOK: - g_object_set (view->adapter, - "book", g_value_get_object (value), - NULL); - set_empty_message (view); - break; - case PROP_QUERY: - g_object_set (view->adapter, - "query", g_value_get_string (value), - NULL); - break; - case PROP_EDITABLE: - g_object_set (view->adapter, - "editable", g_value_get_boolean (value), - NULL); - set_empty_message (view); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_minicard_view_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - EMinicardView *view; - - view = E_MINICARD_VIEW (object); - - switch (prop_id) { - case PROP_ADAPTER: - g_value_set_object (value, view->adapter); - break; - case PROP_BOOK: - g_object_get_property (G_OBJECT (view->adapter), - "book", value); - break; - case PROP_QUERY: - g_object_get_property (G_OBJECT (view->adapter), - "query", value); - break; - case PROP_EDITABLE: - g_object_get_property (G_OBJECT (view->adapter), - "editable", value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_minicard_view_dispose (GObject *object) -{ - EMinicardView *view = E_MINICARD_VIEW(object); - - clear_drag_data (view); - - if (view->canvas_drag_data_get_id) { - g_signal_handler_disconnect (GNOME_CANVAS_ITEM (view)->canvas, - view->canvas_drag_data_get_id); - view->canvas_drag_data_get_id = 0; - } - - if (view->adapter) { - if (view->writable_status_id) { - EABModel *model; - g_object_get (view->adapter, - "model", &model, - NULL); - if (model) { - g_signal_handler_disconnect (model, view->writable_status_id); - } - } - - g_object_unref (view->adapter); - } - view->writable_status_id = 0; - view->adapter = NULL; - - if (G_OBJECT_CLASS(parent_class)->dispose) - G_OBJECT_CLASS(parent_class)->dispose (object); -} - -static guint -e_minicard_view_right_click (EMinicardView *view, GdkEvent *event) -{ - guint ret_val = 0; - g_signal_emit (view, signals[RIGHT_CLICK], 0, - event, &ret_val); - return ret_val; -} - -static gboolean -e_minicard_view_event (GnomeCanvasItem *item, GdkEvent *event) -{ - EMinicardView *view; - - view = E_MINICARD_VIEW (item); - - switch( event->type ) { - case GDK_2BUTTON_PRESS: - if (((GdkEventButton *)event)->button == 1) { - gboolean editable; - - g_object_get(view->adapter, "editable", &editable, NULL); - - if (editable) { - EBook *book; - g_object_get(view, "book", &book, NULL); - - if (book && E_IS_BOOK (book)) - eab_show_contact_editor (book, e_contact_new(), TRUE, editable); - } - return TRUE; - } - case GDK_BUTTON_PRESS: - if (event->button.button == 3) { - e_minicard_view_right_click (view, event); - } - break; - default: - break; - } - - if (GNOME_CANVAS_ITEM_CLASS(parent_class)->event) - return GNOME_CANVAS_ITEM_CLASS(parent_class)->event(item, event); - else - return FALSE; -} - -static gint -e_minicard_view_selection_event (EReflow *reflow, GnomeCanvasItem *item, GdkEvent *event) -{ - EMinicardView *view; - int return_val = FALSE; - - view = E_MINICARD_VIEW (reflow); - if (parent_class->selection_event) { - return_val = parent_class->selection_event (reflow, item, event); - } - - switch (event->type) { - case GDK_FOCUS_CHANGE: - if (event->focus_change.in) { - int i; - for (i = 0; i < reflow->count; i++) { - if (reflow->items[i] == item) { - e_selection_model_maybe_do_something(reflow->selection, i, 0, 0); - break; - } - } - } - break; - case GDK_BUTTON_PRESS: - if (event->button.button == 3) { - return_val = e_minicard_view_right_click (view, event); - if (!return_val) - e_selection_model_right_click_up(reflow->selection); - } - break; - default: - break; - } - return return_val; -} - -typedef struct { - EMinicardView *view; - EBookCallback cb; - gpointer closure; -} ViewCbClosure; - -static void -do_remove (int i, gpointer user_data) -{ - EBook *book; - EContact *contact; - ViewCbClosure *viewcbclosure = user_data; - EMinicardView *view = viewcbclosure->view; - EBookCallback cb = viewcbclosure->cb; - gpointer closure = viewcbclosure->closure; - - g_object_get (view->adapter, - "book", &book, - NULL); - - contact = e_addressbook_reflow_adapter_get_contact (view->adapter, i); - - e_book_async_remove_contact(book, contact, cb, closure); - - g_object_unref (contact); -} - -#if 0 -static int -compare_to_utf_str (EMinicard *card, const char *utf_str) -{ - g_return_val_if_fail(card != NULL, 0); - g_return_val_if_fail(E_IS_MINICARD(card), 0); - - if (g_unichar_isdigit (g_utf8_get_char (utf_str))) { - return 1; - } - - if (card->card) { - char *file_as; - g_object_get(card->card, - "file_as", &file_as, - NULL); - if (file_as) - return g_utf8_strcasecmp (file_as, utf_str); - else - return 0; - } else { - return 0; - } -} -#endif - -static void -e_minicard_view_class_init (EMinicardViewClass *klass) -{ - GObjectClass *object_class; - GnomeCanvasItemClass *item_class; - EReflowClass *reflow_class; - - object_class = G_OBJECT_CLASS (klass); - item_class = (GnomeCanvasItemClass *) klass; - reflow_class = (EReflowClass *) klass; - - parent_class = g_type_class_peek_parent (klass); - - object_class->set_property = e_minicard_view_set_property; - object_class->get_property = e_minicard_view_get_property; - object_class->dispose = e_minicard_view_dispose; - - g_object_class_install_property (object_class, PROP_ADAPTER, - g_param_spec_object ("adapter", - _("Adapter"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_ADDRESSBOOK_REFLOW_ADAPTER, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_BOOK, - g_param_spec_object ("book", - _("Book"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_BOOK, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_QUERY, - g_param_spec_string ("query", - _("Query"), - /*_( */"XXX blurb" /*)*/, - NULL, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EDITABLE, - g_param_spec_boolean ("editable", - _("Editable"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - signals [RIGHT_CLICK] = - g_signal_new ("right_click", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EMinicardViewClass, right_click), - NULL, NULL, - eab_marshal_INT__POINTER, - G_TYPE_INT, 1, G_TYPE_POINTER); - - item_class->event = e_minicard_view_event; - - reflow_class->selection_event = e_minicard_view_selection_event; - /* GnomeCanvasItem method overrides */ - - /* init the accessibility support for e_minicard_view */ - e_minicard_view_a11y_init(); -} - -static void -e_minicard_view_init (EMinicardView *view) -{ - view->drag_list = NULL; - view->adapter = NULL; - view->canvas_drag_data_get_id = 0; - view->writable_status_id = 0; - - set_empty_message (view); -} - -GType -e_minicard_view_get_type (void) -{ - static GType reflow_type = 0; - - if (!reflow_type) { - static const GTypeInfo reflow_info = { - sizeof (EMinicardViewClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_minicard_view_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EMinicardView), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_minicard_view_init, - }; - - reflow_type = g_type_register_static (PARENT_TYPE, "EMinicardView", &reflow_info, 0); - } - - return reflow_type; -} - -void -e_minicard_view_remove_selection(EMinicardView *view, - EBookCallback cb, - gpointer closure) -{ - ViewCbClosure viewcbclosure; - viewcbclosure.view = view; - viewcbclosure.cb = cb; - viewcbclosure.closure = closure; - - e_selection_model_foreach (E_REFLOW (view)->selection, - do_remove, - &viewcbclosure); -} - -void -e_minicard_view_jump_to_letter (EMinicardView *view, - gunichar letter) -{ -#if 0 - char uft_str[6 + 1]; - - utf_str [g_unichar_to_utf8 (letter, utf_str)] = '\0'; - e_reflow_sorted_jump (E_REFLOW_SORTED (view), - (GCompareFunc) compare_to_utf_str, - utf_str); -#endif -} - -typedef struct { - GList *list; - EAddressbookReflowAdapter *adapter; -} ModelAndList; - -static void -add_to_list (int index, gpointer closure) -{ - ModelAndList *mal = closure; - mal->list = g_list_prepend (mal->list, e_addressbook_reflow_adapter_get_contact (mal->adapter, index)); -} - -GList * -e_minicard_view_get_card_list (EMinicardView *view) -{ - ModelAndList mal; - - mal.adapter = view->adapter; - mal.list = NULL; - - e_selection_model_foreach (E_REFLOW (view)->selection, add_to_list, &mal); - - mal.list = g_list_reverse (mal.list); - return mal.list; -} diff --git a/addressbook/gui/widgets/e-minicard-view.h b/addressbook/gui/widgets/e-minicard-view.h deleted file mode 100644 index 50964568cf..0000000000 --- a/addressbook/gui/widgets/e-minicard-view.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-minicard-view.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_MINICARD_VIEW_H__ -#define __E_MINICARD_VIEW_H__ - -#include "e-minicard.h" - -#include <gal/widgets/e-reflow.h> -#include <gal/widgets/e-selection-model-simple.h> -#include <libebook/e-book.h> -#include "e-addressbook-reflow-adapter.h" - -G_BEGIN_DECLS - -/* EMinicardView - A canvas item container. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - * book EBook RW book to query - * query string RW query string - * - * From EReflowSorted: (you should really know what you're doing if you set these.) - * compare_func GCompareFunc RW compare function - * string_func EReflowStringFunc RW string function - * - * From EReflow: - * minimum_width double RW minimum width of the reflow. width >= minimum_width - * width double R width of the reflow - * height double RW height of the reflow - */ - -#define E_TYPE_MINICARD_VIEW (e_minicard_view_get_type ()) -#define E_MINICARD_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MINICARD_VIEW, EMinicardView)) -#define E_MINICARD_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MINICARD_VIEW, EMinicardViewClass)) -#define E_IS_MINICARD_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MINICARD_VIEW)) -#define E_IS_MINICARD_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MINICARD_VIEW)) - - -typedef struct _EMinicardView EMinicardView; -typedef struct _EMinicardViewClass EMinicardViewClass; - -struct _EMinicardView -{ - EReflow parent; - - EAddressbookReflowAdapter *adapter; - - /* item specific fields */ - - GList *drag_list; - - guint canvas_drag_data_get_id; - guint writable_status_id; -}; - -struct _EMinicardViewClass -{ - EReflowClass parent_class; - - void (*right_click) (EMinicardView *view, GdkEvent *event); -}; - -GType e_minicard_view_get_type (void); -void e_minicard_view_remove_selection (EMinicardView *view, - EBookCallback cb, - gpointer closure); -void e_minicard_view_jump_to_letter (EMinicardView *view, - gunichar letter); -GList *e_minicard_view_get_card_list (EMinicardView *view); - - -G_END_DECLS - -#endif /* __E_MINICARD_VIEW_H__ */ diff --git a/addressbook/gui/widgets/e-minicard.c b/addressbook/gui/widgets/e-minicard.c deleted file mode 100644 index 30b0c17af5..0000000000 --- a/addressbook/gui/widgets/e-minicard.c +++ /dev/null @@ -1,1015 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-minicard.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> -#include <string.h> -#include <glib.h> -#include <gtk/gtkdnd.h> -#include <gtk/gtkmain.h> -#include <gdk/gdkkeysyms.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomecanvas/gnome-canvas-rect-ellipse.h> -#include <libgnomecanvas/gnome-canvas-pixbuf.h> -#include <gal/e-text/e-text.h> -#include <gal/util/e-util.h> -#include <gal/widgets/e-canvas-utils.h> -#include <gal/widgets/e-canvas.h> -#include <libebook/e-book.h> -#include "eab-marshal.h" -#include "eab-gui-util.h" -#include "e-minicard.h" -#include "e-minicard-label.h" -#include "e-minicard-view.h" -#include "e-contact-editor.h" -#include <e-util/e-icon-factory.h> -#include "util/e-destination.h" - -static void e_minicard_init (EMinicard *card); -static void e_minicard_class_init (EMinicardClass *klass); -static void e_minicard_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void e_minicard_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void e_minicard_dispose (GObject *object); -static void e_minicard_finalize (GObject *object); -static gboolean e_minicard_event (GnomeCanvasItem *item, GdkEvent *event); -static void e_minicard_realize (GnomeCanvasItem *item); -static void e_minicard_unrealize (GnomeCanvasItem *item); -static void e_minicard_reflow ( GnomeCanvasItem *item, int flags ); -static void e_minicard_style_set (EMinicard *minicard, GtkStyle *previous_style); - -static void e_minicard_resize_children( EMinicard *e_minicard ); -static void remodel( EMinicard *e_minicard ); - -static gint e_minicard_drag_begin (EMinicard *minicard, GdkEvent *event); - -static GnomeCanvasGroupClass *parent_class = NULL; - -#define d(x) - -#define LIST_ICON_NAME "stock_contact-list" - -static void -e_minicard_field_destroy(EMinicardField *field) -{ - gtk_object_destroy(GTK_OBJECT(field->label)); - g_free(field); -} - -/* The arguments we take */ -enum { - PROP_0, - PROP_WIDTH, - PROP_HEIGHT, - PROP_HAS_FOCUS, - PROP_SELECTED, - PROP_HAS_CURSOR, - PROP_EDITABLE, - PROP_CONTACT -}; - -enum { - SELECTED, - DRAG_BEGIN, - STYLE_SET, - LAST_SIGNAL -}; - -static guint e_minicard_signals [LAST_SIGNAL] = {0, }; - -GType -e_minicard_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (EMinicardClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) e_minicard_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EMinicard), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_minicard_init, - }; - - type = g_type_register_static (gnome_canvas_group_get_type (), "EMinicard", &info, 0); - } - - return type; -} - -static void -e_minicard_class_init (EMinicardClass *klass) -{ - GObjectClass *object_class = (GObjectClass*) klass; - GnomeCanvasItemClass *item_class = (GnomeCanvasItemClass *) klass; - - object_class->set_property = e_minicard_set_property; - object_class->get_property = e_minicard_get_property; - object_class->dispose = e_minicard_dispose; - object_class->finalize = e_minicard_finalize; - - klass->style_set = e_minicard_style_set; - - parent_class = gtk_type_class (gnome_canvas_group_get_type ()); - - g_object_class_install_property (object_class, PROP_WIDTH, - g_param_spec_double ("width", - _("Width"), - /*_( */"XXX blurb" /*)*/, - 0.0, G_MAXDOUBLE, 10.0, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_HEIGHT, - g_param_spec_double ("height", - _("Height"), - /*_( */"XXX blurb" /*)*/, - 0.0, G_MAXDOUBLE, 10.0, - G_PARAM_READABLE)); - - g_object_class_install_property (object_class, PROP_HAS_FOCUS, - /* XXX should be _enum */ - g_param_spec_int ("has_focus", - _("Has Focus"), - /*_( */"XXX blurb" /*)*/, - E_MINICARD_FOCUS_TYPE_START, E_MINICARD_FOCUS_TYPE_END, - E_MINICARD_FOCUS_TYPE_START, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_SELECTED, - g_param_spec_boolean ("selected", - _("Selected"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_HAS_CURSOR, - g_param_spec_boolean ("has_cursor", - _("Has Cursor"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_EDITABLE, - g_param_spec_boolean ("editable", - _("Editable"), - /*_( */"XXX blurb" /*)*/, - FALSE, - G_PARAM_READWRITE)); - - g_object_class_install_property (object_class, PROP_CONTACT, - g_param_spec_object ("contact", - _("Contact"), - /*_( */"XXX blurb" /*)*/, - E_TYPE_CONTACT, - G_PARAM_READWRITE)); - - e_minicard_signals [SELECTED] = - g_signal_new ("selected", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EMinicardClass, selected), - NULL, NULL, - eab_marshal_INT__POINTER, - G_TYPE_INT, 1, G_TYPE_POINTER); - - e_minicard_signals [DRAG_BEGIN] = - g_signal_new ("drag_begin", - G_OBJECT_CLASS_TYPE (object_class), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EMinicardClass, drag_begin), - NULL, NULL, - eab_marshal_INT__POINTER, - G_TYPE_INT, 1, G_TYPE_POINTER); - - e_minicard_signals [STYLE_SET] = - g_signal_new ("style_set", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EMinicardClass, style_set), - NULL, NULL, - eab_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, - GTK_TYPE_STYLE); - - /* GnomeCanvasItem method overrides */ - item_class->realize = e_minicard_realize; - item_class->unrealize = e_minicard_unrealize; - item_class->event = e_minicard_event; - - klass->selected = NULL; - - /* init the accessibility support for e_minicard */ - e_minicard_a11y_init(); -} - -static void -e_minicard_init (EMinicard *minicard) -{ - minicard->rect = NULL; - minicard->fields = NULL; - minicard->width = 10; - minicard->height = 10; - minicard->has_focus = FALSE; - minicard->selected = FALSE; - minicard->editable = FALSE; - minicard->has_cursor = FALSE; - - minicard->contact = NULL; - - minicard->list_icon_pixbuf = e_icon_factory_get_icon (LIST_ICON_NAME, E_ICON_SIZE_MENU); - minicard->list_icon_size = gdk_pixbuf_get_height (minicard->list_icon_pixbuf); - - minicard->editor = NULL; - - minicard->changed = FALSE; - - e_canvas_item_set_reflow_callback(GNOME_CANVAS_ITEM(minicard), e_minicard_reflow); -} - -static void -set_selected (EMinicard *minicard, gboolean selected) -{ - GtkWidget *canvas = GTK_WIDGET(GNOME_CANVAS_ITEM(minicard)->canvas); - if (selected) { - gnome_canvas_item_set (minicard->rect, - "outline_color_gdk", &canvas->style->bg[GTK_STATE_ACTIVE], - NULL); - gnome_canvas_item_set (minicard->header_rect, - "fill_color_gdk", &canvas->style->bg[GTK_STATE_SELECTED], - NULL); - gnome_canvas_item_set (minicard->header_text, - "fill_color_gdk", &canvas->style->text[GTK_STATE_SELECTED], - NULL); - } else { - gnome_canvas_item_set (minicard->rect, - "outline_color", NULL, - NULL); - gnome_canvas_item_set (minicard->header_rect, - "fill_color_gdk", &canvas->style->bg[GTK_STATE_NORMAL], - NULL); - gnome_canvas_item_set (minicard->header_text, - "fill_color_gdk", &canvas->style->text[GTK_STATE_NORMAL], - NULL); - } - minicard->selected = selected; -} - -static void -set_has_cursor (EMinicard *minicard, gboolean has_cursor) -{ - if (!minicard->has_focus && has_cursor) - e_canvas_item_grab_focus(GNOME_CANVAS_ITEM (minicard), FALSE); - minicard->has_cursor = has_cursor; -} - - -static void -e_minicard_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) -{ - GnomeCanvasItem *item; - EMinicard *e_minicard; - EContact *contact; - GList *l; - - item = GNOME_CANVAS_ITEM (object); - e_minicard = E_MINICARD (object); - - switch (prop_id){ - case PROP_WIDTH: - if (e_minicard->width != g_value_get_double (value)) { - e_minicard->width = g_value_get_double (value); - e_minicard_resize_children(e_minicard); - if ( GTK_OBJECT_FLAGS( e_minicard ) & GNOME_CANVAS_ITEM_REALIZED ) - e_canvas_item_request_reflow(item); - } - break; - case PROP_HAS_FOCUS: - if (e_minicard->fields) { - if ( g_value_get_int(value) == E_FOCUS_START || - g_value_get_int(value) == E_FOCUS_CURRENT) { - gnome_canvas_item_set(E_MINICARD_FIELD(e_minicard->fields->data)->label, - "has_focus", g_value_get_int (value), - NULL); - } else if ( g_value_get_int (value) == E_FOCUS_END ) { - gnome_canvas_item_set(E_MINICARD_FIELD(g_list_last(e_minicard->fields)->data)->label, - "has_focus", g_value_get_int (value), - NULL); - } - } - else { - if (!e_minicard->has_focus) - e_canvas_item_grab_focus(item, FALSE); - } - break; - case PROP_SELECTED: - if (e_minicard->selected != g_value_get_boolean (value)) - set_selected (e_minicard, g_value_get_boolean (value)); - break; - case PROP_EDITABLE: - e_minicard->editable = g_value_get_boolean (value); - for (l = e_minicard->fields; l; l = l->next) { - g_object_set (E_MINICARD_FIELD (l->data)->label, - "editable", FALSE /* e_minicard->editable */, - NULL); - } - break; - case PROP_HAS_CURSOR: - d(g_print("%s: PROP_HAS_CURSOR\n", G_GNUC_FUNCTION)); - if (e_minicard->has_cursor != g_value_get_boolean (value)) - set_has_cursor (e_minicard, g_value_get_boolean (value)); - break; - case PROP_CONTACT: - contact = E_CONTACT (g_value_get_object (value)); - if (contact) - g_object_ref (contact); - - if (e_minicard->contact) - g_object_unref (e_minicard->contact); - - e_minicard->contact = contact; - - remodel(e_minicard); - e_canvas_item_request_reflow(item); - e_minicard->changed = FALSE; - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_minicard_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) -{ - EMinicard *e_minicard; - - e_minicard = E_MINICARD (object); - - switch (prop_id) { - case PROP_WIDTH: - g_value_set_double (value, e_minicard->width); - break; - case PROP_HEIGHT: - g_value_set_double (value, e_minicard->height); - break; - case PROP_HAS_FOCUS: - g_value_set_int (value, e_minicard->has_focus ? E_FOCUS_CURRENT : E_FOCUS_NONE); - break; - case PROP_SELECTED: - g_value_set_boolean (value, e_minicard->selected); - break; - case PROP_HAS_CURSOR: - g_value_set_boolean (value, e_minicard->has_cursor); - break; - case PROP_EDITABLE: - g_value_set_boolean (value, e_minicard->editable); - break; - case PROP_CONTACT: - g_value_set_object (value, e_minicard->contact); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -e_minicard_dispose (GObject *object) -{ - EMinicard *e_minicard; - - g_return_if_fail (object != NULL); - g_return_if_fail (E_IS_MINICARD (object)); - - e_minicard = E_MINICARD (object); - - if (e_minicard->fields) { - g_list_foreach(e_minicard->fields, (GFunc) e_minicard_field_destroy, NULL); - g_list_free(e_minicard->fields); - e_minicard->fields = NULL; - } - - if (e_minicard->list_icon_pixbuf) { - gdk_pixbuf_unref (e_minicard->list_icon_pixbuf); - e_minicard->list_icon_pixbuf = NULL; - } - - if (G_OBJECT_CLASS (parent_class)->dispose) - (* G_OBJECT_CLASS (parent_class)->dispose) (object); -} - - - -static void -e_minicard_finalize (GObject *object) -{ - EMinicard *e_minicard; - - g_return_if_fail (object != NULL); - g_return_if_fail (E_IS_MINICARD (object)); - - e_minicard = E_MINICARD (object); - - if (e_minicard->contact) { - g_object_unref (e_minicard->contact); - e_minicard->contact = NULL; - } - - if (e_minicard->list_icon_pixbuf) { - g_object_unref (e_minicard->list_icon_pixbuf); - e_minicard->list_icon_pixbuf = NULL; - } - - if (G_OBJECT_CLASS (parent_class)->finalize) - (* G_OBJECT_CLASS (parent_class)->finalize) (object); -} - -static void -e_minicard_style_set (EMinicard *minicard, GtkStyle *previous_style) -{ - if ( (GTK_OBJECT_FLAGS( minicard ) & GNOME_CANVAS_ITEM_REALIZED) ) - set_selected (minicard, minicard->selected); -} - -static void -e_minicard_realize (GnomeCanvasItem *item) -{ - EMinicard *e_minicard; - GnomeCanvasGroup *group; - GtkWidget *canvas; - - e_minicard = E_MINICARD (item); - group = GNOME_CANVAS_GROUP( item ); - canvas = GTK_WIDGET (GNOME_CANVAS_ITEM (item)->canvas); - - if (GNOME_CANVAS_ITEM_CLASS(parent_class)->realize) - (* GNOME_CANVAS_ITEM_CLASS(parent_class)->realize) (item); - - e_minicard->rect = - gnome_canvas_item_new( group, - gnome_canvas_rect_get_type(), - "x1", (double) 0, - "y1", (double) 0, - "x2", (double) MAX (e_minicard->width - 1, 0), - "y2", (double) MAX (e_minicard->height - 1, 0), - "outline_color", NULL, - NULL ); - - e_minicard->header_rect = - gnome_canvas_item_new( group, - gnome_canvas_rect_get_type(), - "x1", (double) 2, - "y1", (double) 2, - "x2", (double) MAX (e_minicard->width - 3, 0), - "y2", (double) MAX (e_minicard->height - 3, 0), - "fill_color_gdk", &canvas->style->bg[GTK_STATE_NORMAL], - NULL ); - - e_minicard->header_text = - gnome_canvas_item_new( group, - e_text_get_type(), - "anchor", GTK_ANCHOR_NW, - "width", (double) MAX( e_minicard->width - 12, 0 ), - "clip", TRUE, - "use_ellipsis", TRUE, - "fill_color_gdk", &canvas->style->fg[GTK_STATE_NORMAL], - "text", "", - "draw_background", FALSE, - NULL ); - - e_canvas_item_move_absolute(e_minicard->header_text, 6, 6); - - e_minicard->list_icon = - gnome_canvas_item_new ( group, - gnome_canvas_pixbuf_get_type(), - "pixbuf", e_minicard->list_icon_pixbuf, - NULL); - - set_selected (e_minicard, e_minicard->selected); - - remodel(e_minicard); - e_canvas_item_request_reflow(item); -} - -static void -e_minicard_unrealize (GnomeCanvasItem *item) -{ - EMinicard *e_minicard; - - e_minicard = E_MINICARD (item); - - if (GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) - (* GNOME_CANVAS_ITEM_CLASS(parent_class)->unrealize) (item); -} - -/* Callback used when the contact editor is closed */ -static void -editor_closed_cb (GtkObject *editor, gpointer data) -{ - EMinicard *minicard = data; - g_object_unref (editor); - minicard->editor = NULL; -} - -static gboolean -activiate_editor(GnomeCanvasItem *item) -{ - EMinicard *e_minicard; - e_minicard = E_MINICARD (item); - - if (e_minicard->editor) { - eab_editor_raise (e_minicard->editor); - } - else { - EBook *book = NULL; - if (E_IS_MINICARD_VIEW(item->parent)) { - g_object_get(item->parent, "book", &book, NULL); - } - - if (book != NULL) { - if (e_contact_get (e_minicard->contact, E_CONTACT_IS_LIST)) { - EContactListEditor *editor = eab_show_contact_list_editor (book, e_minicard->contact, - FALSE, e_minicard->editable); - e_minicard->editor = EAB_EDITOR (editor); - } - else { - EContactEditor *editor = eab_show_contact_editor (book, e_minicard->contact, - FALSE, e_minicard->editable); - e_minicard->editor = EAB_EDITOR (editor); - } - - g_object_ref (e_minicard->editor); - g_signal_connect (e_minicard->editor, "editor_closed", - G_CALLBACK (editor_closed_cb), e_minicard); - - g_object_unref (book); - } - } - - return TRUE; -} - -static gboolean -e_minicard_event (GnomeCanvasItem *item, GdkEvent *event) -{ - EMinicard *e_minicard; - GtkWidget *canvas; - - e_minicard = E_MINICARD (item); - canvas = GTK_WIDGET (GNOME_CANVAS_ITEM (item)->canvas); - - switch( event->type ) { - case GDK_FOCUS_CHANGE: - { - GdkEventFocus *focus_event = (GdkEventFocus *) event; - d(g_print("%s: GDK_FOCUS_CHANGE: %s\n", G_GNUC_FUNCTION, focus_event->in?"in":"out")); - if (focus_event->in) { - /* Chris: When EMinicard gets the cursor, if it doesn't have the focus, it should take it. */ - e_minicard->has_focus = TRUE; - if (!e_minicard->selected) { - e_minicard_selected(e_minicard, event); - } - } - else { - e_minicard->has_focus = FALSE; - } - } - break; - case GDK_BUTTON_PRESS: { - if (1 <= event->button.button && event->button.button <= 2) { - int ret_val = e_minicard_selected(e_minicard, event); - GdkEventMask mask = ((1 << (4 + event->button.button)) | - GDK_POINTER_MOTION_MASK | - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK); - - e_canvas_item_grab_focus(item, TRUE); - - if (gnome_canvas_item_grab (GNOME_CANVAS_ITEM (e_minicard), - mask, NULL, event->button.time)) { - return FALSE; - } - gtk_grab_add (GTK_WIDGET (GNOME_CANVAS_ITEM (e_minicard)->canvas)); - e_minicard->button_x = event->button.x; - e_minicard->button_y = event->button.y; - e_minicard->drag_button = event->button.button; - e_minicard->drag_button_down = TRUE; - return ret_val; - } else if (event->button.button == 3) { - int ret_val = e_minicard_selected(e_minicard, event); - if (ret_val != 0) - return ret_val; - } - break; - } - case GDK_BUTTON_RELEASE: - e_minicard_selected(e_minicard, event); - if (e_minicard->drag_button == event->button.button) { - e_minicard->drag_button = 0; - e_minicard->drag_button_down = FALSE; - e_minicard->button_x = -1; - e_minicard->button_y = -1; - - if (GTK_WIDGET_HAS_GRAB (GNOME_CANVAS_ITEM (e_minicard)->canvas)) { - gtk_grab_remove (GTK_WIDGET (GNOME_CANVAS_ITEM (e_minicard)->canvas)); - gnome_canvas_item_ungrab (GNOME_CANVAS_ITEM (e_minicard), event->button.time); - } - } - break; - case GDK_MOTION_NOTIFY: - if (e_minicard->drag_button_down && event->motion.state & GDK_BUTTON1_MASK) { - if (MAX (abs (e_minicard->button_x - event->motion.x), - abs (e_minicard->button_y - event->motion.y)) > 3) { - gint ret_val; - - ret_val = e_minicard_drag_begin(e_minicard, event); - - e_minicard->drag_button_down = FALSE; - - return ret_val; - } - } - break; - case GDK_2BUTTON_PRESS: - if (event->button.button == 1 && E_IS_MINICARD_VIEW(item->parent)) { - return activiate_editor(item); - } - break; - case GDK_KEY_PRESS: - if (event->key.keyval == GDK_Tab || - event->key.keyval == GDK_KP_Tab || - event->key.keyval == GDK_ISO_Left_Tab) { - - EMinicardView *view = E_MINICARD_VIEW(item->parent); - EReflow *reflow = E_REFLOW(view); - - if (reflow == NULL) { - return FALSE; - } - - if (event->key.state & GDK_SHIFT_MASK) { - if (event->key.state & GDK_CONTROL_MASK) { - return FALSE; - } - else { - int row_count = e_selection_model_row_count(reflow->selection); - int model_index = e_selection_model_cursor_row (reflow->selection); - int view_index = e_sorter_model_to_sorted (reflow->selection->sorter, model_index); - - if (view_index == 0) - view_index = row_count-1; - else - view_index--; - - model_index = e_sorter_sorted_to_model (E_SORTER (reflow->sorter), view_index); - e_canvas_item_grab_focus(reflow->items[model_index], FALSE); - return TRUE; - } - } - else { - if (event->key.state & GDK_CONTROL_MASK) { - return FALSE; - } - else { - int row_count = e_selection_model_row_count(reflow->selection); - int model_index = e_selection_model_cursor_row (reflow->selection); - int view_index = e_sorter_model_to_sorted (reflow->selection->sorter, model_index); - - if (view_index == row_count-1) - view_index = 0; - else - view_index++; - - model_index = e_sorter_sorted_to_model (E_SORTER (reflow->sorter), view_index); - e_canvas_item_grab_focus(reflow->items[model_index], FALSE); - return TRUE; - } - } - } - else if (event->key.keyval == GDK_Return || - event->key.keyval == GDK_KP_Enter) { - return activiate_editor(item); - } - break; - default: - break; - } - - if (GNOME_CANVAS_ITEM_CLASS( parent_class )->event) - return (* GNOME_CANVAS_ITEM_CLASS( parent_class )->event) (item, event); - else - return 0; -} - -static void -e_minicard_resize_children( EMinicard *e_minicard ) -{ - GList *list; - gboolean is_list = GPOINTER_TO_INT (e_contact_get (e_minicard->contact, E_CONTACT_IS_LIST)); - - if (e_minicard->header_text) { - gnome_canvas_item_set( e_minicard->header_text, - "width", ((double) e_minicard->width - 12 - - (is_list ? e_minicard->list_icon_size : 0.0)), - NULL ); - } - if (e_minicard->list_icon) { - e_canvas_item_move_absolute(e_minicard->list_icon, - e_minicard->width - e_minicard->list_icon_size - 3, - 3); - } - for ( list = e_minicard->fields; list; list = g_list_next( list ) ) { - gnome_canvas_item_set( E_MINICARD_FIELD( list->data )->label, - "width", (double) e_minicard->width - 4.0, - NULL ); - } -} - -static void -add_field (EMinicard *e_minicard, EContactField field, gdouble left_width) -{ - GnomeCanvasItem *new_item; - GnomeCanvasGroup *group; - EMinicardField *minicard_field; - char *name; - char *string; - - group = GNOME_CANVAS_GROUP( e_minicard ); - - name = g_strdup_printf("%s:", e_contact_pretty_name (field)); - string = e_contact_get (e_minicard->contact, field); - - new_item = e_minicard_label_new(group); - gnome_canvas_item_set( new_item, - "width", e_minicard->width - 4.0, - "fieldname", name, - "field", string, - "max_field_name_length", left_width, - "editable", FALSE /* e_minicard->editable */, - NULL ); -#if notyet - g_object_set(E_MINICARD_LABEL(new_item)->field, - "allow_newlines", e_card_simple_get_allow_newlines (e_minicard->contact, field), - NULL); -#endif - g_object_set_data(G_OBJECT (E_MINICARD_LABEL(new_item)->field), - "EMinicard:field", - GINT_TO_POINTER(field)); - - minicard_field = g_new(EMinicardField, 1); - minicard_field->field = field; - minicard_field->label = new_item; - - e_minicard->fields = g_list_append( e_minicard->fields, minicard_field); - e_canvas_item_move_absolute(new_item, 2, e_minicard->height); - g_free(name); - g_free(string); -} - -static int -get_left_width(EMinicard *e_minicard) -{ - gchar *name; - EContactField field; - int width = -1; - PangoLayout *layout; - - layout = gtk_widget_create_pango_layout (GTK_WIDGET (GNOME_CANVAS_ITEM (e_minicard)->canvas), ""); - for(field = E_CONTACT_FULL_NAME; field != E_CONTACT_LAST_SIMPLE_STRING; field++) { - int this_width; - - if (field == E_CONTACT_FAMILY_NAME || field == E_CONTACT_GIVEN_NAME) - continue; - - name = g_strdup_printf("%s:", e_contact_pretty_name (field)); - pango_layout_set_text (layout, name, -1); - pango_layout_get_pixel_size (layout, &this_width, NULL); - if (width < this_width) - width = this_width; - g_free(name); - } - g_object_unref (layout); - return width; -} - -static void -remodel( EMinicard *e_minicard ) -{ - int count = 0; - if ( !(GTK_OBJECT_FLAGS( e_minicard ) & GNOME_CANVAS_ITEM_REALIZED) ) - return; - if (e_minicard->contact) { - EContactField field; - GList *list; - char *file_as; - int left_width = -1; - - if (e_minicard->header_text) { - file_as = e_contact_get (e_minicard->contact, E_CONTACT_FILE_AS); - gnome_canvas_item_set (e_minicard->header_text, - "text", file_as ? file_as : "", - NULL ); - g_free(file_as); - } - - if (e_minicard->contact && e_contact_get (e_minicard->contact, E_CONTACT_IS_LIST)) - gnome_canvas_item_show (e_minicard->list_icon); - else - gnome_canvas_item_hide (e_minicard->list_icon); - - list = e_minicard->fields; - e_minicard->fields = NULL; - - for(field = E_CONTACT_FULL_NAME; field != E_CONTACT_LAST_SIMPLE_STRING && count < 5; field++) { - EMinicardField *minicard_field = NULL; - - if (field == E_CONTACT_FAMILY_NAME || field == E_CONTACT_GIVEN_NAME) - continue; - - if (list) - minicard_field = list->data; - if (minicard_field && minicard_field->field == field) { - GList *this_list = list; - char *string; - - string = e_contact_get(e_minicard->contact, field); - if (string && *string) { - e_minicard->fields = g_list_append(e_minicard->fields, minicard_field); - g_object_set(minicard_field->label, - "field", string, - NULL); - count ++; - } else { - e_minicard_field_destroy(minicard_field); - } - list = g_list_remove_link(list, this_list); - g_list_free_1(this_list); - g_free(string); - } else { - char *string; - if (left_width == -1) { - left_width = get_left_width(e_minicard); - } - - string = e_contact_get(e_minicard->contact, field); - if (string && *string) { - add_field(e_minicard, field, left_width); - count++; - } - g_free(string); - } - } - - g_list_foreach(list, (GFunc) e_minicard_field_destroy, NULL); - g_list_free(list); - } -} - -static void -e_minicard_reflow( GnomeCanvasItem *item, int flags ) -{ - EMinicard *e_minicard = E_MINICARD(item); - if ( GTK_OBJECT_FLAGS( e_minicard ) & GNOME_CANVAS_ITEM_REALIZED ) { - GList *list; - gdouble text_height; - gint old_height; - - old_height = e_minicard->height; - - g_object_get( e_minicard->header_text, - "text_height", &text_height, - NULL ); - - e_minicard->height = text_height + 10.0; - - gnome_canvas_item_set( e_minicard->header_rect, - "y2", text_height + 9.0, - NULL ); - - for(list = e_minicard->fields; list; list = g_list_next(list)) { - EMinicardField *field = E_MINICARD_FIELD(list->data); - GnomeCanvasItem *item = field->label; - g_object_get (item, - "height", &text_height, - NULL); - e_canvas_item_move_absolute(item, 2, e_minicard->height); - e_minicard->height += text_height; - } - e_minicard->height += 2; - - gnome_canvas_item_set( e_minicard->rect, - "x2", (double) e_minicard->width - 1.0, - "y2", (double) e_minicard->height - 1.0, - NULL ); - gnome_canvas_item_set( e_minicard->header_rect, - "x2", (double) e_minicard->width - 3.0, - NULL ); - - if (old_height != e_minicard->height) - e_canvas_item_request_parent_reflow(item); - } -} - -const char * -e_minicard_get_card_id (EMinicard *minicard) -{ - g_return_val_if_fail(minicard != NULL, NULL); - g_return_val_if_fail(E_IS_MINICARD(minicard), NULL); - - if (minicard->contact) { - return e_contact_get_const (minicard->contact, E_CONTACT_UID); - } else { - return ""; - } -} - -int -e_minicard_compare (EMinicard *minicard1, EMinicard *minicard2) -{ - int cmp = 0; - - g_return_val_if_fail(minicard1 != NULL, 0); - g_return_val_if_fail(E_IS_MINICARD(minicard1), 0); - g_return_val_if_fail(minicard2 != NULL, 0); - g_return_val_if_fail(E_IS_MINICARD(minicard2), 0); - - if (minicard1->contact && minicard2->contact) { - char *file_as1, *file_as2; - g_object_get(minicard1->contact, - "file_as", &file_as1, - NULL); - g_object_get(minicard2->contact, - "file_as", &file_as2, - NULL); - - if (file_as1 && file_as2) - cmp = g_utf8_collate(file_as1, file_as2); - else if (file_as1) - cmp = -1; - else if (file_as2) - cmp = 1; - else - cmp = strcmp(e_minicard_get_card_id(minicard1), e_minicard_get_card_id(minicard2)); - - g_free (file_as1); - g_free (file_as2); - } - - return cmp; -} - -int -e_minicard_selected (EMinicard *minicard, GdkEvent *event) -{ - gint ret_val = 0; - GnomeCanvasItem *item = GNOME_CANVAS_ITEM (minicard); - if (item->parent) { - guint signal_id = g_signal_lookup ("selection_event", G_OBJECT_TYPE (item->parent)); - /* We should probably check the signature here, but I - * don't think it's worth the time required to code - * it. - */ - if (signal_id != 0) { - g_signal_emit(item->parent, - signal_id, 0, - item, event, &ret_val); - } - } - return ret_val; -} - -static gint -e_minicard_drag_begin (EMinicard *minicard, GdkEvent *event) -{ - gint ret_val = 0; - GnomeCanvasItem *parent; - g_signal_emit (minicard, - e_minicard_signals[DRAG_BEGIN], 0, - event, &ret_val); - - parent = GNOME_CANVAS_ITEM (minicard)->parent; - if (parent && E_IS_REFLOW (parent)) { - E_REFLOW (parent)->maybe_in_drag = FALSE; - } - return ret_val; -} diff --git a/addressbook/gui/widgets/e-minicard.h b/addressbook/gui/widgets/e-minicard.h deleted file mode 100644 index dd6ab33199..0000000000 --- a/addressbook/gui/widgets/e-minicard.h +++ /dev/null @@ -1,131 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-minicard.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_MINICARD_H__ -#define __E_MINICARD_H__ - -#include <gdk-pixbuf/gdk-pixbuf.h> -#include "addressbook/gui/contact-editor/eab-editor.h" -#include <libgnomecanvas/gnome-canvas.h> -#include <libebook/e-contact.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -/* EMinicard - A small card displaying information about a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - * width double RW width of the card - * height double R height of the card - * card ECard* RW Pointer to the ECard - */ - -#define E_TYPE_MINICARD (e_minicard_get_type ()) -#define E_MINICARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MINICARD, EMinicard)) -#define E_MINICARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_MINICARD, EMinicardClass)) -#define E_IS_MINICARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MINICARD)) -#define E_IS_MINICARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), E_TYPE_MINICARD)) - - -typedef struct _EMinicard EMinicard; -typedef struct _EMinicardClass EMinicardClass; -typedef enum _EMinicardFocusType EMinicardFocusType; - -enum _EMinicardFocusType { - E_MINICARD_FOCUS_TYPE_START, - E_MINICARD_FOCUS_TYPE_END -}; - -struct _EMinicard -{ - GnomeCanvasGroup parent; - - /* item specific fields */ - EContact *contact; - - GnomeCanvasItem *rect; - GnomeCanvasItem *header_rect; - GnomeCanvasItem *header_text; - GnomeCanvasItem *list_icon; - - GdkPixbuf *list_icon_pixbuf; - double list_icon_size; - - EABEditor *editor; - - GList *fields; /* Of type EMinicardField */ - guint needs_remodeling : 1; - - guint changed : 1; - - guint selected : 1; - guint has_cursor : 1; - - guint has_focus : 1; - - guint editable : 1; - - guint drag_button_down : 1; - gint drag_button; - - gint button_x; - gint button_y; - - double width; - double height; -}; - -struct _EMinicardClass -{ - GnomeCanvasGroupClass parent_class; - - gint (* selected) (EMinicard *minicard, GdkEvent *event); - gint (* drag_begin) (EMinicard *minicard, GdkEvent *event); - - void (* style_set) (EMinicard *minicard, GtkStyle *previous_style); -}; - -typedef struct _EMinicardField EMinicardField; - -struct _EMinicardField { - EContactField field; - GnomeCanvasItem *label; -}; - -#define E_MINICARD_FIELD(field) ((EMinicardField *)(field)) - -GType e_minicard_get_type (void); -const char *e_minicard_get_card_id (EMinicard *minicard); -int e_minicard_compare (EMinicard *minicard1, - EMinicard *minicard2); - -int e_minicard_selected (EMinicard *minicard, - GdkEvent *event); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __E_MINICARD_H__ */ diff --git a/addressbook/gui/widgets/eab-contact-display.c b/addressbook/gui/widgets/eab-contact-display.c deleted file mode 100644 index c90d071192..0000000000 --- a/addressbook/gui/widgets/eab-contact-display.c +++ /dev/null @@ -1,679 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Chris Toshok <toshok@ximian.com> - * - * Copyright (C) 2003 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "eab-contact-display.h" - -#include "eab-gui-util.h" -#include "e-util/e-html-utils.h" -#include "e-util/e-icon-factory.h" - -#include <string.h> -#include <libgnome/gnome-i18n.h> -#include <libgnome/gnome-url.h> -#include <gtkhtml/gtkhtml.h> -#include <gtkhtml/gtkhtml-stream.h> - -#define HANDLE_MAILTO_INTERNALLY 1 - -#define PARENT_TYPE (GTK_TYPE_HTML) - -struct _EABContactDisplayPrivate { - EContact *contact; -}; - - -#define HTML_HEADER "<!doctype html public \"-//W3C//DTD HTML 4.0 TRANSITIONAL//EN\">\n<html>\n" \ - "<head>\n<meta name=\"generator\" content=\"Evolution Addressbook Component\">\n</head>\n" - -#define HEADER_COLOR "#7f7f7f" -#define IMAGE_COL_WIDTH "20" -#define CONTACT_LIST_ICON "stock_contact-list" -#define AIM_ICON "im-aim" -#define GROUPWISE_ICON "im-nov" -#define ICQ_ICON "im-icq" -#define JABBER_ICON "im-jabber" -#define MSN_ICON "im-msn" -#define YAHOO_ICON "im-yahoo" -#define VIDEOCONF_ICON "stock_video-conferencing" - -#define MAX_COMPACT_IMAGE_DIMENSION 48 - -static void -on_url_requested (GtkHTML *html, const char *url, GtkHTMLStream *handle, - EABContactDisplay *display) -{ - if (!strcmp (url, "internal-contact-photo:")) { - EContactPhoto *photo; - - photo = e_contact_get (display->priv->contact, E_CONTACT_PHOTO); - if (!photo) - photo = e_contact_get (display->priv->contact, E_CONTACT_LOGO); - - gtk_html_stream_write (handle, photo->data, photo->length); - - gtk_html_end (html, handle, GTK_HTML_STREAM_OK); - } - else if (!strncmp (url, "evo-icon:", strlen ("evo-icon:"))) { - gchar *data; - gsize data_length; - gchar *filename; - - filename = e_icon_factory_get_icon_filename (url + strlen ("evo-icon:"), E_ICON_SIZE_MENU); - if (g_file_get_contents (filename, &data, &data_length, NULL)) { - gtk_html_stream_write (handle, data, data_length); - g_free (data); - } - - gtk_html_stream_close (handle, GTK_HTML_STREAM_OK); - - g_free (filename); - } -} - -static void -on_link_clicked (GtkHTML *html, const char *url, EABContactDisplay *display) -{ - GError *err = NULL; - -#ifdef HANDLE_MAILTO_INTERNALLY - if (!strncmp (url, "internal-mailto:", strlen ("internal-mailto:"))) { - int mail_num = atoi (url + strlen ("internal-mailto:")); - - if (mail_num == -1) - return; - - eab_send_contact (display->priv->contact, mail_num, EAB_DISPOSITION_AS_TO); - - return; - } -#endif - - gnome_url_show (url, &err); - - if (err) { - g_warning ("gnome_url_show: %s", err->message); - g_error_free (err); - } -} - -#if 0 -static void -render_address (GtkHTMLStream *html_stream, EContact *contact, const char *html_label, EContactField adr_field, EContactField label_field) -{ - EContactAddress *adr; - const char *label; - - label = e_contact_get_const (contact, label_field); - if (label) { - char *html = e_text_to_html (label, E_TEXT_TO_HTML_CONVERT_NL); - - gtk_html_stream_printf (html_stream, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\"></td><td valign=\"top\" width=\"100\"><font color=" HEADER_COLOR ">%s:</font><br><a href=\"http://www.mapquest.com/\">%s</a></td><td valign=\"top\">%s</td></tr>", html_label, _("(map)"), html); - - g_free (html); - return; - } - - adr = e_contact_get (contact, adr_field); - if (adr && - (adr->po || adr->ext || adr->street || adr->locality || adr->region || adr->code || adr->country)) { - - gtk_html_stream_printf (html_stream, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\"></td><td valign=\"top\" width=\"100\"><font color=" HEADER_COLOR ">%s:</font><br><a href=\"http://www.mapquest.com/\">%s</a></td><td valign=\"top\">", html_label, _("map")); - - if (adr->po && *adr->po) gtk_html_stream_printf (html_stream, "%s<br>", adr->po); - if (adr->ext && *adr->ext) gtk_html_stream_printf (html_stream, "%s<br>", adr->ext); - if (adr->street && *adr->street) gtk_html_stream_printf (html_stream, "%s<br>", adr->street); - if (adr->locality && *adr->locality) gtk_html_stream_printf (html_stream, "%s<br>", adr->locality); - if (adr->region && *adr->region) gtk_html_stream_printf (html_stream, "%s<br>", adr->region); - if (adr->code && *adr->code) gtk_html_stream_printf (html_stream, "%s<br>", adr->code); - if (adr->country && *adr->country) gtk_html_stream_printf (html_stream, "%s<br>", adr->country); - - gtk_html_stream_printf (html_stream, "</td></tr>"); - } - if (adr) - e_contact_address_free (adr); -} -#endif - -static void -render_name_value (GtkHTMLStream *html_stream, const char *label, const char *str, const char *icon, unsigned int html_flags) -{ - char *value = e_text_to_html (str, html_flags); - - gtk_html_stream_printf (html_stream, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\">"); - if (icon) - gtk_html_stream_printf (html_stream, "<img width=\"16\" height=\"16\" src=\"evo-icon:%s\">", icon); - gtk_html_stream_printf (html_stream, "</td><td valign=\"top\" width=\"100\" nowrap><font color=" HEADER_COLOR ">%s:</font></td> <td valign=\"top\">%s</td></tr>", label, value); - - g_free (value); -} - -static void -render_attribute (GtkHTMLStream *html_stream, EContact *contact, const char *html_label, EContactField field, const char *icon, unsigned int html_flags) -{ - const char *str; - - str = e_contact_get_const (contact, field); - - if (str && *str) { - render_name_value (html_stream, html_label, str, icon, html_flags); - } -} - -static void -accum_address (GString *gstr, EContact *contact, const char *html_label, EContactField adr_field, EContactField label_field) -{ - EContactAddress *adr; - const char *label; - - label = e_contact_get_const (contact, label_field); - if (label) { - char *html = e_text_to_html (label, E_TEXT_TO_HTML_CONVERT_NL); - -#if mapping_works - g_string_append_printf (gstr, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\"></td><td valign=\"top\" width=\"100\"><font color=" HEADER_COLOR ">%s:</font><br><a href=\"http://www.mapquest.com/\">%s</a></td><td valign=\"top\">%s</td></tr>", html_label, _("(map)"), html); -#else - g_string_append_printf (gstr, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\"></td><td valign=\"top\" width=\"100\"><font color=" HEADER_COLOR ">%s:</font></td><td valign=\"top\">%s</td></tr>", html_label, html); -#endif - - g_free (html); - return; - } - - adr = e_contact_get (contact, adr_field); - if (adr && - (adr->po || adr->ext || adr->street || adr->locality || adr->region || adr->code || adr->country)) { - - g_string_append_printf (gstr, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\"></td><td valign=\"top\" width=\"100\"><font color=" HEADER_COLOR ">%s:</font><br><a href=\"http://www.mapquest.com/\">%s</a></td><td valign=\"top\">", html_label, _("map")); - - if (adr->po && *adr->po) g_string_append_printf (gstr, "%s<br>", adr->po); - if (adr->ext && *adr->ext) g_string_append_printf (gstr, "%s<br>", adr->ext); - if (adr->street && *adr->street) g_string_append_printf (gstr, "%s<br>", adr->street); - if (adr->locality && *adr->locality) g_string_append_printf (gstr, "%s<br>", adr->locality); - if (adr->region && *adr->region) g_string_append_printf (gstr, "%s<br>", adr->region); - if (adr->code && *adr->code) g_string_append_printf (gstr, "%s<br>", adr->code); - if (adr->country && *adr->country) g_string_append_printf (gstr, "%s<br>", adr->country); - - g_string_append_printf (gstr, "</td></tr>"); - } - if (adr) - e_contact_address_free (adr); -} - -static void -accum_name_value (GString *gstr, const char *label, const char *str, const char *icon, unsigned int html_flags) -{ - char *value = e_text_to_html (str, html_flags); - - g_string_append_printf (gstr, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\">"); - if (icon) - g_string_append_printf (gstr, "<img width=\"16\" height=\"16\" src=\"evo-icon:%s\">", icon); - g_string_append_printf (gstr, "</td><td valign=\"top\" width=\"100\" nowrap><font color=" HEADER_COLOR ">%s:</font></td> <td valign=\"top\">%s</td></tr>", label, value); - - g_free (value); -} - - -static void -accum_attribute (GString *gstr, EContact *contact, const char *html_label, EContactField field, const char *icon, unsigned int html_flags) -{ - const char *str; - - str = e_contact_get_const (contact, field); - - if (str && *str) { - accum_name_value (gstr, html_label, str, icon, html_flags); - } -} - - -static void -render_contact_list (GtkHTMLStream *html_stream, EContact *contact) -{ - GList *email_list; - GList *l; - - gtk_html_stream_printf (html_stream, "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr>"); - gtk_html_stream_printf (html_stream, "<td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\">"); - gtk_html_stream_printf (html_stream, "<img width=\"16\" height=\"16\" src=\"evo-icon:" CONTACT_LIST_ICON "\">"); - gtk_html_stream_printf (html_stream, "</td><td valign=\"top\" width=\"100\" nowrap><font color=" HEADER_COLOR ">%s:</font></td> <td valign=\"top\">", _("List Members")); - - email_list = e_contact_get (contact, E_CONTACT_EMAIL); - for (l = email_list; l; l = l->next) { - char *html = e_text_to_html (l->data, E_TEXT_TO_HTML_CONVERT_ADDRESSES); - gtk_html_stream_printf (html_stream, "%s<br>", html); - g_free (html); - } - gtk_html_stream_printf (html_stream, "</td></tr></table>"); -} - -static void -start_block (GtkHTMLStream *html_stream, const char *label) -{ - gtk_html_stream_printf (html_stream, "<tr><td height=\"20\" colspan=\"3\"><font color=" HEADER_COLOR "><b>%s</b></font></td></tr>", label); -} - -static void -end_block (GtkHTMLStream *html_stream) -{ - gtk_html_stream_printf (html_stream, "<tr><td height=\"20\"> </td></tr>"); -} - -static void -render_contact (GtkHTMLStream *html_stream, EContact *contact) -{ - GString *accum; - GList *email_list, *l; -#ifdef HANDLE_MAILTO_INTERNALLY - int email_num = 0; -#endif - char *nl; - - gtk_html_stream_printf (html_stream, "<table border=\"0\">"); - - accum = g_string_new (""); - nl = ""; - - start_block (html_stream, ""); - - email_list = e_contact_get (contact, E_CONTACT_EMAIL); - for (l = email_list; l; l = l->next) { -#ifdef HANDLE_MAILTO_INTERNALLY - char *html = e_text_to_html (l->data, 0); - g_string_append_printf (accum, "%s<a href=\"internal-mailto:%d\">%s</a>", nl, email_num, html); - email_num ++; - g_free (html); - nl = "<br>"; - -#else - g_string_append_printf (accum, "%s%s", nl, (char*)l->data); - nl = "\n"; -#endif - } - g_list_foreach (email_list, (GFunc)g_free, NULL); - g_list_free (email_list); - - if (accum->len) { - -#ifdef HANDLE_MAILTO_INTERNALLY - gtk_html_stream_printf (html_stream, "<tr><td valign=\"top\" width=\"" IMAGE_COL_WIDTH "\">"); - gtk_html_stream_printf (html_stream, - "</td><td valign=\"top\" width=\"100\" nowrap><font color=" HEADER_COLOR ">%s:</font></td> <td valign=\"top\">%s</td></tr>", - _("E-mail"), accum->str); -#else - render_name_value (html_stream, _("E-mail"), accum->str, NULL, - E_TEXT_TO_HTML_CONVERT_ADDRESSES | E_TEXT_TO_HTML_CONVERT_NL); -#endif - } - - g_string_assign (accum, ""); - - accum_attribute (accum, contact, _("AIM"), E_CONTACT_IM_AIM_HOME_1, AIM_ICON, 0); - accum_attribute (accum, contact, _("GroupWise"), E_CONTACT_IM_GROUPWISE_HOME_1, GROUPWISE_ICON, 0); - accum_attribute (accum, contact, _("ICQ"), E_CONTACT_IM_ICQ_HOME_1, ICQ_ICON, 0); - accum_attribute (accum, contact, _("Jabber"), E_CONTACT_IM_JABBER_HOME_1, JABBER_ICON, 0); - accum_attribute (accum, contact, _("MSN"), E_CONTACT_IM_MSN_HOME_1, MSN_ICON, 0); - accum_attribute (accum, contact, _("Yahoo"), E_CONTACT_IM_YAHOO_HOME_1, YAHOO_ICON, 0); - - if (accum->len > 0) - gtk_html_stream_printf (html_stream, accum->str); - - end_block (html_stream); - - g_string_assign (accum, ""); - - accum_attribute (accum, contact, _("Organization"), E_CONTACT_ORG, NULL, 0); - accum_attribute (accum, contact, _("Position"), E_CONTACT_TITLE, NULL, 0); - accum_attribute (accum, contact, _("Video Conferencing"), E_CONTACT_VIDEO_URL, VIDEOCONF_ICON, E_TEXT_TO_HTML_CONVERT_URLS); - accum_attribute (accum, contact, _("Phone"), E_CONTACT_PHONE_BUSINESS, NULL, 0); - accum_attribute (accum, contact, _("Fax"), E_CONTACT_PHONE_BUSINESS_FAX, NULL, 0); - accum_address (accum, contact, _("Address"), E_CONTACT_ADDRESS_WORK, E_CONTACT_ADDRESS_LABEL_WORK); - - if (accum->len > 0) { - start_block (html_stream, _("work")); - gtk_html_stream_printf (html_stream, accum->str); - end_block (html_stream); - } - - g_string_assign (accum, ""); - - accum_attribute (accum, contact, _("WWW"), E_CONTACT_HOMEPAGE_URL, NULL, E_TEXT_TO_HTML_CONVERT_URLS); - accum_attribute (accum, contact, _("Blog"), E_CONTACT_BLOG_URL, NULL, E_TEXT_TO_HTML_CONVERT_URLS); - - accum_attribute (accum, contact, _("Phone"), E_CONTACT_PHONE_HOME, NULL, 0); - accum_attribute (accum, contact, _("Mobile Phone"), E_CONTACT_PHONE_MOBILE, NULL, 0); - accum_address (accum, contact, _("Address"), E_CONTACT_ADDRESS_HOME, E_CONTACT_ADDRESS_LABEL_HOME); - - if (accum->len > 0) { - start_block (html_stream, _("personal")); - gtk_html_stream_printf (html_stream, accum->str); - end_block (html_stream); - } - - start_block (html_stream, ""); - - render_attribute (html_stream, contact, _("Note"), E_CONTACT_NOTE, NULL, - E_TEXT_TO_HTML_CONVERT_ADDRESSES | E_TEXT_TO_HTML_CONVERT_URLS | E_TEXT_TO_HTML_CONVERT_NL); - end_block (html_stream); - - gtk_html_stream_printf (html_stream, "</table>"); -} - -static void -eab_contact_display_render_normal (EABContactDisplay *display, EContact *contact) -{ - GtkHTMLStream *html_stream; - - if (display->priv->contact) - g_object_unref (display->priv->contact); - display->priv->contact = contact; - if (display->priv->contact) - g_object_ref (display->priv->contact); - - html_stream = gtk_html_begin (GTK_HTML (display)); - gtk_html_stream_write (html_stream, HTML_HEADER, sizeof (HTML_HEADER) - 1); - gtk_html_stream_write (html_stream, "<body>\n", 7); - - if (contact) { - char *str, *html; - EContactPhoto *photo; - - gtk_html_stream_printf (html_stream, "<table cellspacing=\"20\" border=\"0\"><td valign=\"top\">"); - photo = e_contact_get (contact, E_CONTACT_PHOTO); - if (!photo) - photo = e_contact_get (contact, E_CONTACT_LOGO); - if (photo) { - gtk_html_stream_printf (html_stream, "<img border=\"1\" src=\"internal-contact-photo:\">"); - e_contact_photo_free (photo); - } - - gtk_html_stream_printf (html_stream, "</td><td valign=\"top\">\n"); - - str = e_contact_get_const (contact, E_CONTACT_FILE_AS); - if (!str) - str = e_contact_get_const (contact, E_CONTACT_FULL_NAME); - - if (str) { - html = e_text_to_html (str, 0); - gtk_html_stream_printf (html_stream, "<h2>%s</h2>", html); - g_free (html); - } - - - if (e_contact_get (contact, E_CONTACT_IS_LIST)) - render_contact_list (html_stream, contact); - else - render_contact (html_stream, contact); - - gtk_html_stream_printf (html_stream, "</td></tr></table>\n"); - } - - gtk_html_stream_write (html_stream, "</body></html>\n", 15); - gtk_html_end (GTK_HTML (display), html_stream, GTK_HTML_STREAM_OK); -} - -static void -eab_contact_display_render_compact (EABContactDisplay *display, EContact *contact) -{ - GtkHTMLStream *html_stream; - - if (display->priv->contact) - g_object_unref (display->priv->contact); - display->priv->contact = contact; - if (display->priv->contact) - g_object_ref (display->priv->contact); - - html_stream = gtk_html_begin (GTK_HTML (display)); - gtk_html_stream_write (html_stream, HTML_HEADER, sizeof (HTML_HEADER) - 1); - gtk_html_stream_write (html_stream, "<body>\n", 7); - - if (contact) { - char *str, *html; - EContactPhoto *photo; - - gtk_html_stream_printf (html_stream, - "<table width=\"100%%\" cellpadding=1 cellspacing=0 bgcolor=\"#000000\">" - "<tr><td valign=\"top\">" - "<table width=\"100%%\" cellpadding=0 cellspacing=0 bgcolor=\"#eeeeee\">" - "<tr><td valign=\"top\">" - "<table>" - "<tr><td valign=\"top\">"); - - photo = e_contact_get (contact, E_CONTACT_PHOTO); - if (!photo) - photo = e_contact_get (contact, E_CONTACT_LOGO); - if (photo) { - int calced_width = MAX_COMPACT_IMAGE_DIMENSION, calced_height = MAX_COMPACT_IMAGE_DIMENSION; - GdkPixbufLoader *loader = gdk_pixbuf_loader_new (); - GdkPixbuf *pixbuf; - - /* figure out if we need to downscale the - image here. we don't scale the pixbuf - itself, just insert width/height tags in - the html */ - gdk_pixbuf_loader_write (loader, photo->data, photo->length, NULL); - pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); - if (pixbuf) - gdk_pixbuf_ref (pixbuf); - gdk_pixbuf_loader_close (loader, NULL); - g_object_unref (loader); - if (pixbuf) { - int max_dimension; - - calced_width = gdk_pixbuf_get_width (pixbuf); - calced_height = gdk_pixbuf_get_height (pixbuf); - - max_dimension = calced_width; - if (max_dimension < calced_height) - max_dimension = calced_height; - - if (max_dimension > MAX_COMPACT_IMAGE_DIMENSION) { - calced_width *= ((float)MAX_COMPACT_IMAGE_DIMENSION / max_dimension); - calced_height *= ((float)MAX_COMPACT_IMAGE_DIMENSION / max_dimension); - } - } - - gdk_pixbuf_unref (pixbuf); - gtk_html_stream_printf (html_stream, "<img width=\"%d\" height=\"%d\" src=\"internal-contact-photo:\">", - calced_width, calced_height); - e_contact_photo_free (photo); - } - - gtk_html_stream_printf (html_stream, "</td><td valign=\"top\">\n"); - - str = e_contact_get_const (contact, E_CONTACT_FILE_AS); - if (str) { - html = e_text_to_html (str, 0); - gtk_html_stream_printf (html_stream, "<b>%s</b>", html); - g_free (html); - } - else { - str = e_contact_get_const (contact, E_CONTACT_FULL_NAME); - if (str) { - html = e_text_to_html (str, 0); - gtk_html_stream_printf (html_stream, "<b>%s</b>", html); - g_free (html); - } - } - - gtk_html_stream_write (html_stream, "<hr>", 4); - - if (e_contact_get (contact, E_CONTACT_IS_LIST)) { - GList *email_list; - GList *l; - - gtk_html_stream_printf (html_stream, "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr><td valign=\"top\">"); - gtk_html_stream_printf (html_stream, "<b>%s:</b> <td>", _("List Members")); - - email_list = e_contact_get (contact, E_CONTACT_EMAIL); - for (l = email_list; l; l = l->next) { - char *html = e_text_to_html (l->data, 0); - gtk_html_stream_printf (html_stream, "%s, ", html); - g_free (html); - } - gtk_html_stream_printf (html_stream, "</td></tr></table>"); - } - else { - gboolean comma = FALSE; - str = e_contact_get_const (contact, E_CONTACT_TITLE); - if (str) { - html = e_text_to_html (str, 0); - gtk_html_stream_printf (html_stream, "<b>%s:</b> %s<br>", _("Job Title"), str); - g_free (html); - } - - gtk_html_stream_printf (html_stream, "<b>%s:</b> ", _("Email")); - str = e_contact_get_const (contact, E_CONTACT_EMAIL_1); - if (str) { - html = e_text_to_html (str, 0); - gtk_html_stream_printf (html_stream, "%s", str); - g_free (html); - comma = TRUE; - } - str = e_contact_get_const (contact, E_CONTACT_EMAIL_2); - if (str) { - html = e_text_to_html (str, 0); - gtk_html_stream_printf (html_stream, "%s%s", comma ? ", " : "", str); - g_free (html); - comma = TRUE; - } - str = e_contact_get_const (contact, E_CONTACT_EMAIL_3); - if (str) { - html = e_text_to_html (str, 0); - gtk_html_stream_printf (html_stream, "%s%s", comma ? ", " : "", str); - g_free (html); - } - gtk_html_stream_write (html_stream, "<br>", 4); - - str = e_contact_get_const (contact, E_CONTACT_HOMEPAGE_URL); - if (str) { - html = e_text_to_html (str, E_TEXT_TO_HTML_CONVERT_URLS); - gtk_html_stream_printf (html_stream, "<b>%s:</b> %s<br>", - _("Home page"), html); - g_free (html); - } - - str = e_contact_get_const (contact, E_CONTACT_BLOG_URL); - if (str) { - html = e_text_to_html (str, E_TEXT_TO_HTML_CONVERT_URLS); - gtk_html_stream_printf (html_stream, "<b>%s:</b> %s<br>", - _("Blog"), html); - } - } - - gtk_html_stream_printf (html_stream, "</td></tr></table></td></tr></table></td></tr></table>\n"); - } - - gtk_html_stream_write (html_stream, "</body></html>\n", 15); - gtk_html_end (GTK_HTML (display), html_stream, GTK_HTML_STREAM_OK); -} - -void -eab_contact_display_render (EABContactDisplay *display, EContact *contact, - EABContactDisplayRenderMode mode) -{ - switch (mode) { - case EAB_CONTACT_DISPLAY_RENDER_NORMAL: - eab_contact_display_render_normal (display, contact); - break; - case EAB_CONTACT_DISPLAY_RENDER_COMPACT: - eab_contact_display_render_compact (display, contact); - break; - } -} - -GtkWidget* -eab_contact_display_new (void) -{ - EABContactDisplay *display; - - display = g_object_new (EAB_TYPE_CONTACT_DISPLAY, NULL); - - display->priv = g_new0 (EABContactDisplayPrivate, 1); - - gtk_html_set_default_content_type (GTK_HTML (display), "text/html; charset=utf-8"); - - gtk_html_set_editable (GTK_HTML (display), FALSE); - - g_signal_connect (display, "url_requested", - G_CALLBACK (on_url_requested), - display); - g_signal_connect (display, "link_clicked", - G_CALLBACK (on_link_clicked), - display); -#if 0 - g_signal_connect (display, "object_requested", - G_CALLBACK (on_object_requested), - mail_display); - g_signal_connect (display, "button_press_event", - G_CALLBACK (html_button_press_event), mail_display); - g_signal_connect (display, "motion_notify_event", - G_CALLBACK (html_motion_notify_event), mail_display); - g_signal_connect (display, "enter_notify_event", - G_CALLBACK (html_enter_notify_event), mail_display); - g_signal_connect (display, "iframe_created", - G_CALLBACK (html_iframe_created), mail_display); - g_signal_connect (display, "on_url", - G_CALLBACK (html_on_url), mail_display); -#endif - - return GTK_WIDGET (display); -} - - -static void -eab_contact_display_init (GObject *object) -{ -} - -static void -eab_contact_display_class_init (GtkObjectClass *object_class) -{ - /* object_class->destroy = mail_display_destroy;*/ -} - -GType -eab_contact_display_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (EABContactDisplayClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) eab_contact_display_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EABContactDisplay), - 0, /* n_preallocs */ - (GInstanceInitFunc) eab_contact_display_init, - }; - - type = g_type_register_static (PARENT_TYPE, "EABContactDisplay", &info, 0); - } - - return type; -} diff --git a/addressbook/gui/widgets/eab-contact-display.h b/addressbook/gui/widgets/eab-contact-display.h deleted file mode 100644 index 08c3936cad..0000000000 --- a/addressbook/gui/widgets/eab-contact-display.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Chris Toshok <toshok@ximian.com> - * - * Copyright 2003 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifndef _EAB_CONTACT_DISPLAY_H_ -#define _EAB_CONTACT_DISPLAY_H_ - -#include <gtkhtml/gtkhtml.h> -#include <libebook/e-contact.h> - -#define EAB_TYPE_CONTACT_DISPLAY (eab_contact_display_get_type ()) -#define EAB_CONTACT_DISPLAY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EAB_TYPE_CONTACT_DISPLAY, EABContactDisplay)) -#define EAB_CONTACT_DISPLAY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), EAB_TYPE_CONTACT_DISPLAY, EABContactDisplayClass)) -#define IS_EAB_CONTACT_DISPLAY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EAB_TYPE_CONTACT_DISPLAY)) -#define IS_EAB_CONTACT_DISPLAY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EAB_TYPE_CONTACT_DISPLAY)) - -typedef struct _EABContactDisplay EABContactDisplay; -typedef struct _EABContactDisplayPrivate EABContactDisplayPrivate; -typedef struct _EABContactDisplayClass EABContactDisplayClass; - -typedef enum { - EAB_CONTACT_DISPLAY_RENDER_NORMAL, /* for use in the preview pane */ - EAB_CONTACT_DISPLAY_RENDER_COMPACT /* for use with embedded vcards (e.g, the EABVCardControl) */ -} EABContactDisplayRenderMode; - -struct _EABContactDisplay { - GtkHTML parent; - - EABContactDisplayPrivate *priv; -}; - -struct _EABContactDisplayClass { - GtkHTMLClass parent_class; -}; - -GtkType eab_contact_display_get_type (void); -GtkWidget * eab_contact_display_new (void); - -void eab_contact_display_render (EABContactDisplay *display, EContact *contact, - EABContactDisplayRenderMode render_mode); - -#endif /* _EAB_CONTACT_DISPLAY_H_ */ diff --git a/addressbook/gui/widgets/eab-gui-util.c b/addressbook/gui/widgets/eab-gui-util.c deleted file mode 100644 index a1715c86fd..0000000000 --- a/addressbook/gui/widgets/eab-gui-util.c +++ /dev/null @@ -1,1090 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-table-field-chooser.c - * Copyright (C) 2001 Ximian, Inc. - * Author: Chris Toshok <toshok@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> - -#include <unistd.h> -#include <fcntl.h> -#include <errno.h> -#include <string.h> - -#include <libedataserverui/e-source-selector.h> -#include <gal/util/e-util.h> -#include "eab-gui-util.h" -#include "util/eab-book-util.h" -#include "util/e-destination.h" -#include "widgets/misc/e-error.h" -#include "widgets/misc/e-image-chooser.h" -#include <e-util/e-icon-factory.h> - -#include <gnome.h> - -#include "addressbook/gui/contact-editor/eab-editor.h" -#include "addressbook/gui/contact-editor/e-contact-editor.h" -#include "addressbook/gui/contact-list-editor/e-contact-list-editor.h" -#include "addressbook/gui/component/addressbook-component.h" -#include "addressbook/gui/component/addressbook.h" - -/* the NULL's in this table correspond to the status codes - that should *never* be generated by a backend */ -static const char *status_to_string[] = { - /* E_BOOK_ERROR_OK */ N_("Success"), - /* E_BOOK_ERROR_INVALID_ARG */ NULL, - /* E_BOOK_ERROR_BUSY */ N_("Backend busy"), - /* E_BOOK_ERROR_REPOSITORY_OFFLINE */ N_("Repository offline"), - /* E_BOOK_ERROR_NO_SUCH_BOOK */ N_("Address Book does not exist"), - /* E_BOOK_ERROR_NO_SELF_CONTACT */ N_("No Self Contact defined"), - /* E_BOOK_ERROR_URI_NOT_LOADED */ NULL, - /* E_BOOK_ERROR_URI_ALREADY_LOADED */ NULL, - /* E_BOOK_ERROR_PERMISSION_DENIED */ N_("Permission denied"), - /* E_BOOK_ERROR_CONTACT_NOT_FOUND */ N_("Contact not found"), - /* E_BOOK_ERROR_CONTACT_ID_ALREADY_EXISTS */ N_("Contact ID already exists"), - /* E_BOOK_ERROR_PROTOCOL_NOT_SUPPORTED */ N_("Protocol not supported"), - /* E_BOOK_ERROR_CANCELLED */ N_("Cancelled"), - /* E_BOOK_ERROR_COULD_NOT_CANCEL */ N_("Could not cancel"), - /* E_BOOK_ERROR_AUTHENTICATION_FAILED */ N_("Authentication Failed"), - /* E_BOOK_ERROR_AUTHENTICATION_REQUIRED */ N_("Authentication Required"), - /* E_BOOK_ERROR_TLS_NOT_AVAILABLE */ N_("TLS not Available"), - /* E_BOOK_ERROR_CORBA_EXCEPTION */ NULL, - /* E_BOOK_ERROR_NO_SUCH_SOURCE */ N_("No such source"), - /* E_BOOK_ERROR_OTHER_ERROR */ N_("Other error") -}; - -void -eab_error_dialog (const char *msg, EBookStatus status) -{ - const char *status_str = status_to_string [status]; - - if (status_str) - e_error_run (NULL, "addressbook:generic-error", msg, status_str, NULL); -} - -void -eab_load_error_dialog (GtkWidget *parent, ESource *source, EBookStatus status) -{ - char *label_string, *uri; - - g_return_if_fail (source != NULL); - - uri = e_source_get_uri (source); - - if (!strncmp (uri, "file:", 5)) { - label_string = - _("We were unable to open this addressbook. Please check that the " - "path exists and that you have permission to access it."); - } - else if (!strncmp (uri, "ldap:", 5)) { - /* special case for ldap: contact folders so we can tell the user about openldap */ -#if HAVE_LDAP - label_string = - _("We were unable to open this addressbook. This either " - "means you have entered an incorrect URI, or the LDAP server " - "is unreachable."); -#else - label_string = - _("This version of Evolution does not have LDAP support " - "compiled in to it. If you want to use LDAP in Evolution, " - "you must install an LDAP-enabled Evolution package."); -#endif - } else { - /* other network folders */ - label_string = - _("We were unable to open this addressbook. This either " - "means you have entered an incorrect URI, or the server " - "is unreachable."); - } - - e_error_run ((GtkWindow *) parent, "addressbook:load-error", label_string, NULL); - - g_free (uri); -} - -void -eab_search_result_dialog (GtkWidget *parent, - EBookViewStatus status) -{ - char *str = NULL; - - switch (status) { - case E_BOOK_VIEW_STATUS_OK: - return; - case E_BOOK_VIEW_STATUS_SIZE_LIMIT_EXCEEDED: - str = _("More cards matched this query than either the server is \n" - "configured to return or Evolution is configured to display.\n" - "Please make your search more specific or raise the result limit in\n" - "the directory server preferences for this addressbook."); - break; - case E_BOOK_VIEW_STATUS_TIME_LIMIT_EXCEEDED: - str = _("The time to execute this query exceeded the server limit or the limit\n" - "you have configured for this addressbook. Please make your search\n" - "more specific or raise the time limit in the directory server\n" - "preferences for this addressbook."); - break; - case E_BOOK_VIEW_ERROR_INVALID_QUERY: - str = _("The backend for this addressbook was unable to parse this query."); - break; - case E_BOOK_VIEW_ERROR_QUERY_REFUSED: - str = _("The backend for this addressbook refused to perform this query."); - break; - case E_BOOK_VIEW_ERROR_OTHER_ERROR: - str = _("This query did not complete successfully."); - break; - default: - g_assert_not_reached (); - } - - e_error_run ((GtkWindow *) parent, "addressbook:search-error", str, NULL); -} - -gint -eab_prompt_save_dialog (GtkWindow *parent) -{ - return e_error_run (parent, "addressbook:prompt-save", NULL); -} - -static void -added_cb (EBook* book, EBookStatus status, EContact *contact, - gpointer data) -{ - gboolean is_list = GPOINTER_TO_INT (data); - - if (status != E_BOOK_ERROR_OK) { - eab_error_dialog (is_list ? _("Error adding list") : _("Error adding contact"), status); - } -} - -static void -modified_cb (EBook* book, EBookStatus status, EContact *contact, - gpointer data) -{ - gboolean is_list = GPOINTER_TO_INT (data); - - if (status != E_BOOK_ERROR_OK) { - eab_error_dialog (is_list ? _("Error modifying list") : _("Error modifying contact"), - status); - } -} - -static void -deleted_cb (EBook* book, EBookStatus status, EContact *contact, - gpointer data) -{ - gboolean is_list = GPOINTER_TO_INT (data); - - if (status != E_BOOK_ERROR_OK) { - eab_error_dialog (is_list ? _("Error removing list") : _("Error removing contact"), - status); - } -} - -static void -editor_closed_cb (GtkObject *editor, gpointer data) -{ - g_object_unref (editor); -} - -EContactEditor * -eab_show_contact_editor (EBook *book, EContact *contact, - gboolean is_new_contact, - gboolean editable) -{ - EContactEditor *ce; - - ce = e_contact_editor_new (book, contact, is_new_contact, editable); - - g_signal_connect (ce, "contact_added", - G_CALLBACK (added_cb), GINT_TO_POINTER (FALSE)); - g_signal_connect (ce, "contact_modified", - G_CALLBACK (modified_cb), GINT_TO_POINTER (FALSE)); - g_signal_connect (ce, "contact_deleted", - G_CALLBACK (deleted_cb), GINT_TO_POINTER (FALSE)); - g_signal_connect (ce, "editor_closed", - G_CALLBACK (editor_closed_cb), NULL); - - return ce; -} - -EContactListEditor * -eab_show_contact_list_editor (EBook *book, EContact *contact, - gboolean is_new_contact, - gboolean editable) -{ - EContactListEditor *ce; - - ce = e_contact_list_editor_new (book, contact, is_new_contact, editable); - - g_signal_connect (ce, "contact_added", - G_CALLBACK (added_cb), GINT_TO_POINTER (TRUE)); - g_signal_connect (ce, "contact_modified", - G_CALLBACK (modified_cb), GINT_TO_POINTER (TRUE)); - g_signal_connect (ce, "contact_deleted", - G_CALLBACK (deleted_cb), GINT_TO_POINTER (TRUE)); - g_signal_connect (ce, "editor_closed", - G_CALLBACK (editor_closed_cb), GINT_TO_POINTER (TRUE)); - - eab_editor_show (EAB_EDITOR (ce)); - - return ce; -} - -static void -view_contacts (EBook *book, GList *list, gboolean editable) -{ - for (; list; list = list->next) { - EContact *contact = list->data; - if (e_contact_get (contact, E_CONTACT_IS_LIST)) - eab_show_contact_list_editor (book, contact, FALSE, editable); - else - eab_show_contact_editor (book, contact, FALSE, editable); - } -} - -void -eab_show_multiple_contacts (EBook *book, - GList *list, - gboolean editable) -{ - if (list) { - int length = g_list_length (list); - if (length > 5) { - GtkWidget *dialog; - gint response; - - dialog = gtk_message_dialog_new (NULL, - 0, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_YES_NO, - ngettext("Opening %d contact will open %d new window as well.\n" - "Do you really want to display this contact?", - "Opening %d contacts will open %d new windows as well.\n" - "Do you really want to display all of these contacts?", - length), - length, - length); - - response = gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - if (response == GTK_RESPONSE_YES) - view_contacts (book, list, editable); - } else { - view_contacts (book, list, editable); - } - } -} - - -static gint -file_exists(GtkWindow *window, const char *filename) -{ - GtkWidget *dialog; - gint response; - - dialog = gtk_message_dialog_new (window, - 0, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, - _("%s already exists\nDo you want to overwrite it?"), filename); - - gtk_dialog_add_buttons (GTK_DIALOG (dialog), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - _("Overwrite"), GTK_RESPONSE_ACCEPT, - NULL); - - response = gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - return response; -} - -typedef struct { - GtkWidget *filesel; - char *vcard; -} SaveAsInfo; - -static void -save_it(GtkWidget *widget, SaveAsInfo *info) -{ - const char *filename; - gint error = 0; - gint response = 0; - - -#ifdef USE_GTKFILECHOOSER - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (info->filesel)); -#else - filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (info->filesel)); -#endif - - error = e_write_file (filename, info->vcard, O_WRONLY | O_CREAT | O_EXCL | O_TRUNC); - - if (error == EEXIST) { - response = file_exists(GTK_WINDOW (info->filesel), filename); - switch (response) { - case GTK_RESPONSE_ACCEPT : /* Overwrite */ - e_write_file(filename, info->vcard, O_WRONLY | O_CREAT | O_TRUNC); - break; - case GTK_RESPONSE_CANCEL : /* cancel */ - return; - } - } else if (error != 0) { - e_error_run (GTK_WINDOW (info->filesel), "addressbook:save-error", filename, g_strerror (errno)); - return; - } - - gtk_widget_destroy(GTK_WIDGET(info->filesel)); -} - -static void -close_it(GtkWidget *widget, SaveAsInfo *info) -{ - gtk_widget_destroy (GTK_WIDGET (info->filesel)); -} - -static void -destroy_it(void *data, GObject *where_the_object_was) -{ - SaveAsInfo *info = data; - g_free (info->vcard); - g_free (info); -} - -#ifdef USE_GTKFILECHOOSER -static void -filechooser_response (GtkWidget *widget, gint response_id, SaveAsInfo *info) -{ - if (response_id == GTK_RESPONSE_ACCEPT) - save_it (widget, info); - else - close_it (widget, info); -} -#endif - -static char * -make_safe_filename (char *name) -{ - char *safe; - - if (!name) { - /* This is a filename. Translators take note. */ - name = _("card.vcf"); - } - - if (!g_strrstr (name, ".vcf")) - safe = g_strdup_printf ("%s%s", name, ".vcf"); - else - safe = g_strdup (name); - - e_filename_make_safe (safe); - - return safe; -} - -static void -source_selection_changed_cb (GtkWidget *selector, GtkWidget *ok_button) -{ - gtk_widget_set_sensitive (ok_button, - e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (selector)) ? - TRUE : FALSE); -} - -ESource * -eab_select_source (const gchar *title, const gchar *message, const gchar *select_uid, GtkWindow *parent) -{ - ESource *source; - ESourceList *source_list; - GtkWidget *dialog; - GtkWidget *ok_button; - GtkWidget *cancel_button; - GtkWidget *label; - GtkWidget *selector; - GtkWidget *scrolled_window; - gint response; - - if (!e_book_get_addressbooks (&source_list, NULL)) - return NULL; - - dialog = gtk_dialog_new_with_buttons (title, parent, - GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, - NULL); - gtk_window_set_default_size (GTK_WINDOW (dialog), 200, 350); - - cancel_button = gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); - ok_button = gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT); - gtk_widget_set_sensitive (ok_button, FALSE); - - label = gtk_label_new (message); - - selector = e_source_selector_new (source_list); - e_source_selector_show_selection (E_SOURCE_SELECTOR (selector), FALSE); - g_signal_connect (selector, "primary_selection_changed", - G_CALLBACK (source_selection_changed_cb), ok_button); - - if (select_uid) { - source = e_source_list_peek_source_by_uid (source_list, select_uid); - if (source) - e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (selector), source); - } - - scrolled_window = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (scrolled_window), selector); - - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), label, FALSE, FALSE, 4); - gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scrolled_window, TRUE, TRUE, 4); - - gtk_widget_show_all (dialog); - response = gtk_dialog_run (GTK_DIALOG (dialog)); - - if (response == GTK_RESPONSE_ACCEPT) - source = e_source_selector_peek_primary_selection (E_SOURCE_SELECTOR (selector)); - else - source = NULL; - - gtk_widget_destroy (dialog); - return source; -} - -void -eab_contact_save (char *title, EContact *contact, GtkWindow *parent_window) -{ - GtkWidget *filesel; - char *file, *full_filename; - char *name; - SaveAsInfo *info = g_new(SaveAsInfo, 1); - - name = e_contact_get (contact, E_CONTACT_FILE_AS); - file = make_safe_filename (name); - -#ifdef USE_GTKFILECHOOSER - filesel = gtk_file_chooser_dialog_new (title, - parent_window, - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, - NULL); - gtk_dialog_set_default_response (GTK_DIALOG (filesel), GTK_RESPONSE_ACCEPT); - - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filesel), g_get_home_dir ()); - gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filesel), file); - - info->filesel = filesel; - info->vcard = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30); - - g_signal_connect (G_OBJECT (filesel), "response", - G_CALLBACK (filechooser_response), info); - g_object_weak_ref (G_OBJECT (filesel), destroy_it, info); -#else - filesel = gtk_file_selection_new (title); - - full_filename = g_strdup_printf ("%s/%s", g_get_home_dir (), file); - gtk_file_selection_set_filename (GTK_FILE_SELECTION (filesel), full_filename); - g_free (full_filename); - - info->filesel = filesel; - info->vcard = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30); - - g_signal_connect(G_OBJECT (GTK_FILE_SELECTION (filesel)->ok_button), "clicked", - G_CALLBACK (save_it), info); - g_signal_connect(G_OBJECT (GTK_FILE_SELECTION (filesel)->cancel_button), "clicked", - G_CALLBACK (close_it), info); - g_object_weak_ref (G_OBJECT (filesel), destroy_it, info); -#endif - - if (parent_window) { - gtk_window_set_transient_for (GTK_WINDOW (filesel), - parent_window); - gtk_window_set_modal (GTK_WINDOW (filesel), TRUE); - } - - gtk_widget_show(GTK_WIDGET(filesel)); - g_free (file); -} - -void -eab_contact_list_save (char *title, GList *list, GtkWindow *parent_window) -{ - GtkWidget *filesel; - SaveAsInfo *info = g_new(SaveAsInfo, 1); - char *file, *full_filename; - -#ifdef USE_GTKFILECHOOSER - filesel = gtk_file_chooser_dialog_new (title, - parent_window, - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, - NULL); - gtk_dialog_set_default_response (GTK_DIALOG (filesel), GTK_RESPONSE_ACCEPT); -#else - filesel = gtk_file_selection_new(title); -#endif - - /* This is a filename. Translators take note. */ - if (list && list->data && list->next == NULL) { - char *name; - name = e_contact_get (E_CONTACT (list->data), E_CONTACT_FILE_AS); - if (!name) - name = e_contact_get (E_CONTACT (list->data), E_CONTACT_FULL_NAME); - - file = make_safe_filename (name); - } else { - file = make_safe_filename (_("list")); - } - -#ifdef USE_GTKFILECHOOSER - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filesel), g_get_home_dir ()); - gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filesel), file); -#else - full_filename = g_strdup_printf ("%s/%s", g_get_home_dir (), file); - gtk_file_selection_set_filename (GTK_FILE_SELECTION (filesel), full_filename); - g_free (full_filename); -#endif - - info->filesel = filesel; - info->vcard = eab_contact_list_to_string (list); - -#ifdef USE_GTKFILECHOOSER - g_signal_connect (G_OBJECT (filesel), "response", - G_CALLBACK (filechooser_response), info); - g_object_weak_ref (G_OBJECT (filesel), destroy_it, info); -#else - g_signal_connect(G_OBJECT (GTK_FILE_SELECTION (filesel)->ok_button), "clicked", - G_CALLBACK (save_it), info); - g_signal_connect(G_OBJECT (GTK_FILE_SELECTION (filesel)->cancel_button), "clicked", - G_CALLBACK (close_it), info); - g_object_weak_ref (G_OBJECT (filesel), destroy_it, info); -#endif - - if (parent_window) { - gtk_window_set_transient_for (GTK_WINDOW (filesel), - parent_window); - gtk_window_set_modal (GTK_WINDOW (filesel), TRUE); - } - - gtk_widget_show(GTK_WIDGET(filesel)); - g_free (file); -} - -typedef struct ContactCopyProcess_ ContactCopyProcess; - -typedef void (*ContactCopyDone) (ContactCopyProcess *process); - -struct ContactCopyProcess_ { - int count; - GList *contacts; - EBook *source; - EBook *destination; - ContactCopyDone done_cb; -}; - -static void -contact_deleted_cb (EBook* book, EBookStatus status, gpointer user_data) -{ - if (status != E_BOOK_ERROR_OK) { - eab_error_dialog (_("Error removing contact"), status); - } -} - -static void -do_delete (gpointer data, gpointer user_data) -{ - EBook *book = user_data; - EContact *contact = data; - - e_book_async_remove_contact(book, contact, contact_deleted_cb, NULL); -} - -static void -delete_contacts (ContactCopyProcess *process) -{ - g_list_foreach (process->contacts, - do_delete, - process->source); -} - -static void -process_unref (ContactCopyProcess *process) -{ - process->count --; - if (process->count == 0) { - if (process->done_cb) { - process->done_cb (process); - } - e_free_object_list(process->contacts); - g_object_unref (process->source); - g_object_unref (process->destination); - g_free (process); - } -} - -static void -contact_added_cb (EBook* book, EBookStatus status, const char *id, gpointer user_data) -{ - ContactCopyProcess *process = user_data; - - if (status != E_BOOK_ERROR_OK) { - eab_error_dialog (_("Error adding contact"), status); - } else { - process_unref (process); - } -} - -static void -do_copy (gpointer data, gpointer user_data) -{ - EBook *book; - EContact *contact; - ContactCopyProcess *process; - - process = user_data; - contact = data; - - book = process->destination; - - process->count ++; - e_book_async_add_contact(book, contact, contact_added_cb, process); -} - -static void -got_book_cb (EBook *book, EBookStatus status, gpointer closure) -{ - ContactCopyProcess *process; - process = closure; - if (status == E_BOOK_ERROR_OK) { - process->destination = book; - g_object_ref (book); - g_list_foreach (process->contacts, - do_copy, - process); - } - process_unref (process); -} - -void -eab_transfer_contacts (EBook *source, GList *contacts /* adopted */, gboolean delete_from_source, GtkWindow *parent_window) -{ - EBook *dest; - ESource *destination_source; - static char *last_uid = NULL; - ContactCopyProcess *process; - char *desc; - - if (contacts == NULL) - return; - - if (last_uid == NULL) - last_uid = g_strdup (""); - - if (contacts->next == NULL) { - if (delete_from_source) - desc = _("Move contact to"); - else - desc = _("Copy contact to"); - } else { - if (delete_from_source) - desc = _("Move contacts to"); - else - desc = _("Copy contacts to"); - } - - destination_source = eab_select_source (desc, _("Select target addressbook."), - last_uid, parent_window); - - if (!destination_source) - return; - - if (strcmp (last_uid, e_source_peek_uid (destination_source)) != 0) { - g_free (last_uid); - last_uid = g_strdup (e_source_peek_uid (destination_source)); - } - - process = g_new (ContactCopyProcess, 1); - process->count = 1; - process->source = source; - g_object_ref (source); - process->contacts = contacts; - process->destination = NULL; - - if (delete_from_source) - process->done_cb = delete_contacts; - else - process->done_cb = NULL; - - dest = e_book_new (destination_source, NULL); - addressbook_load (dest, got_book_cb, process); -} - -#include <Evolution-Composer.h> - -#define COMPOSER_OAFID "OAFIID:GNOME_Evolution_Mail_Composer:" BASE_VERSION - -typedef struct { - EContact *contact; - int email_num; /* if the contact is a person (not a list), the email address to use */ -} ContactAndEmailNum; - -static void -eab_send_to_contact_and_email_num_list (GList *c) -{ - GNOME_Evolution_Composer composer_server; - CORBA_Environment ev; - GNOME_Evolution_Composer_RecipientList *to_list, *cc_list, *bcc_list; - CORBA_char *subject; - int to_i, bcc_i; - GList *iter; - gint to_length = 0, bcc_length = 0; - - if (c == NULL) - return; - - CORBA_exception_init (&ev); - - composer_server = bonobo_activation_activate_from_id (COMPOSER_OAFID, 0, NULL, &ev); - - /* Figure out how many addresses of each kind we have. */ - for (iter = c; iter != NULL; iter = g_list_next (iter)) { - ContactAndEmailNum *ce = iter->data; - EContact *contact = ce->contact; - GList *emails = e_contact_get (contact, E_CONTACT_EMAIL); - if (e_contact_get (contact, E_CONTACT_IS_LIST)) { - gint len = g_list_length (emails); - if (e_contact_get (contact, E_CONTACT_LIST_SHOW_ADDRESSES)) - to_length += len; - else - bcc_length += len; - } else { - if (emails != NULL) - ++to_length; - } - g_list_foreach (emails, (GFunc)g_free, NULL); - g_list_free (emails); - } - - /* Now I have to make a CORBA sequences that represents a recipient list with - the right number of entries, for the contacts. */ - to_list = GNOME_Evolution_Composer_RecipientList__alloc (); - to_list->_maximum = to_length; - to_list->_length = to_length; - if (to_length > 0) { - to_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (to_length); - } - - cc_list = GNOME_Evolution_Composer_RecipientList__alloc (); - cc_list->_maximum = cc_list->_length = 0; - - bcc_list = GNOME_Evolution_Composer_RecipientList__alloc (); - bcc_list->_maximum = bcc_length; - bcc_list->_length = bcc_length; - if (bcc_length > 0) { - bcc_list->_buffer = CORBA_sequence_GNOME_Evolution_Composer_Recipient_allocbuf (bcc_length); - } - - to_i = 0; - bcc_i = 0; - while (c != NULL) { - ContactAndEmailNum *ce = c->data; - EContact *contact = ce->contact; - int nth = ce->email_num; - char *name, *addr; - gboolean is_list, is_hidden; - GNOME_Evolution_Composer_Recipient *recipient; - GList *emails = e_contact_get (contact, E_CONTACT_EMAIL); - GList *iterator; - - if (emails != NULL) { - - is_list = (gboolean)e_contact_get (contact, E_CONTACT_IS_LIST); - is_hidden = is_list && !e_contact_get (contact, E_CONTACT_LIST_SHOW_ADDRESSES); - - if (is_list) { - for (iterator = emails; iterator; iterator = iterator->next) { - - if (is_hidden) { - recipient = &(bcc_list->_buffer[bcc_i]); - ++bcc_i; - } else { - recipient = &(to_list->_buffer[to_i]); - ++to_i; - } - - name = NULL; - addr = NULL; - if (iterator && iterator->data) { - /* XXX we should probably try to get the name from the attribute parameter here.. */ - addr = g_strdup ((char*)iterator->data); - } - - recipient->name = CORBA_string_dup (name ? name : ""); - recipient->address = CORBA_string_dup (addr ? addr : ""); - - g_free (name); - g_free (addr); - } - } - else { - EContactName *contact_name = e_contact_get (contact, E_CONTACT_NAME); - int length = g_list_length (emails); - - if (is_hidden) { - recipient = &(bcc_list->_buffer[bcc_i]); - ++bcc_i; - } else { - recipient = &(to_list->_buffer[to_i]); - ++to_i; - } - - if (nth >= length) - nth = 0; - - if (contact_name) { - name = e_contact_name_to_string (contact_name); - e_contact_name_free (contact_name); - } - else - name = NULL; - - addr = g_strdup (g_list_nth_data (emails, nth)); - - - recipient->name = CORBA_string_dup (name ? name : ""); - recipient->address = CORBA_string_dup (addr ? addr : ""); - - g_free (name); - g_free (addr); - } - - g_list_foreach (emails, (GFunc)g_free, NULL); - g_list_free (emails); - } - - c = c->next; - } - - subject = CORBA_string_dup (""); - - GNOME_Evolution_Composer_setHeaders (composer_server, "", to_list, cc_list, bcc_list, subject, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_printerr ("gui/e-meeting-edit.c: I couldn't set the composer headers via CORBA! Aagh.\n"); - CORBA_exception_free (&ev); - return; - } - - CORBA_free (to_list); - CORBA_free (cc_list); - CORBA_free (bcc_list); - CORBA_free (subject); - - GNOME_Evolution_Composer_show (composer_server, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_printerr ("gui/e-meeting-edit.c: I couldn't show the composer via CORBA! Aagh.\n"); - CORBA_exception_free (&ev); - return; - } - - CORBA_exception_free (&ev); -} - -static void -eab_send_contact_list_as_attachment (GList *contacts) -{ - GNOME_Evolution_Composer composer_server; - CORBA_Environment ev; - CORBA_char *content_type, *filename, *description; - GNOME_Evolution_Composer_AttachmentData *attach_data; - CORBA_boolean show_inline; - char *tempstr; - GNOME_Evolution_Composer_RecipientList *to_list, *cc_list, *bcc_list; - CORBA_char *subject; - - if (contacts == NULL) - return; - - CORBA_exception_init (&ev); - - composer_server = bonobo_activation_activate_from_id (COMPOSER_OAFID, 0, NULL, &ev); - - - - content_type = CORBA_string_dup ("text/x-vcard"); - filename = CORBA_string_dup (""); - - if (contacts->next) { - description = CORBA_string_dup (_("Multiple VCards")); - } else { - char *file_as = e_contact_get (E_CONTACT (contacts->data), E_CONTACT_FILE_AS); - tempstr = g_strdup_printf (_("VCard for %s"), file_as); - description = CORBA_string_dup (tempstr); - g_free (tempstr); - g_free (file_as); - } - - show_inline = FALSE; - - tempstr = eab_contact_list_to_string (contacts); - attach_data = GNOME_Evolution_Composer_AttachmentData__alloc(); - attach_data->_maximum = attach_data->_length = strlen (tempstr); - attach_data->_buffer = CORBA_sequence_CORBA_char_allocbuf (attach_data->_length); - memcpy (attach_data->_buffer, tempstr, attach_data->_length); - g_free (tempstr); - - GNOME_Evolution_Composer_attachData (composer_server, - content_type, filename, description, - show_inline, attach_data, - &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_printerr ("gui/e-meeting-edit.c: I couldn't attach data to the composer via CORBA! Aagh.\n"); - CORBA_exception_free (&ev); - return; - } - - CORBA_free (content_type); - CORBA_free (filename); - CORBA_free (description); - CORBA_free (attach_data); - - to_list = GNOME_Evolution_Composer_RecipientList__alloc (); - to_list->_maximum = to_list->_length = 0; - - cc_list = GNOME_Evolution_Composer_RecipientList__alloc (); - cc_list->_maximum = cc_list->_length = 0; - - bcc_list = GNOME_Evolution_Composer_RecipientList__alloc (); - bcc_list->_maximum = bcc_list->_length = 0; - - if (!contacts || contacts->next) { - subject = CORBA_string_dup ("Contact information"); - } else { - EContact *contact = contacts->data; - const gchar *tempstr2; - - tempstr2 = e_contact_get_const (contact, E_CONTACT_FILE_AS); - if (!tempstr2 || !*tempstr2) - tempstr2 = e_contact_get_const (contact, E_CONTACT_FULL_NAME); - if (!tempstr2 || !*tempstr2) - tempstr2 = e_contact_get_const (contact, E_CONTACT_ORG); - if (!tempstr2 || !*tempstr2) - tempstr2 = e_contact_get_const (contact, E_CONTACT_EMAIL_1); - if (!tempstr2 || !*tempstr2) - tempstr2 = e_contact_get_const (contact, E_CONTACT_EMAIL_2); - if (!tempstr2 || !*tempstr2) - tempstr2 = e_contact_get_const (contact, E_CONTACT_EMAIL_3); - - if (!tempstr2 || !*tempstr2) - tempstr = g_strdup_printf ("Contact information"); - else - tempstr = g_strdup_printf ("Contact information for %s", tempstr2); - subject = CORBA_string_dup (tempstr); - g_free (tempstr); - } - - GNOME_Evolution_Composer_setHeaders (composer_server, "", to_list, cc_list, bcc_list, subject, &ev); - - CORBA_free (to_list); - CORBA_free (cc_list); - CORBA_free (bcc_list); - CORBA_free (subject); - - GNOME_Evolution_Composer_show (composer_server, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - g_printerr ("gui/e-meeting-edit.c: I couldn't show the composer via CORBA! Aagh.\n"); - CORBA_exception_free (&ev); - return; - } - - CORBA_exception_free (&ev); -} - -void -eab_send_contact_list (GList *contacts, EABDisposition disposition) -{ - switch (disposition) { - case EAB_DISPOSITION_AS_TO: { - GList *list = NULL, *l; - - for (l = contacts; l; l = l->next) { - ContactAndEmailNum *ce = g_new (ContactAndEmailNum, 1); - ce->contact = l->data; - ce->email_num = 0; /* hardcode this */ - - list = g_list_append (list, ce); - } - - eab_send_to_contact_and_email_num_list (list); - - g_list_foreach (list, (GFunc)g_free, NULL); - g_list_free (list); - break; - } - case EAB_DISPOSITION_AS_ATTACHMENT: - eab_send_contact_list_as_attachment (contacts); - break; - } -} - -void -eab_send_contact (EContact *contact, int email_num, EABDisposition disposition) -{ - GList *list = NULL; - - switch (disposition) { - case EAB_DISPOSITION_AS_TO: { - ContactAndEmailNum ce; - - ce.contact = contact; - ce.email_num = email_num; - - list = g_list_prepend (NULL, &ce); - eab_send_to_contact_and_email_num_list (list); - break; - } - case EAB_DISPOSITION_AS_ATTACHMENT: { - list = g_list_prepend (NULL, contact); - eab_send_contact_list_as_attachment (list); - break; - } - } - - g_list_free (list); -} - -GtkWidget * -eab_create_image_chooser_widget(gchar *name, - gchar *string1, gchar *string2, - gint int1, gint int2) -{ - char *filename; - GtkWidget *w = NULL; - - w = e_image_chooser_new (); - gtk_widget_show_all (w); - - if (string1) { - filename = e_icon_factory_get_icon_filename (string1, E_ICON_SIZE_DIALOG); - - e_image_chooser_set_from_file (E_IMAGE_CHOOSER (w), filename); - - g_free (filename); - } - - return w; -} diff --git a/addressbook/gui/widgets/eab-gui-util.h b/addressbook/gui/widgets/eab-gui-util.h deleted file mode 100644 index 4a3dffba0b..0000000000 --- a/addressbook/gui/widgets/eab-gui-util.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* eab-gui-util.h - * Copyright (C) 2001-2003 Ximian, Inc. - * Author: Chris Toshok <toshok@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __E_ADDRESSBOOK_UTIL_H__ -#define __E_ADDRESSBOOK_UTIL_H__ - -#include <gtk/gtkwindow.h> -#include <libebook/e-book.h> -#include "addressbook/gui/contact-editor/e-contact-editor.h" -#include "addressbook/gui/contact-list-editor/e-contact-list-editor.h" - -G_BEGIN_DECLS - -void eab_error_dialog (const gchar *msg, - EBookStatus status); -void eab_load_error_dialog (GtkWidget *parent, - ESource *source, - EBookStatus status); -void eab_search_result_dialog (GtkWidget *parent, - EBookViewStatus status); -gint eab_prompt_save_dialog (GtkWindow *parent); - -EContactEditor *eab_show_contact_editor (EBook *book, - EContact *contact, - gboolean is_new_contact, - gboolean editable); -EContactListEditor *eab_show_contact_list_editor (EBook *book, - EContact *contact, - gboolean is_new_contact, - gboolean editable); -void eab_show_multiple_contacts (EBook *book, - GList *list, - gboolean editable); -void eab_transfer_contacts (EBook *source, - GList *contacts, /* adopted */ - gboolean delete_from_source, - GtkWindow *parent_window); - -void eab_contact_save (char *title, - EContact *contact, - GtkWindow *parent_window); - -void eab_contact_list_save (char *title, - GList *list, - GtkWindow *parent_window); - -typedef enum { - EAB_DISPOSITION_AS_ATTACHMENT, - EAB_DISPOSITION_AS_TO, -} EABDisposition; - -void eab_send_contact (EContact *contact, - int email_num, - EABDisposition disposition); -void eab_send_contact_list (GList *contacts, - EABDisposition disposition); - -GtkWidget *eab_create_image_chooser_widget (gchar *name, gchar *string1, gchar *string2, gint int1, gint int2); - - -ESource *eab_select_source (const gchar *title, const gchar *message, - const gchar *select_uid, GtkWindow *parent); - -G_END_DECLS - -#endif /* __E_ADDRESSBOOK_UTIL_H__ */ diff --git a/addressbook/gui/widgets/eab-marshal.list b/addressbook/gui/widgets/eab-marshal.list deleted file mode 100644 index 2b34707dbb..0000000000 --- a/addressbook/gui/widgets/eab-marshal.list +++ /dev/null @@ -1,11 +0,0 @@ -INT:POINTER -NONE:NONE -NONE:BOOL -NONE:POINTER -NONE:OBJECT -NONE:ENUM -NONE:INT,INT -NONE:INT -NONE:UINT -NONE:DOUBLE -INT:POINTER diff --git a/addressbook/gui/widgets/eab-menu.c b/addressbook/gui/widgets/eab-menu.c deleted file mode 100644 index d398c769f2..0000000000 --- a/addressbook/gui/widgets/eab-menu.c +++ /dev/null @@ -1,257 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Michael Zucchi <notzed@ximian.com> - * - * Copyright 2004 Ximian, Inc. (www.ximian.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> -#include <stdlib.h> - -#include <glib.h> - -#include <libebook/e-contact.h> - -#include "eab-menu.h" - -static void eabm_standard_menu_factory(EMenu *emp, void *data); - -static GObjectClass *eabm_parent; - -static void -eabm_init(GObject *o) -{ - /*EABMenu *emp = (EABMenu *)o; */ -} - -static void -eabm_finalise(GObject *o) -{ - ((GObjectClass *)eabm_parent)->finalize(o); -} - -static void -eabm_target_free(EMenu *ep, EMenuTarget *t) -{ - switch (t->type) { - case EAB_MENU_TARGET_SELECT: { - EABMenuTargetSelect *s = (EABMenuTargetSelect *)t; - int i; - - for (i=0;i<s->cards->len;i++) - g_object_unref(s->cards->pdata[i]); - g_ptr_array_free(s->cards, TRUE); - g_object_unref(s->book); - break; } - } - - ((EMenuClass *)eabm_parent)->target_free(ep, t); -} - -static void -eabm_class_init(GObjectClass *klass) -{ - klass->finalize = eabm_finalise; - ((EMenuClass *)klass)->target_free = eabm_target_free; - - e_menu_class_add_factory((EMenuClass *)klass, NULL, (EMenuFactoryFunc)eabm_standard_menu_factory, NULL); -} - -GType -eab_menu_get_type(void) -{ - static GType type = 0; - - if (type == 0) { - static const GTypeInfo info = { - sizeof(EABMenuClass), - NULL, NULL, - (GClassInitFunc)eabm_class_init, - NULL, NULL, - sizeof(EABMenu), 0, - (GInstanceInitFunc)eabm_init - }; - eabm_parent = g_type_class_ref(e_menu_get_type()); - type = g_type_register_static(e_menu_get_type(), "EABMenu", &info, 0); - } - - return type; -} - -EABMenu *eab_menu_new(const char *menuid) -{ - EABMenu *emp = g_object_new(eab_menu_get_type(), 0); - - e_menu_construct(&emp->menu, menuid); - - return emp; -} - -/** - * eab_menu_target_new_select - create a menu target of the current selection. - * @eabp: Address book menu. - * @book: Book the cards belong to. May be NULL in which case cards must be an empty GPtrArray. - * @readonly: Book is read-only mode. FIXME: Why can't we just get this off the book? - * @cards: Cards selected. This will be freed on completion and the array indices unreferenced. - * - * Create a new selection menu target. - * - * Return value: - **/ -EABMenuTargetSelect * -eab_menu_target_new_select(EABMenu *eabp, struct _EBook *book, int readonly, GPtrArray *cards) -{ - EABMenuTargetSelect *t = e_menu_target_new(&eabp->menu, EAB_MENU_TARGET_SELECT, sizeof(*t)); - guint32 mask = ~0; - int has_email = FALSE, i; - - /* FIXME: duplicated in eab-popup.c */ - - t->book = book; - if (book) - g_object_ref(book); - t->cards = cards; - - for (i=0;i<cards->len && !has_email;i++) { - EContact *contact = cards->pdata[i]; - GList *email; - - email = e_contact_get(E_CONTACT(contact), E_CONTACT_EMAIL); - if (email) { - has_email = TRUE; - - g_list_foreach(email, (GFunc)g_free, NULL); - g_list_free(email); - } - } - - if (has_email) - mask &= ~EAB_MENU_SELECT_EMAIL; - - if (!readonly) - mask &= ~EAB_MENU_SELECT_EDITABLE; - - if (cards->len == 1) - mask &= ~EAB_MENU_SELECT_ONE; - - if (cards->len > 1) - mask &= ~EAB_MENU_SELECT_MANY; - - if (cards->len >= 1) - mask &= ~EAB_MENU_SELECT_ANY; - - t->target.mask = mask; - - return t; -} - -static void -eabm_standard_menu_factory(EMenu *emp, void *data) -{ - /* noop */ -} - -/* ********************************************************************** */ - -/* menu plugin handler */ - -/* -<e-plugin - class="com.ximian.mail.plugin.popup:1.0" - id="com.ximian.mail.plugin.popup.item:1.0" - type="shlib" - location="/opt/gnome2/lib/camel/1.0/libcamelimap.so" - name="imap" - description="IMAP4 and IMAP4v1 mail store"> - <hook class="com.ximian.mail.popupMenu:1.0" - handler="HandlePopup"> - <menu id="any" target="select"> - <item - type="item|toggle|radio|image|submenu|bar" - active - path="foo/bar" - label="label" - icon="foo" - mask="select_one" - activate="eabm_view_emacs"/> - </menu> - </extension> - -*/ - -static void *eabmph_parent_class; -#define eabmph ((EABMenuHook *)eph) - -static const EMenuHookTargetMask eabmph_select_masks[] = { - { "one", EAB_MENU_SELECT_ONE }, - { "many", EAB_MENU_SELECT_MANY }, - { "any", EAB_MENU_SELECT_ANY }, - { "editable", EAB_MENU_SELECT_EDITABLE }, - { "email", EAB_MENU_SELECT_EMAIL }, - { 0 } -}; - -static const EMenuHookTargetMap eabmph_targets[] = { - { "select", EAB_MENU_TARGET_SELECT, eabmph_select_masks }, - { 0 } -}; - -static void -eabmph_finalise(GObject *o) -{ - /*EPluginHook *eph = (EPluginHook *)o;*/ - - ((GObjectClass *)eabmph_parent_class)->finalize(o); -} - -static void -eabmph_class_init(EPluginHookClass *klass) -{ - int i; - - ((GObjectClass *)klass)->finalize = eabmph_finalise; - ((EPluginHookClass *)klass)->id = "com.novell.evolution.addressbook.bonobomenu:1.0"; - - for (i=0;eabmph_targets[i].type;i++) - e_menu_hook_class_add_target_map((EMenuHookClass *)klass, &eabmph_targets[i]); - - /* FIXME: leaks parent set class? */ - ((EMenuHookClass *)klass)->menu_class = g_type_class_ref(eab_menu_get_type()); -} - -GType -eab_menu_hook_get_type(void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof(EABMenuHookClass), NULL, NULL, (GClassInitFunc) eabmph_class_init, NULL, NULL, - sizeof(EABMenuHook), 0, (GInstanceInitFunc) NULL, - }; - - eabmph_parent_class = g_type_class_ref(e_menu_hook_get_type()); - type = g_type_register_static(e_menu_hook_get_type(), "EABMenuHook", &info, 0); - } - - return type; -} diff --git a/addressbook/gui/widgets/eab-menu.h b/addressbook/gui/widgets/eab-menu.h deleted file mode 100644 index 0427d43fe1..0000000000 --- a/addressbook/gui/widgets/eab-menu.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- - * - * Authors: Michel Zucchi <notzed@ximian.com> - * - * Copyright 2004 Novell Inc. (www.novell.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifndef __EAB_MENU_H__ -#define __EAB_MENU_H__ - -#include <glib-object.h> - -#include "e-util/e-menu.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -struct _EBook; - -typedef struct _EABMenu EABMenu; -typedef struct _EABMenuClass EABMenuClass; - -/* Current target description */ -enum _eab_menu_target_t { - EAB_MENU_TARGET_SELECT, -}; - -/** - * enum _eab_menu_target_select_t - EABMenuTargetSelect qualifiers. - * - * @EAB_MENU_SELECT_ONE: Only one item is selected. - * @EAB_MENU_SELECT_MANY: More than one item selected. - * @EAB_MENU_SELECT_ANY: One or more items selected. - * @EAB_MENU_SELECT_EDITABLE: Editable addressbook. - * @EAB_MENU_SELECT_EMAIL: Has an email address. - **/ -enum _eab_menu_target_select_t { - EAB_MENU_SELECT_ONE = 1<<0, - EAB_MENU_SELECT_MANY = 1<<1, - EAB_MENU_SELECT_ANY = 1<<2, - EAB_MENU_SELECT_EDITABLE = 1<<3, - EAB_MENU_SELECT_EMAIL = 1<<4, -}; - -typedef struct _EABMenuTargetSelect EABMenuTargetSelect; - -struct _EABMenuTargetSelect { - EMenuTarget target; - - struct _EBook *book; - GPtrArray *cards; -}; - -typedef struct _EMenuItem EABMenuItem; - -/* The object */ -struct _EABMenu { - EMenu menu; - - struct _EABMenuPrivate *priv; -}; - -struct _EABMenuClass { - EMenuClass menu_class; -}; - -GType eab_menu_get_type(void); - -EABMenu *eab_menu_new(const char *menuid); - -EABMenuTargetSelect *eab_menu_target_new_select(EABMenu *eabp, struct _EBook *book, int readonly, GPtrArray *cards); - -/* ********************************************************************** */ - -typedef struct _EABMenuHook EABMenuHook; -typedef struct _EABMenuHookClass EABMenuHookClass; - -struct _EABMenuHook { - EMenuHook hook; -}; - -struct _EABMenuHookClass { - EMenuHookClass hook_class; -}; - -GType eab_menu_hook_get_type(void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __EAB_MENU_H__ */ diff --git a/addressbook/gui/widgets/eab-popup-control.c b/addressbook/gui/widgets/eab-popup-control.c deleted file mode 100644 index 10ef769632..0000000000 --- a/addressbook/gui/widgets/eab-popup-control.c +++ /dev/null @@ -1,1211 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * eab-popup-control.c - * - * Copyright (C) 2001-2003, Ximian, Inc. - * - * Authors: Jon Trowbridge <trow@ximian.com> - * Chris Toshok <toshok@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -/* - * This file is too big and this widget is too complicated. Forgive me. - */ - -#include <config.h> -#include <string.h> -#include "addressbook.h" -#include "eab-popup-control.h" -#include <gtk/gtkbutton.h> -#include <gtk/gtkcellrenderertext.h> -#include <gtk/gtkframe.h> -#include <gtk/gtkhbbox.h> -#include <gtk/gtkhseparator.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkoptionmenu.h> -#include <gtk/gtkstock.h> -#include <gtk/gtktable.h> -#include <gtk/gtktreeselection.h> -#include <gtk/gtktreeview.h> -#include <gtk/gtkvbox.h> -#include <bonobo/bonobo-control.h> -#include <bonobo/bonobo-property-bag.h> -#include <bonobo/bonobo-generic-factory.h> -#include <addressbook/util/eab-book-util.h> -#include <addressbook/gui/contact-editor/e-contact-editor.h> -#include <addressbook/gui/contact-editor/e-contact-quick-add.h> -#include <addressbook/gui/widgets/eab-contact-display.h> -#include <addressbook/gui/widgets/eab-gui-util.h> -#include "e-util/e-gui-utils.h" - -static void eab_popup_control_set_name (EABPopupControl *pop, const gchar *name); -static void eab_popup_control_set_email (EABPopupControl *pop, const gchar *email); - -/* - * Some general scaffolding for our widgets. Think of this as a really, really - * lame implementation of a wizard (...which is still somewhat more general that - * we really need it to be). - */ - -typedef struct _MiniWizard MiniWizard; -struct _MiniWizard { - GtkWidget *body; - - GtkWidget *vbox; - GtkWidget *ok_button; - GtkWidget *cancel_button; - - void (*ok_cb) (MiniWizard *, gpointer); - void (*cleanup_cb) (gpointer); - gpointer closure; - - void (*destroy_cb) (MiniWizard *, gpointer); - gpointer destroy_closure; -}; - -static void -mini_wizard_container_add (MiniWizard *wiz, GtkWidget *w) -{ - GList *iter = gtk_container_get_children (GTK_CONTAINER (wiz->vbox)); - while (iter != NULL) { - GtkWidget *oldw = (GtkWidget *) iter->data; - iter = g_list_next (iter); - gtk_container_remove (GTK_CONTAINER (wiz->vbox), oldw); - } - gtk_container_add (GTK_CONTAINER (wiz->vbox), w); -} - -static void -mini_wizard_destroy (MiniWizard *wiz) -{ - if (wiz->cleanup_cb) - wiz->cleanup_cb (wiz->closure); - wiz->cleanup_cb = NULL; - - if (wiz->destroy_cb) - wiz->destroy_cb (wiz, wiz->destroy_closure); -} - -static void -mini_wizard_ok_cb (GtkWidget *b, gpointer closure) -{ - MiniWizard *wiz = (MiniWizard *) closure; - - gpointer old_closure = wiz->closure; - void (*old_cleanup) (gpointer) = wiz->cleanup_cb; - - wiz->cleanup_cb = NULL; - - if (wiz->ok_cb) - wiz->ok_cb (wiz, wiz->closure); - - if (old_cleanup) - old_cleanup (old_closure); - -} - -static void -mini_wizard_cancel_cb (GtkWidget *b, gpointer closure) -{ - mini_wizard_destroy ((MiniWizard *) closure); -} - -static void -mini_wizard_destroy_cb (gpointer closure, GObject *where_object_was) -{ - MiniWizard *wiz = (MiniWizard *) closure; - if (wiz->cleanup_cb) - wiz->cleanup_cb (wiz->closure); - g_free (wiz); -} - -static MiniWizard * -mini_wizard_new (void) -{ - MiniWizard *wiz = g_new (MiniWizard, 1); - GtkWidget *bbox; - - wiz->body = gtk_vbox_new (FALSE, 2); - wiz->vbox = gtk_vbox_new (FALSE, 2); - wiz->ok_button = gtk_button_new_from_stock (GTK_STOCK_OK); - wiz->cancel_button = gtk_button_new_from_stock (GTK_STOCK_CANCEL); - - wiz->ok_cb = NULL; - wiz->cleanup_cb = NULL; - wiz->closure = NULL; - - wiz->destroy_cb = NULL; - wiz->destroy_closure = NULL; - - bbox = gtk_hbutton_box_new (); - gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), - GTK_BUTTONBOX_END); - - gtk_box_pack_start (GTK_BOX (bbox), wiz->cancel_button, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (bbox), wiz->ok_button, FALSE, TRUE, 0); - - gtk_box_set_spacing (GTK_BOX (bbox), - 10 /* ugh */); - - gtk_box_pack_start (GTK_BOX (wiz->body), wiz->vbox, TRUE, TRUE, 2); - gtk_box_pack_start (GTK_BOX (wiz->body), gtk_hseparator_new (), FALSE, TRUE, 2); - gtk_box_pack_start (GTK_BOX (wiz->body), bbox, FALSE, TRUE, 2); - - gtk_widget_show_all (wiz->body); - - g_signal_connect (wiz->ok_button, - "clicked", - G_CALLBACK (mini_wizard_ok_cb), - wiz); - g_signal_connect (wiz->cancel_button, - "clicked", - G_CALLBACK (mini_wizard_cancel_cb), - wiz); - - g_object_weak_ref (G_OBJECT (wiz->body), - mini_wizard_destroy_cb, - wiz); - - return wiz; - -} - - - -/* - * This is the code for the UI thingie that lets you manipulate the e-mail - * addresses (and *only* the e-mail addresses) associated with an existing - * contact. - */ - -#define EMPTY_ENTRY _("(none)") - -typedef struct _EMailMenu EMailMenu; -struct _EMailMenu { - GtkWidget *option_menu; - GList *options; - gchar *current_selection; -}; - -static void -email_menu_free (EMailMenu *menu) -{ - if (menu == NULL) - return; - - g_list_foreach (menu->options, (GFunc) g_free, NULL); - g_list_free (menu->options); - g_free (menu); -} - -static EMailMenu * -email_menu_new (void) -{ - EMailMenu *menu = g_new (EMailMenu, 1); - - menu->option_menu = gtk_option_menu_new (); - menu->options = NULL; - menu->current_selection = NULL; - - gtk_option_menu_set_menu (GTK_OPTION_MENU (menu->option_menu), gtk_menu_new ()); - - return menu; -} - -static void -menu_activate_cb (GtkWidget *w, gpointer closure) -{ - EMailMenu *menu = (EMailMenu *) closure; - gchar *addr = (gchar *) g_object_get_data (G_OBJECT (w), "addr"); - - menu->current_selection = addr; -} - -static void -email_menu_add_option (EMailMenu *menu, char *addr) -{ - GtkWidget *menu_item; - - g_return_if_fail (menu != NULL); - if (!addr || !*addr) - return; - - menu->options = g_list_append (menu->options, addr); - - menu_item = gtk_menu_item_new_with_label (addr); - g_object_set_data (G_OBJECT (menu_item), "addr", addr); - gtk_widget_show_all (menu_item); - gtk_menu_shell_append (GTK_MENU_SHELL (gtk_option_menu_get_menu (GTK_OPTION_MENU (menu->option_menu))), menu_item); - - g_signal_connect (menu_item, - "activate", - G_CALLBACK (menu_activate_cb), - menu); -} - -static void -email_menu_add_options_from_contact (EMailMenu *menu, EContact *contact, const gchar *extra_addr) -{ - g_return_if_fail (contact && E_IS_CONTACT (contact)); - - /* If any of these three e-mail fields are NULL, email_menu_add_option will just - return without doing anything. */ - email_menu_add_option (menu, e_contact_get (contact, E_CONTACT_EMAIL_1)); - email_menu_add_option (menu, e_contact_get (contact, E_CONTACT_EMAIL_2)); - email_menu_add_option (menu, e_contact_get (contact, E_CONTACT_EMAIL_3)); - email_menu_add_option (menu, g_strdup (extra_addr)); - email_menu_add_option (menu, g_strdup (EMPTY_ENTRY)); -} - -static void -email_menu_set_option (EMailMenu *menu, const gchar *addr) -{ - guint count = 0; - GList *iter; - - g_return_if_fail (menu != NULL); - - if (addr == NULL) { - email_menu_set_option (menu, EMPTY_ENTRY); - return; - } - - iter = menu->options; - while (iter && strcmp (addr, (gchar *) iter->data)) { - ++count; - iter = g_list_next (iter); - } - - if (iter) { - gtk_option_menu_set_history (GTK_OPTION_MENU (menu->option_menu), count); - menu->current_selection = (gchar *) iter->data; - } -} - -typedef struct _EMailTable EMailTable; -struct _EMailTable { - GtkWidget *table; - EContact *contact; - EMailMenu *primary; - EMailMenu *email2; - EMailMenu *email3; -}; - -static void -email_table_cleanup_cb (gpointer closure) -{ - EMailTable *et = (EMailTable *) closure; - - if (et == NULL) - return; - - g_object_unref (et->contact); - email_menu_free (et->primary); - email_menu_free (et->email2); - email_menu_free (et->email3); - - g_free (et); -} - -static void -email_table_from_contact (EMailTable *et) -{ - g_return_if_fail (et != NULL); - - email_menu_set_option (et->primary, e_contact_get_const (et->contact, E_CONTACT_EMAIL_1)); - email_menu_set_option (et->email2, e_contact_get_const (et->contact, E_CONTACT_EMAIL_2)); - email_menu_set_option (et->email3, e_contact_get_const (et->contact, E_CONTACT_EMAIL_3)); -} - -static void -email_table_to_contact (EMailTable *et) -{ - gchar *curr; - - g_return_if_fail (et != NULL); - - curr = et->primary->current_selection; - if (curr && !strcmp (curr, _(EMPTY_ENTRY))) - curr = NULL; - e_contact_set (et->contact, E_CONTACT_EMAIL_1, curr); - - curr = et->email2->current_selection; - if (curr && !strcmp (curr, _(EMPTY_ENTRY))) - curr = NULL; - e_contact_set (et->contact, E_CONTACT_EMAIL_2, curr); - - curr = et->email3->current_selection; - if (curr && !strcmp (curr, _(EMPTY_ENTRY))) - curr = NULL; - e_contact_set (et->contact, E_CONTACT_EMAIL_3, curr); -} - -static void -email_table_save_contact_cb (EBook *book, EBookStatus status, gpointer closure) -{ - EContact *contact = E_CONTACT (closure); - - if (status == E_BOOK_ERROR_OK) { - e_book_async_commit_contact (book, contact, NULL, NULL); - } - if (book) - g_object_unref (book); - g_object_unref (contact); -} - -static void -email_table_ok_cb (MiniWizard *wiz, gpointer closure) -{ - EMailTable *et = (EMailTable *) closure; - - email_table_to_contact (et); - - g_object_ref (et->contact); - - addressbook_load_default_book (email_table_save_contact_cb, et->contact); - - mini_wizard_destroy (wiz); -} - -static void -email_table_init (MiniWizard *wiz, EContact *contact, const gchar *extra_address) -{ - EMailTable *et; - - gchar *name_str; - gint xpad, ypad; - GtkAttachOptions label_x_opts, label_y_opts; - GtkAttachOptions menu_x_opts, menu_y_opts; - - g_return_if_fail (contact && E_IS_CONTACT (contact)); - - et = g_new (EMailTable, 1); - - et->contact = contact; - g_object_ref (et->contact); - - et->table = gtk_table_new (4, 2, FALSE); - - et->primary = email_menu_new (); - et->email2 = email_menu_new (); - et->email3 = email_menu_new (); - - email_menu_add_options_from_contact (et->primary, et->contact, extra_address); - email_menu_add_options_from_contact (et->email2, et->contact, extra_address); - email_menu_add_options_from_contact (et->email3, et->contact, extra_address); - - email_table_from_contact (et); - - label_x_opts = GTK_FILL; - label_y_opts = GTK_FILL; - menu_x_opts = GTK_EXPAND | GTK_FILL; - menu_y_opts = GTK_EXPAND | GTK_FILL; - xpad = 3; - ypad = 3; - - name_str = e_contact_get (et->contact, E_CONTACT_FULL_NAME); - gtk_table_attach (GTK_TABLE (et->table), - gtk_label_new (name_str), - 0, 2, 0, 1, - label_x_opts, label_y_opts, xpad, ypad); - g_free (name_str); - - gtk_table_attach (GTK_TABLE (et->table), - gtk_label_new (_("Primary Email")), - 0, 1, 1, 2, - label_x_opts, label_y_opts, xpad, ypad); - - gtk_table_attach (GTK_TABLE (et->table), - et->primary->option_menu, - 1, 2, 1, 2, - menu_x_opts, menu_y_opts, xpad, ypad); - - gtk_table_attach (GTK_TABLE (et->table), - gtk_label_new (_("Email 2")), - 0, 1, 2, 3, - label_x_opts, label_y_opts, xpad, ypad); - - gtk_table_attach (GTK_TABLE (et->table), - et->email2->option_menu, - 1, 2, 2, 3, - menu_x_opts, menu_y_opts, xpad, ypad); - - gtk_table_attach (GTK_TABLE (et->table), - gtk_label_new (_("Email 3")), - 0, 1, 3, 4, - label_x_opts, label_y_opts, xpad, ypad); - - gtk_table_attach (GTK_TABLE (et->table), - et->email3->option_menu, - 1, 2, 3, 4, - menu_x_opts, menu_y_opts, xpad, ypad); - - gtk_widget_show_all (et->primary->option_menu); - gtk_widget_show_all (et->email2->option_menu); - gtk_widget_show_all (et->email3->option_menu); - - gtk_widget_show_all (et->table); - mini_wizard_container_add (wiz, et->table); - wiz->ok_cb = email_table_ok_cb; - wiz->cleanup_cb = email_table_cleanup_cb; - wiz->closure = et; -} - -/* - * This code is for the little UI thing that lets you pick from a set of contacts - * and decide which one you want to add the e-mail address to. - */ - -typedef struct _ContactPicker ContactPicker; -struct _ContactPicker { - GtkWidget *body; - GtkWidget *list; - GtkListStore *model; - GList *contacts; - gchar *new_name; - gchar *new_email; - - EContact *current_contact; -}; - -enum { - COLUMN_ACTION, - COLUMN_CONTACT -}; - -static void -contact_picker_selection_changed (GtkTreeSelection *selection, gpointer closure) -{ - MiniWizard *wiz = (MiniWizard *) closure; - ContactPicker *pick = (ContactPicker *) wiz->closure; - gboolean selected; - GtkTreeIter iter; - - selected = gtk_tree_selection_get_selected (selection, NULL, &iter); - - gtk_widget_set_sensitive (wiz->ok_button, selected); - - if (selected) { - gtk_tree_model_get (GTK_TREE_MODEL (pick->model), &iter, - COLUMN_CONTACT, &pick->current_contact, - -1); - } - else { - pick->current_contact = NULL; - } -} - -static void -contact_picker_ok_cb (MiniWizard *wiz, gpointer closure) -{ - ContactPicker *pick = (ContactPicker *) closure; - - if (pick->current_contact == NULL) { - e_contact_quick_add (pick->new_name, pick->new_email, NULL, NULL); - mini_wizard_destroy (wiz); - } else { - email_table_init (wiz, pick->current_contact, pick->new_email); - } -} - -static void -contact_picker_cleanup_cb (gpointer closure) -{ - ContactPicker *pick = (ContactPicker *) closure; - - g_list_foreach (pick->contacts, (GFunc) g_object_unref, NULL); - g_list_free (pick->contacts); - - g_free (pick->new_name); - g_free (pick->new_email); -} - -static void -free_str (gpointer data, - GObject *where_the_object_was) -{ - g_free (data); -} - -static void -contact_picker_init (MiniWizard *wiz, const GList *contacts, const gchar *new_name, const gchar *new_email) -{ - ContactPicker *pick; - gchar *str; - GtkWidget *w; - GtkTreeIter iter; - - pick = g_new (ContactPicker, 1); - - pick->body = gtk_vbox_new (FALSE, 2); - - pick->model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_POINTER); - - pick->list = gtk_tree_view_new_with_model (GTK_TREE_MODEL (pick->model)); - - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (pick->list), TRUE); - - gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (pick->list), - COLUMN_ACTION, - _("Select an Action"), - gtk_cell_renderer_text_new (), - "text", COLUMN_ACTION, - NULL); - - gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (pick->list)), - GTK_SELECTION_SINGLE); - - str = g_strdup_printf (_("Create a new contact \"%s\""), new_name); - gtk_list_store_append (pick->model, &iter); - gtk_list_store_set (pick->model, &iter, - COLUMN_ACTION, str, - COLUMN_CONTACT, NULL, - -1); - g_object_weak_ref (G_OBJECT (pick->model), free_str, str); - - pick->contacts = NULL; - while (contacts) { - EContact *contact = (EContact *) contacts->data; - gchar *name_str = e_contact_get (contact, E_CONTACT_FULL_NAME); - - pick->contacts = g_list_append (pick->contacts, contact); - g_object_ref (contact); - - str = g_strdup_printf (_("Add address to existing contact \"%s\""), name_str); - gtk_list_store_append (pick->model, &iter); - gtk_list_store_set (pick->model, &iter, - COLUMN_ACTION, str, - COLUMN_CONTACT, contact, - -1); - g_free (name_str); - - g_object_weak_ref (G_OBJECT (pick->model), free_str, str); - - contacts = g_list_next (contacts); - } - - pick->new_name = g_strdup (new_name); - pick->new_email = g_strdup (new_email); - - pick->current_contact = NULL; - gtk_widget_set_sensitive (wiz->ok_button, FALSE); - - /* Connect some signals & callbacks */ - - wiz->ok_cb = contact_picker_ok_cb; - wiz->cleanup_cb = contact_picker_cleanup_cb; - - g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (pick->list)), - "changed", G_CALLBACK (contact_picker_selection_changed), - wiz); - - /* Build our widget */ - - w = gtk_label_new (new_email); - gtk_box_pack_start (GTK_BOX (pick->body), w, FALSE, TRUE, 3); - - gtk_box_pack_start (GTK_BOX (pick->body), pick->list, TRUE, TRUE, 2); - gtk_widget_show_all (pick->body); - - - /* Put it in our mini-wizard */ - - wiz->closure = pick; - mini_wizard_container_add (wiz, pick->body); -} - -/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ - -/* - * The code for the actual EABPopupControl widget begins here. - */ - -/* ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** */ - - -static GtkObjectClass *parent_class; - -static void eab_popup_control_dispose (GObject *); -static void eab_popup_control_query (EABPopupControl *); - - -static void -eab_popup_control_class_init (EABPopupControlClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - - object_class->dispose = eab_popup_control_dispose; -} - -static void -eab_popup_control_init (EABPopupControl *pop) -{ - pop->transitory = TRUE; -} - -static void -eab_popup_control_cleanup (EABPopupControl *pop) -{ - if (pop->contact) { - g_object_unref (pop->contact); - pop->contact = NULL; - } - - if (pop->scheduled_refresh) { - g_source_remove (pop->scheduled_refresh); - pop->scheduled_refresh = 0; - } - - if (pop->query_tag) { -#if notyet - e_book_simple_query_cancel (pop->book, pop->query_tag); -#endif - pop->query_tag = 0; - } - - if (pop->book) { - g_object_unref (pop->book); - pop->book = NULL; - } - - g_free (pop->name); - pop->name = NULL; - - g_free (pop->email); - pop->email = NULL; -} - -static void -eab_popup_control_dispose (GObject *obj) -{ - EABPopupControl *pop = EAB_POPUP_CONTROL (obj); - - eab_popup_control_cleanup (pop); - - if (G_OBJECT_CLASS (parent_class)->dispose) - G_OBJECT_CLASS (parent_class)->dispose (obj); -} - -GType -eab_popup_control_get_type (void) -{ - static GType pop_type = 0; - - if (!pop_type) { - static const GTypeInfo pop_info = { - sizeof (EABPopupControlClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) eab_popup_control_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EABPopupControl), - 0, /* n_preallocs */ - (GInstanceInitFunc) eab_popup_control_init, - }; - - pop_type = g_type_register_static (gtk_event_box_get_type (), "EABPopupControl", &pop_info, 0); - } - - return pop_type; -} - -static void -eab_popup_control_refresh_names (EABPopupControl *pop) -{ - if (pop->name_widget) { - if (pop->name && *pop->name) { - gtk_label_set_text (GTK_LABEL (pop->name_widget), pop->name); - gtk_widget_show (pop->name_widget); - } else { - gtk_widget_hide (pop->name_widget); - } - } - - if (pop->email_widget) { - if (pop->email && *pop->email) { - gtk_label_set_text (GTK_LABEL (pop->email_widget), pop->email); - gtk_widget_show (pop->email_widget); - } else { - gtk_widget_hide (pop->email_widget); - } - } - - eab_popup_control_query (pop); -} - -static gint -refresh_timeout_cb (gpointer ptr) -{ - EABPopupControl *pop = EAB_POPUP_CONTROL (ptr); - eab_popup_control_refresh_names (pop); - pop->scheduled_refresh = 0; - return 0; -} - -static void -eab_popup_control_schedule_refresh (EABPopupControl *pop) -{ - if (pop->scheduled_refresh == 0) - pop->scheduled_refresh = g_timeout_add (20, refresh_timeout_cb, pop); -} - -/* If we are handed something of the form "Foo <bar@bar.com>", - do the right thing. */ -static gboolean -eab_popup_control_set_free_form (EABPopupControl *pop, const gchar *txt) -{ - gchar *lt, *gt = NULL; - - g_return_val_if_fail (pop && EAB_IS_POPUP_CONTROL (pop), FALSE); - - if (txt == NULL) - return FALSE; - - lt = strchr (txt, '<'); - if (lt) - gt = strchr (txt, '>'); - - if (lt && gt && lt+1 < gt) { - gchar *name = g_strndup (txt, lt-txt); - gchar *email = g_strndup (lt+1, gt-lt-1); - eab_popup_control_set_name (pop, name); - eab_popup_control_set_email (pop, email); - - return TRUE; - } - - return FALSE; -} - -static void -eab_popup_control_set_name (EABPopupControl *pop, const gchar *name) -{ - g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); - - /* We only allow the name to be set once. */ - if (pop->name) - return; - - if (!eab_popup_control_set_free_form (pop, name)) { - pop->name = g_strdup (name); - if (pop->name) - g_strstrip (pop->name); - } - - eab_popup_control_schedule_refresh (pop); -} - -static void -eab_popup_control_set_email (EABPopupControl *pop, const gchar *email) -{ - g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); - - /* We only allow the e-mail to be set once. */ - if (pop->email) - return; - - if (!eab_popup_control_set_free_form (pop, email)) { - pop->email = g_strdup (email); - if (pop->email) - g_strstrip (pop->email); - } - - eab_popup_control_schedule_refresh (pop); -} - -void -eab_popup_control_construct (EABPopupControl *pop) -{ - GtkWidget *vbox, *name_holder; - GdkColor color = { 0x0, 0xffff, 0xffff, 0xffff }; - - g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); - - pop->main_vbox = gtk_vbox_new (FALSE, 0); - - /* Build Generic View */ - - name_holder = gtk_event_box_new (); - vbox = gtk_vbox_new (FALSE, 2); - pop->name_widget = gtk_label_new (""); - pop->email_widget = gtk_label_new (""); - - gtk_box_pack_start (GTK_BOX (vbox), pop->name_widget, TRUE, TRUE, 2); - gtk_box_pack_start (GTK_BOX (vbox), pop->email_widget, TRUE, TRUE, 2); - gtk_container_add (GTK_CONTAINER (name_holder), GTK_WIDGET (vbox)); - - if (gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (name_holder)), &color, FALSE, TRUE)) { - GtkStyle *style = gtk_style_copy (gtk_widget_get_style (GTK_WIDGET (name_holder))); - style->bg[0] = color; - gtk_widget_set_style (GTK_WIDGET (name_holder), style); - g_object_unref (style); - } - - pop->generic_view = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (pop->generic_view), name_holder); - gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->generic_view, TRUE, TRUE, 0); - gtk_widget_show_all (pop->generic_view); - - pop->query_msg = gtk_label_new (_("Querying Address Book...")); - gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->query_msg, TRUE, TRUE, 0); - gtk_widget_show (pop->query_msg); - - /* Build ContactDisplay */ - pop->contact_display = eab_contact_display_new (); - gtk_box_pack_start (GTK_BOX (pop->main_vbox), pop->contact_display, TRUE, TRUE, 0); - - - /* Final assembly */ - - gtk_container_add (GTK_CONTAINER (pop), pop->main_vbox); - gtk_widget_show (pop->main_vbox); - - gtk_container_set_border_width (GTK_CONTAINER (vbox), 3); - gtk_container_set_border_width (GTK_CONTAINER (pop), 2); -} - -static GtkWidget * -eab_popup_new (void) -{ - EABPopupControl *pop = g_object_new (EAB_TYPE_POPUP_CONTROL, NULL); - eab_popup_control_construct (pop); - return GTK_WIDGET (pop); -} - -static void -emit_event (EABPopupControl *pop, const char *event) -{ - if (pop->es) { - BonoboArg *arg; - - arg = bonobo_arg_new (BONOBO_ARG_BOOLEAN); - BONOBO_ARG_SET_BOOLEAN (arg, TRUE); - bonobo_event_source_notify_listeners_full (pop->es, - "GNOME/Evolution/Addressbook/AddressPopup", - "Event", - event, - arg, NULL); - bonobo_arg_release (arg); - } -} - -static void -contact_editor_cb (EBook *book, EBookStatus status, gpointer closure) -{ - if (status == E_BOOK_ERROR_OK) { - EABPopupControl *pop = EAB_POPUP_CONTROL (closure); - eab_show_contact_editor (book, pop->contact, FALSE, TRUE); - eab_popup_control_cleanup (pop); - emit_event (pop, "Destroy"); - } - - if (book) - g_object_unref (book); -} - -static void -edit_contact_info_cb (GtkWidget *button, EABPopupControl *pop) -{ - emit_event (pop, "Hide"); - - addressbook_load_default_book (contact_editor_cb, pop); -} - -static void -eab_popup_control_display_contact (EABPopupControl *pop, EContact *contact) -{ - GtkWidget *b; - - g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); - g_return_if_fail (contact && E_IS_CONTACT (contact)); - g_return_if_fail (pop->contact == NULL); - - pop->contact = contact; - g_object_ref (pop->contact); - - eab_contact_display_render (EAB_CONTACT_DISPLAY (pop->contact_display), - contact, - EAB_CONTACT_DISPLAY_RENDER_COMPACT); - gtk_widget_show (pop->contact_display); - gtk_widget_hide (pop->generic_view); - - b = gtk_button_new_with_label (_("Edit Contact Info")); - gtk_box_pack_start (GTK_BOX (pop->main_vbox), b, TRUE, TRUE, 0); - g_signal_connect (b, - "clicked", - G_CALLBACK (edit_contact_info_cb), - pop); - gtk_widget_show (b); -} - -static void -add_contacts_cb (GtkWidget *button, EABPopupControl *pop) -{ - if (pop->email && *pop->email) { - if (pop->name && *pop->name) - e_contact_quick_add (pop->name, pop->email, NULL, NULL); - else - e_contact_quick_add_free_form (pop->email, NULL, NULL); - - } - eab_popup_control_cleanup (pop); - emit_event (pop, "Destroy"); -} - -static void -eab_popup_control_no_matches (EABPopupControl *pop) -{ - GtkWidget *b; - - g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); - - b = e_button_new_with_stock_icon (_("Add to Contacts"), "gtk-add"); - - gtk_box_pack_start (GTK_BOX (pop->main_vbox), b, TRUE, TRUE, 0); - g_signal_connect (b, - "clicked", - G_CALLBACK (add_contacts_cb), - pop); - gtk_widget_show (b); -} - -static void -wizard_destroy_cb (MiniWizard *wiz, gpointer closure) -{ - gtk_widget_destroy (GTK_WIDGET (closure)); -} - -static void -eab_popup_control_ambiguous_email_add (EABPopupControl *pop, const GList *contacts) -{ - MiniWizard *wiz = mini_wizard_new (); - GtkWidget *win = gtk_window_new (GTK_WINDOW_TOPLEVEL); - - wiz->destroy_cb = wizard_destroy_cb; - wiz->destroy_closure = win; - - gtk_window_set_title (GTK_WINDOW (win), _("Merge E-Mail Address")); - gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_MOUSE); - - contact_picker_init (wiz, contacts, pop->name, pop->email); - - eab_popup_control_cleanup (pop); - emit_event (pop, "Destroy"); - - gtk_container_add (GTK_CONTAINER (win), wiz->body); - gtk_widget_show_all (win); -} - -static void -eab_popup_control_multiple_matches (EABPopupControl *pop, const GList *contacts) -{ - pop->multiple_matches = TRUE; - - eab_popup_control_ambiguous_email_add (pop, contacts); -} - -/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/ - -/* - * Addressbook Query Fun - */ - -static void -name_only_query_cb (EBook *book, EBookStatus status, GList *contacts, gpointer closure) -{ - EABPopupControl *pop; - - if (status != E_BOOK_ERROR_OK) - return; - - pop = EAB_POPUP_CONTROL (closure); - - pop->query_tag = 0; - - if (contacts == NULL) { - eab_popup_control_no_matches (pop); - } else { - eab_popup_control_ambiguous_email_add (pop, contacts); - } -} - -static void -query_cb (EBook *book, EBookStatus status, GList *contacts, gpointer closure) -{ - EABPopupControl *pop; - - if (status != E_BOOK_ERROR_OK) - return; - - pop = EAB_POPUP_CONTROL (closure); - - pop->query_tag = 0; - gtk_widget_hide (pop->query_msg); - - if (contacts == NULL) { - - /* Do a name-only query if: - (1) The name is non-empty. - (2) The e-mail is also non-empty (so that the query we just did wasn't actually a name-only query. - */ - if (pop->name && *pop->name && pop->email && *pop->email) { - pop->query_tag = eab_name_and_email_query (book, pop->name, NULL, name_only_query_cb, pop); - } else { - eab_popup_control_no_matches (pop); - } - - } else { - if (g_list_length ((GList *) contacts) == 1) - eab_popup_control_display_contact (pop, E_CONTACT (contacts->data)); - else - eab_popup_control_multiple_matches (pop, contacts); - } -} - -static void -start_query (EBook *book, EBookStatus status, gpointer closure) -{ - EABPopupControl *pop = EAB_POPUP_CONTROL (closure); - - if (status != E_BOOK_ERROR_OK) { - eab_popup_control_no_matches (pop); - if (book) - g_object_unref (book); - return; - } - -#if notyet - if (pop->query_tag) - e_book_simple_query_cancel (book, pop->query_tag); -#endif - - if (pop->book != book) { - g_object_ref (book); - if (pop->book) - g_object_unref (pop->book); - pop->book = book; - } - - pop->query_tag = eab_name_and_email_query (book, pop->name, pop->email, query_cb, pop); - - g_object_unref (pop); -} - -static void -eab_popup_control_query (EABPopupControl *pop) -{ - g_return_if_fail (pop && EAB_IS_POPUP_CONTROL (pop)); - - g_object_ref (pop); - - addressbook_load_default_book (start_query, pop); -} - -/** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **/ - -enum { - PROPERTY_NAME, - PROPERTY_EMAIL, - PROPERTY_TRANSITORY -}; - -static void -set_prop (BonoboPropertyBag *bag, const BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data) -{ - EABPopupControl *pop = EAB_POPUP_CONTROL (user_data); - - switch (arg_id) { - - case PROPERTY_NAME: - eab_popup_control_set_name (pop, BONOBO_ARG_GET_STRING (arg)); - break; - - case PROPERTY_EMAIL: - eab_popup_control_set_email (pop, BONOBO_ARG_GET_STRING (arg)); - break; - - default: - g_assert_not_reached (); - } -} - -static void -get_prop (BonoboPropertyBag *bag, BonoboArg *arg, guint arg_id, CORBA_Environment *ev, gpointer user_data) -{ - EABPopupControl *pop = EAB_POPUP_CONTROL (user_data); - - switch (arg_id) { - - case PROPERTY_NAME: - BONOBO_ARG_SET_STRING (arg, pop->name); - break; - - case PROPERTY_EMAIL: - BONOBO_ARG_SET_STRING (arg, pop->email); - break; - - case PROPERTY_TRANSITORY: - BONOBO_ARG_SET_BOOLEAN (arg, pop->transitory); - break; - - default: - g_assert_not_reached (); - } -} - -BonoboControl * -eab_popup_control_new (void) -{ - BonoboControl *control; - BonoboPropertyBag *bag; - EABPopupControl *addy; - GtkWidget *w; - - w = eab_popup_new (); - addy = EAB_POPUP_CONTROL (w); - - control = bonobo_control_new (w); - gtk_widget_show (w); - - bag = bonobo_property_bag_new (get_prop, set_prop, w); - bonobo_property_bag_add (bag, "name", PROPERTY_NAME, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_WRITEABLE | BONOBO_PROPERTY_READABLE); - - bonobo_property_bag_add (bag, "email", PROPERTY_EMAIL, - BONOBO_ARG_STRING, NULL, NULL, - BONOBO_PROPERTY_WRITEABLE | BONOBO_PROPERTY_READABLE); - - bonobo_property_bag_add (bag, "transitory", PROPERTY_TRANSITORY, - BONOBO_ARG_BOOLEAN, NULL, NULL, - BONOBO_PROPERTY_READABLE); - - bonobo_control_set_properties (control, bonobo_object_corba_objref (BONOBO_OBJECT (bag)), NULL); - bonobo_object_unref (BONOBO_OBJECT (bag)); - - addy->es = bonobo_event_source_new (); - bonobo_object_add_interface (BONOBO_OBJECT (control), - BONOBO_OBJECT (addy->es)); - - return control; -} diff --git a/addressbook/gui/widgets/eab-popup-control.h b/addressbook/gui/widgets/eab-popup-control.h deleted file mode 100644 index 1f4f22558f..0000000000 --- a/addressbook/gui/widgets/eab-popup-control.h +++ /dev/null @@ -1,86 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * eab-popup-control.h - * - * Copyright (C) 2001-2003, Ximian, Inc. - * - * Authors: Jon Trowbridge <trow@ximian.com> - * Chris Toshok <toshok@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef __EAB_POPUP_CONTROL_H__ -#define __EAB_POPUP_CONTROL_H__ - -#include <bonobo/bonobo-event-source.h> -#include <libebook/e-book.h> -#include <libebook/e-contact.h> - -#include <gtk/gtkeventbox.h> - -G_BEGIN_DECLS - -#define EAB_TYPE_POPUP_CONTROL (eab_popup_control_get_type ()) -#define EAB_POPUP_CONTROL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EAB_TYPE_POPUP_CONTROL, EABPopupControl)) -#define EAB_POPUP_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), EAB_TYPE_POPUP_CONTROL, EABPopupControlClass)) -#define EAB_IS_POPUP_CONTROL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EAB_TYPE_POPUP_CONTROL)) -#define EAB_IS_POPUP_CONTROL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EAB_TYPE_POPUP_CONTROL)) - -typedef struct _EABPopupControl EABPopupControl; -typedef struct _EABPopupControlClass EABPopupControlClass; - -struct _EABPopupControl { - GtkEventBox parent; - - gchar *name; - gchar *email; - - GtkWidget *name_widget; - GtkWidget *email_widget; - GtkWidget *query_msg; - - GtkWidget *main_vbox; - GtkWidget *generic_view; - GtkWidget *contact_display; - - gboolean transitory; - - guint scheduled_refresh; - EBook *book; - guint query_tag; - gboolean multiple_matches; - EContact *contact; - - BonoboEventSource *es; -}; - -struct _EABPopupControlClass { - GtkEventBoxClass parent_class; -}; - -GType eab_popup_control_get_type (void); - -void eab_popup_control_construct (EABPopupControl *); - -BonoboControl *eab_popup_control_new (void); - -G_END_DECLS - -#endif /* __EAB_POPUP_CONTROL_H__ */ - diff --git a/addressbook/gui/widgets/eab-popup.c b/addressbook/gui/widgets/eab-popup.c deleted file mode 100644 index 2a9a7e654b..0000000000 --- a/addressbook/gui/widgets/eab-popup.c +++ /dev/null @@ -1,311 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Michael Zucchi <notzed@ximian.com> - * - * Copyright 2004 Novell, Inc. (www.novell.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> -#include <stdlib.h> - -#include <glib.h> - -#include "eab-popup.h" -#include <libedataserverui/e-source-selector.h> -#include <libebook/e-contact.h> - -static GObjectClass *eabp_parent; - -static void -eabp_init(GObject *o) -{ - /*EABPopup *eabp = (EABPopup *)o; */ -} - -static void -eabp_finalise(GObject *o) -{ - ((GObjectClass *)eabp_parent)->finalize(o); -} - -static void -eabp_target_free(EPopup *ep, EPopupTarget *t) -{ - switch (t->type) { - case EAB_POPUP_TARGET_SELECT: { - EABPopupTargetSelect *s = (EABPopupTargetSelect *)t; - int i; - - for (i=0;i<s->cards->len;i++) - g_object_unref(s->cards->pdata[i]); - g_ptr_array_free(s->cards, TRUE); - g_object_unref(s->book); - - break; } - case EAB_POPUP_TARGET_SOURCE: { - EABPopupTargetSource *s = (EABPopupTargetSource *)t; - - g_object_unref(s->selector); - break; } - case EAB_POPUP_TARGET_SELECT_NAMES: { - EABPopupTargetSelectNames *s = (EABPopupTargetSelectNames *)t; - - g_object_unref(s->model); - break; } - } - - ((EPopupClass *)eabp_parent)->target_free(ep, t); -} - -static void -eabp_class_init(GObjectClass *klass) -{ - klass->finalize = eabp_finalise; - ((EPopupClass *)klass)->target_free = eabp_target_free; -} - -GType -eab_popup_get_type(void) -{ - static GType type = 0; - - if (type == 0) { - static const GTypeInfo info = { - sizeof(EABPopupClass), - NULL, NULL, - (GClassInitFunc)eabp_class_init, - NULL, NULL, - sizeof(EABPopup), 0, - (GInstanceInitFunc)eabp_init - }; - eabp_parent = g_type_class_ref(e_popup_get_type()); - type = g_type_register_static(e_popup_get_type(), "EABPopup", &info, 0); - } - - return type; -} - -EABPopup *eab_popup_new(const char *menuid) -{ - EABPopup *eabp = g_object_new(eab_popup_get_type(), 0); - - e_popup_construct(&eabp->popup, menuid); - - return eabp; -} - -/** - * eab_popup_target_new_select: - * @eabp: Address book popup. - * @book: Book the cards belong to. - * @readonly: Book is read-only mode. FIXME: Why can't we just get this off the book? - * @cards: Cards selected. This will be freed on completion. - * - * Create a new selection popup target. - * - * Return value: - **/ -EABPopupTargetSelect * -eab_popup_target_new_select(EABPopup *eabp, struct _EBook *book, int readonly, GPtrArray *cards) -{ - EABPopupTargetSelect *t = e_popup_target_new(&eabp->popup, EAB_POPUP_TARGET_SELECT, sizeof(*t)); - guint32 mask = ~0; - int has_email = FALSE, i; - - /* FIXME: duplicated in eab-menu.c */ - - t->book = book; - g_object_ref(book); - t->cards = cards; - - for (i=0;i<cards->len && !has_email;i++) { - EContact *contact = cards->pdata[i]; - GList *email; - - email = e_contact_get(E_CONTACT(contact), E_CONTACT_EMAIL); - if (email) { - has_email = TRUE; - - g_list_foreach(email, (GFunc)g_free, NULL); - g_list_free(email); - } - } - - if (has_email) - mask &= ~EAB_POPUP_SELECT_EMAIL; - - if (!readonly) - mask &= ~EAB_POPUP_SELECT_EDITABLE; - - if (cards->len == 1) - mask &= ~EAB_POPUP_SELECT_ONE; - - if (cards->len > 1) - mask &= ~EAB_POPUP_SELECT_MANY; - - if (cards->len >= 1) - mask &= ~EAB_POPUP_SELECT_ANY; - - t->target.mask = mask; - - return t; -} - -EABPopupTargetSource * -eab_popup_target_new_source(EABPopup *eabp, ESourceSelector *selector) -{ - EABPopupTargetSource *t = e_popup_target_new(&eabp->popup, EAB_POPUP_TARGET_SOURCE, sizeof(*t)); - guint32 mask = ~0; - const char *source_uri; - ESource *source; - - /* TODO: this is duplicated for calendar and tasks too */ - - t->selector = selector; - g_object_ref(selector); - - /* TODO: perhaps we need to copy this so it doesn't change during the lifecycle */ - source = e_source_selector_peek_primary_selection(selector); - if (source) - mask &= ~EAB_POPUP_SOURCE_PRIMARY; - - /* FIXME Gross hack, should have a property or something */ - source_uri = e_source_peek_relative_uri(source); - if (source_uri && !strcmp("system", source_uri)) - mask &= ~EAB_POPUP_SOURCE_SYSTEM; - else - mask &= ~EAB_POPUP_SOURCE_USER; - - t->target.mask = mask; - - return t; -} - -EABPopupTargetSelectNames * -eab_popup_target_new_select_names(EABPopup *eabp, struct _ESelectNamesModel *model, int row) -{ - EABPopupTargetSelectNames *t = e_popup_target_new(&eabp->popup, EAB_POPUP_TARGET_SELECT_NAMES, sizeof(*t)); - - /* TODO: this is sort of not very useful, maybe the popup which uses it doesn't - need to be pluggable */ - - t->model = model; - g_object_ref(model); - t->row = row; - - return t; -} - -/* ********************************************************************** */ -/* Popup menu plugin handler */ - -/* -<e-plugin - class="com.ximian.mail.plugin.popup:1.0" - id="com.ximian.mail.plugin.popup.iteab:1.0" - type="shlib" - location="/opt/gnome2/lib/camel/1.0/libcamelimap.so" - name="imap" - description="IMAP4 and IMAP4v1 mail store"> - <hook class="com.ximian.mail.popupMenu:1.0" - handler="HandlePopup"> - <menu id="any" target="select"> - <iteab - type="iteab|toggle|radio|image|submenu|bar" - active - path="foo/bar" - label="label" - icon="foo" - mask="select_one" - activate="eabp_view_eabacs"/> - </menu> - </extension> - -*/ - -static void *eabph_parent_class; -#define eabph ((EABPopupHook *)eph) - -static const EPopupHookTargetMask eabph_select_masks[] = { - { "one", EAB_POPUP_SELECT_ONE }, - { "many", EAB_POPUP_SELECT_MANY }, - { "any", EAB_POPUP_SELECT_ANY }, - { "editable", EAB_POPUP_SELECT_EDITABLE }, - { "email", EAB_POPUP_SELECT_EMAIL }, - { 0 } -}; - -static const EPopupHookTargetMask eabph_source_masks[] = { - { "primary", EAB_POPUP_SOURCE_PRIMARY }, - { "system", EAB_POPUP_SOURCE_SYSTEM }, - { 0 } -}; - -static const EPopupHookTargetMask eabph_select_names_masks[] = { - { 0 } -}; - -static const EPopupHookTargetMap eabph_targets[] = { - { "select", EAB_POPUP_TARGET_SELECT, eabph_select_masks }, - { "source", EAB_POPUP_TARGET_SOURCE, eabph_source_masks }, - { "select-names", EAB_POPUP_TARGET_SELECT_NAMES, eabph_select_names_masks }, - { 0 } -}; - -static void -eabph_finalise(GObject *o) -{ - /*EPluginHook *eph = (EPluginHook *)o;*/ - - ((GObjectClass *)eabph_parent_class)->finalize(o); -} - -static void -eabph_class_init(EPluginHookClass *klass) -{ - int i; - - ((GObjectClass *)klass)->finalize = eabph_finalise; - ((EPluginHookClass *)klass)->id = "com.ximian.evolution.addressbook.popup:1.0"; - - for (i=0;eabph_targets[i].type;i++) - e_popup_hook_class_add_target_map((EPopupHookClass *)klass, &eabph_targets[i]); - - ((EPopupHookClass *)klass)->popup_class = g_type_class_ref(eab_popup_get_type()); -} - -GType -eab_popup_hook_get_type(void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof(EABPopupHookClass), NULL, NULL, (GClassInitFunc) eabph_class_init, NULL, NULL, - sizeof(EABPopupHook), 0, (GInstanceInitFunc) NULL, - }; - - eabph_parent_class = g_type_class_ref(e_popup_hook_get_type()); - type = g_type_register_static(e_popup_hook_get_type(), "EABPopupHook", &info, 0); - } - - return type; -} diff --git a/addressbook/gui/widgets/eab-popup.h b/addressbook/gui/widgets/eab-popup.h deleted file mode 100644 index 7fec4cc742..0000000000 --- a/addressbook/gui/widgets/eab-popup.h +++ /dev/null @@ -1,173 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Authors: Michael Zucchi <notzed@ximian.com> - * - * Copyright 2004 Novell, Inc. (www.novell.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifndef __EAB_POPUP_H__ -#define __EAB_POPUP_H__ - -#include <glib-object.h> - -#include "e-util/e-popup.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -typedef struct _EABPopup EABPopup; -typedef struct _EABPopupClass EABPopupClass; - -/** - * enum _eab_popup_target_t - A list of mail popup target types. - * - * @EAB_POPUP_TARGET_SELECT: A selection of cards - * @EAB_POPUP_TARGET_SOURCE: A source selection. - * - * Defines the value of the targetid for all EABPopup target types. - **/ -enum _eab_popup_target_t { - EAB_POPUP_TARGET_SELECT, - EAB_POPUP_TARGET_SOURCE, - EAB_POPUP_TARGET_SELECT_NAMES, -}; - -/** - * enum _eab_popup_target_select_t - EABPopupTargetSelect qualifiers. - * - * @EAB_POPUP_SELECT_ONE: Only one item is selected. - * @EAB_POPUP_SELECT_MANY: Two or more items are selected. - * @EAB_POPUP_SELECT_ANY: One or more items are selected. - * @EAB_POPUP_SELECT_EDITABLE: Read/writable source. - * @EAB_POPUP_SELECT_EMAIL: Has an email address. - **/ -enum _eab_popup_target_select_t { - EAB_POPUP_SELECT_ONE = 1<<0, - EAB_POPUP_SELECT_MANY = 1<<1, - EAB_POPUP_SELECT_ANY = 1<<2, - EAB_POPUP_SELECT_EDITABLE = 1<<3, - EAB_POPUP_SELECT_EMAIL = 1<<4, -}; - -/** - * enum _eab_popup_target_source_t - EABPopupTargetSource qualifiers. - * - * @EAB_POPUP_SOURCE_PRIMARY: Has a primary selection. - * @EAB_POPUP_SOURCE_SYSTEM: Is a 'system' folder. - * - **/ -enum _eab_popup_target_source_t { - EAB_POPUP_SOURCE_PRIMARY = 1<<0, - EAB_POPUP_SOURCE_SYSTEM = 1<<1, /* system folder */ - EAB_POPUP_SOURCE_USER = 1<<2, /* user folder (!system) */ -}; - -typedef struct _EABPopupTargetSelect EABPopupTargetSelect; -typedef struct _EABPopupTargetSource EABPopupTargetSource; -typedef struct _EABPopupTargetSelectNames EABPopupTargetSelectNames; - -/** - * struct _EABPopupTargetSelect - A list of address cards. - * - * @target: Superclass. - * @book: Book the cards belong to. - * @cards: All selected cards. - * - * Used to represent a selection of cards as context for a popup - * menu. - **/ -struct _EABPopupTargetSelect { - EPopupTarget target; - - struct _EBook *book; - GPtrArray *cards; -}; - -/** - * struct _EABPopupTargetSource - A source target. - * - * @target: Superclass. - * @selector: Selector holding the source selection. - * - * This target is used to represent a source selection. - **/ -struct _EABPopupTargetSource { - EPopupTarget target; - - struct _ESourceSelector *selector; -}; - -/** - * struct _EABPopupTargetSelectNames - A select names target. - * - * @target: Superclass. - * @model: Select names model. - * @row: Row of item selected. - * - * This target is used to represent an item selected in an - * ESelectNames model. - **/ -struct _EABPopupTargetSelectNames { - EPopupTarget target; - - struct _ESelectNamesModel *model; - int row; -}; - -typedef struct _EPopupItem EABPopupItem; - -/* The object */ -struct _EABPopup { - EPopup popup; - - struct _EABPopupPrivate *priv; -}; - -struct _EABPopupClass { - EPopupClass popup_class; -}; - -GType eab_popup_get_type(void); - -EABPopup *eab_popup_new(const char *menuid); - -EABPopupTargetSelect *eab_popup_target_new_select(EABPopup *eabp, struct _EBook *book, int readonly, GPtrArray *cards); -EABPopupTargetSource *eab_popup_target_new_source(EABPopup *eabp, struct _ESourceSelector *selector); -EABPopupTargetSelectNames *eab_popup_target_new_select_names(EABPopup *eabp, struct _ESelectNamesModel *model, int row); - -/* ********************************************************************** */ - -typedef struct _EABPopupHook EABPopupHook; -typedef struct _EABPopupHookClass EABPopupHookClass; - -struct _EABPopupHook { - EPopupHook hook; -}; - -struct _EABPopupHookClass { - EPopupHookClass hook_class; -}; - -GType eab_popup_hook_get_type(void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __EAB_POPUP_H__ */ diff --git a/addressbook/gui/widgets/eab-vcard-control.c b/addressbook/gui/widgets/eab-vcard-control.c deleted file mode 100644 index 3e2cdddcc9..0000000000 --- a/addressbook/gui/widgets/eab-vcard-control.c +++ /dev/null @@ -1,311 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * eab-vcard-control.c - * - * Copyright (C) 1999, 2000, 2001, 2002, 2003, Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Authors: - * Chris Lahey <clahey@ximian.com> - * Chris Toshok <toshok@ximian.com> - */ - -#include <config.h> -#include <string.h> - -#include <gtk/gtk.h> -#include <bonobo/bonobo-generic-factory.h> -#include <bonobo/bonobo-persist.h> -#include <bonobo/bonobo-persist-stream.h> -#include <bonobo/bonobo-stream-client.h> -#include <gal/util/e-util.h> - -#include <libebook/e-book.h> -#include <libebook/e-contact.h> -#include <addressbook/gui/component/addressbook.h> -#include <addressbook/gui/widgets/eab-contact-display.h> -#include <addressbook/util/eab-book-util.h> - -#include "eab-vcard-control.h" -#include "eab-contact-merging.h" - -typedef struct { - EABContactDisplay *display; - GList *card_list; - GtkWidget *label; - EABContactDisplayRenderMode render_mode; -} EABVCardControl; - -#define VCARD_CONTROL_ID "OAFIID:GNOME_Evolution_Addressbook_VCard_Control:" BASE_VERSION - -/* - * Bonobo::PersistStream - * - * These two functions implement the Bonobo::PersistStream load and - * save methods which allow data to be loaded into and out of the - * BonoboObject. - */ -static char * -stream_read (Bonobo_Stream stream) -{ - Bonobo_Stream_iobuf *buffer; - CORBA_Environment ev; - char *data = NULL; - gint length = 0; - - CORBA_exception_init (&ev); - do { -#define READ_CHUNK_SIZE 65536 - Bonobo_Stream_read (stream, READ_CHUNK_SIZE, - &buffer, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - return NULL; - } - - if (buffer->_length <= 0) - break; - - data = g_realloc (data, length + buffer->_length + 1); - - memcpy (data + length, buffer->_buffer, buffer->_length); - - length += buffer->_length; - - CORBA_free (buffer); - } while (1); - - CORBA_free (buffer); - CORBA_exception_free (&ev); - - if (data) - data[length] = '\0'; - else - data = g_strdup(""); - - return data; -} /* stream_read */ - -/* - * This function implements the Bonobo::PersistStream:load method. - */ -static void -pstream_load (BonoboPersistStream *ps, const Bonobo_Stream stream, - Bonobo_Persist_ContentType type, void *data, - CORBA_Environment *ev) -{ - GList *list; - char *vcard; - EABVCardControl *vcard_control = data; - - if (type && g_ascii_strcasecmp (type, "text/vCard") != 0 && - g_ascii_strcasecmp (type, "text/x-vCard") != 0) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Bonobo_Persist_WrongDataType, NULL); - return; - } - - if ((vcard = stream_read (stream)) == NULL) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Bonobo_Persist_FileNotFound, NULL); - return; - } - - e_free_object_list (vcard_control->card_list); - list = eab_contact_list_from_string (vcard); - g_free(vcard); - vcard_control->card_list = list; - if (list) { - eab_contact_display_render (vcard_control->display, E_CONTACT (list->data), - vcard_control->render_mode); - } - if (list && list->next) { - char *message; - int length = g_list_length (list) - 1; - message = g_strdup_printf (ngettext("and one other contact.", - "and %d other contacts.", length), - length); - gtk_label_set_text (GTK_LABEL (vcard_control->label), message); - g_free (message); - gtk_widget_show (vcard_control->label); - } else { - gtk_widget_hide (vcard_control->label); - } -} /* pstream_load */ - -/* - * This function implements the Bonobo::PersistStream:save method. - */ -static void -pstream_save (BonoboPersistStream *ps, const Bonobo_Stream stream, - Bonobo_Persist_ContentType type, void *data, - CORBA_Environment *ev) -{ - EABVCardControl *vcard_control = data; - char *vcard; - int length; - - if (type && g_ascii_strcasecmp (type, "text/vCard") != 0 && - g_ascii_strcasecmp (type, "text/x-vCard") != 0) { - CORBA_exception_set (ev, CORBA_USER_EXCEPTION, - ex_Bonobo_Persist_WrongDataType, NULL); - return; - } - - vcard = eab_contact_list_to_string (vcard_control->card_list); - length = strlen (vcard); - bonobo_stream_client_write (stream, vcard, length, ev); - g_free (vcard); -} /* pstream_save */ - -static Bonobo_Persist_ContentTypeList * -pstream_get_content_types (BonoboPersistStream *ps, void *closure, - CORBA_Environment *ev) -{ - return bonobo_persist_generate_content_types (2, "text/vCard", "text/x-vCard"); -} - -static void -book_open_cb (EBook *book, EBookStatus status, gpointer closure) -{ - GList *list = closure; - if (status == E_BOOK_ERROR_OK) { - GList *p; - for (p = list; p; p = p->next) { - /* XXX argh, more passing of NULL's for callbacks */ - eab_merging_book_add_contact (book, E_CONTACT (p->data), NULL, NULL); - } - } - if (book) - g_object_unref (book); - e_free_object_list (list); -} - -static void -save_in_addressbook(GtkWidget *button, gpointer data) -{ - EABVCardControl *vcard_control = data; - GList *list, *p; - - list = g_list_copy (vcard_control->card_list); - - for (p = list; p; p = p->next) - g_object_ref (p->data); - - addressbook_load_default_book (book_open_cb, list); -} - -static void -toggle_full_vcard(GtkWidget *button, gpointer data) -{ - EABVCardControl *vcard_control = data; - char *label; - - if (!vcard_control->card_list) - return; - - if (vcard_control->render_mode == EAB_CONTACT_DISPLAY_RENDER_NORMAL) { - vcard_control->render_mode = EAB_CONTACT_DISPLAY_RENDER_COMPACT; - label = _("Show Full VCard"); - } - else { - vcard_control->render_mode = EAB_CONTACT_DISPLAY_RENDER_NORMAL; - label = _("Show Compact VCard"); - } - - gtk_button_set_label (GTK_BUTTON (button), label); - eab_contact_display_render (vcard_control->display, E_CONTACT (vcard_control->card_list->data), - vcard_control->render_mode); -} - -static void -free_struct (gpointer data, GObject *where_object_was) -{ - EABVCardControl *vcard_control = data; - e_free_object_list (vcard_control->card_list); - g_free (vcard_control); -} - -BonoboControl * -eab_vcard_control_new (void) -{ - BonoboControl *control; - BonoboPersistStream *stream; - GtkWidget *display; - GtkWidget *button1, *button2; - GtkWidget *bbox; - GtkWidget *vbox; - - EABVCardControl *vcard_control = g_new (EABVCardControl, 1); - - printf ("inside eab_vcard_control_new\n"); - - vcard_control->card_list = NULL; - vcard_control->display = NULL; - vcard_control->label = NULL; - - vcard_control->render_mode = EAB_CONTACT_DISPLAY_RENDER_COMPACT; - - /* Create the control. */ - - display = eab_contact_display_new (); - vcard_control->display = EAB_CONTACT_DISPLAY (display); - - bbox = gtk_hbutton_box_new (); - gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_START); - gtk_box_set_spacing (GTK_BOX (bbox), 12); - - button1 = gtk_button_new_with_label(_("Show Full VCard")); - g_signal_connect (button1, "clicked", - G_CALLBACK (toggle_full_vcard), vcard_control); - gtk_box_pack_start (GTK_BOX (bbox), button1, FALSE, FALSE, 0); - - button2 = gtk_button_new_with_label(_("Save in addressbook")); - g_signal_connect (button2, "clicked", - G_CALLBACK (save_in_addressbook), vcard_control); - gtk_box_pack_start (GTK_BOX (bbox), button2, FALSE, FALSE, 0); - - /* This is intentionally not shown. */ - vcard_control->label = gtk_label_new (""); - - vbox = gtk_vbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), display, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (vbox), vcard_control->label, TRUE, TRUE, 0); - gtk_widget_show_all (bbox); - gtk_widget_show (display); - gtk_widget_show (vbox); - - control = bonobo_control_new (vbox); - - g_object_weak_ref (G_OBJECT (control), free_struct, vcard_control); - - stream = bonobo_persist_stream_new (pstream_load, pstream_save, - pstream_get_content_types, - VCARD_CONTROL_ID, - vcard_control); - - if (stream == NULL) { - bonobo_object_unref (BONOBO_OBJECT (control)); - return NULL; - } - - bonobo_object_add_interface (BONOBO_OBJECT (control), - BONOBO_OBJECT (stream)); - - return control; -} diff --git a/addressbook/gui/widgets/eab-vcard-control.h b/addressbook/gui/widgets/eab-vcard-control.h deleted file mode 100644 index 5f6643c1ca..0000000000 --- a/addressbook/gui/widgets/eab-vcard-control.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef __EAB_VCARD_CONTROL_H__ -#define __EAB_VCARD_CONTROL_H__ - -#include <bonobo/bonobo-control.h> - -BonoboControl *eab_vcard_control_new (void); - -#endif /* __EAB_VCARD_CONTROL_H__ */ diff --git a/addressbook/gui/widgets/gal-view-factory-minicard.c b/addressbook/gui/widgets/gal-view-factory-minicard.c deleted file mode 100644 index 212ac79b53..0000000000 --- a/addressbook/gui/widgets/gal-view-factory-minicard.c +++ /dev/null @@ -1,85 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gal-view-factory-minicard.c: A View Factory - * - * Authors: - * Chris Lahey <clahey@ximian.com> - * - * (C) 2000, 2001 Ximian, Inc. - */ -#include <config.h> -#include <glib.h> -#include <libgnome/gnome-i18n.h> -#include "gal-view-factory-minicard.h" -#include "gal-view-minicard.h" -#include "gal/util/e-util.h" - -#define PARENT_TYPE GAL_VIEW_FACTORY_TYPE - -static GalViewFactoryClass *gal_view_factory_minicard_parent_class; - -static const char * -gal_view_factory_minicard_get_title (GalViewFactory *factory) -{ - return _("Card View"); -} - -static GalView * -gal_view_factory_minicard_new_view (GalViewFactory *factory, - const char *name) -{ - return gal_view_minicard_new(name); -} - -static const char * -gal_view_factory_minicard_get_type_code (GalViewFactory *factory) -{ - return "minicard"; -} - -static void -gal_view_factory_minicard_class_init (GObjectClass *object_class) -{ - GalViewFactoryClass *view_factory_class = GAL_VIEW_FACTORY_CLASS(object_class); - gal_view_factory_minicard_parent_class = g_type_class_ref (PARENT_TYPE); - - view_factory_class->get_title = gal_view_factory_minicard_get_title; - view_factory_class->new_view = gal_view_factory_minicard_new_view; - view_factory_class->get_type_code = gal_view_factory_minicard_get_type_code; -} - -static void -gal_view_factory_minicard_init (GalViewFactoryMinicard *factory) -{ -} - -/** - * gal_view_minicard_new - * - * A new GalViewFactory for creating Minicard views. Create one of - * these and pass it to GalViewCollection for use. - * - * Returns: The new GalViewFactoryMinicard. - */ -GalViewFactory * -gal_view_factory_minicard_new (void) -{ - return gal_view_factory_minicard_construct (g_object_new (GAL_TYPE_VIEW_FACTORY_MINICARD, NULL)); -} - -/** - * gal_view_minicard_construct - * @factory: The factory to construct - * - * constructs the GalViewFactoryMinicard. To be used by subclasses and - * language bindings. - * - * Returns: The GalViewFactoryMinicard. - */ -GalViewFactory * -gal_view_factory_minicard_construct (GalViewFactoryMinicard *factory) -{ - return GAL_VIEW_FACTORY(factory); -} - -E_MAKE_TYPE(gal_view_factory_minicard, "GalViewFactoryMinicard", GalViewFactoryMinicard, gal_view_factory_minicard_class_init, gal_view_factory_minicard_init, PARENT_TYPE) diff --git a/addressbook/gui/widgets/gal-view-factory-minicard.h b/addressbook/gui/widgets/gal-view-factory-minicard.h deleted file mode 100644 index 02eea99e47..0000000000 --- a/addressbook/gui/widgets/gal-view-factory-minicard.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gal-view-factory-minicard.c: A View Factory - * - * Authors: - * Chris Lahey <clahey@ximian.com> - * - * (C) 2000, 2001 Ximian, Inc. - */ -#ifndef _GAL_VIEW_FACTORY_MINICARD_H_ -#define _GAL_VIEW_FACTORY_MINICARD_H_ - -#include <gtk/gtkobject.h> -#include <gal/menus/gal-view-factory.h> - -#define GAL_TYPE_VIEW_FACTORY_MINICARD (gal_view_factory_minicard_get_type ()) -#define GAL_VIEW_FACTORY_MINICARD(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GAL_TYPE_VIEW_FACTORY_MINICARD, GalViewFactoryMinicard)) -#define GAL_VIEW_FACTORY_MINICARD_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GAL_TYPE_VIEW_FACTORY_MINICARD, GalViewFactoryMinicardClass)) -#define GAL_IS_VIEW_FACTORY_MINICARD(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GAL_TYPE_VIEW_FACTORY_MINICARD)) -#define GAL_IS_VIEW_FACTORY_MINICARD_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GAL_TYPE_VIEW_FACTORY_MINICARD)) - -typedef struct { - GalViewFactory base; -} GalViewFactoryMinicard; - -typedef struct { - GalViewFactoryClass parent_class; -} GalViewFactoryMinicardClass; - -/* Standard functions */ -GType gal_view_factory_minicard_get_type (void); -GalViewFactory *gal_view_factory_minicard_new (void); -GalViewFactory *gal_view_factory_minicard_construct (GalViewFactoryMinicard *factory); - -#endif /* _GAL_VIEW_FACTORY_MINICARD_H_ */ diff --git a/addressbook/gui/widgets/gal-view-factory-treeview.c b/addressbook/gui/widgets/gal-view-factory-treeview.c deleted file mode 100644 index b14c8dec59..0000000000 --- a/addressbook/gui/widgets/gal-view-factory-treeview.c +++ /dev/null @@ -1,86 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 - -*- */ -/* - * gal-view-factory-treeview.c: A View Factory - * - * Authors: - * Chris Lahey <clahey@ximian.com> - * - * (C) 2000, 2001 Ximian, Inc. - */ -#include <config.h> -#include <glib.h> -#include <libgnome/gnome-i18n.h> -#include <gal/util/e-util.h> -#include "gal-view-factory-treeview.h" -#include "gal-view-treeview.h" - -#define PARENT_TYPE GAL_VIEW_FACTORY_TYPE - -static GalViewFactoryClass *gal_view_factory_treeview_parent_class; - -static const char * -gal_view_factory_treeview_get_title (GalViewFactory *factory) -{ - return _("GTK Tree View"); -} - -static GalView * -gal_view_factory_treeview_new_view (GalViewFactory *factory, - const char *name) -{ - return gal_view_treeview_new(name); -} - -static const char * -gal_view_factory_treeview_get_type_code (GalViewFactory *factory) -{ - return "treeview"; -} - -static void -gal_view_factory_treeview_class_init (GObjectClass *object_class) -{ - GalViewFactoryClass *view_factory_class = GAL_VIEW_FACTORY_CLASS(object_class); - gal_view_factory_treeview_parent_class = g_type_class_ref (PARENT_TYPE); - - view_factory_class->get_title = gal_view_factory_treeview_get_title; - view_factory_class->new_view = gal_view_factory_treeview_new_view; - view_factory_class->get_type_code = gal_view_factory_treeview_get_type_code; -} - -static void -gal_view_factory_treeview_init (GalViewFactoryTreeView *factory) -{ -} - -/** - * gal_view_treeview_new - * - * A new GalViewFactory for creating TreeView views. Create one of - * these and pass it to GalViewCollection for use. - * - * Returns: The new GalViewFactoryTreeView. - */ -GalViewFactory * -gal_view_factory_treeview_new (void) -{ - return gal_view_factory_treeview_construct (g_object_new (GAL_TYPE_VIEW_FACTORY_TREEVIEW, NULL)); -} - -/** - * gal_view_treeview_construct - * @factory: The factory to construct - * - * constructs the GalViewFactoryTreeView. To be used by subclasses and - * language bindings. - * - * Returns: The GalViewFactoryTreeView. - */ -GalViewFactory * -gal_view_factory_treeview_construct (GalViewFactoryTreeView *factory) -{ - return GAL_VIEW_FACTORY(factory); -} - -E_MAKE_TYPE(gal_view_factory_treeview, "GalViewFactoryTreeView", GalViewFactoryTreeView, gal_view_factory_treeview_class_init, gal_view_factory_treeview_init, PARENT_TYPE) diff --git a/addressbook/gui/widgets/gal-view-factory-treeview.h b/addressbook/gui/widgets/gal-view-factory-treeview.h deleted file mode 100644 index 4795c6d3aa..0000000000 --- a/addressbook/gui/widgets/gal-view-factory-treeview.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gal-view-factory-treeview.c: A View Factory - * - * Authors: - * Chris Toshok <toshok@ximian.com> - * - * (C) 2000, 2001 Ximian, Inc. - */ -#ifndef _GAL_VIEW_FACTORY_TREEVIEW_H_ -#define _GAL_VIEW_FACTORY_TREEVIEW_H_ - -#include <gtk/gtkobject.h> -#include <gal/menus/gal-view-factory.h> - -#define GAL_TYPE_VIEW_FACTORY_TREEVIEW (gal_view_factory_treeview_get_type ()) -#define GAL_VIEW_FACTORY_TREEVIEW(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GAL_TYPE_VIEW_FACTORY_TREEVIEW, GalViewFactoryTreeView)) -#define GAL_VIEW_FACTORY_TREEVIEW_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GAL_TYPE_VIEW_FACTORY_TREEVIEW, GalViewFactoryTreeViewClass)) -#define GAL_IS_VIEW_FACTORY_TREEVIEW(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GAL_TYPE_VIEW_FACTORY_TREEVIEW)) -#define GAL_IS_VIEW_FACTORY_TREEVIEW_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GAL_TYPE_VIEW_FACTORY_TREEVIEW)) - -typedef struct { - GalViewFactory base; -} GalViewFactoryTreeView; - -typedef struct { - GalViewFactoryClass parent_class; -} GalViewFactoryTreeViewClass; - -/* Standard functions */ -GType gal_view_factory_treeview_get_type (void); -GalViewFactory *gal_view_factory_treeview_new (void); -GalViewFactory *gal_view_factory_treeview_construct (GalViewFactoryTreeView *factory); - -#endif /* _GAL_VIEW_FACTORY_TREEVIEW_H_ */ diff --git a/addressbook/gui/widgets/gal-view-minicard.c b/addressbook/gui/widgets/gal-view-minicard.c deleted file mode 100644 index da60497cdb..0000000000 --- a/addressbook/gui/widgets/gal-view-minicard.c +++ /dev/null @@ -1,227 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gal-view-minicard.c: An Minicard View - * - * Authors: - * Chris Lahey <clahey@ximian.com> - * - * (C) 2000, 2001 Ximian, Inc. - */ -#include <config.h> -#include "gal-view-minicard.h" -#include <libxml/parser.h> -#include <gal/util/e-xml-utils.h> - -#define PARENT_TYPE gal_view_get_type () -#define d(x) x - -static GalViewClass *gal_view_minicard_parent_class; - -static void -gal_view_minicard_edit (GalView *view, GtkWindow *parent_window) -{ - /* GalViewMinicard *minicard_view = GAL_VIEW_MINICARD(view); */ -} - -static void -gal_view_minicard_load (GalView *view, - const char *filename) -{ - xmlDoc *doc; - doc = xmlParseFile (filename); - if (doc) { - xmlNode *root = xmlDocGetRootElement(doc); - GAL_VIEW_MINICARD (view)->column_width = e_xml_get_double_prop_by_name_with_default (root, "column_width", 150); - xmlFreeDoc(doc); - } -} - -static void -gal_view_minicard_save (GalView *view, - const char *filename) -{ - xmlDoc *doc; - xmlNode *root; - - doc = xmlNewDoc("1.0"); - root = xmlNewNode (NULL, "EMinicardViewState"); - e_xml_set_double_prop_by_name (root, "column_width", GAL_VIEW_MINICARD (view)->column_width); - xmlDocSetRootElement(doc, root); - xmlSaveFile(filename, doc); - xmlFreeDoc(doc); -} - -static const char * -gal_view_minicard_get_title (GalView *view) -{ - return GAL_VIEW_MINICARD(view)->title; -} - -static void -gal_view_minicard_set_title (GalView *view, - const char *title) -{ - g_free(GAL_VIEW_MINICARD(view)->title); - GAL_VIEW_MINICARD(view)->title = g_strdup(title); -} - -static const char * -gal_view_minicard_get_type_code (GalView *view) -{ - return "minicard"; -} - -static GalView * -gal_view_minicard_clone (GalView *view) -{ - GalViewMinicard *gvm, *new; - - gvm = GAL_VIEW_MINICARD(view); - - new = g_object_new (GAL_TYPE_VIEW_MINICARD, NULL); - new->title = g_strdup (gvm->title); - new->column_width = gvm->column_width; - - return GAL_VIEW(new); -} - -static void -gal_view_minicard_dispose (GObject *object) -{ - GalViewMinicard *view = GAL_VIEW_MINICARD(object); - - if (view->title != NULL) { - gal_view_minicard_detach (view); - g_free(view->title); - view->title = NULL; - } - - if (G_OBJECT_CLASS (gal_view_minicard_parent_class)->dispose) - (* G_OBJECT_CLASS (gal_view_minicard_parent_class)->dispose) (object); -} - -static void -gal_view_minicard_class_init (GObjectClass *object_class) -{ - GalViewClass *gal_view_class = GAL_VIEW_CLASS(object_class); - gal_view_minicard_parent_class = g_type_class_ref (PARENT_TYPE); - - gal_view_class->edit = gal_view_minicard_edit ; - gal_view_class->load = gal_view_minicard_load ; - gal_view_class->save = gal_view_minicard_save ; - gal_view_class->get_title = gal_view_minicard_get_title ; - gal_view_class->set_title = gal_view_minicard_set_title ; - gal_view_class->get_type_code = gal_view_minicard_get_type_code; - gal_view_class->clone = gal_view_minicard_clone ; - - object_class->dispose = gal_view_minicard_dispose ; -} - -static void -gal_view_minicard_init (GalViewMinicard *gvm) -{ - gvm->title = NULL; - gvm->column_width = 150.0; - - gvm->emvw = NULL; - gvm->emvw_column_width_changed_id = 0; -} - -/** - * gal_view_minicard_new - * @title: The name of the new view. - * - * Returns a new GalViewMinicard. This is primarily for use by - * GalViewFactoryMinicard. - * - * Returns: The new GalViewMinicard. - */ -GalView * -gal_view_minicard_new (const gchar *title) -{ - return gal_view_minicard_construct (g_object_new (GAL_TYPE_VIEW_MINICARD, NULL), title); -} - -/** - * gal_view_minicard_construct - * @view: The view to construct. - * @title: The name of the new view. - * - * constructs the GalViewMinicard. To be used by subclasses and - * language bindings. - * - * Returns: The GalViewMinicard. - */ -GalView * -gal_view_minicard_construct (GalViewMinicard *view, - const gchar *title) -{ - view->title = g_strdup(title); - return GAL_VIEW(view); -} - -GType -gal_view_minicard_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (GalViewMinicardClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) gal_view_minicard_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GalViewMinicard), - 0, /* n_preallocs */ - (GInstanceInitFunc) gal_view_minicard_init, - }; - - type = g_type_register_static (PARENT_TYPE, "GalViewMinicard", &info, 0); - } - - return type; -} - -static void -column_width_changed (EMinicardViewWidget *w, double width, GalViewMinicard *view) -{ - d(g_print("%s: Old width = %f, New width = %f\n", G_GNUC_FUNCTION, view->column_width, width)); - if (view->column_width != width) { - view->column_width = width; - gal_view_changed(GAL_VIEW(view)); - } -} - -void -gal_view_minicard_attach (GalViewMinicard *view, EMinicardViewWidget *emvw) -{ - gal_view_minicard_detach (view); - - view->emvw = emvw; - - g_object_ref (view->emvw); - - g_object_set (view->emvw, - "column_width", view->column_width, - NULL); - - view->emvw_column_width_changed_id = - g_signal_connect(view->emvw, "column_width_changed", - G_CALLBACK (column_width_changed), view); -} - -void -gal_view_minicard_detach (GalViewMinicard *view) -{ - if (view->emvw == NULL) - return; - if (view->emvw_column_width_changed_id) { - g_signal_handler_disconnect (view->emvw, - view->emvw_column_width_changed_id); - view->emvw_column_width_changed_id = 0; - } - g_object_unref (view->emvw); - view->emvw = NULL; -} diff --git a/addressbook/gui/widgets/gal-view-minicard.h b/addressbook/gui/widgets/gal-view-minicard.h deleted file mode 100644 index e586012f73..0000000000 --- a/addressbook/gui/widgets/gal-view-minicard.h +++ /dev/null @@ -1,45 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gal-view-minicard.h: An Minicard View - * - * Authors: - * Chris Lahey <clahey@ximian.com> - * - * (C) 2000, 2001 Ximian, Inc. - */ -#ifndef _GAL_VIEW_MINICARD_H_ -#define _GAL_VIEW_MINICARD_H_ - -#include <gal/menus/gal-view.h> -#include <e-minicard-view-widget.h> - -#define GAL_TYPE_VIEW_MINICARD (gal_view_minicard_get_type ()) -#define GAL_VIEW_MINICARD(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GAL_TYPE_VIEW_MINICARD, GalViewMinicard)) -#define GAL_VIEW_MINICARD_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GAL_TYPE_VIEW_MINICARD, GalViewMinicardClass)) -#define GAL_IS_VIEW_MINICARD(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GAL_TYPE_VIEW_MINICARD)) -#define GAL_IS_VIEW_MINICARD_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GAL_TYPE_VIEW_MINICARD)) - -typedef struct { - GalView base; - - char *title; - double column_width; - - EMinicardViewWidget *emvw; - guint emvw_column_width_changed_id; -} GalViewMinicard; - -typedef struct { - GalViewClass parent_class; -} GalViewMinicardClass; - -/* Standard functions */ -GType gal_view_minicard_get_type (void); -GalView *gal_view_minicard_new (const gchar *title); -GalView *gal_view_minicard_construct (GalViewMinicard *view, - const gchar *title); -void gal_view_minicard_attach (GalViewMinicard *view, - EMinicardViewWidget *emvw); -void gal_view_minicard_detach (GalViewMinicard *view); - -#endif /* _GAL_VIEW_MINICARD_H_ */ diff --git a/addressbook/gui/widgets/gal-view-treeview.c b/addressbook/gui/widgets/gal-view-treeview.c deleted file mode 100644 index e18ae6341b..0000000000 --- a/addressbook/gui/widgets/gal-view-treeview.c +++ /dev/null @@ -1,234 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gal-view-treeview.c: An TreeView View - * - * Authors: - * Chris Lahey <clahey@ximian.com> - * - * (C) 2000, 2001 Ximian, Inc. - */ -#include <config.h> -#include "gal-view-treeview.h" -#include <libxml/parser.h> -#include <gal/util/e-xml-utils.h> - -#define PARENT_TYPE gal_view_get_type () -#define d(x) x - -static GalViewClass *gal_view_treeview_parent_class; - -static void -gal_view_treeview_edit (GalView *view, GtkWindow *parent_window) -{ - /* GalViewTreeView *treeview_view = GAL_VIEW_TREEVIEW(view); */ -} - -static void -gal_view_treeview_load (GalView *view, - const char *filename) -{ -#if 0 - xmlDoc *doc; - doc = xmlParseFile (filename); - if (doc) { - xmlNode *root = xmlDocGetRootElement(doc); - GAL_VIEW_TREEVIEW (view)->column_width = e_xml_get_double_prop_by_name_with_default (root, "column_width", 150); - xmlFreeDoc(doc); - } -#endif -} - -static void -gal_view_treeview_save (GalView *view, - const char *filename) -{ -#if 0 - xmlDoc *doc; - xmlNode *root; - - doc = xmlNewDoc("1.0"); - root = xmlNewNode (NULL, "ETreeViewViewState"); - e_xml_set_double_prop_by_name (root, "column_width", GAL_VIEW_TREEVIEW (view)->column_width); - xmlDocSetRootElement(doc, root); - xmlSaveFile(filename, doc); - xmlFreeDoc(doc); -#endif -} - -static const char * -gal_view_treeview_get_title (GalView *view) -{ - return GAL_VIEW_TREEVIEW(view)->title; -} - -static void -gal_view_treeview_set_title (GalView *view, - const char *title) -{ - g_free(GAL_VIEW_TREEVIEW(view)->title); - GAL_VIEW_TREEVIEW(view)->title = g_strdup(title); -} - -static const char * -gal_view_treeview_get_type_code (GalView *view) -{ - return "treeview"; -} - -static GalView * -gal_view_treeview_clone (GalView *view) -{ - GalViewTreeView *gvm, *new; - - gvm = GAL_VIEW_TREEVIEW(view); - - new = g_object_new (GAL_TYPE_VIEW_TREEVIEW, NULL); - new->title = g_strdup (gvm->title); - - return GAL_VIEW(new); -} - -static void -gal_view_treeview_dispose (GObject *object) -{ - GalViewTreeView *view = GAL_VIEW_TREEVIEW(object); - - if (view->title != NULL) { - gal_view_treeview_detach (view); - g_free(view->title); - view->title = NULL; - } - - if (G_OBJECT_CLASS (gal_view_treeview_parent_class)->dispose) - (* G_OBJECT_CLASS (gal_view_treeview_parent_class)->dispose) (object); -} - -static void -gal_view_treeview_class_init (GObjectClass *object_class) -{ - GalViewClass *gal_view_class = GAL_VIEW_CLASS(object_class); - gal_view_treeview_parent_class = g_type_class_ref (PARENT_TYPE); - - gal_view_class->edit = gal_view_treeview_edit ; - gal_view_class->load = gal_view_treeview_load ; - gal_view_class->save = gal_view_treeview_save ; - gal_view_class->get_title = gal_view_treeview_get_title ; - gal_view_class->set_title = gal_view_treeview_set_title ; - gal_view_class->get_type_code = gal_view_treeview_get_type_code; - gal_view_class->clone = gal_view_treeview_clone ; - - object_class->dispose = gal_view_treeview_dispose ; -} - -static void -gal_view_treeview_init (GalViewTreeView *gvm) -{ - gvm->title = NULL; - - gvm->tree = NULL; -} - -/** - * gal_view_treeview_new - * @title: The name of the new view. - * - * Returns a new GalViewTreeView. This is primarily for use by - * GalViewFactoryTreeView. - * - * Returns: The new GalViewTreeView. - */ -GalView * -gal_view_treeview_new (const gchar *title) -{ - return gal_view_treeview_construct (g_object_new (GAL_TYPE_VIEW_TREEVIEW, NULL), title); -} - -/** - * gal_view_treeview_construct - * @view: The view to construct. - * @title: The name of the new view. - * - * constructs the GalViewTreeView. To be used by subclasses and - * language bindings. - * - * Returns: The GalViewTreeView. - */ -GalView * -gal_view_treeview_construct (GalViewTreeView *view, - const gchar *title) -{ - view->title = g_strdup(title); - return GAL_VIEW(view); -} - -GType -gal_view_treeview_get_type (void) -{ - static GType type = 0; - - if (!type) { - static const GTypeInfo info = { - sizeof (GalViewTreeViewClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) gal_view_treeview_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GalViewTreeView), - 0, /* n_preallocs */ - (GInstanceInitFunc) gal_view_treeview_init, - }; - - type = g_type_register_static (PARENT_TYPE, "GalViewTreeView", &info, 0); - } - - return type; -} - -#if 0 -static void -column_width_changed (ETable *table, double width, GalViewMinicard *view) -{ - d(g_print("%s: Old width = %f, New width = %f\n", G_GNUC_FUNCTION, view->column_width, width)); - if (view->column_width != width) { - view->column_width = width; - gal_view_changed(GAL_VIEW(view)); - } -} -#endif - -void -gal_view_treeview_attach (GalViewTreeView *view, GtkTreeView *tree) -{ -#if 0 - gal_view_treeview_detach (view); - - view->emvw = emvw; - - g_object_ref (view->emvw); - - g_object_set (view->emvw, - "column_width", view->column_width, - NULL); - - view->emvw_column_width_changed_id = - g_signal_connect(view->emvw, "column_width_changed", - G_CALLBACK (column_width_changed), view); -#endif -} - -void -gal_view_treeview_detach (GalViewTreeView *view) -{ -#if 0 - if (view->emvw == NULL) - return; - if (view->emvw_column_width_changed_id) { - g_signal_handler_disconnect (view->emvw, - view->emvw_column_width_changed_id); - view->emvw_column_width_changed_id = 0; - } - g_object_unref (view->emvw); - view->emvw = NULL; -#endif -} diff --git a/addressbook/gui/widgets/gal-view-treeview.h b/addressbook/gui/widgets/gal-view-treeview.h deleted file mode 100644 index a0313856a6..0000000000 --- a/addressbook/gui/widgets/gal-view-treeview.h +++ /dev/null @@ -1,43 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * gal-view-treeview.h: An TreeView View - * - * Authors: - * Chris Toshok <toshok@ximian.com> - * - * (C) 2000, 2001 Ximian, Inc. - */ -#ifndef _GAL_VIEW_TREEVIEW_H_ -#define _GAL_VIEW_TREEVIEW_H_ - -#include <gal/menus/gal-view.h> -#include <gtk/gtktreeview.h> - -#define GAL_TYPE_VIEW_TREEVIEW (gal_view_treeview_get_type ()) -#define GAL_VIEW_TREEVIEW(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GAL_TYPE_VIEW_TREEVIEW, GalViewTreeView)) -#define GAL_VIEW_TREEVIEW_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), GAL_TYPE_VIEW_TREEVIEW, GalViewTreeViewClass)) -#define GAL_IS_VIEW_TREEVIEW(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GAL_TYPE_VIEW_TREEVIEW)) -#define GAL_IS_VIEW_TREEVIEW_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GAL_TYPE_VIEW_TREEVIEW)) - -typedef struct { - GalView base; - - char *title; - - GtkTreeView *tree; -} GalViewTreeView; - -typedef struct { - GalViewClass parent_class; -} GalViewTreeViewClass; - -/* Standard functions */ -GType gal_view_treeview_get_type (void); -GalView *gal_view_treeview_new (const gchar *title); -GalView *gal_view_treeview_construct (GalViewTreeView *view, - const gchar *title); -void gal_view_treeview_attach (GalViewTreeView *view, - GtkTreeView *tree); -void gal_view_treeview_detach (GalViewTreeView *view); - -#endif /* _GAL_VIEW_TREEVIEW_H_ */ diff --git a/addressbook/gui/widgets/test-reflow.c b/addressbook/gui/widgets/test-reflow.c deleted file mode 100644 index 66f003fe2c..0000000000 --- a/addressbook/gui/widgets/test-reflow.c +++ /dev/null @@ -1,199 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* test-reflow.c - * - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#define TEST_VCARD \ -"BEGIN:VCARD -" \ -"FN:Nat -" \ -"N:Friedman;Nat;D;Mr. -" \ -"TITLE:Head Geek -" \ -"BDAY:1977-08-06 -" \ -"TEL;WORK:617 679 1984 -" \ -"TEL;CELL:123 456 7890 -" \ -"EMAIL;INTERNET:nat@nat.org -" \ -"EMAIL;INTERNET:nat@ximian.com -" \ -"ADR;WORK;POSTAL:P.O. Box 101;;;Any Town;CA;91921-1234; -" \ -"ADR;HOME;POSTAL;INTL:P.O. Box 202;;;Any Town 2;MI;12344-4321;USA -" \ -"END:VCARD -" \ -" -" - - -#include "config.h" - -#include <gtk/gtkmain.h> -#include <gtk/gtkvbox.h> -#include <libgnomeui/gnome-canvas-rect-ellipse.h> -#include <libgnomeui/gnome-init.h> -#include <gal/widgets/e-canvas.h> -#include <gal/widgets/e-reflow.h> -#include <gal/widgets/e-scroll-frame.h> - -#include "e-minicard.h" - -/* This is a horrible thing to do, but it is just a test. */ -GnomeCanvasItem *reflow; -GnomeCanvasItem *rect; -GtkAllocation last_alloc; - -static void destroy_callback(gpointer data, GObject *where_object_was) -{ - exit(0); -} - -static void allocate_callback(GtkWidget *canvas, GtkAllocation *allocation, gpointer data) -{ - double width; - last_alloc = *allocation; - gnome_canvas_item_set( reflow, - "height", (double) allocation->height, - NULL ); - gnome_canvas_item_set( reflow, - "minimum_width", (double) allocation->width, - NULL ); - g_object_get(reflow, - "width", &width, - NULL); - width = MAX(width, allocation->width); - gnome_canvas_set_scroll_region(GNOME_CANVAS( canvas ), 0, 0, width - 1, allocation->height - 1); - gnome_canvas_item_set( rect, - "x2", (double) width, - "y2", (double) allocation->height, - NULL ); -} - -static void resize(GnomeCanvas *canvas, gpointer data) -{ - double width; - g_object_get(reflow, - "width", &width, - NULL); - width = MAX(width, last_alloc.width); - gnome_canvas_set_scroll_region(canvas , 0, 0, width - 1, last_alloc.height - 1); - gnome_canvas_item_set( rect, - "x2", (double) width, - "y2", (double) last_alloc.height, - NULL ); -} - -#if 0 -static void about_callback( GtkWidget *widget, gpointer data ) -{ - - const gchar *authors[] = - { - "Christopher James Lahey <clahey@umich.edu>", - NULL - }; - - GtkWidget *about = - gnome_about_new ( _( "Reflow Test" ), VERSION, - _( "Copyright (C) 2000, Ximian, Inc." ), - authors, - _( "This should test the reflow canvas item" ), - NULL); - gtk_widget_show (about); -} -#endif - -int main( int argc, char *argv[] ) -{ - GtkWidget *app; - GtkWidget *canvas; - GtkWidget *vbox; - GtkWidget *scrollframe; - int i; - - /* bindtextdomain (PACKAGE, GNOMELOCALEDIR); - textdomain (PACKAGE);*/ - - gnome_init( "Reflow Test", VERSION, argc, argv); - app = gnome_app_new("Reflow Test", NULL); - - vbox = gtk_vbox_new(FALSE, 0); - - canvas = e_canvas_new(); - rect = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( canvas ) ), - gnome_canvas_rect_get_type(), - "x1", (double) 0, - "y1", (double) 0, - "x2", (double) 100, - "y2", (double) 100, - "fill_color", "white", - NULL ); - reflow = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS( canvas ) ), - e_reflow_get_type(), - "height", (double) 100, - "minimum_width", (double) 100, - NULL ); - g_signal_connect( canvas, "reflow", - G_CALLBACK ( resize ), - ( gpointer ) app); - for ( i = 0; i < 200; i++ ) - { - GnomeCanvasItem *item; - ECard *card = e_card_new (TEST_VCARD); - item = gnome_canvas_item_new( GNOME_CANVAS_GROUP(reflow), - e_minicard_get_type(), - "card", card, - NULL); - e_reflow_add_item(E_REFLOW(reflow), item, NULL); - } - gnome_canvas_set_scroll_region ( GNOME_CANVAS( canvas ), - 0, 0, - 100, 100 ); - - scrollframe = e_scroll_frame_new (gtk_layout_get_hadjustment(GTK_LAYOUT(canvas)), - gtk_layout_get_vadjustment(GTK_LAYOUT(canvas))); - e_scroll_frame_set_policy (E_SCROLL_FRAME (scrollframe), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_NEVER); - - gtk_container_add (GTK_CONTAINER (scrollframe), canvas); - - gnome_app_set_contents( GNOME_APP( app ), scrollframe ); - - /* Connect the signals */ - g_object_weak_ref (app, destroy_callback, app); - - g_signal_connect( canvas, "size_allocate", - G_CALLBACK ( allocate_callback ), - ( gpointer ) app ); - - gtk_widget_show_all( app ); - gdk_window_set_back_pixmap( GTK_LAYOUT(canvas)->bin_window, NULL, FALSE); - - gtk_main(); - - /* Not reached. */ - return 0; -} diff --git a/addressbook/importers/.cvsignore b/addressbook/importers/.cvsignore deleted file mode 100644 index 665a07cc24..0000000000 --- a/addressbook/importers/.cvsignore +++ /dev/null @@ -1,8 +0,0 @@ -.deps -.libs -Makefile -Makefile.in -*.lo -*.la -GNOME_Evolution_Addressbook*.server -GNOME_Evolution_Addressbook*.server.in diff --git a/addressbook/importers/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in b/addressbook/importers/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in deleted file mode 100644 index 954ff9eece..0000000000 --- a/addressbook/importers/GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in +++ /dev/null @@ -1,29 +0,0 @@ -<oaf_info> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_LDIF_ImporterFactory:@VERSION@" - type="shlib" - location="@IMPORTERSDIR@/libevolution-addressbook-ldif-importer.so"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/ObjectFactory:1.0"/> - </oaf_attribute> - - <oaf_attribute name="name" type="string" - _value="Evolution LDIF importer"/> -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_LDIF_Importer:@VERSION@" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_LDIF_ImporterFactory:@VERSION@"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/Evolution/Importer:@VERSION@"/> - </oaf_attribute> - - <oaf_attribute name="evolution:menu_name" type="string" - _value="LDAP Data Interchange Format (.ldif)"/> - <oaf_attribute name="name" type="string" - _value="Evolution LDIF importer"/> -</oaf_server> - -</oaf_info> diff --git a/addressbook/importers/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in b/addressbook/importers/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in deleted file mode 100644 index d0eb3f94d4..0000000000 --- a/addressbook/importers/GNOME_Evolution_Addressbook_VCard_Importer.server.in.in +++ /dev/null @@ -1,29 +0,0 @@ -<oaf_info> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_VCard_ImporterFactory:@VERSION@" - type="shlib" - location="@IMPORTERSDIR@/libevolution-addressbook-vcard-importer.so"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/ObjectFactory:1.0"/> - </oaf_attribute> - - <oaf_attribute name="name" type="string" - _value="Evolution VCard importer"/> -</oaf_server> - -<oaf_server iid="OAFIID:GNOME_Evolution_Addressbook_VCard_Importer:@VERSION@" - type="factory" - location="OAFIID:GNOME_Evolution_Addressbook_VCard_ImporterFactory:@VERSION@"> - - <oaf_attribute name="repo_ids" type="stringv"> - <item value="IDL:GNOME/Evolution/Importer:@VERSION@"/> - </oaf_attribute> - - <oaf_attribute name="evolution:menu_name" type="string" - _value="VCard (.vcf, .gcrd)"/> - <oaf_attribute name="name" type="string" - _value="Evolution VCard Importer"/> -</oaf_server> - -</oaf_info> diff --git a/addressbook/importers/Makefile.am b/addressbook/importers/Makefile.am deleted file mode 100644 index 3c04c22f37..0000000000 --- a/addressbook/importers/Makefile.am +++ /dev/null @@ -1,53 +0,0 @@ -importersdir = $(privlibdir)/evolution-addressbook-importers - -importers_LTLIBRARIES = \ - libevolution-addressbook-ldif-importer.la \ - libevolution-addressbook-vcard-importer.la - -INCLUDES = \ - -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \ - -DEVOLUTION_SOUNDDIR=\""$(soundsdir)"\" \ - -DG_LOG_DOMAIN=\"Evolution-Importer\" \ - -I$(top_srcdir) \ - -I$(top_builddir)/shell \ - -I$(top_srcdir)/shell \ - -I$(top_srcdir)/addressbook \ - -I$(top_builddir)/addressbook \ - $(EVOLUTION_ADDRESSBOOK_CFLAGS) - -# VCard Importer -libevolution_addressbook_vcard_importer_la_SOURCES = \ - evolution-vcard-importer.c - -libevolution_addressbook_vcard_importer_la_LDFLAGS = -avoid-version -module - -libevolution_addressbook_vcard_importer_la_LIBADD = \ - $(top_builddir)/shell/importer/libevolution-importer.la \ - $(top_builddir)/e-util/libeutil.la \ - $(IMPORTERS_LIBS) - -# LDIF Importer -libevolution_addressbook_ldif_importer_la_SOURCES = \ - evolution-ldif-importer.c - -libevolution_addressbook_ldif_importer_la_LDFLAGS = -avoid-version -module - -libevolution_addressbook_ldif_importer_la_LIBADD = \ - $(top_builddir)/shell/importer/libevolution-importer.la \ - $(top_builddir)/e-util/libeutil.la \ - $(IMPORTERS_LIBS) - -server_in_files = \ - GNOME_Evolution_Addressbook_LDIF_Importer.server.in.in \ - GNOME_Evolution_Addressbook_VCard_Importer.server.in.in -server_DATA = $(server_in_files:.server.in.in=_$(BASE_VERSION).server) -@EVO_SERVER_RULE@ -@INTLTOOL_SERVER_RULE@ - -BUILT_SOURCES = $(server_DATA) -CLEANFILES = $(BUILT_SOURCES) - -EXTRA_DIST = $(server_in_files) - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) diff --git a/addressbook/importers/evolution-ldif-importer.c b/addressbook/importers/evolution-ldif-importer.c deleted file mode 100644 index 080458dbf9..0000000000 --- a/addressbook/importers/evolution-ldif-importer.c +++ /dev/null @@ -1,655 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * LDIF importer. LDIF is the file format of an exported Netscape - * addressbook. - * - * Framework copied from evolution-gnomecard-importer.c - * - * Michael M. Morrison (mmorrison@kqcorp.com) - * - * Multi-line value support, mailing list support, base64 support, and - * various fixups: Chris Toshok (toshok@ximian.com) - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <ctype.h> -#include <string.h> - -#include <gtk/gtkwidget.h> -#include <gtk/gtkvbox.h> -#include <libgnome/gnome-init.h> -#include <bonobo/bonobo-shlib-factory.h> -#include <bonobo/bonobo-main.h> -#include <bonobo/bonobo-control.h> - -#include <libebook/e-book.h> -#include <libedataserverui/e-source-selector.h> - -#include <importer/evolution-importer.h> -#include <importer/GNOME_Evolution_Importer.h> -#include <util/e-destination.h> - -#define COMPONENT_FACTORY_IID "OAFIID:GNOME_Evolution_Addressbook_LDIF_ImporterFactory:" BASE_VERSION -#define COMPONENT_IID "OAFIID:GNOME_Evolution_Addressbook_LDIF_Importer:" BASE_VERSION - -static GHashTable *dn_contact_hash; - -typedef struct { - ESource *primary; - - GList *contactlist; - GList *iterator; - EBook *book; - gboolean ready; -} LDIFImporter; - -static struct { - char *ldif_attribute; - EContactField contact_field; -#define FLAG_ADDRESS 0x01 -#define FLAG_LIST 0x02 - int flags; -} -ldif_fields[] = { - { "cn", E_CONTACT_FULL_NAME }, - { "mail", E_CONTACT_EMAIL, FLAG_LIST }, -#if 0 - { "givenname", E_CONTACT_GIVEN_NAME }, -#endif - { "sn", E_CONTACT_FAMILY_NAME }, - { "xmozillanickname", E_CONTACT_NICKNAME }, - { "o", E_CONTACT_ORG }, - { "locality", 0, FLAG_ADDRESS}, - { "st", 0, FLAG_ADDRESS }, - { "streetaddress", 0, FLAG_ADDRESS }, - { "title", E_CONTACT_TITLE }, - { "postalcode", 0, FLAG_ADDRESS }, - { "countryname", 0, FLAG_ADDRESS }, - { "telephonenumber", E_CONTACT_PHONE_BUSINESS}, - { "homephone", E_CONTACT_PHONE_HOME }, - { "facsimiletelephonenumber", E_CONTACT_PHONE_BUSINESS_FAX }, - { "ou", E_CONTACT_ORG_UNIT }, - { "pagerphone", E_CONTACT_PHONE_PAGER }, - { "cellphone", E_CONTACT_PHONE_MOBILE }, - { "mobile", E_CONTACT_PHONE_MOBILE }, - { "homeurl", E_CONTACT_HOMEPAGE_URL }, - { "description", E_CONTACT_NOTE }, - { "xmozillausehtmlmail", E_CONTACT_WANTS_HTML } -}; -static int num_ldif_fields = sizeof(ldif_fields) / sizeof (ldif_fields[0]); - -static unsigned char base64_rank[256] = { - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255, 62,255,255,255, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,255,255,255, 0,255,255, - 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,255,255,255,255,255, - 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, -}; - -/** - * base64_decode_step: decode a chunk of base64 encoded data - * @in: input stream - * @len: max length of data to decode - * @out: output stream - * @state: holds the number of bits that are stored in @save - * @save: leftover bits that have not yet been decoded - * - * Decodes a chunk of base64 encoded data - **/ -static int -base64_decode_step(unsigned char *in, int len, unsigned char *out, int *state, unsigned int *save) -{ - register unsigned char *inptr, *outptr; - unsigned char *inend, c; - register unsigned int v; - int i; - - inend = in+len; - outptr = out; - - /* convert 4 base64 bytes to 3 normal bytes */ - v=*save; - i=*state; - inptr = in; - while (inptr<inend) { - c = base64_rank[*inptr++]; - if (c != 0xff) { - v = (v<<6) | c; - i++; - if (i==4) { - *outptr++ = v>>16; - *outptr++ = v>>8; - *outptr++ = v; - i=0; - } - } - } - - *save = v; - *state = i; - - /* quick scan back for '=' on the end somewhere */ - /* fortunately we can drop 1 output char for each trailing = (upto 2) */ - i=2; - while (inptr>in && i) { - inptr--; - if (base64_rank[*inptr] != 0xff) { - if (*inptr == '=') - outptr--; - i--; - } - } - - /* if i!= 0 then there is a truncation error! */ - return outptr-out; -} - -static int -base64_decode_simple (char *data, int len) -{ - int state = 0; - unsigned int save = 0; - - return base64_decode_step ((unsigned char *)data, len, - (unsigned char *)data, &state, &save); -} - -static GString * -getValue( char **src ) -{ - GString *dest = g_string_new(""); - char *s = *src; - gboolean need_base64 = (*s == ':'); - - copy_line: - while( *s != 0 && *s != '\n' && *s != '\r' ) - dest = g_string_append_c (dest, *s++); - - if (*s == '\r') s++; - if (*s == '\n') s++; - - /* check for continuation here */ - if (*s == ' ') { - s++; - goto copy_line; - } - - if (need_base64) { - int new_len; - /* it's base64 encoded */ - dest = g_string_erase (dest, 0, 2); - new_len = base64_decode_simple (dest->str, strlen (dest->str)); - dest = g_string_truncate (dest, new_len); - } - - *src = s; - - return dest; -} - -static gboolean -parseLine (EContact *contact, EContactAddress *address, char **buf) -{ - char *ptr; - char *colon, *value; - gboolean field_handled; - GString *ldif_value; - - ptr = *buf; - - /* if the string is empty, return */ - if (*ptr == '\0') { - *buf = NULL; - return TRUE; - } - - /* skip comment lines */ - if (*ptr == '#') { - ptr = strchr (ptr, '\n'); - if (!ptr) - *buf = NULL; - else - *buf = ptr + 1; - return TRUE; - } - - /* first, check for a 'continuation' line */ - if( ptr[0] == ' ' && ptr[1] != '\n' ) { - g_warning ("unexpected continuation line"); - return FALSE; - } - - colon = (char *)strchr( ptr, ':' ); - if (colon) { - int i; - - *colon = 0; - value = colon + 1; - while ( isspace(*value) ) - value++; - - ldif_value = getValue(&value ); - - field_handled = FALSE; - for (i = 0; i < num_ldif_fields; i ++) { - if (!g_ascii_strcasecmp (ptr, ldif_fields[i].ldif_attribute)) { - if (ldif_fields[i].flags & FLAG_ADDRESS) { - if (!g_ascii_strcasecmp (ptr, "locality")) - address->locality = g_strdup (ldif_value->str); - else if (!g_ascii_strcasecmp (ptr, "countryname")) - address->country = g_strdup (ldif_value->str); - else if (!g_ascii_strcasecmp (ptr, "postalcode")) - address->code = g_strdup (ldif_value->str); - else if (!g_ascii_strcasecmp (ptr, "st")) - address->region = g_strdup (ldif_value->str); - else if (!g_ascii_strcasecmp (ptr, "streetaddress")) - address->street = g_strdup (ldif_value->str); - } - else if (ldif_fields[i].flags & FLAG_LIST) { - GList *list; - - list = e_contact_get (contact, ldif_fields[i].contact_field); - list = g_list_append (list, g_strdup (ldif_value->str)); - e_contact_set (contact, ldif_fields[i].contact_field, list); - - g_list_foreach (list, (GFunc) g_free, NULL); - g_list_free (list); - } - else { - /* FIXME is everything a string? */ - e_contact_set (contact, ldif_fields[i].contact_field, ldif_value->str); - g_message ("set %s to %s", ptr, ldif_value->str); - } - field_handled = TRUE; - break; - } - } - - /* handle objectclass/dn/member out here */ - if (!field_handled) { - if (!g_ascii_strcasecmp (ptr, "dn")) - g_hash_table_insert (dn_contact_hash, g_strdup(ldif_value->str), contact); - else if (!g_ascii_strcasecmp (ptr, "objectclass") && !g_ascii_strcasecmp (ldif_value->str, "groupofnames")) { - e_contact_set (contact, E_CONTACT_IS_LIST, GINT_TO_POINTER (TRUE)); - } - else if (!g_ascii_strcasecmp (ptr, "member")) { - GList *email; - - email = e_contact_get (contact, E_CONTACT_EMAIL); - email = g_list_append (email, g_strdup (ldif_value->str)); - e_contact_set (contact, E_CONTACT_EMAIL, email); - - g_list_foreach (email, (GFunc) g_free, NULL); - g_list_free (email); - } - } - - /* put the colon back the way it was, just for kicks */ - *colon = ':'; - - g_string_free (ldif_value, TRUE); - } - else { - g_warning ("unrecognized entry %s", ptr); - return FALSE; - } - - *buf = value; - - return TRUE; -} - -static EContact * -getNextLDIFEntry( FILE *f ) -{ - EContact *contact; - EContactAddress *address; - GString *str; - char line[1024]; - char *buf; - - str = g_string_new (""); - /* read from the file until we get to a blank line (or eof) */ - while (!feof (f)) { - if (!fgets (line, sizeof(line), f)) - break; - if (line[0] == '\n' || (line[0] == '\r' && line[1] == '\n')) - break; - str = g_string_append (str, line); - } - - if (strlen (str->str) == 0) { - g_string_free (str, TRUE); - return NULL; - } - - /* now parse that entry */ - contact = e_contact_new (); - address = g_new0 (EContactAddress, 1); - - buf = str->str; - while (buf) { - if (!parseLine (contact, address, &buf)) { - /* parsing error */ - g_object_unref (contact); - return NULL; - } - } - - /* fill in the address */ - if (address->locality || address->country || - address->code || address->region || address->street) - e_contact_set (contact, E_CONTACT_ADDRESS_HOME, address); - - g_string_free (str, TRUE); - - return contact; -} - -static void -resolve_list_card (LDIFImporter *gci, EContact *contact) -{ - GList *email, *l; - GList *email_attrs = NULL; - char *full_name; - - /* set file_as to full_name so we don't later try and figure - out a first/last name for the list. */ - full_name = e_contact_get (contact, E_CONTACT_FULL_NAME); - if (full_name) - e_contact_set (contact, E_CONTACT_FILE_AS, full_name); - g_free (full_name); - - /* FIMXE getting might not be implemented in ebook */ - email = e_contact_get (contact, E_CONTACT_EMAIL); - for (l = email; l; l = l->next) { - /* mozilla stuffs dn's in the EMAIL list for contact lists */ - char *dn = l->data; - EContact *dn_contact = g_hash_table_lookup (dn_contact_hash, dn); - - /* break list chains here, since we don't support them just yet */ - if (dn_contact && !e_contact_get (dn_contact, E_CONTACT_IS_LIST)) { - EDestination *dest; - EVCardAttribute *attr = e_vcard_attribute_new (NULL, EVC_EMAIL); - - /* Hard-wired for default e-mail, since netscape only exports 1 email address */ - dest = e_destination_new (); - e_destination_set_contact (dest, dn_contact, 0); - - e_destination_export_to_vcard_attribute (dest, attr); - - g_object_unref (dest); - - email_attrs = g_list_append (email_attrs, attr); - } - } - e_contact_set_attributes (contact, E_CONTACT_EMAIL, email_attrs); - - g_list_foreach (email, (GFunc) g_free, NULL); - g_list_free (email); - g_list_foreach (email_attrs, (GFunc) e_vcard_attribute_free, NULL); - g_list_free (email_attrs); -} - -static GList * -create_contacts_from_ldif (const char *filename) -{ - GList * list = NULL; - GList * list_list = NULL; - FILE * file; - EContact *contact; - - if(!( file = fopen( filename, "r" ) )) { - g_warning("Can't open .ldif file"); - return NULL; - } - - dn_contact_hash = g_hash_table_new (g_str_hash, g_str_equal); - - while ((contact = getNextLDIFEntry (file))) { - - if (e_contact_get (contact, E_CONTACT_IS_LIST)) - list_list = g_list_append (list_list, contact); - else - list = g_list_append (list, contact); - } - - fclose (file); - - list = g_list_reverse (list); - list_list = g_list_reverse (list_list); - list = g_list_concat (list, list_list); - - return list; -} - -static void -add_to_notes (EContact *contact, EContactField field) -{ - const gchar *old_text; - const gchar *field_text; - gchar *new_text; - - old_text = e_contact_get_const (contact, E_CONTACT_NOTE); - if (old_text && strstr (old_text, e_contact_pretty_name (field))) - return; - - field_text = e_contact_get_const (contact, field); - if (!field_text || !*field_text) - return; - - new_text = g_strdup_printf ("%s%s%s: %s", - old_text ? old_text : "", - old_text && *old_text && - *(old_text + strlen (old_text) - 1) != '\n' ? "\n" : "", - e_contact_pretty_name (field), field_text); - e_contact_set (contact, E_CONTACT_NOTE, new_text); - g_free (new_text); -} - -/* EvolutionImporter methods */ -static void -process_item_fn (EvolutionImporter *importer, - CORBA_Object listener, - void *closure, - CORBA_Environment *ev) -{ - LDIFImporter *gci = (LDIFImporter *) closure; - EContact *contact; - - if (gci->iterator == NULL) - gci->iterator = gci->contactlist; - - if (gci->ready == FALSE) { - GNOME_Evolution_ImporterListener_notifyResult (listener, - GNOME_Evolution_ImporterListener_NOT_READY, - gci->iterator ? TRUE : FALSE, - ev); - return; - } - - if (gci->iterator == NULL) { - GNOME_Evolution_ImporterListener_notifyResult (listener, - GNOME_Evolution_ImporterListener_UNSUPPORTED_OPERATION, - FALSE, ev); - return; - } - - contact = gci->iterator->data; - if (e_contact_get (contact, E_CONTACT_IS_LIST)) - resolve_list_card (gci, contact); - else { - /* Work around the fact that these fields no longer show up in the UI */ - add_to_notes (contact, E_CONTACT_OFFICE); - add_to_notes (contact, E_CONTACT_SPOUSE); - add_to_notes (contact, E_CONTACT_BLOG_URL); - } - - /* FIXME Error checking */ - e_book_add_contact (gci->book, contact, NULL); - - gci->iterator = gci->iterator->next; - - GNOME_Evolution_ImporterListener_notifyResult (listener, - GNOME_Evolution_ImporterListener_OK, - gci->iterator ? TRUE : FALSE, - ev); - if (ev->_major != CORBA_NO_EXCEPTION) { - g_warning ("Error notifying listeners."); - } - - return; -} - -static void -primary_selection_changed_cb (ESourceSelector *selector, gpointer data) -{ - LDIFImporter *gci = data; - - if (gci->primary) - g_object_unref (gci->primary); - gci->primary = g_object_ref (e_source_selector_peek_primary_selection (selector)); -} - -static void -create_control_fn (EvolutionImporter *importer, Bonobo_Control *control, void *closure) -{ - LDIFImporter *gci = closure; - GtkWidget *vbox, *selector; - ESource *primary; - ESourceList *source_list; - - vbox = gtk_vbox_new (FALSE, FALSE); - - /* FIXME Better error handling */ - if (!e_book_get_addressbooks (&source_list, NULL)) - return; - - selector = e_source_selector_new (source_list); - e_source_selector_show_selection (E_SOURCE_SELECTOR (selector), FALSE); - gtk_box_pack_start (GTK_BOX (vbox), selector, FALSE, TRUE, 6); - - /* FIXME What if no sources? */ - primary = e_source_list_peek_source_any (source_list); - e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (selector), primary); - if (!gci->primary) - gci->primary = g_object_ref (primary); - g_object_unref (source_list); - - g_signal_connect (G_OBJECT (selector), "primary_selection_changed", - G_CALLBACK (primary_selection_changed_cb), gci); - - gtk_widget_show_all (vbox); - - *control = BONOBO_OBJREF (bonobo_control_new (vbox)); -} - -static char *supported_extensions[2] = { - ".ldif", NULL -}; - -static gboolean -support_format_fn (EvolutionImporter *importer, - const char *filename, - void *closure) -{ - char *ext; - int i; - - ext = strrchr (filename, '.'); - if (ext == NULL) { - return FALSE; - } - - for (i = 0; supported_extensions[i] != NULL; i++) { - if (strcmp (supported_extensions[i], ext) == 0) - return TRUE; - } - - return FALSE; -} - -static void -importer_destroy_cb (gpointer data, - GObject *where_object_was) -{ - LDIFImporter *gci = data; - - if (gci->primary) - g_object_unref (gci->primary); - - if (gci->book) - g_object_unref (gci->book); - - g_list_foreach (gci->contactlist, (GFunc) g_object_unref, NULL); - g_list_free (gci->contactlist); - - g_free (gci); -} - -static gboolean -load_file_fn (EvolutionImporter *importer, - const char *filename, - void *closure) -{ - LDIFImporter *gci; - - gci = (LDIFImporter *) closure; - gci->contactlist = NULL; - gci->iterator = NULL; - gci->ready = FALSE; - - /* Load the book and the cards */ - gci->book = e_book_new (gci->primary, NULL); - if (!gci->book) { - g_message (G_STRLOC ":Couldn't create EBook."); - return FALSE; - } - e_book_open (gci->book, TRUE, NULL); - gci->contactlist = create_contacts_from_ldif (filename); - gci->ready = TRUE; - - return TRUE; -} - -static BonoboObject * -factory_fn (BonoboGenericFactory *_factory, - const char *component_id, - void *closure) -{ - EvolutionImporter *importer; - LDIFImporter *gci; - - if (!strcmp (component_id, COMPONENT_IID)) { - gci = g_new0 (LDIFImporter, 1); - importer = evolution_importer_new (create_control_fn, support_format_fn, - load_file_fn, process_item_fn, NULL, gci); - - g_object_weak_ref (G_OBJECT (importer), - importer_destroy_cb, gci); - - return BONOBO_OBJECT (importer); - } - else { - g_warning (COMPONENT_FACTORY_IID ": Don't know what to do with %s", component_id); - return NULL; - } -} - -BONOBO_ACTIVATION_SHLIB_FACTORY (COMPONENT_FACTORY_IID, "Evolution LDIF importer Factory", factory_fn, NULL) diff --git a/addressbook/importers/evolution-vcard-importer.c b/addressbook/importers/evolution-vcard-importer.c deleted file mode 100644 index 2f4c293aab..0000000000 --- a/addressbook/importers/evolution-vcard-importer.c +++ /dev/null @@ -1,443 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* Evolution calendar importer component - * - * Copyright (C) 2004 Novell, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Authors: Chris Toshok <toshok@ximian.com> - * JP Rosevear <jpr@ximian.com> - * - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdio.h> -#include <string.h> - -#include <gtk/gtkcheckbutton.h> -#include <gtk/gtkhbox.h> -#include <gtk/gtkvbox.h> -#include <gtk/gtkmain.h> -#include <gtk/gtklabel.h> -#include <gtk/gtkradiobutton.h> -#include <gtk/gtknotebook.h> -#include <bonobo/bonobo-context.h> -#include <bonobo/bonobo-shlib-factory.h> -#include <bonobo/bonobo-control.h> - -#include <libebook/e-book.h> -#include <libedataserverui/e-source-selector.h> - -#include <importer/evolution-importer.h> -#include <importer/GNOME_Evolution_Importer.h> -#include <util/eab-book-util.h> -#include <util/e-destination.h> - -#define COMPONENT_FACTORY_IID "OAFIID:GNOME_Evolution_Addressbook_VCard_ImporterFactory:" BASE_VERSION -#define COMPONENT_IID "OAFIID:GNOME_Evolution_Addressbook_VCard_Importer:" BASE_VERSION - -typedef struct { - ESource *primary; - - GList *contactlist; - GList *iterator; - EBook *book; - gboolean ready; -} VCardImporter; - -static void -add_to_notes (EContact *contact, EContactField field) -{ - const gchar *old_text; - const gchar *field_text; - gchar *new_text; - - old_text = e_contact_get_const (contact, E_CONTACT_NOTE); - if (old_text && strstr (old_text, e_contact_pretty_name (field))) - return; - - field_text = e_contact_get_const (contact, field); - if (!field_text || !*field_text) - return; - - new_text = g_strdup_printf ("%s%s%s: %s", - old_text ? old_text : "", - old_text && *old_text && - *(old_text + strlen (old_text) - 1) != '\n' ? "\n" : "", - e_contact_pretty_name (field), field_text); - e_contact_set (contact, E_CONTACT_NOTE, new_text); - g_free (new_text); -} - -/* EvolutionImporter methods */ -static void -process_item_fn (EvolutionImporter *importer, - CORBA_Object listener, - void *closure, - CORBA_Environment *ev) -{ - VCardImporter *gci = (VCardImporter *) closure; - EContact *contact; - EContactPhoto *photo; - GList *attrs, *attr; - - if (gci->iterator == NULL) - gci->iterator = gci->contactlist; - - if (gci->ready == FALSE) { - GNOME_Evolution_ImporterListener_notifyResult (listener, - GNOME_Evolution_ImporterListener_NOT_READY, - gci->iterator ? TRUE : FALSE, - ev); - return; - } - - if (gci->iterator == NULL) { - GNOME_Evolution_ImporterListener_notifyResult (listener, - GNOME_Evolution_ImporterListener_UNSUPPORTED_OPERATION, - FALSE, ev); - return; - } - - contact = gci->iterator->data; - - /* Apple's addressbook.app exports PHOTO's without a TYPE - param, so let's figure out the format here if there's a - PHOTO attribute missing a TYPE param. - - this is sort of a hack, as EContact sets the type for us if - we use the setter. so let's e_contact_get + e_contact_set - on E_CONTACT_PHOTO. - */ - photo = e_contact_get (contact, E_CONTACT_PHOTO); - if (photo) { - e_contact_set (contact, E_CONTACT_PHOTO, photo); - e_contact_photo_free (photo); - } - - /* Deal with our XML EDestination stuff in EMAIL attributes, if there is any. */ - attrs = e_contact_get_attributes (contact, E_CONTACT_EMAIL); - for (attr = attrs; attr; attr = attr->next) { - EVCardAttribute *a = attr->data; - GList *v = e_vcard_attribute_get_values (a); - - if (v && v->data) { - if (!strncmp ((char*)v->data, "<?xml", 5)) { - EDestination *dest = e_destination_import ((char*)v->data); - - e_destination_export_to_vcard_attribute (dest, a); - - g_object_unref (dest); - - } - } - } - e_contact_set_attributes (contact, E_CONTACT_EMAIL, attrs); - - /* - Deal with TEL attributes that don't conform to what we need. - - 1. if there's no location (HOME/WORK/OTHER), default to OTHER. - 2. if there's *only* a location specified, default to VOICE. - */ - attrs = e_vcard_get_attributes (E_VCARD (contact)); - for (attr = attrs; attr; attr = attr->next) { - EVCardAttribute *a = attr->data; - gboolean location_only = TRUE; - gboolean no_location = TRUE; - GList *params, *param; - - if (g_ascii_strcasecmp (e_vcard_attribute_get_name (a), - EVC_TEL)) - continue; - - params = e_vcard_attribute_get_params (a); - for (param = params; param; param = param->next) { - EVCardAttributeParam *p = param->data; - GList *vs, *v; - - if (g_ascii_strcasecmp (e_vcard_attribute_param_get_name (p), - EVC_TYPE)) - continue; - - vs = e_vcard_attribute_param_get_values (p); - for (v = vs; v; v = v->next) { - if (!g_ascii_strcasecmp ((char*)v->data, "WORK") || - !g_ascii_strcasecmp ((char*)v->data, "HOME") || - !g_ascii_strcasecmp ((char*)v->data, "OTHER")) - no_location = FALSE; - else - location_only = FALSE; - } - } - - if (location_only) { - /* add VOICE */ - e_vcard_attribute_add_param_with_value (a, - e_vcard_attribute_param_new (EVC_TYPE), - "VOICE"); - } - if (no_location) { - /* add OTHER */ - e_vcard_attribute_add_param_with_value (a, - e_vcard_attribute_param_new (EVC_TYPE), - "OTHER"); - } - } - - /* - Deal with ADR attributes that don't conform to what we need. - - if HOME or WORK isn't specified, add TYPE=OTHER. - */ - attrs = e_vcard_get_attributes (E_VCARD (contact)); - for (attr = attrs; attr; attr = attr->next) { - EVCardAttribute *a = attr->data; - gboolean no_location = TRUE; - GList *params, *param; - - if (g_ascii_strcasecmp (e_vcard_attribute_get_name (a), - EVC_ADR)) - continue; - - params = e_vcard_attribute_get_params (a); - for (param = params; param; param = param->next) { - EVCardAttributeParam *p = param->data; - GList *vs, *v; - - if (g_ascii_strcasecmp (e_vcard_attribute_param_get_name (p), - EVC_TYPE)) - continue; - - vs = e_vcard_attribute_param_get_values (p); - for (v = vs; v; v = v->next) { - if (!g_ascii_strcasecmp ((char*)v->data, "WORK") || - !g_ascii_strcasecmp ((char*)v->data, "HOME")) - no_location = FALSE; - } - } - - if (no_location) { - /* add OTHER */ - e_vcard_attribute_add_param_with_value (a, - e_vcard_attribute_param_new (EVC_TYPE), - "OTHER"); - } - } - - /* Work around the fact that these fields no longer show up in the UI */ - add_to_notes (contact, E_CONTACT_OFFICE); - add_to_notes (contact, E_CONTACT_SPOUSE); - add_to_notes (contact, E_CONTACT_BLOG_URL); - - /* FIXME Error checking */ - e_book_add_contact (gci->book, contact, NULL); - - gci->iterator = gci->iterator->next; - - GNOME_Evolution_ImporterListener_notifyResult (listener, - GNOME_Evolution_ImporterListener_OK, - gci->iterator ? TRUE : FALSE, - ev); - if (ev->_major != CORBA_NO_EXCEPTION) { - g_warning ("Error notifying listeners."); - } - - return; -} - -static char *supported_extensions[3] = { - ".vcf", - ".gcrd", - NULL -}; - -/* Actually check the contents of this file */ -static gboolean -check_file_is_vcard (const char *filename) -{ - FILE *handle; - char line[4096]; - gboolean result; - - handle = fopen (filename, "r"); - if (handle == NULL) { - g_print ("\n"); - return FALSE; - } - - fgets (line, 4096, handle); - if (line == NULL) { - fclose (handle); - g_print ("\n"); - return FALSE; - } - - if (g_ascii_strncasecmp (line, "BEGIN:VCARD", 11) == 0) { - result = TRUE; - } else { - result = FALSE; - } - - fclose (handle); - return result; -} - -static void -primary_selection_changed_cb (ESourceSelector *selector, gpointer data) -{ - VCardImporter *gci = data; - - if (gci->primary) - g_object_unref (gci->primary); - gci->primary = g_object_ref (e_source_selector_peek_primary_selection (selector)); -} - -static void -create_control_fn (EvolutionImporter *importer, Bonobo_Control *control, void *closure) -{ - VCardImporter *gci = closure; - GtkWidget *vbox, *selector; - ESource *primary; - ESourceList *source_list; - - vbox = gtk_vbox_new (FALSE, FALSE); - - /* FIXME Better error handling */ - if (!e_book_get_addressbooks (&source_list, NULL)) - return; - - selector = e_source_selector_new (source_list); - e_source_selector_show_selection (E_SOURCE_SELECTOR (selector), FALSE); - gtk_box_pack_start (GTK_BOX (vbox), selector, FALSE, TRUE, 6); - - /* FIXME What if no sources? */ - primary = e_source_list_peek_source_any (source_list); - e_source_selector_set_primary_selection (E_SOURCE_SELECTOR (selector), primary); - if (!gci->primary) - gci->primary = g_object_ref (primary); - g_object_unref (source_list); - - g_signal_connect (G_OBJECT (selector), "primary_selection_changed", - G_CALLBACK (primary_selection_changed_cb), gci); - - gtk_widget_show_all (vbox); - - *control = BONOBO_OBJREF (bonobo_control_new (vbox)); -} - -static gboolean -support_format_fn (EvolutionImporter *importer, - const char *filename, - void *closure) -{ - char *ext; - int i; - - ext = strrchr (filename, '.'); - if (ext == NULL) { - return check_file_is_vcard (filename); - } - for (i = 0; supported_extensions[i] != NULL; i++) { - if (g_ascii_strcasecmp (supported_extensions[i], ext) == 0) - return check_file_is_vcard (filename); - } - - return FALSE; -} - -static void -importer_destroy_cb (gpointer data, - GObject *where_object_was) -{ - VCardImporter *gci = data; - - if (gci->primary) - g_object_unref (gci->primary); - - if (gci->book) - g_object_unref (gci->book); - - g_list_foreach (gci->contactlist, (GFunc) g_object_unref, NULL); - g_list_free (gci->contactlist); - - g_free (gci); -} - -static gboolean -load_file_fn (EvolutionImporter *importer, - const char *filename, - void *closure) -{ - VCardImporter *gci; - char *contents; - - if (check_file_is_vcard (filename) == FALSE) { - return FALSE; - } - - gci = (VCardImporter *) closure; - gci->contactlist = NULL; - gci->iterator = NULL; - gci->ready = FALSE; - - /* Load the book */ - gci->book = e_book_new (gci->primary, NULL); - if (!gci->book) { - g_message (G_STRLOC ":Couldn't create EBook."); - return FALSE; - } - e_book_open (gci->book, TRUE, NULL); - - /* Load the file and the contacts */ - if (!g_file_get_contents (filename, &contents, NULL, NULL)) { - g_message (G_STRLOC ":Couldn't read file."); - return FALSE; - } - gci->contactlist = eab_contact_list_from_string (contents); - g_free (contents); - - gci->ready = TRUE; - - return TRUE; -} - -static BonoboObject * -factory_fn (BonoboGenericFactory *_factory, - const char *component_id, - void *closure) -{ - EvolutionImporter *importer; - VCardImporter *gci; - - if (!strcmp (component_id, COMPONENT_IID)) { - gci = g_new0 (VCardImporter, 1); - importer = evolution_importer_new (create_control_fn, support_format_fn, - load_file_fn, process_item_fn, NULL, gci); - - g_object_weak_ref (G_OBJECT (importer), - importer_destroy_cb, gci); - return BONOBO_OBJECT (importer); - } - else { - g_warning (COMPONENT_FACTORY_IID ": Don't know what to do with %s", component_id); - return NULL; - } -} - -BONOBO_ACTIVATION_SHLIB_FACTORY (COMPONENT_FACTORY_IID, "Evolution VCard Importer Factory", factory_fn, NULL) diff --git a/addressbook/printing/.cvsignore b/addressbook/printing/.cvsignore deleted file mode 100644 index 96194f7fd7..0000000000 --- a/addressbook/printing/.cvsignore +++ /dev/null @@ -1,9 +0,0 @@ -.deps -.libs -.pure -Makefile -Makefile.in -*.lo -*.la -contact-print-test -contact-print-style-editor-test diff --git a/addressbook/printing/Makefile.am b/addressbook/printing/Makefile.am deleted file mode 100644 index 8da93df0b8..0000000000 --- a/addressbook/printing/Makefile.am +++ /dev/null @@ -1,57 +0,0 @@ -ecpsdir = $(privdatadir)/ecps -ecps_DATA = \ - smallbook.ecps \ - medbook.ecps \ - phonelist.ecps - -glade_DATA = \ - e-contact-print.glade - -INCLUDES = \ - $(GNOME_INCLUDEDIR) \ - -DG_LOG_DOMAIN=\"addressbook-printing\" \ - -I$(top_srcdir)/addressbook \ - -I$(top_srcdir)/addressbook/backend \ - -I$(top_builddir)/addressbook/backend \ - -I$(top_srcdir) \ - -DEVOLUTION_GLADEDIR=\""$(gladedir)"\" \ - -DEVOLUTION_ECPSDIR=\""$(ecpsdir)"\" \ - $(EVOLUTION_ADDRESSBOOK_CFLAGS) - -noinst_LTLIBRARIES = \ - libecontactprint.la - -libecontactprint_la_SOURCES = \ - e-contact-print-envelope.c \ - e-contact-print-envelope.h \ - e-contact-print-style-editor.c \ - e-contact-print-style-editor.h \ - e-contact-print-types.h \ - e-contact-print.c \ - e-contact-print.h - -noinst_PROGRAMS = \ - contact-print-test \ - contact-print-style-editor-test - -contact_print_test_SOURCES = \ - test-print.c - -contact_print_test_LDADD = \ - libecontactprint.la \ - $(top_builddir)/addressbook/util/libeabutil.la \ - $(EVOLUTION_ADDRESSBOOK_LIBS) - -contact_print_style_editor_test_SOURCES = \ - test-contact-print-style-editor.c - -contact_print_style_editor_test_LDADD = \ - libecontactprint.la \ - $(top_builddir)/addressbook/util/libeabutil.la \ - $(EVOLUTION_ADDRESSBOOK_LIBS) - - - -EXTRA_DIST = \ - $(glade_DATA) \ - $(ecps_DATA) diff --git a/addressbook/printing/e-contact-print-envelope.c b/addressbook/printing/e-contact-print-envelope.c deleted file mode 100644 index c7bd68163f..0000000000 --- a/addressbook/printing/e-contact-print-envelope.c +++ /dev/null @@ -1,242 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-contact-print-envelope.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> -#include "addressbook/printing/e-contact-print-envelope.h" -#include <glib.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-dialog.h> -#include <time.h> -#include <libgnomeprintui/gnome-print-dialog.h> -#include <libgnomeprint/gnome-print.h> -#include <libgnomeprint/gnome-print-job.h> -#include <libgnomeprintui/gnome-print-job-preview.h> - -#define ENVELOPE_HEIGHT (72.0 * 4.0) -#define ENVELOPE_WIDTH (72.0 * 9.5) - -typedef struct { - int start; - int length; -} EcpeLine; - -static void -startset(void *pointer, EcpeLine **iterator) -{ - (*iterator)--; - (*iterator)->start = GPOINTER_TO_INT(pointer); -} - -static void -lengthset(void *pointer, EcpeLine **iterator) -{ - (*iterator)--; - (*iterator)->length = GPOINTER_TO_INT(pointer); -} - -static EcpeLine * -ecpe_break(char *address) -{ - int i; - int length = 0; - int laststart = 0; - GList *startlist = NULL; - GList *lengthlist = NULL; - EcpeLine *ret_val; - EcpeLine *iterator; - - for (i = 0; address[i]; i++) { - if (address[i] == '\n') { - startlist = g_list_prepend (startlist, GINT_TO_POINTER(laststart)); - lengthlist = g_list_prepend (lengthlist, GINT_TO_POINTER(i - laststart)); - length ++; - laststart = i + 1; - } - } - startlist = g_list_prepend (startlist, GINT_TO_POINTER(laststart)); - lengthlist = g_list_prepend (lengthlist, GINT_TO_POINTER(i - laststart)); - length ++; - - ret_val = g_new(EcpeLine, length + 1); - - iterator = ret_val + length; - g_list_foreach(startlist, (GFunc) startset, &iterator); - g_list_free(startlist); - - iterator = ret_val + length; - g_list_foreach(lengthlist, (GFunc) lengthset, &iterator); - g_list_free(lengthlist); - - ret_val[length].start = -1; - ret_val[length].length = -1; - - return ret_val; -} - -static void -ecpe_linelist_dimensions(GnomeFont *font, char *address, EcpeLine *linelist, double *widthp, double *heightp) -{ - double width = 0; - int i; - if (widthp) { - for (i = 0; linelist[i].length != -1; i++) { - width = MAX(width, gnome_font_get_width_utf8_sized (font, address + linelist[i].start, linelist[i].length)); - } - *widthp = width; - } else { - for (i = 0; linelist[i].length != -1; i++) - /* Intentionally empty */; - } - if (heightp) { - *heightp = gnome_font_get_size(font) * i; - } -} - -static void -ecpe_linelist_print(GnomePrintContext *pc, GnomeFont *font, char *address, EcpeLine *linelist, double x, double y) -{ - int i; - gnome_print_setfont(pc, font); - for (i = 0; linelist[i].length != -1; i++) { - gnome_print_moveto(pc, x, y + gnome_font_get_ascender(font)); - gnome_print_show_sized (pc, address + linelist[i].start, linelist[i].length); - y -= gnome_font_get_size(font); - } -} - -static gint -e_contact_print_envelope_close(GnomeDialog *dialog, gpointer data) -{ - return FALSE; -} - -static void -ecpe_print(GnomePrintContext *pc, EContact *contact, gboolean as_return) -{ - char *address; - EcpeLine *linelist; - double x; - double y; - GnomeFont *font; - - - gnome_print_rotate(pc, 90); - gnome_print_translate(pc, 72.0 * 11.0 - ENVELOPE_WIDTH, -72.0 * 8.5 + (72.0 * 8.5 - ENVELOPE_HEIGHT) / 2); - - address = e_contact_get(contact, E_CONTACT_ADDRESS_LABEL_WORK); - linelist = ecpe_break(address); - if (as_return) - font = gnome_font_find ("Sans", 9); - else - font = gnome_font_find ("Sans", 12); - ecpe_linelist_dimensions(font, address, linelist, NULL, &y); - if (as_return) { - x = 36; - y = ENVELOPE_HEIGHT - 36; - } else { - x = ENVELOPE_WIDTH / 2; - y = (ENVELOPE_HEIGHT - y) / 2; - } - ecpe_linelist_print(pc, font, address, linelist, x, y); - g_object_unref(font); - g_free(linelist); - - g_free(address); - - gnome_print_showpage(pc); - gnome_print_context_close(pc); -} - -static void -e_contact_print_envelope_button(GnomeDialog *dialog, gint button, gpointer data) -{ - GnomePrintJob *master; - GnomePrintContext *pc; - GnomePrintConfig *config; - EContact *contact = NULL; - GtkWidget *preview; - - contact = g_object_get_data(G_OBJECT(dialog), "contact"); - - switch( button ) { - case GNOME_PRINT_DIALOG_RESPONSE_PRINT: - config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG (dialog)); - master = gnome_print_job_new (config); - pc = gnome_print_job_get_context( master ); - - ecpe_print(pc, contact, FALSE); - - gnome_print_job_print(master); - gnome_dialog_close(dialog); - break; - case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW: - config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG (dialog)); - master = gnome_print_job_new (config); - pc = gnome_print_job_get_context( master ); - - ecpe_print(pc, contact, FALSE); - - preview = GTK_WIDGET(gnome_print_job_preview_new(master, "Print Preview")); - gtk_widget_show_all(preview); - break; - case GNOME_PRINT_DIALOG_RESPONSE_CANCEL: - g_object_unref(contact); - gnome_dialog_close(dialog); - break; - } -} - -GtkWidget * -e_contact_print_envelope_dialog_new(EContact *contact) -{ - GtkWidget *dialog; - - dialog = gnome_print_dialog_new(NULL, _("Print envelope"), GNOME_PRINT_DIALOG_COPIES); - - contact = e_contact_duplicate(contact); - g_object_set_data(G_OBJECT(dialog), "contact", contact); - g_signal_connect(dialog, - "clicked", G_CALLBACK(e_contact_print_envelope_button), NULL); - g_signal_connect(dialog, - "close", G_CALLBACK(e_contact_print_envelope_close), NULL); - return dialog; -} - -/* FIXME: Print all the contacts selected. */ -GtkWidget * -e_contact_print_envelope_list_dialog_new(GList *list) -{ - GtkWidget *dialog; - EContact *contact; - - if (list == NULL) - return NULL; - - dialog = gnome_print_dialog_new(NULL, _("Print envelope"), GNOME_PRINT_DIALOG_COPIES); - - contact = e_contact_duplicate(list->data); - g_object_set_data(G_OBJECT(dialog), "contact", contact); - g_signal_connect(dialog, - "clicked", G_CALLBACK(e_contact_print_envelope_button), NULL); - g_signal_connect(dialog, - "close", G_CALLBACK(e_contact_print_envelope_close), NULL); - return dialog; -} diff --git a/addressbook/printing/e-contact-print-envelope.h b/addressbook/printing/e-contact-print-envelope.h deleted file mode 100644 index a7a8492638..0000000000 --- a/addressbook/printing/e-contact-print-envelope.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-contact-print-envelope.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef E_CONTACT_PRINT_ENVELOPE_H -#define E_CONTACT_PRINT_ENVELOPE_H - -#include <gtk/gtkwidget.h> -#include <libebook/e-contact.h> -#include "e-contact-print-types.h" - -GtkWidget *e_contact_print_envelope_dialog_new(EContact *contact); -GtkWidget *e_contact_print_envelope_list_dialog_new(GList *list); - -#endif /* E_CONTACT_PRINT_ENVELOPE_H */ diff --git a/addressbook/printing/e-contact-print-style-editor.c b/addressbook/printing/e-contact-print-style-editor.c deleted file mode 100644 index 436aaddff0..0000000000 --- a/addressbook/printing/e-contact-print-style-editor.c +++ /dev/null @@ -1,155 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-contact-print-style-editor.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "e-contact-print-style-editor.h" - -static void e_contact_print_style_editor_init (EContactPrintStyleEditor *card); -static void e_contact_print_style_editor_class_init (EContactPrintStyleEditorClass *klass); -static void e_contact_print_style_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id); -static void e_contact_print_style_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id); -static void e_contact_print_style_editor_destroy (GtkObject *object); - -static GtkVBoxClass *parent_class = NULL; - - -/* The arguments we take */ -enum { - ARG_0, - ARG_CARD -}; - -GtkType -e_contact_print_style_editor_get_type (void) -{ - static GtkType contact_print_style_editor_type = 0; - - if (!contact_print_style_editor_type) - { - static const GtkTypeInfo contact_print_style_editor_info = - { - "EContactPrintStyleEditor", - sizeof (EContactPrintStyleEditor), - sizeof (EContactPrintStyleEditorClass), - (GtkClassInitFunc) e_contact_print_style_editor_class_init, - (GtkObjectInitFunc) e_contact_print_style_editor_init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - contact_print_style_editor_type = gtk_type_unique (gtk_vbox_get_type (), &contact_print_style_editor_info); - } - - return contact_print_style_editor_type; -} - -static void -e_contact_print_style_editor_class_init (EContactPrintStyleEditorClass *klass) -{ - GtkObjectClass *object_class; - GtkVBoxClass *vbox_class; - - object_class = (GtkObjectClass*) klass; - vbox_class = (GtkVBoxClass *) klass; - - parent_class = gtk_type_class (gtk_vbox_get_type ()); - - object_class->set_arg = e_contact_print_style_editor_set_arg; - object_class->get_arg = e_contact_print_style_editor_get_arg; - object_class->destroy = e_contact_print_style_editor_destroy; -} - -#if 0 -static void -_add_image(GtkTable *table, gchar *image, int left, int right, int top, int bottom) -{ - gtk_table_attach(table, - gtk_widget_new(gtk_alignment_get_type(), - "child", gnome_pixmap_new_from_file(image), - "xalign", (double) 0, - "yalign", (double) 0, - "xscale", (double) 0, - "yscale", (double) 0, - NULL), - left, right, top, bottom, - GTK_FILL, GTK_FILL, - 0, 0); -} -#endif - -static void -e_contact_print_style_editor_init (EContactPrintStyleEditor *e_contact_print_style_editor) -{ - GladeXML *gui; - - /* e_contact_print_style_editor->card = NULL;*/ - gui = glade_xml_new (EVOLUTION_GLADEDIR "/e-contact-print.glade", NULL, NULL); - e_contact_print_style_editor->gui = gui; - gtk_widget_reparent(glade_xml_get_widget(gui, "vbox-contact-print-style-editor"), - GTK_WIDGET(e_contact_print_style_editor)); -} - -void -e_contact_print_style_editor_destroy (GtkObject *object) -{ - EContactPrintStyleEditor *e_contact_print_style_editor = E_CONTACT_PRINT_STYLE_EDITOR(object); - - if (e_contact_print_style_editor->gui != NULL) { - g_object_unref(e_contact_print_style_editor->gui); - e_contact_print_style_editor->gui = NULL; - } - - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - -GtkWidget* -e_contact_print_style_editor_new (char *filename) -{ - GtkWidget *widget = GTK_WIDGET (gtk_type_new (e_contact_print_style_editor_get_type ())); - return widget; -} - -static void -e_contact_print_style_editor_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) -{ - EContactPrintStyleEditor *e_contact_print_style_editor; - - e_contact_print_style_editor = E_CONTACT_PRINT_STYLE_EDITOR (o); - - switch (arg_id){ - default: - break; - } -} - -static void -e_contact_print_style_editor_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) -{ - EContactPrintStyleEditor *e_contact_print_style_editor; - - e_contact_print_style_editor = E_CONTACT_PRINT_STYLE_EDITOR (object); - - switch (arg_id) { - default: - arg->type = GTK_TYPE_INVALID; - break; - } -} diff --git a/addressbook/printing/e-contact-print-style-editor.h b/addressbook/printing/e-contact-print-style-editor.h deleted file mode 100644 index e4604d551c..0000000000 --- a/addressbook/printing/e-contact-print-style-editor.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* e-contact-print-style-editor.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __E_CONTACT_PRINT_STYLE_EDITOR_H__ -#define __E_CONTACT_PRINT_STYLE_EDITOR_H__ - -#include <gtk/gtkvbox.h> -#include <glade/glade.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -/* EContactPrintStyleEditor - A dialog displaying information about a contact. - * - * The following arguments are available: - * - * name type read/write description - * -------------------------------------------------------------------------------- - * card ECard * R The card currently being edited - */ - -#define E_CONTACT_PRINT_STYLE_EDITOR_TYPE (e_contact_print_style_editor_get_type ()) -#define E_CONTACT_PRINT_STYLE_EDITOR(obj) (GTK_CHECK_CAST ((obj), E_CONTACT_PRINT_STYLE_EDITOR_TYPE, EContactPrintStyleEditor)) -#define E_CONTACT_PRINT_STYLE_EDITOR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_CONTACT_PRINT_STYLE_EDITOR_TYPE, EContactPrintStyleEditorClass)) -#define E_IS_MINICARD(obj) (GTK_CHECK_TYPE ((obj), E_CONTACT_PRINT_STYLE_EDITOR_TYPE)) -#define E_IS_MINICARD_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_CONTACT_PRINT_STYLE_EDITOR_TYPE)) - - -typedef struct _EContactPrintStyleEditor EContactPrintStyleEditor; -typedef struct _EContactPrintStyleEditorClass EContactPrintStyleEditorClass; - -struct _EContactPrintStyleEditor -{ - GtkVBox parent; - - /* item specific fields */ - GladeXML *gui; -}; - -struct _EContactPrintStyleEditorClass -{ - GtkVBoxClass parent_class; -}; - - -GtkWidget *e_contact_print_style_editor_new(char *filename); -GtkType e_contact_print_style_editor_get_type (void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __E_CONTACT_PRINT_STYLE_EDITOR_H__ */ diff --git a/addressbook/printing/e-contact-print-types.h b/addressbook/printing/e-contact-print-types.h deleted file mode 100644 index b7082b41f6..0000000000 --- a/addressbook/printing/e-contact-print-types.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-contact-print-types.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef E_CONTACT_PRINT_TYPES_H -#define E_CONTACT_PRINT_TYPES_H - -#include <glib.h> -#include <libgnomeprint/gnome-font.h> - -typedef struct _EContactPrintStyle EContactPrintStyle; -typedef enum _EContactPrintType EContactPrintType; - -enum _EContactPrintType { - E_CONTACT_PRINT_TYPE_CARDS, - E_CONTACT_PRINT_TYPE_MEMO_STYLE, - E_CONTACT_PRINT_TYPE_PHONE_LIST -}; - -struct _EContactPrintStyle -{ - gchar *title; - EContactPrintType type; - gboolean sections_start_new_page; - guint num_columns; - guint blank_forms; - gboolean letter_tabs; - gboolean letter_headings; - GnomeFont *headings_font; - GnomeFont *body_font; - gboolean print_using_grey; - gint paper_type; - gdouble paper_width; - gdouble paper_height; - gint paper_source; - gdouble top_margin; - gdouble left_margin; - gdouble bottom_margin; - gdouble right_margin; - gint page_size; - gdouble page_width; - gdouble page_height; - gboolean orientation_portrait; - GnomeFont *header_font; - gchar *left_header; - gchar *center_header; - gchar *right_header; - GnomeFont *footer_font; - gchar *left_footer; - gchar *center_footer; - gchar *right_footer; - gboolean reverse_on_even_pages; -}; - -#endif /* E_CONTACT_PRINT_TYPES_H */ - diff --git a/addressbook/printing/e-contact-print.c b/addressbook/printing/e-contact-print.c deleted file mode 100644 index e47f37f0da..0000000000 --- a/addressbook/printing/e-contact-print.c +++ /dev/null @@ -1,1103 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-contact-print.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include <config.h> -#include "e-contact-print.h" - -#include <ctype.h> -#include <sys/types.h> -#include <stdlib.h> -#include <string.h> -#include <glib.h> -#include <libxml/tree.h> -#include <libxml/parser.h> -#include <libxml/xmlmemory.h> -#include <libgnome/gnome-util.h> -#include <libgnome/gnome-i18n.h> -#include <libgnomeui/gnome-dialog.h> -#include <libgnomeprint/gnome-print.h> -#include <libgnomeprint/gnome-font.h> -#include <libgnomeprint/gnome-print-job.h> -#include <libgnomeprintui/gnome-print-dialog.h> -#include <libgnomeprintui/gnome-print-job-preview.h> -#include <libebook/e-book.h> -#include <libebook/e-contact.h> -#include <gal/util/e-util.h> - -#define SCALE 5 -#define HYPHEN_PIXELS 20 -#define HYPHEN_PENALTY ( (SCALE) * (SCALE) * (HYPHEN_PIXELS) * (HYPHEN_PIXELS) ) - -typedef struct _EContactPrintContext EContactPrintContext; - -struct _EContactPrintContext -{ - GnomePrintContext *pc; - GnomePrintJob *master; - gdouble x; - gdouble y; - gint column; - EContactPrintStyle *style; - gboolean first_section; - gchar first_char_on_page; - gchar last_char_on_page; - GnomeFont *letter_heading_font; - GnomeFont *letter_tab_font; - char *character; - gboolean first_contact; - - gboolean uses_book; - int type; - EBook *book; - EBookQuery *query; - - GList *contacts; -}; - -static gint -e_contact_divide_text(GnomePrintContext *pc, GnomeFont *font, double width, const gchar *text, GList **return_val /* Of type char[] */) -{ - if ( width == -1 || gnome_font_get_width_utf8(font, text) <= width ) { - if ( return_val ) { - *return_val = g_list_append(*return_val, g_strdup(text)); - } - return 1; - } else { -#if 1 - int i, l; - double x = 0; - int lastend = 0; - int linestart = 0; - int firstword = 1; - int linecount = 0; - l = strlen(text); - for ( i = 0; i < l; i++ ) { - if ( text[i] == ' ' ) { - if ( (!firstword) && x + gnome_font_get_width_utf8_sized(font, text + lastend, i - lastend) > width ) { - if (return_val) { - *return_val = g_list_append(*return_val, g_strndup(text + linestart, lastend - linestart)); - } - x = gnome_font_get_width_utf8(font, " "); - linestart = lastend + 1; - x += gnome_font_get_width_utf8_sized(font, text + linestart, i - linestart); - lastend = i; - linecount ++; - } else { - x += gnome_font_get_width_utf8_sized(font, text + lastend, i - lastend); - lastend = i; - } - firstword = 0; - } else if ( text[i] == '\n' ) { - if ( (!firstword) && x + gnome_font_get_width_utf8_sized(font, text + lastend, i - lastend) > width ) { - if (return_val) { - *return_val = g_list_append(*return_val, g_strndup(text + linestart, lastend - linestart)); - } - linestart = lastend + 1; - lastend = i; - linecount ++; - } - if (return_val) { - *return_val = g_list_append(*return_val, g_strndup(text + linestart, i - linestart)); - } - linestart = i + 1; - lastend = i + 1; - linecount ++; - x = gnome_font_get_width_utf8(font, " "); - - firstword = 1; - } - } - if ( (!firstword) && x + gnome_font_get_width_utf8_sized(font, text + lastend, i - lastend) > width ) { - if (return_val) { - *return_val = g_list_append(*return_val, g_strndup(text + linestart, lastend - linestart)); - } - linestart = lastend + 1; - lastend = i; - linecount ++; - } - if (return_val) { - *return_val = g_list_append(*return_val, g_strndup(text + linestart, i - linestart)); - } - linecount ++; - return(linecount); -#else - HnjBreak *breaks; - gint *result; - gint *is; - gint n_breaks = 0, n_actual_breaks = 0; - gint i; - gint l; - gchar *hyphenation; - double x = - gnome_font_get_width_utf8(font, " ") * SCALE; - HnjParams hnjparams; - - hnjparams.set_width = width * SCALE + x; - hnjparams.max_neg_space = 0; - hnjparams.tab_width = 0; - - l = strlen(text); - - /* find possible line breaks. */ - for (i = 0; i < l; i++) { - if (text[i] == '-') - n_breaks++; - else if (text[i] == ' ') - n_breaks++; -#if 0 - else if (hyphenation[i] & 1) - n_breaks++; -#endif - } - - breaks = g_new( HnjBreak, n_breaks + 1 ); - result = g_new( gint, n_breaks + 1 ); - is = g_new( gint, n_breaks + 1 ); - n_breaks = 0; - /* find possible line breaks. */ - - for (i = 0; i < l; i++) { - if ( text[i] == '-' ) { - x += gnome_font_get_width(font, text[i]) * SCALE; - breaks[n_breaks].x0 = x; - breaks[n_breaks].x1 = x; - breaks[n_breaks].penalty = HYPHEN_PENALTY; - breaks[n_breaks].flags = HNJ_JUST_FLAG_ISHYPHEN; - is[n_breaks] = i + 1; - n_breaks++; - } else if ( text[i] == ' ' ) { - breaks[ n_breaks ].x0 = x; - x += gnome_font_get_width(font, text[i]) * SCALE; - breaks[ n_breaks ].x1 = x; - breaks[ n_breaks ].penalty = 0; - breaks[ n_breaks ].flags = HNJ_JUST_FLAG_ISSPACE; - is[ n_breaks ] = i + 1; - n_breaks++; -#if 0 - } else if (word->hyphenation[i] & 1) { - breaks[n_breaks].x0 = x + gnome_font_get_width(font, '-') * SCALE; - breaks[n_breaks].x1 = x; - breaks[n_breaks].penalty = HYPHEN_PENALTY; - breaks[n_breaks].flags = HNJ_JUST_FLAG_ISHYPHEN; - is[n_breaks] = i + 1; - n_breaks++; -#endif - } else - x += gnome_font_get_width(font, text[i]) * SCALE; - - } - is[n_breaks] = i; - breaks[n_breaks].flags = 0; - n_breaks++; - - /* Calculate optimal line breaks. */ - n_actual_breaks = hnj_hs_just (breaks, n_breaks, - &hnjparams, result); - - if ( return_val ) { - gchar *next_val; - if ( breaks[result[0]].flags == HNJ_JUST_FLAG_ISHYPHEN && text[is[result[0]]] != '-' ) { - next_val = g_new(gchar, is[result[0]] + 2); - strncpy(next_val, text, is[result[0]]); - next_val[is[result[0]]] = 0; - strcat(next_val, "-"); - } else { - next_val = g_new(gchar, is[result[0]] + 1); - strncpy(next_val, text, is[result[0]]); - next_val[is[result[0]]] = 0; - } - *return_val = g_list_append(*return_val, next_val); - - for ( i = 1; i < n_actual_breaks; i++ ) { - if ( (breaks[result[i]].flags & HNJ_JUST_FLAG_ISHYPHEN) && (text[is[result[i]]] != '-') ) { - next_val = g_new(gchar, is[result[i]] - is[result[i - 1]] + 2); - strncpy(next_val, text + is[result[i - 1]], is[result[i]] - is[result[i - 1]]); - next_val[is[result[i]] - is[result[i - 1]]] = 0; - strcat(next_val, "-"); - } else { - next_val = g_new(gchar, is[result[i]] - is[result[i - 1]] + 1); - strncpy(next_val, text + is[result[i - 1]], is[result[i]] - is[result[i - 1]]); - next_val[is[result[i]] - is[result[i - 1]]] = 0; - } - *return_val = g_list_append(*return_val, next_val); - } - } - - g_free (breaks); - g_free (result); - g_free (is); - return n_actual_breaks; -#endif - } -} - -static void -e_contact_output(GnomePrintContext *pc, GnomeFont *font, double x, double y, double width, const gchar *text) -{ - GList *list = NULL, *list_start; - int first_line = 1; - gnome_print_gsave(pc); - gnome_print_setfont(pc, font); - e_contact_divide_text(pc, font, width, text, &list); - for ( list_start = list; list; list = g_list_next(list)) { - y -= gnome_font_get_ascender(font); - gnome_print_moveto(pc, x, y); - gnome_print_show(pc, (char *)list->data); - y -= gnome_font_get_descender(font); - y -= .2 * gnome_font_get_size (font); - if ( first_line ) { - x += gnome_font_get_width_utf8(font, " "); - first_line = 0; - } - } - g_list_foreach( list_start, (GFunc) g_free, NULL ); - g_list_free( list_start ); - gnome_print_grestore(pc); -} - -static gdouble -e_contact_text_height(GnomePrintContext *pc, GnomeFont *font, double width, const gchar *text) -{ - int line_count = e_contact_divide_text(pc, font, width, text, NULL); - return line_count * (gnome_font_get_ascender(font) + gnome_font_get_descender(font)) + - (line_count - 1) * .2 * gnome_font_get_size (font); -} - -#if 0 -static void -e_contact_output_and_advance(EContactPrintContext *ctxt, GnomeFont *font, double x, double width, gchar *text) -{ - ctxt->y -= .1 * gnome_font_get_size (font); - e_contact_output(ctxt->pc, font, x, ctxt->y, width, text); - ctxt->y -= e_contact_text_height(ctxt->pc, font, width, text); - ctxt->y -= .1 * gnome_font_get_size (font); -} -#endif - -static void -e_contact_rectangle(GnomePrintContext *pc, - gdouble x0, - gdouble y0, - gdouble x1, - gdouble y1, - gdouble r, - gdouble g, - gdouble b) -{ - gnome_print_gsave(pc); - gnome_print_setrgbcolor(pc, r, g, b); - gnome_print_moveto(pc, x0, y0); - gnome_print_lineto(pc, x1, y0); - gnome_print_lineto(pc, x1, y1); - gnome_print_lineto(pc, x0, y1); - gnome_print_lineto(pc, x0, y0); - gnome_print_fill(pc); - gnome_print_grestore(pc); -} - -static double -e_contact_get_letter_tab_width (EContactPrintContext *ctxt) -{ - return gnome_font_get_width_utf8(ctxt->letter_tab_font, "123") + 4 + 18; -} - -static double -e_contact_print_letter_tab (EContactPrintContext *ctxt) -{ - unsigned char character; - gdouble x, y; - gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin); - gdouble tab_height, tab_width; - gdouble font_size; - tab_height = 72 * (ctxt->style->page_height - ctxt->style->top_margin - ctxt->style->bottom_margin) / 27.0; - font_size = tab_height / 2; - tab_width = e_contact_get_letter_tab_width(ctxt) - 18; - x = page_width + 72 * (ctxt->style->left_margin) - tab_width; - y = 72 * (ctxt->style->page_height - ctxt->style->top_margin); - - - gnome_print_gsave( ctxt->pc ); - if ( ctxt->style->print_using_grey ) - e_contact_rectangle( ctxt->pc, x, 72 * (ctxt->style->page_height - ctxt->style->top_margin), x + tab_width, ctxt->style->bottom_margin * 72, .85, .85, .85 ); - for ( character = 'A' - 1; character <= 'Z'; character ++ ) { - char string[] = "123"; - if ( character >= 'A' ) { - string[0] = tolower(character); - string[1] = 0; - } - if ( character >= ctxt->first_char_on_page && character <= ctxt->last_char_on_page ) { - e_contact_rectangle( ctxt->pc, x + 1, y - 1, x + tab_width - 1, y - (tab_height - 1), 0, 0, 0 ); - gnome_print_setrgbcolor( ctxt->pc, 1, 1, 1 ); - e_contact_output( ctxt->pc, ctxt->letter_tab_font, x + tab_width / 2 - gnome_font_get_width_utf8(ctxt->letter_tab_font, string) / 2, y - (tab_height - font_size) / 2, -1, string ); - } else { - gnome_print_setrgbcolor( ctxt->pc, 0, 0, 0 ); - e_contact_output( ctxt->pc, ctxt->letter_tab_font, x + tab_width / 2 - gnome_font_get_width_utf8(ctxt->letter_tab_font, string) / 2, y - (tab_height - font_size) / 2, -1, string ); - } - y -= tab_height; - } - gnome_print_grestore( ctxt->pc ); - return gnome_font_get_width_utf8(ctxt->style->body_font, "123") + gnome_font_get_size (ctxt->style->body_font) / 5; -} - -static double -e_contact_get_letter_heading_height (EContactPrintContext *ctxt) -{ - gdouble ascender, descender; - ascender = gnome_font_get_ascender(ctxt->letter_heading_font); - descender = gnome_font_get_descender(ctxt->letter_heading_font); - return ascender + descender + 9; -} - -static void -e_contact_print_letter_heading (EContactPrintContext *ctxt, gchar *character) -{ - gdouble ascender, descender; - gdouble width; - - width = gnome_font_get_width_utf8(ctxt->letter_heading_font, "m") * 1.7; - ascender = gnome_font_get_ascender(ctxt->letter_heading_font); - descender = gnome_font_get_descender(ctxt->letter_heading_font); - gnome_print_gsave( ctxt->pc ); - e_contact_rectangle( ctxt->pc, ctxt->x, ctxt->y, ctxt->x + width, ctxt->y - (ascender + descender + 6), 0, 0, 0); - gnome_print_setrgbcolor(ctxt->pc, 1, 1, 1); - ctxt->y -= 4; - e_contact_output(ctxt->pc, ctxt->letter_heading_font, ctxt->x + (width - gnome_font_get_width_utf8(ctxt->letter_heading_font, character))/ 2, ctxt->y, -1, character); - ctxt->y -= ascender + descender; - ctxt->y -= 2; - ctxt->y -= 3; - gnome_print_grestore( ctxt->pc ); -} - -static void -e_contact_start_new_page(EContactPrintContext *ctxt) -{ - ctxt->x = ctxt->style->left_margin * 72; - ctxt->y = (ctxt->style->page_height - ctxt->style->top_margin) * 72; - ctxt->column = 0; - if ( ctxt->style->letter_tabs ) - e_contact_print_letter_tab(ctxt); - gnome_print_showpage(ctxt->pc); - - gnome_print_beginpage (ctxt->pc, NULL); - - ctxt->first_char_on_page = ctxt->last_char_on_page + 1; -} - -static double -e_contact_get_contact_size(EContact *contact, EContactPrintContext *ctxt) -{ - gdouble height = 0; - gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin); - gdouble column_width; - const char *file_as; - gint field; - if ( ctxt->style->letter_tabs ) - page_width -= e_contact_get_letter_tab_width(ctxt); - column_width = (page_width + 18) / ctxt->style->num_columns - 18; - - height += gnome_font_get_size (ctxt->style->headings_font) * .2; - - height += gnome_font_get_size (ctxt->style->headings_font) * .2; - - file_as = e_contact_get_const (contact, E_CONTACT_FILE_AS); - - height += e_contact_text_height(ctxt->pc, ctxt->style->headings_font, column_width - 4, file_as); - - height += gnome_font_get_size (ctxt->style->headings_font) * .2; - - height += gnome_font_get_size (ctxt->style->headings_font) * .2; - - for(field = E_CONTACT_FILE_AS; field != E_CONTACT_LAST_SIMPLE_STRING; field++) { - char *string; - string = e_contact_get(contact, field); - if (string && *string) { - double xoff = 0; - xoff += gnome_font_get_width_utf8(ctxt->style->body_font, e_contact_pretty_name (field)); - xoff += gnome_font_get_width_utf8(ctxt->style->body_font, ": "); - height += e_contact_text_height(ctxt->pc, ctxt->style->body_font, column_width - xoff, string); - height += .2 * gnome_font_get_size (ctxt->style->body_font); - } - g_free(string); - } - height += gnome_font_get_size (ctxt->style->headings_font) * .4; - - /* g_message ("%s %g", e_card_simple_get (simple, E_CARD_SIMPLE_FIELD_FILE_AS), height); */ - return height; -} - - -static void -e_contact_print_contact (EContact *contact, EContactPrintContext *ctxt) -{ - gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin); - gdouble column_width; - char *file_as; - int field; - - if ( ctxt->style->letter_tabs ) - page_width -= e_contact_get_letter_tab_width(ctxt); - column_width = (page_width + 18) / ctxt->style->num_columns - 18; - - gnome_print_gsave(ctxt->pc); - - ctxt->y -= gnome_font_get_size (ctxt->style->headings_font) * .2; - ctxt->y -= gnome_font_get_size (ctxt->style->headings_font) * .2; - - file_as = e_contact_get (contact, E_CONTACT_FILE_AS); - if (ctxt->style->print_using_grey) - e_contact_rectangle(ctxt->pc, ctxt->x, ctxt->y + gnome_font_get_size (ctxt->style->headings_font) * .3, ctxt->x + column_width, ctxt->y - e_contact_text_height(ctxt->pc, ctxt->style->headings_font, column_width - 4, file_as) - gnome_font_get_size (ctxt->style->headings_font) * .3, .85, .85, .85); - e_contact_output(ctxt->pc, ctxt->style->headings_font, ctxt->x + 2, ctxt->y, column_width - 4, file_as); - ctxt->y -= e_contact_text_height(ctxt->pc, ctxt->style->headings_font, column_width - 4, file_as); - g_free (file_as); - - ctxt->y -= gnome_font_get_size (ctxt->style->headings_font) * .2; - ctxt->y -= gnome_font_get_size (ctxt->style->headings_font) * .2; - - for(field = E_CONTACT_FILE_AS; field != E_CONTACT_LAST_SIMPLE_STRING; field++) { - char *string; - string = e_contact_get(contact, field); - - if (string && *string) { - double xoff = 0; - e_contact_output(ctxt->pc, ctxt->style->body_font, ctxt->x + xoff, ctxt->y, -1, e_contact_pretty_name (field)); - xoff += gnome_font_get_width_utf8(ctxt->style->body_font, e_contact_pretty_name (field)); - e_contact_output(ctxt->pc, ctxt->style->body_font, ctxt->x + xoff, ctxt->y, -1, ": "); - xoff += gnome_font_get_width_utf8(ctxt->style->body_font, ": "); - e_contact_output(ctxt->pc, ctxt->style->body_font, ctxt->x + xoff, ctxt->y, column_width - xoff, string); - ctxt->y -= e_contact_text_height(ctxt->pc, ctxt->style->body_font, column_width - xoff, string); - ctxt->y -= .2 * gnome_font_get_size (ctxt->style->body_font); - } - g_free(string); - } - - ctxt->y -= gnome_font_get_size (ctxt->style->headings_font) * .4; - gnome_print_grestore(ctxt->pc); -} - -static void -e_contact_start_new_column (EContactPrintContext *ctxt) -{ - gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin); - gdouble column_offset; - if ( ctxt->style->letter_tabs ) - page_width -= e_contact_get_letter_tab_width(ctxt); - column_offset = (page_width + 18) / ctxt->style->num_columns; - ctxt->column ++; - if (ctxt->column >= ctxt->style->num_columns) { - e_contact_start_new_page(ctxt); - ctxt->column = 0; - } - ctxt->x = (72 * ctxt->style->left_margin) + column_offset * ctxt->column; - ctxt->y = 72 * (ctxt->style->page_height - ctxt->style->top_margin); -} - -static void -complete_sequence(EBookView *book_view, EBookViewStatus status, EContactPrintContext *ctxt) -{ - GList *contacts = ctxt->contacts; - - gdouble page_width = 72 * (ctxt->style->page_width - ctxt->style->left_margin - ctxt->style->right_margin); - - ctxt->first_contact = TRUE; - ctxt->character = NULL; - ctxt->y = (ctxt->style->page_height - ctxt->style->top_margin) * 72; - ctxt->x = (ctxt->style->left_margin) * 72; - if ( ctxt->style->letter_tabs ) - page_width -= e_contact_get_letter_tab_width(ctxt); - - ctxt->first_char_on_page = 'A' - 1; - - gnome_print_beginpage (ctxt->pc, NULL); - - for(; contacts; contacts = contacts->next) { - EContact *contact = contacts->data; - guchar *file_as; - gchar *letter_str = NULL; - - file_as = e_contact_get (contact, E_CONTACT_FILE_AS); - - if (file_as != NULL) { - letter_str = g_strndup (file_as, g_utf8_next_char (file_as) - (gchar *) file_as); - } - if ( file_as && (!ctxt->character || g_utf8_collate (ctxt->character, letter_str) != 0) ) { - g_free (ctxt->character); - ctxt->character = g_strdup (letter_str); - if (ctxt->style->sections_start_new_page && ! ctxt->first_contact) { - e_contact_start_new_page(ctxt); - } - else if ((!ctxt->first_contact) && (ctxt->y - e_contact_get_letter_heading_height(ctxt) - e_contact_get_contact_size(contact, ctxt) < ctxt->style->bottom_margin * 72)) - e_contact_start_new_column(ctxt); - if ( ctxt->style->letter_headings ) - e_contact_print_letter_heading(ctxt, ctxt->character); - ctxt->first_section = FALSE; - } - else if ( (!ctxt->first_contact) && (ctxt->y - e_contact_get_contact_size(contact, ctxt) < ctxt->style->bottom_margin * 72)) { - e_contact_start_new_column(ctxt); - if ( ctxt->style->letter_headings ) - e_contact_print_letter_heading(ctxt, ctxt->character); - } - g_free (letter_str); - ctxt->last_char_on_page = file_as ? toupper (*file_as) : ' '; - if ( ctxt->last_char_on_page < ctxt->first_char_on_page ) - ctxt->first_char_on_page = ctxt->last_char_on_page; - e_contact_print_contact(contact, ctxt); - ctxt->first_contact = FALSE; - } - ctxt->last_char_on_page = 'Z'; - if ( ctxt->style->letter_tabs ) - e_contact_print_letter_tab(ctxt); - gnome_print_showpage(ctxt->pc); - gnome_print_context_close(ctxt->pc); - gnome_print_job_close(ctxt->master); - g_free(ctxt->character); - if (book_view) - g_object_unref(book_view); - if (ctxt->type == GNOME_PRINT_DIALOG_RESPONSE_PREVIEW) { - GtkWidget *preview; - preview = GTK_WIDGET(gnome_print_job_preview_new(ctxt->master, "Print Preview")); - gtk_widget_show_all(preview); - } else { - gnome_print_job_print(ctxt->master); - } - g_object_unref(ctxt->pc); - g_object_unref(ctxt->master); - if (ctxt->book) - g_object_unref(ctxt->book); - if (ctxt->query) - e_book_query_unref (ctxt->query); - g_list_foreach(ctxt->contacts, (GFunc) g_object_unref, NULL); - g_list_free(ctxt->contacts); - g_object_unref(ctxt->style->headings_font); - g_object_unref(ctxt->style->body_font); - g_object_unref(ctxt->style->header_font); - g_object_unref(ctxt->style->footer_font); - g_object_unref(ctxt->letter_heading_font); - g_object_unref(ctxt->letter_tab_font); - g_free(ctxt->style); - g_free(ctxt); -} - -static int -contact_compare (EContact *contact1, EContact *contact2) -{ - if (contact1 && contact2) { - const char *file_as1, *file_as2; - file_as1 = e_contact_get_const (contact1, E_CONTACT_FILE_AS); - file_as2 = e_contact_get_const (contact2, E_CONTACT_FILE_AS); - - if (file_as1 && file_as2) - return g_utf8_collate(file_as1, file_as2); - if (file_as1) - return -1; - if (file_as2) - return 1; - return strcmp(e_contact_get_const(contact1, E_CONTACT_UID), e_contact_get_const(contact2, E_CONTACT_UID)); - } else { - return 0; - } -} - -static void -create_contact(EBookView *book_view, const GList *contacts, EContactPrintContext *ctxt) -{ - for(; contacts; contacts = contacts->next) { - EContact *contact = contacts->data; - g_object_ref(contact); - ctxt->contacts = g_list_insert_sorted(ctxt->contacts, contact, (GCompareFunc) contact_compare); - } -} - -static void -book_view_loaded (EBook *book, EBookStatus status, EBookView *book_view, EContactPrintContext *ctxt) -{ - g_object_ref(book_view); - - g_signal_connect(book_view, - "contacts_added", - G_CALLBACK(create_contact), - ctxt); - - g_signal_connect(book_view, - "sequence_complete", - G_CALLBACK(complete_sequence), - ctxt); - - e_book_view_start (book_view); -} - -static void -e_contact_do_print_contacts (EBook *book, EBookQuery *query, EContactPrintContext *ctxt) -{ - e_book_async_get_book_view(book, query, NULL, -1, (EBookBookViewCallback) book_view_loaded, ctxt); -} - -static void -e_contact_do_print (EBook *book, EBookQuery *query, EContactPrintContext *ctxt) -{ - switch ( ctxt->style->type ) { - case E_CONTACT_PRINT_TYPE_CARDS: - e_contact_do_print_contacts( book, query, ctxt); - break; - default: - break; - } -} - -static void lowify( char *data ) -{ - for ( ; *data; data++ ) - *data = tolower((unsigned char) *data); -} - -static gboolean get_bool( char *data ) -{ - if ( data ) { - lowify ( data ); - return ! strcmp(data, "true"); - } else - return FALSE; -} - -static void get_string( char *data, char **variable ) -{ - g_free ( *variable ); - if ( data ) - *variable = g_strdup( data ); - else - *variable = g_strdup( "" ); -} - -static int get_integer( char *data ) -{ - if ( data ) - return atoi(data); - else - return 0; -} - -static double get_float( char *data ) -{ - if ( data ) - return atof(data); - else - return 0; -} - -static void get_font( char *data, GnomeFont **variable ) -{ - if ( data ) { - GnomeFont *font = gnome_font_find_from_full_name( data ); - if ( font ) { - g_object_unref(*variable); - *variable = font; - } - } -} - - -static void -e_contact_build_style(EContactPrintStyle *style) -{ - xmlDocPtr styledoc; - gchar *filename; - - style->title = g_strdup(""); - style->type = E_CONTACT_PRINT_TYPE_CARDS; - style->sections_start_new_page = TRUE; - style->num_columns = 2; - style->blank_forms = 2; - style->letter_tabs = TRUE; - style->letter_headings = FALSE; - - style->headings_font = gnome_font_find_closest_from_weight_slant ("Sans", GNOME_FONT_BOLD, FALSE, 8); - style->body_font = gnome_font_find_closest_from_weight_slant ("Sans", GNOME_FONT_BOOK, FALSE, 6); - - style->print_using_grey = TRUE; - style->paper_type = 0; - style->paper_width = 8.5; - style->paper_height = 11; - style->paper_source = 0; - style->top_margin = .5; - style->left_margin = .5; - style->bottom_margin = .5; - style->right_margin = .5; - style->page_size = 0; - style->page_width = 2.75; - style->page_height = 4.25; -#if 0 - style->page_width = 4.25; - style->page_height = 5.5; -#endif -#if 0 - style->page_width = 5.5; - style->page_height = 8.5; -#endif - style->orientation_portrait = FALSE; - - style->header_font = gnome_font_find_closest_from_weight_slant ("Sans", GNOME_FONT_BOOK, FALSE, 6); - - style->left_header = g_strdup(""); - style->center_header = g_strdup(""); - style->right_header = g_strdup(""); - - style->footer_font = gnome_font_find_closest_from_weight_slant ("Sans", GNOME_FONT_BOOK, FALSE, 6); - - style->left_footer = g_strdup(""); - style->center_footer = g_strdup(""); - style->right_footer = g_strdup(""); - style->reverse_on_even_pages = FALSE; - filename = g_concat_dir_and_file(EVOLUTION_ECPSDIR, "medbook.ecps"); - styledoc = xmlParseFile(filename); - g_free(filename); - if (styledoc) { - xmlNodePtr stylenode = xmlDocGetRootElement(styledoc); - xmlNodePtr node; - for (node = stylenode->children; node; node = node->next) { - char *data = xmlNodeGetContent ( node ); - if ( !strcmp( node->name, "title" ) ) { - get_string(data, &(style->title)); - } else if ( !strcmp( node->name, "type" ) ) { - lowify( data ); - if ( !strcmp( data, "cards" ) ) - style->type = E_CONTACT_PRINT_TYPE_CARDS; - else if ( !strcmp( data, "memo_style" ) ) - style->type = E_CONTACT_PRINT_TYPE_MEMO_STYLE; - else if ( !strcmp( data, "phone_list" ) ) - style->type = E_CONTACT_PRINT_TYPE_PHONE_LIST; - } else if ( !strcmp( node->name, "sections_start_new_page" ) ) { - style->sections_start_new_page = get_bool(data); - } else if ( !strcmp( node->name, "num_columns" ) ) { - style->num_columns = get_integer(data); - } else if ( !strcmp( node->name, "blank_forms" ) ) { - style->blank_forms = get_integer(data); - } else if ( !strcmp( node->name, "letter_tabs" ) ) { - style->letter_tabs = get_bool(data); - } else if ( !strcmp( node->name, "letter_headings" ) ) { - style->letter_headings = get_bool(data); - } else if ( !strcmp( node->name, "headings_font" ) ) { - get_font( data, &(style->headings_font) ); - } else if ( !strcmp( node->name, "body_font" ) ) { - get_font( data, &(style->body_font) ); - } else if ( !strcmp( node->name, "print_using_grey" ) ) { - style->print_using_grey = get_bool(data); - } else if ( !strcmp( node->name, "paper_width" ) ) { - style->paper_width = get_float(data); - } else if ( !strcmp( node->name, "paper_height" ) ) { - style->paper_height = get_float(data); - } else if ( !strcmp( node->name, "top_margin" ) ) { - style->top_margin = get_float(data); - } else if ( !strcmp( node->name, "left_margin" ) ) { - style->left_margin = get_float(data); - } else if ( !strcmp( node->name, "bottom_margin" ) ) { - style->bottom_margin = get_float(data); - } else if ( !strcmp( node->name, "right_margin" ) ) { - style->right_margin = get_float(data); - } else if ( !strcmp( node->name, "page_width" ) ) { - style->page_width = get_float(data); - } else if ( !strcmp( node->name, "page_height" ) ) { - style->page_height = get_float(data); - } else if ( !strcmp( node->name, "orientation" ) ) { - if ( data ) { - lowify(data); - style->orientation_portrait = strcmp(data, "landscape"); - } else { - style->orientation_portrait = TRUE; - } - } else if ( !strcmp( node->name, "header_font" ) ) { - get_font( data, &(style->header_font) ); - } else if ( !strcmp( node->name, "left_header" ) ) { - get_string(data, &(style->left_header)); - } else if ( !strcmp( node->name, "center_header" ) ) { - get_string(data, &(style->center_header)); - } else if ( !strcmp( node->name, "right_header" ) ) { - get_string(data, &(style->right_header)); - } else if ( !strcmp( node->name, "footer_font" ) ) { - get_font( data, &(style->footer_font) ); - } else if ( !strcmp( node->name, "left_footer" ) ) { - get_string(data, &(style->left_footer)); - } else if ( !strcmp( node->name, "center_footer" ) ) { - get_string(data, &(style->center_footer)); - } else if ( !strcmp( node->name, "right_footer" ) ) { - get_string(data, &(style->right_footer)); - } else if ( !strcmp( node->name, "reverse_on_even_pages" ) ) { - style->reverse_on_even_pages = get_bool(data); - } - if ( data ) - xmlFree (data); - } - xmlFreeDoc(styledoc); - } -} - -static gint -e_contact_print_close(GnomeDialog *dialog, gpointer data) -{ - return FALSE; -} - -static void -e_contact_print_response(GtkWidget *dialog, gint response_id, gpointer data) -{ - EContactPrintContext *ctxt = g_new(EContactPrintContext, 1); - EContactPrintStyle *style = g_new(EContactPrintStyle, 1); - GnomePrintJob *master; - GnomePrintConfig *config; - GnomePrintContext *pc; - gboolean uses_book = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(dialog), "uses_book")); - gboolean uses_list = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(dialog), "uses_list")); - EBook *book = NULL; - EBookQuery *query = NULL; - EContact *contact = NULL; - GList *contact_list = NULL; - gdouble font_size; - - if (uses_book) { - book = g_object_get_data(G_OBJECT(dialog), "book"); - query = g_object_get_data(G_OBJECT(dialog), "query"); - e_book_query_ref (query); - } - else if (uses_list) { - contact_list = g_object_get_data(G_OBJECT(dialog), "contact_list"); - } - else { - contact = g_object_get_data(G_OBJECT(dialog), "contact"); - } - switch( response_id ) { - case GNOME_PRINT_DIALOG_RESPONSE_PRINT: - config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG(dialog)); - master = gnome_print_job_new( config ); - pc = gnome_print_job_get_context( master ); - e_contact_build_style(style); - - ctxt->x = 0; - ctxt->y = 0; - ctxt->column = 0; - ctxt->style = style; - ctxt->master = master; - ctxt->first_section = TRUE; - ctxt->first_char_on_page = 'A' - 1; - ctxt->type = GNOME_PRINT_DIALOG_RESPONSE_PRINT; - - font_size = 72 * ctxt->style->page_height / 27.0 / 2.0; - ctxt->letter_heading_font = gnome_font_find (gnome_font_get_name(ctxt->style->headings_font), gnome_font_get_size (ctxt->style->headings_font) * 1.5); - ctxt->letter_tab_font = gnome_font_find (gnome_font_get_name(ctxt->style->headings_font), font_size); - - ctxt->pc = pc; -#warning FIXME gnome_print_multipage_new_from_sizes -#if 0 - ctxt->pc = GNOME_PRINT_CONTEXT(gnome_print_multipage_new_from_sizes(pc, - 72 * style->paper_width, - 72 * style->paper_height, - 72 * style->page_width, - 72 * style->page_height)); -#endif - - ctxt->book = book; - ctxt->query = query; - if (uses_book) { - ctxt->contacts = NULL; - e_contact_do_print(book, ctxt->query, ctxt); - } - else if (uses_list) { - ctxt->contacts = contact_list; - complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, ctxt); - } - else { - ctxt->contacts = g_list_append(NULL, contact); - complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, ctxt); - } - gtk_widget_destroy (dialog); - - break; - case GNOME_PRINT_DIALOG_RESPONSE_PREVIEW: - config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG(dialog)); - master = gnome_print_job_new( config ); - pc = gnome_print_job_get_context( master ); - e_contact_build_style(style); - - ctxt->x = 0; - ctxt->y = 0; - ctxt->column = 0; - ctxt->style = style; - ctxt->master = master; - ctxt->first_section = TRUE; - ctxt->first_char_on_page = 'A' - 1; - ctxt->type = GNOME_PRINT_DIALOG_RESPONSE_PREVIEW; - - font_size = 72 * ctxt->style->page_height / 27.0 / 2.0; - ctxt->letter_heading_font = gnome_font_find (gnome_font_get_name(ctxt->style->headings_font), gnome_font_get_size (ctxt->style->headings_font) * 1.5); - ctxt->letter_tab_font = gnome_font_find (gnome_font_get_name(ctxt->style->headings_font), font_size); - - ctxt->pc = pc; -#warning FIXME gnome_print_multipage_new_from_sizes -#if 0 - ctxt->pc = GNOME_PRINT_CONTEXT(gnome_print_multipage_new_from_sizes(pc, - 72 * style->paper_width, - 72 * style->paper_height, - 72 * style->page_width, - 72 * style->page_height)); -#endif - ctxt->book = book; - ctxt->query = query; - - if (uses_book) { - ctxt->contacts = NULL; - g_object_ref(book); - e_contact_do_print(book, ctxt->query, ctxt); - } - else if (uses_list) { - ctxt->contacts = g_list_copy (contact_list); - g_list_foreach (ctxt->contacts, (GFunc)g_object_ref, NULL); - complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, ctxt); - } - else { - ctxt->contacts = g_list_append(NULL, contact); - g_object_ref(contact); - complete_sequence(NULL, E_BOOK_VIEW_STATUS_OK, ctxt); - } - break; - case GNOME_PRINT_DIALOG_RESPONSE_CANCEL: - if (uses_book) - g_object_unref(book); - else if (uses_list) - e_free_object_list (contact_list); - else - g_object_unref(contact); - - if (query) - e_book_query_unref (query); - - gtk_widget_destroy (dialog); - g_free(style); - g_free(ctxt); - break; - } -} - -GtkWidget * -e_contact_print_dialog_new(EBook *book, char *query) -{ - GtkWidget *dialog; - - - dialog = gnome_print_dialog_new(NULL, _("Print contacts"), GNOME_PRINT_DIALOG_RANGE | GNOME_PRINT_DIALOG_COPIES); - gnome_print_dialog_construct_range_any(GNOME_PRINT_DIALOG(dialog), GNOME_PRINT_RANGE_ALL | GNOME_PRINT_RANGE_SELECTION, - NULL, NULL, NULL); - - g_object_ref(book); - g_object_set_data(G_OBJECT(dialog), "uses_book", GINT_TO_POINTER (TRUE)); - g_object_set_data(G_OBJECT(dialog), "uses_list", GINT_TO_POINTER (FALSE)); - g_object_set_data(G_OBJECT(dialog), "book", book); - g_object_set_data(G_OBJECT(dialog), "query", e_book_query_from_string (query)); - g_signal_connect(dialog, - "response", G_CALLBACK(e_contact_print_response), NULL); - g_signal_connect(dialog, - "close", G_CALLBACK(e_contact_print_close), NULL); - return dialog; -} - -void -e_contact_print_preview(EBook *book, char *query) -{ - EContactPrintContext *ctxt = g_new(EContactPrintContext, 1); - EContactPrintStyle *style = g_new(EContactPrintStyle, 1); - GnomePrintJob *master; - GnomePrintContext *pc; - GnomePrintConfig *config; - gdouble font_size; - - master = gnome_print_job_new(NULL); - config = gnome_print_job_get_config (master); - gnome_print_config_set_int (config, GNOME_PRINT_KEY_NUM_COPIES, 1); - pc = gnome_print_job_get_context (master); - e_contact_build_style (style); - - ctxt->x = 0; - ctxt->y = 0; - ctxt->column = 0; - ctxt->style = style; - ctxt->master = master; - ctxt->first_section = TRUE; - ctxt->first_char_on_page = 'A' - 1; - ctxt->type = GNOME_PRINT_DIALOG_RESPONSE_PREVIEW; - - font_size = 72 * ctxt->style->page_height / 27.0 / 2.0; - ctxt->letter_heading_font = gnome_font_find (gnome_font_get_name(ctxt->style->headings_font), gnome_font_get_size (ctxt->style->headings_font) * 1.5); - ctxt->letter_tab_font = gnome_font_find (gnome_font_get_name(ctxt->style->headings_font), font_size); - - ctxt->pc = pc; -#warning FIXME gnome_print_multipage_new_from_sizes -#if 0 - ctxt->pc = GNOME_PRINT_CONTEXT(gnome_print_multipage_new_from_sizes(pc, - 72 * style->paper_width, - 72 * style->paper_height, - 72 * style->page_width, - 72 * style->page_height)); -#endif - ctxt->book = book; - ctxt->query = e_book_query_from_string (query); - ctxt->contacts = NULL; - g_object_ref(book); - e_contact_do_print(book, ctxt->query, ctxt); -} - -GtkWidget * -e_contact_print_contact_dialog_new(EContact *contact) -{ - GtkWidget *dialog; - - dialog = gnome_print_dialog_new(NULL, _("Print contact"), GNOME_PRINT_DIALOG_COPIES); - - contact = e_contact_duplicate(contact); - g_object_set_data(G_OBJECT(dialog), "contact", contact); - g_object_set_data(G_OBJECT(dialog), "uses_list", GINT_TO_POINTER (FALSE)); - g_object_set_data(G_OBJECT(dialog), "uses_book", GINT_TO_POINTER (FALSE)); - g_signal_connect(dialog, - "response", G_CALLBACK(e_contact_print_response), NULL); - g_signal_connect(dialog, - "close", G_CALLBACK(e_contact_print_close), NULL); - return dialog; -} - -GtkWidget * -e_contact_print_contact_list_dialog_new(GList *list) -{ - GtkWidget *dialog; - GList *copied_list; - GList *l; - - if (list == NULL) - return NULL; - - copied_list = g_list_copy (list); - for (l = copied_list; l; l = l->next) - l->data = e_contact_duplicate (E_CONTACT (l->data)); - - dialog = gnome_print_dialog_new(NULL, _("Print contact"), GNOME_PRINT_DIALOG_COPIES); - - g_object_set_data(G_OBJECT(dialog), "contact_list", copied_list); - g_object_set_data(G_OBJECT(dialog), "uses_list", GINT_TO_POINTER (TRUE)); - g_object_set_data(G_OBJECT(dialog), "uses_book", GINT_TO_POINTER (FALSE)); - g_signal_connect(dialog, - "response", G_CALLBACK(e_contact_print_response), NULL); - g_signal_connect(dialog, - "close", G_CALLBACK(e_contact_print_close), NULL); - return dialog; -} diff --git a/addressbook/printing/e-contact-print.glade b/addressbook/printing/e-contact-print.glade deleted file mode 100644 index d1721e3509..0000000000 --- a/addressbook/printing/e-contact-print.glade +++ /dev/null @@ -1,2018 +0,0 @@ -<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> -<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd" > - -<glade-interface> - <widget class="GtkDialog" id="print-edit-style"> - <property name="visible">no</property> - <property name="title" translatable="yes">Page Setup:</property> - <property name="type">GTK_WINDOW_TOPLEVEL</property> - <property name="modal">no</property> - <property name="allow_shrink">no</property> - <property name="allow_grow">no</property> - <property name="window-position">GTK_WIN_POS_NONE</property> - - <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox1"> - <property name="homogeneous">no</property> - <property name="spacing">8</property> - <property name="visible">yes</property> - - <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area1"> - <property name="layout_style">GTK_BUTTONBOX_END</property> - <property name="spacing">8</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkButton" id="button1"> - <property name="can_default">yes</property> - <property name="can_focus">yes</property> - <property name="visible">yes</property> - <property name="label">gtk-ok</property> - <property name="use_stock">yes</property> - <property name="use_underline">yes</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="button2"> - <property name="can_default">yes</property> - <property name="can_focus">yes</property> - <property name="visible">yes</property> - <property name="label">gtk-apply</property> - <property name="use_stock">yes</property> - <property name="use_underline">yes</property> - </widget> - </child> - - <child> - <widget class="GtkButton" id="button3"> - <property name="can_default">yes</property> - <property name="can_focus">yes</property> - <property name="visible">yes</property> - <property name="label">gtk-cancel</property> - <property name="use_stock">yes</property> - <property name="use_underline">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">yes</property> - <property name="pack_type">GTK_PACK_END</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox-contact-print-style-editor"> - <property name="homogeneous">no</property> - <property name="spacing">5</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkHBox" id="hbox2"> - <property name="border_width">5</property> - <property name="homogeneous">no</property> - <property name="spacing">16</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label8"> - <property name="label" translatable="yes">Style name:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="label-style-name"> - <property name="can_focus">yes</property> - <property name="editable">no</property> - <property name="text" translatable="yes"></property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkNotebook" id="notebook1"> - <property name="can_focus">yes</property> - <property name="show_tabs">yes</property> - <property name="show_border">yes</property> - <property name="tab_pos">GTK_POS_TOP</property> - <property name="scrollable">no</property> - <property name="tab_hborder">2</property> - <property name="tab_vborder">2</property> - <property name="enable-popup">no</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkVBox" id="vbox2"> - <property name="border_width">5</property> - <property name="homogeneous">no</property> - <property name="spacing">5</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkAlignment" id="alignment1"> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkFrame" id="frame5"> - <property name="label" translatable="yes">Preview:</property> - <property name="label_xalign">0</property> - <property name="shadow">GTK_SHADOW_ETCHED_IN</property> - <property name="visible">yes</property> - - <child> - <placeholder /> - </child> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox1"> - <property name="homogeneous">yes</property> - <property name="spacing">7</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkFrame" id="frame6"> - <property name="label" translatable="yes">Options</property> - <property name="label_xalign">0</property> - <property name="shadow">GTK_SHADOW_ETCHED_IN</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkAlignment" id="alignment4"> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkTable" id="table1"> - <property name="border_width">8</property> - <property name="homogeneous">no</property> - <property name="row_spacing">0</property> - <property name="column_spacing">0</property> - <property name="n-rows">6</property> - <property name="n-columns">5</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label5"> - <property name="label" translatable="yes">Include:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label4"> - <property name="label" translatable="yes">Sections:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkAlignment" id="alignment2"> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkRadioButton" id="radiobutton1"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">Immediately follow each other</property> - <property name="active">yes</property> - <property name="draw_indicator">yes</property> - <property name="visible">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">5</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkCheckButton" id="checkbutton1"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">Letter tabs on side</property> - <property name="active">no</property> - <property name="draw_indicator">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">5</property> - <property name="top_attach">4</property> - <property name="bottom_attach">5</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkCheckButton" id="checkbutton2"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">Headings for each letter</property> - <property name="active">no</property> - <property name="draw_indicator">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">5</property> - <property name="top_attach">5</property> - <property name="bottom_attach">6</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkAlignment" id="alignment3"> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkRadioButton" id="radiobutton2"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">Start on a new page</property> - <property name="active">no</property> - <property name="draw_indicator">yes</property> - <property name="visible">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">5</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label6"> - <property name="label" translatable="yes">Number of columns:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_padding">0</property> - <property name="y_padding">2</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label7"> - <property name="label" translatable="yes">Blank forms at end:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">3</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_padding">0</property> - <property name="y_padding">2</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkAlignment" id="alignment6"> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkSpinButton" id="spinbutton2"> - <property name="can_focus">yes</property> - <property name="climb_rate">1</property> - <property name="digits">0</property> - <property name="numeric">no</property> - <property name="update_policy">GTK_UPDATE_ALWAYS</property> - <property name="wrap">no</property> - <property name="snap_to_ticks">no</property> - <property name="visible">yes</property> - <property name="adjustment">2 0 100 1 10 10</property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_padding">0</property> - <property name="y_padding">2</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkAlignment" id="alignment5"> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkSpinButton" id="spinbutton1"> - <property name="can_focus">yes</property> - <property name="climb_rate">1</property> - <property name="digits">0</property> - <property name="numeric">no</property> - <property name="update_policy">GTK_UPDATE_ALWAYS</property> - <property name="wrap">no</property> - <property name="width-request">45</property> - <property name="snap_to_ticks">no</property> - <property name="visible">yes</property> - <property name="adjustment">1 0 100 1 10 10</property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_padding">0</property> - <property name="y_padding">2</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox3"> - <property name="homogeneous">no</property> - <property name="spacing">8</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkFrame" id="frame7"> - <property name="label" translatable="yes">Fonts</property> - <property name="label_xalign">0</property> - <property name="shadow">GTK_SHADOW_ETCHED_IN</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkTable" id="table2"> - <property name="border_width">8</property> - <property name="homogeneous">no</property> - <property name="row_spacing">13</property> - <property name="column_spacing">8</property> - <property name="n-rows">2</property> - <property name="n-columns">2</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkAlignment" id="alignment7"> - <property name="xalign">0.5</property> - <property name="yalign">1</property> - <property name="xscale">1</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkButton" id="button6"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">F_ont...</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="visible">yes</property> - <property name="use_underline">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkAlignment" id="alignment8"> - <property name="xalign">0.5</property> - <property name="yalign">1</property> - <property name="xscale">1</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkButton" id="button5"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">_Font...</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="width-request">90</property> - <property name="visible">yes</property> - <property name="use_underline">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox4"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label10"> - <property name="label" translatable="yes">Headings</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry3"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes">10 pt. Tahoma</property> - <property name="width-request">100</property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">expand|fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox5"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label9"> - <property name="label" translatable="yes">Body</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry2"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes">8 pt. Tahoma</property> - <property name="width-request">100</property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">expand|fill</property> - <property name="y_options">fill</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="frame8"> - <property name="label" translatable="yes">Shading</property> - <property name="label_xalign">0</property> - <property name="shadow">GTK_SHADOW_ETCHED_IN</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkCheckButton" id="checkbutton3"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">Print using gray shading</property> - <property name="active">no</property> - <property name="draw_indicator">yes</property> - <property name="visible">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label1"> - <property name="label" translatable="yes">Format</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="type">tab</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox3"> - <property name="homogeneous">yes</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkVBox" id="vbox6"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkFrame" id="frame9"> - <property name="label" translatable="yes">Paper</property> - <property name="label_xalign">0</property> - <property name="shadow">GTK_SHADOW_ETCHED_IN</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkVBox" id="vbox16"> - <property name="border_width">10</property> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkVBox" id="vbox17"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label21"> - <property name="label" translatable="yes">Type:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkScrolledWindow" id="scrolledwindow1"> - <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property> - <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property> - <property name="shadow_type">GTK_SHADOW_IN</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkTreeView" id="clist1"> - <property name="can_focus">yes</property> - <property name="headers-visible">no</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label26"> - <property name="child_name">CList:title</property> - <property name="label" translatable="yes">label26</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - </child> - </widget> - </child> - - <child internal-child="hscrollbar"> - <widget class="GtkHScrollbar" id="convertwidget1"> - <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> - <property name="visible">yes</property> - </widget> - </child> - - <child internal-child="vscrollbar"> - <widget class="GtkVScrollbar" id="convertwidget2"> - <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> - <property name="visible">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox18"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label24"> - <property name="label" translatable="yes">Dimensions:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox5"> - <property name="homogeneous">yes</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label27"> - <property name="label" translatable="yes">Width:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry9"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes"></property> - <property name="width-request">1</property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label28"> - <property name="label" translatable="yes">Height:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry10"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes"></property> - <property name="width-request">1</property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox19"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label25"> - <property name="label" translatable="yes">Paper source:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkCombo" id="combo1"> - <property name="value_in_list">no</property> - <property name="case_sensitive">no</property> - <property name="enable_arrow_keys">yes</property> - <property name="enable_arrows_always">no</property> - <property name="allow_empty">yes</property> - <property name="visible">yes</property> - - <child internal-child="entry"> - <widget class="GtkEntry" id="combo-entry1"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes"></property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - </child> - - <child internal-child="list"> - <widget class="GtkList" id="convertwidget3"> - <property name="visible">yes</property> - - <child> - <widget class="GtkListItem" id="convertwidget4"> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="convertwidget5"> - <property name="label" translatable="yes"></property> - <property name="xalign">0.0</property> - <property name="visible">yes</property> - </widget> - </child> - </widget> - </child> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="frame10"> - <property name="label" translatable="yes">Margins</property> - <property name="label_xalign">0</property> - <property name="shadow">GTK_SHADOW_ETCHED_IN</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkTable" id="table4"> - <property name="border_width">15</property> - <property name="homogeneous">yes</property> - <property name="row_spacing">6</property> - <property name="column_spacing">9</property> - <property name="n-rows">2</property> - <property name="n-columns">4</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label29"> - <property name="label" translatable="yes">Top:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">expand|fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label30"> - <property name="label" translatable="yes">Bottom:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">expand|fill</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label31"> - <property name="label" translatable="yes">Left:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">expand|fill</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry11"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes"></property> - <property name="width-request">1</property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">expand|fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry12"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes"></property> - <property name="width-request">1</property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">expand|fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry13"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes"></property> - <property name="width-request">1</property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">expand|fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry14"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes"></property> - <property name="width-request">1</property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">expand|fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label32"> - <property name="label" translatable="yes">Right:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">expand|fill</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox7"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkFrame" id="frame11"> - <property name="label" translatable="yes">Page</property> - <property name="label_xalign">0</property> - <property name="shadow">GTK_SHADOW_ETCHED_IN</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkVBox" id="vbox8"> - <property name="border_width">10</property> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkVBox" id="vbox20"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label33"> - <property name="label" translatable="yes">Size:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkScrolledWindow" id="scrolledwindow2"> - <property name="hscrollbar_policy">GTK_POLICY_ALWAYS</property> - <property name="vscrollbar_policy">GTK_POLICY_ALWAYS</property> - <property name="shadow_type">GTK_SHADOW_IN</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkTreeView" id="clist2"> - <property name="can_focus">yes</property> - <property name="headers-visible">no</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label35"> - <property name="child_name">CList:title</property> - <property name="label" translatable="yes">label26</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - </child> - </widget> - </child> - - <child internal-child="hscrollbar"> - <widget class="GtkHScrollbar" id="convertwidget6"> - <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> - <property name="visible">yes</property> - </widget> - </child> - - <child internal-child="vscrollbar"> - <widget class="GtkVScrollbar" id="convertwidget7"> - <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> - <property name="visible">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox21"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label34"> - <property name="label" translatable="yes">Dimensions:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox6"> - <property name="homogeneous">yes</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label36"> - <property name="label" translatable="yes">Width:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry15"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes"></property> - <property name="width-request">1</property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkLabel" id="label37"> - <property name="label" translatable="yes">Height:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry16"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes"></property> - <property name="width-request">1</property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkFrame" id="frame12"> - <property name="label" translatable="yes">Orientation</property> - <property name="label_xalign">0</property> - <property name="shadow">GTK_SHADOW_ETCHED_IN</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkHBox" id="hbox4"> - <property name="homogeneous">no</property> - <property name="spacing">10</property> - <property name="visible">yes</property> - - <child> - <placeholder /> - </child> - - <child> - <widget class="GtkVBox" id="vbox9"> - <property name="homogeneous">no</property> - <property name="spacing">5</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkAlignment" id="alignment9"> - <property name="xalign">0</property> - <property name="yalign">1</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkRadioButton" id="radiobutton3"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">Portrait</property> - <property name="active">no</property> - <property name="draw_indicator">yes</property> - <property name="visible">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkAlignment" id="alignment10"> - <property name="xalign">0</property> - <property name="yalign">0</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkRadioButton" id="radiobutton4"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">Landscape</property> - <property name="active">no</property> - <property name="draw_indicator">yes</property> - <property name="visible">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label2"> - <property name="label" translatable="yes">Paper</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="type">tab</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox10"> - <property name="border_width">8</property> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkTable" id="table5"> - <property name="homogeneous">yes</property> - <property name="row_spacing">4</property> - <property name="column_spacing">4</property> - <property name="n-rows">4</property> - <property name="n-columns">3</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkAlignment" id="alignment15"> - <property name="xalign">0</property> - <property name="yalign">1</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkButton" id="button11"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">F_ont...</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="visible">yes</property> - <property name="use_underline">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkTextView" id="text10"> - <property name="can_focus">yes</property> - <property name="editable">no</property> - <property name="text" translatable="yes"></property> - <property name="wrap_mode">GTK_WRAP_WORD</property> - <property name="height-request">50</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">expand|fill</property> - </packing> - </child> - - <child> - <widget class="GtkTextView" id="text11"> - <property name="can_focus">yes</property> - <property name="editable">no</property> - <property name="text" translatable="yes"></property> - <property name="wrap_mode">GTK_WRAP_WORD</property> - <property name="height-request">50</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">expand|fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkTextView" id="text12"> - <property name="can_focus">yes</property> - <property name="editable">no</property> - <property name="text" translatable="yes"></property> - <property name="wrap_mode">GTK_WRAP_WORD</property> - <property name="height-request">50</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkTextView" id="text13"> - <property name="can_focus">yes</property> - <property name="editable">no</property> - <property name="text" translatable="yes"></property> - <property name="wrap_mode">GTK_WRAP_WORD</property> - <property name="height-request">50</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">expand|fill</property> - </packing> - </child> - - <child> - <widget class="GtkTextView" id="text14"> - <property name="can_focus">yes</property> - <property name="editable">no</property> - <property name="text" translatable="yes"></property> - <property name="wrap_mode">GTK_WRAP_WORD</property> - <property name="height-request">5</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkTextView" id="text15"> - <property name="can_focus">yes</property> - <property name="editable">no</property> - <property name="text" translatable="yes"></property> - <property name="wrap_mode">GTK_WRAP_WORD</property> - <property name="height-request">50</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkAlignment" id="alignment16"> - <property name="xalign">0.5</property> - <property name="yalign">1</property> - <property name="xscale">1</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkVBox" id="vbox14"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label14"> - <property name="label" translatable="yes">Header</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry7"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes"></property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">expand|fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkAlignment" id="alignment17"> - <property name="xalign">0.5</property> - <property name="yalign">1</property> - <property name="xscale">1</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkVBox" id="vbox15"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkLabel" id="label15"> - <property name="label" translatable="yes">Footer:</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="entry8"> - <property name="can_focus">yes</property> - <property name="editable">yes</property> - <property name="text" translatable="yes"></property> - <property name="max-length">0</property> - <property name="visibility">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">expand|fill</property> - <property name="y_options">fill</property> - </packing> - </child> - - <child> - <widget class="GtkAlignment" id="alignment14"> - <property name="xalign">0</property> - <property name="yalign">1</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkButton" id="button10"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">_Font...</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="visible">yes</property> - <property name="use_underline">yes</property> - </widget> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_padding">0</property> - <property name="y_padding">0</property> - <property name="x_options">fill</property> - <property name="y_options">fill</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkHBox" id="hbox7"> - <property name="homogeneous">no</property> - <property name="spacing">0</property> - <property name="visible">yes</property> - - <child> - <widget class="GtkToolbar" id="toolbar1"> - <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property> - <property name="toolbar-style">GTK_TOOLBAR_ICONS</property> - <property name="visible">yes</property> - - <child> - <placeholder /> - </child> - - <child> - <placeholder /> - </child> - - <child> - <placeholder /> - </child> - - <child> - <placeholder /> - </child> - - <child> - <placeholder /> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">no</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">yes</property> - </packing> - </child> - - <child> - <widget class="GtkCheckButton" id="checkbutton4"> - <property name="can_focus">yes</property> - <property name="label" translatable="yes">Reverse on even pages</property> - <property name="active">no</property> - <property name="draw_indicator">yes</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">no</property> - <property name="fill">no</property> - </packing> - </child> - </widget> - </child> - - <child> - <widget class="GtkLabel" id="label3"> - <property name="label" translatable="yes">Header/Footer</property> - <property name="justify">GTK_JUSTIFY_CENTER</property> - <property name="wrap">no</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="visible">yes</property> - </widget> - <packing> - <property name="type">tab</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> - <packing> - <property name="padding">4</property> - <property name="expand">yes</property> - <property name="fill">yes</property> - </packing> - </child> - </widget> -</glade-interface> diff --git a/addressbook/printing/e-contact-print.h b/addressbook/printing/e-contact-print.h deleted file mode 100644 index 4edc948082..0000000000 --- a/addressbook/printing/e-contact-print.h +++ /dev/null @@ -1,36 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * e-contact-print.h - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef E_CONTACT_PRINT_H -#define E_CONTACT_PRINT_H - -#include <glib.h> -#include <gtk/gtkwidget.h> -#include <libebook/e-book.h> -#include <libebook/e-contact.h> -#include "e-contact-print-types.h" - -GtkWidget *e_contact_print_dialog_new(EBook *book, char *query); -void e_contact_print_preview(EBook *book, char *query); -GtkWidget *e_contact_print_contact_dialog_new(EContact *card); -GtkWidget *e_contact_print_contact_list_dialog_new(GList *list); - -#endif /* E_CONTACT_PRINT_H */ diff --git a/addressbook/printing/medbook.ecps b/addressbook/printing/medbook.ecps deleted file mode 100644 index ef76c0b46e..0000000000 --- a/addressbook/printing/medbook.ecps +++ /dev/null @@ -1,30 +0,0 @@ -<style> -<title/> -<type>cards</type> -<sections_start_new_page>FALSE</sections_start_new_page> -<num_columns>2</num_columns> -<blank_forms>2</blank_forms> -<letter_tabs>TRUE</letter_tabs> -<letter_headings>TRUE</letter_headings> -<headings_font>Helvetica Bold 12</headings_font> -<body_font>Helvetica 8</body_font> -<print_using_grey>TRUE</print_using_grey> -<paper_width>8.5</paper_width> -<paper_height>11</paper_height> -<top_margin>0.5</top_margin> -<left_margin>0.5</left_margin> -<bottom_margin>0.5</bottom_margin> -<right_margin>0.5</right_margin> -<page_width>8.5</page_width> -<page_height>11</page_height> -<orientation>portrait</orientation> -<header_font>Helvetica 8</header_font> -<left_header/> -<center_header/> -<right_header/> -<footer_font>Helvetica 8</footer_font> -<left_footer/> -<center_footer>[Page #]</center_footer> -<right_footer/> -<reverse_on_even_pages>FALSE</reverse_on_even_pages> -</style> diff --git a/addressbook/printing/phonelist.ecps b/addressbook/printing/phonelist.ecps deleted file mode 100644 index 980750a6b2..0000000000 --- a/addressbook/printing/phonelist.ecps +++ /dev/null @@ -1,29 +0,0 @@ -<style> -<title/> -<type>phone_list</type> -<sections_start_new_page>FALSE</sections_start_new_page> -<num_columns>2</num_columns> -<letter_tabs>FALSE</letter_tabs> -<letter_headings>TRUE</letter_headings> -<headings_font>Helvetica Bold 10</headings_font> -<body_font>Helvetica 8</body_font> -<print_using_grey>TRUE</print_using_grey> -<paper_width>8.5</paper_width> -<paper_height>11</paper_height> -<top_margin>0.5</top_margin> -<left_margin>0.5</left_margin> -<bottom_margin>0.5</bottom_margin> -<right_margin>0.5</right_margin> -<page_width>8.5</page_width> -<page_height>11</page_height> -<orientation>portrait</orientation> -<header_font>Helvetica 8</header_font> -<left_header/> -<center_header/> -<right_header/> -<footer_font>Helvetica 8</footer_font> -<left_footer>[User Name]</left_footer> -<center_footer>[Page #]</center_footer> -<right_footer>[Date Printed]</right_footer> -<reverse_on_even_pages>FALSE</reverse_on_even_pages> -</style> diff --git a/addressbook/printing/smallbook.ecps b/addressbook/printing/smallbook.ecps deleted file mode 100644 index 0bb19aa92e..0000000000 --- a/addressbook/printing/smallbook.ecps +++ /dev/null @@ -1,30 +0,0 @@ -<style> -<title/> -<type>cards</type> -<sections_start_new_page>FALSE</sections_start_new_page> -<num_columns>1</num_columns> -<blank_forms>2</blank_forms> -<letter_tabs>TRUE</letter_tabs> -<letter_headings>TRUE</letter_headings> -<headings_font>Helvetica Bold 8</headings_font> -<body_font>Helvetica 6</body_font> -<print_using_grey>TRUE</print_using_grey> -<paper_width>8.5</paper_width> -<paper_height>11</paper_height> -<top_margin>0.5</top_margin> -<left_margin>0.5</left_margin> -<bottom_margin>0.5</bottom_margin> -<right_margin>0.5</right_margin> -<page_width>2.75</page_width> -<page_height>4.25</page_height> -<orientation>portrait</orientation> -<header_font>Helvetica 6</header_font> -<left_header/> -<center_header/> -<right_header/> -<footer_font>Helvetica 6</footer_font> -<left_footer/> -<center_footer>[Page #]</center_footer> -<right_footer/> -<reverse_on_even_pages>FALSE</reverse_on_even_pages> -</style> diff --git a/addressbook/printing/test-contact-print-style-editor.c b/addressbook/printing/test-contact-print-style-editor.c deleted file mode 100644 index f49625434e..0000000000 --- a/addressbook/printing/test-contact-print-style-editor.c +++ /dev/null @@ -1,93 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * test-contact-print-style-editor.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include <stdlib.h> -#include <gtk/gtkmain.h> -#include <libgnomeui/gnome-app.h> -#include <libgnomeui/gnome-ui-init.h> -#include <bonobo/bonobo-main.h> -#include "e-contact-print-style-editor.h" - -/* This is a horrible thing to do, but it is just a test. */ -GtkWidget *editor; - -static void destroy_callback(GtkWidget *app, gpointer data) -{ - static int count = 2; - count --; - if ( count <= 0 ) - exit(0); -} - -#if 0 -static void about_callback( GtkWidget *widget, gpointer data ) -{ - - const gchar *authors[] = - { - "Christopher James Lahey <clahey@umich.edu>", - NULL - }; - - GtkWidget *about = - gnome_about_new ( _( "Contact Print Style Editor Test" ), VERSION, - _( "Copyright (C) 2000, Ximian, Inc." ), - authors, - _( "This should test the contact print style editor widget" ), - NULL); - gtk_widget_show (about); -} -#endif - -int main( int argc, char *argv[] ) -{ - GtkWidget *app; - - /* bindtextdomain (PACKAGE, GNOMELOCALEDIR); - textdomain (PACKAGE);*/ - - gnome_program_init ("Contact Print Style Editor Test", VERSION, - LIBGNOMEUI_MODULE, - argc, argv, - NULL); - - glade_init (); - - app = gnome_app_new("Contact Print Style Editor Test", NULL); - - editor = e_contact_print_style_editor_new(""); - - gnome_app_set_contents( GNOME_APP( app ), editor ); - - /* Connect the signals */ - g_signal_connect( app, "destroy", - G_CALLBACK ( destroy_callback ), - ( gpointer ) app ); - - gtk_widget_show_all( app ); - - bonobo_main(); - - /* Not reached. */ - return 0; -} diff --git a/addressbook/printing/test-print.c b/addressbook/printing/test-print.c deleted file mode 100644 index a1dede7bde..0000000000 --- a/addressbook/printing/test-print.c +++ /dev/null @@ -1,88 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * test-print.c - * Copyright (C) 2000 Ximian, Inc. - * Author: Chris Lahey <clahey@ximian.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include <stdlib.h> -#include <gtk/gtkmain.h> -#include <libgnomeui/gnome-dialog.h> -#include <libgnomeui/gnome-ui-init.h> -#include <glade/glade.h> -#include <bonobo/bonobo-main.h> -#include "e-contact-print.h" - -/* This is a horrible thing to do, but it is just a test. */ -GtkWidget *print; - -static gint test_close(GnomeDialog *dialog, gpointer data) -{ - exit(0); - return 1; -} - -#if 0 -static void about_callback( GtkWidget *widget, gpointer data ) -{ - - const gchar *authors[] = - { - "Christopher James Lahey <clahey@umich.edu>", - NULL - }; - - GtkWidget *about = - gnome_about_new ( _( "Contact Print Test" ), VERSION, - _( "Copyright (C) 2000, Ximian, Inc." ), - authors, - _( "This should test the contact print code" ), - NULL); - gtk_widget_show (about); -} -#endif - -int main( int argc, char *argv[] ) -{ - GList *shown_fields = NULL; - - /* bindtextdomain (PACKAGE, GNOMELOCALEDIR); - textdomain (PACKAGE);*/ - - gnome_program_init ("Contact Print Test", VERSION, - LIBGNOMEUI_MODULE, - argc, argv, - NULL); - - glade_init (); - - shown_fields = g_list_append(shown_fields, "First field"); - shown_fields = g_list_append(shown_fields, "Second field"); - shown_fields = g_list_append(shown_fields, "Third field"); - shown_fields = g_list_append(shown_fields, "Fourth field"); - - print = e_contact_print_dialog_new(NULL, NULL); - gtk_widget_show_all(print); - g_signal_connect(print, "close", G_CALLBACK(test_close), NULL); - - bonobo_main(); - - /* Not reached. */ - return 0; -} diff --git a/addressbook/tools/.cvsignore b/addressbook/tools/.cvsignore deleted file mode 100644 index 25963ae030..0000000000 --- a/addressbook/tools/.cvsignore +++ /dev/null @@ -1,5 +0,0 @@ -Makefile -Makefile.in -evolution-addressbook-export -evolution-addressbook-abuse -evolution-addressbook-clean diff --git a/addressbook/tools/Makefile.am b/addressbook/tools/Makefile.am deleted file mode 100644 index c925cb5e05..0000000000 --- a/addressbook/tools/Makefile.am +++ /dev/null @@ -1,39 +0,0 @@ -privlibexec_SCRIPTS = \ - csv2vcard \ - evolution-addressbook-clean - -privlibexec_PROGRAMS = \ - evolution-addressbook-export - -INCLUDES = \ - -DG_LOG_DOMAIN=\"evolution-addressbook-tools\" \ - -I$(top_srcdir) \ - -I$(top_builddir) \ - -DEVOLUTION_LOCALEDIR=\""$(localedir)"\" \ - -DPREFIX=\""$(prefix)"\" \ - -DSYSCONFDIR=\""$(sysconfdir)"\" \ - -DDATADIR=\""$(datadir)"\" \ - -DLIBDIR=\""$(libdir)"\" \ - -I$(top_srcdir)/addressbook \ - -I$(top_builddir)/addressbook \ - $(EVOLUTION_ADDRESSBOOK_CFLAGS) - -evolution_addressbook_export_SOURCES = \ - evolution-addressbook-export.c \ - evolution-addressbook-export-list-cards.c \ - evolution-addressbook-export-list-folders.c \ - evolution-addressbook-export.h - -evolution_addressbook_export_LDADD = \ - $(EVOLUTION_ADDRESSBOOK_LIBS) - -EXTRA_DIST = $(privlibexec_SCRIPTS) \ - evolution-addressbook-clean.in - -CLEANFILES= evolution-addressbook-clean - -evolution-addressbook-clean: evolution-addressbook-clean.in Makefile -## Use sed and then mv to avoid problems if the user interrupts. - sed -e 's?\@EVOLUTION_TOOLSDIR\@?$(privlibexecdir)?g' \ - < $(srcdir)/evolution-addressbook-clean.in > evolution-addressbook-clean.tmp \ - && mv evolution-addressbook-clean.tmp evolution-addressbook-clean diff --git a/addressbook/tools/csv2vcard b/addressbook/tools/csv2vcard deleted file mode 100755 index b968fbd9c3..0000000000 --- a/addressbook/tools/csv2vcard +++ /dev/null @@ -1,236 +0,0 @@ -#!/usr/bin/perl -w -# -# cvs2vcard - Script to convert Outlook CSV files into VCard files -# suitable to be imported into Evolution. -# -# Copyright (C) 2001 Ximian, Inc. -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of version 2 of the GNU General Public -# License as published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public -# License along with this program; if not, write to the -# Free Software Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. -# -# Author: Michael MacDonald <mjmac@ximian.com> -# - -use strict; -use diagnostics; -use Text::ParseWords; - -sub usage -{ - print STDERR << "--EndOfUsage"; - -Takes a CSV-formatted list of contacts from Outlook and attempts to -convert it into a list of VCards suitable for import into Evolution. - -Usage: $0 [infile outfile] - ---EndOfUsage - - exit; -} - -sub is_recognized_format -{ - my $line = shift; - - # Making some assumptions here... Prolly OK. - return $line =~ /(First Name|Middle Name|Last Name)/; -} - -sub map_columns -{ - my $line = shift; - - my @names = parse_line(',', 0, $line); - - my $ctr = 0; - my %fieldmap = map { $_ => $ctr++ } @names; - - return %fieldmap; -} - -sub build_vcard_attr_from_def -{ - my ($def, $fields, $map) = @_; - - # Valid chars for lookup (from Outlook CSV) are - # A-Za-z0-9_-'/ - # Valid chars for formatting of attr are - # \s,| - my @lookup = map { s/=0A$//; s/[^\w\s\-'\/]//; $_; } split /[\s,]*\|[\s,]*/, $def; - - foreach my $el (@lookup) { - unless (defined($map->{ $el })) { - print STDERR "$el is undefined\n"; - next; - } - if (defined($fields->[$map->{ $el }])) { - unless ($fields->[$map->{ $el }] =~ /(^$|0\/0\/00)/) { - $def =~ s/$el/$fields->[$map->{ $el }]/; - } else { - $def =~ s/((?<=\|)\s*)?$el(\s*?(?=\|))?(=0A)?,?//; - } - } else { - $def =~ s/((?<=\|)\s*)?$el(\s*?(?=\|))?(=0A)?,?//; - } - } - # Get rid of field delimiters - $def =~ s/\|//g; - # Snip off any trailing semicolons or whitespace - $def =~ s/[\s;]*$//; - - return $def; -} - -sub build_vcard_from_line { - my ($line, %map) = @_; - my %vcard; - - my @fields = parse_line(',', 0, $line); - - my %vcard_def = ( FN => 'Title |First Name |Middle Name |Last Name |Suffix', - N => 'Last Name| Suffix|;First Name|;Middle Name|;Title', - 'ADR;WORK' => 'PO Box|;Business Street 2|;Business Street|;Business City|;Business State|;Business Postal Code|;Business Country', - 'LABEL;QUOTED-PRINTABLE;WORK' => 'PO Box |Business Street=0A|Business Street 2=0A|Business City,| Business State| Business Postal Code=0A|Business Country', - 'TEL;WORK;VOICE' => 'Business Phone', - 'TEL;WORK;VOICE2' => 'Business Phone 2', - 'TEL;WORK;FAX' => 'Business Fax', - 'TEL;WORK;COMPANY' => 'Company Main Phone', - 'ADR;HOME' => ';Home Street 2|;Home Street|;Home City|;Home State|;Home Postal Code|;Home Country', - 'LABEL;QUOTED-PRINTABLE;HOME' => 'Home Street=0A|Home Street 2=0A|Home City,| Home State| Home Postal Code=0A|Home Country', - 'TEL;HOME;VOICE' => 'Home Phone', - 'TEL;HOME;VOICE2' => 'Home Phone 2', - 'TEL;HOME;FAX' => 'Home Fax', - 'ADR;POSTAL' => ';Other Street 2|;Other Street|;Other City|;Other State|;Other Postal Code|;Other Country', - 'LABEL;QUOTED-PRINTABLE;POSTAL' => 'Other Street=0A|Other Street 2=0A|Other City,| Other State| Other Postal Code=0A|Other Country', - 'TEL;VOICE' => 'Other Phone', - 'TEL;FAX' => 'Other Fax', - 'TEL;CELL' => 'Mobile Phone', - 'TEL;CAR' => 'Car Phone', - 'TEL;PAGER' => 'Pager', - 'TEL;PREF' => 'Primary Phone', - 'TEL;ISDN' => 'ISDN', - 'TEL;X-EVOLUTION-CALLBACK' => 'Callback', - 'TEL;X-EVOLUTION-TTYTDD' => 'TTY/TDD Phone', - 'TEL;X-EVOLUTION-TELEX' => 'Telex', - 'TEL;X-EVOLUTION-RADIO' => 'Radio Phone', - 'EMAIL;INTERNET' => 'E-mail Address', - 'EMAIL;INTERNET2' => 'E-mail 2 Address', - 'EMAIL;INTERNET3' => 'E-mail 3 Address', - ORG => 'Company|;Department', - TITLE => 'Job Title', - ROLE => 'Profession', - 'X-EVOLUTION-ASSISTANT' => "Assistant's Name", - 'TEL;X-EVOLUTION-ASSISTANT' => "Assistant's Phone", - 'X-EVOLUTION-SPOUSE' => 'Spouse', - 'X-EVOLUTION-ANNIVERSARY' => 'Anniversary', - 'X-EVOLUTION-MANAGER' => "Manager's Name", - 'X-EVOLUTION-OFFICE' => 'Office Location', - BDAY => 'Birthday', - NOTE => 'Notes', - FBURL => 'Internet Free Busy', - URL => 'Web Page', - ); - - foreach my $key (keys(%vcard_def)) { - my $attr = build_vcard_attr_from_def($vcard_def{ $key }, \@fields, \%map); - if (defined($attr)) { - $vcard{ $key } = $attr unless ($attr =~ /^$/); - } - } - - return %vcard; -} - -sub print_vcard_to_fh -{ - my ($fh, %vcard) = @_; - - print $fh "BEGIN:VCARD\n"; - foreach my $key (keys(%vcard)) { - # Dirty hack because Evolution's vcard stores multiple email addrs - # with same sttribute, hence key collision. Bleah. - # Ugh! Same deal for multiple phones... (eg. bus. phone) - # - # And finally, while we're special-casing... Outlook exports dates - # differently, so munge 'em if we find 'em. - if ($key =~ /EMAIL;INTERNET/o) { - (my $temp = $key) =~ s/\d$//; - print $fh "$temp:$vcard{ $key }\n"; - } elsif ($key =~ /TEL;(HOME|WORK)/o) { - (my $temp = $key) =~ s/\d$//; - print $fh "$temp:$vcard{ $key }\n"; - } elsif ($key =~ /(BDAY|X\-EVOLUTION\-ANNIVERSARY)/o) { - my $temp = $vcard{ $key }; - if ($temp =~ /(\d\d)\/(\d\d)\/(\d\d)/) { - # Y2k !! MS Didn't learn anything. - # Hope no one was born before 1915 - if ((1900 + $3) < 1915) { - print $fh "$key:20$3-$1-$2\n"; - } else { - print $fh "$key:19$3-$1-$2\n"; - } - } else { - # Something's funky... Just delete the attribute - print STDERR "Couldn't figure out what to do with $key:$vcard{ $key }\n"; - delete($vcard{ $key }); - } - } else { - print $fh "$key:$vcard{ $key }\n"; - } - } - print $fh "END:VCARD\n\n"; -} - -my $in = $ARGV[0]; -my $out = $ARGV[1]; - -usage() unless(defined($in) && defined($out)); - -open (IN, $in) - or die "Can't open($in): $!\n"; - -open (OUT, ">$out") - or die "Can't open($out): $!\n"; - -my $linectr = 0; -my %map; - -while (my $line = <IN>) { - $line =~ s/\r//g; - $line =~ s/\n$//; - if ($linectr == 0) { - $linectr++; - usage() unless is_recognized_format($line); - %map = map_columns($line); - #if ($line =~ /\r\n$/) { - # print STDERR "Apparenlty found DOS-style EOL indicators...\n"; - $/ = "\r\n"; - #} - } else { - $linectr++; - while ($line =~ /^(("([^"]|\n|"")*")?,)*"([^"]|\n|"")*$/) { - my $temp = $line; - $line = <IN>; - $line =~ s/\r//g; - $line =~ s/\n$//; - $line = "$temp $line"; - } - my %vcard = build_vcard_from_line($line, %map); - print_vcard_to_fh(\*OUT, %vcard); - } -} - -close(IN); -close(OUT); diff --git a/addressbook/tools/evolution-addressbook-abuse.c b/addressbook/tools/evolution-addressbook-abuse.c deleted file mode 100644 index 3446e15938..0000000000 --- a/addressbook/tools/evolution-addressbook-abuse.c +++ /dev/null @@ -1,91 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -#include <config.h> - -#include <bonobo/bonobo-main.h> - -#include <backend/ebook/e-book.h> -#include <gnome.h> - -#define CONTACTS_TO_ADD 2000 - -static gchar * -make_random_string (void) -{ - const gchar *elements = " abcdefghijklmnopqrstuvwxyz1234567890 ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - gint len = strlen (elements); - gint i, N = 5 + (random () % 10); - gchar *str = g_malloc (N+1); - - for (i = 0; i < N; ++i) { - str[i] = elements[random () % len]; - } - str[i] = '\0'; - - return str; -} - -static gchar * -make_random_vcard (void) -{ - gchar *fa = make_random_string (); - gchar *name = make_random_string (); - gchar *email = make_random_string (); - gchar *org = make_random_string (); - - gchar *vcard; - - vcard = g_strdup_printf ("BEGIN:VCARD\n" - "X-EVOLUTION-FILE-AS:%s\n" - "N:%s\n" - "EMAIL;INTERNET:%s\n" - "ORG:%s\n" - "END:VCARD", - fa, name, email, org); - g_free (fa); - g_free (name); - g_free (email); - g_free (org); - - return vcard; -} - -int -main (int argc, char *argv[]) -{ - EBook *book; - int i; - - if (getenv ("ABUSE_THE_WOMBAT") == NULL) { - g_print ("You probably don't want to use this program.\n" - "It isn't very nice.\n"); - exit(0); - } - - bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR); - textdomain (GETTEXT_PACKAGE); - - gnome_program_init ("evolution-addressbook-abuse", VERSION, - LIBGNOMEUI_MODULE, argc, argv, - GNOME_PROGRAM_STANDARD_PROPERTIES, - NULL); - - if (!e_book_get_default_addressbook (&book, NULL)) { - g_warning ("couldn't open addressbook"); - exit (1); - } - - for (i = 0; i < CONTACTS_TO_ADD; ++i) { - gchar *vcard = make_random_vcard (); - EContact *contact = e_contact_new_from_vcard (vcard); - g_message ("adding %d", i); - if (!e_book_add_contact (book, contact, NULL)) { - g_warning ("something went wrong..."); - exit (1); - } - g_free (vcard); - g_object_unref (contact); - } - - return 0; -} diff --git a/addressbook/tools/evolution-addressbook-clean.in b/addressbook/tools/evolution-addressbook-clean.in deleted file mode 100644 index b7ee7ba167..0000000000 --- a/addressbook/tools/evolution-addressbook-clean.in +++ /dev/null @@ -1,24 +0,0 @@ -#! /usr/bin/perl -w - -sub do_system -{ - my ($command) = @_; - system ($command); - if ($? != 0) { - die "Command failed: $command"; - } -} - -$filename = `@EVOLUTION_TOOLSDIR@/evolution-addressbook-export`; -if ($? != 0) { - $! = $?; - die $!; -} - -$HOME = $ENV{"HOME"}; - -system ("@EVOLUTION_TOOLSDIR@/killev"); -do_system ("/bin/mv ${HOME}/evolution/local/Contacts/addressbook.db ${HOME}/evolution/local/Contacts/addressbook-backup.db"); -do_system ("@EVOLUTION_TOOLSDIR@/evolution-addressbook-import --input-file $filename"); -do_system ("/bin/rm $filename"); - diff --git a/addressbook/tools/evolution-addressbook-export-list-cards.c b/addressbook/tools/evolution-addressbook-export-list-cards.c deleted file mode 100644 index 88923fd244..0000000000 --- a/addressbook/tools/evolution-addressbook-export-list-cards.c +++ /dev/null @@ -1,796 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-addressbook-export-list-cards.c - * - * Copyright (C) 2003 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Gilbert Fang <gilbert.fang@sun.com> - * - */ - -#include <config.h> - -#include <string.h> -#include <sys/types.h> -#include <unistd.h> - -#include <glib.h> -#include <bonobo-activation/bonobo-activation.h> -#include <libbonobo.h> -#include <libgnome/libgnome.h> - -#include <libebook/e-book.h> -#include <libebook/e-contact.h> - -#include "evolution-addressbook-export.h" - -#define COMMA_SEPARATOR "," - -typedef enum _CARD_FORMAT CARD_FORMAT; -typedef enum _DeliveryAddressField DeliveryAddressField; -typedef enum _EContactFieldCSV EContactFieldCSV; -typedef struct _EContactCSVFieldData EContactCSVFieldData; - -enum _CARD_FORMAT -{ - CARD_FORMAT_CSV, - CARD_FORMAT_VCARD -}; - -enum _DeliveryAddressField -{ - DELIVERY_ADDRESS_STREET, - DELIVERY_ADDRESS_EXT, - DELIVERY_ADDRESS_LOCALITY, - DELIVERY_ADDRESS_REGION, - DELIVERY_ADDRESS_CODE, - DELIVERY_ADDRESS_COUNTRY -}; - -enum _EContactFieldCSV -{ - E_CONTACT_CSV_FILE_AS, - E_CONTACT_CSV_FULL_NAME, - E_CONTACT_CSV_EMAIL, - E_CONTACT_CSV_PHONE_PRIMARY, - E_CONTACT_CSV_PHONE_ASSISTANT, - E_CONTACT_CSV_PHONE_BUSINESS, - E_CONTACT_CSV_PHONE_CALLBACK, - E_CONTACT_CSV_PHONE_COMPANY, - E_CONTACT_CSV_PHONE_HOME, - E_CONTACT_CSV_ORG, - /*E_CONTACT_CSV_ADDRESS_BUSINESS, */ - E_CONTACT_CSV_ADDRESS_BUSINESS_STREET, - E_CONTACT_CSV_ADDRESS_BUSINESS_EXT, - E_CONTACT_CSV_ADDRESS_BUSINESS_CITY, - E_CONTACT_CSV_ADDRESS_BUSINESS_REGION, - E_CONTACT_CSV_ADDRESS_BUSINESS_POSTCODE, - E_CONTACT_CSV_ADDRESS_BUSINESS_COUNTRY, - /*E_CONTACT_CSV_ADDRESS_HOME, */ - E_CONTACT_CSV_ADDRESS_HOME_STREET, - E_CONTACT_CSV_ADDRESS_HOME_EXT, - E_CONTACT_CSV_ADDRESS_HOME_CITY, - E_CONTACT_CSV_ADDRESS_HOME_REGION, - E_CONTACT_CSV_ADDRESS_HOME_POSTCODE, - E_CONTACT_CSV_ADDRESS_HOME_COUNTRY, - E_CONTACT_CSV_PHONE_MOBILE, - E_CONTACT_CSV_PHONE_CAR, - E_CONTACT_CSV_PHONE_BUSINESS_FAX, - E_CONTACT_CSV_PHONE_HOME_FAX, - E_CONTACT_CSV_PHONE_BUSINESS_2, - E_CONTACT_CSV_PHONE_HOME_2, - E_CONTACT_CSV_PHONE_ISDN, - E_CONTACT_CSV_PHONE_OTHER, - E_CONTACT_CSV_PHONE_OTHER_FAX, - E_CONTACT_CSV_PHONE_PAGER, - E_CONTACT_CSV_PHONE_RADIO, - E_CONTACT_CSV_PHONE_TELEX, - E_CONTACT_CSV_PHONE_TTYTDD, - /*E_CONTACT_CSV_ADDRESS_OTHER, */ - E_CONTACT_CSV_ADDRESS_OTHER_STREET, - E_CONTACT_CSV_ADDRESS_OTHER_EXT, - E_CONTACT_CSV_ADDRESS_OTHER_CITY, - E_CONTACT_CSV_ADDRESS_OTHER_REGION, - E_CONTACT_CSV_ADDRESS_OTHER_POSTCODE, - E_CONTACT_CSV_ADDRESS_OTHER_COUNTRY, - E_CONTACT_CSV_EMAIL_2, - E_CONTACT_CSV_EMAIL_3, - E_CONTACT_CSV_HOMEPAGE_URL, - E_CONTACT_CSV_ORG_UNIT, - E_CONTACT_CSV_OFFICE, - E_CONTACT_CSV_TITLE, - E_CONTACT_CSV_ROLE, - E_CONTACT_CSV_MANAGER, - E_CONTACT_CSV_ASSISTANT, - E_CONTACT_CSV_NICKNAME, - E_CONTACT_CSV_SPOUSE, - E_CONTACT_CSV_NOTE, - E_CONTACT_CSV_CALENDAR_URI, - E_CONTACT_CSV_FREEBUSY_URL, - /*E_CONTACT_CSV_ANNIVERSARY, */ - E_CONTACT_CSV_ANNIVERSARY_YEAR, - E_CONTACT_CSV_ANNIVERSARY_MONTH, - E_CONTACT_CSV_ANNIVERSARY_DAY, - /*E_CONTACT_CSV_BIRTH_DATE, */ - E_CONTACT_CSV_BIRTH_DATE_YEAR, - E_CONTACT_CSV_BIRTH_DATE_MONTH, - E_CONTACT_CSV_BIRTH_DATE_DAY, - E_CONTACT_CSV_MAILER, - E_CONTACT_CSV_NAME_OR_ORG, - E_CONTACT_CSV_CATEGORIES, - E_CONTACT_CSV_FAMILY_NAME, - E_CONTACT_CSV_GIVEN_NAME, - E_CONTACT_CSV_WANTS_HTML, - E_CONTACT_CSV_IS_LIST, - E_CONTACT_CSV_LAST -}; - -struct _EContactCSVFieldData -{ - gint csv_field; - gint contact_field; - gchar *csv_name; -}; - -#define NOMAP -1 -static EContactCSVFieldData csv_field_data[] = { - {E_CONTACT_CSV_FILE_AS, E_CONTACT_FILE_AS, ""}, - {E_CONTACT_CSV_FULL_NAME, E_CONTACT_CSV_FULL_NAME, ""}, - {E_CONTACT_CSV_EMAIL, E_CONTACT_EMAIL, ""}, - {E_CONTACT_CSV_PHONE_PRIMARY, E_CONTACT_PHONE_PRIMARY, - ""}, - {E_CONTACT_CSV_PHONE_ASSISTANT, - E_CONTACT_PHONE_ASSISTANT, ""}, - {E_CONTACT_CSV_PHONE_BUSINESS, - E_CONTACT_PHONE_BUSINESS, ""}, - {E_CONTACT_CSV_PHONE_CALLBACK, - E_CONTACT_PHONE_CALLBACK, ""}, - {E_CONTACT_CSV_PHONE_COMPANY, E_CONTACT_PHONE_COMPANY, - ""}, - {E_CONTACT_CSV_PHONE_HOME, E_CONTACT_PHONE_HOME, ""}, - {E_CONTACT_CSV_ORG, E_CONTACT_ORG, ""}, - /*E_CONTACT_CSV_ADDRESS_BUSINESS, */ - {E_CONTACT_CSV_ADDRESS_BUSINESS_STREET, NOMAP, - "Business Address"}, - {E_CONTACT_CSV_ADDRESS_BUSINESS_EXT, NOMAP, - "Business Address2"}, - {E_CONTACT_CSV_ADDRESS_BUSINESS_CITY, NOMAP, - "Business Address City"}, - {E_CONTACT_CSV_ADDRESS_BUSINESS_REGION, NOMAP, - "Business Address State"}, - {E_CONTACT_CSV_ADDRESS_BUSINESS_POSTCODE, NOMAP, - "Business Address PostCode"}, - {E_CONTACT_CSV_ADDRESS_BUSINESS_COUNTRY, NOMAP, - "Business Address Country"}, - /*E_CONTACT_CSV_ADDRESS_HOME, */ - {E_CONTACT_CSV_ADDRESS_HOME_STREET, NOMAP, "Home Address"}, - {E_CONTACT_CSV_ADDRESS_HOME_EXT, NOMAP, "Home Address2"}, - {E_CONTACT_CSV_ADDRESS_HOME_CITY, NOMAP, "Home Address City"}, - {E_CONTACT_CSV_ADDRESS_HOME_REGION, NOMAP, - "Home Address State"}, - {E_CONTACT_CSV_ADDRESS_HOME_POSTCODE, NOMAP, - "Home Address PostCode"}, - {E_CONTACT_CSV_ADDRESS_HOME_COUNTRY, NOMAP, - "Home Address Country"}, - {E_CONTACT_CSV_PHONE_MOBILE, E_CONTACT_PHONE_MOBILE, - ""}, - {E_CONTACT_CSV_PHONE_CAR, E_CONTACT_PHONE_CAR, ""}, - {E_CONTACT_CSV_PHONE_BUSINESS_FAX, - E_CONTACT_PHONE_BUSINESS_FAX, ""}, - {E_CONTACT_CSV_PHONE_HOME_FAX, - E_CONTACT_PHONE_HOME_FAX, ""}, - {E_CONTACT_CSV_PHONE_BUSINESS_2, - E_CONTACT_PHONE_BUSINESS_2, ""}, - {E_CONTACT_CSV_PHONE_HOME_2, E_CONTACT_PHONE_HOME_2, - ""}, - {E_CONTACT_CSV_PHONE_ISDN, E_CONTACT_PHONE_ISDN, ""}, - {E_CONTACT_CSV_PHONE_OTHER, E_CONTACT_PHONE_OTHER, ""}, - {E_CONTACT_CSV_PHONE_OTHER_FAX, - E_CONTACT_PHONE_OTHER_FAX, ""}, - {E_CONTACT_CSV_PHONE_PAGER, E_CONTACT_PHONE_PAGER, ""}, - {E_CONTACT_CSV_PHONE_RADIO, E_CONTACT_PHONE_RADIO, ""}, - {E_CONTACT_CSV_PHONE_TELEX, E_CONTACT_PHONE_TELEX, ""}, - {E_CONTACT_CSV_PHONE_TTYTDD, E_CONTACT_PHONE_TTYTDD, - ""}, - /*E_CONTACT_CSV_ADDRESS_OTHER, */ - {E_CONTACT_CSV_ADDRESS_OTHER_STREET, NOMAP, "Other Address"}, - {E_CONTACT_CSV_ADDRESS_OTHER_EXT, NOMAP, "Other Address2"}, - {E_CONTACT_CSV_ADDRESS_OTHER_CITY, NOMAP, - "Other Address City"}, - {E_CONTACT_CSV_ADDRESS_OTHER_REGION, NOMAP, - "Other Address State"}, - {E_CONTACT_CSV_ADDRESS_OTHER_POSTCODE, NOMAP, - "Other Address PostCode"}, - {E_CONTACT_CSV_ADDRESS_OTHER_COUNTRY, NOMAP, - "Other Address Country"}, - {E_CONTACT_CSV_EMAIL_2, E_CONTACT_EMAIL_2, ""}, - {E_CONTACT_CSV_EMAIL_3, E_CONTACT_EMAIL_3, ""}, - {E_CONTACT_CSV_HOMEPAGE_URL, E_CONTACT_HOMEPAGE_URL, ""}, - {E_CONTACT_CSV_ORG_UNIT, E_CONTACT_ORG_UNIT, ""}, - {E_CONTACT_CSV_OFFICE, E_CONTACT_OFFICE, ""}, - {E_CONTACT_CSV_TITLE, E_CONTACT_TITLE, ""}, - {E_CONTACT_CSV_ROLE, E_CONTACT_ROLE, ""}, - {E_CONTACT_CSV_MANAGER, E_CONTACT_MANAGER, ""}, - {E_CONTACT_CSV_ASSISTANT, E_CONTACT_ASSISTANT, ""}, - {E_CONTACT_CSV_NICKNAME, E_CONTACT_NICKNAME, ""}, - {E_CONTACT_CSV_SPOUSE, E_CONTACT_SPOUSE, ""}, - {E_CONTACT_CSV_NOTE, E_CONTACT_NOTE, ""}, - {E_CONTACT_CSV_CALENDAR_URI, E_CONTACT_CALENDAR_URI, ""}, - {E_CONTACT_CSV_FREEBUSY_URL, E_CONTACT_FREEBUSY_URL, ""}, - /*E_CONTACT_ANNIVERSARY, */ - {E_CONTACT_CSV_ANNIVERSARY_YEAR, NOMAP, "Anniversary Year"}, - {E_CONTACT_CSV_ANNIVERSARY_MONTH, NOMAP, "Anniversary Month"}, - {E_CONTACT_CSV_ANNIVERSARY_DAY, NOMAP, "Anniversary Day"}, - /*E_CONTACT_BIRTH_DATE, */ - {E_CONTACT_CSV_BIRTH_DATE_YEAR, NOMAP, "Birth Year"}, - {E_CONTACT_CSV_BIRTH_DATE_MONTH, NOMAP, "Birth Month"}, - {E_CONTACT_CSV_BIRTH_DATE_DAY, NOMAP, "Birth Day"}, - {E_CONTACT_CSV_MAILER, E_CONTACT_MAILER, ""}, - {E_CONTACT_CSV_NAME_OR_ORG, E_CONTACT_NAME_OR_ORG, ""}, - {E_CONTACT_CSV_CATEGORIES, E_CONTACT_CATEGORIES, ""}, - {E_CONTACT_CSV_FAMILY_NAME, E_CONTACT_FAMILY_NAME, ""}, - {E_CONTACT_CSV_GIVEN_NAME, E_CONTACT_GIVEN_NAME, ""}, - {E_CONTACT_CSV_WANTS_HTML, E_CONTACT_WANTS_HTML, ""}, - {E_CONTACT_CSV_IS_LIST, E_CONTACT_IS_LIST, ""}, - {E_CONTACT_CSV_LAST, NOMAP, ""} - -}; - -static GSList *pre_defined_fields; - -/*function prototypes*/ -gint e_contact_csv_get_contact_field (EContactFieldCSV csv_field); -gchar *e_contact_csv_get_name (EContactFieldCSV csv_field); -gchar *e_contact_csv_get (EContact * contact, EContactFieldCSV csv_field); -gchar *e_contact_csv_get_header_line (GSList * csv_all_fields); -gchar *e_contact_to_csv (EContact * contact, GSList * csv_all_fields); -gchar *e_contact_get_csv (EContact * contact, GSList * csv_all_fields); -gchar *delivery_address_get_sub_field (const EContactAddress * delivery_address, DeliveryAddressField sub_field); -gchar *check_null_pointer (gchar * orig); -gchar *escape_string (gchar * orig); -int output_n_cards_file (FILE * outputfile, GList *contacts, int size, int begin_no, CARD_FORMAT format); -static void fork_to_background (void); -void set_pre_defined_field (GSList ** pre_defined_fields); -guint action_list_cards_init (ActionContext * p_actctx); - - -/* function declarations*/ -gint -e_contact_csv_get_contact_field (EContactFieldCSV csv_field) -{ - return csv_field_data[csv_field].contact_field; -} - -gchar * -e_contact_csv_get_name (EContactFieldCSV csv_field) -{ - gint contact_field; - gchar *name; - gchar *quoted_name; - - contact_field = e_contact_csv_get_contact_field (csv_field); - - if (contact_field != NOMAP) { - name = g_strdup (e_contact_field_name (contact_field)); - } else { - name = g_strdup (csv_field_data[csv_field].csv_name); - } - quoted_name = escape_string (name); - g_free (name); - return quoted_name; -} - - -gchar * -e_contact_csv_get (EContact * contact, EContactFieldCSV csv_field) -{ - gint contact_field; - gchar *field_value; - gchar *quoted_field_value; - - EContactAddress *delivery_address = NULL; - EContactDate *date; - - contact_field = e_contact_csv_get_contact_field (csv_field); - - if (contact_field != NOMAP) { - field_value = e_contact_get (contact, contact_field); - } else { - - switch (csv_field) { - case E_CONTACT_CSV_ADDRESS_HOME_STREET: - delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_HOME); - field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_STREET); - break; - case E_CONTACT_CSV_ADDRESS_HOME_EXT: - delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_HOME); - field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_EXT); - break; - case E_CONTACT_CSV_ADDRESS_HOME_CITY: - delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_HOME); - field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_LOCALITY); - break; - case E_CONTACT_CSV_ADDRESS_HOME_REGION: - delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_HOME); - field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_REGION); - break; - case E_CONTACT_CSV_ADDRESS_HOME_POSTCODE: - delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_HOME); - field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_CODE); - break; - case E_CONTACT_CSV_ADDRESS_HOME_COUNTRY: - delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_HOME); - field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_COUNTRY); - break; - case E_CONTACT_CSV_ADDRESS_BUSINESS_STREET: - delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_WORK); - field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_STREET); - break; - case E_CONTACT_CSV_ADDRESS_BUSINESS_EXT: - delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_WORK); - field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_EXT); - break; - case E_CONTACT_CSV_ADDRESS_BUSINESS_CITY: - delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_WORK); - field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_LOCALITY); - break; - case E_CONTACT_CSV_ADDRESS_BUSINESS_REGION: - delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_WORK); - field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_REGION); - break; - case E_CONTACT_CSV_ADDRESS_BUSINESS_POSTCODE: - delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_WORK); - field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_CODE); - break; - case E_CONTACT_CSV_ADDRESS_BUSINESS_COUNTRY: - delivery_address = e_contact_get (contact, E_CONTACT_ADDRESS_WORK); - field_value = delivery_address_get_sub_field (delivery_address, DELIVERY_ADDRESS_COUNTRY); - break; - case E_CONTACT_CSV_BIRTH_DATE_YEAR: - date = e_contact_get (contact, E_CONTACT_BIRTH_DATE); - if (date) { - field_value = g_strdup_printf ("%04d", date->year); - e_contact_date_free (date); - } - else { - field_value = g_strdup (""); - } - break; - - case E_CONTACT_CSV_BIRTH_DATE_MONTH: - date = e_contact_get (contact, E_CONTACT_BIRTH_DATE); - if (date) { - field_value = g_strdup_printf ("%04d", date->month); - e_contact_date_free (date); - } - else { - field_value = g_strdup (""); - } - break; - - case E_CONTACT_CSV_BIRTH_DATE_DAY: - date = e_contact_get (contact, E_CONTACT_BIRTH_DATE); - if (date) { - field_value = g_strdup_printf ("%04d", date->day); - e_contact_date_free (date); - } - else { - field_value = g_strdup (""); - } - break; - - default: - field_value = g_strdup (""); - } - } - - /*checking to avoid the NULL pointer */ - if (field_value == NULL) - field_value = g_strdup (""); - - quoted_field_value = escape_string (field_value); - g_free (field_value); - - if (delivery_address) - e_contact_address_free (delivery_address); - - return quoted_field_value; -} - - -gchar * -e_contact_csv_get_header_line (GSList * csv_all_fields) -{ - - guint field_number; - gint csv_field; - gchar **field_name_array; - gchar *header_line; - - gint loop_counter; - - field_number = g_slist_length (csv_all_fields); - field_name_array = g_new0 (gchar *, field_number + 1); - - for (loop_counter = 0; loop_counter < field_number; loop_counter++) { - csv_field = GPOINTER_TO_INT (g_slist_nth_data (csv_all_fields, loop_counter)); - *(field_name_array + loop_counter) = e_contact_csv_get_name (csv_field); - } - - header_line = g_strjoinv (COMMA_SEPARATOR, field_name_array); - - for (loop_counter = 0; loop_counter < field_number; loop_counter++) { - g_free (*(field_name_array + loop_counter)); - } - g_free (field_name_array); - - return header_line; - -} - - -gchar * -e_contact_to_csv (EContact * contact, GSList * csv_all_fields) -{ - guint field_number; - gint csv_field; - gchar **field_value_array; - gchar *aline; - - gint loop_counter; - - field_number = g_slist_length (csv_all_fields); - field_value_array = g_new0 (gchar *, field_number + 1); - - for (loop_counter = 0; loop_counter < field_number; loop_counter++) { - csv_field = GPOINTER_TO_INT (g_slist_nth_data (csv_all_fields, loop_counter)); - *(field_value_array + loop_counter) = e_contact_csv_get (contact, csv_field); - } - - aline = g_strjoinv (COMMA_SEPARATOR, field_value_array); - - for (loop_counter = 0; loop_counter < field_number; loop_counter++) { - g_free (*(field_value_array + loop_counter)); - } - g_free (field_value_array); - - return aline; - -} - - -gchar * -e_contact_get_csv (EContact * contact, GSList * csv_all_fields) -{ - gchar *aline; - - aline = e_contact_to_csv (contact, csv_all_fields); - return aline; -} - - -gchar * -check_null_pointer (gchar * orig) -{ - gchar *result; - if (orig == NULL) - result = g_strdup (""); - else - result = g_strdup (orig); - return result; -} - -gchar * -delivery_address_get_sub_field (const EContactAddress * address, DeliveryAddressField sub_field) -{ - gchar *sub_field_value; - gchar *str_temp, *str_temp_a; - if (address != NULL) { - switch (sub_field) { - case DELIVERY_ADDRESS_STREET: - str_temp_a = check_null_pointer (address->po); - str_temp = check_null_pointer (address->street); - sub_field_value = g_strdup_printf ("%s %s", str_temp_a, str_temp); - g_free (str_temp); - g_free (str_temp_a); - break; - case DELIVERY_ADDRESS_EXT: - sub_field_value = check_null_pointer (address->ext); - break; - case DELIVERY_ADDRESS_LOCALITY: - sub_field_value = check_null_pointer (address->locality); - break; - case DELIVERY_ADDRESS_REGION: - sub_field_value = check_null_pointer (address->region); - break; - case DELIVERY_ADDRESS_CODE: - sub_field_value = check_null_pointer (address->code); - break; - case DELIVERY_ADDRESS_COUNTRY: - sub_field_value = check_null_pointer (address->country); - break; - default: - sub_field_value = g_strdup (""); - } - } else { - sub_field_value = g_strdup (""); - } - return sub_field_value; -} - -gchar * -escape_string (gchar *orig) -{ - const guchar *p; - gchar *dest; - gchar *q; - - if (orig == NULL) - return g_strdup ("\"\""); - - p = (guchar *) orig; - /* Each source byte needs maximally two destination chars (\n), and the extra 2 is for the leading and trailing '"' */ - q = dest = g_malloc (strlen (orig) * 2 + 1 + 2); - - *q++ = '\"'; - while (*p) - { - switch (*p) - { - case '\n': - *q++ = '\\'; - *q++ = 'n'; - break; - case '\r': - *q++ = '\\'; - *q++ = 'r'; - break; - case '\\': - *q++ = '\\'; - *q++ = '\\'; - break; - case '"': - *q++ = '"'; - *q++ = '"'; - break; - default: - *q++ = *p; - } - p++; - } - - *q++ = '\"'; - *q = 0; - - return dest; -} - -int -output_n_cards_file (FILE * outputfile, GList *contacts, int size, int begin_no, CARD_FORMAT format) -{ - int i; - if (format == CARD_FORMAT_VCARD) { - for (i = begin_no; i < size + begin_no; i++) { - EContact *contact = g_list_nth_data (contacts, i); - gchar *vcard = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30); - fprintf (outputfile, "%s\n", vcard); - g_free (vcard); - } - } else if (format == CARD_FORMAT_CSV) { - gchar *csv_fields_name = e_contact_csv_get_header_line (pre_defined_fields); - fprintf (outputfile, "%s\n", csv_fields_name); - g_free (csv_fields_name); - - for (i = begin_no; i < size + begin_no; i++) { - EContact *contact = g_list_nth_data (contacts, i); - gchar *csv = e_contact_get_csv (contact, pre_defined_fields); - fprintf (outputfile, "%s\n", csv); - g_free (csv); - } - } - - return SUCCESS; - -} - -static void -fork_to_background (void) -{ - pid_t pid; - pid = fork (); - if (pid == -1) { - /* ouch, fork() failed */ - perror ("fork"); - exit (-1); - } else if (pid == 0) { - /* child */ - /*contunue */ - - } else { - /* parent exit, note the use of _exit() instead of exit() */ - _exit (-1); - } -} - - - - -static void -action_list_cards (GList *contacts, ActionContext * p_actctx) -{ - FILE *outputfile; - long length; - int IsFirstOne; - int series_no; - gchar *file_series_name; - CARD_FORMAT format; - int size; - - length = g_list_length (contacts); - - if (length <= 0) { - g_warning ("Couldn't load addressbook correctly!!!! %s####", p_actctx->action_list_cards.addressbook_folder_uri); - exit (-1); - } - - - if (p_actctx->action_list_cards.async_mode == FALSE) { /* normal mode */ - - if (p_actctx->action_list_cards.output_file == NULL) { - outputfile = stdout; - } else { - /* fopen output file */ - if (!(outputfile = fopen (p_actctx->action_list_cards.output_file, "w"))) { - g_warning (_("Can not open file")); - exit (-1); - } - } - - if (p_actctx->action_list_cards.IsVCard == TRUE) - format = CARD_FORMAT_VCARD; - else - format = CARD_FORMAT_CSV; - - output_n_cards_file (outputfile, contacts, length, 0, format); - - if (p_actctx->action_list_cards.output_file != NULL) { - fclose (outputfile); - } - } - - - /*async mode */ - else { - - size = p_actctx->action_list_cards.file_size; - IsFirstOne = TRUE; - series_no = 0; - - do { - /* whether it is the last file */ - if ((series_no + 1) * size >= length) { /*last one */ - file_series_name = g_strdup_printf ("%s.end", p_actctx->action_list_cards.output_file); - - } else { /*next one */ - file_series_name = - g_strdup_printf ("%s.%04d", p_actctx->action_list_cards.output_file, series_no); - } - - if (!(outputfile = fopen (file_series_name, "w"))) { - g_warning (_("Can not open file")); - exit (-1); - } - - - if (p_actctx->action_list_cards.IsVCard == TRUE) - format = CARD_FORMAT_VCARD; - else - format = CARD_FORMAT_CSV; - output_n_cards_file (outputfile, contacts, size, series_no * size, format); - - fclose (outputfile); - - series_no++; - - if (IsFirstOne == TRUE) { - fork_to_background (); - IsFirstOne = FALSE; - } - - - } - while (series_no * size < length); - g_free (file_series_name); - } -} - -void -set_pre_defined_field (GSList ** pre_defined_fields) -{ - *pre_defined_fields = NULL; - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_GIVEN_NAME)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_FAMILY_NAME)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_FULL_NAME)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_NICKNAME)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_EMAIL)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_EMAIL_2)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_WANTS_HTML)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_PHONE_BUSINESS)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_PHONE_HOME)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_PHONE_BUSINESS_FAX)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_PHONE_PAGER)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_PHONE_MOBILE)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_HOME_STREET)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_HOME_EXT)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_HOME_CITY)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_HOME_REGION)); - *pre_defined_fields = - g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_HOME_POSTCODE)); - *pre_defined_fields = - g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_HOME_COUNTRY)); - *pre_defined_fields = - g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_BUSINESS_STREET)); - *pre_defined_fields = - g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_BUSINESS_EXT)); - *pre_defined_fields = - g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_BUSINESS_CITY)); - *pre_defined_fields = - g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_BUSINESS_REGION)); - *pre_defined_fields = - g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_BUSINESS_POSTCODE)); - *pre_defined_fields = - g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ADDRESS_BUSINESS_COUNTRY)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_TITLE)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_OFFICE)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_ORG)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_HOMEPAGE_URL)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_CALENDAR_URI)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_BIRTH_DATE_YEAR)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_BIRTH_DATE_MONTH)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_BIRTH_DATE_DAY)); - *pre_defined_fields = g_slist_append (*pre_defined_fields, GINT_TO_POINTER (E_CONTACT_CSV_NOTE)); -} - -guint -action_list_cards_init (ActionContext * p_actctx) -{ - EBook *book; - EBookQuery *query; - GList *contacts; - - if (p_actctx->action_list_cards.addressbook_folder_uri != NULL) { - book = e_book_new_from_uri (p_actctx->action_list_cards.addressbook_folder_uri, NULL); - } else { - book = e_book_new_default_addressbook (NULL); - } - - if (!book - || !e_book_open (book, TRUE, NULL)) { - g_warning ("Couldn't load addressbook %s", p_actctx->action_list_cards.addressbook_folder_uri); - exit (-1); - } - - query = e_book_query_any_field_contains (""); - e_book_get_contacts (book, query, &contacts, NULL); - e_book_query_unref (query); - - action_list_cards (contacts, p_actctx); - - g_list_foreach (contacts, (GFunc)g_object_unref, NULL); - g_list_free (contacts); - - return SUCCESS; -} diff --git a/addressbook/tools/evolution-addressbook-export-list-folders.c b/addressbook/tools/evolution-addressbook-export-list-folders.c deleted file mode 100644 index 78fdca7f9f..0000000000 --- a/addressbook/tools/evolution-addressbook-export-list-folders.c +++ /dev/null @@ -1,99 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-addressbook-export-list-folders.c - * - * Copyright (C) 2003 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Gilbert Fang <gilbert.fang@sun.com> - * - */ - -#include <config.h> - -#include <glib.h> -#include <bonobo-activation/bonobo-activation.h> -#include <libbonobo.h> -#include <libgnome/libgnome.h> - -#include <libebook/e-book.h> - -#include "evolution-addressbook-export.h" - -guint -action_list_folders_init (ActionContext * p_actctx) -{ - ESourceList *addressbooks = NULL; - GSList *groups, *group; - FILE *outputfile = NULL; - - if (!e_book_get_addressbooks (&addressbooks, NULL)) { - g_warning (_("Couldn't get list of addressbooks")); - exit (-1); - } - - if (p_actctx->action_list_folders.output_file != NULL) { - if (!(outputfile = fopen (p_actctx->action_list_folders.output_file, "w"))) { - g_warning (_("Can not open file")); - exit (-1); - } - } - - groups = e_source_list_peek_groups (addressbooks); - for (group = groups; group; group = group->next) { - ESourceGroup *g = group->data; - GSList *sources, *source; - - sources = e_source_group_peek_sources (g); - for (source = sources; source; source = source->next) { - ESource *s = source->data; - EBook *book; - EBookQuery *query; - GList *contacts; - char *uri; - const char *name; - - book = e_book_new (s, NULL); - if (!book - || !e_book_open (book, TRUE, NULL)) { - g_warning (_("failed to open book")); - continue; - } - - query = e_book_query_any_field_contains (""); - e_book_get_contacts (book, query, &contacts, NULL); - e_book_query_unref (query); - - uri = e_source_get_uri (s); - name = e_source_peek_name (s); - - if (outputfile) - fprintf (outputfile, "\"%s\",\"%s\",%d\n", uri, name, g_list_length (contacts)); - else - printf ("\"%s\",\"%s\",%d\n", uri, name, g_list_length (contacts)); - - g_free (uri); - g_list_foreach (contacts, (GFunc)g_object_unref, NULL); - g_list_free (contacts); - - g_object_unref (book); - } - } - - if (outputfile) - fclose (outputfile); - - return SUCCESS; -} diff --git a/addressbook/tools/evolution-addressbook-export.c b/addressbook/tools/evolution-addressbook-export.c deleted file mode 100644 index 0fc31587a1..0000000000 --- a/addressbook/tools/evolution-addressbook-export.c +++ /dev/null @@ -1,160 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-addressbook-export.c - * - * Copyright (C) 2003 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Gilbert Fang <gilbert.fang@sun.com> - * - */ - -#include <config.h> - -#include <glib.h> -#include <bonobo-activation/bonobo-activation.h> -#include <bonobo/bonobo-main.h> -#include <gnome.h> - -#include <libebook/e-book.h> - -#include "evolution-addressbook-export.h" - -int -main (int argc, char **argv) -{ - ActionContext actctx; - GnomeProgram *program; - poptContext context; - const gchar **argvn; - - int current_action = ACTION_NOTHING; - int IsCSV = FALSE; - int IsVCard = FALSE; - - /*** popttable */ - char *output_file = NULL; - int list_folders_mode = FALSE; - char *output_format = NULL; - char *addressbook_folder_uri = NULL; - int async_mode = FALSE; - int file_size = 0; - - struct poptOption options[] = { - {"output", '\0', POPT_ARG_STRING, &output_file, 0, N_("Specify the output file instead of standard output"), - N_("OUTPUTFILE")}, - {"list-addressbook-folders", 'l', POPT_ARG_NONE, &list_folders_mode, 0, N_("List local addressbook folders"), - NULL}, - {"format", '\0', POPT_ARG_STRING, &output_format, 0, N_("Show cards as vcard or csv file"), N_("[vcard|csv]")}, - {"async", 'a', POPT_ARG_NONE, &async_mode, 0, N_("Export in asynchronous mode "), NULL}, - {"size", '\0', POPT_ARG_INT, &file_size, 0, - N_("The number of cards in one output file in asychronous mode,default size 100."), N_("NUMBER")}, - {NULL, '\0', 0, NULL, 0, NULL, NULL} - }; - /* popttable end ** */ - - /*i18n-lize */ - bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - textdomain (GETTEXT_PACKAGE); - - program = - gnome_program_init (PACKAGE, VERSION, GNOME_BONOBO_MODULE, argc, argv, GNOME_PARAM_POPT_TABLE, options, - GNOME_PARAM_NONE); - - /* Parsing Parameter */ - g_object_get (program, "popt-context", &context, NULL); - argvn = poptGetArgs (context); - if (!argvn) { - addressbook_folder_uri = NULL; - } else { /* there at lease is a one argument, and that should be addressbook folder uri */ - addressbook_folder_uri = g_strdup (*argvn); - } - poptFreeContext (context); - - if (list_folders_mode != FALSE) { - current_action = ACTION_LIST_FOLDERS; - /* check there should not be addressbook-folder-uri , and async and size , output_format */ - if (addressbook_folder_uri != NULL || async_mode != FALSE || output_format != NULL || file_size != 0) { - g_warning (_("Command line arguments error, please use --help option to see the usage.")); - exit (-1); - } - } else { - - current_action = ACTION_LIST_CARDS; - - /* check the output format */ - if (output_format == NULL) { - IsVCard = TRUE; - } else { - IsCSV = !strcmp (output_format, "csv"); - IsVCard = !strcmp (output_format, "vcard"); - if (IsCSV == FALSE && IsVCard == FALSE) { - g_warning (_("Only support csv or vcard format.")); - exit (-1); - } - } - - /*check async and output file */ - if (async_mode == TRUE) { - /* check have to output file , set default file_size */ - if (output_file == NULL) { - g_warning (_("In async mode, output must be file.")); - exit (-1); - } - if (file_size == 0) - file_size = DEFAULT_SIZE_NUMBER; - } else { - /*check no file_size */ - if (file_size != 0) { - g_warning (_("In normal mode, there is no need for the size option.")); - exit (-1); - } - } - } - - /* do actions */ - if (current_action == ACTION_LIST_FOLDERS) { - actctx.action_type = current_action; - if (output_file == NULL) { - actctx.action_list_folders.output_file = NULL; - } else { - actctx.action_list_folders.output_file = g_strdup (output_file); - } - action_list_folders_init (&actctx); - } else if (current_action == ACTION_LIST_CARDS) { - actctx.action_type = current_action; - if (output_file == NULL) { - actctx.action_list_cards.output_file = NULL; - } else { - actctx.action_list_cards.output_file = g_strdup (output_file); - } - actctx.action_list_cards.IsCSV = IsCSV; - actctx.action_list_cards.IsVCard = IsVCard; - actctx.action_list_cards.addressbook_folder_uri = g_strdup (addressbook_folder_uri); - actctx.action_list_cards.async_mode = async_mode; - actctx.action_list_cards.file_size = file_size; - - action_list_cards_init (&actctx); - - } else { - g_warning (_("Unhandled error")); - exit (-1); - } - - /*FIXME:should free actctx's some char* field, such as output_file! but since the program will end, so that will not cause mem leak. */ - - exit (0); -} diff --git a/addressbook/tools/evolution-addressbook-export.h b/addressbook/tools/evolution-addressbook-export.h deleted file mode 100644 index 13749aed61..0000000000 --- a/addressbook/tools/evolution-addressbook-export.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* evolution-addressbook-export.h - * - * Copyright (C) 2003 Ximian, Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Gilbert Fang <gilbert.fang@sun.com> - * - */ - -#ifndef _EVOLUTION_ADDRESSBOOK_EXPORT_H_ -#define _EVOLUTION_ADDRESSBOOK_EXPORT_H__ - -#include <glib.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define SUCCESS 0 -#define FAILED -1 - -#define ACTION_NOTHING 0 -#define ACTION_LIST_FOLDERS 1 -#define ACTION_LIST_CARDS 2 - -#define DEFAULT_SIZE_NUMBER 100 - -union _ActionContext -{ - - guint action_type; - - struct - { - gint action_type; - gchar *output_file; - } - action_list_folders; - - struct - { - gint action_type; - gchar *output_file; - gint IsCSV; - gint IsVCard; - gchar *addressbook_folder_uri; - gint async_mode; - gint file_size; - } - action_list_cards; -}; - -typedef union _ActionContext ActionContext; - - -/* action_list_folders */ -guint action_list_folders_init (ActionContext * p_actctx); - -/*action list cards*/ -guint action_list_cards_init (ActionContext * p_actctx); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _EVOLUTION_ADDRESSBOOK_EXPORT_H_ */ diff --git a/addressbook/tools/evolution-addressbook-import.c b/addressbook/tools/evolution-addressbook-import.c deleted file mode 100644 index 28871efd96..0000000000 --- a/addressbook/tools/evolution-addressbook-import.c +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -#include <config.h> - -#include <bonobo-activation/bonobo-activation.h> -#include <bonobo/bonobo-main.h> -#include <backend/ebook/e-book-async.h> -#include <gnome.h> - -static int exec_ref_count = 0; - -static void -ref_executable (void) -{ - exec_ref_count ++; -} - -static void -unref_executable (void) -{ - exec_ref_count --; - if (exec_ref_count == 0) - g_main_loop_quit (0); -} - -static void -add_cb (EBook *book, EBookStatus status, const char *id, gpointer closure) -{ - switch (status) { - case E_BOOK_ERROR_OK: - unref_executable (); - break; - default: - g_main_loop_quit (NULL); - break; - } -} - -static void -use_addressbook (EBook *book, gpointer closure) -{ - GList *cards, *list; - char *filename = closure; - - if (book == NULL) - g_error (_("Error loading default addressbook.")); - - cards = e_card_load_cards_from_file (filename); - - ref_executable (); - - for (list = cards; list; list = list->next) { - ref_executable (); - e_book_add_card (book, list->data, add_cb, closure); - } - sync(); - - unref_executable (); -} - -int -main (int argc, char *argv[]) -{ - char *filename = NULL; - - struct poptOption options[] = { - { "input-file", '\0', POPT_ARG_STRING, &filename, 0, N_("Input File"), NULL }, - POPT_AUTOHELP - { NULL, '\0', 0, NULL, 0, NULL, NULL } - }; - - bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR); - textdomain (GETTEXT_PACKAGE); - - gnome_program_init ("evolution-addressbook-import", VERSION, - LIBGNOMEUI_MODULE, argc, argv, - GNOME_PROGRAM_STANDARD_PROPERTIES, - GNOME_PARAM_POPT_TABLE, options, - NULL); - - if (filename == NULL) { - g_error (_("No filename provided.")); - } - - e_book_async_get_default_addressbook (use_addressbook, filename); - - bonobo_main (); - - return 0; -} diff --git a/addressbook/util/.cvsignore b/addressbook/util/.cvsignore deleted file mode 100644 index 6205c6f3ab..0000000000 --- a/addressbook/util/.cvsignore +++ /dev/null @@ -1,4 +0,0 @@ -Makefile -Makefile.in -eab-marshal.c -eab-marshal.h diff --git a/addressbook/util/Makefile.am b/addressbook/util/Makefile.am deleted file mode 100644 index 6d5592139d..0000000000 --- a/addressbook/util/Makefile.am +++ /dev/null @@ -1,36 +0,0 @@ -INCLUDES = \ - -DPREFIX=\"$(prefix)\" \ - -DSYSCONFDIR=\"$(sysconfdir)\" \ - -DDATADIR=\"$(datadir)\" \ - -DLIBDIR=\"$(libdir)\" \ - -DG_LOG_DOMAIN=\"EBook\" \ - -I$(top_srcdir) \ - -I$(top_srcdir)/camel \ - -I$(top_builddir)/shell \ - -I$(top_srcdir)/shell \ - $(EVOLUTION_ADDRESSBOOK_CFLAGS) - -noinst_LTLIBRARIES = libeabutil.la - -libeabutil_la_SOURCES = \ - eab-marshal.c \ - e-destination.c \ - e-destination.h \ - eab-book-util.c \ - eab-book-util.h - -libeabutil_la_LIBADD = \ - $(top_builddir)/camel/libcamel.la \ - $(top_builddir)/e-util/libeutil.la - -MARSHAL_GENERATED = eab-marshal.c eab-marshal.h -@EVO_MARSHAL_RULE@ - -BUILT_SOURCES = $(MARSHAL_GENERATED) -CLEANFILES = $(BUILT_SOURCES) - -EXTRA_DIST = \ - eab-marshal.list - -dist-hook: - cd $(distdir); rm -f $(BUILT_SOURCES) diff --git a/addressbook/util/e-destination.c b/addressbook/util/e-destination.c deleted file mode 100644 index 3b72ee8673..0000000000 --- a/addressbook/util/e-destination.c +++ /dev/null @@ -1,1259 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-destination.c - * - * Copyright (C) 2001-2004 Ximian, Inc. - * - * Authors: Jon Trowbridge <trow@ximian.com> - * Chris Toshok <toshok@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -/* - This file (and e-destination.h) should really be in - e-d-s/addressbook/libebook. but there are at present (at least) 2 - reasons why they can't be: - - 1) e_utf8_casefold_collate (in eab-book-util.c). we could just copy - the implementation into this file, though.. we already have an - implementation in the select-names code as well, yuck. - - and - - 2) camel-internet-address. fejj mentioned writing a stripped down - version for our use here, which would work. alternatively we can - just keep this file in evolution/ until/unless camel moves into - e-d-s. - - - we should probably make most of the functions in this file a little - stupider.. all the work extracting useful info from the - EContact/raw text/etc should happen in e_destination_set_contact - (and the other setters), not in a bunch of if's in the respective - _get_*() functions. -*/ - -#include <config.h> -#include "e-destination.h" - -#include <stdlib.h> -#include <ctype.h> -#include <string.h> -#include <libebook/e-book.h> -#include "eab-marshal.h" -#include "eab-book-util.h" - -#include <glib.h> -#include <libxml/xmlmemory.h> -#include <libgnome/gnome-i18n.h> -#include <camel/camel-internet-address.h> - -#define d(x) - -struct _EDestinationPrivate { - gchar *raw; - - char *source_uid; - - EContact *contact; - char *contact_uid; - - int email_num; - - char *name; - char *email; - char *addr; - char *textrep; - - GList *list_dests; - - guint html_mail_override : 1; - guint wants_html_mail : 1; - - guint show_addresses : 1; - - guint auto_recipient : 1; -}; - -static gboolean e_destination_from_contact (const EDestination *); -static xmlNodePtr e_destination_xml_encode (const EDestination *dest); -static gboolean e_destination_xml_decode (EDestination *dest, xmlNodePtr node); -static void e_destination_clear (EDestination *dest); - -static GObjectClass *parent_class; - -static void -e_destination_dispose (GObject *obj) -{ - EDestination *dest = E_DESTINATION (obj); - - if (dest->priv) { - e_destination_clear (dest); - - g_free (dest->priv); - dest->priv = NULL; - } - - if (G_OBJECT_CLASS (parent_class)->dispose) - (* G_OBJECT_CLASS (parent_class)->dispose) (obj); -} - -static void -e_destination_class_init (EDestinationClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - parent_class = g_type_class_ref (G_TYPE_OBJECT); - - object_class->dispose = e_destination_dispose; -} - -static void -e_destination_init (EDestination *dest) -{ - dest->priv = g_new0 (struct _EDestinationPrivate, 1); - - dest->priv->auto_recipient = FALSE; -} - -GType -e_destination_get_type (void) -{ - static GType dest_type = 0; - - if (!dest_type) { - GTypeInfo dest_info = { - sizeof (EDestinationClass), - NULL, /* base_class_init */ - NULL, /* base_class_finalize */ - (GClassInitFunc) e_destination_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (EDestination), - 0, /* n_preallocs */ - (GInstanceInitFunc) e_destination_init - }; - - dest_type = g_type_register_static (G_TYPE_OBJECT, "EDestination", &dest_info, 0); - } - - return dest_type; -} - -EDestination * -e_destination_new (void) -{ - return g_object_new (E_TYPE_DESTINATION, NULL); -} - -EDestination * -e_destination_copy (const EDestination *dest) -{ - EDestination *new_dest; - GList *iter; - - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - new_dest = e_destination_new (); - - new_dest->priv->source_uid = g_strdup (dest->priv->source_uid); - new_dest->priv->contact_uid = g_strdup (dest->priv->contact_uid); - new_dest->priv->name = g_strdup (dest->priv->name); - new_dest->priv->email = g_strdup (dest->priv->email); - new_dest->priv->addr = g_strdup (dest->priv->addr); - new_dest->priv->email_num = dest->priv->email_num; - - if (dest->priv->contact) - new_dest->priv->contact = g_object_ref (dest->priv->contact); - - new_dest->priv->html_mail_override = dest->priv->html_mail_override; - new_dest->priv->wants_html_mail = dest->priv->wants_html_mail; - - /* deep copy, recursively copy our children */ - for (iter = dest->priv->list_dests; iter != NULL; iter = g_list_next (iter)) { - new_dest->priv->list_dests = g_list_append (new_dest->priv->list_dests, - e_destination_copy (E_DESTINATION (iter->data))); - } - - /* XXX other settings? */ - - return new_dest; -} - -static void -e_destination_clear (EDestination *dest) -{ - g_free (dest->priv->source_uid); - dest->priv->source_uid = NULL; - - g_free (dest->priv->contact_uid); - dest->priv->contact_uid = NULL; - - g_free (dest->priv->raw); - dest->priv->raw = NULL; - - g_free (dest->priv->name); - dest->priv->name = NULL; - - g_free (dest->priv->email); - dest->priv->email = NULL; - - g_free (dest->priv->addr); - dest->priv->addr = NULL; - - g_free (dest->priv->textrep); - dest->priv->textrep = NULL; - - if (dest->priv->contact) { - g_object_unref (dest->priv->contact); - dest->priv->contact = NULL; - } - dest->priv->email_num = -1; - - g_list_foreach (dest->priv->list_dests, (GFunc) g_object_unref, NULL); - g_list_free (dest->priv->list_dests); - dest->priv->list_dests = NULL; -} - -static gboolean -nonempty (const char *s) -{ - gunichar c; - if (s == NULL) - return FALSE; - while (*s) { - c = g_utf8_get_char (s); - if (!g_unichar_isspace (c)) - return TRUE; - s = g_utf8_next_char (s); - } - return FALSE; -} - -gboolean -e_destination_empty (const EDestination *dest) - -{ - struct _EDestinationPrivate *p; - - g_return_val_if_fail (E_IS_DESTINATION (dest), TRUE); - - p = dest->priv; - - return !(p->contact != NULL - || (p->source_uid && *p->source_uid) - || (p->contact_uid && *p->contact_uid) - || (nonempty (p->raw)) - || (nonempty (p->name)) - || (nonempty (p->email)) - || (nonempty (p->addr)) - || (p->list_dests != NULL)); -} - -gboolean -e_destination_equal (const EDestination *a, const EDestination *b) -{ - const struct _EDestinationPrivate *pa, *pb; - const char *na, *nb; - - g_return_val_if_fail (E_IS_DESTINATION (a), FALSE); - g_return_val_if_fail (E_IS_DESTINATION (b), FALSE); - - if (a == b) - return TRUE; - - pa = a->priv; - pb = b->priv; - - /* Check equality of contacts. */ - if (pa->contact || pb->contact) { - if (! (pa->contact && pb->contact)) - return FALSE; - - if (pa->contact == pb->contact || !strcmp (e_contact_get_const (pa->contact, E_CONTACT_UID), - e_contact_get_const (pb->contact, E_CONTACT_UID))) - return TRUE; - - return FALSE; - } - - /* Just in case name returns NULL */ - na = e_destination_get_name (a); - nb = e_destination_get_name (b); - if ((na || nb) && !(na && nb && ! e_utf8_casefold_collate (na, nb))) - return FALSE; - - if (!g_ascii_strcasecmp (e_destination_get_email (a), e_destination_get_email (b))) - return TRUE; - else - return FALSE; -} - -void -e_destination_set_contact (EDestination *dest, EContact *contact, gint email_num) -{ - g_return_if_fail (dest && E_IS_DESTINATION (dest)); - g_return_if_fail (contact && E_IS_CONTACT (contact)); - - if (dest->priv->contact != contact || dest->priv->email_num != email_num) { - - e_destination_clear (dest); - - dest->priv->contact = g_object_ref (contact); - - dest->priv->contact_uid = e_contact_get (dest->priv->contact, E_CONTACT_UID); - - dest->priv->email_num = email_num; - - /* handle the mailing list case */ - if (e_contact_get (dest->priv->contact, E_CONTACT_IS_LIST)) { - GList *email = e_contact_get_attributes (dest->priv->contact, E_CONTACT_EMAIL); - - if (email) { - GList *iter; - - for (iter = email; iter; iter = iter->next) { - EVCardAttribute *attr = iter->data; - GList *p; - EDestination *list_dest = e_destination_new (); - char *contact_uid = NULL; - char *email_addr = NULL; - char *name = NULL; - int email_num = -1; - gboolean html_pref = FALSE; - - for (p = e_vcard_attribute_get_params (attr); p; p = p->next) { - EVCardAttributeParam *param = p->data; - const char *param_name = e_vcard_attribute_param_get_name (param); - if (!g_ascii_strcasecmp (param_name, - EVC_X_DEST_CONTACT_UID)) { - GList *v = e_vcard_attribute_param_get_values (param); - contact_uid = v ? g_strdup (v->data) : NULL; - } - else if (!g_ascii_strcasecmp (param_name, - EVC_X_DEST_EMAIL_NUM)) { - GList *v = e_vcard_attribute_param_get_values (param); - email_num = v ? atoi (v->data) : -1; - } - else if (!g_ascii_strcasecmp (param_name, - EVC_X_DEST_NAME)) { - GList *v = e_vcard_attribute_param_get_values (param); - name = v ? v->data : NULL; - } - else if (!g_ascii_strcasecmp (param_name, - EVC_X_DEST_EMAIL)) { - GList *v = e_vcard_attribute_param_get_values (param); - email_addr = v ? v->data : NULL; - } - else if (!g_ascii_strcasecmp (param_name, - EVC_X_DEST_HTML_MAIL)) { - GList *v = e_vcard_attribute_param_get_values (param); - html_pref = v ? !g_ascii_strcasecmp (v->data, "true") : FALSE; - } - } - - if (contact_uid) e_destination_set_contact_uid (list_dest, contact_uid, email_num); - if (name) e_destination_set_name (list_dest, name); - if (email_addr) e_destination_set_email (list_dest, email_addr); - e_destination_set_html_mail_pref (list_dest, html_pref); - - dest->priv->list_dests = g_list_append (dest->priv->list_dests, list_dest); - } - - g_list_foreach (email, (GFunc) e_vcard_attribute_free, NULL); - g_list_free (email); - } - } - else { - /* handle the normal contact case */ - /* is there anything to do here? */ - } - } -} - -void -e_destination_set_book (EDestination *dest, EBook *book) -{ - ESource *source; - - g_return_if_fail (dest && E_IS_DESTINATION (dest)); - g_return_if_fail (book && E_IS_BOOK (book)); - - source = e_book_get_source (book); - - if (dest->priv->source_uid || strcmp (e_source_peek_uid (source), dest->priv->source_uid)) { - e_destination_clear (dest); - - dest->priv->source_uid = g_strdup (e_source_peek_uid (source)); - } -} - -void -e_destination_set_contact_uid (EDestination *dest, const char *uid, gint email_num) -{ - g_return_if_fail (dest && E_IS_DESTINATION (dest)); - g_return_if_fail (uid != NULL); - - if (dest->priv->contact_uid == NULL - || strcmp (dest->priv->contact_uid, uid) - || dest->priv->email_num != email_num) { - - g_free (dest->priv->contact_uid); - dest->priv->contact_uid = g_strdup (uid); - dest->priv->email_num = email_num; - - /* If we already have a contact, remove it unless it's uid matches the one - we just set. */ - if (dest->priv->contact && strcmp (uid, - e_contact_get_const (dest->priv->contact, E_CONTACT_UID))) { - g_object_unref (dest->priv->contact); - dest->priv->contact = NULL; - } - } -} - -static void -e_destination_set_source_uid (EDestination *dest, const char *uid) -{ - g_return_if_fail (dest && E_IS_DESTINATION (dest)); - g_return_if_fail (uid != NULL); - - if (dest->priv->source_uid == NULL - || strcmp (dest->priv->source_uid, uid)) { - - g_free (dest->priv->source_uid); - dest->priv->source_uid = g_strdup (uid); - } -} - -void -e_destination_set_name (EDestination *dest, const char *name) -{ - gboolean changed = FALSE; - - g_return_if_fail (E_IS_DESTINATION (dest)); - - if (name == NULL) { - if (dest->priv->name != NULL) { - g_free (dest->priv->name); - dest->priv->name = NULL; - changed = TRUE; - } - } else if (dest->priv->name == NULL || strcmp (dest->priv->name, name)) { - g_free (dest->priv->name); - dest->priv->name = g_strdup (name); - changed = TRUE; - } - - if (changed) { - g_free (dest->priv->addr); - dest->priv->addr = NULL; - g_free (dest->priv->textrep); - dest->priv->textrep = NULL; - } -} - -void -e_destination_set_email (EDestination *dest, const char *email) -{ - gboolean changed = FALSE; - - g_return_if_fail (E_IS_DESTINATION (dest)); - - if (email == NULL) { - if (dest->priv->email != NULL) { - g_free (dest->priv->addr); - dest->priv->addr = NULL; - changed = TRUE; - } - } else if (dest->priv->email == NULL || strcmp (dest->priv->email, email)) { - g_free (dest->priv->email); - dest->priv->email = g_strdup (email); - changed = TRUE; - } - - if (changed) { - g_free (dest->priv->addr); - dest->priv->addr = NULL; - g_free (dest->priv->textrep); - dest->priv->textrep = NULL; - } -} - -static gboolean -e_destination_from_contact (const EDestination *dest) -{ - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), FALSE); - return dest->priv->contact != NULL || dest->priv->source_uid != NULL || dest->priv->contact_uid != NULL; -} - -gboolean -e_destination_is_auto_recipient (const EDestination *dest) -{ - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), FALSE); - - return dest->priv->auto_recipient; -} - -void -e_destination_set_auto_recipient (EDestination *dest, gboolean value) -{ - g_return_if_fail (dest && E_IS_DESTINATION (dest)); - - dest->priv->auto_recipient = value; -} - -EContact * -e_destination_get_contact (const EDestination *dest) -{ - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - return dest->priv->contact; -} - -const char * -e_destination_get_contact_uid (const EDestination *dest) -{ - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - return dest->priv->contact_uid; -} - -const char * -e_destination_get_source_uid (const EDestination *dest) -{ - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - return dest->priv->source_uid; -} - -gint -e_destination_get_email_num (const EDestination *dest) -{ - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), -1); - - if (dest->priv->contact == NULL && (dest->priv->source_uid == NULL || dest->priv->contact_uid == NULL)) - return -1; - - return dest->priv->email_num; -} - -const char * -e_destination_get_name (const EDestination *dest) -{ - struct _EDestinationPrivate *priv; - - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - priv = (struct _EDestinationPrivate *)dest->priv; /* cast out const */ - - if (priv->name == NULL) { - if (priv->contact != NULL) { - priv->name = e_contact_get (priv->contact, E_CONTACT_FULL_NAME); - - if (priv->name == NULL || *priv->name == '\0') { - g_free (priv->name); - priv->name = e_contact_get (priv->contact, E_CONTACT_FILE_AS); - } - - if (priv->name == NULL || *priv->name == '\0') { - g_free (priv->name); - if (e_contact_get (priv->contact, E_CONTACT_IS_LIST)) - priv->name = g_strdup (_("Unnamed List")); - else - priv->name = g_strdup (e_destination_get_email (dest)); - } - } - else if (priv->raw != NULL) { - CamelInternetAddress *addr = camel_internet_address_new (); - - if (camel_address_unformat (CAMEL_ADDRESS (addr), priv->raw)) { - const char *camel_name = NULL; - - camel_internet_address_get (addr, 0, &camel_name, NULL); - priv->name = g_strdup (camel_name); - } - - camel_object_unref (CAMEL_OBJECT (addr)); - } - } - - return priv->name; -} - -const char * -e_destination_get_email (const EDestination *dest) -{ - struct _EDestinationPrivate *priv; - - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - priv = (struct _EDestinationPrivate *)dest->priv; /* cast out const */ - - if (priv->email == NULL) { - if (priv->contact != NULL) { - /* Pull the address out of the card. */ - GList *email = e_contact_get (priv->contact, E_CONTACT_EMAIL); - if (email) { - char *e = g_list_nth_data (email, priv->email_num); - - if (e) - priv->email = g_strdup (e); - } - if (email) { - g_list_foreach (email, (GFunc)g_free, NULL); - g_list_free (email); - } - - } else if (priv->raw != NULL) { - CamelInternetAddress *addr = camel_internet_address_new (); - - if (camel_address_unformat (CAMEL_ADDRESS (addr), priv->raw)) { - const char *camel_email = NULL; - camel_internet_address_get (addr, 0, NULL, &camel_email); - priv->email = g_strdup (camel_email); - } - - camel_object_unref (CAMEL_OBJECT (addr)); - } - - /* Force e-mail to be non-null... */ - if (priv->email == NULL) { - priv->email = g_strdup (""); - } - } - - return priv->email; -} - -const char * -e_destination_get_address (const EDestination *dest) -{ - struct _EDestinationPrivate *priv; - - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - priv = (struct _EDestinationPrivate *)dest->priv; /* cast out const */ - - if (priv->addr == NULL) { - CamelInternetAddress *addr = camel_internet_address_new (); - - if (e_destination_is_evolution_list (dest)) { - GList *iter = dest->priv->list_dests; - - while (iter) { - EDestination *list_dest = E_DESTINATION (iter->data); - - if (!e_destination_empty (list_dest)) { - const char *name, *email; - name = e_destination_get_name (list_dest); - email = e_destination_get_email (list_dest); - - if (nonempty (name) && nonempty (email)) - camel_internet_address_add (addr, name, email); - else if (nonempty (email)) - camel_address_decode (CAMEL_ADDRESS (addr), email); - else /* this case loses i suppose, but there's - nothing we can do here */ - camel_address_decode (CAMEL_ADDRESS (addr), name); - } - iter = g_list_next (iter); - } - - priv->addr = camel_address_encode (CAMEL_ADDRESS (addr)); - } else if (priv->raw) { - - if (camel_address_unformat (CAMEL_ADDRESS (addr), priv->raw)) { - priv->addr = camel_address_encode (CAMEL_ADDRESS (addr)); - } - } else { - const char *name, *email; - name = e_destination_get_name (dest); - email = e_destination_get_email (dest); - - if (nonempty (name) && nonempty (email)) - camel_internet_address_add (addr, name, email); - else if (nonempty (email)) - camel_address_decode (CAMEL_ADDRESS (addr), email); - else /* this case loses i suppose, but there's - nothing we can do here */ - camel_address_decode (CAMEL_ADDRESS (addr), name); - - priv->addr = camel_address_encode (CAMEL_ADDRESS (addr)); - } - - camel_object_unref (CAMEL_OBJECT (addr)); - } - - return priv->addr; -} - -void -e_destination_set_raw (EDestination *dest, const char *raw) -{ - g_return_if_fail (E_IS_DESTINATION (dest)); - g_return_if_fail (raw != NULL); - - if (dest->priv->raw == NULL || strcmp (dest->priv->raw, raw)) { - - e_destination_clear (dest); - - dest->priv->raw = g_strdup (raw); - } -} - -const char * -e_destination_get_textrep (const EDestination *dest, gboolean include_email) -{ - const char *name, *email; - - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - if (dest->priv->raw) - return dest->priv->raw; - - name = e_destination_get_name (dest); - email = e_destination_get_email (dest); - - if (e_destination_from_contact (dest) && name != NULL && (!include_email || !email || !*email)) - return name; - - /* Make sure that our address gets quoted properly */ - if (name && email && dest->priv->textrep == NULL) { - CamelInternetAddress *addr = camel_internet_address_new (); - - camel_internet_address_add (addr, name, email); - g_free (dest->priv->textrep); - dest->priv->textrep = camel_address_format (CAMEL_ADDRESS (addr)); - camel_object_unref (CAMEL_OBJECT (addr)); - } - - if (dest->priv->textrep != NULL) - return dest->priv->textrep; - - if (email) - return email; - - return ""; -} - -gboolean -e_destination_is_evolution_list (const EDestination *dest) -{ - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), FALSE); - - return dest->priv->list_dests != NULL; -} - -gboolean -e_destination_list_show_addresses (const EDestination *dest) -{ - g_return_val_if_fail (E_IS_DESTINATION (dest), FALSE); - - if (dest->priv->contact != NULL) - return GPOINTER_TO_UINT (e_contact_get (dest->priv->contact, E_CONTACT_LIST_SHOW_ADDRESSES)); - - return dest->priv->show_addresses; -} - -gboolean -e_destination_get_html_mail_pref (const EDestination *dest) -{ - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), FALSE); - - if (dest->priv->html_mail_override || dest->priv->contact == NULL) - return dest->priv->wants_html_mail; - - return e_contact_get (dest->priv->contact, E_CONTACT_WANTS_HTML) ? TRUE : FALSE; -} - -void -e_destination_set_html_mail_pref (EDestination *dest, gboolean x) -{ - g_return_if_fail (dest && E_IS_DESTINATION (dest)); - - dest->priv->html_mail_override = TRUE; - if (dest->priv->wants_html_mail != x) { - dest->priv->wants_html_mail = x; - } -} - -/* - * Destination import/export - */ - -char * -e_destination_get_textrepv (EDestination **destv) -{ - int i, j, len = 0; - char **strv; - char *str; - - g_return_val_if_fail (destv, NULL); - - /* Q: Please tell me this is only for assertion - reasons. If this is considered to be ok behavior then you - shouldn't use g_return's. Just a reminder ;-) - - A: Yes, this is just an assertion. (Though it does find the - length of the vector in the process...) - */ - while (destv[len]) { - g_return_val_if_fail (E_IS_DESTINATION (destv[len]), NULL); - len++; - } - - strv = g_new0 (char *, len + 1); - for (i = 0, j = 0; destv[i]; i++) { - if (!e_destination_empty (destv[i])) { - const char *addr = e_destination_get_address (destv[i]); - strv[j++] = addr ? (char *) addr : ""; - } - } - - str = g_strjoinv (", ", strv); - - g_free (strv); - - return str; -} - -xmlNodePtr -e_destination_xml_encode (const EDestination *dest) -{ - xmlNodePtr dest_node; - const char *str; - - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - dest_node = xmlNewNode (NULL, "destination"); - - str = e_destination_get_name (dest); - if (str) - xmlNewTextChild (dest_node, NULL, "name", str); - - if (!e_destination_is_evolution_list (dest)) { - str = e_destination_get_email (dest); - if (str) - xmlNewTextChild (dest_node, NULL, "email", str); - } else { - GList *iter = dest->priv->list_dests; - - while (iter) { - EDestination *list_dest = E_DESTINATION (iter->data); - xmlNodePtr list_node = xmlNewNode (NULL, "list_entry"); - - str = e_destination_get_name (list_dest); - if (str) { - char *escaped = xmlEncodeEntitiesReentrant (NULL, str); - xmlNewTextChild (list_node, NULL, "name", escaped); - xmlFree (escaped); - } - - str = e_destination_get_email (list_dest); - if (str) { - char *escaped = xmlEncodeEntitiesReentrant (NULL, str); - xmlNewTextChild (list_node, NULL, "email", str); - xmlFree (escaped); - } - - xmlAddChild (dest_node, list_node); - - iter = g_list_next (iter); - } - - xmlNewProp (dest_node, "is_list", "yes"); - xmlNewProp (dest_node, "show_addresses", - e_destination_list_show_addresses (dest) ? "yes" : "no"); - } - - str = e_destination_get_source_uid (dest); - if (str) { - char *escaped = xmlEncodeEntitiesReentrant (NULL, str); - xmlNewTextChild (dest_node, NULL, "source_uid", str); - xmlFree (escaped); - } - - str = e_destination_get_contact_uid (dest); - if (str) { - char buf[16]; - - xmlNodePtr uri_node = xmlNewTextChild (dest_node, NULL, "card_uid", str); - g_snprintf (buf, 16, "%d", e_destination_get_email_num (dest)); - xmlNewProp (uri_node, "email_num", buf); - } - - xmlNewProp (dest_node, "html_mail", e_destination_get_html_mail_pref (dest) ? "yes" : "no"); - - xmlNewProp (dest_node, "auto_recipient", - e_destination_is_auto_recipient (dest) ? "yes" : "no"); - - return dest_node; -} - -gboolean -e_destination_xml_decode (EDestination *dest, xmlNodePtr node) -{ - char *name = NULL, *email = NULL, *source_uid = NULL, *card_uid = NULL; - gboolean is_list = FALSE, show_addr = FALSE, auto_recip = FALSE; - gboolean html_mail = FALSE; - GList *list_dests = NULL; - int email_num = -1; - char *tmp; - - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), FALSE); - g_return_val_if_fail (node != NULL, FALSE); - - if (strcmp (node->name, "destination")) - return FALSE; - - tmp = xmlGetProp (node, "html_mail"); - if (tmp) { - html_mail = !strcmp (tmp, "yes"); - xmlFree (tmp); - } - - tmp = xmlGetProp (node, "is_list"); - if (tmp) { - is_list = !strcmp (tmp, "yes"); - xmlFree (tmp); - } - - tmp = xmlGetProp (node, "show_addresses"); - if (tmp) { - show_addr = !strcmp (tmp, "yes"); - xmlFree (tmp); - } - - tmp = xmlGetProp (node, "auto_recipient"); - if (tmp) { - auto_recip = !strcmp (tmp, "yes"); - xmlFree (tmp); - } - - node = node->xmlChildrenNode; - while (node) { - if (!strcmp (node->name, "name")) { - tmp = xmlNodeGetContent (node); - g_free (name); - name = g_strdup (tmp); - xmlFree (tmp); - } else if (!is_list && !strcmp (node->name, "email")) { - tmp = xmlNodeGetContent (node); - g_free (email); - email = g_strdup (tmp); - xmlFree (tmp); - } else if (is_list && !strcmp (node->name, "list_entry")) { - xmlNodePtr subnode = node->xmlChildrenNode; - char *list_name = NULL, *list_email = NULL; - - while (subnode) { - if (!strcmp (subnode->name, "name")) { - tmp = xmlNodeGetContent (subnode); - g_free (list_name); - list_name = g_strdup (tmp); - xmlFree (tmp); - } else if (!strcmp (subnode->name, "email")) { - tmp = xmlNodeGetContent (subnode); - g_free (list_email); - list_email = g_strdup (tmp); - xmlFree (tmp); - } - - subnode = subnode->next; - } - - if (list_name || list_email) { - EDestination *list_dest = e_destination_new (); - - if (list_name) - e_destination_set_name (list_dest, list_name); - if (list_email) - e_destination_set_email (list_dest, list_email); - - g_free (list_name); - g_free (list_email); - - list_dests = g_list_append (list_dests, list_dest); - } - } else if (!strcmp (node->name, "source_uid")) { - tmp = xmlNodeGetContent (node); - g_free (source_uid); - source_uid = g_strdup (tmp); - xmlFree (tmp); - } else if (!strcmp (node->name, "card_uid")) { - tmp = xmlNodeGetContent (node); - g_free (card_uid); - card_uid = g_strdup (tmp); - xmlFree (tmp); - - tmp = xmlGetProp (node, "email_num"); - email_num = atoi (tmp); - xmlFree (tmp); - } - - node = node->next; - } - - e_destination_clear (dest); - - if (name) { - e_destination_set_name (dest, name); - g_free (name); - } - if (email) { - e_destination_set_email (dest, email); - g_free (email); - } - if (source_uid) { - e_destination_set_source_uid (dest, source_uid); - g_free (source_uid); - } - if (card_uid) { - e_destination_set_contact_uid (dest, card_uid, email_num); - g_free (card_uid); - } - if (list_dests) - dest->priv->list_dests = list_dests; - - dest->priv->html_mail_override = TRUE; - dest->priv->wants_html_mail = html_mail; - - dest->priv->show_addresses = show_addr; - - dest->priv->auto_recipient = auto_recip; - - return TRUE; -} - -static char * -null_terminate_and_remove_extra_whitespace (xmlChar *xml_in, gint size) -{ - gboolean skip_white = FALSE; - char *xml, *r, *w; - - if (xml_in == NULL || size <= 0) - return NULL; - - xml = g_strndup (xml_in, size); - r = w = xml; - - while (*r) { - if (*r == '\n' || *r == '\r') { - skip_white = TRUE; - } else { - gunichar c = g_utf8_get_char (r); - gboolean is_space = g_unichar_isspace (c); - - *w = *r; - - if (!(skip_white && is_space)) - w++; - if (!is_space) - skip_white = FALSE; - } - r = g_utf8_next_char (r); - } - - *w = '\0'; - - return xml; -} - -char * -e_destination_export (const EDestination *dest) -{ - xmlNodePtr dest_node; - xmlDocPtr dest_doc; - xmlChar *buffer = NULL; - int size = -1; - char *str; - - g_return_val_if_fail (dest && E_IS_DESTINATION (dest), NULL); - - dest_node = e_destination_xml_encode (dest); - if (dest_node == NULL) - return NULL; - - dest_doc = xmlNewDoc (XML_DEFAULT_VERSION); - xmlDocSetRootElement (dest_doc, dest_node); - - xmlDocDumpMemory (dest_doc, &buffer, &size); - xmlFreeDoc (dest_doc); - - str = null_terminate_and_remove_extra_whitespace (buffer, size); - xmlFree (buffer); - - return str; -} - -EDestination * -e_destination_import (const char *str) -{ - EDestination *dest = NULL; - xmlDocPtr dest_doc; - - if (!(str && *str)) - return NULL; - - dest_doc = xmlParseMemory ((char *) str, strlen (str)); - if (dest_doc && dest_doc->xmlRootNode) { - dest = e_destination_new (); - if (! e_destination_xml_decode (dest, dest_doc->xmlRootNode)) { - g_object_unref (dest); - dest = NULL; - } - } - xmlFreeDoc (dest_doc); - - return dest; -} - -char * -e_destination_exportv (EDestination **destv) -{ - xmlDocPtr destv_doc; - xmlNodePtr destv_node; - xmlChar *buffer = NULL; - int i, size = -1; - char *str; - - if (destv == NULL || *destv == NULL) - return NULL; - - destv_doc = xmlNewDoc (XML_DEFAULT_VERSION); - destv_node = xmlNewNode (NULL, "destinations"); - xmlDocSetRootElement (destv_doc, destv_node); - - for (i = 0; destv[i]; i++) { - if (! e_destination_empty (destv[i])) { - xmlNodePtr dest_node = e_destination_xml_encode (destv[i]); - if (dest_node) - xmlAddChild (destv_node, dest_node); - } - } - - xmlDocDumpMemory (destv_doc, &buffer, &size); - xmlFreeDoc (destv_doc); - - str = null_terminate_and_remove_extra_whitespace (buffer, size); - xmlFree (buffer); - - return str; -} - -EDestination ** -e_destination_importv (const char *str) -{ - GPtrArray *dest_array = NULL; - xmlDocPtr destv_doc; - xmlNodePtr node; - EDestination **destv = NULL; - - if (!(str && *str)) - return NULL; - - destv_doc = xmlParseMemory ((char *)str, strlen (str)); - if (destv_doc == NULL) - return NULL; - - node = destv_doc->xmlRootNode; - - if (strcmp (node->name, "destinations")) - goto finished; - - node = node->xmlChildrenNode; - - dest_array = g_ptr_array_new (); - - while (node) { - EDestination *dest; - - dest = e_destination_new (); - if (e_destination_xml_decode (dest, node) && !e_destination_empty (dest)) { - g_ptr_array_add (dest_array, dest); - } else { - g_object_unref (dest); - } - - node = node->next; - } - - /* we need destv to be NULL terminated */ - g_ptr_array_add (dest_array, NULL); - - destv = (EDestination **) dest_array->pdata; - g_ptr_array_free (dest_array, FALSE); - - finished: - xmlFreeDoc (destv_doc); - - return destv; -} - -void -e_destination_freev (EDestination **destv) -{ - int i; - - if (destv) { - for (i = 0; destv[i] != NULL; ++i) { - g_object_unref (destv[i]); - } - g_free (destv); - } - -} - -void -e_destination_export_to_vcard_attribute (EDestination *dest, EVCardAttribute *attr) -{ - e_vcard_attribute_remove_values (attr); - e_vcard_attribute_remove_params (attr); - - if (e_destination_get_contact_uid (dest)) - e_vcard_attribute_add_param_with_value (attr, - e_vcard_attribute_param_new (EVC_X_DEST_CONTACT_UID), - e_destination_get_contact_uid (dest)); - if (e_destination_get_source_uid (dest)) - e_vcard_attribute_add_param_with_value (attr, - e_vcard_attribute_param_new (EVC_X_DEST_SOURCE_UID), - e_destination_get_source_uid (dest)); - if (-1 != e_destination_get_email_num (dest)) { - char buf[10]; - g_snprintf (buf, sizeof (buf), "%d", e_destination_get_email_num (dest)); - e_vcard_attribute_add_param_with_value (attr, - e_vcard_attribute_param_new (EVC_X_DEST_EMAIL_NUM), - buf); - } - if (e_destination_get_name (dest)) - e_vcard_attribute_add_param_with_value (attr, - e_vcard_attribute_param_new (EVC_X_DEST_NAME), - e_destination_get_name (dest)); - if (e_destination_get_email (dest)) - e_vcard_attribute_add_param_with_value (attr, - e_vcard_attribute_param_new (EVC_X_DEST_EMAIL), - e_destination_get_email (dest)); - e_vcard_attribute_add_param_with_value (attr, - e_vcard_attribute_param_new (EVC_X_DEST_HTML_MAIL), - e_destination_get_html_mail_pref (dest) ? "TRUE" : "FALSE"); - - if (e_destination_get_address (dest)) - e_vcard_attribute_add_value (attr, e_destination_get_address (dest)); -} diff --git a/addressbook/util/e-destination.h b/addressbook/util/e-destination.h deleted file mode 100644 index 8035f747b6..0000000000 --- a/addressbook/util/e-destination.h +++ /dev/null @@ -1,124 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-destination.h - * - * Copyright (C) 2001-2004 Ximian, Inc. - * - * Authors: Jon Trowbridge <trow@ximian.com> - * Chris Toshok <toshok@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef __E_DESTINATION_H__ -#define __E_DESTINATION_H__ - -#include <glib.h> -#include <glib-object.h> -#include <libebook/e-contact.h> -#include <libebook/e-book.h> -#include <libxml/tree.h> - -#define E_TYPE_DESTINATION (e_destination_get_type ()) -#define E_DESTINATION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), E_TYPE_DESTINATION, EDestination)) -#define E_DESTINATION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), E_TYPE_DESTINATION, EDestinationClass)) -#define E_IS_DESTINATION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), E_TYPE_DESTINATION)) -#define E_IS_DESTINATION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), E_TYPE_DESTINATION)) -#define E_DESTINATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), E_TYPE_DESTINATION, EDestinationClass)) - -typedef struct _EDestination EDestination; -typedef struct _EDestinationClass EDestinationClass; - -struct _EDestinationPrivate; - -struct _EDestination { - GObject object; - - struct _EDestinationPrivate *priv; -}; - -struct _EDestinationClass { - GObjectClass parent_class; - - /* Padding for future expansion */ - void (*_ebook_reserved0) (void); - void (*_ebook_reserved1) (void); - void (*_ebook_reserved2) (void); - void (*_ebook_reserved3) (void); - void (*_ebook_reserved4) (void); -}; - -GType e_destination_get_type (void); - - -EDestination *e_destination_new (void); -EDestination *e_destination_copy (const EDestination *); - -gboolean e_destination_empty (const EDestination *); -gboolean e_destination_equal (const EDestination *a, const EDestination *b); - -/* for use with EDestinations that wrap a particular contact */ -void e_destination_set_contact (EDestination *, EContact *contact, int email_num); -void e_destination_set_contact_uid (EDestination *dest, const char *uid, gint email_num); -void e_destination_set_book (EDestination *, EBook *book); -EContact *e_destination_get_contact (const EDestination *); -const char *e_destination_get_source_uid (const EDestination *); -const char *e_destination_get_contact_uid (const EDestination *); -int e_destination_get_email_num (const EDestination *); - -/* for use with EDestinations built up from strings (not corresponding to contacts in a user's address books) */ -void e_destination_set_name (EDestination *, const char *name); -void e_destination_set_email (EDestination *, const char *email); -const char *e_destination_get_name (const EDestination *); /* "Jane Smith" */ -const char *e_destination_get_email (const EDestination *); /* "jane@assbarn.com" */ -const char *e_destination_get_address (const EDestination *); /* "Jane Smith <jane@assbarn.com>" (or a comma-sep set of such for a list) */ - -gboolean e_destination_is_evolution_list (const EDestination *); -gboolean e_destination_list_show_addresses (const EDestination *); - -/* If true, they want HTML mail. */ -void e_destination_set_html_mail_pref (EDestination *dest, gboolean flag); -gboolean e_destination_get_html_mail_pref (const EDestination *); - -/* used by the evolution composer to manage automatic recipients - - XXX should probably be implemented using a more neutral/extensible - approach instead of a hardcoded evolution-only flag. */ -gboolean e_destination_is_auto_recipient (const EDestination *); -void e_destination_set_auto_recipient (EDestination *, gboolean value); - -/* parse out an EDestination (name/email, not contact) from a free form string. */ -void e_destination_set_raw (EDestination *, const char *free_form_string); - -/* generate a plain-text representation of an EDestination* or EDestination** */ -const char *e_destination_get_textrep (const EDestination *, gboolean include_email); /* "Jane Smith" or "jane@assbarn.com" */ -char *e_destination_get_textrepv (EDestination **); - -/* XML export/import routines. */ -char *e_destination_export (const EDestination *); -char *e_destination_exportv (EDestination **); -EDestination *e_destination_import (const char *str); -EDestination **e_destination_importv (const char *str); - -/* EVCard "export" routines */ -void e_destination_export_to_vcard_attribute (EDestination *dest, EVCardAttribute *attr); - -void e_destination_freev (EDestination **); - -#endif /* __E_DESTINATION_H__ */ - diff --git a/addressbook/util/eab-book-util.c b/addressbook/util/eab-book-util.c deleted file mode 100644 index 1fdcd59ca0..0000000000 --- a/addressbook/util/eab-book-util.c +++ /dev/null @@ -1,407 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * eab-util.c - * - * Copyright (C) 2001-2003 Ximian, Inc. - * - * Authors: Jon Trowbridge <trow@ximian.com> - * Chris Toshok <toshok@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#include <config.h> -#include "eab-book-util.h" - -#include <string.h> -#include <glib.h> -#include <glib-object.h> -#include <e-util/e-config-listener.h> - -EConfigListener * -eab_get_config_database () -{ - static EConfigListener *config_db; - - if (config_db == NULL) - config_db = e_config_listener_new (); - - return config_db; -} - -/* - * - * Specialized Queries - * - */ - -static char* -escape (const char *str) -{ - GString *s = g_string_new (""); - const char *p = str; - - while (*p) { - if (*p == '\\') - g_string_append (s, "\\\\"); - else if (*p == '"') - g_string_append (s, "\\\""); - else - g_string_append_c (s, *p); - - p ++; - } - - return g_string_free (s, FALSE); -} - -guint -eab_name_and_email_query (EBook *book, - const gchar *name, - const gchar *email, - EBookListCallback cb, - gpointer closure) -{ - gchar *email_query=NULL, *name_query=NULL; - EBookQuery *query; - guint tag; - char *escaped_name, *escaped_email; - - g_return_val_if_fail (book && E_IS_BOOK (book), 0); - g_return_val_if_fail (cb != NULL, 0); - - if (name && !*name) - name = NULL; - if (email && !*email) - email = NULL; - - if (name == NULL && email == NULL) - return 0; - - escaped_name = name ? escape (name) : NULL; - escaped_email = email ? escape (email) : NULL; - - /* Build our e-mail query. - * We only query against the username part of the address, to avoid not matching - * fred@foo.com and fred@mail.foo.com. While their may be namespace collisions - * in the usernames of everyone out there, it shouldn't be that bad. (Famous last words.) - */ - if (escaped_email) { - const gchar *t = escaped_email; - while (*t && *t != '@') - ++t; - if (*t == '@') { - email_query = g_strdup_printf ("(beginswith \"email\" \"%.*s@\")", t-escaped_email, escaped_email); - - } else { - email_query = g_strdup_printf ("(beginswith \"email\" \"%s\")", escaped_email); - } - } - - /* Build our name query. - * We only do name-query stuff if we don't have an e-mail address. Our basic assumption - * is that the username part of the email is good enough to keep the amount of stuff returned - * in the query relatively small. - */ - if (escaped_name && !escaped_email) - name_query = g_strdup_printf ("(or (beginswith \"file_as\" \"%s\") (beginswith \"full_name\" \"%s\"))", escaped_name, escaped_name); - - /* Assemble our e-mail & name queries */ - if (email_query && name_query) { - char *full_query = g_strdup_printf ("(and %s %s)", email_query, name_query); - query = e_book_query_from_string (full_query); - g_free (full_query); - } - else if (email_query) { - query = e_book_query_from_string (email_query); - } - else if (name_query) { - query = e_book_query_from_string (name_query); - } - else - return 0; - - tag = e_book_async_get_contacts (book, query, cb, closure); - - g_free (email_query); - g_free (name_query); - g_free (escaped_email); - g_free (escaped_name); - e_book_query_unref (query); - - return tag; -} - -/* - * Simple nickname query - */ -guint -eab_nickname_query (EBook *book, - const char *nickname, - EBookListCallback cb, - gpointer closure) -{ - EBookQuery *query; - char *query_string; - guint retval; - - g_return_val_if_fail (E_IS_BOOK (book), 0); - g_return_val_if_fail (nickname != NULL, 0); - - /* The empty-string case shouldn't generate a warning. */ - if (! *nickname) - return 0; - - query_string = g_strdup_printf ("(is \"nickname\" \"%s\")", nickname); - - query = e_book_query_from_string (query_string); - - retval = e_book_async_get_contacts (book, query, cb, closure); - - g_free (query_string); - g_object_unref (query); - - return retval; -} - -GList* -eab_contact_list_from_string (const char *str) -{ - GList *contacts = NULL; - GString *gstr = g_string_new (""); - char *str_stripped; - char *p = (char*)str; - char *q; - - if (!p) - return NULL; - - if (!strncmp (p, "Book: ", 6)) { - p = strchr (p, '\n'); - if (!p) { - g_warning (G_STRLOC ": Got book but no newline!"); - return NULL; - } - p++; - } - - while (*p) { - if (*p != '\r') g_string_append_c (gstr, *p); - - p++; - } - - q = p = str_stripped = g_string_free (gstr, FALSE); - - /* Note: The VCard standard says - * - * vcard = "BEGIN" [ws] ":" [ws] "VCARD" [ws] 1*CRLF - * items *CRLF "END" [ws] ":" [ws] "VCARD" - * - * which means we can have whitespace (e.g. "BEGIN : VCARD"). So we're not being - * fully compliant here, although I'm not sure it matters. The ideal solution - * would be to have a vcard parsing function that returned the end of the vcard - * parsed. Arguably, contact list parsing should all be in libebook's e-vcard.c, - * where we can do proper parsing and validation without code duplication. */ - - for (p = strstr (p, "BEGIN:VCARD"); p; p = strstr (q, "\nBEGIN:VCARD")) { - gchar *card_str; - - if (*p == '\n') - p++; - - for (q = strstr (p, "END:VCARD"); q; q = strstr (q, "END:VCARD")) { - gchar *temp; - - q += 9; - temp = q; - temp += strspn (temp, "\r\n\t "); - - if (*temp == '\0' || !strncmp (temp, "BEGIN:VCARD", 11)) - break; /* Found the outer END:VCARD */ - } - - if (!q) - break; - - card_str = g_strndup (p, q - p); - contacts = g_list_append (contacts, e_contact_new_from_vcard (card_str)); - g_free (card_str); - } - - g_free (str_stripped); - - return contacts; -} - -char* -eab_contact_list_to_string (GList *contacts) -{ - GString *str = g_string_new (""); - GList *l; - - for (l = contacts; l; l = l->next) { - EContact *contact = l->data; - char *vcard_str = e_vcard_to_string (E_VCARD (contact), EVC_FORMAT_VCARD_30); - - g_string_append (str, vcard_str); - if (l->next) - g_string_append (str, "\r\n\r\n"); - } - - return g_string_free (str, FALSE); -} - -gboolean -eab_book_and_contact_list_from_string (const char *str, EBook **book, GList **contacts) -{ - const char *s0, *s1; - char *uri; - - g_return_val_if_fail (str != NULL, FALSE); - g_return_val_if_fail (book != NULL, FALSE); - g_return_val_if_fail (contacts != NULL, FALSE); - - *contacts = eab_contact_list_from_string (str); - - if (!strncmp (str, "Book: ", 6)) { - s0 = str + 6; - s1 = strchr (str, '\r'); - - if (!s1) - s1 = strchr (str, '\n'); - } else { - s0 = NULL; - s1 = NULL; - } - - if (!s0 || !s1) { - *book = NULL; - return FALSE; - } - - uri = g_strndup (s0, s1 - s0); - *book = e_book_new_from_uri (uri, NULL); - g_free (uri); - - return *book ? TRUE : FALSE; -} - -char * -eab_book_and_contact_list_to_string (EBook *book, GList *contacts) -{ - char *s0, *s1; - - s0 = eab_contact_list_to_string (contacts); - if (!s0) - s0 = g_strdup (""); - - if (book) - s1 = g_strconcat ("Book: ", e_book_get_uri (book), "\r\n", s0, NULL); - else - s1 = g_strdup (s0); - - g_free (s0); - return s1; -} - -#if notyet -/* - * Convenience routine to check for addresses in the local address book. - */ - -typedef struct _HaveAddressInfo HaveAddressInfo; -struct _HaveAddressInfo { - gchar *email; - EBookHaveAddressCallback cb; - gpointer closure; -}; - -static void -have_address_query_cb (EBook *book, EBookSimpleQueryStatus status, const GList *contacts, gpointer closure) -{ - HaveAddressInfo *info = (HaveAddressInfo *) closure; - - info->cb (book, - info->email, - contacts && (status == E_BOOK_ERROR_OK) ? E_CONTACT (contacts->data) : NULL, - info->closure); - - g_free (info->email); - g_free (info); -} - -static void -have_address_book_open_cb (EBook *book, gpointer closure) -{ - HaveAddressInfo *info = (HaveAddressInfo *) closure; - - if (book) { - - e_book_name_and_email_query (book, NULL, info->email, have_address_query_cb, info); - - } else { - - info->cb (NULL, info->email, NULL, info->closure); - - g_free (info->email); - g_free (info); - - } -} - -void -eab_query_address_default (const gchar *email, - EABHaveAddressCallback cb, - gpointer closure) -{ - HaveAddressInfo *info; - - g_return_if_fail (email != NULL); - g_return_if_fail (cb != NULL); - - info = g_new0 (HaveAddressInfo, 1); - info->email = g_strdup (email); - info->cb = cb; - info->closure = closure; - - e_book_use_default_book (have_address_book_open_cb, info); -} -#endif - -/* bad place for this i know. */ -int -e_utf8_casefold_collate_len (const gchar *str1, const gchar *str2, int len) -{ - gchar *s1 = g_utf8_casefold(str1, len); - gchar *s2 = g_utf8_casefold(str2, len); - int rv; - - rv = g_utf8_collate (s1, s2); - - g_free (s1); - g_free (s2); - - return rv; -} - -int -e_utf8_casefold_collate (const gchar *str1, const gchar *str2) -{ - return e_utf8_casefold_collate_len (str1, str2, -1); -} diff --git a/addressbook/util/eab-book-util.h b/addressbook/util/eab-book-util.h deleted file mode 100644 index c1362f1571..0000000000 --- a/addressbook/util/eab-book-util.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ - -/* - * e-book-util.h - * - * Copyright (C) 2001-2003 Ximian, Inc. - * - * Authors: Jon Trowbridge <trow@ximian.com> - * Chris Toshok <toshok@ximian.com> - */ - -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - * USA. - */ - -#ifndef __EAB_UTIL_H__ -#define __EAB_UTIL_H__ - -#include <bonobo/bonobo-object.h> -#include <bonobo/bonobo-moniker-util.h> -#include <libebook/e-book.h> -#include "e-util/e-config-listener.h" - -G_BEGIN_DECLS - -typedef void (*EABHaveAddressCallback) (EBook *book, const gchar *addr, EContact *contact, gpointer closure); - -/* config database interface. */ -EConfigListener *eab_get_config_database (void); - -/* Specialized Name/Email Queries */ -guint eab_name_and_email_query (EBook *book, - const char *name, - const char *email, - EBookListCallback cb, - gpointer closure); -guint eab_nickname_query (EBook *book, - const char *nickname, - EBookListCallback cb, - gpointer closure); - -GList *eab_contact_list_from_string (const char *str); -char *eab_contact_list_to_string (GList *contacts); - -gboolean eab_book_and_contact_list_from_string (const char *str, EBook **book, GList **contacts); -char *eab_book_and_contact_list_to_string (EBook *book, GList *contacts); - -/* Returns the EContact associated to email in the callback, - or NULL if no match is found in the default address book. */ -void eab_query_address_default (const gchar *email, - EABHaveAddressCallback cb, - gpointer closure); - -int e_utf8_casefold_collate_len (const gchar *str1, const gchar *str2, int len); -int e_utf8_casefold_collate (const gchar *str1, const gchar *str2); - -G_END_DECLS - -#endif /* __EAB_UTIL_H__ */ - diff --git a/addressbook/util/eab-marshal.list b/addressbook/util/eab-marshal.list deleted file mode 100644 index 680ea039a3..0000000000 --- a/addressbook/util/eab-marshal.list +++ /dev/null @@ -1,5 +0,0 @@ -NONE:NONE -NONE:BOOL -NONE:POINTER -NONE:STRING -NONE:INT |