Statistics
| Revision:

root / src / foldersel.c @ 1124

History | View | Annotate | Download (17.6 kB)

1
/*
2
 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3
 * Copyright (C) 1999-2006 Hiroyuki Yamamoto
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
 */
19
20
#include "defs.h"
21
22
#include <glib.h>
23
#include <glib/gi18n.h>
24
#include <gdk/gdkkeysyms.h>
25
#include <gtk/gtkmain.h>
26
#include <gtk/gtkwidget.h>
27
#include <gtk/gtktreestore.h>
28
#include <gtk/gtktreeview.h>
29
#include <gtk/gtktreeselection.h>
30
#include <gtk/gtkcellrendererpixbuf.h>
31
#include <gtk/gtkcellrenderertext.h>
32
#include <gtk/gtkwindow.h>
33
#include <gtk/gtkvbox.h>
34
#include <gtk/gtkscrolledwindow.h>
35
#include <gtk/gtkentry.h>
36
#include <gtk/gtkhbbox.h>
37
#include <gtk/gtksignal.h>
38
#include <gtk/gtkstock.h>
39
#include <stdio.h>
40
#include <unistd.h>
41
#include <string.h>
42
#include <sys/stat.h>
43
#include <sys/types.h>
44
#include <fcntl.h>
45
#include <errno.h>
46
47
#include "main.h"
48
#include "utils.h"
49
#include "gtkutils.h"
50
#include "stock_pixmap.h"
51
#include "foldersel.h"
52
#include "alertpanel.h"
53
#include "manage_window.h"
54
#include "folderview.h"
55
#include "inputdialog.h"
56
#include "folder.h"
57
#include "prefs_common.h"
58
59
enum {
60
        FOLDERSEL_FOLDERNAME,
61
        FOLDERSEL_FOLDERITEM,
62
        FOLDERSEL_PIXBUF,
63
        FOLDERSEL_PIXBUF_OPEN,
64
        FOLDERSEL_FOREGROUND,
65
        FOLDERSEL_BOLD,
66
        N_FOLDERSEL_COLUMNS
67
};
68
69
typedef struct _FolderItemSearch        FolderItemSearch;
70
71
struct _FolderItemSearch
72
{
73
        FolderItem *item;
74
        GtkTreePath *path;
75
        GtkTreeIter iter;
76
};
77
78
static GdkPixbuf *folder_pixbuf;
79
static GdkPixbuf *folderopen_pixbuf;
80
static GdkPixbuf *foldernoselect_pixbuf;
81
82
static GtkWidget *window;
83
static GtkWidget *treeview;
84
static GtkWidget *entry;
85
static GtkWidget *confirm_area;
86
static GtkWidget *ok_button;
87
static GtkWidget *cancel_button;
88
static GtkWidget *new_button;
89
90
static GtkTreeStore *tree_store;
91
92
static FolderItem *folder_item;
93
static FolderItem *selected_item;
94
95
FolderSelectionType sel_type;
96
97
static gboolean cancelled;
98
static gboolean finished;
99
100
static void foldersel_create                (void);
101
static void foldersel_init                (void);
102
103
static void foldersel_append_item        (GtkTreeStore        *store,
104
                                         FolderItem        *item,
105
                                         GtkTreeIter        *iter,
106
                                         GtkTreeIter        *parent);
107
108
static void foldersel_set_tree                (Folder                *cur_folder);
109
110
static gboolean foldersel_selected        (GtkTreeSelection *selection,
111
                                         GtkTreeModel          *model,
112
                                         GtkTreePath          *path,
113
                                         gboolean           currently_selected,
114
                                         gpointer           data);
115
116
static void foldersel_ok                (GtkButton        *button,
117
                                         gpointer         data);
118
static void foldersel_cancel                (GtkButton        *button,
119
                                         gpointer         data);
120
static void foldersel_new_folder        (GtkButton        *button,
121
                                         gpointer         data);
122
123
static void foldersel_entry_activated        (GtkEntry        *entry,
124
                                         gpointer         data);
125
126
static void foldersel_tree_activated        (GtkTreeView                *treeview,
127
                                         GtkTreePath                *path,
128
                                         GtkTreeViewColumn        *column,
129
                                         gpointer                 data);
130
131
static gint delete_event                (GtkWidget        *widget,
132
                                         GdkEventAny        *event,
133
                                         gpointer         data);
134
static gboolean key_pressed                (GtkWidget        *widget,
135
                                         GdkEventKey        *event,
136
                                         gpointer         data);
137
138
static gint foldersel_folder_name_compare        (GtkTreeModel        *model,
139
                                                 GtkTreeIter        *a,
140
                                                 GtkTreeIter        *b,
141
                                                 gpointer         context);
142
143
static gboolean tree_view_folder_item_func        (GtkTreeModel          *model,
144
                                                 GtkTreePath          *path,
145
                                                 GtkTreeIter          *iter,
146
                                                 FolderItemSearch *data);
147
148
FolderItem *foldersel_folder_sel(Folder *cur_folder, FolderSelectionType type,
149
                                 const gchar *default_folder)
150
{
151
        selected_item = NULL;
152
        sel_type = type;
153
154
        if (!window) {
155
                foldersel_create();
156
                foldersel_init();
157
        }
158
159
        foldersel_set_tree(cur_folder);
160
161
        /* select current */
162
        if (folder_item) {
163
                FolderItemSearch fis;
164
165
                fis.item = folder_item;
166
                fis.path = NULL;
167
168
                /* find matching model entry */
169
                gtk_tree_model_foreach
170
                        (GTK_TREE_MODEL(tree_store),
171
                         (GtkTreeModelForeachFunc)tree_view_folder_item_func,
172
                         &fis);
173
174
                if (fis.path) {
175
                        GtkTreeSelection *selection;
176
177
                        selection = gtk_tree_view_get_selection
178
                                (GTK_TREE_VIEW(treeview));
179
                        gtk_tree_selection_select_iter(selection, &fis.iter);
180
                        gtk_tree_view_set_cursor(GTK_TREE_VIEW(treeview),
181
                                                 fis.path, NULL, FALSE);
182
                        gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(treeview),
183
                                                     fis.path,
184
                                                     NULL, TRUE, 0.5, 0.0);
185
                        gtk_tree_path_free(fis.path);
186
                } else
187
                        gtk_tree_view_scroll_to_point
188
                                (GTK_TREE_VIEW(treeview), 0, 0);
189
        } else
190
                gtk_tree_view_scroll_to_point(GTK_TREE_VIEW(treeview), 0, 0);
191
192
        gtkut_box_set_reverse_order(GTK_BOX(confirm_area),
193
                                    !prefs_common.comply_gnome_hig);
194
        gtk_widget_grab_focus(ok_button);
195
        gtk_widget_grab_focus(treeview);
196
197
        manage_window_set_transient(GTK_WINDOW(window));
198
        gtk_widget_show(window);
199
200
        cancelled = finished = FALSE;
201
202
        while (finished == FALSE)
203
                gtk_main_iteration();
204
205
        gtk_widget_hide(window);
206
        gtk_entry_set_text(GTK_ENTRY(entry), "");
207
        gtk_tree_store_clear(tree_store);
208
209
        if (cancelled || !selected_item)
210
                return NULL;
211
212
        if (type == FOLDER_SEL_ALL || type == FOLDER_SEL_MOVE_FOLDER ||
213
            (selected_item->path && !selected_item->no_select)) {
214
                folder_item = selected_item;
215
                return folder_item;
216
        }
217
218
        return NULL;
219
}
220
221
static void foldersel_create(void)
222
{
223
        GtkWidget *vbox;
224
        GtkWidget *scrolledwin;
225
        GtkTreeViewColumn *column;
226
        GtkCellRenderer *renderer;
227
        GtkTreeSelection *selection;
228
229
        window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
230
        gtk_window_set_title(GTK_WINDOW(window), _("Select folder"));
231
        gtk_container_set_border_width(GTK_CONTAINER(window), 4);
232
        gtk_window_set_position(GTK_WINDOW(window),
233
                                GTK_WIN_POS_CENTER_ON_PARENT);
234
        gtk_window_set_modal(GTK_WINDOW(window), TRUE);
235
        gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE);
236
        gtk_window_set_wmclass
237
                (GTK_WINDOW(window), "folder_selection", "Sylpheed");
238
        gtk_widget_realize(window);
239
        g_signal_connect(G_OBJECT(window), "delete_event",
240
                         G_CALLBACK(delete_event), NULL);
241
        g_signal_connect(G_OBJECT(window), "key_press_event",
242
                         G_CALLBACK(key_pressed), NULL);
243
        MANAGE_WINDOW_SIGNALS_CONNECT(window);
244
245
        vbox = gtk_vbox_new(FALSE, 4);
246
        gtk_container_add(GTK_CONTAINER(window), vbox);
247
248
        scrolledwin = gtk_scrolled_window_new(NULL, NULL);
249
        gtk_widget_set_size_request(scrolledwin, 300, 360);
250
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
251
                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
252
        gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin),
253
                                            GTK_SHADOW_IN);
254
        gtk_box_pack_start(GTK_BOX(vbox), scrolledwin, TRUE, TRUE, 0);
255
256
        tree_store = gtk_tree_store_new(N_FOLDERSEL_COLUMNS,
257
                                        G_TYPE_STRING,
258
                                        G_TYPE_POINTER,
259
                                        GDK_TYPE_PIXBUF,
260
                                        GDK_TYPE_PIXBUF,
261
                                        GDK_TYPE_COLOR,
262
                                        G_TYPE_INT);
263
        gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(tree_store),
264
                                        FOLDERSEL_FOLDERNAME,
265
                                        foldersel_folder_name_compare,
266
                                        NULL, NULL);
267
268
        treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(tree_store));
269
        g_object_unref(G_OBJECT(tree_store));
270
        gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
271
        gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
272
        gtk_tree_view_set_search_column(GTK_TREE_VIEW(treeview),
273
                                        FOLDERSEL_FOLDERNAME);
274
275
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
276
        gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
277
        gtk_tree_selection_set_select_function(selection, foldersel_selected,
278
                                               NULL, NULL);
279
280
        g_signal_connect(G_OBJECT(treeview), "row-activated",
281
                         G_CALLBACK(foldersel_tree_activated), NULL);
282
283
        gtk_container_add(GTK_CONTAINER(scrolledwin), treeview);
284
285
        column = gtk_tree_view_column_new();
286
        gtk_tree_view_column_set_spacing(column, 2);
287
        renderer = gtk_cell_renderer_pixbuf_new();
288
        gtk_tree_view_column_pack_start(column, renderer, FALSE);
289
        gtk_tree_view_column_set_attributes
290
                (column, renderer,
291
                 "pixbuf", FOLDERSEL_PIXBUF,
292
                 "pixbuf-expander-open", FOLDERSEL_PIXBUF_OPEN,
293
                 "pixbuf-expander-closed", FOLDERSEL_PIXBUF,
294
                 NULL);
295
296
        /* create text renderer */
297
        renderer = gtk_cell_renderer_text_new();
298
        gtk_tree_view_column_pack_start(column, renderer, TRUE);
299
        gtk_tree_view_column_set_attributes
300
                (column, renderer,
301
                 "text", FOLDERSEL_FOLDERNAME,
302
                 "foreground-gdk", FOLDERSEL_FOREGROUND,
303
                 "weight", FOLDERSEL_BOLD,
304
                 NULL);
305
        gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
306
307
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
308
309
        entry = gtk_entry_new();
310
        gtk_entry_set_editable(GTK_ENTRY(entry), FALSE);
311
        gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 0);
312
        g_signal_connect(G_OBJECT(entry), "activate",
313
                         G_CALLBACK(foldersel_entry_activated), NULL);
314
315
        gtkut_stock_button_set_create(&confirm_area,
316
                                      &ok_button,     GTK_STOCK_OK,
317
                                      &cancel_button, GTK_STOCK_CANCEL,
318
                                      &new_button,    GTK_STOCK_NEW);
319
320
        gtk_box_pack_end(GTK_BOX(vbox), confirm_area, FALSE, FALSE, 0);
321
        gtk_widget_grab_default(ok_button);
322
323
        g_signal_connect(G_OBJECT(ok_button), "clicked",
324
                         G_CALLBACK(foldersel_ok), NULL);
325
        g_signal_connect(G_OBJECT(cancel_button), "clicked",
326
                         G_CALLBACK(foldersel_cancel), NULL);
327
        g_signal_connect(G_OBJECT(new_button), "clicked",
328
                         G_CALLBACK(foldersel_new_folder), NULL);
329
330
        gtk_widget_show_all(vbox);
331
}
332
333
static void foldersel_init(void)
334
{
335
        stock_pixbuf_gdk(treeview, STOCK_PIXMAP_DIR_CLOSE,
336
                         &folder_pixbuf);
337
        stock_pixbuf_gdk(treeview, STOCK_PIXMAP_DIR_OPEN,
338
                         &folderopen_pixbuf);
339
        stock_pixbuf_gdk(treeview, STOCK_PIXMAP_DIR_NOSELECT,
340
                         &foldernoselect_pixbuf);
341
}
342
343
static void foldersel_append_item(GtkTreeStore *store, FolderItem *item,
344
                                  GtkTreeIter *iter, GtkTreeIter *parent)
345
{
346
        gchar *name;
347
        GdkPixbuf *pixbuf, *pixbuf_open;
348
        gboolean use_color;
349
        PangoWeight weight = PANGO_WEIGHT_NORMAL;
350
        GdkColor *foreground = NULL;
351
        static GdkColor color_noselect = {0, COLOR_DIM, COLOR_DIM, COLOR_DIM};
352
        static GdkColor color_new = {0, (guint16)55000, 15000, 15000};
353
354
        name = item->name;
355
356
        if (item->stype != F_NORMAL && FOLDER_IS_LOCAL(item->folder)) {
357
                switch (item->stype) {
358
                case F_INBOX:
359
                        if (!strcmp2(item->name, INBOX_DIR))
360
                                name = _("Inbox");
361
                        break;
362
                case F_OUTBOX:
363
                        if (!strcmp2(item->name, OUTBOX_DIR))
364
                                name = _("Sent");
365
                        break;
366
                case F_QUEUE:
367
                        if (!strcmp2(item->name, QUEUE_DIR))
368
                                name = _("Queue");
369
                        break;
370
                case F_TRASH:
371
                        if (!strcmp2(item->name, TRASH_DIR))
372
                                name = _("Trash");
373
                        break;
374
                case F_DRAFT:
375
                        if (!strcmp2(item->name, DRAFT_DIR))
376
                                name = _("Drafts");
377
                        break;
378
                default:
379
                        break;
380
                }
381
        }
382
383
        if (!item->parent) {
384
                switch (FOLDER_TYPE(item->folder)) {
385
                case F_MH:
386
                        Xstrcat_a(name, name, " (MH)", ); break;
387
                case F_IMAP:
388
                        Xstrcat_a(name, name, " (IMAP4)", ); break;
389
                case F_NEWS:
390
                        Xstrcat_a(name, name, " (News)", ); break;
391
                default:
392
                        break;
393
                }
394
        }
395
396
        if (item->stype == F_QUEUE && item->total > 0) {
397
                name = g_strdup_printf("%s (%d)", name, item->total);
398
        } else if (item->unread > 0) {
399
                name = g_strdup_printf("%s (%d)", name, item->unread);
400
        } else
401
                name = g_strdup(name);
402
403
        pixbuf = item->no_select ? foldernoselect_pixbuf : folder_pixbuf;
404
        pixbuf_open =
405
                item->no_select ? foldernoselect_pixbuf : folderopen_pixbuf;
406
407
        if (item->stype == F_OUTBOX || item->stype == F_DRAFT ||
408
            item->stype == F_TRASH) {
409
                use_color = FALSE;
410
        } else if (item->stype == F_QUEUE) {
411
                use_color = (item->total > 0);
412
                if (item->total > 0)
413
                        weight = PANGO_WEIGHT_BOLD;
414
        } else {
415
                use_color = (item->new > 0);
416
                if (item->unread > 0)
417
                        weight = PANGO_WEIGHT_BOLD;
418
        }
419
420
        if (item->no_select)
421
                foreground = &color_noselect;
422
        else if (use_color)
423
                foreground = &color_new;
424
425
        /* insert this node */
426
        gtk_tree_store_append(store, iter, parent);
427
        gtk_tree_store_set(store, iter,
428
                           FOLDERSEL_FOLDERNAME, name,
429
                           FOLDERSEL_FOLDERITEM, item,
430
                           FOLDERSEL_PIXBUF, pixbuf,
431
                           FOLDERSEL_PIXBUF_OPEN, pixbuf_open,
432
                           FOLDERSEL_FOREGROUND, foreground,
433
                           FOLDERSEL_BOLD, weight,
434
                           -1);
435
        g_free(name);
436
}
437
438
static void foldersel_insert_gnode_in_store(GtkTreeStore *store, GNode *node,
439
                                            GtkTreeIter *parent)
440
{
441
        FolderItem *item;
442
        GtkTreeIter child;
443
        GNode *iter;
444
445
        g_return_if_fail(node != NULL);
446
        g_return_if_fail(node->data != NULL);
447
        g_return_if_fail(store != NULL);
448
449
        item = FOLDER_ITEM(node->data);
450
        foldersel_append_item(store, item, &child, parent);
451
452
        /* insert its children (this node as parent) */
453
        for (iter = node->children; iter != NULL; iter = iter->next)
454
                foldersel_insert_gnode_in_store(store, iter, &child);
455
}
456
457
static void foldersel_set_tree(Folder *cur_folder)
458
{
459
        Folder *folder;
460
        GList *list;
461
462
        for (list = folder_get_list(); list != NULL; list = list->next) {
463
                folder = FOLDER(list->data);
464
                g_return_if_fail(folder != NULL);
465
466
                if (sel_type != FOLDER_SEL_ALL) {
467
                        if (FOLDER_TYPE(folder) == F_NEWS)
468
                                continue;
469
                }
470
                if (sel_type == FOLDER_SEL_MOVE_FOLDER && folder != cur_folder)
471
                        continue;
472
473
                foldersel_insert_gnode_in_store(tree_store, folder->node, NULL);
474
        }
475
476
        gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(tree_store),
477
                                             FOLDERSEL_FOLDERNAME,
478
                                             GTK_SORT_ASCENDING);
479
480
        gtk_tree_view_expand_all(GTK_TREE_VIEW(treeview));
481
}
482
483
static gboolean foldersel_selected(GtkTreeSelection *selection,
484
                                   GtkTreeModel *model, GtkTreePath *path,
485
                                   gboolean currently_selected, gpointer data)
486
{
487
        GtkTreeIter iter;
488
        FolderItem *item = NULL;
489
490
        if (currently_selected)
491
                return TRUE;
492
493
        if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, path))
494
                return TRUE;
495
496
        gtk_tree_model_get(GTK_TREE_MODEL(tree_store), &iter,
497
                           FOLDERSEL_FOLDERITEM, &item, -1);
498
499
        selected_item = item;
500
        if (selected_item &&
501
            (sel_type == FOLDER_SEL_ALL || sel_type == FOLDER_SEL_MOVE_FOLDER ||
502
             (selected_item->path && !selected_item->no_select))) {
503
                gchar *id;
504
                id = folder_item_get_identifier(selected_item);
505
                gtk_entry_set_text(GTK_ENTRY(entry), id);
506
                g_free(id);
507
        } else
508
                gtk_entry_set_text(GTK_ENTRY(entry), "");
509
510
        return TRUE;
511
}
512
513
static void foldersel_ok(GtkButton *button, gpointer data)
514
{
515
        finished = TRUE;
516
}
517
518
static void foldersel_cancel(GtkButton *button, gpointer data)
519
{
520
        cancelled = TRUE;
521
        finished = TRUE;
522
}
523
524
static void foldersel_new_folder(GtkButton *button, gpointer data)
525
{
526
        FolderItem *new_item;
527
        gchar *new_folder;
528
        gchar *disp_name;
529
        gchar *p;
530
        GtkTreeIter selected, new_child;
531
        GtkTreePath *selected_p, *new_child_p;
532
        GtkTreeStore *store;
533
        GtkTreeModel *model;
534
        GtkTreeSelection *selection;
535
536
        if (!selected_item || FOLDER_TYPE(selected_item->folder) == F_NEWS)
537
                return;
538
539
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
540
        if (!gtk_tree_selection_get_selected(selection, &model, &selected))
541
                return;
542
        store = GTK_TREE_STORE(model);
543
544
        new_folder = input_dialog(_("New folder"),
545
                                  _("Input the name of new folder:"),
546
                                  _("NewFolder"));
547
        if (!new_folder) return;
548
        AUTORELEASE_STR(new_folder, {g_free(new_folder); return;});
549
550
        p = strchr(new_folder, G_DIR_SEPARATOR);
551
        if ((p && FOLDER_TYPE(selected_item->folder) != F_IMAP) ||
552
            (p && FOLDER_TYPE(selected_item->folder) == F_IMAP &&
553
             *(p + 1) != '\0')) {
554
                alertpanel_error(_("`%c' can't be included in folder name."),
555
                                G_DIR_SEPARATOR);
556
                return;
557
        }
558
559
        disp_name = trim_string(new_folder, 32);
560
        AUTORELEASE_STR(disp_name, {g_free(disp_name); return;});
561
562
        /* find whether the directory already exists */
563
        if (folder_find_child_item_by_name(selected_item, new_folder)) {
564
                alertpanel_error(_("The folder `%s' already exists."),
565
                                 disp_name);
566
                return;
567
        }
568
569
        new_item = selected_item->folder->klass->create_folder
570
                (selected_item->folder, selected_item, new_folder);
571
        if (!new_item) {
572
                alertpanel_error(_("Can't create the folder `%s'."), disp_name);
573
                return;
574
        }
575
576
        /* add new child */
577
        foldersel_append_item(store, new_item, &new_child, &selected);
578
        selected_p = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &selected);
579
        new_child_p = gtk_tree_model_get_path(GTK_TREE_MODEL(store),
580
                                              &new_child);
581
582
        gtk_tree_view_expand_row(GTK_TREE_VIEW(treeview), selected_p, FALSE);
583
        gtk_tree_selection_select_iter(selection, &new_child);
584
        gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(treeview), new_child_p,
585
                                     NULL, TRUE, 0.5, 0.0);
586
        gtk_tree_path_free(new_child_p);
587
        gtk_tree_path_free(selected_p);
588
589
        folderview_append_item(folderview_get(), NULL, new_item, TRUE);
590
        folder_write_list();
591
}
592
593
static void foldersel_entry_activated(GtkEntry *entry, gpointer data)
594
{
595
        gtk_button_clicked(GTK_BUTTON(ok_button));
596
}
597
598
static void foldersel_tree_activated(GtkTreeView *treeview, GtkTreePath *path,
599
                                     GtkTreeViewColumn *column, gpointer data)
600
{
601
        gtk_button_clicked(GTK_BUTTON(ok_button));
602
}
603
604
static gint delete_event(GtkWidget *widget, GdkEventAny *event, gpointer data)
605
{
606
        foldersel_cancel(NULL, NULL);
607
        return TRUE;
608
}
609
610
static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
611
{
612
        if (event && event->keyval == GDK_Escape)
613
                foldersel_cancel(NULL, NULL);
614
        return FALSE;
615
}
616
617
static gint foldersel_folder_name_compare(GtkTreeModel *model, GtkTreeIter *a,
618
                                          GtkTreeIter *b, gpointer context)
619
{
620
        FolderItem *item_a = NULL, *item_b = NULL;
621
622
        gtk_tree_model_get(model, a, FOLDERSEL_FOLDERITEM, &item_a, -1);
623
        gtk_tree_model_get(model, b, FOLDERSEL_FOLDERITEM, &item_b, -1);
624
625
        return folder_item_compare(item_a, item_b);
626
}
627
628
static gboolean tree_view_folder_item_func(GtkTreeModel *model,
629
                                           GtkTreePath *path,
630
                                           GtkTreeIter *iter,
631
                                           FolderItemSearch *data)
632
{
633
        FolderItem *item = NULL;
634
635
        gtk_tree_model_get(model, iter, FOLDERSEL_FOLDERITEM, &item, -1);
636
637
        if (data->item == item) {
638
                data->path = gtk_tree_path_copy(path);
639
                data->iter = *iter;
640
                return TRUE;
641
        }
642
643
        return FALSE;
644
}