1 /* GTK - The GIMP Toolkit
2  * gtkfilechooserprivate.h: Interface definition for file selector GUIs
3  * Copyright (C) 2003, Red Hat, Inc.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library 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 GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18  * Boston, MA 02111-1307, USA.
19  */
20 
21 #ifndef __GTK_FILE_CHOOSER_PRIVATE_H__
22 #define __GTK_FILE_CHOOSER_PRIVATE_H__
23 
24 #include "gtkfilechooser.h"
25 #include "gtkfilesystem.h"
26 #include "gtkfilesystemmodel.h"
27 #include "gtkliststore.h"
28 #include "gtkrecentmanager.h"
29 #include "gtksearchengine.h"
30 #include "gtkquery.h"
31 #include "gtksizegroup.h"
32 #include "gtktreemodelsort.h"
33 #include "gtktreestore.h"
34 #include "gtktreeview.h"
35 #include "gtkvbox.h"
36 
37 G_BEGIN_DECLS
38 
39 #define GTK_FILE_CHOOSER_GET_IFACE(inst)  (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GTK_TYPE_FILE_CHOOSER, GtkFileChooserIface))
40 
41 typedef struct _GtkFileChooserIface GtkFileChooserIface;
42 
43 struct _GtkFileChooserIface
44 {
45   GTypeInterface base_iface;
46 
47   /* Methods
48    */
49   gboolean       (*set_current_folder) 	   (GtkFileChooser    *chooser,
50 					    GFile             *file,
51 					    GError           **error);
52   GFile *        (*get_current_folder) 	   (GtkFileChooser    *chooser);
53   void           (*set_current_name)   	   (GtkFileChooser    *chooser,
54 					    const gchar       *name);
55   gboolean       (*select_file)        	   (GtkFileChooser    *chooser,
56 					    GFile             *file,
57 					    GError           **error);
58   void           (*unselect_file)      	   (GtkFileChooser    *chooser,
59 					    GFile             *file);
60   void           (*select_all)         	   (GtkFileChooser    *chooser);
61   void           (*unselect_all)       	   (GtkFileChooser    *chooser);
62   GSList *       (*get_files)          	   (GtkFileChooser    *chooser);
63   GFile *        (*get_preview_file)   	   (GtkFileChooser    *chooser);
64   GtkFileSystem *(*get_file_system)    	   (GtkFileChooser    *chooser);
65   void           (*add_filter)         	   (GtkFileChooser    *chooser,
66 					    GtkFileFilter     *filter);
67   void           (*remove_filter)      	   (GtkFileChooser    *chooser,
68 					    GtkFileFilter     *filter);
69   GSList *       (*list_filters)       	   (GtkFileChooser    *chooser);
70   gboolean       (*add_shortcut_folder)    (GtkFileChooser    *chooser,
71 					    GFile             *file,
72 					    GError           **error);
73   gboolean       (*remove_shortcut_folder) (GtkFileChooser    *chooser,
74 					    GFile             *file,
75 					    GError           **error);
76   GSList *       (*list_shortcut_folders)  (GtkFileChooser    *chooser);
77 
78   /* Signals
79    */
80   void (*current_folder_changed) (GtkFileChooser *chooser);
81   void (*selection_changed)      (GtkFileChooser *chooser);
82   void (*update_preview)         (GtkFileChooser *chooser);
83   void (*file_activated)         (GtkFileChooser *chooser);
84   GtkFileChooserConfirmation (*confirm_overwrite) (GtkFileChooser *chooser);
85 };
86 
87 GtkFileSystem *_gtk_file_chooser_get_file_system         (GtkFileChooser    *chooser);
88 gboolean       _gtk_file_chooser_add_shortcut_folder     (GtkFileChooser    *chooser,
89 							  GFile             *folder,
90 							  GError           **error);
91 gboolean       _gtk_file_chooser_remove_shortcut_folder  (GtkFileChooser    *chooser,
92 							  GFile             *folder,
93 							  GError           **error);
94 GSList *       _gtk_file_chooser_list_shortcut_folder_files (GtkFileChooser *chooser);
95 
96 /* GtkFileChooserDialog private */
97 
98 struct _GtkFileChooserDialogPrivate
99 {
100   GtkWidget *widget;
101 
102   char *file_system;
103 
104   /* for use with GtkFileChooserEmbed */
105   gboolean response_requested;
106 };
107 
108 
109 /* GtkFileChooserWidget private */
110 
111 struct _GtkFileChooserWidgetPrivate
112 {
113   GtkWidget *impl;
114 
115   char *file_system;
116 };
117 
118 
119 /* GtkFileChooserDefault private */
120 
121 typedef enum {
122   LOAD_EMPTY,			/* There is no model */
123   LOAD_PRELOAD,			/* Model is loading and a timer is running; model isn't inserted into the tree yet */
124   LOAD_LOADING,			/* Timeout expired, model is inserted into the tree, but not fully loaded yet */
125   LOAD_FINISHED			/* Model is fully loaded and inserted into the tree */
126 } LoadState;
127 
128 typedef enum {
129   RELOAD_EMPTY,			/* No folder has been set */
130   RELOAD_HAS_FOLDER		/* We have a folder, although it may not be completely loaded yet; no need to reload */
131 } ReloadState;
132 
133 typedef enum {
134   LOCATION_MODE_PATH_BAR,
135   LOCATION_MODE_FILENAME_ENTRY
136 } LocationMode;
137 
138 typedef enum {
139   OPERATION_MODE_BROWSE,
140   OPERATION_MODE_SEARCH,
141   OPERATION_MODE_RECENT
142 } OperationMode;
143 
144 typedef enum {
145   STARTUP_MODE_RECENT,
146   STARTUP_MODE_CWD
147 } StartupMode;
148 
149 struct _GtkFileChooserDefault
150 {
151   GtkVBox parent_instance;
152 
153   GtkFileChooserAction action;
154 
155   GtkFileSystem *file_system;
156 
157   /* Save mode widgets */
158   GtkWidget *save_widgets;
159   GtkWidget *save_widgets_table;
160 
161   GtkWidget *save_folder_label;
162 
163   /* The file browsing widgets */
164   GtkWidget *browse_widgets_box;
165   GtkWidget *browse_header_box;
166   GtkWidget *browse_shortcuts_tree_view;
167   GtkWidget *browse_shortcuts_add_button;
168   GtkWidget *browse_shortcuts_remove_button;
169   GtkWidget *browse_shortcuts_popup_menu;
170   GtkWidget *browse_shortcuts_popup_menu_remove_item;
171   GtkWidget *browse_shortcuts_popup_menu_rename_item;
172   GtkWidget *browse_files_tree_view;
173   GtkWidget *browse_files_popup_menu;
174   GtkWidget *browse_files_popup_menu_add_shortcut_item;
175   GtkWidget *browse_files_popup_menu_hidden_files_item;
176   GtkWidget *browse_files_popup_menu_size_column_item;
177   GtkWidget *browse_new_folder_button;
178   GtkWidget *browse_path_bar_hbox;
179   GtkSizeGroup *browse_path_bar_size_group;
180   GtkWidget *browse_path_bar;
181   GtkWidget *browse_special_mode_icon;
182   GtkWidget *browse_special_mode_label;
183   GtkWidget *browse_select_a_folder_info_bar;
184   GtkWidget *browse_select_a_folder_label;
185   GtkWidget *browse_select_a_folder_icon;
186 
187   gulong toplevel_unmapped_id;
188 
189   GtkFileSystemModel *browse_files_model;
190   char *browse_files_last_selected_name;
191 
192   StartupMode startup_mode;
193 
194   /* OPERATION_MODE_SEARCH */
195   GtkWidget *search_hbox;
196   GtkWidget *search_entry;
197   GtkSearchEngine *search_engine;
198   GtkQuery *search_query;
199   GtkFileSystemModel *search_model;
200 
201   /* OPERATION_MODE_RECENT */
202   GtkRecentManager *recent_manager;
203   GtkFileSystemModel *recent_model;
204   guint load_recent_id;
205 
206   GtkWidget *filter_combo_hbox;
207   GtkWidget *filter_combo;
208   GtkWidget *preview_box;
209   GtkWidget *preview_label;
210   GtkWidget *preview_widget;
211   GtkWidget *extra_align;
212   GtkWidget *extra_widget;
213 
214   GtkWidget *location_button;
215   GtkWidget *location_entry_box;
216   GtkWidget *location_label;
217   GtkWidget *location_entry;
218   LocationMode location_mode;
219 
220   GtkListStore *shortcuts_model;
221 
222   /* Filter for the shortcuts pane.  We filter out the "current folder" row and
223    * the separator that we use for the "Save in folder" combo.
224    */
225   GtkTreeModel *shortcuts_pane_filter_model;
226 
227   /* Handles */
228   GSList *loading_shortcuts;
229   GSList *reload_icon_cancellables;
230   GCancellable *file_list_drag_data_received_cancellable;
231   GCancellable *update_current_folder_cancellable;
232   GCancellable *should_respond_get_info_cancellable;
233   GCancellable *file_exists_get_info_cancellable;
234   GCancellable *update_from_entry_cancellable;
235   GCancellable *shortcuts_activate_iter_cancellable;
236 
237   LoadState load_state;
238   ReloadState reload_state;
239   guint load_timeout_id;
240 
241   OperationMode operation_mode;
242 
243   GSList *pending_select_files;
244 
245   GtkFileFilter *current_filter;
246   GSList *filters;
247 
248   int num_volumes;
249   int num_shortcuts;
250   int num_bookmarks;
251 
252   gulong volumes_changed_id;
253   gulong bookmarks_changed_id;
254 
255   GFile *current_volume_file;
256   GFile *current_folder;
257   GFile *preview_file;
258   char *preview_display_name;
259 
260   GtkTreeViewColumn *list_name_column;
261   GtkCellRenderer *list_name_renderer;
262   GtkTreeViewColumn *list_mtime_column;
263   GtkTreeViewColumn *list_size_column;
264 
265   GSource *edited_idle;
266   char *edited_new_text;
267 
268   gulong settings_signal_id;
269   int icon_size;
270 
271   GSource *focus_entry_idle;
272 
273   gulong toplevel_set_focus_id;
274   GtkWidget *toplevel_last_focus_widget;
275 
276   gint sort_column;
277   GtkSortType sort_order;
278 
279 #if 0
280   GdkDragContext *shortcuts_drag_context;
281   GSource *shortcuts_drag_outside_idle;
282 #endif
283 
284   /* Flags */
285 
286   guint local_only : 1;
287   guint preview_widget_active : 1;
288   guint use_preview_label : 1;
289   guint select_multiple : 1;
290   guint show_hidden : 1;
291   guint do_overwrite_confirmation : 1;
292   guint list_sort_ascending : 1;
293   guint changing_folder : 1;
294   guint shortcuts_current_folder_active : 1;
295   guint has_cwd : 1;
296   guint has_home : 1;
297   guint has_desktop : 1;
298   guint has_search : 1;
299   guint show_size_column : 1;
300   guint create_folders : 1;
301 
302 #if 0
303   guint shortcuts_drag_outside : 1;
304 #endif
305 };
306 
307 
308 G_END_DECLS
309 
310 #endif /* __GTK_FILE_CHOOSER_PRIVATE_H__ */
311