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