toolbar reply refactoring: part 1
authorOliver Haertel <o.h.a@gmx.net>
Mon, 3 Mar 2003 19:03:23 +0000 (19:03 +0000)
committerOliver Haertel <o.h.a@gmx.net>
Mon, 3 Mar 2003 19:03:23 +0000 (19:03 +0000)
ChangeLog.claws
configure.ac
src/mainwindow.c
src/messageview.c
src/messageview.h
src/summaryview.c
src/summaryview.h

index e41d578161e481b8121cc6dcb60d182457d5421e..6e80d444ba7187ec2ed870b587670a2c9bbb3742 100644 (file)
@@ -1,3 +1,18 @@
+2003-03-03 [oliver]    0.8.10claws73
+       
+       * src/messageview.[ch]
+               new functions
+               - messageview_delete: delete message shown in messagview
+               - messageview_update_view: update messageview to currently 
+                 selected summaryview message
+               - add separate messageview to msgview_list in order to update 
+                 toolbar to new toolbar style on the fly (TOOLBAR_NONE, TOOLBAR_ICON etc.)
+       * src/summaryview.[ch]
+               summary_get_selection returns a list of selected msgs
+               in summaryview
+       * src/mainwindow.c
+               toolbar reply refactoring
+
 2003-03-03 [paul]      0.8.10claws72
 
        * sync with 0.8.10cvs21
index 718effa051efafa2dcac2dc0b3f2ec113be9a219..0313306996f3b4c2a69ca2873c0953f3a9edba7a 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=8
 MICRO_VERSION=10
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=claws72
+EXTRA_VERSION=claws73
 VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
 
 dnl set $target
index b290f4141a09d42e3606dfa3e150d230ae9b6897..5b2cc08f8785de24ae9d630f8dfd8dba6aacb0a7 100644 (file)
@@ -2155,9 +2155,21 @@ static void toggle_toolbar_cb(MainWindow *mainwin, guint action,
 void main_window_reply_cb(MainWindow *mainwin, guint action,
                          GtkWidget *widget)
 {
-       toolbar_menu_reply(TOOLBAR_MAIN, mainwin, action);
+       MessageView *msgview = (MessageView*)mainwin->messageview;
+       GSList *msginfo_list = NULL;
+       gchar *body;
+
+       g_return_if_fail(msgview != NULL);
+
+       msginfo_list = summary_get_selection(mainwin->summaryview);
+       g_return_if_fail(msginfo_list != NULL);
+       
+       body = messageview_get_selection(msgview);
+       compose_reply_mode((ComposeMode)action, msginfo_list, body);
+       g_free(body);
+       g_slist_free(msginfo_list);
 }
-/* END Toolbar Stuff */
+
 
 static void toggle_statusbar_cb(MainWindow *mainwin, guint action,
                                GtkWidget *widget)
index f4c967ec08b809d3f8462b4b25da2c7a5fdc7cc1..863897425f3948a5f3904b790aa34ca886e97303 100644 (file)
@@ -74,10 +74,15 @@ static PrefsAccount *select_account_from_list
 static void messageview_menubar_cb     (MessageView    *msgview,
                                         guint           action, 
                                         GtkWidget      *widget);
-                                        
+static void messageview_delete_cb      (MessageView    *msgview, 
+                                        guint           action, 
+                                        GtkWidget      *widget);                                        
 static void messageview_close_cb       (gpointer        data,
                                         guint           action,
                                         GtkWidget      *widget);
+static void messageview_update         (MessageView *msgview);
+static void messageview_update_all     (MessageView *msgview);
+
 static GList *msgview_list = NULL;
 
 MessageView *messageview_create(MainWindow *mainwin)
@@ -156,7 +161,7 @@ static GtkItemFactoryEntry messageview_entries[] =
        {N_("/_Message/_Forward"),              "<control><alt>F", messageview_menubar_cb, COMPOSE_FORWARD, NULL},
        {N_("/_Message/Redirect"),              NULL, messageview_menubar_cb, COMPOSE_REDIRECT, NULL},
        {N_("/_Message/---"),                   NULL, NULL, 0, "<Separator>"},
-       {N_("/_Message/_Delete"),               "<control>D", delete_msgview_cb,  0, NULL},
+       {N_("/_Message/_Delete"),               "<control>D", messageview_delete_cb,  0, NULL},
        
        {N_("/_Help"),                          NULL, NULL, 0, "<Branch>"},
        {N_("/_Help/_About"),                   NULL, about_show, 0, NULL}
@@ -193,6 +198,8 @@ void messageview_add_toolbar(MessageView *msgview, GtkWidget *window)
 
        gtk_container_add(GTK_CONTAINER(vbox),
                          GTK_WIDGET_PTR(msgview));
+
+       msgview_list = g_list_append(msgview_list, msgview);
 }
 
 MessageView *messageview_create_with_new_window(MainWindow *mainwin)
@@ -229,7 +236,6 @@ MessageView *messageview_create_with_new_window(MainWindow *mainwin)
        toolbar_set_style(msgview->toolbar->toolbar, msgview->handlebox, 
                          prefs_common.toolbar_style);
        messageview_init(msgview);
-       msgview_list = g_list_append(msgview_list, msgview);
 
        return msgview;
 }
@@ -631,6 +637,116 @@ void messageview_destroy(MessageView *messageview)
        gtk_widget_unref(mimeview);
 }
 
+void messageview_delete(MessageView *msgview)
+{
+       MsgInfo *msginfo = (MsgInfo*)msgview->msginfo;
+       SummaryView *summaryview = (SummaryView*)msgview->mainwin->summaryview;
+       FolderItem *trash = folder_get_default_trash();
+
+       g_return_if_fail(msginfo != NULL);
+       g_return_if_fail(trash != NULL);
+
+       if (!procmsg_msg_exist(msginfo)) {
+               alertpanel_error(_("Message already removed from folder."));
+               messageview_update_all(msgview);
+               return;
+       }
+
+       if (MSG_IS_MOVE(msginfo->flags)) {
+               alertpanel_error(_("Message already moved to Trash Folder."));
+               messageview_update_all(msgview);
+               return;
+       }
+
+       if (MSG_IS_LOCKED(msginfo->flags)) {
+               alertpanel_error(_("Message is locked."));
+               messageview_update_all(msgview);
+               return;
+       }
+
+       /* TODO: move summaryview's check_permission somewhere sane 
+        * (maybe MSG_IS_NOT_AUTHOR ????) 
+        */
+       if(msginfo->folder->folder->type == F_NEWS) {
+               alertpanel_error(_("Deleting News not implemented."));  
+               return;
+       }
+
+       /* set moved Flags 
+        * deleting them is no option since this garbles our 
+        * msgview->msginfo pointer
+        */
+       procmsg_msginfo_set_to_folder(msginfo, trash);
+       procmsg_msginfo_unset_flags(msginfo, MSG_MARKED | MSG_DELETED, MSG_COPY);
+       if (!MSG_IS_MOVE(msginfo->flags)) {
+               procmsg_msginfo_set_flags(msginfo, 0, MSG_MOVE);
+       }
+
+       /* if messageview holds message which is also in 
+        * currently active summaryview --> update summaryview
+        * if not: folderview_selected updates summaryview (summary_show) 
+        * and deletes messages marked for deletion
+        */
+       if (g_strcasecmp(summaryview->folder_item->path, msginfo->folder->path) == 0) {
+               //summary_show(summaryview, summaryview->folder_item);
+               //if (prefs_common.immediate_exec)
+               //      summary_execute(summaryview); 
+               summary_delete(summaryview);
+       } 
+       messageview_update_all(msgview);
+}
+
+/*     
+ * scan List of MessageViews checking whether there are any Views holding messages 
+ * which need to be updated because another view has 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_list = (MessageView*)cur->data;
+               MsgInfo *msginfo_list = (MsgInfo*)msgview->msginfo;
+
+               if (msginfo->msgnum == msginfo_list->msgnum &&
+                   g_strcasecmp(msginfo->folder->path, msginfo_list->folder->path) == 0)
+                       messageview_update(msgview_list);
+       }
+
+}
+
+/* 
+ * \brief update messageview with currently selected message in summaryview
+ *
+ * \param pointer to MessageView
+ */    
+static void messageview_update(MessageView *msgview)
+{
+       SummaryView *summaryview = (SummaryView*)msgview->mainwin->summaryview;
+
+       g_return_if_fail(summaryview != NULL);
+       
+       if (summaryview->selected) {
+               GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
+               MsgInfo *msginfo = gtk_ctree_node_get_row_data(ctree, 
+                                                     summaryview->selected);
+               g_return_if_fail(msginfo != NULL);
+
+               messageview_show(msgview, msginfo, 
+                                msgview->all_headers);
+       } 
+       
+       /*
+       else {
+               toolbar_destroy(msgview->toolbar);
+               gtk_widget_destroy(msgview->window);
+       }       
+       */
+}
+
 void messageview_quote_color_set(void)
 {
 }
@@ -826,9 +942,58 @@ static PrefsAccount *select_account_from_list(GList *ac_list)
        return account_find_from_id(account_id);
 }
 
+
+/* 
+ * \brief return selected messageview text used by composing 
+ *       to reply to selected text only
+ *
+ * \param  pointer to Messageview 
+ *
+ * \return pointer to text (needs to be free'd by calling func)
+ */
+gchar *messageview_get_selection(MessageView *msgview)
+{
+       gchar *text = NULL;
+       
+       g_return_val_if_fail(msgview != NULL, NULL);
+
+       text = gtkut_editable_get_selection
+               (GTK_EDITABLE(msgview->textview->text));
+       
+       if (!text && msgview->type == MVIEW_MIME
+           && msgview->mimeview->type == MIMEVIEW_TEXT
+           && msgview->mimeview->textview
+           && !msgview->mimeview->textview->default_text) {
+               text = gtkut_editable_get_selection 
+                       (GTK_EDITABLE(msgview->mimeview->textview->text));   
+       }
+
+       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)
 {
-       toolbar_menu_reply(TOOLBAR_MSGVIEW, msgview, action);
+       GSList *msginfo_list = NULL;
+       gchar *body;
+       MsgInfo *msginfo;
+
+       g_return_if_fail(msgview != NULL);
+
+       msginfo = (MsgInfo*)msgview->msginfo;
+       g_return_if_fail(msginfo != NULL);
+
+       msginfo_list = g_slist_append(msginfo_list, msginfo);
+       g_return_if_fail(msginfo_list);
+
+       body =  messageview_get_selection(msgview);
+       compose_reply_mode((ComposeMode)action, msginfo_list, body);
+       g_free(body);
+       g_slist_free(msginfo_list);
 }
 
 static void messageview_close_cb(gpointer data, guint action, GtkWidget *widget)
index dbdfa84eb9d0cb47d6dfa5d9069abffea6fd8c3e..8cdfae20df831118621b011da947ba760ed7f472 100644 (file)
@@ -88,6 +88,7 @@ void messageview_set_position                 (MessageView    *messageview,
                                                 gint            pos);
 void messageview_toggle_view_real              (MessageView    *messageview);
 GList *messageview_get_msgview_list            (void);
+void messageview_delete                                (MessageView    *messageview);
 gboolean messageview_search_string             (MessageView    *messageview,
                                                 const gchar    *str,
                                                 gboolean        case_sens);
@@ -97,7 +98,8 @@ gboolean messageview_search_string_backward   (MessageView    *messageview,
 
 gboolean messageview_is_visible                        (MessageView    *messageview);
 
-void messageview_add_toolbar                   (MessageView *msgview,
-                                                GtkWidget *vbox);
+void messageview_add_toolbar                   (MessageView    *msgview,
+                                                GtkWidget      *vbox);
 void messageview_reflect_prefs_pixmap_theme    (void);
+gchar *messageview_get_selection               (MessageView    *msgview);
 #endif /* __MESSAGEVIEW_H__ */
index e2611902dac74d83ffc244dc28c1a53da6ecd6bd..ef80a15ad7e8fa73a0ae0f9d8317cbba10429bf6 100644 (file)
@@ -4751,10 +4751,50 @@ static void summary_col_resized(GtkCList *clist, gint column, gint width,
        prefs_common.summary_col_size[type] = width;
 }
 
+
+/*
+ * \brief get List of msginfo selected in SummaryView
+ *
+ * \param summaryview
+ *
+ * \return GSList holding MsgInfo
+ */
+GSList *summary_get_selection(SummaryView *summaryview)
+{
+       GList *sel = NULL;
+       GSList *msginfo_list = NULL;
+       
+       g_return_val_if_fail(summaryview != NULL, NULL);
+
+       sel = GTK_CLIST(summaryview->ctree)->selection;
+
+       g_return_val_if_fail(sel != NULL, NULL);
+
+       for ( ; sel != NULL; sel = sel->next)
+               msginfo_list = 
+                       g_slist_append(msginfo_list, 
+                                      gtk_ctree_node_get_row_data(GTK_CTREE(summaryview->ctree),
+                                                                  GTK_CTREE_NODE(sel->data)));
+       return msginfo_list;
+}
+
 static void summary_reply_cb(SummaryView *summaryview, guint action,
                             GtkWidget *widget)
 {
-       toolbar_menu_reply(TOOLBAR_MAIN, summaryview->mainwin, action);
+       MessageView *msgview = (MessageView*)summaryview->messageview;
+       GSList *msginfo_list;
+       gchar *body;
+
+       g_return_if_fail(msgview != NULL);
+
+       msginfo_list = summary_get_selection(summaryview);
+       g_return_if_fail(msginfo_list != NULL);
+
+       body = messageview_get_selection(msgview);
+
+       compose_reply_mode((ComposeMode)action, msginfo_list, body);
+       g_free(body);
+       g_slist_free(msginfo_list);
 }
 
 static void summary_execute_cb(SummaryView *summaryview, guint action,
index fd41e1b8daad386b7b84cc941bb78e1867c616e2..d2c28801422fa35c403aebe9f3b39fc57e7d8ce5 100644 (file)
@@ -241,6 +241,7 @@ void summary_move_selected_to         (SummaryView          *summaryview,
 void summary_move_to             (SummaryView          *summaryview);
 void summary_copy_selected_to    (SummaryView          *summaryview,
                                   FolderItem           *to_folder);
+GSList *summary_get_selection    (SummaryView          *summaryview);
 void summary_copy_to             (SummaryView          *summaryview);
 void summary_save_as             (SummaryView          *summaryview);
 void summary_print               (SummaryView          *summaryview);