"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 }