Fix bold font not being derived from normal font, but from system font
[claws.git] / src / folderview.c
index 44ec9cfe9f82f4bb151a0cde150bd6a0c7b977ba..4f0be44889a37043d934c002cfc326f4d7b82ea2 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2012 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2013 Hiroyuki Yamamoto and the Claws Mail team
  *
  * 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
@@ -470,15 +470,8 @@ static GtkWidget *folderview_ctree_create(FolderView *folderview)
        g_signal_connect(G_OBJECT(ctree), "button_press_event",
                         G_CALLBACK(folderview_button_pressed),
                         folderview);
-#ifndef MAEMO
        g_signal_connect(G_OBJECT(ctree), "popup-menu",
                         G_CALLBACK(folderview_popup_menu), folderview);
-#else
-       gtk_widget_tap_and_hold_setup(GTK_WIDGET(ctree), NULL, NULL,
-                       GTK_TAP_AND_HOLD_NONE | GTK_TAP_AND_HOLD_NO_INTERNALS);
-       g_signal_connect(G_OBJECT(ctree), "tap-and-hold",
-                        G_CALLBACK(folderview_popup_menu), folderview);
-#endif
        g_signal_connect(G_OBJECT(ctree), "button_release_event",
                         G_CALLBACK(folderview_button_released),
                         folderview);
@@ -534,6 +527,23 @@ void folderview_set_column_order(FolderView *folderview)
        FolderItem *sel_item = NULL, *op_item = NULL;
        GtkWidget *scrolledwin = folderview->scrolledwin;
 
+       if (folderview->drag_timer_id != 0) {
+               g_source_remove(folderview->drag_timer_id);
+               folderview->drag_timer_id = 0;
+       }
+       if (folderview->deferred_refresh_id != 0) {
+               g_source_remove(folderview->deferred_refresh_id);
+               folderview->deferred_refresh_id = 0;
+       }
+       if (folderview->scroll_timeout_id != 0) {
+               g_source_remove(folderview->scroll_timeout_id);
+               folderview->scroll_timeout_id = 0;
+       }
+       if (folderview->postpone_select_id != 0) {
+               g_source_remove(folderview->postpone_select_id);
+               folderview->postpone_select_id = 0;
+       }
+
        if (folderview->selected)
                sel_item = gtk_cmctree_node_get_row_data(GTK_CMCTREE(ctree), folderview->selected);
        if (folderview->opened)
@@ -597,8 +607,12 @@ FolderView *folderview_create(void)
        
        folderview->target_list = gtk_target_list_new(folderview_drag_types, 2);
        folderview_list = g_list_append(folderview_list, folderview);
-       folderview->deferred_refresh_id = -1;
-       folderview->scroll_timeout_id = -1;
+
+       folderview->drag_timer_id       = 0;
+       folderview->deferred_refresh_id = 0;
+       folderview->scroll_timeout_id   = 0;
+       folderview->postpone_select_id  = 0;
+
        return folderview;
 }
 
@@ -667,14 +681,18 @@ void folderview_init(FolderView *folderview)
                gtkut_convert_int_to_gdk_color(prefs_common.color_new, &gdk_color);
                normal_color_style = gtk_style_copy(normal_style);
                normal_color_style->fg[GTK_STATE_NORMAL] = gdk_color;
-
-               gtk_widget_set_style(ctree, normal_style);
        }
 
        if (!bold_style) {
                gtkut_convert_int_to_gdk_color(prefs_common.color_new, &gdk_color);
                bold_style = gtk_style_copy(gtk_widget_get_style(ctree));
                if (prefs_common.derive_from_normal_font || !BOLD_FONT) {
+                       PangoFontDescription *font_desc;
+                       font_desc = pango_font_description_from_string(NORMAL_FONT);
+                       if (font_desc) {
+                               pango_font_description_free(bold_style->font_desc);
+                               bold_style->font_desc = font_desc;
+                       }
                        pango_font_description_set_weight
                                (bold_style->font_desc, PANGO_WEIGHT_BOLD);
                } else {
@@ -708,7 +726,7 @@ static gboolean folderview_defer_set(gpointer data)
        debug_print("doing deferred folderview_set now\n");
        folderview_set(folderview);
 
-       folderview->deferred_refresh_id = -1;
+       folderview->deferred_refresh_id = 0;
        return FALSE;
 }
 
@@ -722,7 +740,7 @@ void folderview_set(FolderView *folderview)
                return;
 
        if (mainwin->lock_count) {
-               if (folderview->deferred_refresh_id == -1)
+               if (folderview->deferred_refresh_id == 0)
                        folderview->deferred_refresh_id = 
                                g_timeout_add(500, folderview_defer_set, folderview);
                debug_print("deferred folderview_set\n");
@@ -853,8 +871,9 @@ void folderview_unselect(FolderView *folderview)
        folderview->selected = folderview->opened = NULL;
 }
 
-static GtkCMCTreeNode *folderview_find_next_marked(GtkCMCTree *ctree,
-                                                GtkCMCTreeNode *node)
+static GtkCMCTreeNode *folderview_find_next_with_flag(GtkCMCTree *ctree,
+                                                     GtkCMCTreeNode *node,
+                                                     MsgPermFlags flag)
 {
        FolderItem *item;
 
@@ -865,73 +884,51 @@ static GtkCMCTreeNode *folderview_find_next_marked(GtkCMCTree *ctree,
 
        for (; node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
                item = gtk_cmctree_node_get_row_data(ctree, node);
-               if (item && item->marked_msgs > 0 && item->stype != F_TRASH)
-                       return node;
+               if (item->stype == F_TRASH || item->stype == F_DRAFT)
+                       continue;
+               switch (flag) {
+               case MSG_UNREAD:
+                       if(item->unread_msgs > 0)
+                               return node;
+                       break;
+               case MSG_NEW:
+                       if(item->new_msgs > 0)
+                               return node;
+                       break;
+               case MSG_MARKED:
+                       if(item->marked_msgs > 0)
+                               return node;
+                       break;
+               }
        }
 
        return NULL;
 }
 
-void folderview_select_next_marked(FolderView *folderview)
+void folderview_select_next_with_flag(FolderView *folderview,
+                                     MsgPermFlags flag,
+                                     gboolean force_open)
 {
        GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
        GtkCMCTreeNode *node = NULL;
        EntryAction last_summary_select_prio = prefs_common.summary_select_prio[0];
        gboolean last_open = prefs_common.always_show_msg;
        
-       prefs_common.summary_select_prio[0] = ACTION_MARKED;
-       prefs_common.always_show_msg = OPENMSG_ALWAYS;
-
-       if ((node = folderview_find_next_marked(ctree, folderview->opened))
-           != NULL) {
-               folderview_select_node(folderview, node);
-               goto out;
-       }
-
-       if (!folderview->opened ||
-           folderview->opened == GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list)) {
-               goto out;
-       }
-       /* search again from the first node */
-       if ((node = folderview_find_next_marked(ctree, NULL)) != NULL)
-               folderview_select_node(folderview, node);
-
-out:
-       prefs_common.summary_select_prio[0] = last_summary_select_prio;
-       prefs_common.always_show_msg = last_open;
-}
-
-static GtkCMCTreeNode *folderview_find_next_unread(GtkCMCTree *ctree,
-                                                GtkCMCTreeNode *node)
-{
-       FolderItem *item;
-
-       if (node)
-               node = gtkut_ctree_node_next(ctree, node);
-       else
-               node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list);
-
-       for (; node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
-               item = gtk_cmctree_node_get_row_data(ctree, node);
-               if (item && item->unread_msgs > 0 && item->stype != F_TRASH)
-                       return node;
+       switch (flag) {
+       case MSG_UNREAD:
+               prefs_common.summary_select_prio[0] = ACTION_UNREAD;
+               break;
+       case MSG_NEW:
+               prefs_common.summary_select_prio[0] = ACTION_NEW;
+               break;
+       case MSG_MARKED:
+               prefs_common.summary_select_prio[0] = ACTION_MARKED;
+               break;
        }
-
-       return NULL;
-}
-
-void folderview_select_next_unread(FolderView *folderview, gboolean force_open)
-{
-       GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
-       GtkCMCTreeNode *node = NULL;
-       EntryAction last_summary_select_prio = prefs_common.summary_select_prio[0];
-       gboolean last_open = prefs_common.always_show_msg;
-       
-       prefs_common.summary_select_prio[0] = ACTION_UNREAD;
        prefs_common.always_show_msg = force_open ? OPENMSG_ALWAYS : last_open;
 
-       if ((node = folderview_find_next_unread(ctree, folderview->opened))
-           != NULL) {
+       node = folderview_find_next_with_flag(ctree, folderview->opened, flag);
+       if (node != NULL) {
                folderview_select_node(folderview, node);
                goto out;
        }
@@ -940,56 +937,10 @@ void folderview_select_next_unread(FolderView *folderview, gboolean force_open)
            folderview->opened == GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list)) {
                goto out;
        }
-       /* search again from the first node */
-       if ((node = folderview_find_next_unread(ctree, NULL)) != NULL)
-               folderview_select_node(folderview, node);
-
-out:
-       prefs_common.summary_select_prio[0] = last_summary_select_prio;
-       prefs_common.always_show_msg = last_open;
-}
 
-static GtkCMCTreeNode *folderview_find_next_new(GtkCMCTree *ctree,
-                                                GtkCMCTreeNode *node)
-{
-       FolderItem *item;
-
-       if (node)
-               node = gtkut_ctree_node_next(ctree, node);
-       else
-               node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list);
-
-       for (; node != NULL; node = gtkut_ctree_node_next(ctree, node)) {
-               item = gtk_cmctree_node_get_row_data(ctree, node);
-               if (item && item->new_msgs > 0 && item->stype != F_TRASH)
-                       return node;
-       }
-
-       return NULL;
-}
-
-void folderview_select_next_new(FolderView *folderview)
-{
-       GtkCMCTree *ctree = GTK_CMCTREE(folderview->ctree);
-       GtkCMCTreeNode *node = NULL;
-       EntryAction last_summary_select_prio = prefs_common.summary_select_prio[0];
-       gboolean last_open = prefs_common.always_show_msg;
-       
-       prefs_common.summary_select_prio[0] = ACTION_NEW;
-       prefs_common.always_show_msg = OPENMSG_ALWAYS;
-
-       if ((node = folderview_find_next_new(ctree, folderview->opened))
-           != NULL) {
-               folderview_select_node(folderview, node);
-               goto out;
-       }
-
-       if (!folderview->opened ||
-           folderview->opened == GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list)) {
-               goto out;
-       }
        /* search again from the first node */
-       if ((node = folderview_find_next_new(ctree, NULL)) != NULL)
+       node = folderview_find_next_with_flag(ctree, NULL, flag);
+       if (node != NULL)
                folderview_select_node(folderview, node);
 
 out:
@@ -1018,11 +969,11 @@ static void folderview_set_folders(FolderView *folderview)
 static gchar *get_scan_str(FolderItem *item)
 {
        if (item->path)
-               return g_strdup_printf(_("Scanning folder %s%c%s ..."),
+               return g_strdup_printf(_("Scanning folder %s%c%s..."),
                                      item->folder->name, G_DIR_SEPARATOR,
                                      item->path);
        else
-               return g_strdup_printf(_("Scanning folder %s ..."),
+               return g_strdup_printf(_("Scanning folder %s..."),
                                      item->folder->name);      
 }
 static void folderview_scan_tree_func(Folder *folder, FolderItem *item,
@@ -1093,47 +1044,6 @@ void folderview_rescan_tree(Folder *folder, gboolean rebuild)
        inc_unlock();
 }
 
-void folderview_fast_rescan_tree(Folder *folder)
-{
-       GtkWidget *window;
-       MainWindow *mainwin = mainwindow_get_mainwindow();
-       FolderView *folderview = NULL;
-       GtkAdjustment *pos = NULL;
-       gint height = 0;
-
-       cm_return_if_fail(folder != NULL);
-
-       if (!folder->klass->scan_tree) return;
-
-       inc_lock();
-
-       window = label_window_create(_("Scanning folder tree..."));
-
-       if (mainwin)
-               folderview = mainwin->folderview;
-       
-       if (folderview) {
-               pos = gtk_scrolled_window_get_vadjustment(
-                                       GTK_SCROLLED_WINDOW(folderview->scrolledwin));
-               height = gtk_adjustment_get_value(pos);
-       }
-
-       folder_set_ui_func(folder, folderview_scan_tree_func, NULL);
-       folder_fast_scan_tree(folder);
-       folder_set_ui_func(folder, NULL, NULL);
-
-       folderview_set_all();
-
-       if (folderview) {
-               pos = gtk_scrolled_window_get_vadjustment(
-                                       GTK_SCROLLED_WINDOW(folderview->scrolledwin));
-               gtk_adjustment_set_value(pos, height);
-               gtk_adjustment_changed(pos);
-       }
-       label_window_destroy(window);
-       inc_unlock();
-}
-
 /** folderview_check_new()
  *  Scan and update the folder and return the 
  *  count the number of new messages since last check. 
@@ -1606,7 +1516,6 @@ static void folderview_update_node(FolderView *folderview, GtkCMCTreeNode *node)
        }
 
        if (folder_has_parent_of_type(item, F_OUTBOX) ||
-           folder_has_parent_of_type(item, F_DRAFT) ||
            folder_has_parent_of_type(item, F_TRASH)) {
                use_bold = use_color = FALSE;
        } else if (folder_has_parent_of_type(item, F_QUEUE)) {
@@ -1621,6 +1530,7 @@ static void folderview_update_node(FolderView *folderview, GtkCMCTreeNode *node)
                                break;
                        }
                }
+               procmsg_msg_list_free(list);
        } else {
                /* if unread messages exist, print with bold font */
                use_bold = (item->unread_msgs > 0|| item->new_msgs > 0) 
@@ -2038,7 +1948,7 @@ static gboolean folderview_key_pressed(GtkWidget *widget, GdkEventKey *event,
                        if (folderview->opened == folderview->selected &&
                            (!folderview->summaryview->folder_item ||
                             folderview->summaryview->folder_item->total_msgs == 0))
-                               folderview_select_next_unread(folderview, TRUE);
+                               folderview_select_next_with_flag(folderview, MSG_UNREAD, TRUE);
                        else
                                folderview_select_node(folderview,
                                                       folderview->selected);
@@ -2063,6 +1973,8 @@ static gboolean postpone_select(void *data)
 {
        PostponedSelectData *psdata = (PostponedSelectData *)data;
        debug_print("trying again\n");
+
+       psdata->folderview->postpone_select_id = 0;
        psdata->folderview->open_folder = TRUE;
        main_window_cursor_normal(psdata->folderview->mainwin);
        STATUSBAR_POP(psdata->folderview->mainwin);
@@ -2209,7 +2121,9 @@ static void folderview_selected(GtkCMCTree *ctree, GtkCMCTreeNode *row,
                        item->path ? item->path:item->name);
                folderview->open_folder = FALSE;
                can_select = TRUE;
-               g_timeout_add(500, postpone_select, data);
+               if (folderview->postpone_select_id != 0)
+                       g_source_remove(folderview->postpone_select_id);
+               folderview->postpone_select_id = g_timeout_add(500, postpone_select, data);
                END_TIMING();
                return;
        }
@@ -2482,8 +2396,8 @@ void folderview_move_folder(FolderView *folderview, FolderItem *from_folder,
        cm_return_if_fail(to_folder != NULL);
 
        if (prefs_common.warn_dnd) {
-               buf = g_strdup_printf(copy ? _("Do you really want to copy folder '%s' in '%s' ?"):
-                                            _("Do you really want to make folder '%s' a subfolder of '%s' ?"), 
+               buf = g_strdup_printf(copy ? _("Do you really want to copy folder '%s' in '%s'?"):
+                                            _("Do you really want to make folder '%s' a subfolder of '%s'?"), 
                                        from_folder->name, to_folder->name);
                status = alertpanel_full(copy ? _("Copy folder"):_("Move folder"), buf,
                                         GTK_STOCK_NO, GTK_STOCK_YES, NULL, TRUE,
@@ -2688,9 +2602,9 @@ void folderview_reflect_prefs(void)
 
 static void drag_state_stop(FolderView *folderview)
 {
-       if (folderview->drag_timer)
-               g_source_remove(folderview->drag_timer);
-       folderview->drag_timer = 0;
+       if (folderview->drag_timer_id)
+               g_source_remove(folderview->drag_timer_id);
+       folderview->drag_timer_id = 0;
        folderview->drag_node = NULL;
 }
 
@@ -2705,7 +2619,7 @@ static gboolean folderview_defer_expand(FolderView *folderview)
                }
        }
        folderview->drag_item  = NULL;
-       folderview->drag_timer = 0;
+       folderview->drag_timer_id = 0;
        return FALSE;
 }
 
@@ -2716,7 +2630,7 @@ static void drag_state_start(FolderView *folderview, GtkCMCTreeNode *node, Folde
         * we need to call drag_state_stop() */
        drag_state_stop(folderview);
        /* request expansion */
-       if (0 != (folderview->drag_timer = g_timeout_add
+       if (0 != (folderview->drag_timer_id = g_timeout_add
                        (prefs_common.hover_timeout, 
                         (GSourceFunc)folderview_defer_expand,
                         folderview))) {
@@ -2801,6 +2715,8 @@ static gboolean folderview_update_folder(gpointer source, gpointer userdata)
                        if (folderview->opened == node)
                                folderview->opened = NULL;
                }
+       } else if (hookdata->update_flags & FOLDER_MOVE_FOLDERITEM) {
+               /* do nothing, it's done by the ADD and REMOVE) */
        } else if (hookdata->update_flags & (FOLDER_TREE_CHANGED | FOLDER_ADD_FOLDER | FOLDER_REMOVE_FOLDER))
                folderview_set(folderview);
 
@@ -2817,7 +2733,7 @@ static gboolean folderview_dnd_scroll_cb(gpointer data)
                (int)gtk_adjustment_get_page_size(pos);
 
        if (folderview->scroll_value == 0) {
-               folderview->scroll_timeout_id = -1;
+               folderview->scroll_timeout_id = 0;
                return FALSE;
        }
 
@@ -2863,7 +2779,7 @@ static gboolean folderview_drag_motion_cb(GtkWidget      *widget,
                } else {
                        folderview->scroll_value = 0;
                }
-               if (folderview->scroll_value != 0 && folderview->scroll_timeout_id == -1) {
+               if (folderview->scroll_value != 0 && folderview->scroll_timeout_id == 0) {
                        folderview->scroll_timeout_id = 
                                g_timeout_add(30, folderview_dnd_scroll_cb,
                                              folderview);