~ubuntu-branches/ubuntu/feisty/sylpheed-claws/feisty-backports

« back to all changes in this revision

Viewing changes to src/gtk/quicksearch.c

  • Committer: Bazaar Package Importer
  • Author(s): Ricardo Mones
  • Date: 2005-03-24 17:19:43 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20050324171943-98swdzuq83orcp9q
Tags: 1.0.4-1
* New upstream release.
- Fixes security bug (buffer overflow) (Closes: #301200)

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
#include "matcher.h"
35
35
#include "matcher_parser.h"
36
36
#include "quicksearch.h"
 
37
#include "folderview.h"
 
38
#include "folder.h"
37
39
 
38
40
struct _QuickSearch
39
41
{
50
52
        QuickSearchExecuteCallback       callback;
51
53
        gpointer                         callback_data;
52
54
        gboolean                         running;
 
55
        FolderItem                      *root_folder_item;
53
56
};
54
57
 
55
58
void quicksearch_set_running(QuickSearch *quicksearch, gboolean run);
 
59
static void quicksearch_set_active(QuickSearch *quicksearch, gboolean active);
 
60
static void quicksearch_reset_folder_items(QuickSearch *quicksearch, FolderItem *folder_item);
56
61
 
57
62
static void prepare_matcher(QuickSearch *quicksearch)
58
63
{
64
69
        }
65
70
 
66
71
        if (search_string == NULL || search_string[0] == '\0') {
67
 
                quicksearch->active = FALSE;
 
72
                quicksearch_set_active(quicksearch, FALSE);
68
73
                return;
69
74
        }
70
75
 
77
82
                        g_free(newstr);
78
83
                } else {
79
84
                        quicksearch->matcher_list = NULL;
80
 
                        quicksearch->active = FALSE;
 
85
                        quicksearch_set_active(quicksearch, FALSE);
81
86
 
82
87
                        return;
83
88
                }
87
92
                quicksearch->search_string = g_strdup(search_string);
88
93
        }
89
94
 
90
 
        quicksearch->active = TRUE;
 
95
        quicksearch_set_active(quicksearch, TRUE);
91
96
}
92
97
 
93
98
static gint searchbar_pressed(GtkWidget *widget, GdkEventKey *event,
123
128
        return TRUE;            
124
129
}
125
130
 
126
 
static void searchtype_changed(GtkMenuItem *widget, gpointer data)
 
131
static gboolean searchtype_changed(GtkMenuItem *widget, gpointer data)
127
132
{
128
133
        QuickSearch *quicksearch = (QuickSearch *)data;
129
134
 
145
150
        if (quicksearch->callback != NULL)
146
151
                quicksearch->callback(quicksearch, quicksearch->callback_data);
147
152
        quicksearch_set_running(quicksearch, FALSE);
 
153
        return TRUE;
 
154
}
 
155
 
 
156
static gboolean searchtype_recursive_changed(GtkMenuItem *widget, gpointer data)
 
157
{
 
158
        QuickSearch *quicksearch = (QuickSearch *)data;
 
159
        gboolean checked = GTK_CHECK_MENU_ITEM(widget)->active;
 
160
        
 
161
        prefs_common.summary_quicksearch_recurse = checked; 
 
162
 
 
163
        /* reselect the search type */
 
164
        gtk_option_menu_set_history(GTK_OPTION_MENU(quicksearch->search_type_opt), 
 
165
                                    prefs_common.summary_quicksearch_type);
 
166
 
 
167
        prepare_matcher(quicksearch);
 
168
 
 
169
        quicksearch_set_running(quicksearch, TRUE);
 
170
        if (quicksearch->callback != NULL)
 
171
                quicksearch->callback(quicksearch, quicksearch->callback_data);
 
172
        quicksearch_set_running(quicksearch, FALSE);
 
173
        return TRUE;
148
174
}
149
175
 
150
176
/*
272
298
                           GTK_SIGNAL_FUNC(searchtype_changed),
273
299
                           quicksearch);
274
300
 
 
301
        MENUITEM_ADD (search_type, menuitem, NULL, NULL);
 
302
        
 
303
        menuitem = gtk_check_menu_item_new_with_label(_("Recursive"));
 
304
        gtk_widget_show(menuitem);
 
305
        gtk_menu_shell_append(GTK_MENU_SHELL(search_type), menuitem);
 
306
        
 
307
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
 
308
                                        prefs_common.summary_quicksearch_recurse);
 
309
        
 
310
        gtk_signal_connect(GTK_OBJECT(menuitem), "activate",
 
311
                         GTK_SIGNAL_FUNC(searchtype_recursive_changed),
 
312
                         quicksearch);
 
313
 
275
314
        gtk_option_menu_set_menu(GTK_OPTION_MENU(search_type_opt), search_type);
276
315
        
277
316
        gtk_option_menu_set_history(GTK_OPTION_MENU(search_type_opt), prefs_common.summary_quicksearch_type);
361
400
 
362
401
void quicksearch_hide(QuickSearch *quicksearch)
363
402
{
364
 
        quicksearch->active = FALSE;
 
403
        quicksearch_set_active(quicksearch, FALSE);
365
404
        gtk_widget_hide(quicksearch->hbox_search);
366
405
}
367
406
 
387
426
        return quicksearch->active;
388
427
}
389
428
 
 
429
static void quicksearch_set_active(QuickSearch *quicksearch, gboolean active)
 
430
{
 
431
        quicksearch->active = active;
 
432
        if (!active) {
 
433
                quicksearch_reset_cur_folder_item(quicksearch);
 
434
        }
 
435
}
 
436
 
390
437
void quicksearch_set_execute_callback(QuickSearch *quicksearch,
391
438
                                      QuickSearchExecuteCallback callback,
392
439
                                      gpointer data)
419
466
                break;
420
467
        }
421
468
 
422
 
        if (prefs_common.summary_quicksearch_type != QUICK_SEARCH_EXTENDED && quicksearch->search_string &&
 
469
        if (prefs_common.summary_quicksearch_type != QUICK_SEARCH_EXTENDED && 
 
470
            quicksearch->search_string &&
423
471
            searched_header && strcasestr(searched_header, quicksearch->search_string) != NULL)
424
472
                return TRUE;
425
 
        else if ((quicksearch->matcher_list != NULL) && matcherlist_match(quicksearch->matcher_list, msginfo))
 
473
        else if ((quicksearch->matcher_list != NULL) && 
 
474
                 matcherlist_match(quicksearch->matcher_list, msginfo))
426
475
                return TRUE;
427
476
 
428
477
        return FALSE;
616
665
        return quicksearch->running;
617
666
}
618
667
 
 
668
 
 
669
static gboolean quicksearch_match_subfolder(QuickSearch *quicksearch, 
 
670
                                 FolderItem *src)
 
671
{
 
672
        GSList *msglist = folder_item_get_msg_list(src);
 
673
        GSList *cur;
 
674
        gboolean result = FALSE;
 
675
        
 
676
        for (cur = msglist; cur != NULL; cur = cur->next) {
 
677
                MsgInfo *msg = (MsgInfo *)cur->data;
 
678
                if (quicksearch_match(quicksearch, msg)) {
 
679
                        procmsg_msginfo_free(msg);
 
680
                        result = TRUE;
 
681
                        break;
 
682
                }
 
683
                procmsg_msginfo_free(msg);
 
684
        }
 
685
 
 
686
        g_slist_free(msglist);
 
687
        return result;
 
688
}
 
689
 
 
690
void quicksearch_search_subfolders(QuickSearch *quicksearch, 
 
691
                                   FolderView *folderview,
 
692
                                   FolderItem *folder_item)
 
693
{
 
694
        FolderItem *cur = NULL;
 
695
        GNode *node = folder_item->node->children;
 
696
        
 
697
        if (!prefs_common.summary_quicksearch_recurse)
 
698
                return;
 
699
 
 
700
        for (; node != NULL; node = node->next) {
 
701
                cur = FOLDER_ITEM(node->data);
 
702
                if (quicksearch_match_subfolder(quicksearch, cur)) {
 
703
                        folderview_update_search_icon(cur, TRUE);
 
704
                } else {
 
705
                        folderview_update_search_icon(cur, FALSE);
 
706
                }
 
707
                if (cur->node->children)
 
708
                        quicksearch_search_subfolders(quicksearch,
 
709
                                                      folderview,
 
710
                                                      cur);
 
711
        }
 
712
        quicksearch->root_folder_item = folder_item;
 
713
}
 
714
 
 
715
static void quicksearch_reset_folder_items(QuickSearch *quicksearch,
 
716
                                    FolderItem *folder_item)
 
717
{
 
718
        FolderItem *cur = NULL;
 
719
        GNode *node = folder_item->node->children;
 
720
        
 
721
        for (; node != NULL; node = node->next) {
 
722
                cur = FOLDER_ITEM(node->data);
 
723
                folderview_update_search_icon(cur, FALSE);
 
724
                if (cur->node->children)
 
725
                        quicksearch_reset_folder_items(quicksearch,
 
726
                                                       cur);
 
727
        }
 
728
}
 
729
 
 
730
void quicksearch_reset_cur_folder_item(QuickSearch *quicksearch)
 
731
{
 
732
        if (quicksearch->root_folder_item)
 
733
                quicksearch_reset_folder_items(quicksearch, 
 
734
                                               quicksearch->root_folder_item);
 
735
        
 
736
        quicksearch->root_folder_item = NULL;
 
737
}