finally implement file renaming when an overwrite is detected

ticket #1269


SVN revision: 76413
This commit is contained in:
Mike Blumenkrantz 2012-09-10 14:40:29 +00:00
parent f59fa03035
commit 7335a904ce
1 changed files with 78 additions and 0 deletions

View File

@ -96,6 +96,7 @@ struct _E_Fm2_Smart_Data
Ecore_Job *resize_job;
Ecore_Job *refresh_job;
E_Menu *menu;
Eina_List *rename_dialogs;
E_Entry_Dialog *entry_dialog;
E_Dialog *image_dialog;
Eina_Bool iconlist_changed : 1;
@ -388,6 +389,7 @@ static void _e_fm_retry_abort_abort_cb(void *data, E_Dialog *dialog);
static E_Dialog *_e_fm_overwrite_dialog(int pid, const char *str);
static void _e_fm_overwrite_no_cb(void *data, E_Dialog *dialog);
static void _e_fm_overwrite_no_all_cb(void *data, E_Dialog *dialog);
static void _e_fm_overwrite_rename(void *data, E_Dialog *dialog);
static void _e_fm_overwrite_yes_cb(void *data, E_Dialog *dialog);
static void _e_fm_overwrite_yes_all_cb(void *data, E_Dialog *dialog);
@ -7966,6 +7968,7 @@ _e_fm2_smart_del(Evas_Object *obj)
e_object_del(E_OBJECT(sd->image_dialog));
sd->image_dialog = NULL;
}
E_FREE_LIST(sd->rename_dialogs, e_object_del);
if (sd->scroll_job) ecore_job_del(sd->scroll_job);
if (sd->resize_job) ecore_job_del(sd->resize_job);
if (sd->refresh_job) ecore_job_del(sd->refresh_job);
@ -9777,6 +9780,7 @@ _e_fm_overwrite_dialog(int pid, const char *str)
E_OBJECT(dialog)->data = id;
e_dialog_button_add(dialog, _("No"), NULL, _e_fm_overwrite_no_cb, NULL);
e_dialog_button_add(dialog, _("No to all"), NULL, _e_fm_overwrite_no_all_cb, NULL);
e_dialog_button_add(dialog, _("Rename"), NULL, _e_fm_overwrite_rename, NULL);
e_dialog_button_add(dialog, _("Yes"), NULL, _e_fm_overwrite_yes_cb, NULL);
e_dialog_button_add(dialog, _("Yes to all"), NULL, _e_fm_overwrite_yes_all_cb, NULL);
@ -9810,6 +9814,80 @@ _e_fm_overwrite_no_all_cb(void *data __UNUSED__, E_Dialog *dialog)
e_object_del(E_OBJECT(dialog));
}
static void
_e_fm_overwrite_rename_del(void *data)
{
E_Fm2_Op_Registry_Entry *ere;
E_Fm2_Smart_Data *sd;
ere = e_object_data_get(data);
if (!ere) return;
sd = evas_object_smart_data_get(ere->e_fm);
sd->rename_dialogs = eina_list_remove(sd->rename_dialogs, data);
e_fm2_op_registry_entry_unref(ere);
}
static void
_e_fm_overwrite_rename_yes_cb(void *data, char *text)
{
E_Fm2_Op_Registry_Entry *ere = data;
char newpath[PATH_MAX];
char *args = NULL;
const char *f;
size_t size = 0;
size_t length = 0;
if ((!text) || (!text[0])) return;
if ((!ere->src) || (!ere->dst)) return;
f = ecore_file_file_get(ere->dst);
if (!f) return;
length = strlen(text);
if (f - ere->dst + length >= PATH_MAX) return;
newpath[0] = 0;
strncat(newpath, ere->dst, f - ere->dst);
strcat(newpath, text);
if (e_filereg_file_protected(newpath)) return;
length = 0;
args = _e_fm_string_append_quoted(args, &size, &length, ere->src);
if (!args) return;
args = _e_fm_string_append_char(args, &size, &length, ' ');
if (!args) return;
args = _e_fm_string_append_quoted(args, &size, &length, newpath);
if (!args) return;
_e_fm_client_file_copy(args, ere->e_fm);
free(args);
}
static void
_e_fm_overwrite_rename(void *data __UNUSED__, E_Dialog *dialog)
{
char text[PATH_MAX + 256];
int id = (int)(intptr_t)E_OBJECT(dialog)->data;
E_Fm2_Op_Registry_Entry *ere;
E_Entry_Dialog *ed;
E_Fm2_Smart_Data *sd;
const char *file;
ere = e_fm2_op_registry_entry_get(id);
if (!ere) return;
sd = evas_object_smart_data_get(ere->e_fm);
e_object_del(E_OBJECT(dialog));
file = ecore_file_file_get(ere->src);
snprintf(text, sizeof(text), _("Rename %s to:"), file);
ed = e_entry_dialog_show(_("Rename File"), "edit-rename",
text, file, NULL, NULL,
_e_fm_overwrite_rename_yes_cb,
NULL, ere);
sd->rename_dialogs = eina_list_append(sd->rename_dialogs, ed);
e_object_del_attach_func_set(E_OBJECT(ed), _e_fm_overwrite_rename_del);
E_OBJECT(ed)->data = ere;
e_fm2_op_registry_entry_ref(ere);
_e_fm2_op_registry_go_on(id);
_e_fm_client_send(E_FM_OP_OVERWRITE_RESPONSE_NO, id, NULL, 0);
}
static void
_e_fm_overwrite_yes_cb(void *data __UNUSED__, E_Dialog *dialog)
{