diff src/utilops.c @ 140:e57b0207e180

editors.c was almost completely rewritten: - centralized template parsing - better control of executed editors - possibility to get editor exit status via callback
author nadvornik
date Sun, 30 Sep 2007 21:10:54 +0000
parents 71e1ebee420e
children 0d1bf3ac6cd8
line wrap: on
line diff
--- a/src/utilops.c	Wed Sep 12 21:17:31 2007 +0000
+++ b/src/utilops.c	Sun Sep 30 21:10:54 2007 +0000
@@ -28,6 +28,7 @@
 #include "ui_fileops.h"
 #include "ui_misc.h"
 #include "ui_tabcomp.h"
+#include "editors.h"
 
 /*
  *--------------------------------------------------------------------------
@@ -333,35 +334,89 @@
  *--------------------------------------------------------------------------
  */
 
+static gint copy_file_ext_cb(gpointer ed, gint flags, GList *list, gpointer data)
+{
+	if ((flags & EDITOR_ERROR_MASK) && !(flags & EDITOR_ERROR_SKIPPED))
+		{
+		FileData *fd = list->data;
+		gchar *title = _("Error copying file");
+		gchar *text = g_strdup_printf(_("%s\nUnable to copy file:\n%s\nto:\n%s"), editor_get_error_str(flags), fd->name, fd->change->dest); 
+		file_util_warning_dialog(title, text, GTK_STOCK_DIALOG_ERROR, NULL);
+		g_free(text);
+		}
+	while (list)
+		{
+		FileData *fd = list->data;
+		if (!(flags & EDITOR_ERROR_MASK))
+			file_maint_copied(fd);
+		file_data_change_info_free(NULL, fd);
+		list = list->next;
+		}
+	return EDITOR_CB_CONTINUE;
+}
+
+
 gint copy_file_ext(FileData *fd)
 {
-	gint ret;
+	gint ok;
 	g_assert(fd->change);
 	if (editor_command[CMD_COPY])
-		ret = start_editor_from_file(CMD_COPY, fd);
+		{
+		ok = !start_editor_from_file_full(CMD_COPY, fd, copy_file_ext_cb, NULL);
+		if (ok) return ok; /* that's all for now, let's continue in callback */
+		}
 	else
-		ret = copy_file(fd->change->source, fd->change->dest);
-
-	if (ret)
+		ok = copy_file(fd->change->source, fd->change->dest);
+
+	if (ok)
 		{
 		file_maint_copied(fd);
 		}
 
 	file_data_change_info_free(NULL, fd);
 		
-	return ret;
+	return ok;
 }
 
+static gint move_file_ext_cb(gpointer ed, gint flags, GList *list, gpointer data)
+{
+	if ((flags & EDITOR_ERROR_MASK) && !(flags & EDITOR_ERROR_SKIPPED))
+		{
+		FileData *fd = list->data;
+		gchar *title = _("Error moving file");
+		gchar *text = g_strdup_printf(_("%s\nUnable to move file:\n%s\nto:\n%s"), editor_get_error_str(flags), fd->name, fd->change->dest); 
+		file_util_warning_dialog(title, text, GTK_STOCK_DIALOG_ERROR, NULL);
+		g_free(text);
+		}
+	while (list)
+		{
+		FileData *fd = list->data;
+		if (!(flags & EDITOR_ERROR_MASK))
+			{
+			file_data_do_change(fd);
+			file_maint_moved(fd, NULL);
+			}
+		file_data_change_info_free(NULL, fd);
+		list = list->next;
+		}
+	return EDITOR_CB_CONTINUE;
+
+}
+
+
 gint move_file_ext(FileData *fd)
 {
-	gint ret;
+	gint ok;
 	g_assert(fd->change);
 	if (editor_command[CMD_MOVE])
-		ret = start_editor_from_file(CMD_MOVE, fd);
+		{
+		ok = !start_editor_from_file_full(CMD_MOVE, fd, move_file_ext_cb, NULL); 
+		if (ok) return ok; /* that's all for now, let's continue in callback */ 
+		}
 	else
-		ret = move_file(fd->change->source, fd->change->dest);
-
-	if (ret)
+		ok = move_file(fd->change->source, fd->change->dest);
+
+	if (ok)
 		{
 		file_data_do_change(fd);
 		file_maint_moved(fd, NULL);
@@ -369,19 +424,46 @@
 
 	file_data_change_info_free(NULL, fd);
 		
-	return ret;
+	return ok;
+}
+
+static gint rename_file_ext_cb(gpointer ed, gint flags, GList *list, gpointer data)
+{
+	if ((flags & EDITOR_ERROR_MASK) && !(flags & EDITOR_ERROR_SKIPPED))
+		{
+		FileData *fd = list->data;
+		gchar *title = _("Error renaming file");
+		gchar *text = g_strdup_printf(_("%s\nUnable to rename file:\n%s\nto:\n%s"), editor_get_error_str(flags), fd->name, fd->change->dest); 
+		file_util_warning_dialog(title, text, GTK_STOCK_DIALOG_ERROR, NULL);
+		g_free(text);
+		}
+	while (list)
+		{
+		FileData *fd = list->data;
+		if (!(flags & EDITOR_ERROR_MASK))
+			{
+			file_data_do_change(fd);
+			file_maint_renamed(fd);
+			}
+		file_data_change_info_free(NULL, fd);
+		list = list->next;
+		}
+	return EDITOR_CB_CONTINUE;
 }
 
 gint rename_file_ext(FileData *fd)
 {
-	gint ret;
+	gint ok;
 	g_assert(fd->change);
 	if (editor_command[CMD_RENAME])
-		ret = start_editor_from_file(CMD_RENAME, fd);
+		{
+		ok = !start_editor_from_file_full(CMD_RENAME, fd, rename_file_ext_cb, NULL);
+		if (ok) return ok; /* that's all for now, let's continue in callback */
+		}
 	else
-		ret = rename_file(fd->change->source, fd->change->dest);
+		ok = rename_file(fd->change->source, fd->change->dest);
 			
-	if (ret)
+	if (ok)
 		{
 		file_data_do_change(fd);
 		file_maint_renamed(fd);
@@ -389,7 +471,7 @@
 		
 	file_data_change_info_free(NULL, fd);
 		
-	return ret;
+	return ok;
 }
 
 
@@ -1386,26 +1468,81 @@
 static void file_util_delete_multiple_ok_cb(GenericDialog *gd, gpointer data);
 static void file_util_delete_multiple_cancel_cb(GenericDialog *gd, gpointer data);
 
+static void file_util_delete_ext_ok_cb(GenericDialog *gd, gpointer data)
+{
+	editor_resume(data);
+}
+
+static void file_util_delete_ext_cancel_cb(GenericDialog *gd, gpointer data)
+{
+	editor_skip(data);
+}
+
+
+static gint file_util_delete_ext_cb(gpointer resume_data, gint flags, GList *list, gpointer data)
+{
+	gint ret = EDITOR_CB_CONTINUE;
+	if ((flags & EDITOR_ERROR_MASK) && !(flags & EDITOR_ERROR_SKIPPED))
+		{
+			GString *msg = g_string_new(editor_get_error_str(flags));
+			g_string_append(msg,_("\nUnable to delete file by external command:\n")); 
+			GenericDialog *d;
+			while (list)
+				{
+				FileData *fd = list->data;
+				
+				g_string_append(msg, fd->path);
+				g_string_append(msg, "\n");
+				list = list->next;
+				}
+			if (resume_data)
+				{
+				g_string_append(msg, _("\n Continue multiple delete operation?"));
+				d = file_util_gen_dlg(_("Delete failed"), "GQview", "dlg_confirm",
+						      NULL, TRUE,
+						      file_util_delete_ext_cancel_cb, resume_data);
+
+				generic_dialog_add_message(d, GTK_STOCK_DIALOG_WARNING, NULL, msg->str);
+
+				generic_dialog_add_button(d, GTK_STOCK_GO_FORWARD, _("Co_ntinue"),
+							  file_util_delete_ext_ok_cb, TRUE);
+				gtk_widget_show(d->dialog);
+				ret = EDITOR_CB_SUSPEND;
+				}
+			else
+				{
+				file_util_warning_dialog(_("Delete failed"), msg->str, GTK_STOCK_DIALOG_ERROR, NULL);
+				}
+			g_string_free(msg, TRUE);
+		}
+	
+	if (!(flags & EDITOR_ERROR_MASK))
+		{
+		/* files were successfully deleted, call the maint functions */
+		while (list)
+			{
+			FileData *fd = list->data;
+			file_maint_removed(fd, list);
+			list = list->next;
+			}
+		}
+	return ret;
+}
+
 static void file_util_delete_multiple_ok_cb(GenericDialog *gd, gpointer data)
 {
 	GList *source_list = data;
 
 	if (editor_command[CMD_DELETE])
 		{
-		if (!start_editor_from_filelist(CMD_DELETE, source_list))
-			{
-			file_util_warning_dialog(_("File deletion failed"), _("Unable to delete files by external command\n"), GTK_STOCK_DIALOG_ERROR, NULL);
-			}
-		else
+		gint flags;
+		if ((flags = start_editor_from_filelist_full(CMD_DELETE, source_list, file_util_delete_ext_cb, NULL)))
 			{
-			while (source_list)
-				{
-				FileData *fd = source_list->data;
-				source_list = g_list_remove(source_list, fd);
-				file_maint_removed(fd, source_list);
-				file_data_unref(fd);
-				}
+			gchar *text = g_strdup_printf(_("%s\nUnable to delete files by external command.\n"), editor_get_error_str(flags)); 
+			file_util_warning_dialog(_("File deletion failed"), text, GTK_STOCK_DIALOG_ERROR, NULL);
+			g_free(text);
 			}
+		filelist_free(source_list);
 		return;
 		}
 
@@ -1612,16 +1749,13 @@
 
 	if (editor_command[CMD_DELETE])
 		{
-		if (!start_editor_from_file(CMD_DELETE, fd))
+		gint flags;
+		if ((flags = start_editor_from_file_full(CMD_DELETE, fd, file_util_delete_ext_cb, NULL)))
 			{
-			gchar *text = g_strdup_printf(_("Unable to delete file by external command:\n%s"), fd->path);
+			gchar *text = g_strdup_printf(_("%s\nUnable to delete file by external command:\n%s"), editor_get_error_str(flags), fd->path);
 			file_util_warning_dialog(_("File deletion failed"), text, GTK_STOCK_DIALOG_ERROR, NULL);
 			g_free(text);
 			}
-		else
-			{
-			file_maint_removed(fd, NULL);
-			}
 		}
 	else if (!file_util_unlink(fd))
 		{