"Fossies" - the Fresh Open Source Software Archive 
Member "gamgi0.17.5x/src/gtk/file/gamgi_gtk_file_chooser.c" (23 Feb 2022, 27465 Bytes) of package /linux/misc/gamgi-all-0.17.5x.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "gamgi_gtk_file_chooser.c" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
0.17.4x_vs_0.17.5x.
1 /***********************************************
2 *
3 * $GAMGI/src/gtk/file/gamgi_gtk_file_import.c
4 *
5 * Copyright (C) 2009 Carlos Pereira
6 *
7 * Distributed under the terms of the GNU
8 * General Public License: $GAMGI/LICENSE
9 *
10 */
11
12 #include <dirent.h>
13 #include <unistd.h>
14 #include <sys/stat.h>
15
16 #include "gamgi_engine.h"
17 #include "gamgi_gtk.h"
18 #include "gamgi_io.h"
19
20 #include "gamgi_gtk_dialog.h"
21 #include "gamgi_io_token.h"
22 #include "gamgi_io_file.h"
23
24 /**********************************************************
25 * 1) file,folder must be smaller than GAMGI_IO_SHORTNAME *
26 * *
27 * 2) path must be smaller than GAMGI_IO_PATHNAME *
28 * *
29 * 3) fullname (including protocol, hostname, pathname *
30 * and filename) must be smaller than GAMGI_IO_FULLNAME *
31 **********************************************************/
32
33 static gamgi_bool static_timer (void *data);
34 static void static_select_folders (GtkWidget *widget, void *data);
35
36 static char home[GAMGI_IO_PATHNAME] = "";
37 static char current[GAMGI_IO_PATHNAME] = "";
38 static char last[GAMGI_IO_PATHNAME] = "";
39
40 static int static_dir (char *fullname)
41 {
42 struct stat pathname;
43
44 if (stat (fullname, &pathname) < 0) return 0;
45
46 return (S_ISDIR (pathname.st_mode));
47 }
48
49 static gamgi_bool static_timer (void *data)
50 {
51 gamgi_window *window = GAMGI_CAST_WINDOW data;
52 GtkWidget *dialog = window->dialog0;
53 GtkWidget *treeview;
54
55 treeview = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "tree_folders");
56 g_signal_handlers_unblock_by_func (treeview, static_select_folders, window);
57
58 return FALSE;
59 }
60
61 static gamgi_bool static_hide_folders (char *folder, gamgi_window *window)
62 {
63 GtkWidget *dialog = window->dialog0;
64 GtkWidget *entry;
65 const char *name;
66
67 entry = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "entry_folders_hide");
68 name = gtk_entry_get_text (GTK_ENTRY (entry));
69
70 if (gamgi_io_token_check (name) == TRUE)
71 return gamgi_io_file_patterns (folder, name);
72
73 return FALSE;
74 }
75
76 static gamgi_bool static_show_folders (char *folder, gamgi_window *window)
77 {
78 GtkWidget *dialog = window->dialog0;
79 GtkWidget *entry;
80 const char *name;
81
82 entry = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "entry_folders_show");
83 name = gtk_entry_get_text (GTK_ENTRY (entry));
84
85 if (gamgi_io_token_check (name) == TRUE)
86 return gamgi_io_file_patterns (folder, name);
87
88 return TRUE;
89 }
90
91 static gamgi_bool static_hide_files (char *file, gamgi_window *window)
92 {
93 GtkWidget *dialog = window->dialog0;
94 GtkWidget *entry;
95 const char *name;
96
97 entry = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "entry_files_hide");
98 name = gtk_entry_get_text (GTK_ENTRY (entry));
99
100 if (gamgi_io_token_check (name) == TRUE)
101 return gamgi_io_file_patterns (file, name);
102
103 return FALSE;
104 }
105
106 static gamgi_bool static_show_files (char *file, gamgi_window *window)
107 {
108 GtkWidget *dialog = window->dialog0;
109 GtkWidget *entry;
110 const char *name;
111
112 entry = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "entry_files_show");
113 name = gtk_entry_get_text (GTK_ENTRY (entry));
114
115 if (gamgi_io_token_check (name) == TRUE)
116 return gamgi_io_file_patterns (file, name);
117
118 return TRUE;
119 }
120
121 static void static_list_folders (const char *path, void *data)
122 {
123 gamgi_window *window = GAMGI_CAST_WINDOW data;
124 GtkWidget *dialog = window->dialog0;
125 GtkWidget *treeview;
126 GtkListStore *store;
127 GtkTreeIter iter;
128 DIR *directory;
129 struct dirent *child;
130 char pathname[GAMGI_IO_PATHNAME];
131 int length;
132
133 /*****************************************************
134 * path < GAMGI_IO_PATHNAME, otherwise ignore excess *
135 *****************************************************/
136
137 gamgi_io_token_cut (path, pathname, GAMGI_IO_PATHNAME);
138 length = strlen (pathname);
139
140 /****************************************
141 * block signal connected to treeview *
142 * changes to avoid reentrant callbacks *
143 ****************************************/
144
145 treeview = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "tree_folders");
146 g_signal_handlers_block_by_func (treeview, static_select_folders, window);
147
148 /*********************
149 * build store model *
150 *********************/
151
152 store = gtk_list_store_new (1, G_TYPE_STRING);
153
154 directory = opendir (path);
155 if (directory != NULL)
156 {
157 if (path != strrchr (path, '/'))
158 {
159 gtk_list_store_append (store, &iter);
160 gtk_list_store_set (store, &iter, 0, "..", -1);
161 }
162
163 while ((child = readdir (directory)) != NULL)
164 {
165 if (strcmp (child->d_name, ".") == 0 || strcmp (child->d_name, "..") == 0)
166 continue;
167
168 /*********************************************************************
169 * path + child->d_name < GAMGI_IO_PATHNAME, otherwise ignore excess *
170 *********************************************************************/
171
172 gamgi_io_token_cut (child->d_name, pathname + length, GAMGI_IO_PATHNAME - length);
173 if (static_dir (pathname) == TRUE)
174 {
175 if (static_hide_folders (child->d_name, window) == TRUE) continue;
176 if (static_show_folders (child->d_name, window) == FALSE) continue;
177
178 gtk_list_store_append (store, &iter);
179 gtk_list_store_set (store, &iter, 0, child->d_name, -1);
180 }
181 }
182
183 /*****************************
184 * save last valid directory *
185 *****************************/
186
187 strcpy (last, path);
188 }
189
190 closedir (directory);
191
192 /*********************************************************
193 * set model (and automatically remove the previous one) *
194 *********************************************************/
195
196 gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store));
197 g_object_unref (store);
198
199 /***************
200 * sort column *
201 ***************/
202
203 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
204 0, GTK_SORT_ASCENDING);
205
206 /********************************************************
207 * unblock signal inside a timer, otherwise the signal *
208 * is unblocked before the treeview set up is completed *
209 ********************************************************/
210
211 g_timeout_add (0, static_timer, window);
212 }
213
214 static void static_list_files (const char *path, void *data)
215 {
216 gamgi_window *window = GAMGI_CAST_WINDOW data;
217 GtkWidget *dialog = window->dialog0;
218 GtkWidget *treeview;
219 GtkListStore *store;
220 GtkTreeIter iter;
221 DIR *directory;
222 struct dirent *child;
223 char fullname[GAMGI_IO_FULLNAME];
224 int length;
225
226 /*****************************************************
227 * path < GAMGI_IO_PATHNAME, otherwise ignore excess *
228 *****************************************************/
229
230 gamgi_io_token_cut (path, fullname, GAMGI_IO_PATHNAME);
231 length = strlen (fullname);
232
233 /*********************
234 * build store model *
235 *********************/
236
237 store = gtk_list_store_new (1, G_TYPE_STRING);
238
239 directory = opendir (path);
240 if (directory != NULL)
241 {
242 while ((child = readdir (directory)) != NULL)
243 {
244 if (strcmp (child->d_name, ".") == 0 || strcmp (child->d_name, "..") == 0)
245 continue;
246
247 /***********************************************************************
248 * child->d_name < GAMGI_IO_SHORTNAME, otherwise ignore excess *
249 * *
250 * GAMGI_IO_FULLNAME must be >= GAMGI_IO_PATHNAME + GAMGI_IO_SHORTNAME *
251 ***********************************************************************/
252
253 gamgi_io_token_cut (child->d_name, fullname + length, GAMGI_IO_SHORTNAME);
254 if (static_dir (fullname) == FALSE)
255 {
256 if (static_hide_files (child->d_name, window) == TRUE) continue;
257 if (static_show_files (child->d_name, window) == FALSE) continue;
258
259 gtk_list_store_append (store, &iter);
260 gtk_list_store_set (store, &iter, 0, child->d_name, -1);
261 }
262 }
263 }
264
265 closedir (directory);
266
267 /*********************************************************
268 * set model (and automatically remove the previous one) *
269 *********************************************************/
270
271 treeview = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "tree_files");
272 gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store));
273 g_object_unref (store);
274
275 /***************
276 * sort column *
277 ***************/
278
279 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
280 0, GTK_SORT_ASCENDING);
281 }
282
283 static void static_update (char *path, gamgi_window *window)
284 {
285 GtkWidget *dialog = window->dialog0;
286 GtkWidget *label;
287 GtkWidget *entry;
288
289 /************************
290 * set path, clean file *
291 ************************/
292
293 label = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "label_path");
294 gtk_label_set_text (GTK_LABEL (label), path);
295
296 entry = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "entry_file");
297 gtk_entry_set_text (GTK_ENTRY (entry), "");
298
299 static_list_folders (path, window);
300 static_list_files (path, window);
301 }
302
303 static void static_select_folders (GtkWidget *widget, void *data)
304 {
305 gamgi_window *window = GAMGI_CAST_WINDOW data;
306 GtkWidget *dialog = window->dialog0;
307 GtkTreeSelection *selection;
308 GtkTreeModel *model;
309 GtkTreeIter iter;
310 GtkWidget *button;
311 GtkWidget *label;
312 char pathname[GAMGI_IO_PATHNAME];
313 const char *path;
314 char *name;
315 char *start;
316
317 label = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "label_path");
318 path = gtk_label_get_text (GTK_LABEL (label));
319
320 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
321 if (gtk_tree_selection_get_selected (selection, &model, &iter))
322 {
323 gtk_tree_model_get (model, &iter, 0, &name, -1);
324
325 if (strcmp (name, "..") == 0)
326 {
327 strcpy (pathname, path);
328 start = strrchr (pathname, '/');
329 *start = '\0';
330 start = strrchr (pathname, '/');
331 *(start + 1) = '\0';
332 }
333 else
334 {
335 /*******************************************************
336 * check that path + child->d_name < GAMGI_IO_PATHNAME *
337 *******************************************************/
338
339 sprintf (pathname, "%s%s/", path, name);
340 }
341
342 free (name);
343 static_update (pathname, window);
344 }
345
346 /*****************************************************
347 * click last button as selected dir is the last dir *
348 *****************************************************/
349
350 button = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "button_last");
351 gtk_button_clicked (GTK_BUTTON (button));
352 }
353
354 static void static_select_files (GtkWidget *widget, void *data)
355 {
356 gamgi_window *window = GAMGI_CAST_WINDOW data;
357 GtkWidget *dialog = window->dialog0;
358 GtkTreeSelection *selection;
359 GtkTreeModel *model;
360 GtkTreeIter iter;
361 GtkWidget *entry;
362 char *name;
363
364 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
365 if (gtk_tree_selection_get_selected (selection, &model, &iter))
366 {
367 entry = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "entry_file");
368 gtk_tree_model_get (model, &iter, 0, &name, -1);
369 gtk_entry_set_text (GTK_ENTRY (entry), name);
370 free (name);
371 }
372
373 }
374
375 static void static_places (GtkWidget *widget, void *data)
376 {
377 gamgi_window *window = GAMGI_CAST_WINDOW data;
378 GtkWidget *dialog = window->dialog0;
379 GtkWidget *button;
380 char pathname[GAMGI_IO_PATHNAME];
381
382 button = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "button_root");
383 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) == TRUE)
384 {
385 strcpy (pathname, "/");
386 }
387
388 button = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "button_home");
389 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) == TRUE)
390 {
391 strcpy (pathname, home);
392 }
393
394 button = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "button_current");
395 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) == TRUE)
396 {
397 strcpy (pathname, current);
398 }
399
400 button = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "button_last");
401 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) == TRUE)
402 {
403 strcpy (pathname, last);
404 }
405
406 button = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "button_http");
407 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) == TRUE)
408 {
409 strcpy (pathname, "http://");
410 }
411
412 button = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "button_ftp");
413 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) == TRUE)
414 {
415 strcpy (pathname, "ftp://");
416 }
417
418 static_update (pathname, window);
419 }
420
421 /******************** internal function ****************
422 * *
423 * STATIC_SWITCH *
424 * *
425 * *
426 *******************************************************/
427
428 static void static_switch (GtkNotebook *notebook,
429 GtkNotebookPage *page, int tag, void *data)
430 {
431 gamgi_window *window = GAMGI_CAST_WINDOW data;
432 GtkWidget *dialog = window->dialog0;
433 GtkWidget *label;
434 const char *path;
435
436 /***********************
437 * go back to last dir *
438 ***********************/
439
440 if (tag == 0)
441 {
442 label = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "label_path");
443 path = gtk_label_get_text (GTK_LABEL (label));
444
445 static_list_folders (path, window);
446 static_list_files (path, window);
447 }
448 }
449
450 gamgi_bool gamgi_gtk_file_chooser_ok (gamgi_window *window, char *fullname)
451 {
452 GtkWidget *dialog = window->dialog0;
453 GtkWidget *entry;
454 GtkWidget *label;
455 const char *name;
456 int length;
457
458 /*********************************
459 * the path selected by the user *
460 *********************************/
461
462 label = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "label_path");
463 name = gtk_label_get_text (GTK_LABEL (label));
464 if (gamgi_io_token_alpha_scan (name, fullname,
465 GAMGI_IO_FONT_ASCII, GAMGI_IO_PATHNAME) == FALSE)
466 {
467 gamgi_gtk_dialog_message_create ("Error", "Invalid Filename", window);
468 return FALSE;
469 }
470
471 length = strlen (name);
472
473 /*********************************
474 * the file selected by the user *
475 *********************************/
476
477 entry = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "entry_file");
478 name = gtk_entry_get_text (GTK_ENTRY (entry));
479 if (gamgi_io_token_alpha_scan (name, fullname + length,
480 GAMGI_IO_FONT_ASCII, GAMGI_IO_FULLNAME - length) == FALSE)
481 {
482 gamgi_gtk_dialog_message_create ("Error", "Invalid Filename", window);
483 return FALSE;
484 }
485
486 return TRUE;
487 }
488
489 void gamgi_gtk_file_chooser_init (gamgi_window *window)
490 {
491 GtkWidget *dialog = window->dialog0;
492 GtkWidget *notebook;
493 GtkWidget *button, *button_root, *button_home, *button_current, *button_last;
494 GtkWidget *entry;
495 GtkRequisition size;
496 char *name;
497
498 /****************************************************
499 * set size, in case label_path is too large to fit *
500 ****************************************************/
501
502 gtk_widget_size_request (GTK_WIDGET (dialog), &size);
503 gtk_widget_set_size_request (dialog, size.width, size.height);
504
505 /***********************
506 * start switch signal *
507 ***********************/
508
509 notebook = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "notebook");
510 g_signal_connect (notebook, "switch_page",
511 G_CALLBACK (static_switch), window);
512
513 /*******************
514 * default filters *
515 *******************/
516
517 entry = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "entry_folders_hide");
518 gtk_entry_set_text (GTK_ENTRY (entry), ".*");
519
520 entry = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "entry_files_hide");
521 gtk_entry_set_text (GTK_ENTRY (entry), ".*");
522
523 /*******************************
524 * check and initialize Places *
525 *******************************/
526
527 button_root = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "button_root");
528 button_home = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "button_home");
529 button_current = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "button_current");
530 button_last = (GtkWidget *) g_object_get_data (G_OBJECT (dialog), "button_last");
531
532 name = getenv ("HOME");
533 if (name == NULL || gamgi_io_token_size_check (name,
534 GAMGI_IO_PATHNAME - 1) == FALSE) gtk_widget_set_sensitive (button_home, FALSE);
535 else { strcpy (home, name); strcat (home, "/"); }
536
537 if (getcwd (current, sizeof (current)) == NULL ||
538 gamgi_io_token_size_check (current, GAMGI_IO_PATHNAME - 1) == FALSE)
539 gtk_widget_set_sensitive (button_current, FALSE);
540 else strcat (current, "/");
541
542 if (strcmp (last, "") != 0) button = button_last;
543 else if (gtk_widget_is_sensitive (button_current) == TRUE) button = button_current;
544 else if (gtk_widget_is_sensitive (button_home) == TRUE) button = button_home;
545 else button = button_root;
546
547 gtk_button_clicked (GTK_BUTTON (button));
548 }
549
550 void gamgi_gtk_file_chooser_location (GtkWidget *notebook, gamgi_window *window)
551 {
552 GtkWidget *dialog = window->dialog0;
553 GtkWidget *label;
554 GtkWidget *button;
555 GtkWidget *entry;
556 GtkWidget *frame;
557 GtkWidget *hbox_center, *hbox_left;
558 GtkWidget *vbox_page, *vbox_center, *vbox_top;
559 GtkWidget *scrolled_window;
560 GtkWidget *treeview;
561 GtkCellRenderer *renderer;
562 GtkTreeViewColumn *column;
563 GtkTreeSelection *selection;
564
565 /*****************
566 * Location page *
567 *****************/
568
569 vbox_page = gtk_vbox_new (FALSE, 5);
570 label = gtk_label_new ("Location");
571 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox_page, label);
572 gtk_container_set_border_width (GTK_CONTAINER (vbox_page), 10);
573 gtk_widget_show (vbox_page);
574
575 vbox_center = gtk_vbox_new (TRUE, 0);
576 gtk_box_pack_start (GTK_BOX (vbox_page), vbox_center, TRUE, TRUE, 0);
577 gtk_widget_show (vbox_center);
578
579 vbox_top = gtk_vbox_new (FALSE, 5);
580 gtk_box_pack_start (GTK_BOX (vbox_center), vbox_top, FALSE, FALSE, 0);
581 gtk_widget_show (vbox_top);
582
583 /**********
584 * Places *
585 **********/
586
587 hbox_center = gtk_hbox_new (TRUE, 0);
588 gtk_box_pack_start (GTK_BOX (vbox_top), hbox_center, FALSE, FALSE, 0);
589 gtk_widget_show (hbox_center);
590
591 hbox_left = gtk_hbox_new (FALSE, 10);
592 gtk_box_pack_start (GTK_BOX (hbox_center), hbox_left, FALSE, FALSE, 0);
593 gtk_widget_show (hbox_left);
594
595 label = gtk_label_new ("Places");
596 gtk_box_pack_start (GTK_BOX (hbox_left), label, FALSE, FALSE, 5);
597 gtk_widget_show (label);
598
599 button = gtk_radio_button_new_with_label (NULL, "Root");
600 gtk_box_pack_start (GTK_BOX (hbox_left), button, FALSE, FALSE, 0);
601 g_signal_connect (button, "clicked",
602 G_CALLBACK (static_places), window);
603 g_object_set_data (G_OBJECT (dialog), "button_root", button);
604 gtk_widget_show (button);
605
606 button = gtk_radio_button_new_with_label (
607 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)), "Home");
608 gtk_box_pack_start (GTK_BOX (hbox_left), button, FALSE, FALSE, 0);
609 g_signal_connect (button, "clicked",
610 G_CALLBACK (static_places), window);
611 g_object_set_data (G_OBJECT (dialog), "button_home", button);
612 gtk_widget_show (button);
613
614 button = gtk_radio_button_new_with_label (
615 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)), "Current");
616 gtk_box_pack_start (GTK_BOX (hbox_left), button, FALSE, FALSE, 0);
617 g_signal_connect (button, "clicked",
618 G_CALLBACK (static_places), window);
619 g_object_set_data (G_OBJECT (dialog), "button_current", button);
620 gtk_widget_show (button);
621
622 button = gtk_radio_button_new_with_label (
623 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)), "Last");
624 gtk_box_pack_start (GTK_BOX (hbox_left), button, FALSE, FALSE, 0);
625 g_signal_connect (button, "clicked",
626 G_CALLBACK (static_places), window);
627 g_object_set_data (G_OBJECT (dialog), "button_last", button);
628 gtk_widget_show (button);
629
630 button = gtk_radio_button_new_with_label (
631 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)), "HTTP");
632 gtk_box_pack_start (GTK_BOX (hbox_left), button, FALSE, FALSE, 0);
633 g_signal_connect (button, "clicked",
634 G_CALLBACK (static_places), window);
635 g_object_set_data (G_OBJECT (dialog), "button_http", button);
636 gtk_widget_show (button);
637
638 button = gtk_radio_button_new_with_label (
639 gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)), "FTP");
640 gtk_box_pack_start (GTK_BOX (hbox_left), button, FALSE, FALSE, 0);
641 g_signal_connect (button, "clicked",
642 G_CALLBACK (static_places), window);
643 g_object_set_data (G_OBJECT (dialog), "button_ftp", button);
644 gtk_widget_show (button);
645
646 /******************
647 * Folders, Files *
648 ******************/
649
650 hbox_center = gtk_hbox_new (TRUE, 0);
651 gtk_box_pack_start (GTK_BOX (vbox_top), hbox_center, FALSE, FALSE, 0);
652 gtk_widget_show (hbox_center);
653
654 hbox_left = gtk_hbox_new (FALSE, 10);
655 gtk_box_pack_start (GTK_BOX (hbox_center), hbox_left, FALSE, FALSE, 0);
656 gtk_widget_show (hbox_left);
657
658 frame = gtk_frame_new (NULL);
659 gtk_box_pack_start (GTK_BOX (hbox_left), frame, TRUE, TRUE, 0);
660 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
661 gtk_widget_show (frame);
662
663 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
664 gtk_container_add (GTK_CONTAINER (frame), scrolled_window);
665 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
666 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
667 gtk_widget_show (scrolled_window);
668
669 treeview = gtk_tree_view_new ();
670 gtk_container_add (GTK_CONTAINER (scrolled_window), treeview);
671 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
672 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
673 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), TRUE);
674 gtk_widget_set_size_request (treeview, 300, 250);
675 g_signal_connect (treeview, "cursor-changed",
676 G_CALLBACK (static_select_folders), window);
677 g_object_set_data (G_OBJECT (dialog), "tree_folders", treeview);
678 gtk_widget_show (treeview);
679
680 renderer = gtk_cell_renderer_text_new ();
681 column = gtk_tree_view_column_new_with_attributes ("Folders", renderer, "text", 0, NULL);
682 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
683
684 frame = gtk_frame_new (NULL);
685 gtk_box_pack_start (GTK_BOX (hbox_left), frame, TRUE, TRUE, 0);
686 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
687 gtk_widget_show (frame);
688
689 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
690 gtk_container_add (GTK_CONTAINER (frame), scrolled_window);
691 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
692 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
693 gtk_widget_show (scrolled_window);
694
695 treeview = gtk_tree_view_new ();
696 gtk_container_add (GTK_CONTAINER (scrolled_window), treeview);
697 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
698 gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
699 gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), TRUE);
700 gtk_widget_set_size_request (treeview, 300, 250);
701 g_signal_connect (treeview, "cursor-changed",
702 G_CALLBACK (static_select_files), window);
703 g_object_set_data (G_OBJECT (dialog), "tree_files", treeview);
704 gtk_widget_show (treeview);
705
706 renderer = gtk_cell_renderer_text_new ();
707 column = gtk_tree_view_column_new_with_attributes ("Files", renderer, "text", 0, NULL);
708 gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
709
710 /**************
711 * Path, File *
712 **************/
713
714 hbox_left = gtk_hbox_new (FALSE, 10);
715 gtk_box_pack_start (GTK_BOX (vbox_top), hbox_left, FALSE, FALSE, 0);
716 gtk_widget_show (hbox_left);
717
718 label = gtk_label_new ("Path");
719 gtk_box_pack_start (GTK_BOX (hbox_left), label, FALSE, FALSE, 0);
720 gtk_widget_show (label);
721
722 label = gtk_label_new ("");
723 gtk_box_pack_start (GTK_BOX (hbox_left), label, FALSE, FALSE, 0);
724 g_object_set_data (G_OBJECT (dialog), "label_path", label);
725 gtk_widget_show (label);
726
727 hbox_left = gtk_hbox_new (FALSE, 5);
728 gtk_box_pack_start (GTK_BOX (vbox_top), hbox_left, FALSE, FALSE, 0);
729 gtk_widget_show (hbox_left);
730
731 label = gtk_label_new ("File");
732 gtk_box_pack_start (GTK_BOX (hbox_left), label, FALSE, FALSE, 0);
733 gtk_widget_show (label);
734
735 entry = gtk_entry_new ();
736 gtk_box_pack_start (GTK_BOX (hbox_left), entry, TRUE, TRUE, 0);
737 gtk_entry_set_max_length (GTK_ENTRY (entry), GAMGI_IO_PATHNAME - 1);
738 g_object_set_data (G_OBJECT (dialog), "entry_file", entry);
739 gtk_widget_show (entry);
740 }
741
742 void gamgi_gtk_file_chooser_filters (GtkWidget *notebook, gamgi_window *window)
743 {
744 GtkWidget *dialog = window->dialog0;
745 GtkWidget *label;
746 GtkWidget *entry;
747 GtkWidget *hbox_center, *hbox_left;
748 GtkWidget *vbox_page, *vbox_center, *vbox_top, *vbox_top_top;
749
750 /****************
751 * Filters page *
752 ****************/
753
754 vbox_page = gtk_vbox_new (FALSE, 5);
755 label = gtk_label_new (" Filters ");
756 gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox_page, label);
757 gtk_container_set_border_width (GTK_CONTAINER (vbox_page), 10);
758 gtk_widget_show (vbox_page);
759
760 vbox_center = gtk_vbox_new (TRUE, 0);
761 gtk_box_pack_start (GTK_BOX (vbox_page), vbox_center, TRUE, TRUE, 0);
762 gtk_widget_show (vbox_center);
763
764 vbox_top = gtk_vbox_new (FALSE, 30);
765 gtk_box_pack_start (GTK_BOX (vbox_center), vbox_top, FALSE, FALSE, 0);
766 gtk_widget_show (vbox_top);
767
768 /******************
769 * Folders, Files *
770 ******************/
771
772 hbox_center = gtk_hbox_new (TRUE, 0);
773 gtk_box_pack_start (GTK_BOX (vbox_top), hbox_center, FALSE, FALSE, 0);
774 gtk_widget_show (hbox_center);
775
776 vbox_top_top = gtk_vbox_new (FALSE, 5);
777 gtk_box_pack_start (GTK_BOX (hbox_center), vbox_top_top, FALSE, FALSE, 0);
778 gtk_widget_show (vbox_top_top);
779
780 label = gtk_label_new ("Folders");
781 gtk_box_pack_start (GTK_BOX (vbox_top_top), label, FALSE, FALSE, 0);
782 gtk_widget_show (label);
783
784 hbox_left = gtk_hbox_new (FALSE, 5);
785 gtk_box_pack_start (GTK_BOX (vbox_top_top), hbox_left, FALSE, FALSE, 0);
786 gtk_widget_show (hbox_left);
787
788 label = gtk_label_new (" Hide");
789 gtk_box_pack_start (GTK_BOX (hbox_left), label, FALSE, FALSE, 0);
790 gtk_widget_show (label);
791
792 entry = gtk_entry_new ();
793 gtk_box_pack_start (GTK_BOX (hbox_left), entry, FALSE, FALSE, 0);
794 gtk_entry_set_width_chars (GTK_ENTRY (entry), GAMGI_GTK_FILE_PATTERNS);
795 gtk_entry_set_max_length (GTK_ENTRY (entry), GAMGI_GTK_FILE_PATTERNS);
796 g_object_set_data (G_OBJECT (dialog), "entry_folders_hide", entry);
797 gtk_widget_show (entry);
798
799 hbox_left = gtk_hbox_new (FALSE, 5);
800 gtk_box_pack_start (GTK_BOX (vbox_top_top), hbox_left, FALSE, FALSE, 0);
801 gtk_widget_show (hbox_left);
802
803 label = gtk_label_new ("Show");
804 gtk_box_pack_start (GTK_BOX (hbox_left), label, FALSE, FALSE, 0);
805 gtk_widget_show (label);
806
807 entry = gtk_entry_new ();
808 gtk_box_pack_start (GTK_BOX (hbox_left), entry, FALSE, FALSE, 0);
809 gtk_entry_set_width_chars (GTK_ENTRY (entry), GAMGI_GTK_FILE_PATTERNS);
810 gtk_entry_set_max_length (GTK_ENTRY (entry), GAMGI_GTK_FILE_PATTERNS);
811 g_object_set_data (G_OBJECT (dialog), "entry_folders_show", entry);
812 gtk_widget_show (entry);
813
814 hbox_center = gtk_hbox_new (TRUE, 0);
815 gtk_box_pack_start (GTK_BOX (vbox_top), hbox_center, FALSE, FALSE, 0);
816 gtk_widget_show (hbox_center);
817
818 vbox_top_top = gtk_vbox_new (FALSE, 5);
819 gtk_box_pack_start (GTK_BOX (hbox_center), vbox_top_top, FALSE, FALSE, 0);
820 gtk_widget_show (vbox_top_top);
821
822 label = gtk_label_new ("Files");
823 gtk_box_pack_start (GTK_BOX (vbox_top_top), label, FALSE, FALSE, 0);
824 gtk_widget_show (label);
825
826 hbox_left = gtk_hbox_new (FALSE, 5);
827 gtk_box_pack_start (GTK_BOX (vbox_top_top), hbox_left, FALSE, FALSE, 0);
828 gtk_widget_show (hbox_left);
829
830 label = gtk_label_new (" Hide");
831 gtk_box_pack_start (GTK_BOX (hbox_left), label, FALSE, FALSE, 0);
832 gtk_widget_show (label);
833
834 entry = gtk_entry_new ();
835 gtk_box_pack_start (GTK_BOX (hbox_left), entry, FALSE, FALSE, 0);
836 gtk_entry_set_width_chars (GTK_ENTRY (entry), GAMGI_GTK_FILE_PATTERNS);
837 gtk_entry_set_max_length (GTK_ENTRY (entry), GAMGI_GTK_FILE_PATTERNS);
838 g_object_set_data (G_OBJECT (dialog), "entry_files_hide", entry);
839 gtk_widget_show (entry);
840
841 hbox_left = gtk_hbox_new (FALSE, 5);
842 gtk_box_pack_start (GTK_BOX (vbox_top_top), hbox_left, FALSE, FALSE, 0);
843 gtk_widget_show (hbox_left);
844
845 label = gtk_label_new ("Show");
846 gtk_box_pack_start (GTK_BOX (hbox_left), label, FALSE, FALSE, 0);
847 gtk_widget_show (label);
848
849 entry = gtk_entry_new ();
850 gtk_box_pack_start (GTK_BOX (hbox_left), entry, FALSE, FALSE, 0);
851 gtk_entry_set_width_chars (GTK_ENTRY (entry), GAMGI_GTK_FILE_PATTERNS);
852 gtk_entry_set_max_length (GTK_ENTRY (entry), GAMGI_GTK_FILE_PATTERNS);
853 g_object_set_data (G_OBJECT (dialog), "entry_files_show", entry);
854 gtk_widget_show (entry);
855 }