]> Pileus Git - ~andy/gtk/blob - gtk/gtkfilechooserutils.c
File filter objects.
[~andy/gtk] / gtk / gtkfilechooserutils.c
1 /* GTK - The GIMP Toolkit
2  * gtkfilechooserutils.c: Private utility functions useful for
3  *                        implementing a GtkFileChooser interface
4  * Copyright (C) 2003, Red Hat, Inc.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21
22 #include "gtkfilechooserutils.h"
23 #include "gtkfilechooser.h"
24 #include "gtkfilechooserenums.h"
25 #include "gtkfilesystem.h"
26
27 static void           delegate_set_current_folder     (GtkFileChooser    *chooser,
28                                                        const GtkFilePath *path);
29 static GtkFilePath *  delegate_get_current_folder     (GtkFileChooser    *chooser);
30 static void           delegate_set_current_name       (GtkFileChooser    *chooser,
31                                                        const gchar       *name);
32 static void           delegate_select_path            (GtkFileChooser    *chooser,
33                                                        const GtkFilePath *path);
34 static void           delegate_unselect_path          (GtkFileChooser    *chooser,
35                                                        const GtkFilePath *path);
36 static void           delegate_select_all             (GtkFileChooser    *chooser);
37 static void           delegate_unselect_all           (GtkFileChooser    *chooser);
38 static GSList *       delegate_get_paths              (GtkFileChooser    *chooser);
39 static GtkFileSystem *delegate_get_file_system        (GtkFileChooser    *chooser);
40 static void           delegate_add_filter             (GtkFileChooser    *chooser,
41                                                        GtkFileFilter     *filter);
42 static void           delegate_remove_filter          (GtkFileChooser    *chooser,
43                                                        GtkFileFilter     *filter);
44 static GSList *       delegate_list_filters           (GtkFileChooser    *chooser);
45 static void           delegate_notify                 (GObject           *object,
46                                                        GParamSpec        *pspec,
47                                                        gpointer           data);
48 static void           delegate_current_folder_changed (GtkFileChooser    *chooser,
49                                                        gpointer           data);
50 static void           delegate_selection_changed      (GtkFileChooser    *chooser,
51                                                        gpointer           data);
52
53 /**
54  * _gtk_file_chooser_install_properties:
55  * @klass: the class structure for a type deriving from #GObject
56  * 
57  * Installs the necessary properties for a class implementing
58  * #GtkFileChooser. A #GtkParamSpecOverride property is installed
59  * for each property, using the values from the #GtkFileChooserProp
60  * enumeration. The caller must make sure itself that the enumeration
61  * values don't collide with some other property values they
62  * are using.
63  **/
64 void
65 _gtk_file_chooser_install_properties (GObjectClass *klass)
66 {
67   g_object_class_install_property (klass,
68                                    GTK_FILE_CHOOSER_PROP_ACTION,
69                                    g_param_spec_override ("action",
70                                                           GTK_TYPE_FILE_CHOOSER_ACTION,
71                                                           G_PARAM_READWRITE));
72   g_object_class_install_property (klass,
73                                    GTK_FILE_CHOOSER_PROP_FILE_SYSTEM,
74                                    g_param_spec_override ("file-system",
75                                                           GTK_TYPE_FILE_SYSTEM,
76                                                           G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
77   g_object_class_install_property (klass,
78                                    GTK_FILE_CHOOSER_PROP_FILTER,
79                                    g_param_spec_override ("filter",
80                                                           GTK_TYPE_FILE_FILTER,
81                                                           G_PARAM_READWRITE));
82   g_object_class_install_property (klass,
83                                    GTK_FILE_CHOOSER_PROP_FOLDER_MODE,
84                                    g_param_spec_override ("folder-mode",
85                                                           G_TYPE_BOOLEAN,
86                                                           G_PARAM_READWRITE));
87   g_object_class_install_property (klass,
88                                    GTK_FILE_CHOOSER_PROP_LOCAL_ONLY,
89                                    g_param_spec_override ("local-only",
90                                                           G_TYPE_BOOLEAN,
91                                                           G_PARAM_READWRITE));
92   g_object_class_install_property (klass,
93                                    GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET,
94                                    g_param_spec_override ("preview-widget",
95                                                           GTK_TYPE_WIDGET,
96                                                           G_PARAM_READWRITE));
97   g_object_class_install_property (klass,
98                                    GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET_ACTIVE,
99                                    g_param_spec_override ("preview-widget-active",
100                                                           G_TYPE_BOOLEAN,
101                                                           G_PARAM_READWRITE));
102   g_object_class_install_property (klass,
103                                    GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE,
104                                    g_param_spec_override ("select-multiple",
105                                                           G_TYPE_BOOLEAN,
106                                                           G_PARAM_READWRITE));
107   g_object_class_install_property (klass,
108                                    GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN,
109                                    g_param_spec_override ("show-hidden",
110                                                           G_TYPE_BOOLEAN,
111                                                           G_PARAM_READWRITE));
112 }
113
114 /**
115  * _gtk_file_chooser_delegate_iface_init:
116  * @iface: a #GtkFileChoserIface structure
117  * 
118  * An interface-initialization function for use in cases where
119  * an object is simply delegating the methods, signals of
120  * the #GtkFileChooser interface to another object.
121  * _gtk_file_chooser_set_delegate() must be called on each
122  * instance of the object so that the delegate object can
123  * be found.
124  **/
125 void
126 _gtk_file_chooser_delegate_iface_init (GtkFileChooserIface *iface)
127 {
128   iface->set_current_folder = delegate_set_current_folder;
129   iface->get_current_folder = delegate_get_current_folder;
130   iface->set_current_name = delegate_set_current_name;
131   iface->select_path = delegate_select_path;
132   iface->unselect_path = delegate_unselect_path;
133   iface->select_all = delegate_select_all;
134   iface->unselect_all = delegate_unselect_all;
135   iface->get_paths = delegate_get_paths;
136   iface->get_file_system = delegate_get_file_system;
137   iface->add_filter = delegate_add_filter;
138   iface->remove_filter = delegate_remove_filter;
139   iface->list_filters = delegate_list_filters;
140 }
141
142 /**
143  * _gtk_file_chooser_set_delegate:
144  * @receiver: a GOobject implementing #GtkFileChooser
145  * @delegate: another GObject implementing #GtkFileChooser
146  *
147  * Establishes that calls on @receiver for #GtkFileChooser
148  * methods should be delegated to @delegate, and that
149  * #GtkFileChooser signals emitted on @delegate should be
150  * forwarded to @receiver. Must be used in confunction with
151  * _gtk_file_chooser_delegate_iface_init().
152  **/
153 void
154 _gtk_file_chooser_set_delegate (GtkFileChooser *receiver,
155                                 GtkFileChooser *delegate)
156 {
157   g_return_if_fail (GTK_IS_FILE_CHOOSER (receiver));
158   g_return_if_fail (GTK_IS_FILE_CHOOSER (delegate));
159   
160   g_object_set_data (G_OBJECT (receiver), "gtk-file-chooser-delegate", delegate);
161
162   g_signal_connect (delegate, "notify",
163                     G_CALLBACK (delegate_notify), receiver);
164   g_signal_connect (delegate, "current-folder-changed",
165                     G_CALLBACK (delegate_current_folder_changed), receiver);
166   g_signal_connect (delegate, "selection-changed",
167                     G_CALLBACK (delegate_selection_changed), receiver);
168 }
169
170 static GtkFileChooser *
171 get_delegate (GtkFileChooser *receiver)
172 {
173   return g_object_get_data (G_OBJECT (receiver), "gtk-file-chooser-delegate");
174 }
175
176 static void
177 delegate_select_path (GtkFileChooser    *chooser,
178                       const GtkFilePath *path)
179 {
180   _gtk_file_chooser_select_path (get_delegate (chooser), path);
181 }
182
183 static void
184 delegate_unselect_path (GtkFileChooser    *chooser,
185                         const GtkFilePath *path)
186 {
187   _gtk_file_chooser_unselect_path (get_delegate (chooser), path);
188 }
189
190 static void
191 delegate_select_all (GtkFileChooser *chooser)
192 {
193   gtk_file_chooser_select_all (get_delegate (chooser));
194 }
195
196 static void
197 delegate_unselect_all (GtkFileChooser *chooser)
198 {
199   gtk_file_chooser_unselect_all (get_delegate (chooser));
200 }
201
202 static GSList *
203 delegate_get_paths (GtkFileChooser *chooser)
204 {
205   return _gtk_file_chooser_get_paths (get_delegate (chooser));
206 }
207
208 static GtkFileSystem *
209 delegate_get_file_system (GtkFileChooser *chooser)
210 {
211   return _gtk_file_chooser_get_file_system (get_delegate (chooser));
212 }
213
214 static void
215 delegate_add_filter (GtkFileChooser *chooser,
216                      GtkFileFilter  *filter)
217 {
218   gtk_file_chooser_add_filter (get_delegate (chooser), filter);
219 }
220
221 static void
222 delegate_remove_filter (GtkFileChooser *chooser,
223                         GtkFileFilter  *filter)
224 {
225   gtk_file_chooser_remove_filter (get_delegate (chooser), filter);
226 }
227
228 static GSList *
229 delegate_list_filters (GtkFileChooser *chooser)
230 {
231   return gtk_file_chooser_list_filters (get_delegate (chooser));
232 }
233
234 static void
235 delegate_set_current_folder (GtkFileChooser    *chooser,
236                              const GtkFilePath *path)
237 {
238   _gtk_file_chooser_set_current_folder_path (chooser, path);
239 }
240
241 static GtkFilePath *
242 delegate_get_current_folder (GtkFileChooser *chooser)
243 {
244   return _gtk_file_chooser_get_current_folder_path (get_delegate (chooser));
245 }
246
247 static void
248 delegate_set_current_name (GtkFileChooser *chooser,
249                            const gchar    *name)
250 {
251   gtk_file_chooser_set_current_name (get_delegate (chooser), name);
252 }
253
254 static void
255 delegate_notify (GObject    *object,
256                  GParamSpec *pspec,
257                  gpointer    data)
258 {
259   if (pspec->param_id >= GTK_FILE_CHOOSER_PROP_FIRST &&
260       pspec->param_id <= GTK_FILE_CHOOSER_PROP_LAST)
261     {
262       g_object_notify (data, pspec->name);
263     }
264 }
265
266 static void
267 delegate_selection_changed (GtkFileChooser *chooser,
268                             gpointer        data)
269 {
270   g_signal_emit_by_name (data, "selection-changed", 0);
271 }
272
273 static void
274 delegate_current_folder_changed (GtkFileChooser *chooser,
275                                  gpointer        data)
276 {
277   g_signal_emit_by_name (data, "current-folder-changed", 0);
278 }