*** gtk/gtkfilesel.c	Thu Sep 25 03:29:12 1997
--- /home/wille/src/gtk+stefan/gtk/gtkfilesel.c	Mon Oct  6 00:50:17 1997
***************
*** 39,45 ****
  #include "gtkscrolledwindow.h"
  #include "gtksignal.h"
  #include "gtkvbox.h"
! 
  
  #define DIR_LIST_WIDTH   160
  #define DIR_LIST_HEIGHT  175
--- 39,48 ----
  #include "gtkscrolledwindow.h"
  #include "gtksignal.h"
  #include "gtkvbox.h"
! #include "gtkhbbox.h"
! #include "gtkpixmap.h"
! #include "dotdot.xpm"
! #include "newdir.xpm"
  
  #define DIR_LIST_WIDTH   160
  #define DIR_LIST_HEIGHT  175
***************
*** 274,287 ****
  static gint gtk_file_selection_dir_button    (GtkWidget             *widget,
  					      GdkEventButton        *event,
  					      gpointer               user_data);
  static void gtk_file_selection_populate      (GtkFileSelection      *fs,
  					      gchar                 *rel_path,
  					      gint                   try_complete);
  static void gtk_file_selection_abort         (GtkFileSelection      *fs);
  static void gtk_file_selection_free_filename (GtkWidget             *widget,
  					      gpointer               client_data);
! 
! 
  static GtkWindowClass *parent_class = NULL;
  
  /* Saves errno when something cmpl does fails. */
--- 277,299 ----
  static gint gtk_file_selection_dir_button    (GtkWidget             *widget,
  					      GdkEventButton        *event,
  					      gpointer               user_data);
+ static void gtk_file_selection_newdir_button  (GtkWidget            *widget,
+ 			                      GtkFileSelection      *file_sel);
+ static void gtk_file_selection_up_button     (GtkWidget             *widget,
+ 			                      GtkFileSelection      *file_sel);
  static void gtk_file_selection_populate      (GtkFileSelection      *fs,
  					      gchar                 *rel_path,
  					      gint                   try_complete);
  static void gtk_file_selection_abort         (GtkFileSelection      *fs);
  static void gtk_file_selection_free_filename (GtkWidget             *widget,
  					      gpointer               client_data);
! static void gtk_file_selection_newdir_cancel (GtkWidget             *widget,
! 					      GtkWidget             *window);
! static void gtk_file_selection_newdir_ok     (GtkWidget             *widget,
! 					      GtkWidget             *window);
! static void gtk_file_selection_label_clear   (GtkWidget             *widget,
! 					      GdkEventFocus         *event,
! 					      GtkLabel              *label);
  static GtkWindowClass *parent_class = NULL;
  
  /* Saves errno when something cmpl does fails. */
***************
*** 332,339 ****
    GtkWidget *listbox;
    GtkWidget *label;
    GtkWidget *list_hbox;
    GtkWidget *action_area;
! 
    filesel->cmpl_state = cmpl_init_state ();
  
    /*  The dialog-sized vertical box  */
--- 344,361 ----
    GtkWidget *listbox;
    GtkWidget *label;
    GtkWidget *list_hbox;
+   GtkWidget *dir_label_hbox;
    GtkWidget *action_area;
!   GtkWidget *bbox;
!   GtkWidget *up_button;
!   GtkWidget *up_xpm;
!   GdkPixmap *up_pixmap;
!   GtkWidget *newdir_button;
!   GtkWidget *newdir_xpm;
!   GdkPixmap *newdir_pixmap;
!   GdkBitmap *mask;
!   GtkStyle  *style;
!   
    filesel->cmpl_state = cmpl_init_state ();
  
    /*  The dialog-sized vertical box  */
***************
*** 353,363 ****
    gtk_box_pack_start (GTK_BOX (list_hbox), dir_vbox, TRUE, TRUE, 0);
    gtk_widget_show (dir_vbox);
  
    label = gtk_label_new ("Directories");
    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
!   gtk_box_pack_start (GTK_BOX (dir_vbox), label, FALSE, FALSE, 0);
    gtk_widget_show (label);
  
    listbox = gtk_scrolled_window_new (NULL, NULL);
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (listbox),
  				  GTK_POLICY_AUTOMATIC,
--- 375,431 ----
    gtk_box_pack_start (GTK_BOX (list_hbox), dir_vbox, TRUE, TRUE, 0);
    gtk_widget_show (dir_vbox);
  
+   /* The horizontal box containing 'Directories' label and 'up' button */
+   dir_label_hbox = gtk_hbox_new (FALSE, 1);
+   gtk_box_pack_start (GTK_BOX (dir_vbox), dir_label_hbox, FALSE, FALSE, 0);
+   gtk_widget_show (dir_label_hbox);
+    
    label = gtk_label_new ("Directories");
    gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
!   gtk_box_pack_start (GTK_BOX (dir_label_hbox), label, FALSE, FALSE, 0);
    gtk_widget_show (label);
  
+   bbox = gtk_hbutton_box_new ();
+   gtk_box_pack_end (GTK_BOX (dir_label_hbox), bbox, FALSE, FALSE, 21);
+   gtk_button_box_set_child_size (GTK_BUTTON_BOX (bbox), 0, 0);
+   gtk_button_box_set_child_ipadding (GTK_BUTTON_BOX (bbox), 0, 0);
+   gtk_button_box_set_spacing (GTK_BUTTON_BOX (bbox), 15);
+   gtk_widget_show (bbox);
+     
+   style = gtk_widget_get_default_style ();
+   
+   filesel->newdir_button = gtk_button_new ();
+   newdir_button = filesel->newdir_button;
+   gtk_container_add (GTK_CONTAINER (bbox), newdir_button);
+   gtk_signal_connect (GTK_OBJECT(newdir_button), "clicked",
+ 		      (GtkSignalFunc) gtk_file_selection_newdir_button,
+ 		      filesel);
+   gtk_widget_show (newdir_button);
+ 
+   newdir_pixmap = gdk_pixmap_create_from_xpm_d (GTK_WIDGET(filesel)->window,
+ 					    &mask,
+ 					    &style->bg[GTK_STATE_NORMAL],
+ 					    newdir);
+   newdir_xpm = gtk_pixmap_new (newdir_pixmap, mask);
+   gtk_container_add (GTK_CONTAINER (newdir_button), newdir_xpm);
+   gtk_widget_show (newdir_xpm);
+   
+   filesel->up_button = gtk_button_new ();
+   up_button = filesel->up_button;
+   gtk_container_add (GTK_CONTAINER (bbox), up_button);
+   gtk_signal_connect (GTK_OBJECT(up_button), "clicked",
+ 		      (GtkSignalFunc) gtk_file_selection_up_button, filesel);
+   gtk_widget_show (up_button);
+ 
+   up_pixmap = gdk_pixmap_create_from_xpm_d (GTK_WIDGET(filesel)->window,
+ 					    &mask,
+ 					    &style->bg[GTK_STATE_NORMAL],
+ 					    dotdot);
+   up_xpm = gtk_pixmap_new (up_pixmap, mask);
+   gtk_container_add (GTK_CONTAINER (up_button), up_xpm);
+   gtk_widget_show (up_xpm);
+ 
+ 	  /* The directories listbox */
    listbox = gtk_scrolled_window_new (NULL, NULL);
    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (listbox),
  				  GTK_POLICY_AUTOMATIC,
***************
*** 603,608 ****
--- 671,821 ----
      }
  
    return FALSE;
+ }
+ 
+ struct NewDirectoryDialog_
+ {
+   GtkWidget *fsel;
+   GtkWidget *entry;
+   GtkWidget *error_label;
+ };
+ 
+ typedef struct NewDirectoryDialog_ NewDirectoryDialog;
+ 
+ static void
+ gtk_file_selection_newdir_button (GtkWidget* widget,
+ 				  GtkFileSelection* file_sel)
+ {
+   GtkWidget *window;
+   GtkWidget *label;
+   GtkWidget *entry;
+   GtkWidget *ok_button;
+   GtkWidget *cancel_button;
+   GtkWidget *bbox;
+   GtkWidget *vbox;
+   GtkWidget *hbox;
+   NewDirectoryDialog* dialog_data;
+ 
+   dialog_data = g_new (NewDirectoryDialog, 1);
+   
+   window = gtk_window_new (GTK_WINDOW_DIALOG);
+   gtk_window_set_title (GTK_WINDOW (window), "New Directory");
+   gtk_container_border_width (GTK_CONTAINER (window), 20);
+   
+   vbox = gtk_vbox_new (FALSE, 10);
+   gtk_container_add (GTK_CONTAINER (window), vbox);
+   gtk_widget_show (vbox);
+   
+   hbox = gtk_hbox_new (FALSE, 10);
+   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+   gtk_widget_show (hbox);
+ 
+   label = gtk_label_new ("New Directory:");
+   gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 1);
+   gtk_widget_show (label);
+ 
+   entry = gtk_entry_new ();
+   gtk_box_pack_end (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+   gtk_widget_show (entry);
+ 
+   dialog_data->error_label = gtk_label_new ("");
+   gtk_box_pack_start (GTK_BOX (vbox), dialog_data->error_label, FALSE, FALSE, 0);
+   gtk_widget_show (dialog_data->error_label);
+   
+   bbox = gtk_hbutton_box_new ();
+   gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, FALSE, 0);
+   gtk_widget_show (bbox);
+ 
+   
+   ok_button = gtk_button_new_with_label ("OK");
+   gtk_container_add (GTK_CONTAINER (bbox), ok_button);
+   gtk_signal_connect (GTK_OBJECT(ok_button), "clicked",
+ 		      (GtkSignalFunc) gtk_file_selection_newdir_ok, window);
+   gtk_widget_show (ok_button);
+ 
+   cancel_button = gtk_button_new_with_label ("Cancel");
+   gtk_container_add (GTK_CONTAINER (bbox), cancel_button);
+   gtk_signal_connect (GTK_OBJECT(cancel_button), "clicked",
+ 		      (GtkSignalFunc) gtk_file_selection_newdir_cancel, window);
+   gtk_widget_show (cancel_button);  
+ 
+   dialog_data->fsel = GTK_WIDGET(file_sel);
+   dialog_data->entry = entry;
+   gtk_object_set_user_data (GTK_OBJECT (window), dialog_data);
+ 
+ 	  /* let error messages disappear when user starts typing */
+   gtk_signal_connect (GTK_OBJECT(entry), "focus_in_event",
+ 		      (GtkSignalFunc) gtk_file_selection_label_clear,
+ 		      dialog_data->error_label);
+ 
+   gtk_window_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
+   gtk_widget_show (window);
+   gtk_grab_add (window);
+ }
+ 
+ static void
+ gtk_file_selection_newdir_cancel (GtkWidget *widget,
+ 				  GtkWidget *window)
+ {
+   gtk_widget_destroy (window);
+ }
+ 
+ 
+ static void
+ gtk_file_selection_newdir_ok (GtkWidget *widget,
+ 			      GtkWidget *window)
+ {
+   NewDirectoryDialog* dialog_data = 0;
+   char* dirname;
+   CompletionState *cmpl_state;
+   char newdir[300];
+   char* errmsg;
+   int err;
+ 
+   g_return_if_fail (widget != 0);
+   g_return_if_fail (window != 0);
+ 
+   dialog_data = (NewDirectoryDialog*)gtk_object_get_user_data (GTK_OBJECT(window));
+   g_return_if_fail (dialog_data != 0);
+ 
+   cmpl_state = (CompletionState*) GTK_FILE_SELECTION(dialog_data->fsel)->cmpl_state;
+   strcpy (newdir, cmpl_reference_position (cmpl_state));
+ 
+   g_return_if_fail (dialog_data->entry != 0);
+   dirname = gtk_entry_get_text (GTK_ENTRY (dialog_data->entry));
+   g_return_if_fail (dirname != 0);
+ 
+   strcat (newdir, "/");
+   strcat (newdir, dirname);
+   err = mkdir (newdir, 0777);
+   if (err)
+     {
+       errmsg = strerror (errno);
+       gtk_label_set (GTK_LABEL (dialog_data->error_label), errmsg);
+     }
+   else
+     {
+       gtk_widget_destroy (window);
+       gtk_file_selection_populate (GTK_FILE_SELECTION(dialog_data->fsel),
+ 				   "./", FALSE);
+       g_free (dialog_data);
+     }  
+ }
+ 
+ static void
+ gtk_file_selection_label_clear (GtkWidget *widget,
+ 				GdkEventFocus *event,
+ 				GtkLabel* label)
+ {
+   gtk_label_set (label, "");
+ }
+ 
+ 
+ static void
+ gtk_file_selection_up_button (GtkWidget* widget,
+ 			      GtkFileSelection* file_sel)
+ {
+   gtk_file_selection_populate (file_sel, "../", FALSE);
  }
  
  static gint
