diff options
Diffstat (limited to 'composer')
22 files changed, 0 insertions, 6256 deletions
diff --git a/composer/.cvsignore b/composer/.cvsignore deleted file mode 100644 index 8acab05c77..0000000000 --- a/composer/.cvsignore +++ /dev/null @@ -1,12 +0,0 @@ -.deps -.libs -evolution-msg-composer -Makefile -Makefile.in -*.lo -*.la -Evolution-Addressbook-SelectNames-stubs.c -Evolution-Addressbook-SelectNames-skels.c -Evolution-Addressbook-SelectNames-common.c -Evolution-Addressbook-SelectNames.h - diff --git a/composer/ChangeLog b/composer/ChangeLog deleted file mode 100644 index f5c8462b0b..0000000000 --- a/composer/ChangeLog +++ /dev/null @@ -1,496 +0,0 @@ -2000-08-01 JP Rosevear <jpr@helixcode.com> - - * e-msg-composer.h: Constify param - - * e-msg-composer.c (get_signature): Constify param - (set_editor_text): ditto - (e_msg_composer_new_with_sig_file): ditto - -2000-08-01 Peter Williams <peterw@helixcode.com> - - * e-msg-composer.c (set_editor_text): sizeof("--\") != - strlen("--\n"), breaking the test for the signature prefix. - -2000-07-28 JP Rosevear <jpr@helixcode.com> - - * e-msg-composer.c (e_msg_composer_new_with_sig_file): New - function to create composer with sig file set. - (e_msg_composer_get_sig_file): New function to get sig file - (e_msg_composer_set_sig_file): New function to set sig file - -2000-07-25 Michael Meeks <michael@helixcode.com> - - * e-msg-composer.c (get_text): add textual exception printout. - (set_editor_text): close pre tags & check for pre-existing - sig separator. - -2000-07-25 Peter Williams <peterw@helixcode.com> - - * e-msg-composer.c (menu_file_insert_file_cb): Mark this function - as FIXME because we're waiting for the HTML Editor Control to - support paste commands. Also some updates for when that happens. - -2000-07-24 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c: Remove GOAD support. - (create_editor): Try to give a more helpful error message when - failing to load the editor control. - -2000-07-23 Ettore Perazzoli <ettore@helixcode.com> - - * e-msg-composer.c (menu_format_html_cb): New callback for the - "Send HTML" menu toggle item. - (create_menubar_format): New. - (create_menubar): Call it. - (create_menubar_options): Removed. - (init): Initialize `send_html' and `attachment_bar_visible' to - FALSE. - (get_signature): Add `void' to the declaration. This is C, not - C++. - (menu_file_close_cb): Renamed from `exit_cb'. - (menu_file_send_cb): Renamed from `send_cb'. - (menu_file_save_as_cb): Renamed from `save_as_cb'. - (menu_file_save_cb): Renamed from `save_cb'. - (menu_file_open_cb): Renamed from `open_cb'. - (menu_file_add_attachment_cb): Renamed from `add_attachment_cb'. - (menu_file_insert_file_cb): Renamed from `insert_file_cb'. - (e_msg_composer_set_send_html): New. - (build_message): Use the `send_html' flag instead of peeking the - `msg_format' gnome-config value directly. - - * e-msg-composer.h: New member `send_html' in `EMsgComposer'. - -2000-07-23 Ettore Perazzoli <ettore@helixcode.com> - - * e-msg-composer.c: Changed to use BonoboUIHandler stuff directly - instead of translating from GnomeUIInfo. - (create_menubar_file): New. - (create_menubar_edit): New. - (create_menubar_view): New. - (create_menubar_options): New. - (create_menubar): Use these functions to set up the menu bar. - (create_toolbar): Use BonoboUIHandler directly instead of - converting from GnomeUIInfo. - (toolbar_view_attachments_clicked_cb): Removed. - (address_dialog_cb): Removed. - (address_dialog_destroy_cb): Removed. - (address_dialog_apply_cb): Removed. - (setup_address_dialog): Removed. - -2000-07-12 Peter Williams <peterw@helixcode.com> - - * e-msg-composer.c: (view_tree) Make the "View Attachments" item - a toggleitem ... so that it can be toggled... - (menu_view_attachments_activate_cb): Treat the widget correctly - and toggle correctly. - -2000-07-10 Ettore Perazzoli <ettore@helixcode.com> - - * e-msg-composer.c (exit_cb): Use it. - (delete_event): New, handler for the "delete_event" signal. - -2000-07-09 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (set_editor_text): Don't load "" into the - editor, because it will cause the editor component to g_warning. - -2000-07-09 Christopher James Lahey <clahey@helixcode.com> - - * e-msg-composer-hdrs.c: Removed the extra frame here. - -2000-07-08 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (create_menubar): Create an empty "Edit" menu - for the editor control to insert itself into. - -2000-07-08 Jeffrey Stedfast <fejj@helixcode.com> - - * .cvsignore: Ignore dynamically created source files - -2000-07-08 Ettore Perazzoli <ettore@helixcode.com> - - * e-msg-composer-hdrs.c (set_entry): New. - (e_msg_composer_hdrs_set_to): Use it. - (e_msg_composer_hdrs_set_cc): Likewise - (e_msg_composer_hdrs_set_bcc): Likewise. - (e_msg_composer_hdrs_get_to): Replace implementation with a - `g_assert_not_reached()'. - (e_msg_composer_hdrs_get_cc): Likewise. - (e_msg_composer_hdrs_get_bcc): Likewise. - - * e-msg-composer.c: Get rid of cut/copy/paste/undo as they - duplicate the editor toolbar and cannot be made to work for all - the widgets anyway. - -2000-07-08 Ettore Perazzoli <ettore@helixcode.com> - - * e-msg-composer-hdrs.c: New member `corba_select_names' in - `EMsgComposerHdrsPrivate'. - (destroy): If not `CORBA_OBJECT_NIL', release. - (init): Init to `CORBA_OBJECT_NIL'. - (setup_corba): New. - (e_msg_composer_hdrs_new): Call it. - (add_entry): Create the entries by using the ::SelectNames - interface. - (address_button_clicked_cb): Activate the dialog through the - ::SelectNames interface. - -2000-06-29 Jeffrey Stedfast <fejj@helixcode.com> - - * e-msg-composer.c: Changed "Exit" to "Close" in the File menu. - This is a little more intuitive as it does not suggest exiting - the application, just says "close this window". - -2000-06-26 Christopher James Lahey <clahey@helixcode.com> - - * Makefile.am: Added e-msg-composer-select-file.h for make - distcheck. - -2000-06-26 Ettore Perazzoli <ettore@helixcode.com> - - * e-msg-composer.c - (load): New. - (open_cb): Use it. - (save): New function. - (save_cb): Implemented by using it. - (save_as_cb): Likewise. - -2000-06-17 Ettore Perazzoli <ettore@helixcode.com> - - * e-msg-composer.c (e_msg_composer_construct): I18N the title bar. - - * Makefile.am (libcomposerinclude_HEADERS): Removed. Move all the - `.h' files into `libcomposer_la_SOURCES' so that they get - distributed, but not installed. - - * e-msg-composer.c (open_cb): New; implement the `Open' command. - (save_as_cb): New; implement the `Save as' command. - (init): Initialize the `persist_file_interface' and - `persist_stream_interface' members to NULL. - (destroy): Release the PersistStream and PersistFile interfaces. - (e_msg_composer_construct): Query the PersistFile and - PersistStream interfaces on the control and save them in the - `persist_file_interface' and `persist_stream_interface' members. - (get_text): Renamed from `get_editor_text'. Get a - @persist_stream_interface instead of querying it a the control. - (build_message): Return NULL if `persist_stream_interface' is nil. - - * e-msg-composer.h: New member `persist_file_interface' in - `EMsgComposer'. - - * e-msg-composer-select-file.c: New. - * e-msg-composer-select-file.h: New. - - * e-msg-composer.c (e_msg_composer_construct): Make the `To:' - entry grab the keyboard focus. - - * e-msg-composer-hdrs.c (e_msg_composer_hdrs_get_to_entry): New. - (e_msg_composer_hdrs_get_cc_entry): New. - (e_msg_composer_hdrs_get_bcc_entry): New. - (e_msg_composer_hdrs_get_subject_entry): New. - - * e-msg-composer.c (e_msg_composer_construct): Set the scroll - frame's shadow type to `GTK_SHADOW_IN'. - (format_text): Initialize `tabbing' to zero to shut down the - compiler. - -2000-06-14 Dan Winship <danw@helixcode.com> - - * e-msg-composer-attachment-bar.c (add_from_user): keep the - GtkFileSelection around between calls so we start up in the same - directory we ended up in last time around. (Also fixes a big - memory leak in that the code was already keeping the - GtkFileSelection around, it just wasn't remembering to reuse it.) - - * e-msg-composer.c (format_text): Don't line-wrap lines that start - with ">". - -2000-06-12 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (format_text): If a paragraph starts with TABs, - indent the whole paragraph to that tab level. - -2000-06-12 Ettore Perazzoli <ettore@helixcode.com> - - * e-msg-composer.c: Make the `attachment_scroll_frame' an - `EScrollFrame'. - (exit_cb): I18N the quit message. - - * e-msg-composer.h: `attachment_scrolled_window' renamed to - `attachment_scroll_frame'. - -2000-06-12 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (format_text): Don't break on non-breaking - spaces, don't keep non-breaking spaces that fall after a line - wrap, and translate non-breaking spaces to regular ones after - wrapping. - -2000-06-05 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (e_msg_composer_attach): New convenience - function. - - * e-msg-composer-attachment.c: Store a CamelMimePart rather than - filename/description/mime_type info. Also record whether we were - told or guessed the MIME type. - (e_msg_composer_attachment_new_from_mime_part): New constructor. - (e_msg_composer_attachment_edit): Remove the "browse" button. (If - the user wants to change the actual file that the attachment is - based on, he should delete the attachment and create a new one...) - Remove the "Apply" button, because it's not all that useful. Make - the MIME type only track the filename if it was guessed rather - than being provided. - - * e-msg-composer-attachment.glade: Remove "browse" and "apply" - buttons. Make filename editable. - - * e-msg-composer-attachment-bar.c (sort): Removed. Send the - attachments in the order the user attached them in. - (text_changed): Removed, since we weren't enabling the relevant - GnomeIconList functionality that would have used this. - (update): Don't print the size if it's 0. - (attach_to_multipart, etc): adjust for EMsgComposerAttachment - changes. - (attach_to_multipart): Use 7bit encoding for message/ subparts. - (e_msg_composer_attachment_bar_attach_mime_part): New convenience - function. - - -2000-06-02 Christopher James Lahey <clahey@helixcode.com> - - * e-msg-composer.c: Added the ability to save plain text mail. - -2000-05-29 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (get_editor_text): add a "format" argument so - we can fetch different kinds of text. - (format_text): New function to do line wrapping on plain text. - (build_message): Build multipart/alternative messages rather than - HTML-only ones. Yay. We don't suck (as much) any more! - -2000-05-28 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c: #include <errno.h> - -2000-05-26 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (get_editor_text, set_editor_text): Update for - PersistStream changes - (build_message): Update for CamelMultipart changes. - - * e-msg-composer.c (get_signature): routine to read the user's - signature file. - (set_editor_text): If the user has configured a signature, append - it to the set text. - (e_msg_composer_new): Call set_editor_text with "" to load the - signature (if any). - -2000-05-25 Not Zed <NotZed@HelixCode.com> - - * e-msg-composer.c (build_message): Use camel_data_wrapper_new - instead of camel_simple_data_wrapper_new. - -2000-05-17 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (build_message): Use - camel_simple_data_wrapper_new rather than camel_data_wrapper_new. - -2000-05-13 Valek Filippov <frob@df.ru> - - * e-msg-composer-attachment.glade: save translatable strings - * e-msg-composer-attachment.glade.h: file with strings - * e-msg-composer-address-dialog.glade: save translatable strings - * e-msg-composer-address-dialog.glade.h: file with strings - -2000-05-12 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (get_editor_text): NUL-terminate the data - extracted from the BonoboStream. - -2000-05-10 Dan Winship <danw@helixcode.com> - - * e-msg-composer-attachment-bar.c (attach_to_multipart): deal with - Content-Transfer-Encoding a little bit at least. - -2000-05-07 Mathieu Lacage <mathieu@gnu.org> - - * e-msg-composer.c (create_editor): remove FIXME and hardcoded - string. You can write mails with OAF now. - -2000-05-07 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (build_message): unref content, etc. after - attaching it to message. - - * e-msg-composer-attachment-bar.c (attach_to_multipart): unref - part after attaching it. - -2000-05-06 Christopher James Lahey <clahey@helixcode.com> - - * e-msg-composer-hdrs.c: Turned off focus in the To, Cc, and Bcc - buttons. - -2000-05-02 Matt Loper <matt@helixcode.com> - - * Makefile.am: set G_LOG_DOMAIN. - -2000-04-28 Dan Winship <danw@helixcode.com> - - * e-msg-composer-hdrs.c (set_recipients): Update (minimally) for - Camel recipient changes. - -2000-04-27 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (e_msg_composer_new_from_url): New routine, to - process mailto URLs. - -2000-04-26 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (build_message): Only generate a multipart - message if there are attachments. Otherwise generate a single - part. - - * Update for CamelMimeBodyPart -> CamelMimePart - -2000-04-26 Dan Winship <danw@helixcode.com> - - * e-msg-composer-attachment-bar.c (attach_to_multipart): add a - s/SIMPLE_// that notzed missed. Update to use - camel_mime_part_set_content. - * e-msg-composer.c (build_message): remove a now-unused variable. - Update for camel_mime_part_set_content. - -2000-04-26 NotZed <NotZed@HelixCode.com> - - * e-msg-composer.c (build_message): Use camel_mime_part_set_text() - to set the text rather than messing with data wrappers. - - * e-msg-composer-attachment-bar.c (attach_to_multipart): Change - for new camel-stream interfaces. - (attach_to_multipart): Also set base64 encoding by default. - -2000-04-25 Radek Doulik <rodo@helixcode.com> - - * e-msg-composer.c (create_editor): use uih here - (e_msg_composer_construct): create menubar/toolbar before creating - editor control - -2000-04-23 Dan Winship <danw@helixcode.com> - - * Makefile.am: build libcomposer static and don't install it. - - * e-msg-composer-attachment-bar.c (attach_to_multipart): This was - only half-implemented. Finish it, mostly. - -2000-04-22 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (e_msg_composer_add_header): new function to - make the composer record additional headers it should output. - (In-Reply-To), etc. - (build_message): output them - -2000-04-21 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (e_msg_composer_set_headers): - (e_msg_composer_set_body_text): new functions - (exit_cb): Connect "Exit" menu item finally. - - * e-msg-composer-hdrs.c: const poisoning - (e_msg_composer_hdrs_set_subject): - (e_msg_composer_hdrs_get_subject): new functions - - * e-msg-composer-address-entry.c: const poisoning - -2000-04-20 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (get_editor_text, set_editor_text): new - functions to get and set the contents of the HTML editor via - Bonobo::PersistStream. - (build_message): use get_editor_text. This works again. - -2000-04-17 Dan Winship <danw@helixcode.com> - - * e-msg-composer.c (build_message): Change - camel_mime_message_new_with_session to camel_mime_message_new - -2000-03-17 bertrand <bertrand@helixcode.com> - - * e-msg-composer.c (create_menubar): Pass the composer as the data - for the menubar callbacks. - -2000-03-12 Matt Loper <matt@helixcode.com> - - * Makefile.am: Modified to make the composer into a library, to be - used by the mail component. - -2000-03-07 Ettore Perazzoli <ettore@helixcode.com> - - * e-msg-composer.c (create_toolbar): Pass the composer as the data - for the toolbar callbacks. - (e_msg_composer_construct): Connect the "changed" signal of the - attachment bar to `attachment_bar_changed()'. - (attachment_bar_changed): Renamed to `attachment_bar_changed_cb'. - -2000-03-02 Ettore Perazzoli <ettore@helixcode.com> - - * e-msg-composer.c (e_msg_composer_new): Precondition: - gtk_main_level() greater than zero. - (e_msg_composer_construct): Likewise. - (create_menus): New function. Set up menus through - BonoboUIHandler. - (e_msg_composer_construct): Use it. - - * main.c (main): Initialize Bonobo. - - * e-msg-composer.c (init): Initialize `uih' and `editor' to NULL. - Do not init `text' and `text_scrolled_window' anymore. - (destroy): Unref `uih'. - (e_msg_composer_construct): Create a new BonoboUIHandler and put - it into `uih'. - (create_editor): New helper function. - (e_msg_composer_construct): Use it to set up the editor. - - * e-msg-composer.h: New member `uih' in `EMsgComposer'. Removed - members `text', `text_scrolled_window'. New member `editor'. - - * Makefile.am (INCLUDES): Add `$(BONOBO_GNOME_CFLAGS)'. - (evolution_msg_composer_LDADD): Add `$(BONOBO_GNOME_LIBS)'. - - * e-msg-composer.c (glade_connect): Removed. - (setup_signals): Removed. - (e_msg_composer_construct): Do not use libglade to set the toolbar - and menubar up. - (destroy): Removed libglade stuff. - (init): Likewise. - - * e-msg-composer.h: Removed `menubar_gui', `toolbar_gui', - `appbar_gui'. - - * e-msg-composer.glade: Removed. - -2000-01-12 bertrand <bertrand@helixcode.com> - - * Makefile.am (evolution_msg_composer_LDADD): - use $(EXTRA_GNOME_LIBS_THREADS) to link with gthread - -1999-11-17 Ettore Perazzoli <ettore@gnu.org> - - * Makefile.am: New Makefile to compile the message composer - executable. - - * main.c: New file. - - * e-msg-composer-hdrs.c (e_msg_composer_hdrs_to_message): Use - `CAMEL_RECIPIENT*' macros instead of the old `RECIPIENT*' ones - that do not exist anymore. - - * e-msg-composer-address-dialog.c - (e_msg_composer_address_dialog_construct): Use `E_GLADEDIR' - instead of `E_GUIDIR'. - * e-msg-composer-attachment.c (e_msg_composer_attachment_edit): - Likewise. - * e-msg-composer.c (e_msg_composer_construct): Likewise. - -(See `$(top_srcdir)/widgets/ChangeLog' for previous changes to the -message composer.) diff --git a/composer/Makefile.am b/composer/Makefile.am deleted file mode 100644 index 44c19403ca..0000000000 --- a/composer/Makefile.am +++ /dev/null @@ -1,65 +0,0 @@ -## CORBA stuff - -IDLS = \ - $(top_srcdir)/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl - -IDL_GENERATED = \ - Evolution-Addressbook-SelectNames.h \ - Evolution-Addressbook-SelectNames-common.c \ - Evolution-Addressbook-SelectNames-skels.c \ - Evolution-Addressbook-SelectNames-stubs.c - -Evolution-Addressbook-SelectNames-impl.o: Evolution-Addressbook-SelectNames.h - -$(IDL_GENERATED): $(IDLS) - $(ORBIT_IDL) -I$(datadir)/idl -I`$(GNOME_CONFIG) --datadir`/idl \ - $(top_srcdir)/addressbook/gui/component/select-names/Evolution-Addressbook-SelectNames.idl - -## - -gladedir = $(datadir)/evolution/glade - -glade_DATA = \ - e-msg-composer-address-dialog.glade \ - e-msg-composer-address-dialog.glade.h \ - e-msg-composer-attachment.glade \ - e-msg-composer-attachment.glade.h - -libcomposerincludedir = $(includedir)/composer - -noinst_LTLIBRARIES = libcomposer.la -libcomposer_la_LDFLAGS = -static - -INCLUDES = \ - -I$(top_srcdir) \ - -I$(top_builddir) \ - -I$(top_srcdir)/camel \ - -I$(top_builddir)/camel \ - -I$(top_builddir)/addressbook/gui/component/select-names \ - $(GNOME_INCLUDEDIR) \ - $(BONOBO_GNOME_CFLAGS) \ - -DG_LOG_DOMAIN=\"composer\" - -CPPFLAGS = \ - -DE_GLADEDIR=\"$(gladedir)\" - -libcomposer_la_SOURCES = \ - $(IDL_GENERATED) \ - e-msg-composer-address-dialog.c \ - e-msg-composer-address-dialog.h \ - e-msg-composer-address-entry.c \ - e-msg-composer-address-entry.h \ - e-msg-composer-attachment-bar.c \ - e-msg-composer-attachment-bar.h \ - e-msg-composer-attachment.c \ - e-msg-composer-attachment.h \ - e-msg-composer-hdrs.c \ - e-msg-composer-hdrs.h \ - e-msg-composer-select-file.c \ - e-msg-composer-select-file.h \ - e-msg-composer.c \ - e-msg-composer.h - -EXTRA_DIST = \ - $(glade_DATA) \ - ChangeLog diff --git a/composer/e-msg-composer-address-dialog.c b/composer/e-msg-composer-address-dialog.c deleted file mode 100644 index 42a594756d..0000000000 --- a/composer/e-msg-composer-address-dialog.c +++ /dev/null @@ -1,660 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-msg-composer-address-dialog.c - * - * Copyright (C) 1999 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#include <gnome.h> -#include "e-msg-composer-address-dialog.h" - - -enum { - APPLY, - LAST_SIGNAL -}; -static guint signals[LAST_SIGNAL] = { 0 }; - -static GnomeDialogClass *parent_class = NULL; - - -/* This function should load the addresses we know of into the dialog. We - don't have a precise setup for the addressbook yet, so we will just put some - fake entries in. */ -static void -load_addresses (EMsgComposerAddressDialog *dialog) -{ - gchar *text[][3] = { - { "Bertrand Guiheneuf", "Bertrand.Guiheneuf@aful.org", NULL }, - { "Ettore Perazzoli", "ettore@gnu.org", NULL }, - { "Miguel de Icaza", "miguel@gnu.org", NULL }, - { "Nat Friedman", "nat@nat.org", NULL }, - { NULL, NULL, NULL } - }; - GtkCList *clist; - guint i; - - clist = GTK_CLIST (glade_xml_get_widget (dialog->gui, "address_clist")); - - for (i = 0; text[i][0] != NULL; i++) - gtk_clist_append (clist, text[i]); -} - -/* Combine name and email into an address, e.g. "Ettore Perazzoli - <ettore@gnu.org>". FIXME FIXME FIXME this does not handle quoting (commas - will cause troubles), but it should. */ -static gchar * -make_full_address (const gchar *name, - const gchar *email) -{ - return g_strconcat (name, " <", email, ">", NULL); -} - -/* This loads the selected address in the address GtkCList into the requested - GtkList. */ -static void -add_address (EMsgComposerAddressDialog *dialog, - const gchar *list_name) -{ - GtkCList *src_clist; - GtkCList *dest_clist; - gchar *name, *email; - gchar *text[2]; - guint row; - - src_clist = GTK_CLIST (glade_xml_get_widget (dialog->gui, - "address_clist")); - if (src_clist->selection == NULL) - return; - - dest_clist = GTK_CLIST (glade_xml_get_widget (dialog->gui, list_name)); - row = GPOINTER_TO_INT (src_clist->selection->data); - - gtk_clist_get_text (src_clist, row, 0, &name); - gtk_clist_get_text (src_clist, row, 1, &email); - - text[0] = make_full_address (name, email); - text[1] = NULL; - - gtk_clist_append (dest_clist, text); - - g_free (text[0]); -} - -static void -apply (EMsgComposerAddressDialog *dialog) -{ - gtk_signal_emit (GTK_OBJECT (dialog), signals[APPLY]); -} - - -/* Recipient list popup menu. */ - -struct _RecipientListInfo { - EMsgComposerAddressDialog *dialog; - GtkCList *clist; - gint row; /* -1 if menu was popped up in an empty - area. */ -}; -typedef struct _RecipientListInfo RecipientListInfo; - -static void -copy_recipient (RecipientListInfo *info, - gboolean remove) -{ - gchar *text; - gint row; - - if (info->clist->selection == NULL) - return; - - row = GPOINTER_TO_INT (info->clist->selection->data); - gtk_clist_get_text (info->clist, row, 0, &text); - - g_free (info->dialog->cut_buffer); - info->dialog->cut_buffer = g_strdup (text); - - if (remove) - gtk_clist_remove (info->clist, row); - - gtk_selection_owner_set (GTK_WIDGET (info->clist), - GDK_SELECTION_PRIMARY, - GDK_CURRENT_TIME); -} - -static void -copy_recipient_cb (GtkWidget *widget, - gpointer data) -{ - RecipientListInfo *info; - - info = (RecipientListInfo *) data; - copy_recipient (info, FALSE); - g_free (info); -} - -static void -cut_recipient_cb (GtkWidget *widget, - gpointer data) -{ - RecipientListInfo *info; - - info = (RecipientListInfo *) data; - copy_recipient (info, TRUE); - g_free (info); -} - -static void -paste_recipient_cb (GtkWidget *widget, - gpointer data) -{ - RecipientListInfo *info; - GdkAtom atom; - gchar *text[2]; - - info = (RecipientListInfo *) data; - - atom = gdk_atom_intern ("STRING", FALSE); - gtk_selection_convert (GTK_WIDGET (info->clist), - GDK_SELECTION_PRIMARY, - atom, - GDK_CURRENT_TIME); - - g_free (info); -} - -static GnomeUIInfo recipient_list_item_popup_info[] = { - GNOMEUIINFO_ITEM_STOCK (N_("Cut"), - N_("Cut selected item into clipboard"), - cut_recipient_cb, - GNOME_STOCK_MENU_CUT), - GNOMEUIINFO_ITEM_STOCK (N_("Copy"), - N_("Copy selected item into clipboard"), - copy_recipient_cb, - GNOME_STOCK_MENU_COPY), - GNOMEUIINFO_ITEM_STOCK (N_("Paste"), - N_("Paste item from clipboard"), - paste_recipient_cb, - GNOME_STOCK_MENU_PASTE), - GNOMEUIINFO_END -}; - -static GnomeUIInfo recipient_list_popup_info[] = { - GNOMEUIINFO_ITEM_STOCK (N_("Paste"), - N_("Paste item from clipboard"), - paste_recipient_cb, - GNOME_STOCK_MENU_PASTE), - GNOMEUIINFO_END -}; - - -/* Signals. */ - -static void -add_to_cb (GtkWidget *widget, - gpointer data) -{ - add_address (E_MSG_COMPOSER_ADDRESS_DIALOG (data), "to_clist"); -} - -static void -add_cc_cb (GtkWidget *widget, - gpointer data) -{ - add_address (E_MSG_COMPOSER_ADDRESS_DIALOG (data), "cc_clist"); -} - -static void -add_bcc_cb (GtkWidget *widget, - gpointer data) -{ - add_address (E_MSG_COMPOSER_ADDRESS_DIALOG (data), "bcc_clist"); -} - -static void -glade_connect (GladeXML *gui, - const gchar *widget_name, - const gchar *signal_name, - GtkSignalFunc callback, - gpointer callback_data) -{ - GtkWidget *widget; - - widget = glade_xml_get_widget (gui, widget_name); - if (widget == NULL) - g_warning ("Widget `%s' was not found.", widget_name); - else - gtk_signal_connect (GTK_OBJECT (widget), signal_name, - GTK_SIGNAL_FUNC (callback), callback_data); -} - -static gint -recipient_clist_button_press_cb (GtkWidget *widget, - GdkEventButton *event, - gpointer data) -{ - EMsgComposerAddressDialog *dialog; - RecipientListInfo *info; - GtkWidget *popup; - GtkCList *clist; - gboolean on_row; - gint row, column; - - dialog = E_MSG_COMPOSER_ADDRESS_DIALOG (data); - - clist = GTK_CLIST (widget); - - if (event->window != clist->clist_window || event->button != 3) - return FALSE; - - on_row = gtk_clist_get_selection_info (clist, event->x, event->y, - &row, &column); - - info = g_new (RecipientListInfo, 1); - info->dialog = dialog; - info->clist = clist; - - if (on_row) { - gtk_clist_unselect_all (clist); - gtk_clist_select_row (clist, row, 0); - info->row = row; - popup = gnome_popup_menu_new (recipient_list_item_popup_info); - } else { - info->row = -1; - popup = gnome_popup_menu_new (recipient_list_popup_info); - } - - gnome_popup_menu_do_popup_modal (popup, NULL, NULL, event, info); - - gtk_widget_destroy (popup); - - return TRUE; -} - -/* FIXME needs more work. */ -static void -recipient_clist_selection_received_cb (GtkWidget *widget, - GtkSelectionData *selection_data, - guint time, - gpointer data) -{ - GtkCList *clist; - gchar *text[2]; - gchar *p; - - puts (__FUNCTION__); - - if (selection_data->length < 0) - return; - - clist = GTK_CLIST (widget); - - /* FIXME quoting. */ - text[0] = g_strdup (selection_data->data); - text[1] = NULL; - - /* It is a common mistake to paste `\n's, let's work around that. */ - for (p = text[0]; *p != '\0'; p++) { - if (*p == '\n') { - *p = '\0'; - break; - } - } - - if (clist->selection != NULL) { - gint row; - - row = GPOINTER_TO_INT (clist->selection->data); - gtk_clist_insert (clist, row, text); - } else { - gtk_clist_append (clist, text); - } - - g_free (text[0]); -} - -static void -recipient_clist_selection_get_cb (GtkWidget *widget, - GtkSelectionData *selection_data, - guint info, - guint time, - gpointer data) -{ - EMsgComposerAddressDialog *dialog; - GdkAtom atom; - - puts (__FUNCTION__); - - dialog = E_MSG_COMPOSER_ADDRESS_DIALOG (data); - if (dialog->cut_buffer == NULL) - return; /* FIXME should I do something special? */ - - atom = gdk_atom_intern ("STRING", FALSE); - gtk_selection_data_set (selection_data, atom, 8, - dialog->cut_buffer, - strlen (dialog->cut_buffer)); -} - -static void -recipient_clist_selection_clear_event_cb (GtkWidget *widget, - GdkEventSelection *selection, - gpointer data) -{ - EMsgComposerAddressDialog *dialog; - - dialog = E_MSG_COMPOSER_ADDRESS_DIALOG (data); - g_free (dialog->cut_buffer); - dialog->cut_buffer = NULL; -} - -static void -setup_recipient_list_signals (EMsgComposerAddressDialog *dialog, - const gchar *name) -{ - glade_connect (dialog->gui, name, "button_press_event", - GTK_SIGNAL_FUNC (recipient_clist_button_press_cb), - dialog); - glade_connect (dialog->gui, name, "selection_received", - GTK_SIGNAL_FUNC (recipient_clist_selection_received_cb), - dialog); - glade_connect (dialog->gui, name, "selection_get", - GTK_SIGNAL_FUNC (recipient_clist_selection_get_cb), - dialog); - glade_connect (dialog->gui, name, "selection_clear_event", - GTK_SIGNAL_FUNC (recipient_clist_selection_clear_event_cb), - dialog); -} - -static void -setup_signals (EMsgComposerAddressDialog *dialog) -{ - glade_connect (dialog->gui, "to_add_button", "clicked", - GTK_SIGNAL_FUNC (add_to_cb), dialog); - glade_connect (dialog->gui, "cc_add_button", "clicked", - GTK_SIGNAL_FUNC (add_cc_cb), dialog); - glade_connect (dialog->gui, "bcc_add_button", "clicked", - GTK_SIGNAL_FUNC (add_bcc_cb), dialog); - - setup_recipient_list_signals (dialog, "to_clist"); - setup_recipient_list_signals (dialog, "cc_clist"); - setup_recipient_list_signals (dialog, "bcc_clist"); -} - - -static void -setup_selection_targets (EMsgComposerAddressDialog *dialog) -{ - gtk_selection_add_target (glade_xml_get_widget (dialog->gui, "to_clist"), - GDK_SELECTION_PRIMARY, - GDK_SELECTION_TYPE_STRING, 0); - gtk_selection_add_target (glade_xml_get_widget (dialog->gui, "cc_clist"), - GDK_SELECTION_PRIMARY, - GDK_SELECTION_TYPE_STRING, 0); - gtk_selection_add_target (glade_xml_get_widget (dialog->gui, "bcc_clist"), - GDK_SELECTION_PRIMARY, - GDK_SELECTION_TYPE_STRING, 0); -} - - -/* GnomeDialog methods. */ - -static void -clicked (GnomeDialog *dialog, - gint button_number) -{ - switch (button_number) { - case 0: /* OK */ - apply (E_MSG_COMPOSER_ADDRESS_DIALOG (dialog)); - gnome_dialog_close (dialog); - break; - case 1: /* Apply */ - apply (E_MSG_COMPOSER_ADDRESS_DIALOG (dialog)); - break; - case 2: /* Cancel */ - gnome_dialog_close (dialog); - break; - } -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EMsgComposerAddressDialog *dialog; - GtkCList *address_clist; - GList *p; - - dialog = E_MSG_COMPOSER_ADDRESS_DIALOG (object); - - gtk_object_unref (GTK_OBJECT (dialog->gui)); - g_free (dialog->cut_buffer); - - if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL) - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -/* Initialization. */ - -static void -class_init (EMsgComposerAddressDialogClass *class) -{ - GtkObjectClass *object_class; - GnomeDialogClass *gnome_dialog_class; - - object_class = GTK_OBJECT_CLASS (class); - object_class->destroy = destroy; - - gnome_dialog_class = GNOME_DIALOG_CLASS (class); - gnome_dialog_class->clicked = clicked; - - parent_class = gtk_type_class (gnome_dialog_get_type ()); - - signals[APPLY] - = gtk_signal_new ("apply", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET (EMsgComposerAddressDialogClass, - apply), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); -} - -static void -init (EMsgComposerAddressDialog *dialog) -{ - dialog->gui = NULL; - dialog->cut_buffer = NULL; -} - - -GtkType -e_msg_composer_address_dialog_get_type (void) -{ - static GtkType type = 0; - - if (type == 0) { - static const GtkTypeInfo info = { - "EMsgComposerAddressDialog", - sizeof (EMsgComposerAddressDialog), - sizeof (EMsgComposerAddressDialogClass), - (GtkClassInitFunc) class_init, - (GtkObjectInitFunc) init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - type = gtk_type_unique (gnome_dialog_get_type (), &info); - } - - return type; -} - -void -e_msg_composer_address_dialog_construct (EMsgComposerAddressDialog *dialog) -{ - static const gchar *buttons[] = { - GNOME_STOCK_BUTTON_OK, - GNOME_STOCK_BUTTON_APPLY, - GNOME_STOCK_BUTTON_CANCEL, - NULL - }; - - g_return_if_fail (dialog != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog)); - - gnome_dialog_constructv (GNOME_DIALOG (dialog), - _("Select recipients' addresses"), - buttons); - - dialog->gui = glade_xml_new - (E_GLADEDIR "/e-msg-composer-address-dialog.glade", - "main_table"); - if (dialog->gui == NULL) { - g_warning ("Cannot load `e-msg-composer-address-dialog.glade"); - return; - } - - gtk_container_add (GTK_CONTAINER (GNOME_DIALOG (dialog)->vbox), - glade_xml_get_widget (dialog->gui, "main_table")); - - setup_selection_targets (dialog); - load_addresses (dialog); - setup_signals (dialog); -} - -GtkWidget * -e_msg_composer_address_dialog_new (void) -{ - EMsgComposerAddressDialog *new; - - new = gtk_type_new (e_msg_composer_address_dialog_get_type ()); - e_msg_composer_address_dialog_construct (new); - - return GTK_WIDGET (new); -} - - -static void -set_list (EMsgComposerAddressDialog *dialog, - const gchar *list_name, - GList *list) -{ - GtkCList *clist; - GList *p; - gchar *text[2]; - - clist = GTK_CLIST (glade_xml_get_widget (dialog->gui, list_name)); - - gtk_clist_freeze (clist); - gtk_clist_clear (clist); - - text[1] = NULL; - for (p = list; p != NULL; p = p->next) { - text[0] = (gchar *) p->data; - gtk_clist_append (clist, text); - } - - gtk_clist_thaw (clist); -} - -void -e_msg_composer_address_dialog_set_to_list (EMsgComposerAddressDialog *dialog, - GList *to_list) -{ - g_return_if_fail (dialog != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog)); - - set_list (dialog, "to_clist", to_list); -} - -void -e_msg_composer_address_dialog_set_cc_list (EMsgComposerAddressDialog *dialog, - GList *cc_list) -{ - g_return_if_fail (dialog != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog)); - - set_list (dialog, "cc_clist", cc_list); -} - -void -e_msg_composer_address_dialog_set_bcc_list (EMsgComposerAddressDialog *dialog, - GList *bcc_list) -{ - g_return_if_fail (dialog != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog)); - - set_list (dialog, "bcc_clist", bcc_list); -} - - -static GList * -get_list (EMsgComposerAddressDialog *dialog, - const gchar *clist_name) -{ - GtkCList *address_clist; - GtkCList *clist; - GList *list; - guint i; - - clist = GTK_CLIST (glade_xml_get_widget (dialog->gui, clist_name)); - - list = NULL; - for (i = 0; i < clist->rows; i++) { - gchar *addr; - - gtk_clist_get_text (clist, i, 0, &addr); - list = g_list_prepend (list, g_strdup (addr)); - } - - return g_list_reverse (list); -} - -GList * -e_msg_composer_address_dialog_get_to_list (EMsgComposerAddressDialog *dialog) -{ - g_return_val_if_fail (dialog != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog), NULL); - - return get_list (dialog, "to_clist"); -} - -GList * -e_msg_composer_address_dialog_get_cc_list (EMsgComposerAddressDialog *dialog) -{ - g_return_val_if_fail (dialog != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog), NULL); - - return get_list (dialog, "cc_clist"); -} - -GList * -e_msg_composer_address_dialog_get_bcc_list (EMsgComposerAddressDialog *dialog) -{ - g_return_val_if_fail (dialog != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER_ADDRESS_DIALOG (dialog), NULL); - - return get_list (dialog, "bcc_clist"); -} diff --git a/composer/e-msg-composer-address-dialog.glade b/composer/e-msg-composer-address-dialog.glade deleted file mode 100644 index c90ef3f245..0000000000 --- a/composer/e-msg-composer-address-dialog.glade +++ /dev/null @@ -1,576 +0,0 @@ -<?xml version="1.0"?> -<GTK-Interface> - -<project> - <name>address-composer</name> - <program_name>address-composer</program_name> - <directory></directory> - <source_directory>src</source_directory> - <pixmaps_directory>pixmaps</pixmaps_directory> - <language>C</language> - <gnome_support>True</gnome_support> - <gettext_support>True</gettext_support> - <use_widget_names>False</use_widget_names> - <output_main_file>True</output_main_file> - <output_support_files>True</output_support_files> - <output_build_files>True</output_build_files> - <backup_source_files>True</backup_source_files> - <main_source_file>interface.c</main_source_file> - <main_header_file>interface.h</main_header_file> - <handler_source_file>callbacks.c</handler_source_file> - <handler_header_file>callbacks.h</handler_header_file> - <support_source_file>support.c</support_source_file> - <support_header_file>support.h</support_header_file> - <output_translatable_strings>True</output_translatable_strings> - <translatable_strings_file>e-msg-composer-address-dialog.glade.h</translatable_strings_file> -</project> - -<widget> - <class>GnomeDialog</class> - <name>dialog1</name> - <type>GTK_WINDOW_TOPLEVEL</type> - <position>GTK_WIN_POS_NONE</position> - <modal>False</modal> - <allow_shrink>False</allow_shrink> - <allow_grow>False</allow_grow> - <auto_shrink>False</auto_shrink> - <auto_close>False</auto_close> - <hide_on_close>False</hide_on_close> - - <widget> - <class>GtkVBox</class> - <child_name>GnomeDialog:vbox</child_name> - <name>dialog-vbox1</name> - <homogeneous>False</homogeneous> - <spacing>8</spacing> - <child> - <padding>4</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkTable</class> - <name>main_table</name> - <rows>3</rows> - <columns>2</columns> - <homogeneous>False</homogeneous> - <row_spacing>0</row_spacing> - <column_spacing>2</column_spacing> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkLabel</class> - <name>label3</name> - <label></label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>False</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label1</name> - <label>Recipient list:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>True</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - </widget> - - <widget> - <class>GtkHBox</class> - <name>hbox1</name> - <homogeneous>False</homogeneous> - <spacing>5</spacing> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>False</xfill> - <yfill>False</yfill> - </child> - - <widget> - <class>GtkLabel</class> - <name>label2</name> - <label>Name:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>False</fill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>name_entry</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <padding>5</padding> - <expand>True</expand> - <fill>True</fill> - </child> - </widget> - - <widget> - <class>GtkButton</class> - <name>search_button</name> - <width>65</width> - <can_focus>True</can_focus> - <label>Search...</label> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>False</fill> - </child> - </widget> - </widget> - - <widget> - <class>GtkScrolledWindow</class> - <name>scrolledwindow1</name> - <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy> - <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy> - <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> - <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>5</ypad> - <xexpand>True</xexpand> - <yexpand>True</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkCList</class> - <name>address_clist</name> - <width>180</width> - <height>200</height> - <can_focus>True</can_focus> - <columns>2</columns> - <column_widths>128,107</column_widths> - <selection_mode>GTK_SELECTION_BROWSE</selection_mode> - <show_titles>True</show_titles> - <shadow_type>GTK_SHADOW_IN</shadow_type> - - <widget> - <class>GtkLabel</class> - <child_name>CList:title</child_name> - <name>label5</name> - <width>50</width> - <label>Name</label> - <justify>GTK_JUSTIFY_LEFT</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - </widget> - - <widget> - <class>GtkLabel</class> - <child_name>CList:title</child_name> - <name>label6</name> - <width>100</width> - <label>Address</label> - <justify>GTK_JUSTIFY_LEFT</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - </widget> - </widget> - </widget> - - <widget> - <class>GtkHBox</class> - <name>hbox2</name> - <homogeneous>True</homogeneous> - <spacing>10</spacing> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkButton</class> - <name>button5</name> - <can_focus>True</can_focus> - <label>Properties...</label> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - </widget> - - <widget> - <class>GtkButton</class> - <name>button6</name> - <can_focus>True</can_focus> - <label>Add...</label> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - </widget> - </widget> - - <widget> - <class>GtkTable</class> - <name>table2</name> - <rows>3</rows> - <columns>2</columns> - <homogeneous>False</homogeneous> - <row_spacing>0</row_spacing> - <column_spacing>0</column_spacing> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>5</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkButton</class> - <name>to_add_button</name> - <width>60</width> - <can_focus>True</can_focus> - <label>To: >></label> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>5</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>True</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkButton</class> - <name>cc_add_button</name> - <width>60</width> - <can_focus>True</can_focus> - <label>Cc: >></label> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>5</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>True</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkButton</class> - <name>bcc_add_button</name> - <width>60</width> - <can_focus>True</can_focus> - <label>Bcc: >></label> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>5</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>True</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkScrolledWindow</class> - <name>scrolledwindow4</name> - <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy> - <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy> - <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> - <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>2</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>True</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkCList</class> - <name>bcc_clist</name> - <width>180</width> - <height>100</height> - <can_focus>True</can_focus> - <columns>1</columns> - <column_widths>80</column_widths> - <selection_mode>GTK_SELECTION_BROWSE</selection_mode> - <show_titles>False</show_titles> - <shadow_type>GTK_SHADOW_IN</shadow_type> - - <widget> - <class>GtkLabel</class> - <child_name>CList:title</child_name> - <name>label9</name> - <label>label9</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - </widget> - </widget> - </widget> - - <widget> - <class>GtkScrolledWindow</class> - <name>scrolledwindow2</name> - <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy> - <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy> - <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> - <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>2</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>True</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkCList</class> - <name>to_clist</name> - <width>180</width> - <height>100</height> - <can_focus>True</can_focus> - <columns>1</columns> - <column_widths>80</column_widths> - <selection_mode>GTK_SELECTION_BROWSE</selection_mode> - <show_titles>False</show_titles> - <shadow_type>GTK_SHADOW_IN</shadow_type> - - <widget> - <class>GtkLabel</class> - <child_name>CList:title</child_name> - <name>label7</name> - <label>label7</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - </widget> - </widget> - </widget> - - <widget> - <class>GtkScrolledWindow</class> - <name>scrolledwindow3</name> - <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy> - <vscrollbar_policy>GTK_POLICY_AUTOMATIC</vscrollbar_policy> - <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy> - <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>2</xpad> - <ypad>4</ypad> - <xexpand>True</xexpand> - <yexpand>True</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkCList</class> - <name>cc_clist</name> - <width>180</width> - <height>100</height> - <can_focus>True</can_focus> - <columns>1</columns> - <column_widths>80</column_widths> - <selection_mode>GTK_SELECTION_BROWSE</selection_mode> - <show_titles>False</show_titles> - <shadow_type>GTK_SHADOW_IN</shadow_type> - - <widget> - <class>GtkLabel</class> - <child_name>CList:title</child_name> - <name>label8</name> - <label>label8</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0.5</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - </widget> - </widget> - </widget> - </widget> - </widget> - - <widget> - <class>GtkHButtonBox</class> - <child_name>GnomeDialog:action_area</child_name> - <name>dialog-action_area1</name> - <layout_style>GTK_BUTTONBOX_END</layout_style> - <spacing>8</spacing> - <child_min_width>85</child_min_width> - <child_min_height>27</child_min_height> - <child_ipad_x>7</child_ipad_x> - <child_ipad_y>0</child_ipad_y> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>True</fill> - <pack>GTK_PACK_END</pack> - </child> - - <widget> - <class>GtkButton</class> - <name>button1</name> - <can_default>True</can_default> - <has_default>True</has_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_OK</stock_button> - </widget> - - <widget> - <class>GtkButton</class> - <name>button2</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_APPLY</stock_button> - </widget> - - <widget> - <class>GtkButton</class> - <name>button3</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_CANCEL</stock_button> - </widget> - </widget> - </widget> -</widget> - -</GTK-Interface> diff --git a/composer/e-msg-composer-address-dialog.glade.h b/composer/e-msg-composer-address-dialog.glade.h deleted file mode 100644 index a5d48ec275..0000000000 --- a/composer/e-msg-composer-address-dialog.glade.h +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Translatable strings file generated by Glade. - * Add this file to your project's POTFILES.in. - * DO NOT compile it as part of your application. - */ - -gchar *s = N_("Recipient list:"); -gchar *s = N_("Name:"); -gchar *s = N_("Search..."); -gchar *s = N_("Name"); -gchar *s = N_("Address"); -gchar *s = N_("Properties..."); -gchar *s = N_("Add..."); -gchar *s = N_("To: >>"); -gchar *s = N_("Cc: >>"); -gchar *s = N_("Bcc: >>"); -gchar *s = N_("label9"); -gchar *s = N_("label7"); -gchar *s = N_("label8"); diff --git a/composer/e-msg-composer-address-dialog.h b/composer/e-msg-composer-address-dialog.h deleted file mode 100644 index 19ffeda703..0000000000 --- a/composer/e-msg-composer-address-dialog.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-msg-composer-address-dialog.h - * - * Copyright (C) 1999 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ -#ifndef __E_MSG_COMPOSER_ADDRESS_DIALOG_H__ -#define __E_MSG_COMPOSER_ADDRESS_DIALOG_H__ - -#include <gnome.h> -#include <glade/glade-xml.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - - -#define E_TYPE_MSG_COMPOSER_ADDRESS_DIALOG (e_msg_composer_address_dialog_get_type ()) -#define E_MSG_COMPOSER_ADDRESS_DIALOG(obj) (GTK_CHECK_CAST ((obj), E_TYPE_MSG_COMPOSER_ADDRESS_DIALOG, EMsgComposerAddressDialog)) -#define E_MSG_COMPOSER_ADDRESS_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER_ADDRESS_DIALOG, EMsgComposerAddressDialogClass)) -#define E_IS_MSG_COMPOSER_ADDRESS_DIALOG(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_MSG_COMPOSER_ADDRESS_DIALOG)) -#define E_IS_MSG_COMPOSER_ADDRESS_DIALOG_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER_ADDRESS_DIALOG)) - - -typedef struct _EMsgComposerAddressDialog EMsgComposerAddressDialog; -typedef struct _EMsgComposerAddressDialogClass EMsgComposerAddressDialogClass; - -struct _EMsgComposerAddressDialog { - GnomeDialog parent; - - GladeXML *gui; - - gchar *cut_buffer; -}; - -struct _EMsgComposerAddressDialogClass { - GnomeDialogClass parent_class; - - void (* apply) (EMsgComposerAddressDialog *dialog); -}; - - -GtkType e_msg_composer_address_dialog_get_type (void); -GtkWidget *e_msg_composer_address_dialog_new (void); -void e_msg_composer_address_dialog_construct (EMsgComposerAddressDialog *dialog); -void e_msg_composer_address_dialog_set_to_list (EMsgComposerAddressDialog *dialog, GList *to_list); -void e_msg_composer_address_dialog_set_cc_list (EMsgComposerAddressDialog *dialog, GList *cc_list); -void e_msg_composer_address_dialog_set_bcc_list (EMsgComposerAddressDialog *dialog, GList *bcc_list); -GList *e_msg_composer_address_dialog_get_to_list (EMsgComposerAddressDialog *dialog); -GList *e_msg_composer_address_dialog_get_cc_list (EMsgComposerAddressDialog *dialog); -GList *e_msg_composer_address_dialog_get_bcc_list (EMsgComposerAddressDialog *dialog); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __E_MSG_COMPOSER_ADDRESS_DIALOG_H__ */ diff --git a/composer/e-msg-composer-address-entry.c b/composer/e-msg-composer-address-entry.c deleted file mode 100644 index ce946d203e..0000000000 --- a/composer/e-msg-composer-address-entry.c +++ /dev/null @@ -1,175 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-msg-composer-address-entry.c - * - * Copyright (C) 1999 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -/* This is a custom GtkEntry for entering address lists. For now, it does not - have any fancy features, but in the future we might want to make it - cooler. */ - -#include <gnome.h> - -#include "e-msg-composer-address-entry.h" - - -static GtkEntryClass *parent_class = NULL; - - -/* Initialization. */ - -static void -class_init (EMsgComposerAddressEntryClass *klass) -{ - GtkObjectClass *object_class; - - object_class = (GtkObjectClass*) klass; - - parent_class = gtk_type_class (gtk_entry_get_type ()); -} - -static void -init (EMsgComposerAddressEntry *msg_composer_address_entry) -{ -} - -GtkType -e_msg_composer_address_entry_get_type (void) -{ - static GtkType type = 0; - - if (type == 0) { - static const GtkTypeInfo info = { - "EMsgComposerAddressEntry", - sizeof (EMsgComposerAddressEntry), - sizeof (EMsgComposerAddressEntryClass), - (GtkClassInitFunc) class_init, - (GtkObjectInitFunc) init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - type = gtk_type_unique (gtk_entry_get_type (), &info); - } - - return type; -} - - -GtkWidget * -e_msg_composer_address_entry_new (void) -{ - GtkWidget *new; - - new = gtk_type_new (e_msg_composer_address_entry_get_type ()); - - return new; -} - - -/** - * e_msg_composer_address_entry_get_addresses: - * @entry: An address entry widget - * - * Retrieve the list of addresses stored in @entry. - * - * Return value: A GList of pointers to strings representing the addresses. - * Notice that the strings must be freed by the caller when not needed anymore. - **/ -GList * -e_msg_composer_address_entry_get_addresses (EMsgComposerAddressEntry *entry) -{ - GList *list; - const gchar *s; - const gchar *p, *oldp; - gboolean in_quotes; - - s = gtk_entry_get_text (GTK_ENTRY (entry)); - - in_quotes = FALSE; - list = NULL; - - p = s; - oldp = s; - - while (1) { - if (*p == '"') { - in_quotes = ! in_quotes; - p++; - } else if ((! in_quotes && *p == ',') || *p == 0) { - if (p != oldp) { - gchar *new_addr; - - new_addr = g_strndup (oldp, p - oldp); - new_addr = g_strstrip (new_addr); - if (*new_addr != '\0') - list = g_list_prepend (list, new_addr); - else - g_free (new_addr); - } - - while (*p == ',' || *p == ' ' || *p == '\t') - p++; - - if (*p == 0) - break; - - oldp = p; - } else { - p++; - } - } - - return g_list_reverse (list); -} - -/** - * e_msg_composer_address_entry_set_list: - * @entry: An address entry - * @list: List of pointers to strings representing the addresses that must - * appear in the entry - * - * Set the address list from @list. - **/ -void -e_msg_composer_address_entry_set_list (EMsgComposerAddressEntry *entry, - const GList *list) -{ - GString *string; - const GList *p; - - g_return_if_fail (entry != NULL); - - if (list == NULL) { - gtk_editable_delete_text (GTK_EDITABLE (entry), -1, -1); - return; - } - - string = g_string_new (NULL); - for (p = list; p != NULL; p = p->next) { - if (string->str[0] != '\0') - g_string_append (string, ", "); - g_string_append (string, p->data); - } - - gtk_entry_set_text (GTK_ENTRY (entry), string->str); - g_string_free (string, TRUE); -} diff --git a/composer/e-msg-composer-address-entry.h b/composer/e-msg-composer-address-entry.h deleted file mode 100644 index f2b671bde4..0000000000 --- a/composer/e-msg-composer-address-entry.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-msg-composer-address-entry.h - * - * Copyright (C) 1999 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef __E_MSG_COMPOSER_ADDRESS_ENTRY_H__ -#define __E_MSG_COMPOSER_ADDRESS_ENTRY_H__ - -#include <gnome.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_MSG_COMPOSER_ADDRESS_ENTRY (e_msg_composer_address_entry_get_type ()) -#define E_MSG_COMPOSER_ADDRESS_ENTRY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_MSG_COMPOSER_ADDRESS_ENTRY, EMsgComposerAddressEntry)) -#define E_MSG_COMPOSER_ADDRESS_ENTRY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER_ADDRESS_ENTRY, EMsgComposerAddressEntryClass)) -#define E_IS_MSG_COMPOSER_ADDRESS_ENTRY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_MSG_COMPOSER_ADDRESS_ENTRY)) -#define E_IS_MSG_COMPOSER_ADDRESS_ENTRY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER_ADDRESS_ENTRY)) - - -typedef struct _EMsgComposerAddressEntry EMsgComposerAddressEntry; -typedef struct _EMsgComposerAddressEntryClass EMsgComposerAddressEntryClass; - -struct _EMsgComposerAddressEntry { - GtkEntry parent; -}; - -struct _EMsgComposerAddressEntryClass { - GtkEntryClass parent_class; -}; - - -GtkType e_msg_composer_address_entry_get_type (void); -GtkWidget *e_msg_composer_address_entry_new (void); -GList *e_msg_composer_address_entry_get_addresses (EMsgComposerAddressEntry *entry); -void e_msg_composer_address_entry_set_list (EMsgComposerAddressEntry *entry, - const GList *list); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_MSG_COMPOSER_ADDRESS_ENTRY_H__ */ diff --git a/composer/e-msg-composer-attachment-bar.c b/composer/e-msg-composer-attachment-bar.c deleted file mode 100644 index 405104f608..0000000000 --- a/composer/e-msg-composer-attachment-bar.c +++ /dev/null @@ -1,653 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-msg-composer-attachment-bar.c - * - * Copyright (C) 1999 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#include <gnome.h> -#include <glade/glade.h> - -#include "e-msg-composer-attachment.h" -#include "e-msg-composer-attachment-bar.h" -#include "camel/camel-data-wrapper.h" -#include "camel/camel-stream-fs.h" -#include "camel/camel-mime-part.h" - - -#define ICON_WIDTH 64 -#define ICON_SEPARATORS " /-_" -#define ICON_SPACING 2 -#define ICON_ROW_SPACING ICON_SPACING -#define ICON_COL_SPACING ICON_SPACING -#define ICON_BORDER 2 -#define ICON_TEXT_SPACING 2 - - -static GnomeIconListClass *parent_class = NULL; - -struct _EMsgComposerAttachmentBarPrivate { - GList *attachments; - guint num_attachments; - - GtkWidget *context_menu; - GtkWidget *icon_context_menu; -}; - - -enum { - CHANGED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -static void update (EMsgComposerAttachmentBar *bar); - - -static gchar * -size_to_string (gulong size) -{ - gchar *size_string; - - /* FIXME: The following should probably go into a separate module, as - we might have to do the same thing in other places as well. Also, - I am not sure this will be OK for all the languages. */ - - if (size < 1e3L) { - if (size == 1) - size_string = g_strdup (_("1 byte")); - else - size_string = g_strdup_printf (_("%u bytes"), - (guint) size); - } else { - gdouble displayed_size; - - if (size < 1e6L) { - displayed_size = (gdouble) size / 1.0e3; - size_string = g_strdup_printf (_("%.1fK"), - displayed_size); - } else if (size < 1e9L) { - displayed_size = (gdouble) size / 1.0e6; - size_string = g_strdup_printf (_("%.1fM"), - displayed_size); - } else { - displayed_size = (gdouble) size / 1.0e9; - size_string = g_strdup_printf (_("%.1fG"), - displayed_size); - } - } - - return size_string; -} - -/* Attachment handling functions. */ - -static void -free_attachment_list (EMsgComposerAttachmentBar *bar) -{ - EMsgComposerAttachmentBarPrivate *priv; - GList *p; - - priv = bar->priv; - - for (p = priv->attachments; p != NULL; p = p->next) - gtk_object_unref (GTK_OBJECT (p->data)); -} - -static void -attachment_changed_cb (EMsgComposerAttachment *attachment, - gpointer data) -{ - update (E_MSG_COMPOSER_ATTACHMENT_BAR (data)); -} - -static void -add_common (EMsgComposerAttachmentBar *bar, - EMsgComposerAttachment *attachment) -{ - gtk_signal_connect (GTK_OBJECT (attachment), "changed", - GTK_SIGNAL_FUNC (attachment_changed_cb), - bar); - - bar->priv->attachments = g_list_append (bar->priv->attachments, - attachment); - bar->priv->num_attachments++; - - update (bar); - - gtk_signal_emit (GTK_OBJECT (bar), signals[CHANGED]); -} - -static void -add_from_mime_part (EMsgComposerAttachmentBar *bar, - CamelMimePart *part) -{ - add_common (bar, e_msg_composer_attachment_new_from_mime_part (part)); -} - -static void -add_from_file (EMsgComposerAttachmentBar *bar, - const gchar *file_name) -{ - add_common (bar, e_msg_composer_attachment_new (file_name)); -} - -static void -remove_attachment (EMsgComposerAttachmentBar *bar, - EMsgComposerAttachment *attachment) -{ - bar->priv->attachments = g_list_remove (bar->priv->attachments, - attachment); - bar->priv->num_attachments--; - - gtk_object_unref (GTK_OBJECT (attachment)); - - gtk_signal_emit (GTK_OBJECT (bar), signals[CHANGED]); -} - - -/* Icon list contents handling. */ - -static void -update (EMsgComposerAttachmentBar *bar) -{ - EMsgComposerAttachmentBarPrivate *priv; - GnomeIconList *icon_list; - GList *p; - - priv = bar->priv; - icon_list = GNOME_ICON_LIST (bar); - - gnome_icon_list_freeze (icon_list); - - gnome_icon_list_clear (icon_list); - - /* FIXME could be faster, but we don't care. */ - - for (p = priv->attachments; p != NULL; p = p->next) { - EMsgComposerAttachment *attachment; - const gchar *icon_name, *desc; - gchar *size_string, *label, *mime_type; - GMimeContentField *content_type; - - attachment = p->data; - content_type = camel_mime_part_get_content_type (attachment->body); - mime_type = g_strdup_printf ("%s/%s", content_type->type, - content_type->subtype); - icon_name = gnome_mime_get_value (mime_type, "icon-filename"); - g_free (mime_type); - - /* FIXME we need some better default icon. */ - if (icon_name == NULL) - icon_name = gnome_mime_get_value ("text/plain", - "icon-filename"); - - desc = camel_mime_part_get_description (attachment->body); - if (!desc) - desc = camel_mime_part_get_filename (attachment->body); - if (!desc) - desc = "attachment"; - - if (attachment->size) { - size_string = size_to_string (attachment->size); - label = g_strdup_printf ("%s (%s)", desc, size_string); - g_free (size_string); - } else - label = g_strdup (desc); - - gnome_icon_list_append (icon_list, icon_name, label); - g_free (label); - } - - gnome_icon_list_thaw (icon_list); -} - -static void -remove_selected (EMsgComposerAttachmentBar *bar) -{ - GnomeIconList *icon_list; - EMsgComposerAttachment *attachment; - GList *attachment_list; - GList *p; - gint num; - - icon_list = GNOME_ICON_LIST (bar); - - /* Weee! I am especially proud of this piece of cheesy code: it is - truly awful. But unless one attaches a huge number of files, it - will not be as greedy as intended. FIXME of course. */ - - attachment_list = NULL; - for (p = icon_list->selection; p != NULL; p = p->next) { - num = GPOINTER_TO_INT (p->data); - attachment = E_MSG_COMPOSER_ATTACHMENT - (g_list_nth (bar->priv->attachments, num)->data); - attachment_list = g_list_prepend (attachment_list, attachment); - } - - for (p = attachment_list; p != NULL; p = p->next) - remove_attachment (bar, E_MSG_COMPOSER_ATTACHMENT (p->data)); - - g_list_free (attachment_list); - - update (bar); -} - -static void -edit_selected (EMsgComposerAttachmentBar *bar) -{ - GnomeIconList *icon_list; - EMsgComposerAttachment *attachment; - gint num; - - icon_list = GNOME_ICON_LIST (bar); - - num = GPOINTER_TO_INT (icon_list->selection->data); - attachment = g_list_nth (bar->priv->attachments, num)->data; - - e_msg_composer_attachment_edit (attachment, GTK_WIDGET (bar)); -} - - -/* "Attach" dialog. */ - -static void -attach_cb (GtkWidget *widget, - gpointer data) -{ - EMsgComposerAttachmentBar *bar; - GtkWidget *file_selection; - const gchar *file_name; - - file_selection = gtk_widget_get_toplevel (widget); - bar = E_MSG_COMPOSER_ATTACHMENT_BAR (data); - - file_name = gtk_file_selection_get_filename - (GTK_FILE_SELECTION (file_selection)); - add_from_file (bar, file_name); - - gtk_widget_hide (file_selection); -} - -static void -add_from_user (EMsgComposerAttachmentBar *bar) -{ - static GtkWidget *fs; - - if (!fs) { - GtkWidget *cancel_button; - GtkWidget *ok_button; - - fs = gtk_file_selection_new (_("Add attachment")); - - ok_button = GTK_FILE_SELECTION (fs)->ok_button; - gtk_signal_connect (GTK_OBJECT (ok_button), - "clicked", GTK_SIGNAL_FUNC (attach_cb), - bar); - - cancel_button = GTK_FILE_SELECTION (fs)->cancel_button; - gtk_signal_connect_object (GTK_OBJECT (cancel_button), - "clicked", - GTK_SIGNAL_FUNC (gtk_widget_hide), - GTK_OBJECT (fs)); - - gtk_signal_connect (GTK_OBJECT (fs), "delete_event", - GTK_SIGNAL_FUNC (gtk_widget_hide), NULL); - } else - gtk_file_selection_set_filename (GTK_FILE_SELECTION (fs), ""); - - gtk_window_set_position (GTK_WINDOW (fs), GTK_WIN_POS_MOUSE); - - gtk_widget_show (GTK_WIDGET (fs)); -} - - -/* Callbacks. */ - -static void -add_cb (GtkWidget *widget, - gpointer data) -{ - g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (data)); - - add_from_user (E_MSG_COMPOSER_ATTACHMENT_BAR (data)); -} - -static void -properties_cb (GtkWidget *widget, - gpointer data) -{ - EMsgComposerAttachmentBar *bar; - - g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (data)); - - bar = E_MSG_COMPOSER_ATTACHMENT_BAR (data); - edit_selected (data); -} - -static void -remove_cb (GtkWidget *widget, - gpointer data) -{ - EMsgComposerAttachmentBar *bar; - - g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (data)); - - bar = E_MSG_COMPOSER_ATTACHMENT_BAR (data); - remove_selected (bar); -} - - -/* Popup menu handling. */ - -static GnomeUIInfo icon_context_menu_info[] = { - GNOMEUIINFO_ITEM (N_("Remove"), - N_("Remove selected items from the attachment list"), - remove_cb, NULL), - GNOMEUIINFO_MENU_PROPERTIES_ITEM (properties_cb, NULL), - GNOMEUIINFO_END -}; - -static GtkWidget * -get_icon_context_menu (EMsgComposerAttachmentBar *bar) -{ - EMsgComposerAttachmentBarPrivate *priv; - - priv = bar->priv; - if (priv->icon_context_menu == NULL) - priv->icon_context_menu = gnome_popup_menu_new - (icon_context_menu_info); - - return priv->icon_context_menu; -} - -static void -popup_icon_context_menu (EMsgComposerAttachmentBar *bar, - gint num, - GdkEventButton *event) -{ - GtkWidget *menu; - - menu = get_icon_context_menu (bar); - gnome_popup_menu_do_popup (menu, NULL, NULL, event, bar); -} - -static GnomeUIInfo context_menu_info[] = { - GNOMEUIINFO_ITEM (N_("Add attachment..."), - N_("Attach a file to the message"), - add_cb, NULL), - GNOMEUIINFO_END -}; - -static GtkWidget * -get_context_menu (EMsgComposerAttachmentBar *bar) -{ - EMsgComposerAttachmentBarPrivate *priv; - - priv = bar->priv; - if (priv->context_menu == NULL) - priv->context_menu = gnome_popup_menu_new (context_menu_info); - - return priv->context_menu; -} - -static void -popup_context_menu (EMsgComposerAttachmentBar *bar, - GdkEventButton *event) -{ - GtkWidget *menu; - - menu = get_context_menu (bar); - gnome_popup_menu_do_popup (menu, NULL, NULL, event, bar); -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EMsgComposerAttachmentBar *bar; - - bar = E_MSG_COMPOSER_ATTACHMENT_BAR (object); - - free_attachment_list (bar); - - if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL) - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -/* GtkWidget methods. */ - -static gint -button_press_event (GtkWidget *widget, - GdkEventButton *event) -{ - EMsgComposerAttachmentBar *bar; - GnomeIconList *icon_list; - gint icon_number; - - bar = E_MSG_COMPOSER_ATTACHMENT_BAR (widget); - icon_list = GNOME_ICON_LIST (widget); - - if (event->button != 3) - return GTK_WIDGET_CLASS (parent_class)->button_press_event - (widget, event); - - icon_number = gnome_icon_list_get_icon_at (icon_list, - event->x, event->y); - - if (icon_number >= 0) { - gnome_icon_list_select_icon (icon_list, icon_number); - popup_icon_context_menu (bar, icon_number, event); - } else { - popup_context_menu (bar, event); - } - - return TRUE; -} - - -/* Initialization. */ - -static void -class_init (EMsgComposerAttachmentBarClass *class) -{ - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - GnomeIconListClass *icon_list_class; - - object_class = GTK_OBJECT_CLASS (class); - widget_class = GTK_WIDGET_CLASS (class); - icon_list_class = GNOME_ICON_LIST_CLASS (class); - - parent_class = gtk_type_class (gnome_icon_list_get_type ()); - - object_class->destroy = destroy; - - widget_class->button_press_event = button_press_event; - - /* Setup signals. */ - - signals[CHANGED] = - gtk_signal_new ("changed", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EMsgComposerAttachmentBarClass, - changed), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); -} - -static void -init (EMsgComposerAttachmentBar *bar) -{ - EMsgComposerAttachmentBarPrivate *priv; - guint icon_size; - - priv = g_new (EMsgComposerAttachmentBarPrivate, 1); - - priv->attachments = NULL; - priv->context_menu = NULL; - priv->icon_context_menu = NULL; - - priv->num_attachments = 0; - - bar->priv = priv; - - /* FIXME partly hardcoded. We should compute height from the font, and - allow at least 2 lines for every item. */ - icon_size = ICON_WIDTH + ICON_SPACING + ICON_BORDER + ICON_TEXT_SPACING; - icon_size += 24; - - gtk_widget_set_usize (GTK_WIDGET (bar), icon_size * 4, icon_size); -} - - -GtkType -e_msg_composer_attachment_bar_get_type (void) -{ - static GtkType type = 0; - - if (type == 0) { - static const GtkTypeInfo info = { - "EMsgComposerAttachmentBar", - sizeof (EMsgComposerAttachmentBar), - sizeof (EMsgComposerAttachmentBarClass), - (GtkClassInitFunc) class_init, - (GtkObjectInitFunc) init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - type = gtk_type_unique (gnome_icon_list_get_type (), &info); - } - - return type; -} - -GtkWidget * -e_msg_composer_attachment_bar_new (GtkAdjustment *adj) -{ - EMsgComposerAttachmentBar *new; - GnomeIconList *icon_list; - - gtk_widget_push_visual (gdk_imlib_get_visual ()); - gtk_widget_push_colormap (gdk_imlib_get_colormap ()); - new = gtk_type_new (e_msg_composer_attachment_bar_get_type ()); - gtk_widget_pop_visual (); - gtk_widget_pop_colormap (); - - icon_list = GNOME_ICON_LIST (new); - - gnome_icon_list_construct (icon_list, ICON_WIDTH, adj, 0); - - gnome_icon_list_set_separators (icon_list, ICON_SEPARATORS); - gnome_icon_list_set_row_spacing (icon_list, ICON_ROW_SPACING); - gnome_icon_list_set_col_spacing (icon_list, ICON_COL_SPACING); - gnome_icon_list_set_icon_border (icon_list, ICON_BORDER); - gnome_icon_list_set_text_spacing (icon_list, ICON_TEXT_SPACING); - gnome_icon_list_set_selection_mode (icon_list, GTK_SELECTION_MULTIPLE); - - return GTK_WIDGET (new); -} - - -static void -attach_to_multipart (CamelMultipart *multipart, - EMsgComposerAttachment *attachment) -{ - GMimeContentField *content_type; - - content_type = camel_mime_part_get_content_type (attachment->body); - - /* Kludge a bit on CTE. For now, we set QP for text and B64 - * for all else except message (which must be 7bit, 8bit, or - * binary). FIXME. - */ - if (!strcasecmp (content_type->type, "text")) { - camel_mime_part_set_encoding (attachment->body, - CAMEL_MIME_PART_ENCODING_QUOTEDPRINTABLE); - } else if (strcasecmp (content_type->type, "message") != 0) { - camel_mime_part_set_encoding (attachment->body, - CAMEL_MIME_PART_ENCODING_BASE64); - } - - camel_multipart_add_part (multipart, attachment->body); -} - -void -e_msg_composer_attachment_bar_to_multipart (EMsgComposerAttachmentBar *bar, - CamelMultipart *multipart) -{ - EMsgComposerAttachmentBarPrivate *priv; - GList *p; - - g_return_if_fail (bar != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar)); - g_return_if_fail (multipart != NULL); - g_return_if_fail (CAMEL_IS_MULTIPART (multipart)); - - priv = bar->priv; - - for (p = priv->attachments; p != NULL; p = p->next) { - EMsgComposerAttachment *attachment; - - attachment = E_MSG_COMPOSER_ATTACHMENT (p->data); - attach_to_multipart (multipart, attachment); - } -} - - -guint -e_msg_composer_attachment_bar_get_num_attachments (EMsgComposerAttachmentBar *bar) -{ - g_return_val_if_fail (bar != NULL, 0); - g_return_val_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar), 0); - - return bar->priv->num_attachments; -} - - -void -e_msg_composer_attachment_bar_attach (EMsgComposerAttachmentBar *bar, - const gchar *file_name) -{ - g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar)); - - if (file_name == NULL) - add_from_user (bar); - else - add_from_file (bar, file_name); -} - -void -e_msg_composer_attachment_bar_attach_mime_part (EMsgComposerAttachmentBar *bar, - CamelMimePart *part) -{ - g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT_BAR (bar)); - - add_from_mime_part (bar, part); -} diff --git a/composer/e-msg-composer-attachment-bar.h b/composer/e-msg-composer-attachment-bar.h deleted file mode 100644 index 1f331c2870..0000000000 --- a/composer/e-msg-composer-attachment-bar.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* msg-composer-attachment-bar.h - * - * Copyright (C) 1999 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef __E_MSG_COMPOSER_ATTACHMENT_BAR_H__ -#define __E_MSG_COMPOSER_ATTACHMENT_BAR_H__ - -#include <gnome.h> -#include <camel/camel-multipart.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR \ - (e_msg_composer_attachment_bar_get_type ()) -#define E_MSG_COMPOSER_ATTACHMENT_BAR(obj) \ - (GTK_CHECK_CAST ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR, EMsgComposerAttachmentBar)) -#define E_MSG_COMPOSER_ATTACHMENT_BAR_CLASS(klass) \ - (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR, EMsgComposerAttachmentBarClass)) -#define E_IS_MSG_COMPOSER_ATTACHMENT_BAR(obj) \ - (GTK_CHECK_TYPE ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR)) -#define E_IS_MSG_COMPOSER_ATTACHMENT_BAR_CLASS(klass) \ - (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT_BAR)) - - -typedef struct _EMsgComposerAttachmentBarPrivate EMsgComposerAttachmentBarPrivate; - -struct _EMsgComposerAttachmentBar { - GnomeIconList parent; - - EMsgComposerAttachmentBarPrivate *priv; -}; -typedef struct _EMsgComposerAttachmentBar EMsgComposerAttachmentBar; - -struct _EMsgComposerAttachmentBarClass { - GnomeIconListClass parent_class; - - void (* changed) (EMsgComposerAttachmentBar *bar); -}; -typedef struct _EMsgComposerAttachmentBarClass EMsgComposerAttachmentBarClass; - - -GtkType e_msg_composer_attachment_bar_get_type (void); -GtkWidget *e_msg_composer_attachment_bar_new (GtkAdjustment *adj); -void e_msg_composer_attachment_bar_to_multipart (EMsgComposerAttachmentBar *bar, CamelMultipart *multipart); -guint e_msg_composer_attachment_bar_get_num_attachments (EMsgComposerAttachmentBar *bar); -void e_msg_composer_attachment_bar_attach (EMsgComposerAttachmentBar *bar, const gchar *file_name); -void e_msg_composer_attachment_bar_attach_mime_part (EMsgComposerAttachmentBar *bar, CamelMimePart *part); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_MSG_COMPOSER_ATTACHMENT_BAR_H__ */ diff --git a/composer/e-msg-composer-attachment.c b/composer/e-msg-composer-attachment.c deleted file mode 100644 index a0d7398c25..0000000000 --- a/composer/e-msg-composer-attachment.c +++ /dev/null @@ -1,399 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-msg-composer-attachment.c - * - * Copyright (C) 1999 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -/* This is the object representing an email attachment. It is implemented as a - GtkObject to make it easier for the application to handle it. For example, - the "changed" signal is emitted whenever something changes in the - attachment. Also, this contains the code to let users edit the - attachment manually. */ - -#include <sys/stat.h> - -#include <gnome.h> -#include <camel/camel.h> - -#include "e-msg-composer-attachment.h" - - -enum { - CHANGED, - LAST_SIGNAL -}; -static guint signals[LAST_SIGNAL] = { 0 }; - -static GtkObjectClass *parent_class = NULL; - - -/* Utility functions. */ - -static const gchar * -get_mime_type (const gchar *file_name) -{ - const gchar *mime_type; - - mime_type = gnome_mime_type_of_file (file_name); - if (mime_type == NULL) - mime_type = "application/octet-stream"; - - return mime_type; -} - -static void -changed (EMsgComposerAttachment *attachment) -{ - gtk_signal_emit (GTK_OBJECT (attachment), signals[CHANGED]); -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EMsgComposerAttachment *attachment; - - attachment = E_MSG_COMPOSER_ATTACHMENT (object); - - gtk_object_unref (GTK_OBJECT (attachment->body)); -} - - -/* Signals. */ - -static void -real_changed (EMsgComposerAttachment *msg_composer_attachment) -{ - g_return_if_fail (msg_composer_attachment != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT (msg_composer_attachment)); -} - - -static void -class_init (EMsgComposerAttachmentClass *klass) -{ - GtkObjectClass *object_class; - - object_class = (GtkObjectClass*) klass; - - parent_class = gtk_type_class (gtk_object_get_type ()); - - object_class->destroy = destroy; - - signals[CHANGED] = gtk_signal_new ("changed", - GTK_RUN_FIRST, - object_class->type, - GTK_SIGNAL_OFFSET - (EMsgComposerAttachmentClass, - changed), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); - - klass->changed = real_changed; -} - -static void -init (EMsgComposerAttachment *msg_composer_attachment) -{ - msg_composer_attachment->editor_gui = NULL; - msg_composer_attachment->body = NULL; - msg_composer_attachment->size = 0; -} - -GtkType -e_msg_composer_attachment_get_type (void) -{ - static GtkType type = 0; - - if (type == 0) { - static const GtkTypeInfo info = { - "EMsgComposerAttachment", - sizeof (EMsgComposerAttachment), - sizeof (EMsgComposerAttachmentClass), - (GtkClassInitFunc) class_init, - (GtkObjectInitFunc) init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - type = gtk_type_unique (gtk_object_get_type (), &info); - } - - return type; -} - - -/** - * e_msg_composer_attachment_new: - * @file_name: - * - * Return value: - **/ -EMsgComposerAttachment * -e_msg_composer_attachment_new (const gchar *file_name) -{ - EMsgComposerAttachment *new; - CamelMimePart *part; - CamelDataWrapper *wrapper; - CamelStream *data; - struct stat statbuf; - - g_return_val_if_fail (file_name != NULL, NULL); - - data = camel_stream_fs_new_with_name (file_name, O_RDONLY, 0); - if (!data) - return NULL; - wrapper = camel_data_wrapper_new (); - camel_data_wrapper_construct_from_stream (wrapper, data); - gtk_object_unref (GTK_OBJECT (data)); - camel_data_wrapper_set_mime_type (wrapper, get_mime_type (file_name)); - - part = camel_mime_part_new (); - camel_medium_set_content_object (CAMEL_MEDIUM (part), wrapper); - gtk_object_unref (GTK_OBJECT (wrapper)); - - camel_mime_part_set_disposition (part, "attachment"); - if (strchr (file_name, '/')) - camel_mime_part_set_filename (part, strrchr (file_name, '/') + 1); - else - camel_mime_part_set_filename (part, file_name); - - new = e_msg_composer_attachment_new_from_mime_part (part); - if (stat (file_name, &statbuf) < 0) - new->size = 0; - else - new->size = statbuf.st_size; - new->guessed_type = TRUE; - - return new; -} - - -/** - * e_msg_composer_attachment_new_from_mime_part: - * @part: a CamelMimePart - * - * Return value: a new EMsgComposerAttachment based on the mime part - **/ -EMsgComposerAttachment * -e_msg_composer_attachment_new_from_mime_part (CamelMimePart *part) -{ - EMsgComposerAttachment *new; - - g_return_val_if_fail (CAMEL_IS_MIME_PART (part), NULL); - - new = gtk_type_new (e_msg_composer_attachment_get_type ()); - - new->editor_gui = NULL; - new->body = part; - gtk_object_ref (GTK_OBJECT (part)); - new->guessed_type = FALSE; - new->size = 0; - - return new; -} - - -/* The attachment property dialog. */ - -struct _DialogData { - GtkWidget *dialog; - GtkEntry *file_name_entry; - GtkEntry *description_entry; - GtkEntry *mime_type_entry; - EMsgComposerAttachment *attachment; -}; -typedef struct _DialogData DialogData; - -static void -destroy_dialog_data (DialogData *data) -{ - g_free (data); -} - -static void -update_mime_type (DialogData *data) -{ - const gchar *mime_type; - const gchar *file_name; - - if (!data->attachment->guessed_type) - return; - - file_name = gtk_entry_get_text (data->file_name_entry); - mime_type = get_mime_type (file_name); - - gtk_entry_set_text (data->mime_type_entry, mime_type); -} - -static void -set_entry (GladeXML *xml, - const gchar *widget_name, - const gchar *value) -{ - GtkEntry *entry; - - entry = GTK_ENTRY (glade_xml_get_widget (xml, widget_name)); - if (entry == NULL) - g_warning ("Entry for `%s' not found.", widget_name); - gtk_entry_set_text (entry, value ? value : ""); -} - -static void -connect_widget (GladeXML *gui, - const gchar *name, - const gchar *signal_name, - GtkSignalFunc func, - gpointer data) -{ - GtkWidget *widget; - - widget = glade_xml_get_widget (gui, name); - gtk_signal_connect (GTK_OBJECT (widget), signal_name, func, data); -} - -static void -close_cb (GtkWidget *widget, - gpointer data) -{ - EMsgComposerAttachment *attachment; - DialogData *dialog_data; - - dialog_data = (DialogData *) data; - attachment = dialog_data->attachment; - - gtk_widget_destroy (glade_xml_get_widget (attachment->editor_gui, - "dialog")); - gtk_object_unref (GTK_OBJECT (attachment->editor_gui)); - attachment->editor_gui = NULL; - - destroy_dialog_data (dialog_data); -} - -static void -ok_cb (GtkWidget *widget, - gpointer data) -{ - DialogData *dialog_data; - EMsgComposerAttachment *attachment; - - dialog_data = (DialogData *) data; - attachment = dialog_data->attachment; - - camel_mime_part_set_filename (attachment->body, gtk_entry_get_text - (dialog_data->file_name_entry)); - - camel_mime_part_set_description (attachment->body, gtk_entry_get_text - (dialog_data->description_entry)); - - camel_mime_part_set_content_type (attachment->body, gtk_entry_get_text - (dialog_data->mime_type_entry)); - camel_data_wrapper_set_mime_type ( - camel_medium_get_content_object (CAMEL_MEDIUM (attachment->body)), - gtk_entry_get_text (dialog_data->mime_type_entry)); - - changed (attachment); - close_cb (widget, data); -} - -static void -file_name_focus_out_cb (GtkWidget *widget, - GdkEventFocus *event, - gpointer data) -{ - DialogData *dialog_data; - - dialog_data = (DialogData *) data; - update_mime_type (dialog_data); -} - - -void -e_msg_composer_attachment_edit (EMsgComposerAttachment *attachment, - GtkWidget *parent) -{ - DialogData *dialog_data; - GladeXML *editor_gui; - - g_return_if_fail (attachment != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER_ATTACHMENT (attachment)); - - if (attachment->editor_gui != NULL) { - GtkWidget *window; - - window = glade_xml_get_widget (attachment->editor_gui, - "dialog"); - gdk_window_show (window->window); - return; - } - - editor_gui = glade_xml_new (E_GLADEDIR "/e-msg-composer-attachment.glade", - NULL); - if (editor_gui == NULL) { - g_warning ("Cannot load `e-msg-composer-attachment.glade'"); - return; - } - - attachment->editor_gui = editor_gui; - - gtk_window_set_transient_for - (GTK_WINDOW (glade_xml_get_widget (editor_gui, "dialog")), - GTK_WINDOW (gtk_widget_get_toplevel (parent))); - - dialog_data = g_new (DialogData, 1); - dialog_data->attachment = attachment; - dialog_data->dialog = glade_xml_get_widget (editor_gui, "dialog"); - dialog_data->file_name_entry = GTK_ENTRY (glade_xml_get_widget - (editor_gui, - "file_name_entry")); - dialog_data->description_entry = GTK_ENTRY (glade_xml_get_widget - (editor_gui, - "description_entry")); - dialog_data->mime_type_entry = GTK_ENTRY (glade_xml_get_widget - (editor_gui, - "mime_type_entry")); - - if (attachment != NULL) { - GMimeContentField *content_type; - char *type; - - set_entry (editor_gui, "file_name_entry", - camel_mime_part_get_filename (attachment->body)); - set_entry (editor_gui, "description_entry", - camel_mime_part_get_description (attachment->body)); - content_type = camel_mime_part_get_content_type (attachment->body); - type = g_strdup_printf ("%s/%s", content_type->type, - content_type->subtype); - set_entry (editor_gui, "mime_type_entry", type); - g_free (type); - } - - connect_widget (editor_gui, "ok_button", "clicked", ok_cb, dialog_data); - connect_widget (editor_gui, "close_button", "clicked", close_cb, dialog_data); - - connect_widget (editor_gui, "file_name_entry", "focus_out_event", - file_name_focus_out_cb, dialog_data); -} diff --git a/composer/e-msg-composer-attachment.glade b/composer/e-msg-composer-attachment.glade deleted file mode 100644 index a9717bef69..0000000000 --- a/composer/e-msg-composer-attachment.glade +++ /dev/null @@ -1,258 +0,0 @@ -<?xml version="1.0"?> -<GTK-Interface> - -<project> - <name>e-msg-composer-attachment</name> - <program_name>e-msg-composer-attachment</program_name> - <directory></directory> - <source_directory>src</source_directory> - <pixmaps_directory>pixmaps</pixmaps_directory> - <language>C</language> - <gnome_support>True</gnome_support> - <gettext_support>True</gettext_support> - <output_translatable_strings>True</output_translatable_strings> - <translatable_strings_file>e-msg-composer-attachment.glade.h</translatable_strings_file> -</project> - -<widget> - <class>GnomeDialog</class> - <name>dialog</name> - <title>Attachment properties</title> - <type>GTK_WINDOW_TOPLEVEL</type> - <position>GTK_WIN_POS_NONE</position> - <modal>False</modal> - <allow_shrink>False</allow_shrink> - <allow_grow>False</allow_grow> - <auto_shrink>False</auto_shrink> - <auto_close>False</auto_close> - <hide_on_close>False</hide_on_close> - - <widget> - <class>GtkVBox</class> - <child_name>GnomeDialog:vbox</child_name> - <name>dialog-vbox1</name> - <homogeneous>False</homogeneous> - <spacing>8</spacing> - <child> - <padding>4</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkHButtonBox</class> - <child_name>GnomeDialog:action_area</child_name> - <name>dialog-action_area1</name> - <layout_style>GTK_BUTTONBOX_END</layout_style> - <spacing>8</spacing> - <child_min_width>85</child_min_width> - <child_min_height>27</child_min_height> - <child_ipad_x>7</child_ipad_x> - <child_ipad_y>0</child_ipad_y> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>True</fill> - <pack>GTK_PACK_END</pack> - </child> - - <widget> - <class>GtkButton</class> - <name>ok_button</name> - <can_default>True</can_default> - <has_default>True</has_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_OK</stock_button> - </widget> - - <widget> - <class>GtkButton</class> - <name>close_button</name> - <can_default>True</can_default> - <can_focus>True</can_focus> - <stock_button>GNOME_STOCK_BUTTON_CLOSE</stock_button> - </widget> - </widget> - - <widget> - <class>GtkTable</class> - <name>table1</name> - <rows>3</rows> - <columns>2</columns> - <homogeneous>False</homogeneous> - <row_spacing>10</row_spacing> - <column_spacing>5</column_spacing> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - - <widget> - <class>GtkEntry</class> - <name>description_entry</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkHBox</class> - <name>hbox3</name> - <homogeneous>False</homogeneous> - <spacing>10</spacing> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>True</yexpand> - <xshrink>True</xshrink> - <yshrink>True</yshrink> - <xfill>True</xfill> - <yfill>True</yfill> - </child> - - <widget> - <class>GtkEntry</class> - <name>file_name_entry</name> - <width>290</width> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <padding>0</padding> - <expand>True</expand> - <fill>True</fill> - </child> - </widget> - </widget> - - <widget> - <class>GtkEntry</class> - <name>mime_type_entry</name> - <sensitive>False</sensitive> - <can_focus>True</can_focus> - <editable>False</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label3</name> - <label>MIME type:</label> - <justify>GTK_JUSTIFY_LEFT</justify> - <wrap>False</wrap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label1</name> - <label>Description:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label2</name> - <label>File name:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>1</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - </widget> - </widget> -</widget> - -</GTK-Interface> diff --git a/composer/e-msg-composer-attachment.glade.h b/composer/e-msg-composer-attachment.glade.h deleted file mode 100644 index 845aea9b32..0000000000 --- a/composer/e-msg-composer-attachment.glade.h +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Translatable strings file generated by Glade. - * Add this file to your project's POTFILES.in. - * DO NOT compile it as part of your application. - */ - -gchar *s = N_("Attachment properties"); -gchar *s = N_("MIME type:"); -gchar *s = N_("Description:"); -gchar *s = N_("File name:"); diff --git a/composer/e-msg-composer-attachment.h b/composer/e-msg-composer-attachment.h deleted file mode 100644 index e0cd2eb867..0000000000 --- a/composer/e-msg-composer-attachment.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-msg-composer-attachment.h - * - * Copyright (C) 1999 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ -#ifndef __E_MSG_COMPOSER_ATTACHMENT_H__ -#define __E_MSG_COMPOSER_ATTACHMENT_H__ - -#include <gnome.h> -#include <glade/glade-xml.h> -#include <camel/camel-mime-part.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_MSG_COMPOSER_ATTACHMENT (e_msg_composer_attachment_get_type ()) -#define E_MSG_COMPOSER_ATTACHMENT(obj) (GTK_CHECK_CAST ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT, EMsgComposerAttachment)) -#define E_MSG_COMPOSER_ATTACHMENT_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER_ATTACHMENT, EMsgComposerAttachmentClass)) -#define E_IS_MSG_COMPOSER_ATTACHMENT(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT)) -#define E_IS_MSG_COMPOSER_ATTACHMENT_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER_ATTACHMENT)) - - -typedef struct _EMsgComposerAttachment EMsgComposerAttachment; -typedef struct _EMsgComposerAttachmentClass EMsgComposerAttachmentClass; - -struct _EMsgComposerAttachment { - GtkObject parent; - - GladeXML *editor_gui; - - CamelMimePart *body; - gboolean guessed_type; - gulong size; -}; - -struct _EMsgComposerAttachmentClass { - GtkObjectClass parent_class; - - void (*changed) (EMsgComposerAttachment *msg_composer_attachment); -}; - - -GtkType e_msg_composer_attachment_get_type (void); -EMsgComposerAttachment *e_msg_composer_attachment_new (const gchar *file_name); -EMsgComposerAttachment *e_msg_composer_attachment_new_from_mime_part (CamelMimePart *part); -void e_msg_composer_attachment_edit (EMsgComposerAttachment *attachment, - GtkWidget *parent); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __E_MSG_COMPOSER_ATTACHMENT_H__ */ diff --git a/composer/e-msg-composer-hdrs.c b/composer/e-msg-composer-hdrs.c deleted file mode 100644 index cffa8a763e..0000000000 --- a/composer/e-msg-composer-hdrs.c +++ /dev/null @@ -1,596 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* msg-composer-hdrs.c - * - * Copyright (C) 1999 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifdef _HAVE_CONFIG_H -#include <config.h> -#endif - -#include <gnome.h> -#include <camel/camel.h> - -#include <bonobo.h> - -#include <liboaf/liboaf.h> - -#include "Evolution-Addressbook-SelectNames.h" - -#include "e-msg-composer-address-entry.h" -#include "e-msg-composer-hdrs.h" - - -#define SELECT_NAMES_OAFID "OAFIID:addressbook:select-names:39301deb-174b-40d1-8a6e-5edc300f7b61" - -struct _EMsgComposerHdrsPrivate { - Evolution_Addressbook_SelectNames corba_select_names; - - /* Total number of headers that we have. */ - guint num_hdrs; - - /* The tooltips. */ - GtkTooltips *tooltips; - - /* Standard headers. */ - GtkWidget *to_entry; - GtkWidget *cc_entry; - GtkWidget *bcc_entry; - GtkWidget *subject_entry; -}; - - -static GtkTableClass *parent_class = NULL; - -enum { - SHOW_ADDRESS_DIALOG, - LAST_SIGNAL -}; - -static gint signals[LAST_SIGNAL]; - - -static gboolean -setup_corba (EMsgComposerHdrs *hdrs) -{ - EMsgComposerHdrsPrivate *priv; - CORBA_Environment ev; - - priv = hdrs->priv; - - g_assert (priv->corba_select_names == CORBA_OBJECT_NIL); - - CORBA_exception_init (&ev); - - priv->corba_select_names = oaf_activate_from_id (SELECT_NAMES_OAFID, 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 || priv->corba_select_names == CORBA_OBJECT_NIL) { - g_warning ("Cannot activate -- %s", SELECT_NAMES_OAFID); - CORBA_exception_free (&ev); - return FALSE; - } - - CORBA_exception_free (&ev); - - return TRUE; -} - - -static void -address_button_clicked_cb (GtkButton *button, - gpointer data) -{ - EMsgComposerHdrs *hdrs; - EMsgComposerHdrsPrivate *priv; - CORBA_Environment ev; - - hdrs = E_MSG_COMPOSER_HDRS (data); - priv = hdrs->priv; - - CORBA_exception_init (&ev); - - /* FIXME section. */ - Evolution_Addressbook_SelectNames_activate_dialog (priv->corba_select_names, "", &ev); - - CORBA_exception_free (&ev); -} - -static GtkWidget * -create_addressbook_entry (EMsgComposerHdrs *hdrs, - const char *name) -{ - EMsgComposerHdrsPrivate *priv; - Evolution_Addressbook_SelectNames corba_select_names; - Bonobo_Control corba_control; - GtkWidget *control_widget; - CORBA_Environment ev; - - priv = hdrs->priv; - corba_select_names = priv->corba_select_names; - - CORBA_exception_init (&ev); - - Evolution_Addressbook_SelectNames_add_section (corba_select_names, name, name, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - return NULL; - } - - corba_control = Evolution_Addressbook_SelectNames_get_entry_for_section (corba_select_names, name, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - CORBA_exception_free (&ev); - return NULL; - } - - CORBA_exception_free (&ev); - - control_widget = bonobo_widget_new_control_from_objref (corba_control, CORBA_OBJECT_NIL); - - return control_widget; -} - -static GtkWidget * -add_header (EMsgComposerHdrs *hdrs, - const gchar *name, - const gchar *tip, - const gchar *tip_private, - gboolean is_addrbook) -{ - EMsgComposerHdrsPrivate *priv; - GtkWidget *label; - GtkWidget *entry; - guint pad; - - priv = hdrs->priv; - - if (is_addrbook) { - label = gtk_button_new_with_label (name); - GTK_OBJECT_UNSET_FLAGS(label, GTK_CAN_FOCUS); - gtk_signal_connect (GTK_OBJECT (label), "clicked", - GTK_SIGNAL_FUNC (address_button_clicked_cb), - hdrs); - pad = 2; - gtk_tooltips_set_tip (hdrs->priv->tooltips, label, - _("Click here for the address book"), - NULL); - } else { - label = gtk_label_new (name); - pad = GNOME_PAD; - } - - gtk_table_attach (GTK_TABLE (hdrs), label, - 0, 1, priv->num_hdrs, priv->num_hdrs + 1, - GTK_FILL, GTK_FILL, - pad, pad); - gtk_widget_show (label); - - if (is_addrbook) - entry = create_addressbook_entry (hdrs, name); - else - entry = gtk_entry_new (); - - if (entry != NULL) { - gtk_widget_show (entry); - - gtk_table_attach (GTK_TABLE (hdrs), entry, - 1, 2, priv->num_hdrs, priv->num_hdrs + 1, - GTK_FILL | GTK_EXPAND, GTK_FILL, - 2, 2); - - gtk_tooltips_set_tip (hdrs->priv->tooltips, entry, tip, tip_private); - } - - priv->num_hdrs++; - - return entry; -} - -static void -setup_headers (EMsgComposerHdrs *hdrs) -{ - EMsgComposerHdrsPrivate *priv; - - priv = hdrs->priv; - - priv->to_entry = add_header - (hdrs, _("To:"), - _("Enter the recipients of the message"), - NULL, - TRUE); - priv->cc_entry = add_header - (hdrs, _("Cc:"), - _("Enter the addresses that will receive a carbon copy of " - "the message"), - NULL, - TRUE); - priv->bcc_entry = add_header - (hdrs, _("Bcc:"), - _("Enter the addresses that will receive a carbon copy of " - "the message without appearing in the recipient list of " - "the message."), - NULL, - TRUE); - priv->subject_entry = add_header - (hdrs, _("Subject:"), - _("Enter the subject of the mail"), - NULL, - FALSE); -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EMsgComposerHdrs *hdrs; - EMsgComposerHdrsPrivate *priv; - - hdrs = E_MSG_COMPOSER_HDRS (object); - priv = hdrs->priv; - - if (priv->corba_select_names != CORBA_OBJECT_NIL) { - CORBA_Environment ev; - - CORBA_exception_init (&ev); - CORBA_Object_release (priv->corba_select_names, &ev); - CORBA_exception_free (&ev); - } - - gtk_object_destroy (GTK_OBJECT (priv->tooltips)); - - if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL) - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -static void -class_init (EMsgComposerHdrsClass *class) -{ - GtkObjectClass *object_class; - - object_class = GTK_OBJECT_CLASS (class); - object_class->destroy = destroy; - - parent_class = gtk_type_class (gtk_table_get_type ()); - - signals[SHOW_ADDRESS_DIALOG] = - gtk_signal_new ("show_address_dialog", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EMsgComposerHdrsClass, - show_address_dialog), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); -} - -static void -init (EMsgComposerHdrs *hdrs) -{ - EMsgComposerHdrsPrivate *priv; - - priv = g_new (EMsgComposerHdrsPrivate, 1); - - priv->corba_select_names = CORBA_OBJECT_NIL; - - priv->to_entry = NULL; - priv->cc_entry = NULL; - priv->bcc_entry = NULL; - priv->subject_entry = NULL; - - priv->tooltips = gtk_tooltips_new (); - - priv->num_hdrs = 0; - - hdrs->priv = priv; -} - - -GtkType -e_msg_composer_hdrs_get_type (void) -{ - static GtkType type = 0; - - if (type == 0) { - static const GtkTypeInfo info = { - "EMsgComposerHdrs", - sizeof (EMsgComposerHdrs), - sizeof (EMsgComposerHdrsClass), - (GtkClassInitFunc) class_init, - (GtkObjectInitFunc) init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - type = gtk_type_unique (gtk_table_get_type (), &info); - } - - return type; -} - -GtkWidget * -e_msg_composer_hdrs_new (void) -{ - EMsgComposerHdrs *new; - EMsgComposerHdrsPrivate *priv; - - new = gtk_type_new (e_msg_composer_hdrs_get_type ()); - priv = new->priv; - - if (! setup_corba (new)) { - gtk_widget_destroy (GTK_WIDGET (new)); - return NULL; - } - - setup_headers (new); - - return GTK_WIDGET (new); -} - - -static GList * -decode_addresses (const char *s) -{ - const char *p, *oldp; - gboolean in_quotes; - GList *list; - - g_print ("Decoding addresses -- %s\n", s ? s : "(null)"); - - if (s == NULL) - return NULL; - - in_quotes = FALSE; - list = NULL; - - p = s; - oldp = s; - - while (1) { - if (*p == '"') { - in_quotes = ! in_quotes; - p++; - } else if ((! in_quotes && *p == ',') || *p == 0) { - if (p != oldp) { - char *new_addr; - - new_addr = g_strndup (oldp, p - oldp); - new_addr = g_strstrip (new_addr); - if (*new_addr != '\0') - list = g_list_prepend (list, new_addr); - else - g_free (new_addr); - } - - while (*p == ',' || *p == ' ' || *p == '\t') - p++; - - if (*p == 0) - break; - - oldp = p; - } else { - p++; - } - } - - return g_list_reverse (list); -} - -static void -set_recipients (CamelMimeMessage *msg, - GtkWidget *entry_widget, - const gchar *type) -{ - GList *list; - GList *p; - struct _header_address *addr; - char *s; - - bonobo_widget_get_property (BONOBO_WIDGET (entry_widget), "text", &s, NULL); - - list = decode_addresses (s); - - g_free (s); - - /* FIXME leak? */ - - for (p = list; p != NULL; p = p->next) { - addr = header_address_decode (p->data); - camel_mime_message_add_recipient (msg, type, addr->name, - addr->v.addr); - header_address_unref (addr); - } - - g_list_free (list); -} - -void -e_msg_composer_hdrs_to_message (EMsgComposerHdrs *hdrs, - CamelMimeMessage *msg) -{ - const gchar *s; - - g_return_if_fail (hdrs != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); - g_return_if_fail (msg != NULL); - g_return_if_fail (CAMEL_IS_MIME_MESSAGE (msg)); - - s = gtk_entry_get_text (GTK_ENTRY (hdrs->priv->subject_entry)); - camel_mime_message_set_subject (msg, g_strdup (s)); - - set_recipients (msg, hdrs->priv->to_entry, CAMEL_RECIPIENT_TYPE_TO); - set_recipients (msg, hdrs->priv->cc_entry, CAMEL_RECIPIENT_TYPE_CC); - set_recipients (msg, hdrs->priv->bcc_entry, CAMEL_RECIPIENT_TYPE_BCC); -} - - -static void -set_entry (BonoboWidget *bonobo_widget, - const GList *list) -{ - GString *string; - const GList *p; - - string = g_string_new (NULL); - for (p = list; p != NULL; p = p->next) { - if (string->str[0] != '\0') - g_string_append (string, ", "); - g_string_append (string, p->data); - } - - bonobo_widget_set_property (BONOBO_WIDGET (bonobo_widget), "text", string->str, NULL); - - g_string_free (string, TRUE); -} - -void -e_msg_composer_hdrs_set_to (EMsgComposerHdrs *hdrs, - const GList *to_list) -{ - g_return_if_fail (hdrs != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); - - set_entry (BONOBO_WIDGET (hdrs->priv->to_entry), to_list); -} - -void -e_msg_composer_hdrs_set_cc (EMsgComposerHdrs *hdrs, - const GList *cc_list) -{ - g_return_if_fail (hdrs != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); - - set_entry (BONOBO_WIDGET (hdrs->priv->cc_entry), cc_list); -} - -void -e_msg_composer_hdrs_set_bcc (EMsgComposerHdrs *hdrs, - const GList *bcc_list) -{ - g_return_if_fail (hdrs != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); - - set_entry (BONOBO_WIDGET (hdrs->priv->bcc_entry), bcc_list); -} - -void -e_msg_composer_hdrs_set_subject (EMsgComposerHdrs *hdrs, - const char *subject) -{ - GtkEntry *entry; - - g_return_if_fail (hdrs != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs)); - g_return_if_fail (subject != NULL); - - entry = GTK_ENTRY (hdrs->priv->subject_entry); - gtk_entry_set_text (entry, subject); -} - - -/* FIXME this is currently unused and broken. */ -GList * -e_msg_composer_hdrs_get_to (EMsgComposerHdrs *hdrs) -{ - g_return_val_if_fail (hdrs != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL); - - g_assert_not_reached (); - - return NULL; -} - -/* FIXME this is currently unused and broken. */ -GList * -e_msg_composer_hdrs_get_cc (EMsgComposerHdrs *hdrs) -{ - g_return_val_if_fail (hdrs != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL); - - g_assert_not_reached (); - - return NULL; -} - -/* FIXME this is currently unused and broken. */ -GList * -e_msg_composer_hdrs_get_bcc (EMsgComposerHdrs *hdrs) -{ - g_return_val_if_fail (hdrs != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL); - - g_assert_not_reached (); - - return NULL; -} - -const char * -e_msg_composer_hdrs_get_subject (EMsgComposerHdrs *hdrs) -{ - g_return_val_if_fail (hdrs != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL); - - return gtk_entry_get_text - (GTK_ENTRY (hdrs->priv->subject_entry)); -} - - -GtkWidget * -e_msg_composer_hdrs_get_to_entry (EMsgComposerHdrs *hdrs) -{ - g_return_val_if_fail (hdrs != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL); - - return hdrs->priv->to_entry; -} - -GtkWidget * -e_msg_composer_hdrs_get_cc_entry (EMsgComposerHdrs *hdrs) -{ - g_return_val_if_fail (hdrs != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL); - - return hdrs->priv->cc_entry; -} - -GtkWidget * -e_msg_composer_hdrs_get_bcc_entry (EMsgComposerHdrs *hdrs) -{ - g_return_val_if_fail (hdrs != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL); - - return hdrs->priv->bcc_entry; -} - -GtkWidget * -e_msg_composer_hdrs_get_subject_entry (EMsgComposerHdrs *hdrs) -{ - g_return_val_if_fail (hdrs != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER_HDRS (hdrs), NULL); - - return hdrs->priv->subject_entry; -} diff --git a/composer/e-msg-composer-hdrs.h b/composer/e-msg-composer-hdrs.h deleted file mode 100644 index d9c27b9527..0000000000 --- a/composer/e-msg-composer-hdrs.h +++ /dev/null @@ -1,89 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* msg-composer-hdrs.h - * - * Copyright (C) 1999 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef ___E_MSG_COMPOSER_HDRS_H__ -#define ___E_MSG_COMPOSER_HDRS_H__ - -#include <gnome.h> -#include <camel/camel-mime-message.h> - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - -#define E_TYPE_MSG_COMPOSER_HDRS (e_msg_composer_hdrs_get_type ()) -#define E_MSG_COMPOSER_HDRS(obj) (GTK_CHECK_CAST ((obj), E_TYPE_MSG_COMPOSER_HDRS, EMsgComposerHdrs)) -#define E_MSG_COMPOSER_HDRS_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER_HDRS, EMsgComposerHdrsClass)) -#define E_IS_MSG_COMPOSER_HDRS(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_MSG_COMPOSER_HDRS)) -#define E_IS_MSG_COMPOSER_HDRS_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER_HDRS)) - - -typedef struct _EMsgComposerHdrs EMsgComposerHdrs; -typedef struct _EMsgComposerHdrsClass EMsgComposerHdrsClass; -typedef struct _EMsgComposerHdrsPrivate EMsgComposerHdrsPrivate; - -struct _EMsgComposerHdrs { - GtkTable parent; - - EMsgComposerHdrsPrivate *priv; -}; - -struct _EMsgComposerHdrsClass { - GtkTableClass parent_class; - - void (* show_address_dialog) (EMsgComposerHdrs *hdrs); -}; - - -GtkType e_msg_composer_hdrs_get_type (void); -GtkWidget *e_msg_composer_hdrs_new (void); - -void e_msg_composer_hdrs_to_message (EMsgComposerHdrs *hdrs, - CamelMimeMessage *msg); - -void e_msg_composer_hdrs_set_to (EMsgComposerHdrs *hdrs, - const GList *to_list); -void e_msg_composer_hdrs_set_cc (EMsgComposerHdrs *hdrs, - const GList *cc_list); -void e_msg_composer_hdrs_set_bcc (EMsgComposerHdrs *hdrs, - const GList *bcc_list); -void e_msg_composer_hdrs_set_subject (EMsgComposerHdrs *hdrs, - const char *subject); - -GList *e_msg_composer_hdrs_get_to (EMsgComposerHdrs *hdrs); -GList *e_msg_composer_hdrs_get_cc (EMsgComposerHdrs *hdrs); -GList *e_msg_composer_hdrs_get_bcc (EMsgComposerHdrs *hdrs); -const char *e_msg_composer_hdrs_get_subject (EMsgComposerHdrs *hdrs); - -GtkWidget *e_msg_composer_hdrs_get_to_entry (EMsgComposerHdrs *hdrs); -GtkWidget *e_msg_composer_hdrs_get_cc_entry (EMsgComposerHdrs *hdrs); -GtkWidget *e_msg_composer_hdrs_get_bcc_entry (EMsgComposerHdrs *hdrs); -GtkWidget *e_msg_composer_hdrs_get_subject_entry (EMsgComposerHdrs *hdrs); - -#ifdef _cplusplus -} -#endif /* _cplusplus */ - - -#endif /* __E_MSG_COMPOSER_HDRS_H__ */ diff --git a/composer/e-msg-composer-select-file.c b/composer/e-msg-composer-select-file.c deleted file mode 100644 index 0fd8a73418..0000000000 --- a/composer/e-msg-composer-select-file.c +++ /dev/null @@ -1,169 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-msg-composer-select-file.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#include <gtk/gtkfilesel.h> - -#include "e-msg-composer-select-file.h" - - -struct _FileSelectionInfo { - GtkWidget *widget; - char *selected_file; -}; -typedef struct _FileSelectionInfo FileSelectionInfo; - - -static void -confirm (FileSelectionInfo *info) -{ - const char *filename; - - filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (info->widget)); - info->selected_file = g_strdup (filename); - - gtk_widget_hide (info->widget); - - gtk_main_quit (); -} - -static void -cancel (FileSelectionInfo *info) -{ - g_assert (info->selected_file == NULL); - - gtk_widget_hide (info->widget); - - gtk_main_quit (); -} - - -/* Callbacks. */ - -static void -ok_clicked_cb (GtkWidget *widget, - void *data) -{ - FileSelectionInfo *info; - - info = (FileSelectionInfo *) data; - confirm (info); -} - -static void -cancel_clicked_cb (GtkWidget *widget, - void *data) -{ - FileSelectionInfo *info; - - info = (FileSelectionInfo *) data; - cancel (info); -} - -static int -delete_event_cb (GtkWidget *widget, - GdkEventAny *event, - void *data) -{ - FileSelectionInfo *info; - - info = (FileSelectionInfo *) data; - cancel (info); - - return TRUE; -} - - -/* Setup. */ - -static FileSelectionInfo * -create_file_selection (EMsgComposer *composer) -{ - FileSelectionInfo *info; - GtkWidget *widget; - GtkWidget *ok_button; - GtkWidget *cancel_button; - - info = g_new (FileSelectionInfo, 1); - - widget = gtk_file_selection_new (NULL); - ok_button = GTK_FILE_SELECTION (widget)->ok_button; - cancel_button = GTK_FILE_SELECTION (widget)->cancel_button; - - gtk_signal_connect (GTK_OBJECT (ok_button), - "clicked", GTK_SIGNAL_FUNC (ok_clicked_cb), info); - gtk_signal_connect (GTK_OBJECT (cancel_button), - "clicked", GTK_SIGNAL_FUNC (cancel_clicked_cb), info); - gtk_signal_connect (GTK_OBJECT (widget), "delete_event", - GTK_SIGNAL_FUNC (delete_event_cb), info); - - info->widget = widget; - info->selected_file = NULL; - - return info; -} - -static void -file_selection_info_destroy_notify (void *data) -{ - FileSelectionInfo *info; - - info = (FileSelectionInfo *) data; - - g_free (info->selected_file); - g_free (info); -} - - -char * -e_msg_composer_select_file (EMsgComposer *composer, - const char *title) -{ - FileSelectionInfo *info; - char *retval; - - g_return_val_if_fail (composer != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL); - - info = gtk_object_get_data (GTK_OBJECT (composer), - "e-msg-composer-file-selection-info"); - - if (info == NULL) { - info = create_file_selection (composer); - gtk_object_set_data_full (GTK_OBJECT (composer), - "e-msg-composer-file-selection-info", info, - file_selection_info_destroy_notify); - } - - if (GTK_WIDGET_VISIBLE (info->widget)) - return NULL; /* Busy! */ - - gtk_window_set_title (GTK_WINDOW (info->widget), title); - gtk_widget_show (info->widget); - - gtk_main (); - - retval = info->selected_file; - info->selected_file = NULL; - - return retval; -} diff --git a/composer/e-msg-composer-select-file.h b/composer/e-msg-composer-select-file.h deleted file mode 100644 index 2f89bd58b4..0000000000 --- a/composer/e-msg-composer-select-file.h +++ /dev/null @@ -1,32 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-msg-composer-select-file.c - * - * Copyright (C) 2000 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef E_MSG_COMPOSER_SELECT_FILE_H -#define E_MSG_COMPOSER_SELECT_FILE_H - -#include "e-msg-composer.h" - -char *e_msg_composer_select_file (EMsgComposer *composer, - const char *title); - -#endif /* E_MSG_COMPOSER_SELECT_FILE_H */ diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c deleted file mode 100644 index 21a1ed31da..0000000000 --- a/composer/e-msg-composer.c +++ /dev/null @@ -1,1569 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-msg-composer.c - * - * Copyright (C) 1999 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -/* - - TODO - - - Somehow users should be able to see if any file(s) are attached even when - the attachment bar is not shown. - -*/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif -#include <errno.h> - -#include <bonobo.h> -#include <bonobo/bonobo-stream-memory.h> -#include <glade/glade.h> -#include <gnome.h> -#include <libgnorba/gnorba.h> -#include <gtkhtml/gtkhtml.h> - -#include <camel/camel.h> - -#include "e-util/e-html-utils.h" -#include "e-util/e-setup.h" -#include "e-util/e-gui-utils.h" -#include "widgets/misc/e-scroll-frame.h" - -#include "e-msg-composer.h" -#include "e-msg-composer-address-dialog.h" -#include "e-msg-composer-attachment-bar.h" -#include "e-msg-composer-hdrs.h" -#include "e-msg-composer-select-file.h" - -#define HTML_EDITOR_CONTROL_ID "OAFIID:control:html-editor:63c5499b-8b0c-475a-9948-81ec96a9662c" - - -#define DEFAULT_WIDTH 600 -#define DEFAULT_HEIGHT 500 - -enum { - SEND, - POSTPONE, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -static GnomeAppClass *parent_class = NULL; - - -static GtkWidget * -create_editor (EMsgComposer *composer) -{ - GtkWidget *control; - - control = bonobo_widget_new_control (HTML_EDITOR_CONTROL_ID, - bonobo_object_corba_objref (BONOBO_OBJECT (composer->uih))); - if (control == NULL) { - g_error ("Cannot activate `%s'. Did you build gtkhtml with Bonobo and OAF support?", HTML_EDITOR_CONTROL_ID); - return NULL; - } - - return control; -} - -static char * -get_text (Bonobo_PersistStream persist, char *format) -{ - BonoboStream *stream; - BonoboStreamMem *stream_mem; - CORBA_Environment ev; - char *text; - - CORBA_exception_init (&ev); - - stream = bonobo_stream_mem_create (NULL, 0, FALSE, TRUE); - Bonobo_PersistStream_save (persist, (Bonobo_Stream)bonobo_object_corba_objref (BONOBO_OBJECT (stream)), - format, &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - g_warning ("Exception getting mail '%s'", - bonobo_exception_get_txt (&ev)); - return NULL; - } - - CORBA_exception_free (&ev); - - stream_mem = BONOBO_STREAM_MEM (stream); - text = g_malloc (stream_mem->pos + 1); - memcpy (text, stream_mem->buffer, stream_mem->pos); - text[stream_mem->pos] = 0; - bonobo_object_unref (BONOBO_OBJECT(stream)); - - return text; -} - -#define LINE_LEN 72 - -/* This might be a temporary function... the GtkHTML export interfaces are - * not yet complete, so some or all of this may move into GtkHTML. - */ -static char * -format_text (char *text) -{ - GString *out; - char *s, *space, *outstr; - int len, tabbing, i; - gboolean linestart = TRUE, cited = FALSE; - - tabbing = 0; /* Shut down compiler. */ - len = strlen (text); - out = g_string_sized_new (len + len / LINE_LEN); - - s = text; - while (*s) { - if (linestart) { - tabbing = 0; - while (*s == '\t') { - s++; - tabbing++; - } - cited = (tabbing == 0 && *s == '>'); - } - - len = strcspn (s, "\n"); - if (!cited && len > LINE_LEN - tabbing * 8) { - /* If we can break anywhere between s and - * s + LINE_LEN, do that. We can break between - * space and anything but - */ - space = s + LINE_LEN - tabbing * 8; - while (space > s && (*space != ' ' - || (*(space + 1) == '\240') - || (*(space - 1) == '\240'))) - space--; - - if (space != s) - len = space - s; - } - - /* Do initial tabs */ - for (i = 0; i < tabbing; i++) - g_string_append_c (out, '\t'); - - /* Copy the line... */ - while (len--) { - g_string_append_c (out, *s == '\240' ? ' ' : *s); - s++; - } - - /* Eat whitespace... */ - while (*s == ' ' || *s == '\240') - s++; - if (*s == '\n') { - s++; - linestart = TRUE; - } else - linestart = FALSE; - - /* And end the line. */ - g_string_append_c (out, '\n'); - } - - outstr = out->str; - g_string_free (out, FALSE); - return outstr; -} - -typedef enum { - MSG_FORMAT_PLAIN, - MSG_FORMAT_ALTERNATIVE, -} MsgFormat; - -/* This functions builds a CamelMimeMessage for the message that the user has - composed in `composer'. */ -static CamelMimeMessage * -build_message (EMsgComposer *composer) -{ - EMsgComposerAttachmentBar *attachment_bar = - E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar); - CamelMimeMessage *new; - CamelMultipart *body = NULL; - CamelMimePart *part; - char *html = NULL, *plain = NULL, *fmt = NULL; - int i; - MsgFormat type = MSG_FORMAT_ALTERNATIVE; - - if (composer->persist_stream_interface == CORBA_OBJECT_NIL) - return NULL; - - if (composer->send_html) - type = MSG_FORMAT_ALTERNATIVE; - else - type = MSG_FORMAT_PLAIN; - - new = camel_mime_message_new (); - - e_msg_composer_hdrs_to_message (E_MSG_COMPOSER_HDRS (composer->hdrs), new); - for (i = 0; i < composer->extra_hdr_names->len; i++) { - camel_medium_add_header (CAMEL_MEDIUM (new), - composer->extra_hdr_names->pdata[i], - composer->extra_hdr_values->pdata[i]); - } - - plain = get_text (composer->persist_stream_interface, "text/plain"); - fmt = format_text (plain); - g_free (plain); - - if (type != MSG_FORMAT_PLAIN) - html = get_text (composer->persist_stream_interface, "text/html"); - - if (type == MSG_FORMAT_ALTERNATIVE) { - body = camel_multipart_new (); - camel_data_wrapper_set_mime_type (CAMEL_DATA_WRAPPER (body), - "multipart/alternative"); - camel_multipart_set_boundary (body, NULL); - - part = camel_mime_part_new (); - camel_mime_part_set_content (part, fmt, strlen (fmt), "text/plain"); - g_free (fmt); - camel_multipart_add_part (body, part); - gtk_object_unref (GTK_OBJECT (part)); - - part = camel_mime_part_new (); - camel_mime_part_set_content (part, html, strlen (html), "text/html"); - g_free (html); - camel_multipart_add_part (body, part); - gtk_object_unref (GTK_OBJECT (part)); - } - - if (e_msg_composer_attachment_bar_get_num_attachments (attachment_bar)) { - CamelMultipart *multipart = camel_multipart_new (); - - /* Generate a random boundary. */ - camel_multipart_set_boundary (multipart, NULL); - - part = camel_mime_part_new (); - switch (type) { - case MSG_FORMAT_ALTERNATIVE: - camel_medium_set_content_object (CAMEL_MEDIUM (part), - CAMEL_DATA_WRAPPER (body)); - gtk_object_unref (GTK_OBJECT (body)); - break; - case MSG_FORMAT_PLAIN: - camel_mime_part_set_content (part, fmt, strlen (fmt), "text/plain"); - g_free(fmt); - break; - } - camel_multipart_add_part (multipart, part); - gtk_object_unref (GTK_OBJECT (part)); - - e_msg_composer_attachment_bar_to_multipart (attachment_bar, multipart); - - camel_medium_set_content_object (CAMEL_MEDIUM (new), CAMEL_DATA_WRAPPER (multipart)); - gtk_object_unref (GTK_OBJECT (multipart)); - } else { - CamelDataWrapper *cdw; - CamelStream *stream; - switch (type) { - case MSG_FORMAT_ALTERNATIVE: - camel_medium_set_content_object (CAMEL_MEDIUM (new), CAMEL_DATA_WRAPPER (body)); - gtk_object_unref (GTK_OBJECT (body)); - break; - case MSG_FORMAT_PLAIN: - stream = camel_stream_mem_new_with_buffer (fmt, strlen (fmt)); - cdw = camel_data_wrapper_new (); - camel_data_wrapper_construct_from_stream (cdw, stream); - gtk_object_unref (GTK_OBJECT (stream)); - - camel_data_wrapper_set_mime_type (cdw, "text/plain"); - - camel_medium_set_content_object (CAMEL_MEDIUM (new), CAMEL_DATA_WRAPPER (cdw)); - gtk_object_unref (GTK_OBJECT (cdw)); - g_free (fmt); - break; - - } - } - - return new; -} - -static char * -get_signature (const char *sigfile) -{ - char *rawsig; - static char *htmlsig = NULL; - static time_t sigmodtime = -1; - struct stat st; - int fd; - - if (!sigfile || !*sigfile) { - return NULL; - } - - if (stat (sigfile, &st) == -1) { - char *msg; - - msg = g_strdup_printf ("Could not open signature file %s:\n%s", - sigfile, g_strerror (errno)); - gnome_error_dialog (msg); - g_free (msg); - - return NULL; - } - - if (st.st_mtime == sigmodtime) - return htmlsig; - - rawsig = g_malloc (st.st_size + 1); - fd = open (sigfile, O_RDONLY); - if (fd == -1) { - char *msg; - - msg = g_strdup_printf ("Could not open signature file %s:\n%s", - sigfile, g_strerror (errno)); - gnome_error_dialog (msg); - g_free (msg); - - return NULL; - } - - read (fd, rawsig, st.st_size); - rawsig[st.st_size] = '\0'; - close (fd); - - htmlsig = e_text_to_html (rawsig, 0); - sigmodtime = st.st_mtime; - - return htmlsig; -} - -static void -set_editor_text (BonoboWidget *editor, const char *sig_file, const char *text) -{ - Bonobo_PersistStream persist; - BonoboStream *stream; - CORBA_Environment ev; - char *sig, *fulltext; - - sig = get_signature (sig_file); - if (sig) { - if (!strncmp ("--\n", sig, 3)) - fulltext = g_strdup_printf ("%s<BR>\n<PRE>\n%s</PRE>", - text, sig); - else - fulltext = g_strdup_printf ("%s<BR>\n<PRE>\n--\n%s</PRE>", - text, sig); - } else { - if (!*text) - return; - fulltext = (char*)text; - } - - CORBA_exception_init (&ev); - persist = (Bonobo_PersistStream) - bonobo_object_client_query_interface ( - bonobo_widget_get_server (editor), - "IDL:Bonobo/PersistStream:1.0", - &ev); - g_assert (persist != CORBA_OBJECT_NIL); - - stream = bonobo_stream_mem_create (fulltext, strlen (fulltext), - TRUE, FALSE); - if (sig) - g_free (fulltext); - Bonobo_PersistStream_load (persist, (Bonobo_Stream)bonobo_object_corba_objref (BONOBO_OBJECT (stream)), "text/html", &ev); - if (ev._major != CORBA_NO_EXCEPTION) { - /* FIXME. Some error message. */ - return; - } - if (ev._major != CORBA_SYSTEM_EXCEPTION) - CORBA_Object_release (persist, &ev); - - Bonobo_Unknown_unref (persist, &ev); - CORBA_exception_free (&ev); - bonobo_object_unref (BONOBO_OBJECT(stream)); -} - - -/* Commands. */ - -static void -show_attachments (EMsgComposer *composer, - gboolean show) -{ - if (show) { - gtk_widget_show (composer->attachment_scroll_frame); - gtk_widget_show (composer->attachment_bar); - } else { - gtk_widget_hide (composer->attachment_scroll_frame); - gtk_widget_hide (composer->attachment_bar); - } - - composer->attachment_bar_visible = show; - - /* Update the GUI. */ - -#if 0 - gtk_check_menu_item_set_active - (GTK_CHECK_MENU_ITEM - (glade_xml_get_widget (composer->menubar_gui, - "menu_view_attachments")), - show); -#endif - - /* XXX we should update the toggle toolbar item as well. At - this point, it is not a toggle because Glade is broken. */ -} - -static void -save (EMsgComposer *composer, - const char *file_name) -{ - CORBA_Environment ev; - char *my_file_name; - - if (file_name != NULL) - my_file_name = g_strdup (file_name); - else - my_file_name = e_msg_composer_select_file (composer, _("Save as...")); - - if (my_file_name == NULL) - return; - - CORBA_exception_init (&ev); - - Bonobo_PersistFile_save (composer->persist_file_interface, my_file_name, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - e_notice (GTK_WINDOW (composer), GNOME_MESSAGE_BOX_ERROR, - _("Error saving file: %s"), g_basename (file_name)); - } - - CORBA_exception_free (&ev); - - g_free (my_file_name); -} - -static void -load (EMsgComposer *composer, - const char *file_name) -{ - CORBA_Environment ev; - - CORBA_exception_init (&ev); - - Bonobo_PersistFile_load (composer->persist_file_interface, file_name, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) - e_notice (GTK_WINDOW (composer), GNOME_MESSAGE_BOX_ERROR, - _("Error loading file: %s"), g_basename (file_name)); - - CORBA_exception_free (&ev); -} - - -/* Exit dialog. (Displays a "discard this message?" warning before actually exiting.) */ - -static void -exit_dialog_cb (int reply, - void *data) -{ - if (reply == 0) - gtk_widget_destroy (GTK_WIDGET (data)); -} - -static void -do_exit (EMsgComposer *composer) -{ - gnome_ok_cancel_dialog_parented (_("Discard this message?"), - exit_dialog_cb, composer, GTK_WINDOW (composer)); -} - - -/* Menu callbacks. */ - -static void -menu_file_open_cb (BonoboUIHandler *uih, - void *data, - const char *path) -{ - EMsgComposer *composer; - char *file_name; - - composer = E_MSG_COMPOSER (data); - - file_name = e_msg_composer_select_file (composer, _("Open file")); - if (file_name == NULL) - return; - - load (composer, file_name); - - g_free (file_name); -} - -static void -menu_file_save_cb (BonoboUIHandler *uih, - void *data, - const char *path) -{ - EMsgComposer *composer; - CORBA_char *file_name; - CORBA_Environment ev; - - composer = E_MSG_COMPOSER (data); - - CORBA_exception_init (&ev); - - file_name = Bonobo_PersistFile_get_current_file (composer->persist_file_interface, &ev); - - if (ev._major != CORBA_NO_EXCEPTION) { - save (composer, NULL); - } else { - save (composer, file_name); - CORBA_free (file_name); - } - - CORBA_exception_free (&ev); -} - -static void -menu_file_save_as_cb (BonoboUIHandler *uih, - void *data, - const char *path) -{ - EMsgComposer *composer; - - composer = E_MSG_COMPOSER (data); - - save (composer, NULL); -} - -static void -menu_file_send_cb (BonoboUIHandler *uih, - void *data, - const char *path) -{ - /* FIXME: We should really write this to Outbox in the future? */ - gtk_signal_emit (GTK_OBJECT (data), signals[SEND]); -} - -static void -menu_file_close_cb (BonoboUIHandler *uih, - void *data, - const char *path) -{ - EMsgComposer *composer; - - composer = E_MSG_COMPOSER (data); - do_exit (composer); -} - -static void -menu_file_add_attachment_cb (BonoboUIHandler *uih, - void *data, - const char *path) -{ - EMsgComposer *composer; - - composer = E_MSG_COMPOSER (data); - - e_msg_composer_attachment_bar_attach - (E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar), - NULL); -} - -static void -menu_view_attachments_activate_cb (BonoboUIHandler *uih, - void *data, - const char *path) -{ - gboolean state; - - state = bonobo_ui_handler_menu_get_toggle_state (uih, path); - e_msg_composer_show_attachments (E_MSG_COMPOSER (data), state); -} - -#if 0 -static void -insert_file_ok_cb (GtkWidget *widget, void *user_data) -{ - GtkFileSelection *fs; - GdkAtom selection_atom = GDK_NONE; - char *name; - EMsgComposer *composer; - struct stat sb; - int fd; - guint8 *buffer; - size_t bufsz, actual; - - fs = GTK_FILE_SELECTION (gtk_widget_get_ancestor (widget, - GTK_TYPE_FILE_SELECTION)); - composer = E_MSG_COMPOSER (user_data); - name = gtk_file_selection_get_filename (fs); - - if (stat (name, &sb) < 0) { - GtkWidget *dlg; - - dlg = gnome_error_dialog_parented( _("That file does not exist."), - GTK_WINDOW (fs)); - gnome_dialog_run_and_close (GNOME_DIALOG (dlg)); - gtk_widget_destroy (GTK_WIDGET (dlg)); - return; - } - - if( !(S_ISREG (sb.st_mode)) ) { - GtkWidget *dlg; - - dlg = gnome_error_dialog_parented( _("That is not a regular file."), - GTK_WINDOW (fs)); - gnome_dialog_run_and_close (GNOME_DIALOG (dlg)); - gtk_widget_destroy (GTK_WIDGET (dlg)); - return; - } - - if (access (name, R_OK) != 0) { - GtkWidget *dlg; - - dlg = gnome_error_dialog_parented( _("That file exists but is not readable."), - GTK_WINDOW (fs)); - gnome_dialog_run_and_close (GNOME_DIALOG (dlg)); - gtk_widget_destroy (GTK_WIDGET (dlg)); - return; - } - - if ((fd = open (name, O_RDONLY)) < 0) { - GtkWidget *dlg; - - dlg = gnome_error_dialog_parented( _("That file appeared accesible but open(2) failed."), - GTK_WINDOW (fs)); - gnome_dialog_run_and_close (GNOME_DIALOG (dlg)); - gtk_widget_destroy (GTK_WIDGET (dlg)); - return; - } - - buffer = NULL; - bufsz = 0; - actual = 0; - #define CHUNK 5120 - - while( 1 ) { - ssize_t chunk; - - if( bufsz - actual < CHUNK ) { - bufsz += CHUNK; - - if( bufsz >= 102400 ) { - GtkWidget *dlg; - gint result; - - dlg = gnome_dialog_new( _("The file is very large (more than 100K).\n" - "Are you sure you wish to insert it?"), - GNOME_STOCK_BUTTON_YES, - GNOME_STOCK_BUTTON_NO, - NULL); - gnome_dialog_set_parent (GNOME_DIALOG (dlg), GTK_WINDOW (fs)); - result = gnome_dialog_run_and_close (GNOME_DIALOG (dlg)); - gtk_widget_destroy (GTK_WIDGET (dlg)); - - if (result == 1) - goto cleanup; - } - - buffer = g_realloc (buffer, bufsz * sizeof (guint8)); - } - - chunk = read (fd, &(buffer[actual]), CHUNK); - - if (chunk < 0) { - GtkWidget *dlg; - - dlg = gnome_error_dialog_parented( _("An error occurred while reading the file."), - GTK_WINDOW (fs)); - gnome_dialog_run_and_close (GNOME_DIALOG (dlg)); - gtk_widget_destroy (GTK_WIDGET (dlg)); - goto cleanup; - } - - if( chunk == 0 ) - break; - - actual += chunk; - } - - buffer[actual] = '\0'; - - if (selection_atom == GDK_NONE) - selection_atom = gdk_atom_intern ("TEMP_PASTE", FALSE); - gtk_object_set_data (GTK_OBJECT (fs), "ev_file_buffer", buffer); - gtk_selection_owner_set (GTK_WIDGET (fs), selection_atom, GDK_CURRENT_TIME); - /*gtk_html_paste (composer->send_html);*/ - - cleanup: - close( fd ); - g_free( buffer ); - gtk_widget_destroy (GTK_WIDGET(fs)); -} - -static void fs_selection_get (GtkWidget *widget, GtkSelectionData *sdata, - guint info, guint time) -{ - gchar *buffer; - GdkAtom encoding; - gint format; - guchar *ctext; - gint length; - - buffer = gtk_object_get_data (GTK_OBJECT (widget), "ev_file_buffer"); - if (gdk_string_to_compound_text (buffer, &encoding, &format, &ctext, - &length) == Success) - gtk_selection_data_set (sdata, encoding, format, ctext, length); - g_free (buffer); - gtk_object_remove_data (GTK_OBJECT (widget), "ev_file_buffer"); -} - -#endif -static void -menu_file_insert_file_cb (BonoboUIHandler *uih, - void *data, - const char *path) -{ -#if 0 - EMsgComposer *composer; - GtkFileSelection *fs; - - composer = E_MSG_COMPOSER (data); - - fs = GTK_FILE_SELECTION (gtk_file_selection_new ("Choose File")); - /* FIXME: remember the location or something */ - /*gtk_file_selection_set_filename( fs, g_get_home_dir() );*/ - gtk_signal_connect (GTK_OBJECT (fs->ok_button), "clicked", - GTK_SIGNAL_FUNC (insert_file_ok_cb), data); - gtk_signal_connect_object (GTK_OBJECT (fs->cancel_button), - "clicked", - GTK_SIGNAL_FUNC (gtk_widget_destroy), - GTK_OBJECT (fs)); - gtk_widget_show (GTK_WIDGET(fs)); -#else - g_message ("Insert file is unimplemented! oh no!"); -#endif -} - -static void -menu_format_html_cb (BonoboUIHandler *uih, - void *data, - const char *path) -{ - EMsgComposer *composer; - gboolean new_state; - - composer = E_MSG_COMPOSER (data); - - new_state = bonobo_ui_handler_menu_get_toggle_state (uih, path); - if ((new_state && composer->send_html) || (! new_state && ! composer->send_html)) - return; - - e_msg_composer_set_send_html (composer, new_state); -} - - -/* Menu bar creation. */ - -static void -create_menubar_file (EMsgComposer *composer, - BonoboUIHandler *uih) -{ - bonobo_ui_handler_menu_new_subtree (uih, "/File", - _("_File"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0); - - bonobo_ui_handler_menu_new_item (uih, "/File/Open", - _("_Open..."), - _("Load a previously saved message"), - -1, - BONOBO_UI_HANDLER_PIXMAP_STOCK, - GNOME_STOCK_MENU_OPEN, - 0, 0, - menu_file_open_cb, composer); - - bonobo_ui_handler_menu_new_item (uih, "/File/Save", - _("_Save..."), - _("Save message"), - -1, - BONOBO_UI_HANDLER_PIXMAP_STOCK, - GNOME_STOCK_MENU_SAVE, - 0, 0, - menu_file_save_cb, composer); - - bonobo_ui_handler_menu_new_item (uih, "/File/Save as", - _("_Save as..."), - _("Save message with a different name"), - -1, - BONOBO_UI_HANDLER_PIXMAP_STOCK, - GNOME_STOCK_MENU_SAVE_AS, - 0, 0, - menu_file_save_as_cb, composer); - - bonobo_ui_handler_menu_new_item (uih, "/File/Save in folder", - _("Save in _folder..."), - _("Save the message in a specified folder"), - -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0, - NULL, composer); - - bonobo_ui_handler_menu_new_separator (uih, "/File/Separator1", -1); - - bonobo_ui_handler_menu_new_item (uih, "/File/Insert text file", - _("_Insert text file... (FIXME)"), - _("Insert a file as text into the message"), - -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0, - menu_file_insert_file_cb, composer); - - bonobo_ui_handler_menu_new_separator (uih, "/File/Separator2", -1); - - bonobo_ui_handler_menu_new_item (uih, "/File/Send", - _("_Send"), - _("Send the message"), - -1, - BONOBO_UI_HANDLER_PIXMAP_STOCK, - GNOME_STOCK_MENU_MAIL_SND, - 0, 0, - menu_file_send_cb, composer); - - bonobo_ui_handler_menu_new_separator (uih, "/File/Separator3", -1); - - bonobo_ui_handler_menu_new_item (uih, "/File/Close", - _("_Close..."), - _("Quit the message composer"), - -1, - BONOBO_UI_HANDLER_PIXMAP_STOCK, - GNOME_STOCK_MENU_CLOSE, - 0, 0, - menu_file_close_cb, composer); -} - -static void -create_menubar_edit (EMsgComposer *composer, - BonoboUIHandler *uih) -{ - bonobo_ui_handler_menu_new_subtree (uih, "/Edit", - _("_Edit"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0); -} - -static void -create_menubar_format (EMsgComposer *composer, - BonoboUIHandler *uih) -{ - bonobo_ui_handler_menu_new_subtree (uih, "/Format", - _("_Format"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0); - - bonobo_ui_handler_menu_new_toggleitem (uih, "/Format/HTML", - _("HTML"), - _("Send the mail in HTML format"), - -1, - 0, 0, - menu_format_html_cb, composer); - - bonobo_ui_handler_menu_set_toggle_state (uih, "/Format/HTML", composer->send_html); -} - -static void -create_menubar_view (EMsgComposer *composer, - BonoboUIHandler *uih) -{ - bonobo_ui_handler_menu_new_subtree (uih, "/View", - _("_View"), - NULL, -1, - BONOBO_UI_HANDLER_PIXMAP_NONE, NULL, - 0, 0); - - bonobo_ui_handler_menu_new_toggleitem (uih, "/View/Show attachments", - _("Show _attachments"), - _("Show/hide attachments"), - -1, - 0, 0, - menu_view_attachments_activate_cb, composer); -} - -static void -create_menubar (EMsgComposer *composer) -{ - BonoboUIHandler *uih; - - uih = composer->uih; - bonobo_ui_handler_create_menubar (uih); - - create_menubar_file (composer, uih); - create_menubar_edit (composer, uih); - create_menubar_format (composer, uih); - create_menubar_view (composer, uih); -} - - -/* Toolbar implementation. */ - -static void -create_toolbar (EMsgComposer *composer) -{ - BonoboUIHandler *uih; - - uih = composer->uih; - bonobo_ui_handler_create_toolbar (uih, "Toolbar"); - - bonobo_ui_handler_toolbar_new_item (uih, - "/Toolbar/Send", - _("Send"), - _("Send this message"), - -1, - BONOBO_UI_HANDLER_PIXMAP_STOCK, - GNOME_STOCK_PIXMAP_MAIL_SND, - 0, 0, - menu_file_send_cb, composer); - - bonobo_ui_handler_toolbar_new_item (uih, - "/Toolbar/Attach", - _("Attach"), - _("Attach a file"), - -1, - BONOBO_UI_HANDLER_PIXMAP_STOCK, - GNOME_STOCK_PIXMAP_ATTACH, - 0, 0, - menu_file_add_attachment_cb, composer); -} - - -/* Miscellaneous callbacks. */ - -static void -attachment_bar_changed_cb (EMsgComposerAttachmentBar *bar, - void *data) -{ - EMsgComposer *composer; - - composer = E_MSG_COMPOSER (data); - - if (e_msg_composer_attachment_bar_get_num_attachments (bar) > 0) - e_msg_composer_show_attachments (composer, TRUE); - else - e_msg_composer_show_attachments (composer, FALSE); -} - - -/* GtkObject methods. */ - -static void -destroy (GtkObject *object) -{ - EMsgComposer *composer; - CORBA_Environment ev; - - composer = E_MSG_COMPOSER (object); - - bonobo_object_unref (BONOBO_OBJECT (composer->uih)); - - /* FIXME? I assume the Bonobo widget will get destroyed - normally? */ - - if (composer->address_dialog != NULL) - gtk_widget_destroy (composer->address_dialog); - if (composer->hdrs != NULL) - gtk_widget_destroy (composer->hdrs); - - if (composer->extra_hdr_names) { - int i; - - for (i = 0; i < composer->extra_hdr_names->len; i++) { - g_free (composer->extra_hdr_names->pdata[i]); - g_free (composer->extra_hdr_values->pdata[i]); - } - g_ptr_array_free (composer->extra_hdr_names, TRUE); - g_ptr_array_free (composer->extra_hdr_values, TRUE); - } - - CORBA_exception_init (&ev); - - if (composer->persist_stream_interface != CORBA_OBJECT_NIL) { - Bonobo_Unknown_unref (composer->persist_stream_interface, &ev); - CORBA_Object_release (composer->persist_stream_interface, &ev); - } - - if (composer->persist_file_interface != CORBA_OBJECT_NIL) { - Bonobo_Unknown_unref (composer->persist_file_interface, &ev); - CORBA_Object_release (composer->persist_file_interface, &ev); - } - - CORBA_exception_free (&ev); - - if (GTK_OBJECT_CLASS (parent_class)->destroy != NULL) - (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); -} - - -/* GtkWidget methods. */ - -static int -delete_event (GtkWidget *widget, - GdkEventAny *event) -{ - do_exit (E_MSG_COMPOSER (widget)); - - return TRUE; -} - - -static void -class_init (EMsgComposerClass *klass) -{ - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - - object_class = GTK_OBJECT_CLASS (klass); - widget_class = GTK_WIDGET_CLASS (klass); - - object_class->destroy = destroy; - - widget_class->delete_event = delete_event; - - parent_class = gtk_type_class (gnome_app_get_type ()); - - signals[SEND] = - gtk_signal_new ("send", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EMsgComposerClass, send), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - signals[POSTPONE] = - gtk_signal_new ("postpone", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (EMsgComposerClass, postpone), - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, 0); - - gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); -} - -static void -init (EMsgComposer *composer) -{ - composer->uih = NULL; - - composer->hdrs = NULL; - composer->extra_hdr_names = g_ptr_array_new (); - composer->extra_hdr_values = g_ptr_array_new (); - - composer->editor = NULL; - - composer->address_dialog = NULL; - - composer->attachment_bar = NULL; - composer->attachment_scroll_frame = NULL; - - composer->persist_file_interface = CORBA_OBJECT_NIL; - composer->persist_stream_interface = CORBA_OBJECT_NIL; - - composer->attachment_bar_visible = FALSE; - composer->send_html = FALSE; -} - - -GtkType -e_msg_composer_get_type (void) -{ - static GtkType type = 0; - - if (type == 0) { - static const GtkTypeInfo info = { - "EMsgComposer", - sizeof (EMsgComposer), - sizeof (EMsgComposerClass), - (GtkClassInitFunc) class_init, - (GtkObjectInitFunc) init, - /* reserved_1 */ NULL, - /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, - }; - - type = gtk_type_unique (gnome_app_get_type (), &info); - } - - return type; -} - -/** - * e_msg_composer_construct: - * @composer: A message composer widget - * - * Construct @composer. - **/ -void -e_msg_composer_construct (EMsgComposer *composer) -{ - GtkWidget *vbox; - BonoboObject *editor_server; - - g_return_if_fail (gtk_main_level () > 0); - - gtk_window_set_default_size (GTK_WINDOW (composer), - DEFAULT_WIDTH, DEFAULT_HEIGHT); - - gnome_app_construct (GNOME_APP (composer), "e-msg-composer", - _("Compose a message")); - - composer->uih = bonobo_ui_handler_new (); - bonobo_ui_handler_set_app (composer->uih, GNOME_APP (composer)); - - vbox = gtk_vbox_new (FALSE, 0); - - composer->hdrs = e_msg_composer_hdrs_new (); - gtk_box_pack_start (GTK_BOX (vbox), composer->hdrs, FALSE, TRUE, 0); - gtk_widget_show (composer->hdrs); - - /* Editor component. */ - - create_menubar (composer); - create_toolbar (composer); - composer->editor = create_editor (composer); - - editor_server = BONOBO_OBJECT (bonobo_widget_get_server (BONOBO_WIDGET (composer->editor))); - - composer->persist_file_interface - = bonobo_object_query_interface (editor_server, "IDL:Bonobo/PersistFile:1.0"); - composer->persist_stream_interface - = bonobo_object_query_interface (editor_server, "IDL:Bonobo/PersistStream:1.0"); - - gtk_widget_show (composer->editor); - gtk_box_pack_start (GTK_BOX (vbox), composer->editor, TRUE, TRUE, 0); - gtk_widget_show (composer->editor); - - /* Attachment editor, wrapped into an EScrollFrame. We don't - show it for now. */ - - composer->attachment_scroll_frame = e_scroll_frame_new (NULL, NULL); - e_scroll_frame_set_shadow_type (E_SCROLL_FRAME (composer->attachment_scroll_frame), - GTK_SHADOW_IN); - e_scroll_frame_set_policy (E_SCROLL_FRAME (composer->attachment_scroll_frame), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - composer->attachment_bar = e_msg_composer_attachment_bar_new (NULL); - GTK_WIDGET_SET_FLAGS (composer->attachment_bar, GTK_CAN_FOCUS); - gtk_container_add (GTK_CONTAINER (composer->attachment_scroll_frame), - composer->attachment_bar); - gtk_box_pack_start (GTK_BOX (vbox), - composer->attachment_scroll_frame, - FALSE, TRUE, GNOME_PAD_SMALL); - - gtk_signal_connect (GTK_OBJECT (composer->attachment_bar), "changed", - GTK_SIGNAL_FUNC (attachment_bar_changed_cb), composer); - - gnome_app_set_contents (GNOME_APP (composer), vbox); - gtk_widget_show (vbox); - - e_msg_composer_show_attachments (composer, FALSE); - - /* Set focus on the `To:' field. */ - - gtk_widget_grab_focus (e_msg_composer_hdrs_get_to_entry (E_MSG_COMPOSER_HDRS (composer->hdrs))); -} - -/** - * e_msg_composer_new: - * - * Create a new message composer widget. This function must be called - * within the GTK+ main loop, or it will fail. - * - * Return value: A pointer to the newly created widget - **/ -GtkWidget * -e_msg_composer_new (void) -{ - GtkWidget *new; - - g_return_val_if_fail (gtk_main_level () > 0, NULL); - - new = gtk_type_new (e_msg_composer_get_type ()); - e_msg_composer_construct (E_MSG_COMPOSER (new)); - - /* Load the signature, if any. */ - set_editor_text (BONOBO_WIDGET (E_MSG_COMPOSER (new)->editor), - NULL, ""); - - return new; -} - -/** - * e_msg_composer_new_with_sig_file: - * - * Create a new message composer widget. This function must be called - * within the GTK+ main loop, or it will fail. Sets the signature - * file. - * - * Return value: A pointer to the newly created widget - **/ -GtkWidget * -e_msg_composer_new_with_sig_file (const char *sig_file) -{ - GtkWidget *new; - - g_return_val_if_fail (gtk_main_level () > 0, NULL); - - new = gtk_type_new (e_msg_composer_get_type ()); - e_msg_composer_construct (E_MSG_COMPOSER (new)); - - /* Load the signature, if any. */ - set_editor_text (BONOBO_WIDGET (E_MSG_COMPOSER (new)->editor), - sig_file, ""); - - return new; -} - -static GList * -add_recipients (GList *list, const char *recips, gboolean decode) -{ - int len; - char *addr; - - while (*recips) { - len = strcspn (recips, ","); - if (len) { - addr = g_strndup (recips, len); - if (decode) - camel_url_decode (addr); - list = g_list_append (list, addr); - } - recips += len; - if (*recips == ',') - recips++; - } - - return list; -} - -static void -free_recipients (GList *list) -{ - GList *l; - - for (l = list; l; l = l->next) - g_free (l->data); - g_list_free (list); -} - -/** - * e_msg_composer_new_from_url: - * @url: a mailto URL - * - * Create a new message composer widget, and fill in fields as - * defined by the provided URL. - **/ -GtkWidget * -e_msg_composer_new_from_url (const char *url) -{ - EMsgComposer *composer; - EMsgComposerHdrs *hdrs; - GList *to = NULL, *cc = NULL, *bcc = NULL; - char *subject = NULL, *body = NULL; - const char *p, *header; - int len, clen; - char *content; - - g_return_val_if_fail (strncasecmp (url, "mailto:", 7) == 0, NULL); - - /* Parse recipients (everything after ':' until '?' or eos. */ - p = url + 7; - len = strcspn (p, "?,"); - if (len) { - content = g_strndup (p, len); - to = add_recipients (to, content, TRUE); - g_free (content); - } - - p += len; - if (*p == '?') { - p++; - - while (*p) { - len = strcspn (p, "=&"); - - /* If it's malformed, give up. */ - if (p[len] != '=') - break; - - header = p; - p += len + 1; - - clen = strcspn (p, "&"); - content = g_strndup (p, clen); - camel_url_decode (content); - - if (!strncasecmp (header, "to", len)) - to = add_recipients (to, content, FALSE); - else if (!strncasecmp (header, "cc", len)) - cc = add_recipients (cc, content, FALSE); - else if (!strncasecmp (header, "bcc", len)) - bcc = add_recipients (bcc, content, FALSE); - else if (!strncasecmp (header, "subject", len)) - subject = g_strdup (content); - else if (!strncasecmp (header, "body", len)) - body = g_strdup (content); - - g_free (content); - p += clen; - if (*p == '&') { - p++; - if (!strcmp (p, "amp;")) - p += 4; - } - } - } - - composer = E_MSG_COMPOSER (e_msg_composer_new ()); - hdrs = E_MSG_COMPOSER_HDRS (composer->hdrs); - e_msg_composer_hdrs_set_to (hdrs, to); - free_recipients (to); - e_msg_composer_hdrs_set_cc (hdrs, cc); - free_recipients (cc); - e_msg_composer_hdrs_set_bcc (hdrs, bcc); - free_recipients (bcc); - if (subject) { - e_msg_composer_hdrs_set_subject (hdrs, subject); - g_free (subject); - } - - if (body) { - char *htmlbody = e_text_to_html (body, E_TEXT_TO_HTML_PRE); - set_editor_text (BONOBO_WIDGET (composer->editor), - NULL, htmlbody); - g_free (htmlbody); - } - - return GTK_WIDGET (composer); -} - -/** - * e_msg_composer_show_attachments: - * @composer: A message composer widget - * @show: A boolean specifying whether the attachment bar should be shown or - * not - * - * If @show is %FALSE, hide the attachment bar. Otherwise, show it. - **/ -void -e_msg_composer_show_attachments (EMsgComposer *composer, - gboolean show) -{ - g_return_if_fail (composer != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER (composer)); - - show_attachments (composer, show); -} - -/** - * e_msg_composer_set_headers: - * @composer: a composer object - * @to: the values for the "To" header - * @cc: the values for the "Cc" header - * @bcc: the values for the "Bcc" header - * @subject: the value for the "Subject" header - * - * Sets the headers in the composer to the given values. - **/ -void -e_msg_composer_set_headers (EMsgComposer *composer, const GList *to, - const GList *cc, const GList *bcc, - const char *subject) -{ - EMsgComposerHdrs *hdrs; - - g_return_if_fail (E_IS_MSG_COMPOSER (composer)); - hdrs = E_MSG_COMPOSER_HDRS (composer->hdrs); - - e_msg_composer_hdrs_set_to (hdrs, to); - e_msg_composer_hdrs_set_cc (hdrs, cc); - e_msg_composer_hdrs_set_bcc (hdrs, bcc); - e_msg_composer_hdrs_set_subject (hdrs, subject); -} - - -/** - * e_msg_composer_set_body_text: - * @composer: a composer object - * @text: the HTML text to initialize the editor with - * - * Loads the given HTML text into the editor. - **/ -void -e_msg_composer_set_body_text (EMsgComposer *composer, const char *text) -{ - g_return_if_fail (E_IS_MSG_COMPOSER (composer)); - - set_editor_text (BONOBO_WIDGET (composer->editor), - composer->sig_file, text); -} - - -/** - * e_msg_composer_add_header: - * @composer: a composer object - * @name: the header name - * @value: the header value - * - * Adds a header with @name and @value to the message. This header - * may not be displayed by the composer, but will be included in - * the message it outputs. - **/ -void -e_msg_composer_add_header (EMsgComposer *composer, const char *name, - const char *value) -{ - g_return_if_fail (E_IS_MSG_COMPOSER (composer)); - g_return_if_fail (name != NULL); - g_return_if_fail (value != NULL); - - g_ptr_array_add (composer->extra_hdr_names, g_strdup (name)); - g_ptr_array_add (composer->extra_hdr_values, g_strdup (value)); -} - - -/** - * e_msg_composer_attach: - * @composer: a composer object - * @attachment: the CamelMimePart to attach - * - * Attaches @attachment to the message being composed in the composer. - **/ -void -e_msg_composer_attach (EMsgComposer *composer, CamelMimePart *attachment) -{ - EMsgComposerAttachmentBar *bar; - - g_return_if_fail (E_IS_MSG_COMPOSER (composer)); - g_return_if_fail (CAMEL_IS_MIME_PART (attachment)); - - bar = E_MSG_COMPOSER_ATTACHMENT_BAR (composer->attachment_bar); - e_msg_composer_attachment_bar_attach_mime_part (bar, attachment); -} - - -/** - * e_msg_composer_get_message: - * @composer: A message composer widget - * - * Retrieve the message edited by the user as a CamelMimeMessage. The - * CamelMimeMessage object is created on the fly; subsequent calls to this - * function will always create new objects from scratch. - * - * Return value: A pointer to the new CamelMimeMessage object - **/ -CamelMimeMessage * -e_msg_composer_get_message (EMsgComposer *composer) -{ - g_return_val_if_fail (composer != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL); - - return build_message (composer); -} - - - -/** - * e_msg_composer_set_sig: - * @composer: A message composer widget - * @path: Signature file - * - * Set a signature - **/ -void -e_msg_composer_set_sig_file (EMsgComposer *composer, const char *sig_file) -{ - g_return_if_fail (composer != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER (composer)); - - composer->sig_file = g_strdup (sig_file); -} - -/** - * e_msg_composer_get_sig_file: - * @composer: A message composer widget - * - * Get the signature file - * - * Return value: The signature file. - **/ -char * -e_msg_composer_get_sig_file (EMsgComposer *composer) -{ - g_return_val_if_fail (composer != NULL, NULL); - g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), NULL); - - return composer->sig_file; -} - - -/** - * e_msg_composer_set_send_html: - * @composer: A message composer widget - * @send_html: Whether the composer should have the "Send HTML" flag set - * - * Set the status of the "Send HTML" toggle item. The user can override it. - **/ -void -e_msg_composer_set_send_html (EMsgComposer *composer, - gboolean send_html) -{ - g_return_if_fail (composer != NULL); - g_return_if_fail (E_IS_MSG_COMPOSER (composer)); - - if (composer->send_html && send_html) - return; - if (! composer->send_html && ! send_html) - return; - - composer->send_html = send_html; - bonobo_ui_handler_menu_set_toggle_state (composer->uih, "/Format/HTML", send_html); -} - -/** - * e_msg_composer_get_send_html: - * @composer: A message composer widget - * - * Get the status of the "Send HTML mail" flag. - * - * Return value: The status of the "Send HTML mail" flag. - **/ -gboolean -e_msg_composer_get_send_html (EMsgComposer *composer) -{ - g_return_val_if_fail (composer != NULL, FALSE); - g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE); - - return composer->send_html; -} diff --git a/composer/e-msg-composer.h b/composer/e-msg-composer.h deleted file mode 100644 index 94e906a48e..0000000000 --- a/composer/e-msg-composer.h +++ /dev/null @@ -1,117 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* e-msg-composer.h - * - * Copyright (C) 1999 Helix Code, Inc. - * - * 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 Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Author: Ettore Perazzoli - */ - -#ifndef ___E_MSG_COMPOSER_H__ -#define ___E_MSG_COMPOSER_H__ - -#include <gnome.h> -#include <bonobo.h> - -#include "e-msg-composer-attachment-bar.h" -#include "e-msg-composer-hdrs.h" - -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ - - -#define E_TYPE_MSG_COMPOSER (e_msg_composer_get_type ()) -#define E_MSG_COMPOSER(obj) (GTK_CHECK_CAST ((obj), E_TYPE_MSG_COMPOSER, EMsgComposer)) -#define E_MSG_COMPOSER_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_MSG_COMPOSER, EMsgComposerClass)) -#define E_IS_MSG_COMPOSER(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_MSG_COMPOSER)) -#define E_IS_MSG_COMPOSER_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_MSG_COMPOSER)) - - -typedef struct _EMsgComposer EMsgComposer; -typedef struct _EMsgComposerClass EMsgComposerClass; - -struct _EMsgComposer { - GnomeApp parent; - - BonoboUIHandler *uih; - - GtkWidget *hdrs; - GPtrArray *extra_hdr_names, *extra_hdr_values; - - GtkWidget *editor; - - GtkWidget *attachment_bar; - GtkWidget *attachment_scroll_frame; - - GtkWidget *address_dialog; - - Bonobo_PersistFile persist_file_interface; - Bonobo_PersistStream persist_stream_interface; - - char *sig_file; - - gboolean attachment_bar_visible : 1; - gboolean send_html : 1; -}; - -struct _EMsgComposerClass { - GnomeAppClass parent_class; - - void (* send) (EMsgComposer *composer); - void (* postpone) (EMsgComposer *composer); -}; - - -GtkType e_msg_composer_get_type (void); - -void e_msg_composer_construct (EMsgComposer *composer); -GtkWidget *e_msg_composer_new (void); -GtkWidget *e_msg_composer_new_with_sig_file (const char *sig_file); -GtkWidget *e_msg_composer_new_from_url (const char *url); -void e_msg_composer_show_attachments (EMsgComposer *composer, - gboolean show); - -void e_msg_composer_set_headers (EMsgComposer *composer, - const GList *to, - const GList *cc, - const GList *bcc, - const char *subject); -void e_msg_composer_set_body_text (EMsgComposer *composer, - const char *text); -void e_msg_composer_add_header (EMsgComposer *composer, - const char *name, - const char *value); -void e_msg_composer_attach (EMsgComposer *composer, - CamelMimePart *attachment); - -CamelMimeMessage *e_msg_composer_get_message (EMsgComposer *composer); - -void e_msg_composer_set_sig_file (EMsgComposer *composer, - const char *sig_file); -char *e_msg_composer_get_sig_file (EMsgComposer *composer); - -void e_msg_composer_set_send_html (EMsgComposer *composer, - gboolean send_html); -gboolean e_msg_composer_get_send_html (EMsgComposer *composer); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* ___E_MSG_COMPOSER_H__ */ diff --git a/composer/main.c b/composer/main.c deleted file mode 100644 index 9a29e95666..0000000000 --- a/composer/main.c +++ /dev/null @@ -1,76 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ - -#include <gnome.h> -#include <libgnorba/gnorba.h> -#include <bonobo.h> - -#include <glade/glade.h> - -#include <camel/camel-data-wrapper.h> -#include <camel/camel-stream-fs.h> -#include <camel/camel-stream.h> - -#include "e-msg-composer.h" - -static void -send_cb (EMsgComposer *composer, - gpointer data) -{ - CamelMimeMessage *message; - CamelStream *stream; - gint stdout_dup; - - message = e_msg_composer_get_message (composer); - - stdout_dup = dup (1); - stream = camel_stream_fs_new_with_fd (stdout_dup); - camel_data_wrapper_write_to_stream (CAMEL_DATA_WRAPPER (message), - stream); - camel_stream_close (stream); - - gtk_object_unref (GTK_OBJECT (message)); - -#if 0 - gtk_widget_destroy (GTK_WIDGET (composer)); - gtk_main_quit (); -#endif -} - -static guint -create_composer (void) -{ - GtkWidget *composer; - - composer = e_msg_composer_new (); - gtk_widget_show (composer); - - gtk_signal_connect (GTK_OBJECT (composer), "send", GTK_SIGNAL_FUNC (send_cb), NULL); - - return FALSE; -} - -int -main (int argc, char **argv) -{ - CORBA_Environment ev; - CORBA_ORB orb; - - CORBA_exception_init (&ev); - gnome_CORBA_init ("evolution-test-msg-composer", "0.0", &argc, argv, 0, &ev); - CORBA_exception_free (&ev); - - orb = gnome_CORBA_ORB (); - - glade_gnome_init (); - - if (bonobo_init (orb, NULL, NULL) == FALSE) - g_error ("Could not initialize Bonobo\n"); - - /* We can't make any CORBA calls unless we're in the main loop. So we - delay creating the container here. */ - gtk_idle_add ((GtkFunction) create_composer, NULL); - - bonobo_main (); - - return 0; -} |