inital gtk2 patch
[claws.git] / src / messageview.c
index 28cf6cc61d6f9ec762343ccb5cc8ab5cd75c7eed..266b6aa5906aeb8a72f0864801e6e542aa3e50a6 100644 (file)
@@ -60,6 +60,7 @@
 #include "rfc2015.h"
 #include "send_message.h"
 #include "stock_pixmap.h"
+#include "hooks.h"
 
 static GList *messageview_list = NULL;
 
@@ -128,14 +129,11 @@ static void create_filter_cb              (gpointer        data,
                                         guint           action,
                                         GtkWidget      *widget);
 
-static void messageview_menubar_cb     (MessageView    *msgview,
-                                        guint           action, 
-                                        GtkWidget      *widget);
 static void about_cb                   (gpointer        data,
                                         guint           action,
                                         GtkWidget      *widget);
 static void messageview_update         (MessageView *msgview);
-static void messageview_update_all     (MessageView *msgview);
+static gboolean messageview_update_msg (gpointer source, gpointer data);
 
 static GList *msgview_list = NULL;
 static GtkItemFactoryEntry msgview_entries[] =
@@ -328,6 +326,8 @@ MessageView *messageview_create(MainWindow *mainwin)
        messageview->mimeview   = mimeview;
        messageview->noticeview = noticeview;
        messageview->mainwin    = mainwin;
+       messageview->msginfo_update_callback_id =
+               hooks_register_hook(MSGINFO_UPDATE_HOOKLIST, messageview_update_msg, (gpointer) messageview);
 
        return messageview;
 }
@@ -380,18 +380,18 @@ MessageView *messageview_create_with_new_window(MainWindow *mainwin)
        gtk_window_set_title(GTK_WINDOW(window), _("Sylpheed - Message View"));
        gtk_window_set_wmclass(GTK_WINDOW(window), "message_view", "Sylpheed");
        gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
-       gtk_widget_set_usize(window, prefs_common.msgwin_width,
-                            prefs_common.msgwin_height);
+       gtk_widget_set_size_request(window, prefs_common.msgwin_width,
+                                   prefs_common.msgwin_height);
 
        msgview = messageview_create(mainwin);
 
-       gtk_signal_connect(GTK_OBJECT(window), "size_allocate",
-                          GTK_SIGNAL_FUNC(messageview_size_allocate_cb),
-                          msgview);
-       gtk_signal_connect(GTK_OBJECT(window), "destroy",
-                          GTK_SIGNAL_FUNC(messageview_destroy_cb), msgview);
-       gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
-                          GTK_SIGNAL_FUNC(key_pressed), msgview);
+       g_signal_connect(G_OBJECT(window), "size_allocate",
+                        G_CALLBACK(messageview_size_allocate_cb),
+                        msgview);
+       g_signal_connect(G_OBJECT(window), "destroy",
+                        G_CALLBACK(messageview_destroy_cb), msgview);
+       g_signal_connect(G_OBJECT(window), "key_press_event",
+                        G_CALLBACK(key_pressed), msgview);
 
        messageview_add_toolbar(msgview, window);
 
@@ -736,6 +736,9 @@ void messageview_destroy(MessageView *messageview)
        debug_print("destroy messageview\n");
        messageview_list = g_list_remove(messageview_list, messageview);
 
+       hooks_unregister_hook(MSGINFO_UPDATE_HOOKLIST,
+                             messageview->msginfo_update_callback_id);
+
        headerview_destroy(messageview->headerview);
        textview_destroy(messageview->textview);
        mimeview_destroy(messageview->mimeview);
@@ -758,59 +761,19 @@ void messageview_destroy(MessageView *messageview)
 
 void messageview_delete(MessageView *msgview)
 {
-       MsgInfo *msginfo = (MsgInfo*)msgview->msginfo;
+       MsgInfo *msginfo = (MsgInfo *) msgview->msginfo;
        FolderItem *trash = folder_get_default_trash();
-       GSList *msg_list;
 
        g_return_if_fail(msginfo != NULL);
        g_return_if_fail(trash   != NULL);
-       
-       msg_list = folder_item_get_msg_list(msginfo->folder);
-       
-       if (msg_list == NULL) {
-               alertpanel_error(_("Message already removed from folder."));
-               return;
-       }
-       
-       for (; msg_list != NULL; msg_list = msg_list->next) {
-               MsgInfo *msginfo_list = (MsgInfo*)msg_list->data;
-               
-               if (msginfo->msgnum == msginfo_list->msgnum) {
-
-                       if (prefs_common.immediate_exec)
-                               folder_item_move_msg(trash, msginfo);
-                       else {
-                               procmsg_msginfo_set_to_folder(msginfo, trash);
-                               procmsg_msginfo_set_flags(msginfo, MSG_DELETED, 0);
-                               /* NOTE: does not update to next message in summaryview
-                                */
-                       }
-                               
-                       messageview_update_all(msgview);
-                       break;
-               }
-       }
-}
-
-/*     
- * scan List of MessageViews checking whether there are any Views holding messages 
- * which need to be updated (another view might have deleted the one this MessagView holds)
- */
-static void messageview_update_all(MessageView *msgview)
-{
-       MsgInfo *msginfo = (MsgInfo*)msgview->msginfo;
-       GList *cur;
-       
-       g_return_if_fail(msginfo != NULL);
-
-       for (cur = msgview_list; cur != NULL; cur = cur->next) {
-               MessageView *msgview = (MessageView*)cur->data;
-               MsgInfo *msginfo_list = (MsgInfo*)msgview->msginfo;
-               
-               g_return_if_fail(msginfo != NULL);
 
-               if (msginfo->msgnum == msginfo_list->msgnum)
-                       messageview_update(msgview);
+       if (prefs_common.immediate_exec)
+               /* TODO: Delete from trash */
+               folder_item_move_msg(trash, msginfo);
+       else {
+               procmsg_msginfo_set_to_folder(msginfo, trash);
+               procmsg_msginfo_set_flags(msginfo, MSG_DELETED, 0);
+               /* NOTE: does not update to next message in summaryview */
        }
 }
 
@@ -875,8 +838,14 @@ void messageview_copy_clipboard(MessageView *messageview)
        TextView *text;
 
        text = messageview_get_current_textview(messageview);
-       if (text)
-               gtk_editable_copy_clipboard(GTK_EDITABLE(text->text));
+       if (text) {
+               GtkTextView *textview = GTK_TEXT_VIEW(text->text);
+               GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
+               GtkClipboard *clipboard
+                       = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+
+               gtk_text_buffer_copy_clipboard(buffer, clipboard);
+       }
 }
 
 void messageview_select_all(MessageView *messageview)
@@ -1083,55 +1052,36 @@ gchar *messageview_get_selection(MessageView *msgview)
 {
        TextView *textview;
        gchar *text = NULL;
-       GtkEditable *edit = NULL;
+       GtkTextView *edit = NULL;
+       GtkTextBuffer *textbuf;
        gint body_pos = 0;
        
        g_return_val_if_fail(msgview != NULL, NULL);
 
        textview = messageview_get_current_textview(msgview);
        if (textview) {
-               edit = GTK_EDITABLE(textview->text);
+               edit = GTK_TEXT_VIEW(textview->text);
                body_pos = textview->body_pos;
        } else {
-               edit = GTK_EDITABLE(msgview->mimeview->textview->text);
+               edit = GTK_TEXT_VIEW(msgview->mimeview->textview->text);
                body_pos = msgview->mimeview->textview->body_pos;
        }
 
        g_return_val_if_fail(edit != NULL, NULL);
 
-       if (edit->has_selection)
-               text = gtkut_editable_get_selection(edit);
-       else if (msgview->filtered) 
-               text = gtk_editable_get_chars (edit, body_pos, -1);
-       else
-               text = NULL;
-       
-       return text;
-}
-
-static void messageview_delete_cb(MessageView *msgview, guint action, GtkWidget *widget)
-{
-       messageview_delete(msgview);
-}
-
-static void messageview_menubar_cb(MessageView *msgview, guint action, GtkWidget *widget)
-{
-       GSList *msginfo_list = NULL;
-       gchar *body;
-       MsgInfo *msginfo;
-
-       g_return_if_fail(msgview != NULL);
+       textbuf = gtk_text_view_get_buffer(edit);
 
-       msginfo = (MsgInfo*)msgview->msginfo;
-       g_return_if_fail(msginfo != NULL);
-
-       msginfo_list = g_slist_append(msginfo_list, msginfo);
-       g_return_if_fail(msginfo_list);
+       if (gtk_text_buffer_get_selection_bounds(textbuf, NULL, NULL))
+               return gtkut_text_view_get_selection(edit);
+       else if (msgview->filtered) {
+               GtkTextIter start_iter, end_iter;
+               gtk_text_buffer_get_iter_at_offset(textbuf, &start_iter, body_pos);
+               gtk_text_buffer_get_end_iter(textbuf, &end_iter);
+               gtk_text_buffer_get_text(textbuf, &start_iter, &end_iter, FALSE);
+       } else
+               text = NULL;
 
-       body =  messageview_get_selection(msgview);
-       compose_reply_mode((ComposeMode)action, msginfo_list, body);
-       g_free(body);
-       g_slist_free(msginfo_list);
+       return text;
 }
 
 static void save_as_cb(gpointer data, guint action, GtkWidget *widget)
@@ -1392,3 +1342,19 @@ static void about_cb(gpointer data, guint action, GtkWidget *widget)
 {
        about_show();
 }
+
+static gboolean messageview_update_msg(gpointer source, gpointer data)
+{
+       MsgInfoUpdate *msginfo_update = (MsgInfoUpdate *) source;
+       MessageView *messageview = (MessageView *)data;
+
+       if (messageview->msginfo != msginfo_update->msginfo)
+               return FALSE;
+
+       if (msginfo_update->flags & MSGINFO_UPDATE_DELETED) {
+               messageview_clear(messageview);
+               messageview_update(messageview);
+       }
+
+       return FALSE;
+}