19 typedef struct _FileDataMult FileDataMult;
33 typedef struct _FileDataSingle FileDataSingle;
34 struct _FileDataSingle
42 static FileDataMult *file_data_multiple_new(GList *source_list, gchar *dest, gint copy);
43 static void file_data_multiple_free(FileDataMult *fdm);
44 static void file_util_move_multiple(FileDataMult *fdm);
45 static void file_util_move_multiple_ok_cb(GtkWidget *widget, gpointer data);
46 static void file_util_move_multiple_all_cb(GtkWidget *widget, gpointer data);
47 static void file_util_move_multiple_skip_cb(GtkWidget *widget, gpointer data);
48 static void file_util_move_multiple_cancel_cb(GtkWidget *widget, gpointer data);
49 static void file_util_move_multiple(FileDataMult *fdm);
51 static FileDataSingle *file_data_single_new(gchar *source, gchar *dest, gint copy);
52 static void file_data_single_free(FileDataSingle *fds);
53 static void file_util_move_single_ok_cb(GtkWidget *widget, gpointer data);
54 static void file_util_move_single(FileDataSingle *fds);
55 static void file_util_move_single_cancel_cb(GtkWidget *widget, gpointer data);
56 static void file_util_move_do(FileDialog *fd);
57 static void file_util_move_check(FileDialog *fd);
58 static void file_util_move_cb(GtkWidget *widget, gpointer data);
59 static void file_util_move_enter_cb(gchar *path, gpointer data);
60 static void file_util_move_completion_sync_cb(gchar *path, gpointer data);
61 static void real_file_util_move(gchar *source_path, GList *source_list, gchar *dest_path, gint copy);
63 static void file_util_delete_multiple_ok_cb(GtkWidget *w, gpointer data);
64 static void file_util_delete_multiple_cancel_cb(GtkWidget *w, gpointer data);
65 static void file_util_delete_multiple(GList *source_list);
66 static void file_util_delete_ok_cb(GtkWidget *w, gpointer data);
67 static void file_util_delete_cancel_cb(GtkWidget *w, gpointer data);
68 static void file_util_delete_single(gchar *path);
70 static void file_util_rename_multiple_ok_cb(GtkWidget *w, gpointer data);
71 static void file_util_rename_multiple_cancel_cb(GtkWidget *w, gpointer data);
72 static void file_util_rename_multiple(FileDialog *fd);
73 static void file_util_rename_multiple_cb(GtkWidget *w, gpointer data);
74 static void file_util_rename_multiple_select_cb(GtkWidget *clist,
75 gint row, gint column, GdkEventButton *bevent, gpointer data);
76 static void file_util_rename_multiple_do(GList *source_list);
78 static void file_util_rename_single_ok_cb(GtkWidget *w, gpointer data);
79 static void file_util_rename_single_cancel_cb(GtkWidget *w, gpointer data);
80 static void file_util_rename_single(FileDataSingle *fds);
81 static void file_util_rename_single_cb(GtkWidget *w, gpointer data);
82 static void file_util_rename_single_do(gchar *source_path);
84 static void file_util_create_dir_do(gchar *source, gchar *path);
85 static void file_util_create_dir_cb(GtkWidget *w, gpointer data);
88 *--------------------------------------------------------------------------
89 * Move and Copy routines
90 *--------------------------------------------------------------------------
97 static FileDataMult *file_data_multiple_new(GList *source_list, gchar *dest, gint copy)
99 FileDataMult *fdm = g_new0(FileDataMult, 1);
100 fdm->confirm_all = FALSE;
101 fdm->confirmed = FALSE;
103 fdm->source_list = source_list;
104 fdm->source_next = fdm->source_list;
105 fdm->dest_base = g_strdup(dest);
112 static void file_data_multiple_free(FileDataMult *fdm)
114 free_selected_list(fdm->source_list);
115 g_free(fdm->dest_base);
120 static void file_util_move_multiple_ok_cb(GtkWidget *widget, gpointer data)
122 FileDataMult *fdm = data;
123 fdm->confirmed = TRUE;
124 file_util_move_multiple(fdm);
127 static void file_util_move_multiple_all_cb(GtkWidget *widget, gpointer data)
129 FileDataMult *fdm = data;
130 fdm->confirm_all = TRUE;
131 file_util_move_multiple(fdm);
134 static void file_util_move_multiple_skip_cb(GtkWidget *widget, gpointer data)
136 FileDataMult *fdm = data;
138 file_util_move_multiple(fdm);
141 static void file_util_move_multiple_cancel_cb(GtkWidget *widget, gpointer data)
143 FileDataMult *fdm = data;
144 file_data_multiple_free(fdm);
147 static void file_util_move_multiple(FileDataMult *fdm)
149 while (fdm->dest || fdm->source_next)
153 GList *work = fdm->source_next;
154 fdm->source = work->data;
155 fdm->dest = g_strconcat(fdm->dest_base, "/", filename_from_path(fdm->source), NULL);
156 fdm->source_next = work->next;
159 if (fdm->dest && fdm->source && strcmp(fdm->dest, fdm->source) == 0)
166 title = _("Source to copy matches destination");
167 text = g_strdup_printf(_("Unable to copy file:\n%s\nto itself."), fdm->dest);
171 title = _("Source to move matches destination");
172 text = g_strdup_printf(_("Unable to move file:\n%s\nto itself."), fdm->dest);
174 cd = confirm_dialog_new(title, text, file_util_move_multiple_cancel_cb, fdm);
175 confirm_dialog_add(cd, _("Continue"), file_util_move_multiple_skip_cb);
179 else if (isfile(fdm->dest) && !fdm->confirmed && !fdm->confirm_all && !fdm->skip)
182 gchar *text = g_strdup_printf(_("Overwrite file:\n %s\n with:\b %s"), fdm->dest, fdm->source);
183 cd = confirm_dialog_new_with_image(_("Overwrite file"), text,
184 fdm->dest, fdm->source,
185 file_util_move_multiple_cancel_cb, fdm);
186 confirm_dialog_add(cd, _("Skip"), file_util_move_multiple_skip_cb);
187 confirm_dialog_add(cd, _("Yes to all"), file_util_move_multiple_all_cb);
188 confirm_dialog_add(cd, _("Yes"), file_util_move_multiple_ok_cb);
194 gint success = FALSE;
204 success = copy_file(fdm->source, fdm->dest);
208 if (move_file(fdm->source, fdm->dest))
211 file_is_gone(fdm->source, fdm->source_list);
222 title = _("Error copying file");
223 text = g_strdup_printf(_("Unable to copy file:\n%sto:\n%s\n during multiple file copy."), fdm->source, fdm->dest);
227 title = _("Error moving file");
228 text = g_strdup_printf(_("Unable to move file:\n%sto:\n%s\n during multiple file move."), fdm->source, fdm->dest);
230 cd = confirm_dialog_new(title, text, file_util_move_multiple_cancel_cb, fdm);
231 confirm_dialog_add(cd, _("Continue"), file_util_move_multiple_skip_cb);
235 fdm->confirmed = FALSE;
241 file_data_multiple_free(fdm);
248 static FileDataSingle *file_data_single_new(gchar *source, gchar *dest, gint copy)
250 FileDataSingle *fds = g_new0(FileDataSingle, 1);
251 fds->confirmed = FALSE;
252 fds->source = g_strdup(source);
253 fds->dest = g_strdup(dest);
258 static void file_data_single_free(FileDataSingle *fds)
265 static void file_util_move_single_ok_cb(GtkWidget *widget, gpointer data)
267 FileDataSingle *fds = data;
268 fds->confirmed = TRUE;
269 file_util_move_single(fds);
272 static void file_util_move_single_cancel_cb(GtkWidget *widget, gpointer data)
274 FileDataSingle *fds = data;
275 file_data_single_free(fds);
278 static void file_util_move_single(FileDataSingle *fds)
280 if (fds->dest && fds->source && strcmp(fds->dest, fds->source) == 0)
282 warning_dialog(_("Source matches destination"),
283 _("Source and destination are the same, operation cancelled."));
285 else if (isfile(fds->dest) && !fds->confirmed)
288 gchar *text = g_strdup_printf(_("Overwrite file:\n%s\n with:\n%s"), fds->dest, fds->source);
289 cd = confirm_dialog_new_with_image(_("Overwrite file"), text,
290 fds->dest, fds->source,
291 file_util_move_single_cancel_cb, fds);
292 confirm_dialog_add(cd, _("Overwrite"), file_util_move_single_ok_cb);
298 gint success = FALSE;
301 success = copy_file(fds->source, fds->dest);
305 if (move_file(fds->source, fds->dest))
308 file_is_gone(fds->source, NULL);
317 title = _("Error copying file");
318 text = g_strdup_printf(_("Unable to copy file:\n%s\nto:\n%s"), fds->source, fds->dest);
322 title = _("Error moving file");
323 text = g_strdup_printf(_("Unable to move file:\n%s\nto:\n%s"), fds->source, fds->dest);
325 warning_dialog(title, text);
330 file_data_single_free(fds);
337 static void file_util_move_do(FileDialog *fd)
339 tab_completion_append_to_history(fd->entry, fd->dest_path);
340 if (fd->multiple_files)
342 file_util_move_multiple(file_data_multiple_new(fd->source_list, fd->dest_path, fd->type));
343 fd->source_list = NULL;
347 if (isdir(fd->dest_path))
349 gchar *buf = g_strconcat(fd->dest_path, "/", filename_from_path(fd->source_path), NULL);
350 g_free(fd->dest_path);
353 file_util_move_single(file_data_single_new(fd->source_path, fd->dest_path, fd->type));
356 generic_dialog_close(NULL, fd);
359 static void file_util_move_check(FileDialog *fd)
361 g_free(fd->dest_path);
362 fd->dest_path = remove_trailing_slash(gtk_entry_get_text(GTK_ENTRY(fd->entry)));
364 if (fd->multiple_files && !isdir(fd->dest_path))
366 if (isfile(fd->dest_path))
367 warning_dialog(_("Invalid destination"), _("When operating with multiple files, please select\n a directory, not file."));
369 warning_dialog(_("Invalid directory"), _("Please select an existing directory"));
373 file_util_move_do(fd);
376 static void file_util_move_cb(GtkWidget *widget, gpointer data)
378 FileDialog *fd = data;
379 file_util_move_check(fd);
382 static void file_util_move_enter_cb(gchar *path, gpointer data)
384 FileDialog *fd = data;
385 file_util_move_check(fd);
388 static void file_util_move_completion_sync_cb(gchar *path, gpointer data)
390 FileDialog *fd = data;
391 destination_widget_sync_to_entry(fd->entry);
394 static void real_file_util_move(gchar *source_path, GList *source_list, gchar *dest_path, gint copy)
406 if (!source_path && !source_list) return;
410 path = g_strdup(source_path);
413 else if (source_list->next)
419 path = g_strdup(source_list->data);
420 free_selected_list(source_list);
427 title = _("GQview - copy");
430 text = g_strdup_printf(_("Copy file:\n%s\nto:"), path);
432 text = g_strdup_printf(_("Copy multiple files from:\n%s\nto:"), dest_path);
436 title = _("GQview - move");
439 text = g_strdup_printf(_("Move file:\n%s\nto:"), path);
441 text = g_strdup_printf(_("Move multiple files from:\n%s\nto:"), dest_path);
444 fd = generic_dialog_new(title, text, op_text, _("Cancel"),
445 file_util_move_cb, generic_dialog_close);
450 fd->source_path = path;
451 fd->source_list = source_list;
452 fd->multiple_files = multiple;
454 tabcomp = tab_completion_new_with_history(&fd->entry, fd->dialog, dest_path,
455 "move_copy", 32, file_util_move_enter_cb, fd);
456 last_path = tab_completion_set_to_last_history(fd->entry);
459 fd->dest_path = g_strdup(last_path);
463 fd->dest_path = g_strdup(dest_path);
466 /* tabcomp = tab_completion_new(&fd->entry, fd->dialog, fd->dest_path, file_util_move_enter_cb, fd);
468 gtk_box_pack_start(GTK_BOX(fd->vbox), tabcomp, FALSE, FALSE, 0);
469 gtk_widget_show(tabcomp);
471 gtk_widget_grab_focus(fd->entry);
473 dest = destination_widget_new(fd->dest_path, fd->entry);
475 tab_completion_add_tab_func(fd->entry, file_util_move_completion_sync_cb, fd);
477 gtk_box_pack_start(GTK_BOX(fd->vbox), dest, TRUE, TRUE, 0);
480 void file_util_move(gchar *source_path, GList *source_list, gchar *dest_path)
482 real_file_util_move(source_path, source_list, dest_path, FALSE);
485 void file_util_copy(gchar *source_path, GList *source_list, gchar *dest_path)
487 real_file_util_move(source_path, source_list, dest_path, TRUE);
491 *--------------------------------------------------------------------------
493 *--------------------------------------------------------------------------
497 * delete multiple files
500 static void file_util_delete_multiple_ok_cb(GtkWidget *w, gpointer data)
502 GList *source_list = data;
506 gchar *path = source_list->data;
507 source_list = g_list_remove(source_list, path);
508 if (unlink (path) < 0)
514 text = g_strdup_printf(_("Unable to delete file:\n %s\n Continue multiple delete operation?"), path);
515 cd = confirm_dialog_new(_("Delete failed"), text, file_util_delete_multiple_cancel_cb, source_list);
516 confirm_dialog_add(cd, _("Continue"), file_util_delete_multiple_ok_cb);
520 text = g_strdup_printf(_("Unable to delete file:\n%s"), path);
521 warning_dialog(_("Delete failed"), text);
529 file_is_gone(path, source_list);
535 static void file_util_delete_multiple_cancel_cb(GtkWidget *w, gpointer data)
537 GList *source_list = data;
538 free_selected_list(source_list);
541 static void file_util_delete_multiple(GList *source_list)
545 file_util_delete_multiple_ok_cb(NULL, source_list);
550 cd = confirm_dialog_new(_("Delete files"), _("About to delete multiple files..."), file_util_delete_multiple_cancel_cb, source_list);
551 confirm_dialog_add(cd, _("Delete"), file_util_delete_multiple_ok_cb);
559 static void file_util_delete_ok_cb(GtkWidget *w, gpointer data)
563 if (unlink (path) < 0)
565 gchar *text = g_strdup_printf(_("Unable to delete file:\n%s"), path);
566 warning_dialog(_("File deletion failed"), text);
571 file_is_gone(path, NULL);
577 static void file_util_delete_cancel_cb(GtkWidget *w, gpointer data)
583 static void file_util_delete_single(gchar *path)
585 gchar *buf = g_strdup(path);
589 file_util_delete_ok_cb(NULL, buf);
594 gchar *text = g_strdup_printf(_("About to delete the file:\n %s"), buf);
595 cd = confirm_dialog_new(_("Delete file"), text, file_util_delete_cancel_cb, buf);
596 confirm_dialog_add(cd, _("Delete"), file_util_delete_ok_cb);
601 void file_util_delete(gchar *source_path, GList *source_list)
603 if (!source_path && !source_list) return;
607 file_util_delete_single(source_path);
609 else if (!source_list->next)
611 file_util_delete_single(source_list->data);
612 free_selected_list(source_list);
616 file_util_delete_multiple(source_list);
621 *--------------------------------------------------------------------------
623 *--------------------------------------------------------------------------
627 * rename multiple files
630 static void file_util_rename_multiple_ok_cb(GtkWidget *w, gpointer data)
632 FileDialog *fd = data;
633 if (!GTK_WIDGET_VISIBLE(fd->dialog)) gtk_widget_show(fd->dialog);
635 file_util_rename_multiple(fd);
638 static void file_util_rename_multiple_cancel_cb(GtkWidget *w, gpointer data)
640 FileDialog *fd = data;
641 if (!GTK_WIDGET_VISIBLE(fd->dialog)) gtk_widget_show(fd->dialog);
645 static void file_util_rename_multiple(FileDialog *fd)
647 if (isfile(fd->dest_path) && !fd->type)
650 gchar *text = g_strdup_printf(_("Overwrite file:\n%s\nby renaming:\n%s"), fd->dest_path, fd->source_path);
651 cd = confirm_dialog_new_with_image(_("Overwrite file"), text,
652 fd->dest_path, fd->source_path,
653 file_util_rename_multiple_cancel_cb, fd);
654 confirm_dialog_add(cd, _("Overwrite"), file_util_rename_multiple_ok_cb);
656 gtk_widget_hide(fd->dialog);
661 if (rename (fd->source_path, fd->dest_path) < 0)
663 gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\n to:\n%s"), filename_from_path(fd->source_path), filename_from_path(fd->dest_path));
664 warning_dialog(_("Error renaming file"), text);
674 file_is_renamed(fd->source_path, fd->dest_path);
676 clist = gtk_object_get_user_data(GTK_OBJECT(fd->entry));
677 path = gtk_object_get_user_data(GTK_OBJECT(clist));
678 row = gtk_clist_find_row_from_data(GTK_CLIST(clist), path);
680 n = g_list_length(GTK_CLIST(clist)->row_list);
681 if (debug) printf("r=%d n=%d\n", row, n);
691 gtk_object_set_user_data(GTK_OBJECT(clist), NULL);
692 gtk_clist_remove(GTK_CLIST(clist), row);
693 gtk_clist_select_row(GTK_CLIST(clist), n, -1);
697 if (debug) printf("closed by #%d\n", n);
698 generic_dialog_close(NULL, fd);
704 static void file_util_rename_multiple_cb(GtkWidget *w, gpointer data)
706 FileDialog *fd = data;
710 name = gtk_entry_get_text(GTK_ENTRY(fd->entry));
711 base = remove_level_from_path(fd->source_path);
712 g_free(fd->dest_path);
713 fd->dest_path = g_strconcat(base, "/", name, NULL);
716 if (strlen(name) == 0 || strcmp(fd->source_path, fd->dest_path) == 0)
722 file_util_rename_multiple(fd);
725 static void file_util_rename_multiple_select_cb(GtkWidget *clist,
726 gint row, gint column, GdkEventButton *bevent, gpointer data)
728 FileDialog *fd = data;
733 label = gtk_object_get_user_data(GTK_OBJECT(fd->dialog));
734 path = gtk_clist_get_row_data(GTK_CLIST(clist), row);
735 g_free(fd->source_path);
736 fd->source_path = g_strdup(path);
737 gtk_object_set_user_data(GTK_OBJECT(clist), path);
738 name = filename_from_path(fd->source_path);
740 gtk_label_set(GTK_LABEL(label), name);
741 gtk_entry_set_text(GTK_ENTRY(fd->entry), name);
743 gtk_widget_grab_focus(fd->entry);
746 static void file_util_rename_multiple_do(GList *source_list)
754 fd = generic_dialog_new(_("GQview - rename"), _("Rename multiple files:"), _("Rename"), _("Cancel"),
755 file_util_rename_multiple_cb, generic_dialog_close);
757 fd->source_path = g_strdup(source_list->data);
758 fd->dest_path = NULL;
760 scrolled = gtk_scrolled_window_new(NULL, NULL);
761 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
762 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
763 gtk_box_pack_start(GTK_BOX(fd->vbox), scrolled, TRUE, TRUE, 0);
764 gtk_widget_show(scrolled);
766 clist=gtk_clist_new (1);
767 gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 0, TRUE);
768 gtk_signal_connect (GTK_OBJECT (clist), "select_row",(GtkSignalFunc) file_util_rename_multiple_select_cb, fd);
769 gtk_widget_set_usize(clist, 250, 150);
770 gtk_container_add (GTK_CONTAINER (scrolled), clist);
771 gtk_widget_show (clist);
773 gtk_object_set_user_data(GTK_OBJECT(clist), source_list->data);
780 buf[0] = filename_from_path(work->data);
782 row = gtk_clist_append(GTK_CLIST(clist), buf);
783 gtk_clist_set_row_data_full(GTK_CLIST(clist), row,
784 work->data, (GtkDestroyNotify) g_free);
788 g_list_free(source_list);
790 label = gtk_label_new(_("Rename:"));
791 gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0);
792 gtk_widget_show(label);
794 label = gtk_label_new(filename_from_path(fd->source_path));
795 gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0);
796 gtk_widget_show(label);
797 gtk_object_set_user_data(GTK_OBJECT(fd->dialog), label);
799 label = gtk_label_new(_("to:"));
800 gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0);
801 gtk_widget_show(label);
803 fd->entry = gtk_entry_new();
804 gtk_entry_set_text(GTK_ENTRY(fd->entry), filename_from_path(fd->source_path));
805 gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0);
806 gtk_widget_grab_focus(fd->entry);
807 gtk_widget_show(fd->entry);
809 gtk_object_set_user_data(GTK_OBJECT(fd->entry), clist);
816 static void file_util_rename_single_ok_cb(GtkWidget *w, gpointer data)
818 FileDataSingle *fds = data;
819 fds->confirmed = TRUE;
820 file_util_rename_single(fds);
823 static void file_util_rename_single_cancel_cb(GtkWidget *w, gpointer data)
825 FileDataSingle *fds = data;
826 file_data_single_free(fds);
829 static void file_util_rename_single(FileDataSingle *fds)
831 if (isfile(fds->dest) && !fds->confirmed)
834 gchar *text = g_strdup_printf(_("Overwrite file:\n%s\nby renaming:\n%s"), fds->dest,fds->source);
835 cd = confirm_dialog_new_with_image(_("Overwrite file"), text,
836 fds->dest, fds->source,
837 file_util_rename_single_cancel_cb, fds);
838 confirm_dialog_add(cd, _("Overwrite"), file_util_rename_single_ok_cb);
844 if (rename (fds->source, fds->dest) < 0)
846 gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\nto:\n%s"), filename_from_path(fds->source), filename_from_path(fds->dest));
847 warning_dialog(_("Error renaming file"), text);
852 file_is_renamed(fds->source, fds->dest);
855 file_data_single_free(fds);
858 static void file_util_rename_single_cb(GtkWidget *w, gpointer data)
860 FileDialog *fd = data;
861 gchar *name = gtk_entry_get_text(GTK_ENTRY(fd->entry));
862 gchar *buf = g_strconcat(fd->dest_path, "/", name, NULL);
864 if (strlen(name) == 0 || strcmp(fd->source_path, buf) == 0)
870 g_free(fd->dest_path);
873 file_util_rename_single(file_data_single_new(fd->source_path, fd->dest_path, fd->type));
875 generic_dialog_close(NULL, fd);
878 static void file_util_rename_single_do(gchar *source_path)
882 gchar *name = filename_from_path(source_path);
884 text = g_strdup_printf(_("Rename file:\n%s\nto:"), name);
885 fd = generic_dialog_new(_("GQview - rename"), text, _("Rename"), _("Cancel"),
886 file_util_rename_single_cb, generic_dialog_close);
889 fd->source_path = g_strdup(source_path);
890 fd->dest_path = remove_level_from_path(source_path);
892 fd->entry = gtk_entry_new();
893 gtk_entry_set_text(GTK_ENTRY(fd->entry), name);
894 gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0);
895 gtk_widget_grab_focus(fd->entry);
896 gtk_widget_show(fd->entry);
899 void file_util_rename(gchar *source_path, GList *source_list)
901 if (!source_path && !source_list) return;
905 file_util_rename_single_do(source_path);
907 else if (!source_list->next)
909 file_util_rename_single_do(source_list->data);
910 free_selected_list(source_list);
914 file_util_rename_multiple_do(source_list);
919 *--------------------------------------------------------------------------
920 * Create directory routines
921 *--------------------------------------------------------------------------
924 static void file_util_create_dir_do(gchar *source, gchar *path)
928 gchar *text = g_strdup_printf(_("The path:\n%s\nalready exists as a file."), filename_from_path(path));
929 warning_dialog(_("Could not create directory"), text);
932 else if (isdir(path))
934 gchar *text = g_strdup_printf(_("The directory:\n%s\nalready exists."), filename_from_path(path));
935 warning_dialog(_("Directory exists"), text);
940 if (mkdir (path, 0755) < 0)
942 gchar *text = g_strdup_printf(_("Unable to create directory:\n%s"), filename_from_path(path));
943 warning_dialog(_("Error creating directory"), text);
948 if (strcmp(source, current_path) == 0)
950 gchar *buf = g_strdup(current_path);
951 filelist_change_to(buf);
958 static void file_util_create_dir_cb(GtkWidget *w, gpointer data)
960 FileDialog *fd = data;
961 gchar *name = gtk_entry_get_text(GTK_ENTRY(fd->entry));
963 if (strlen(name) == 0) return;
965 g_free(fd->dest_path);
966 fd->dest_path = g_strconcat(fd->source_path, "/", name, NULL);
968 file_util_create_dir_do(fd->source_path, fd->dest_path);
970 generic_dialog_close(NULL, fd);
973 void file_util_create_dir(gchar *path)
979 if (!isdir(path)) return;
980 name = filename_from_path(path);
982 text = g_strdup_printf(_("Create directory in:\n%s\nnamed:"), path);
983 fd = generic_dialog_new(_("GQview - new directory"), text, _("Create"), _("Cancel"),
984 file_util_create_dir_cb, generic_dialog_close);
987 fd->source_path = g_strdup(path);
988 fd->dest_path = NULL;
990 fd->entry = gtk_entry_new();
991 gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0);
992 gtk_widget_grab_focus(fd->entry);
993 gtk_widget_show(fd->entry);