From d805f721badbe7a0262db7c7ed21f3bf5fd97989 Mon Sep 17 00:00:00 2001 From: ChunEon Park Date: Mon, 5 Aug 2013 01:28:47 +0900 Subject: [PATCH] enventor - let's save the edc file with file selector --- include/edc_editor.h | 4 +- src/edc_editor.c | 22 ++++++----- src/main.c | 14 ++++--- src/menu.c | 92 +++++++++++++++++++++++++++++--------------- 4 files changed, 84 insertions(+), 48 deletions(-) diff --git a/include/edc_editor.h b/include/edc_editor.h index c6e1053..8d8c939 100644 --- a/include/edc_editor.h +++ b/include/edc_editor.h @@ -5,10 +5,10 @@ void edit_edc_read(edit_data *ed, const char *file_path); void edit_focus_set(edit_data *ed); Evas_Object *edit_obj_get(edit_data *ed); Eina_Bool edit_changed_get(edit_data *ed); -void edit_changed_reset(edit_data *ed); +void edit_changed_set(edit_data *ed, Eina_Bool changed); void edit_line_number_toggle(edit_data *ed); void edit_editable_set(edit_data *ed, Eina_Bool editable); -void edit_save(edit_data *ed); +Eina_Bool edit_save(edit_data *ed); const char *edit_group_name_get(edit_data *ed); void edit_new(edit_data* ed); void edit_part_changed_cb_set(edit_data *ed, void (*cb)(void *data, const char *part_name), void *data); diff --git a/src/edc_editor.c b/src/edc_editor.c index c5fa3dc..57ba85b 100644 --- a/src/edc_editor.c +++ b/src/edc_editor.c @@ -20,7 +20,6 @@ struct editor_s menu_data *md; int line_max; - Eina_Stringshare *edc_path; Eina_Stringshare *group_name; Eina_Stringshare *part_name; @@ -152,28 +151,30 @@ save_msg_show(edit_data *ed) char buf[PATH_MAX]; if (ed->edit_changed) - snprintf(buf, sizeof(buf), "File saved. \"%s\"", ed->edc_path); + snprintf(buf, sizeof(buf), "File saved. \"%s\"", + option_edc_path_get(ed->od)); else - snprintf(buf, sizeof(buf), "Already saved. \"%s\"", ed->edc_path); + snprintf(buf, sizeof(buf), "Already saved. \"%s\"", + option_edc_path_get(ed->od)); stats_info_msg_update(ed->sd, buf); } -void +Eina_Bool edit_save(edit_data *ed) { if (!ed->edit_changed) { save_msg_show(ed); - return; + return EINA_TRUE; } const char *text = elm_entry_entry_get(ed->en_edit); Evas_Object *tb = elm_entry_textblock_get(ed->en_edit); const char *text2 = evas_textblock_text_markup_to_utf8(tb, text); - FILE *fp = fopen(ed->edc_path, "w"); - if (!fp) return; + FILE *fp = fopen(option_edc_path_get(ed->od), "w"); + if (!fp) return EINA_FALSE; fputs(text2, fp); fclose(fp); @@ -181,6 +182,8 @@ edit_save(edit_data *ed) save_msg_show(ed); //FIXME: If compile edc here? we can edit_changed FALSE; //ed->edit_changed = EINA_FALSE; + + return EINA_TRUE; } static void @@ -602,7 +605,6 @@ edit_edc_read(edit_data *ed, const char *file_path) elm_entry_entry_append(ed->en_edit, eina_strbuf_string_get(strbuf)); ed->line_max = line_num; - ed->edc_path = eina_stringshare_add(file_path); if (ed->group_name) eina_stringshare_del(ed->group_name); ed->group_name = parser_group_name_get(ed->pd, ed->en_edit); @@ -628,9 +630,9 @@ edit_changed_get(edit_data *ed) } void -edit_changed_reset(edit_data *ed) +edit_changed_set(edit_data *ed, Eina_Bool changed) { - ed->edit_changed = EINA_FALSE; + ed->edit_changed = changed; } void diff --git a/src/main.c b/src/main.c index 83c9196..54fdff3 100644 --- a/src/main.c +++ b/src/main.c @@ -16,6 +16,7 @@ struct app_s Evas_Object *layout; Evas_Object *panes; Evas_Object *win; + Eio_Monitor *edc_monitor; Eina_Bool ctrl_pressed : 1; Eina_Bool menu_opened : 1; @@ -30,7 +31,7 @@ rebuild_edc() return EINA_TRUE; } -Eina_Bool +static Eina_Bool edc_changed_cb(void *data, int type EINA_UNUSED, void *event) { //FIXME: Why does this callback called multiple times? @@ -43,7 +44,7 @@ edc_changed_cb(void *data, int type EINA_UNUSED, void *event) return ECORE_CALLBACK_RENEW; rebuild_edc(); - edit_changed_reset(ad->ed); + edit_changed_set(ad->ed, EINA_FALSE); return ECORE_CALLBACK_RENEW; } @@ -334,15 +335,17 @@ option_update_cb(void *data, option_data *od) if (view_reload_need_get(ad->vd)) { rebuild_edc(); - edit_changed_reset(ad->ed); + edit_changed_set(ad->ed, EINA_FALSE); view_new(ad->vd, edit_group_name_get(ad->ed)); part_changed_cb(ad, NULL); + if (ad->edc_monitor) eio_monitor_del(ad->edc_monitor); + ad->edc_monitor = eio_monitor_add(option_edc_path_get(ad->od)); } //If the edc is reloaded, then rebuild it! else if (edit_changed_get(ad->ed)) { rebuild_edc(); - edit_changed_reset(ad->ed); + edit_changed_set(ad->ed, EINA_FALSE); } } @@ -461,8 +464,7 @@ init(app_data *ad, int argc, char **argv) edc_view_set(ad, ad->od, ad->sd); ad->md = menu_init(ad->win, ad->ed, ad->od, ad->vd, menu_close_cb, ad); - //FIXME: update the edc path whenever file is changed. - eio_monitor_add(option_edc_path_get(ad->od)); + ad->edc_monitor = eio_monitor_add(option_edc_path_get(ad->od)); ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, edc_changed_cb, ad); return EINA_TRUE; diff --git a/src/menu.c b/src/menu.c index e73436d..835087d 100644 --- a/src/menu.c +++ b/src/menu.c @@ -632,9 +632,7 @@ save_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { menu_data *md = data; - edit_save(md->ed); - - //edc_file_save(md); + edc_file_save(md); } static void @@ -644,20 +642,56 @@ fileselector_save_done_cb(void *data, Evas_Object *obj EINA_UNUSED, menu_data *md = data; const char *selected = event_info; - if (selected) + if (!selected) { - //Filter to read only edc extension file. - char *ext = strrchr(selected, '.'); - if (!ext || strcmp(ext, ".edc")) - { - //show failed message box. - fileselector_close(md); - return; - } fileselector_close(md); - menu_close(md, EINA_FALSE); - } - else fileselector_close(md); + return; + } + + //Filter to read only edc extension file. + char *ext = strrchr(selected, '.'); + if (!ext || strcmp(ext, ".edc")) + { + elm_object_part_text_set(md->fileselector_layout, + "elm.text.msg", + "Support only .edc file."); + elm_object_signal_emit(md->fileselector_layout, + "elm,action,msg,show", ""); + return; + } + + //Directory? + if (ecore_file_is_dir(selected)) + { + elm_object_part_text_set(md->fileselector_layout, + "elm.text.msg", "Choose a file to save."); + elm_object_signal_emit(md->fileselector_layout, + "elm,action,msg,show", ""); + return; + } + + //Update the edc file and try to save. + if (strcmp(option_edc_path_get(md->od), selected)) + edit_changed_set(md->ed, EINA_TRUE); + + option_edc_path_set(md->od, selected); + + if (!edit_save(md->ed)) + { + char buf[PATH_MAX]; + snprintf(buf, sizeof(buf), "Failed to load: %s.", selected); + elm_object_part_text_set(md->fileselector_layout, + "elm.text.msg", buf); + elm_object_signal_emit(md->fileselector_layout, + "elm,action,msg,show", ""); + return; + } + + view_reload_need_set(md->vd, EINA_TRUE); + option_apply(md->od); + + fileselector_close(md); + menu_close(md, EINA_FALSE); } static void @@ -679,34 +713,32 @@ fileselector_load_done_cb(void *data, Evas_Object *obj EINA_UNUSED, return; } - char buf[PATH_MAX]; - - //Directory? - if (ecore_file_is_dir(selected)) - { - snprintf(buf, sizeof(buf), "Choose a file to load."); - elm_object_part_text_set(md->fileselector_layout, - "elm.text.msg", buf); - elm_object_signal_emit(md->fileselector_layout, - "elm,action,msg,show", ""); - return; - } - //Filter to read only edc extension file. char *ext = strrchr(selected, '.'); if (!ext || strcmp(ext, ".edc")) { elm_object_part_text_set(md->fileselector_layout, "elm.text.msg", - "Support only edc file."); + "Support only .edc file."); elm_object_signal_emit(md->fileselector_layout, "elm,action,msg,show", ""); return; } - //Show a message if the it failed to load the file. + //Directory? + if (ecore_file_is_dir(selected)) + { + elm_object_part_text_set(md->fileselector_layout, + "elm.text.msg", "Choose a file to load."); + elm_object_signal_emit(md->fileselector_layout, + "elm,action,msg,show", ""); + return; + } + + //Show a message if it failed to load the file. if (!ecore_file_can_read(selected)) { + char buf[PATH_MAX]; const char *filename = ecore_file_file_get(selected); snprintf(buf, sizeof(buf), "Failed to load: %s.", filename); elm_object_part_text_set(md->fileselector_layout,