aboutsummaryrefslogtreecommitdiffstats
path: root/composer/e-msg-composer.c
diff options
context:
space:
mode:
Diffstat (limited to 'composer/e-msg-composer.c')
-rw-r--r--composer/e-msg-composer.c187
1 files changed, 183 insertions, 4 deletions
diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c
index b71a72bafb..f393ac4a37 100644
--- a/composer/e-msg-composer.c
+++ b/composer/e-msg-composer.c
@@ -619,10 +619,14 @@ exit_cb (GtkWidget *widget, gpointer data)
}
static void
-menu_view_attachments_activate_cb (GtkWidget *widget, gpointer data)
+menu_view_attachments_activate_cb (GtkWidget *widget, gpointer data, const char *path)
{
+ gboolean state;
+
+ state = bonobo_ui_handler_menu_get_toggle_state(BONOBO_UI_HANDLER(widget), path);
+
e_msg_composer_show_attachments (E_MSG_COMPOSER (data),
- GTK_CHECK_MENU_ITEM (widget)->active);
+ state);
}
static void
@@ -647,6 +651,172 @@ add_attachment_cb (GtkWidget *widget, gpointer data)
NULL);
}
+static void
+insert_file_ok_cb (GtkWidget *widget, gpointer user_data)
+{
+ GtkFileSelection *fs;
+ char *name;
+ EMsgComposer *composer;
+ struct stat sb;
+
+#if 0
+ int fd;
+ guint8 *buffer;
+ size_t bufsz, actual;
+#endif
+
+ 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 0
+ 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_question_dialog_modal_parented( _("The file is very large (more than 100K).\n"
+ "Are you sure you wish to insert it?"),
+ NULL,
+ 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';
+
+ cleanup:
+ close( fd );
+ g_free( buffer );
+#endif
+
+ {
+ Bonobo_PersistStream persist;
+ BonoboStream *stream;
+ CORBA_Environment ev;
+
+ CORBA_exception_init (&ev);
+
+ persist = (Bonobo_PersistStream)
+ bonobo_object_client_query_interface (
+ bonobo_widget_get_server (BONOBO_WIDGET(composer->editor)),
+ "IDL:Bonobo/PersistStream:1.0",
+ &ev);
+ g_assert (persist != CORBA_OBJECT_NIL);
+
+ stream = bonobo_stream_fs_create (name);
+ 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));
+ }
+
+ gtk_widget_destroy (GTK_WIDGET(fs));
+}
+
+static void
+insert_file_cb (GtkWidget *widget, gpointer data)
+{
+ 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));
+}
+
/* Create the address dialog if not created already. */
static void
setup_address_dialog (EMsgComposer *composer)
@@ -718,6 +888,9 @@ static GnomeUIInfo file_tree[] = {
GNOMEUIINFO_ITEM_NONE (N_("Save in _folder..."), N_("Save the message in a specified folder"),
NULL),
GNOMEUIINFO_SEPARATOR,
+ GNOMEUIINFO_ITEM_NONE (N_("_Insert Text File"), N_("Insert a file as text into the message"),
+ insert_file_cb),
+ GNOMEUIINFO_SEPARATOR,
GNOMEUIINFO_ITEM_STOCK (N_("Send"), N_("Send the message"),
send_cb, GNOME_STOCK_MENU_MAIL_SND),
GNOMEUIINFO_SEPARATOR,
@@ -730,8 +903,13 @@ static GnomeUIInfo edit_tree[] = {
};
static GnomeUIInfo view_tree[] = {
- GNOMEUIINFO_ITEM_STOCK (N_("View _attachments"), N_("View/hide attachments"),
- menu_view_attachments_activate_cb, GNOME_STOCK_MENU_ATTACH),
+ { GNOME_APP_UI_TOGGLEITEM, N_("View _attachments"),
+ N_("View/hide attachments"), menu_view_attachments_activate_cb,
+ NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_ATTACH, 0,
+ (GdkModifierType) 0, NULL },
+ /* GNOMEUIINFO_ITEM_STOCK (N_("View _attachments"), N_("View/hide attachments"),
+ * menu_view_attachments_activate_cb, GNOME_STOCK_MENU_ATTACH),
+ */
GNOMEUIINFO_END
};
@@ -754,6 +932,7 @@ create_menubar (EMsgComposer *composer)
list = bonobo_ui_handler_menu_parse_uiinfo_list_with_data (menubar_info, composer);
bonobo_ui_handler_menu_add_list (uih, "/", list);
+ /* bonobo_ui_handler_menu_free_list (list); */
}