]> Pileus Git - ~andy/gtk/blob - tests/testfilechooser.c
File filter objects.
[~andy/gtk] / tests / testfilechooser.c
1 #include <string.h>
2
3 #include <gtk/gtk.h>
4 #include "gtkfilechooserdialog.h"
5 #include "gtkfilechooser.h"
6 #include "prop-editor.h"
7
8 #ifdef USE_GNOME_VFS
9 #include "gtkfilesystemgnomevfs.h"
10 #else
11 #include "gtkfilesystemunix.h"
12 #endif
13
14 static void
15 print_current_folder (GtkFileChooser *chooser)
16 {
17   gchar *uri;
18
19   uri = gtk_file_chooser_get_current_folder_uri (chooser);
20   g_print ("Current folder changed :\n  %s\n", uri);
21   g_free (uri);
22 }
23
24 static void
25 print_selected (GtkFileChooser *chooser)
26 {
27   GSList *uris = gtk_file_chooser_get_uris (chooser);
28   GSList *tmp_list;
29
30   g_print ("Selection changed :\n");
31   for (tmp_list = uris; tmp_list; tmp_list = tmp_list->next)
32     {
33       gchar *uri = tmp_list->data;
34       g_print ("  %s\n", uri);
35       g_free (uri);
36     }
37   g_print ("\n");
38   g_slist_free (uris);
39 }
40
41 static void
42 response_cb (GtkDialog *dialog,
43              gint       response_id)
44 {
45   gtk_main_quit ();
46 }
47
48 static gboolean
49 no_backup_files_filter (const GtkFileFilterInfo *filter_info,
50                         gpointer                 data)
51 {
52   gsize len = strlen (filter_info->display_name);
53   if (len > 0 && filter_info->display_name[len - 1] == '~')
54     return 0;
55   else
56     return 1;
57 }
58
59 int
60 main (int argc, char **argv)
61 {
62   GtkWidget *control_window;
63   GtkWidget *vbbox;
64   GtkWidget *button;
65   GtkWidget *dialog;
66   GtkWidget *prop_editor;
67   GtkFileSystem *file_system;
68   GtkFileFilter *filter;
69   
70   gtk_init (&argc, &argv);
71
72 #ifdef USE_GNOME_VFS
73   file_system = gtk_file_system_gnome_vfs_new ();
74 #else  
75   file_system = gtk_file_system_unix_new ();
76 #endif
77   
78   dialog = g_object_new (GTK_TYPE_FILE_CHOOSER_DIALOG,
79                          "action", GTK_FILE_CHOOSER_ACTION_OPEN,
80                          "file-system", file_system,
81                          "title", "Select a file",
82                          NULL);
83                          
84   gtk_dialog_add_buttons (GTK_DIALOG (dialog),
85                           GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
86                           GTK_STOCK_OPEN, GTK_RESPONSE_OK,
87                           NULL);
88   gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
89   
90   g_signal_connect (dialog, "selection-changed",
91                     G_CALLBACK (print_selected), NULL);
92   g_signal_connect (dialog, "current-folder-changed",
93                     G_CALLBACK (print_current_folder), NULL);
94   g_signal_connect (dialog, "response",
95                     G_CALLBACK (response_cb), NULL);
96
97   /* Filters */
98   filter = gtk_file_filter_new ();
99   gtk_file_filter_set_name (filter, "All Files");
100   gtk_file_filter_add_pattern (filter, "*");
101   gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
102   
103   filter = gtk_file_filter_new ();
104   gtk_file_filter_set_name (filter, "No backup files");
105   gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_DISPLAY_NAME,
106                               no_backup_files_filter, NULL, NULL);
107   gtk_file_filter_add_mime_type (filter, "image/png");
108   gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
109
110   /* Make this filter the default */
111   gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter);
112   
113   filter = gtk_file_filter_new ();
114   gtk_file_filter_set_name (filter, "PNG and JPEG");
115   gtk_file_filter_add_mime_type (filter, "image/jpeg");
116   gtk_file_filter_add_mime_type (filter, "image/png");
117   gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
118
119   gtk_window_set_default_size (GTK_WINDOW (dialog), 600, 400);
120   /* show_all() to reveal bugs in composite widget handling */
121   gtk_widget_show_all (dialog);
122
123   prop_editor = create_prop_editor (G_OBJECT (dialog), GTK_TYPE_FILE_CHOOSER);
124
125   control_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
126   
127   vbbox = gtk_vbutton_box_new ();
128   gtk_container_add (GTK_CONTAINER (control_window), vbbox);
129
130   button = gtk_button_new_with_mnemonic ("_Select all");
131   gtk_container_add (GTK_CONTAINER (vbbox), button);
132   g_signal_connect_swapped (button, "clicked",
133                             G_CALLBACK (gtk_file_chooser_select_all), dialog);
134   
135   button = gtk_button_new_with_mnemonic ("_Unselect all");
136   gtk_container_add (GTK_CONTAINER (vbbox), button);
137   g_signal_connect_swapped (button, "clicked",
138                             G_CALLBACK (gtk_file_chooser_unselect_all), dialog);
139
140   gtk_widget_show_all (control_window);
141   
142   gtk_main ();
143
144   return 0;
145 }