ajwillia-ms pushed a commit to branch master. http://git.enlightenment.org/tools/edi.git/commit/?id=be333dee6fc79cfe42ac3570e73927db6e108271
commit be333dee6fc79cfe42ac3570e73927db6e108271 Author: Al Poole <[email protected]> Date: Sun Jul 23 21:54:47 2017 +0100 add open files in new tab. Summary: focus chanegs on click of tab in panel. closing last tab closes panel. Exit and open remembers tabs. etc. Reviewers: ajwillia.ms Reviewed By: ajwillia.ms Differential Revision: https://phab.enlightenment.org/D5034 --- src/bin/Makefile.am | 2 + src/bin/edi_config.c | 5 +- src/bin/edi_config.h | 3 +- src/bin/edi_filepanel.c | 17 + src/bin/edi_main.c | 80 +- src/bin/mainview/edi_mainview.c | 849 +++++---------------- src/bin/mainview/edi_mainview.h | 13 +- src/bin/mainview/edi_mainview_item.c | 17 + src/bin/mainview/edi_mainview_item.h | 3 + .../{edi_mainview.c => edi_mainview_panel.c} | 842 ++++++++------------ src/bin/mainview/edi_mainview_panel.h | 290 +++++++ 11 files changed, 904 insertions(+), 1217 deletions(-) diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index d4fd2d8..75ca66b 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -35,6 +35,7 @@ edi_searchpanel.h \ edi_consolepanel.h \ edi_debugpanel.h \ mainview/edi_mainview_item.h \ +mainview/edi_mainview_panel.h \ mainview/edi_mainview.h edi_SOURCES = \ @@ -58,6 +59,7 @@ edi_searchpanel.c \ edi_consolepanel.c \ edi_debugpanel.c \ mainview/edi_mainview_item.c \ +mainview/edi_mainview_panel.c \ mainview/edi_mainview.c \ edi_main.c \ edi_private.h diff --git a/src/bin/edi_config.c b/src/bin/edi_config.c index 4ae8549..f1fcaa7 100644 --- a/src/bin/edi_config.c +++ b/src/bin/edi_config.c @@ -234,6 +234,7 @@ _edi_config_init(void) EDI_CONFIG_VAL(D, T, path, EET_T_STRING); EDI_CONFIG_VAL(D, T, type, EET_T_STRING); EDI_CONFIG_VAL(D, T, windowed, EET_T_UCHAR); + EDI_CONFIG_VAL(D, T, panel_id, EET_T_INT); _edi_proj_cfg_edd = EDI_CONFIG_DD_NEW("Project_Config", Edi_Project_Config); #undef T @@ -504,7 +505,7 @@ _edi_project_config_save() void _edi_project_config_tab_add(const char *path, const char *type, - Eina_Bool windowed) + Eina_Bool windowed, int panel_id) { Edi_Project_Config_Tab *tab; Eina_List *list, *next; @@ -525,6 +526,8 @@ _edi_project_config_tab_add(const char *path, const char *type, tab->type = eina_stringshare_add(type); tab->windowed = windowed; + tab->panel_id = panel_id; + _edi_project_config->tabs = eina_list_append(_edi_project_config->tabs, tab); _edi_project_config_save_no_notify(); } diff --git a/src/bin/edi_config.h b/src/bin/edi_config.h index 249f0b6..d5d709e 100644 --- a/src/bin/edi_config.h +++ b/src/bin/edi_config.h @@ -50,6 +50,7 @@ struct _Edi_Project_Config_Tab const char *path; const char *type; Eina_Bool windowed; + int panel_id; }; struct _Edi_Project_Config_Launch @@ -114,7 +115,7 @@ void _edi_project_config_load(void); void _edi_project_config_save(void); void _edi_project_config_tab_add(const char *path, const char *type, - Eina_Bool windowed); + Eina_Bool windowed, int panel_id); void _edi_project_config_tab_remove(const char *path); #ifdef __cplusplus diff --git a/src/bin/edi_filepanel.c b/src/bin/edi_filepanel.c index bc4f15a..fdcfccc 100644 --- a/src/bin/edi_filepanel.c +++ b/src/bin/edi_filepanel.c @@ -135,6 +135,20 @@ _item_menu_open_as_image_cb(void *data, Evas_Object *obj EINA_UNUSED, } static void +_item_menu_open_panel_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + Edi_Mainview_Panel *panel; + Edi_Path_Options *options; + Edi_Dir_Data *sd = data; + + options = edi_path_options_create(sd->path); + panel = edi_mainview_panel_append(); + + edi_mainview_panel_open(panel, options); +} + +static void _item_menu_rename_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -224,11 +238,14 @@ _item_menu_create(Evas_Object *win, Edi_Dir_Data *sd) menu_it = elm_menu_item_add(menu, NULL, "gtk-execute", "open external", _item_menu_xdgopen_cb, sd); + menu_it = elm_menu_item_add(menu, NULL, NULL, "open as", NULL, NULL); _item_menu_filetype_create(menu, menu_it, "text", _item_menu_open_as_text_cb, sd); _item_menu_filetype_create(menu, menu_it, "code", _item_menu_open_as_code_cb, sd); _item_menu_filetype_create(menu, menu_it, "image", _item_menu_open_as_image_cb, sd); + menu_it = elm_menu_item_add(menu, NULL, NULL, "open in new panel", _item_menu_open_panel_cb, sd); + if (edi_scm_enabled()) { menu_it = elm_menu_item_add(menu, NULL, NULL, "source control", NULL, NULL); diff --git a/src/bin/edi_main.c b/src/bin/edi_main.c index 13320d7..c962a52 100644 --- a/src/bin/edi_main.c +++ b/src/bin/edi_main.c @@ -351,7 +351,7 @@ static Evas_Object * edi_content_setup(Evas_Object *win, const char *path) { Evas_Object *filepane, *logpane, *logpanels, *content_out, *content_in, *tb; - Evas_Object *icon, *button; + Evas_Object *icon, *button, *mainview; filepane = elm_panes_add(win); evas_object_size_hint_weight_set(filepane, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -396,8 +396,14 @@ edi_content_setup(Evas_Object *win, const char *path) elm_box_pack_end(content_in, button); evas_object_show(button); - edi_mainview_add(content_in, win); - evas_object_show(content_in); + mainview = elm_box_add(content_in); + evas_object_size_hint_weight_set(mainview, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(mainview, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(mainview); + elm_box_pack_end(content_in, mainview); + + edi_mainview_add(mainview, win); + elm_object_part_content_set(filepane, "right", content_in); elm_box_pack_end(content_out, filepane); @@ -831,13 +837,6 @@ _edi_menu_save_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, } static void -_edi_menu_open_window_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) -{ - edi_mainview_new_window(); -} - -static void _edi_menu_close_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -848,7 +847,7 @@ static void _edi_menu_closeall_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - edi_mainview_closeall(); + edi_mainview_close_all(); } static void @@ -922,18 +921,32 @@ _edi_menu_findfile_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, } static void -_edi_menu_tasks_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) +_edi_menu_goto_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { - edi_taskspanel_show(); - edi_taskspanel_find(); + edi_mainview_goto_popup_show(); } static void -_edi_menu_goto_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) +_edi_menu_view_open_window_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { - edi_mainview_goto_popup_show(); + edi_mainview_new_window(); +} + +static void +_edi_menu_view_split_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + edi_mainview_panel_append(); +} + +static void +_edi_menu_view_tasks_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + edi_taskspanel_show(); + edi_taskspanel_find(); } static void @@ -1088,7 +1101,6 @@ _edi_menu_setup(Evas_Object *win) elm_menu_item_add(menu, menu_it, "document-new", "New ...", _edi_menu_new_cb, NULL); elm_menu_item_add(menu, menu_it, "folder-new", "New Directory ...", _edi_menu_new_dir_cb, NULL); _edi_menu_save = elm_menu_item_add(menu, menu_it, "document-save", "Save", _edi_menu_save_cb, NULL); - elm_menu_item_add(menu, menu_it, "window-new", "New window", _edi_menu_open_window_cb, NULL); elm_menu_item_add(menu, menu_it, "document-close", "Close", _edi_menu_close_cb, NULL); elm_menu_item_add(menu, menu_it, "document-close", "Close all", _edi_menu_closeall_cb, NULL); elm_menu_item_separator_add(menu, menu_it); @@ -1109,7 +1121,12 @@ _edi_menu_setup(Evas_Object *win) elm_menu_item_add(menu, menu_it, "go-jump", "Goto Line ...", _edi_menu_goto_cb, NULL); elm_menu_item_separator_add(menu, menu_it); elm_menu_item_add(menu, menu_it, "edit-find", "Find in project ...", _edi_menu_find_project_cb, NULL); - elm_menu_item_add(menu, menu_it, "edit-find", "Open Tasks", _edi_menu_tasks_cb, NULL); + + menu_it = elm_menu_item_add(menu, NULL, NULL, "View", NULL, NULL); + elm_menu_item_add(menu, menu_it, "window-new", "New window", _edi_menu_view_open_window_cb, NULL); + elm_menu_item_add(menu, menu_it, "object-flip-horizontal", "Split pane", _edi_menu_view_split_cb, NULL); + elm_menu_item_separator_add(menu, menu_it); + elm_menu_item_add(menu, menu_it, "edit-find", "Open Tasks", _edi_menu_view_tasks_cb, NULL); menu_it = elm_menu_item_add(menu, NULL, NULL, "Build", NULL, NULL); elm_menu_item_add(menu, menu_it, "system-run", "Build", _edi_menu_build_cb, NULL); @@ -1293,6 +1310,7 @@ _edi_open_tabs() Edi_Project_Config_Tab *tab; Edi_Path_Options *options; Eina_List *tabs, *list; + Edi_Mainview_Panel *panel; char *path; tabs = _edi_project_config->tabs; @@ -1307,10 +1325,26 @@ _edi_open_tabs() options = edi_path_options_create(path); options->type = eina_stringshare_add(tab->type); options->background = EINA_TRUE; - if (tab->windowed) - edi_mainview_open_window(options); + if (tab->panel_id == 0) + { + if (tab->windowed) + edi_mainview_open_window(options); + else + edi_mainview_open(options); + + } else - edi_mainview_open(options); + { + while (edi_mainview_panel_count() <= tab->panel_id) + { + /* Make sure we have enough panels */ + edi_mainview_panel_append(); + } + panel = edi_mainview_panel_by_index(tab->panel_id); + options = edi_path_options_create(path); + edi_mainview_panel_open(panel, options); + } + free(path); } diff --git a/src/bin/mainview/edi_mainview.c b/src/bin/mainview/edi_mainview.c index dd43afb..3608577 100644 --- a/src/bin/mainview/edi_mainview.c +++ b/src/bin/mainview/edi_mainview.c @@ -9,6 +9,7 @@ #include <Elementary.h> #include "mainview/edi_mainview_item.h" +#include "mainview/edi_mainview_panel.h" #include "mainview/edi_mainview.h" #include "editor/edi_editor.h" @@ -18,259 +19,128 @@ #include "edi_private.h" #include "edi_config.h" -static Evas_Object *_content_frame, *_current_view, *tb, *_main_win, *_welcome_panel, *_tab_scroller; -static Evas_Object *_edi_mainview_goto_popup; +static Evas_Object *_main_win, *_mainview_panel, *_mainview_parent; static Evas_Object *_edi_mainview_search_project_popup; -static Eina_List *_edi_mainview_items = NULL; +static Edi_Mainview_Panel *_current_panel; +static Eina_List *_edi_mainview_panels = NULL, *_edi_mainview_wins = NULL; static void dummy() {} -Edi_Mainview_Item * -edi_mainview_item_current_get() +int +edi_mainview_panel_count(void) { - Eina_List *item; - Edi_Mainview_Item *it; - - EINA_LIST_FOREACH(_edi_mainview_items, item, it) - { - if (it && it->view == _current_view) - return it; - } - - return NULL; + return eina_list_count(_edi_mainview_panels); } -unsigned int -edi_mainview_item_current_tab_get() +int edi_mainview_panel_id(Edi_Mainview_Panel *panel) { - Eina_List *item; - Edi_Mainview_Item *it; - unsigned int i = 0; + Eina_List *it; + Edi_Mainview_Panel *p; + int i = 0; - EINA_LIST_FOREACH(_edi_mainview_items, item, it) + EINA_LIST_FOREACH(_edi_mainview_panels, it, p) { - if (!it->win) - i++; - if (it && it->view == _current_view) + if (panel == p) break; + i++; } return i; } -static void -_edi_mainview_view_show(Evas_Object *view) +Edi_Mainview_Panel * +edi_mainview_panel_by_index(int index) { - elm_box_unpack(_content_frame, _current_view); - evas_object_hide(_current_view); - - _current_view = view; - elm_box_pack_end(_content_frame, view); - evas_object_show(view); + return eina_list_nth(_edi_mainview_panels, index); } -void -edi_mainview_item_prev() +void edi_mainview_panel_focus(Edi_Mainview_Panel *panel) { - Eina_List *item; - Edi_Mainview_Item *it, *first, *prev = NULL; - - first = (Edi_Mainview_Item *)eina_list_nth(_edi_mainview_items, 0); - if (first->view == _current_view) - { - prev = eina_list_nth(_edi_mainview_items, eina_list_count(_edi_mainview_items)-1); - edi_mainview_item_select(prev); - return; - } - - EINA_LIST_FOREACH(_edi_mainview_items, item, it) - { - if (it && it->view == _current_view) - { - if (prev) - edi_mainview_item_select(prev); - return; - } - - prev = it; - } + _current_panel = panel; } -void -edi_mainview_item_next() +Edi_Mainview_Item * +edi_mainview_item_current_get() { - Eina_List *item; - Edi_Mainview_Item *it, *last, *next; - Eina_Bool open_next = EINA_FALSE; - - last = eina_list_nth(_edi_mainview_items, eina_list_count(_edi_mainview_items)-1); - - if (last->view == _current_view) - { - next = eina_list_nth(_edi_mainview_items, 0); - edi_mainview_item_select(next); - return; - } - - EINA_LIST_FOREACH(_edi_mainview_items, item, it) - { - if (it && open_next) - { - edi_mainview_item_select(it); - return; - } - - if (it && it->view == _current_view) - open_next = EINA_TRUE; - } + return edi_mainview_panel_item_current_get(_current_panel); } -void -edi_mainview_tab_select(unsigned int id) +Edi_Mainview_Panel * +edi_mainview_panel_current_get() { - Eina_List *item; - Edi_Mainview_Item *it; - unsigned int i = 0; - - EINA_LIST_FOREACH(_edi_mainview_items, item, it) - { - if (!it->win) - i++; - if (i == id) - edi_mainview_item_select(it); - } + return _current_panel; } -static void -_content_load(Edi_Mainview_Item *item) +Edi_Mainview_Panel * +edi_mainview_panel_for_item_get(Edi_Mainview_Item *item) { - Edi_Content_Provider *provider; - Evas_Object *child; + Eina_List *it; + Edi_Mainview_Panel *panel; - provider = edi_content_provider_for_id_get(item->editortype); - if (!provider) + EINA_LIST_FOREACH(_edi_mainview_panels, it, panel) { - ERR("No content provider found for type %s", item->editortype); - return; + if (edi_mainview_panel_item_contains(panel, item)) + return panel; } - child = provider->content_ui_add(item->container, item); - - evas_object_size_hint_weight_set(child, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(child, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_box_pack_end(item->container, child); - evas_object_show(child); - item->loaded = EINA_TRUE; + return NULL; } void -edi_mainview_item_select(Edi_Mainview_Item *item) +edi_mainview_item_prev() { - Eina_List *list; - Edi_Mainview_Item *it; - Evas_Coord tabw, region_x = 0, w, total_w = 0; - - if (item->win) - { - elm_win_raise(item->win); - } - else - { - EINA_LIST_FOREACH(_edi_mainview_items, list, it) - { - elm_object_signal_emit(it->tab, "mouse,up,1", "base"); - evas_object_geometry_get(it->tab, NULL, NULL, &w, NULL); - if (item == it) region_x = total_w; - total_w += w; - } - - if (!item->loaded) - _content_load(item); - - _edi_mainview_view_show(item->view); - elm_object_signal_emit(item->tab, "mouse,down,1", "base"); - - evas_object_geometry_get(item->tab, NULL, NULL, &tabw, NULL); - elm_scroller_region_bring_in(_tab_scroller, region_x, 0, tabw, 0); - _edi_project_config->current_tab = edi_mainview_item_current_tab_get(); - _edi_project_config_save(); - } - - ecore_event_add(EDI_EVENT_TAB_CHANGED, NULL, NULL, NULL); + edi_mainview_panel_item_prev(_current_panel); } -static void -_edi_mainview_item_close(Edi_Mainview_Item *item) +void +edi_mainview_item_next() { - if (!item) - return; - - edi_mainview_item_prev(); - evas_object_del(item->view); - elm_box_unpack(tb, item->tab); - evas_object_del(item->tab); - _edi_mainview_items = eina_list_remove(_edi_mainview_items, item); - - _edi_project_config_tab_remove(item->path); - eina_stringshare_del(item->path); - free(item); - - if (eina_list_count(_edi_mainview_items) == 0) - _edi_mainview_view_show(_welcome_panel); + edi_mainview_panel_item_next(_current_panel); } -static void -_promote(void *data, Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, const char *source EINA_UNUSED) +void +edi_mainview_tab_select(unsigned int id) { - edi_mainview_item_select((Edi_Mainview_Item *)data); + edi_mainview_panel_tab_select(_current_panel, id); } static void -_closetab(void *data, Evas_Object *obj EINA_UNUSED, - const char *emission EINA_UNUSED, const char *source EINA_UNUSED) -{ - _edi_mainview_item_close(data); -} - -static Edi_Mainview_Item * -_get_item_for_path(const char *path) +_edi_mainview_win_exit(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) { - Eina_List *item; Edi_Mainview_Item *it; - EINA_LIST_FOREACH(_edi_mainview_items, item, it) - { - if (it && !strcmp(it->path, path)) - return it; - } - return NULL; + evas_object_hide(obj); + + it = evas_object_data_get(obj, "edi_mainview_item"); + _edi_mainview_wins = eina_list_remove(_edi_mainview_wins, it); + + _edi_project_config_tab_remove(it->path); + eina_stringshare_del(it->path); + + if (edi_noproject()) + edi_close(); + free(it); } -static Edi_Mainview_Item * -_edi_mainview_item_add(Edi_Path_Options *path, const char *mime, Elm_Object_Item *tab, - Evas_Object *win) +static char * +_edi_mainview_win_title_get(const char *path) { - Edi_Mainview_Item *item; - - item = malloc(sizeof(Edi_Mainview_Item)); - item->path = eina_stringshare_add(path->path); - item->editortype = path->type; - item->mimetype = mime; - item->tab = tab; - item->win = win; + char *winname, *filename; - _edi_mainview_items = eina_list_append(_edi_mainview_items, item); + filename = basename((char*)path); + winname = malloc((8 + strlen(filename)) * sizeof(char)); + snprintf(winname, 8 + strlen(filename), "Edi :: %s", filename); - return item; + return winname; } static Evas_Object * _edi_mainview_content_create(Edi_Mainview_Item *item, Evas_Object *parent) { + Evas_Object *container; container = elm_box_add(parent); @@ -280,88 +150,25 @@ _edi_mainview_content_create(Edi_Mainview_Item *item, Evas_Object *parent) item->loaded = EINA_FALSE; item->container = container; +// TODO not in 2 halfs + Edi_Content_Provider *provider; + Evas_Object *child; - return container; -} - -static void -_edi_mainview_item_tab_add(Edi_Path_Options *options, const char *mime) -{ - Evas_Object *content, *tab;//, *icon; - Edi_Mainview_Item *item; - Edi_Editor *editor; - - item = _edi_mainview_item_add(options, mime, NULL, NULL); - content = _edi_mainview_content_create(item, _content_frame); - _edi_mainview_view_show(content); - item->view = content; - - tab = elm_button_add(tb); - evas_object_size_hint_weight_set(tab, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(tab, 0.0, EVAS_HINT_FILL); - - elm_layout_theme_set(tab, "multibuttonentry", "btn", "default"); - elm_object_part_text_set(tab, "elm.btn.text", basename((char*)options->path)); -/* - icon = elm_icon_add(tab); - elm_icon_standard_set(icon, provider->icon); - elm_object_part_content_set(tab, "icon", icon); -*/ - elm_layout_signal_callback_add(tab, "mouse,clicked,1", "*", _promote, item); - elm_layout_signal_callback_add(tab, "elm,deleted", "elm", _closetab, item); - - elm_box_pack_end(tb, tab); - evas_object_show(tab); - elm_box_recalculate(tb); - item->tab = tab; - - if (!options->background) - edi_mainview_item_select(item); - - // Set focus on the newly opening window so that one can just start typing - editor = (Edi_Editor *)evas_object_data_get(content, "editor"); - if (editor) - elm_object_focus_set(editor->entry, EINA_TRUE); - - if (options->line) + provider = edi_content_provider_for_id_get(item->editortype); + if (!provider) { - if (options->character > 1) - edi_mainview_goto_position(options->line, options->character); - else - edi_mainview_goto(options->line); + ERR("No content provider found for type %s", item->editortype); + return container; } + child = provider->content_ui_add(item->container, item); - _edi_project_config_tab_add(options->path, mime?mime:options->type, EINA_FALSE); -} - -static void -_edi_mainview_win_exit(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) -{ - Edi_Mainview_Item *it; - - evas_object_hide(obj); - - it = evas_object_data_get(obj, "edi_mainview_item"); - _edi_mainview_items = eina_list_remove(_edi_mainview_items, it); - - _edi_project_config_tab_remove(it->path); - eina_stringshare_del(it->path); - - if (edi_noproject()) - edi_close(); - free(it); -} - -static char * -_edi_mainview_win_title_get(const char *path) -{ - char *winname, *filename; - - filename = basename((char*)path); - winname = malloc((8 + strlen(filename)) * sizeof(char)); - snprintf(winname, 8 + strlen(filename), "Edi :: %s", filename); + evas_object_size_hint_weight_set(child, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(child, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(item->container, child); + evas_object_show(child); - return winname; + item->loaded = EINA_TRUE; + return container; } static void @@ -376,12 +183,12 @@ _edi_mainview_item_win_add(Edi_Path_Options *options, const char *mime) elm_win_focus_highlight_enabled_set(win, EINA_TRUE); evas_object_smart_callback_add(win, "delete,request", _edi_mainview_win_exit, NULL); - item = _edi_mainview_item_add(options, mime, NULL, win); + item = edi_mainview_item_add(options, mime, NULL, win); + _edi_mainview_wins = eina_list_append(_edi_mainview_wins, item); evas_object_data_set(win, "edi_mainview_item", item); content = _edi_mainview_content_create(item, win); elm_win_resize_object_add(win, content); - _content_load(item); // Set focus on the newly opening window so that one can just start typing editor = (Edi_Editor *)evas_object_data_get(content, "editor"); @@ -391,58 +198,7 @@ _edi_mainview_item_win_add(Edi_Path_Options *options, const char *mime) evas_object_resize(win, 380 * elm_config_scale_get(), 260 * elm_config_scale_get()); evas_object_show(win); - _edi_project_config_tab_add(options->path, mime?mime:options->type, EINA_TRUE); -} - -static void -_edi_popup_cancel_cb(void *data, Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) -{ - evas_object_del((Evas_Object *) data); -} - -static void -_edi_mainview_mime_content_safe_popup(void) -{ - Evas_Object *popup, *label, *button; - - popup = elm_popup_add(_main_win); - elm_object_part_text_set(popup, "title,text", - "Unrecognized file type"); - label = elm_label_add(popup); - elm_object_text_set(label, "To force open, select this file in the file browser, and use \"open as\" menu options."); - evas_object_show(label); - elm_object_content_set(popup, label); - - button = elm_button_add(popup); - elm_object_text_set(button, "OK"); - elm_object_part_content_set(popup, "button1", button); - evas_object_smart_callback_add(button, "clicked", _edi_popup_cancel_cb, popup); - - evas_object_show(popup); -} - -static void -_edi_mainview_tab_stat_done(void *data, Eio_File *handler EINA_UNUSED, const Eina_Stat *stat) -{ - Edi_Path_Options *options; - Edi_Content_Provider *provider; - const char *mime; - - options = data; - if (!S_ISREG(stat->mode)) - return; - - mime = efreet_mime_type_get(options->path); - provider = edi_content_provider_for_mime_get(mime); - if (!provider) - { - _edi_mainview_mime_content_safe_popup(); - return; - } - - options->type = provider->id; - _edi_mainview_item_tab_add(options, mime); + _edi_project_config_tab_add(options->path, mime?mime:options->type, EINA_TRUE, 0); } static void @@ -460,7 +216,7 @@ _edi_mainview_win_stat_done(void *data, Eio_File *handler EINA_UNUSED, const Ein provider = edi_content_provider_for_mime_get(mime); if (!provider) { - _edi_mainview_mime_content_safe_popup(); +//TODO _edi_mainview_mime_content_safe_popup(); return; } @@ -471,51 +227,13 @@ _edi_mainview_win_stat_done(void *data, Eio_File *handler EINA_UNUSED, const Ein void edi_mainview_open_path(const char *path) { - Edi_Path_Options *options; - - options = edi_path_options_create(path); - edi_mainview_open(options); + edi_mainview_panel_open_path(_current_panel, path); } void edi_mainview_open(Edi_Path_Options *options) { - Edi_Mainview_Item *it; - - it = _get_item_for_path(options->path); - if (it) - { - edi_mainview_item_select(it); - if (options->line) - { - if (options->character > 1) - edi_mainview_goto_position(options->line, options->character); - else - edi_mainview_goto(options->line); - } - return; - } - - if (options->type == NULL) - { - eio_file_direct_stat(options->path, _edi_mainview_tab_stat_done, dummy, options); - } - else if (!edi_content_provider_for_id_get(options->type)) - { - const char *mime = options->type; - Edi_Content_Provider *provider = edi_content_provider_for_mime_get(mime); - - if (provider) - options->type = provider->id; - else - options->type = NULL; - - _edi_mainview_item_tab_add(options, mime); - } - else - { - _edi_mainview_item_tab_add(options, NULL); - } + edi_mainview_panel_open(_current_panel, options); } void @@ -524,22 +242,14 @@ edi_mainview_open_window_path(const char *path) Edi_Path_Options *options; options = edi_path_options_create(path); - +// TODO this will not work right now - windows come from tabs so do we need it? edi_mainview_open_window(options); } void edi_mainview_open_window(Edi_Path_Options *options) { - Edi_Mainview_Item *it; - - it = _get_item_for_path(options->path); - if (it) - { - edi_mainview_item_select(it); - _edi_mainview_item_close(it); - _edi_mainview_items = eina_list_remove(_edi_mainview_items, it); - } + edi_mainview_item_close_path(options->path); if (options->type == NULL) { @@ -567,67 +277,36 @@ void edi_mainview_close_all(void) { Eina_List *item; - Edi_Mainview_Item *it; + Edi_Mainview_Panel *it; - EINA_LIST_FOREACH(_edi_mainview_items, item, it) - { - if (it) - _edi_mainview_item_close(it); - } + EINA_LIST_FOREACH(_edi_mainview_panels, item, it) + edi_mainview_panel_close_all(it); } void edi_mainview_refresh_all(void) { Eina_List *item; - Edi_Mainview_Item *it; - char *path; + Edi_Mainview_Panel *it; - EINA_LIST_FOREACH(_edi_mainview_items, item, it) - { - if (it) - { - path = strdup(it->path); - _edi_mainview_item_close(it); - if (ecore_file_exists(path)) - edi_mainview_open_path(path); - free(path); - } - } + EINA_LIST_FOREACH(_edi_mainview_panels, item, it) + edi_mainview_panel_refresh_all(it); } void edi_mainview_item_close_path(const char *path) { Eina_List *item; - Edi_Mainview_Item *it; + Edi_Mainview_Panel *it; - EINA_LIST_FOREACH(_edi_mainview_items, item, it) - { - if (it && !strcmp(it->path, path)) - { - _edi_mainview_item_close(it); - return; - } - } + EINA_LIST_FOREACH(_edi_mainview_panels, item, it) + edi_mainview_panel_item_close_path(it, path); } void edi_mainview_save() { - Edi_Editor *editor; - Elm_Code *code; - - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); - - if (!editor) - return; - - editor->modified = EINA_FALSE; - - code = elm_code_widget_code_get(editor->entry); - elm_code_file_save(code->file); - ecore_event_add(EDI_EVENT_FILE_SAVED, NULL, NULL, NULL); + edi_mainview_panel_save(_current_panel); } void @@ -638,226 +317,86 @@ edi_mainview_new_window() item = edi_mainview_item_current_get(); if (!item) return; - +// TODO OPTIONS! edi_mainview_open_window_path(item->path); } void edi_mainview_close() { - Edi_Mainview_Item *item; - - item = edi_mainview_item_current_get(); - - _edi_mainview_item_close(item); -} - -void -edi_mainview_closeall() -{ - Eina_List *list, *next; - Edi_Mainview_Item *item; - - EINA_LIST_FOREACH_SAFE(_edi_mainview_items, list, next, item) - { - _edi_mainview_item_close(item); - } + edi_mainview_panel_close(_current_panel); } void edi_mainview_undo() { - Edi_Editor *editor; - - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); - - if (editor) - elm_code_widget_undo(editor->entry); + edi_mainview_panel_undo(_current_panel); } Eina_Bool edi_mainview_can_undo() { - Edi_Editor *editor; - - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); - - if (!editor) - return EINA_FALSE; - - return elm_code_widget_can_undo_get(editor->entry); + return edi_mainview_panel_can_undo(_current_panel); } void edi_mainview_redo() { - Edi_Editor *editor; - - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); - - if (editor) - elm_code_widget_redo(editor->entry); + edi_mainview_panel_redo(_current_panel); } Eina_Bool edi_mainview_can_redo() { - Edi_Editor *editor; - - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); - - if (!editor) - return EINA_FALSE; - - return elm_code_widget_can_redo_get(editor->entry); + return edi_mainview_panel_can_redo(_current_panel); } Eina_Bool edi_mainview_modified() { - Edi_Editor *editor; - - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); - if (!editor) - return EINA_FALSE; - - return editor->modified; + return edi_mainview_panel_modified(_current_panel); } void edi_mainview_cut() { - Edi_Editor *editor; - - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); - - if (editor) - elm_code_widget_selection_cut(editor->entry); + edi_mainview_panel_cut(_current_panel); } void edi_mainview_copy() { - Edi_Editor *editor; - - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); - - if (editor) - elm_code_widget_selection_copy(editor->entry); + edi_mainview_panel_copy(_current_panel); } void edi_mainview_paste() { - Edi_Editor *editor; - - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); - - if (editor) - elm_code_widget_selection_paste(editor->entry); + edi_mainview_panel_paste(_current_panel); } void edi_mainview_search() { - Edi_Editor *editor; - - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); - - if (editor) - edi_editor_search(editor); + edi_mainview_panel_search(_current_panel); } void edi_mainview_goto(unsigned int number) { - edi_mainview_goto_position(number, 1); + edi_mainview_panel_goto(_current_panel, number); } void edi_mainview_goto_position(unsigned int row, unsigned int col) { - Edi_Editor *editor; - - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); - if (!editor || row <= 0 || col <= 0) - return; - - elm_code_widget_cursor_position_set(editor->entry, row, col); - elm_object_focus_set(editor->entry, EINA_TRUE); -} - -static void -_edi_mainview_goto_popup_go_cb(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) -{ - int number; - - number = atoi(elm_entry_entry_get((Evas_Object *) data)); - edi_mainview_goto(number); - - evas_object_del(_edi_mainview_goto_popup); -} - -static void -_edi_mainview_goto_popup_cancel_cb(void *data EINA_UNUSED, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) -{ - evas_object_del(_edi_mainview_goto_popup); -} - -static void -_edi_mainview_goto_popup_key_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, - Evas_Object *obj, void *event_info) -{ - Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *)event_info; - const char *str; - - str = elm_object_text_get(obj); - - if (strlen(str) && (!strcmp(ev->key, "KP_Enter") || !strcmp(ev->key, "Return"))) - _edi_mainview_goto_popup_go_cb(obj, NULL, NULL); + edi_mainview_panel_goto_position(_current_panel, row, col); } void edi_mainview_goto_popup_show() { - Evas_Object *popup, *box, *input, *button; - - popup = elm_popup_add(_main_win); - _edi_mainview_goto_popup = popup; - elm_object_part_text_set(popup, "title,text", - "Enter line number"); - - box = elm_box_add(popup); - elm_box_horizontal_set(box, EINA_FALSE); - elm_object_content_set(popup, box); - - input = elm_entry_add(box); - elm_entry_single_line_set(input, EINA_TRUE); - elm_entry_scrollable_set(input, EINA_TRUE); - evas_object_event_callback_add(input, EVAS_CALLBACK_KEY_UP, _edi_mainview_goto_popup_key_up_cb, NULL); - evas_object_size_hint_weight_set(input, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_align_set(input, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(input); - elm_box_pack_end(box, input); - - button = elm_button_add(popup); - elm_object_text_set(button, "cancel"); - elm_object_part_content_set(popup, "button1", button); - evas_object_smart_callback_add(button, "clicked", - _edi_mainview_goto_popup_cancel_cb, NULL); - - button = elm_button_add(popup); - elm_object_text_set(button, "go"); - elm_object_part_content_set(popup, "button2", button); - evas_object_smart_callback_add(button, "clicked", - _edi_mainview_goto_popup_go_cb, input); - - evas_object_show(popup); - elm_object_focus_set(input, EINA_TRUE); + edi_mainview_panel_goto_popup_show(_current_panel); } static void @@ -869,14 +408,14 @@ _edi_mainview_project_search_popup_cancel_cb(void *data EINA_UNUSED, } static void -_edi_mainview_project_search_cb(void *data, - Evas_Object *obj EINA_UNUSED, +_edi_mainview_project_search_cb(void *data EINA_UNUSED, + Evas_Object *obj, void *event_info EINA_UNUSED) { const char *text_markup; char *text; - text_markup = elm_object_text_get((Evas_Object *) data); + text_markup = elm_object_text_get(obj); if (!text_markup || !text_markup[0]) return; text = elm_entry_markup_to_utf8(text_markup); @@ -888,6 +427,19 @@ _edi_mainview_project_search_cb(void *data, evas_object_del(_edi_mainview_search_project_popup); } +static void +_edi_mainview_project_search_popup_key_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, + Evas_Object *obj, void *event_info) +{ + Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *)event_info; + const char *str; + + str = elm_object_text_get(obj); + + if (strlen(str) && (!strcmp(ev->key, "KP_Enter") || !strcmp(ev->key, "Return"))) + _edi_mainview_project_search_cb(NULL, obj, NULL); +} + void edi_mainview_project_search_popup_show(void) { @@ -905,7 +457,7 @@ edi_mainview_project_search_popup_show(void) input = elm_entry_add(box); elm_entry_single_line_set(input, EINA_TRUE); elm_entry_scrollable_set(input, EINA_TRUE); - evas_object_event_callback_add(input, EVAS_CALLBACK_KEY_UP, _edi_mainview_goto_popup_key_up_cb, NULL); + evas_object_event_callback_add(input, EVAS_CALLBACK_KEY_UP, _edi_mainview_project_search_popup_key_up_cb, NULL); evas_object_size_hint_weight_set(input, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(input, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(input); @@ -926,130 +478,69 @@ edi_mainview_project_search_popup_show(void) evas_object_show(popup); elm_object_focus_set(input, EINA_TRUE); } - -static void -_edi_mainview_next_clicked_cb(void *data EINA_UNUSED, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) +void +edi_mainview_panel_remove(Edi_Mainview_Panel *panel) { - int x, y, w, h; - Evas_Object *scroller = _tab_scroller; + evas_object_del(panel->welcome); + evas_object_del(panel->content); + evas_object_del(panel->tabs); + evas_object_del(panel->scroll); + evas_object_del(panel->box); - elm_scroller_region_get(scroller, &x, &y, &w, &h); - x += w * 0.8; - elm_scroller_region_bring_in(scroller, x, y, w, h); + _edi_mainview_panels = eina_list_remove(_edi_mainview_panels, panel); + + free(panel); + panel = NULL; } -static void -_edi_mainview_prev_clicked_cb(void *data EINA_UNUSED, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) +Edi_Mainview_Panel * +edi_mainview_panel_append() { - int x, y, w, h; - Evas_Object *scroller = _tab_scroller; + Edi_Mainview_Panel *panel; + Evas_Object *split, *box; - elm_scroller_region_get(scroller, &x, &y, &w, &h); - x -= w * 0.8; - elm_scroller_region_bring_in(scroller, x, y, w, h); + elm_box_unpack_all(_mainview_parent); + + split = elm_panes_add(_mainview_parent); + evas_object_size_hint_weight_set(split, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(split, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(split); + elm_box_pack_end(_mainview_parent, split); + + box = elm_box_add(_mainview_parent); + evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(box); + + elm_object_part_content_set(split, "left", _mainview_panel); + elm_object_part_content_set(split, "right", box); + + panel = edi_mainview_panel_add(box); + _edi_mainview_panels = eina_list_append(_edi_mainview_panels, panel); + + _mainview_panel = split; + + return panel; } void edi_mainview_add(Evas_Object *parent, Evas_Object *win) { - Evas_Object *box, *scroll, *txt, *nf, *tabs, *tab, *bg, *pad, *scr; - Evas_Object *next, *prev, *ico_next, *ico_prev; + Edi_Mainview_Panel *panel; + Evas_Object *box; + _main_win = win; + _mainview_parent = parent; box = elm_box_add(parent); evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(box); elm_box_pack_end(parent, box); + _mainview_panel = box; - tabs = elm_table_add(box); - elm_box_pack_end(box, tabs); - evas_object_size_hint_weight_set(tabs, EVAS_HINT_EXPAND, 0); - evas_object_size_hint_align_set(tabs, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(tabs); - - bg = elm_box_add(tabs); - evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bg, 0.0, EVAS_HINT_FILL); - evas_object_show(bg); - elm_table_pack(tabs, bg, 0, 0, 1, 1); - - next = elm_button_add(tabs); - evas_object_size_hint_weight_set(next, 0, 0); - evas_object_size_hint_align_set(next, 0, EVAS_HINT_FILL); - elm_table_pack(tabs, next, 2, 0, 1, 1); - evas_object_smart_callback_add(next, "clicked", - _edi_mainview_next_clicked_cb, NULL); - - ico_next = elm_icon_add(next); - elm_icon_standard_set(ico_next, "go-next"); - elm_object_part_content_set(next, "icon", ico_next); - evas_object_show(next); - - prev = elm_button_add(tabs); - evas_object_size_hint_weight_set(prev, 0, 0); - evas_object_size_hint_align_set(prev, 0, EVAS_HINT_FILL); - elm_table_pack(tabs, prev, 1, 0, 1, 1); - evas_object_smart_callback_add(prev, "clicked", - _edi_mainview_prev_clicked_cb, NULL); - ico_prev = elm_icon_add(prev); - elm_icon_standard_set(ico_prev, "go-previous"); - elm_object_part_content_set(prev, "icon", ico_prev); - evas_object_show(prev); - - tab = elm_button_add(tabs); - evas_object_size_hint_weight_set(tab, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(tab, 0.0, EVAS_HINT_FILL); - elm_layout_theme_set(tab, "multibuttonentry", "btn", "default"); - elm_object_part_text_set(tab, "elm.btn.text", "hg"); - elm_box_pack_end(bg, tab); - - pad = elm_box_add(tabs); - evas_object_size_hint_weight_set(pad, 0.0, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(pad, 0.0, EVAS_HINT_FILL); - evas_object_size_hint_min_set(pad, 0, 1.5 * elm_config_scale_get()); - elm_box_pack_end(bg, pad); - - scr = elm_scroller_add(parent); - evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, 0.04); - evas_object_size_hint_align_set(scr, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_min_set(scr, 0, 100 * elm_config_scale_get()); - elm_scroller_bounce_set(scr, EINA_FALSE, EINA_FALSE); - elm_scroller_policy_set(scr, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - elm_table_pack(tabs, scr, 0, 0, 1, 1); - evas_object_show(scr); - _tab_scroller = scr; - - tb = elm_box_add(scr); - evas_object_size_hint_weight_set(tb, 0.0, 0.0); - evas_object_size_hint_align_set(tb, 0.0, EVAS_HINT_FILL); - elm_box_horizontal_set(tb, EINA_TRUE); - elm_object_content_set(scr, tb); - evas_object_show(tb); - - nf = elm_box_add(parent); - evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(nf, EVAS_HINT_FILL, EVAS_HINT_FILL); - elm_box_pack_end(box, nf); - evas_object_show(nf); - _content_frame = nf; - - scroll = elm_scroller_add(parent); - evas_object_size_hint_weight_set(scroll, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(scroll, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(scroll); - - txt = elm_label_add(scroll); - elm_object_text_set(txt, "<hilight>Welcome</hilight><br><br>Click on any file to edit."); - evas_object_size_hint_weight_set(txt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(txt, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(txt); - elm_object_content_set(scroll, txt); - - _welcome_panel = scroll; - _edi_mainview_view_show(scroll); + panel = edi_mainview_panel_add(box); + _current_panel = panel; + _edi_mainview_panels = eina_list_append(_edi_mainview_panels, panel); } + diff --git a/src/bin/mainview/edi_mainview.h b/src/bin/mainview/edi_mainview.h index a5f927d..39237ef 100644 --- a/src/bin/mainview/edi_mainview.h +++ b/src/bin/mainview/edi_mainview.h @@ -7,6 +7,7 @@ #include "Edi.h" #include "mainview/edi_mainview_item.h" +#include "mainview/edi_mainview_panel.h" #ifdef __cplusplus extern "C" { @@ -251,6 +252,10 @@ void edi_mainview_project_search_popup_show(); Edi_Mainview_Item *edi_mainview_item_current_get(); +Edi_Mainview_Panel *edi_mainview_panel_current_get(); + +void edi_mainview_tab_select(unsigned int id); + /** * Select the passed item in the mainview UI. * By definition this will already be an open file as the Edi_Mainview_Item will @@ -277,8 +282,14 @@ void edi_mainview_item_prev(); */ void edi_mainview_item_next(); -void edi_mainview_tab_select(unsigned int id); +Edi_Mainview_Panel *edi_mainview_panel_append(); +Edi_Mainview_Panel *edi_mainview_panel_for_item_get(Edi_Mainview_Item *item); +Edi_Mainview_Panel *edi_mainview_panel_by_index(int index); +int edi_mainview_panel_count(void); +int edi_mainview_panel_id(Edi_Mainview_Panel *panel); +void edi_mainview_panel_focus(Edi_Mainview_Panel *panel); +void edi_mainview_panel_remove(Edi_Mainview_Panel *panel); /** * @} * diff --git a/src/bin/mainview/edi_mainview_item.c b/src/bin/mainview/edi_mainview_item.c index 827a653..a54166a 100644 --- a/src/bin/mainview/edi_mainview_item.c +++ b/src/bin/mainview/edi_mainview_item.c @@ -13,3 +13,20 @@ #include "edi_private.h" +Edi_Mainview_Item * +edi_mainview_item_add(Edi_Path_Options *path, const char *mime, + Elm_Object_Item *tab, Evas_Object *win) +{ + Edi_Mainview_Item *item; + + item = malloc(sizeof(Edi_Mainview_Item)); + item->path = eina_stringshare_add(path->path); + item->editortype = path->type; + item->mimetype = mime; + item->tab = tab; + item->win = win; + + item->view = NULL; + return item; +} + diff --git a/src/bin/mainview/edi_mainview_item.h b/src/bin/mainview/edi_mainview_item.h index 2cc5d5b..2d289c8 100644 --- a/src/bin/mainview/edi_mainview_item.h +++ b/src/bin/mainview/edi_mainview_item.h @@ -36,6 +36,9 @@ typedef struct _Edi_Mainview_Item Eina_Bool loaded; } Edi_Mainview_Item; +Edi_Mainview_Item * edi_mainview_item_add(Edi_Path_Options *path, const char *mime, + Elm_Object_Item *tab, Evas_Object *win); + #ifdef __cplusplus } #endif diff --git a/src/bin/mainview/edi_mainview.c b/src/bin/mainview/edi_mainview_panel.c similarity index 52% copy from src/bin/mainview/edi_mainview.c copy to src/bin/mainview/edi_mainview_panel.c index dd43afb..0c28357 100644 --- a/src/bin/mainview/edi_mainview.c +++ b/src/bin/mainview/edi_mainview_panel.c @@ -9,89 +9,96 @@ #include <Elementary.h> #include "mainview/edi_mainview_item.h" +#include "mainview/edi_mainview_panel.h" #include "mainview/edi_mainview.h" #include "editor/edi_editor.h" #include "edi_content_provider.h" -#include "../edi_searchpanel.h" #include "edi_private.h" #include "edi_config.h" -static Evas_Object *_content_frame, *_current_view, *tb, *_main_win, *_welcome_panel, *_tab_scroller; +static Evas_Object *_main_win; static Evas_Object *_edi_mainview_goto_popup; -static Evas_Object *_edi_mainview_search_project_popup; - -static Eina_List *_edi_mainview_items = NULL; static void dummy() {} Edi_Mainview_Item * -edi_mainview_item_current_get() +edi_mainview_panel_item_current_get(Edi_Mainview_Panel *panel) { - Eina_List *item; - Edi_Mainview_Item *it; - - EINA_LIST_FOREACH(_edi_mainview_items, item, it) - { - if (it && it->view == _current_view) - return it; - } - - return NULL; + return panel->current; } unsigned int -edi_mainview_item_current_tab_get() +edi_mainview_panel_item_current_tab_get(Edi_Mainview_Panel *panel) { Eina_List *item; Edi_Mainview_Item *it; unsigned int i = 0; - EINA_LIST_FOREACH(_edi_mainview_items, item, it) + EINA_LIST_FOREACH(panel->items, item, it) { if (!it->win) i++; - if (it && it->view == _current_view) + if (it && it == panel->current) break; } return i; } -static void -_edi_mainview_view_show(Evas_Object *view) +Edi_Mainview_Item * +_edi_mainview_panel_item_for_view_get(Edi_Mainview_Panel *panel, Evas_Object *view) { - elm_box_unpack(_content_frame, _current_view); - evas_object_hide(_current_view); + Eina_List *item; + Edi_Mainview_Item *it; - _current_view = view; - elm_box_pack_end(_content_frame, view); - evas_object_show(view); + EINA_LIST_FOREACH(panel->items, item, it) + { + if (it->view == view) + return it; + } + + return NULL; +} + +Eina_Bool +edi_mainview_panel_item_contains(Edi_Mainview_Panel *panel, Edi_Mainview_Item *item) +{ + Eina_List *it; + Edi_Mainview_Item *panel_item; + + EINA_LIST_FOREACH(panel->items, it, panel_item) + { + if (panel_item == item) + return EINA_TRUE; + } + + return EINA_FALSE; } void -edi_mainview_item_prev() +edi_mainview_panel_item_prev(Edi_Mainview_Panel *panel) { Eina_List *item; Edi_Mainview_Item *it, *first, *prev = NULL; - first = (Edi_Mainview_Item *)eina_list_nth(_edi_mainview_items, 0); - if (first->view == _current_view) + first = (Edi_Mainview_Item *)eina_list_nth(panel->items, 0); + if (first == panel->current) { - prev = eina_list_nth(_edi_mainview_items, eina_list_count(_edi_mainview_items)-1); - edi_mainview_item_select(prev); + prev = eina_list_nth(panel->items, eina_list_count(panel->items)-1); + edi_mainview_panel_item_select(panel, prev); return; } - EINA_LIST_FOREACH(_edi_mainview_items, item, it) + EINA_LIST_FOREACH(panel->items, item, it) { - if (it && it->view == _current_view) + if (it && it == panel->current) { if (prev) - edi_mainview_item_select(prev); + edi_mainview_panel_item_select(panel, prev); return; } @@ -100,48 +107,67 @@ edi_mainview_item_prev() } void -edi_mainview_item_next() +edi_mainview_panel_item_next(Edi_Mainview_Panel *panel) { Eina_List *item; Edi_Mainview_Item *it, *last, *next; Eina_Bool open_next = EINA_FALSE; - last = eina_list_nth(_edi_mainview_items, eina_list_count(_edi_mainview_items)-1); + last = eina_list_nth(panel->items, eina_list_count(panel->items)-1); - if (last->view == _current_view) + if (last == panel->current) { - next = eina_list_nth(_edi_mainview_items, 0); - edi_mainview_item_select(next); + next = eina_list_nth(panel->items, 0); + edi_mainview_panel_item_select(panel, next); return; } - EINA_LIST_FOREACH(_edi_mainview_items, item, it) + EINA_LIST_FOREACH(panel->items, item, it) { if (it && open_next) { - edi_mainview_item_select(it); + edi_mainview_panel_item_select(panel, it); return; } - if (it && it->view == _current_view) + if (it && it == panel->current) open_next = EINA_TRUE; } } void -edi_mainview_tab_select(unsigned int id) +edi_mainview_panel_tab_select(Edi_Mainview_Panel *panel, unsigned int id) { Eina_List *item; Edi_Mainview_Item *it; unsigned int i = 0; - EINA_LIST_FOREACH(_edi_mainview_items, item, it) + EINA_LIST_FOREACH(panel->items, item, it) { if (!it->win) i++; if (i == id) - edi_mainview_item_select(it); + edi_mainview_panel_item_select(panel, it); + } +} + +static void +_edi_mainview_panel_show(Edi_Mainview_Panel *panel, Evas_Object *view) +{ + if (panel->current) + { + elm_box_unpack(panel->content, panel->current->view); + evas_object_hide(panel->current->view); } + else + { + elm_box_unpack(panel->content, panel->welcome); + evas_object_hide(panel->welcome); + } + + panel->current = _edi_mainview_panel_item_for_view_get(panel, view); + elm_box_pack_end(panel->content, view); + evas_object_show(view); } static void @@ -167,7 +193,27 @@ _content_load(Edi_Mainview_Item *item) } void -edi_mainview_item_select(Edi_Mainview_Item *item) +edi_mainview_panel_item_close(Edi_Mainview_Panel *panel, Edi_Mainview_Item *item) +{ + if (!item) + return; + + edi_mainview_item_prev(); + evas_object_del(item->view); + elm_box_unpack(panel->tabs, item->tab); + evas_object_del(item->tab); + panel->items = eina_list_remove(panel->items, item); + + _edi_project_config_tab_remove(item->path); + eina_stringshare_del(item->path); + free(item); + + if (eina_list_count(panel->items) == 0) + _edi_mainview_panel_show(panel, panel->welcome); +} + +void +edi_mainview_panel_item_select(Edi_Mainview_Panel *panel, Edi_Mainview_Item *item) { Eina_List *list; Edi_Mainview_Item *it; @@ -179,7 +225,7 @@ edi_mainview_item_select(Edi_Mainview_Item *item) } else { - EINA_LIST_FOREACH(_edi_mainview_items, list, it) + EINA_LIST_FOREACH(panel->items, list, it) { elm_object_signal_emit(it->tab, "mouse,up,1", "base"); evas_object_geometry_get(it->tab, NULL, NULL, &w, NULL); @@ -190,12 +236,12 @@ edi_mainview_item_select(Edi_Mainview_Item *item) if (!item->loaded) _content_load(item); - _edi_mainview_view_show(item->view); + _edi_mainview_panel_show(panel, item->view); elm_object_signal_emit(item->tab, "mouse,down,1", "base"); evas_object_geometry_get(item->tab, NULL, NULL, &tabw, NULL); - elm_scroller_region_bring_in(_tab_scroller, region_x, 0, tabw, 0); - _edi_project_config->current_tab = edi_mainview_item_current_tab_get(); + elm_scroller_region_bring_in(panel->tabs, region_x, 0, tabw, 0); + _edi_project_config->current_tab = edi_mainview_panel_item_current_tab_get(panel); _edi_project_config_save(); } @@ -203,80 +249,38 @@ edi_mainview_item_select(Edi_Mainview_Item *item) } static void -_edi_mainview_item_close(Edi_Mainview_Item *item) -{ - if (!item) - return; - - edi_mainview_item_prev(); - evas_object_del(item->view); - elm_box_unpack(tb, item->tab); - evas_object_del(item->tab); - _edi_mainview_items = eina_list_remove(_edi_mainview_items, item); - - _edi_project_config_tab_remove(item->path); - eina_stringshare_del(item->path); - free(item); - - if (eina_list_count(_edi_mainview_items) == 0) - _edi_mainview_view_show(_welcome_panel); -} - -static void _promote(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { - edi_mainview_item_select((Edi_Mainview_Item *)data); + Edi_Mainview_Panel *panel; + + panel = edi_mainview_panel_for_item_get((Edi_Mainview_Item *)data); + edi_mainview_panel_focus(panel); + edi_mainview_panel_item_select(panel, (Edi_Mainview_Item *)data); } static void _closetab(void *data, Evas_Object *obj EINA_UNUSED, const char *emission EINA_UNUSED, const char *source EINA_UNUSED) { - _edi_mainview_item_close(data); -} + Edi_Mainview_Panel *panel; -static Edi_Mainview_Item * -_get_item_for_path(const char *path) -{ - Eina_List *item; - Edi_Mainview_Item *it; - - EINA_LIST_FOREACH(_edi_mainview_items, item, it) + panel = edi_mainview_panel_for_item_get((Edi_Mainview_Item *)data); + edi_mainview_panel_item_close(panel, data); + if (eina_list_count(panel->items)== 0) { - if (it && !strcmp(it->path, path)) - return it; + edi_mainview_panel_remove(panel); } - return NULL; -} - -static Edi_Mainview_Item * -_edi_mainview_item_add(Edi_Path_Options *path, const char *mime, Elm_Object_Item *tab, - Evas_Object *win) -{ - Edi_Mainview_Item *item; - - item = malloc(sizeof(Edi_Mainview_Item)); - item->path = eina_stringshare_add(path->path); - item->editortype = path->type; - item->mimetype = mime; - item->tab = tab; - item->win = win; - - _edi_mainview_items = eina_list_append(_edi_mainview_items, item); - - return item; } static Evas_Object * -_edi_mainview_content_create(Edi_Mainview_Item *item, Evas_Object *parent) +_edi_mainview_panel_content_create(Edi_Mainview_Item *item, Evas_Object *parent) { Evas_Object *container; container = elm_box_add(parent); evas_object_size_hint_weight_set(container, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(container, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(container); item->loaded = EINA_FALSE; item->container = container; @@ -285,18 +289,23 @@ _edi_mainview_content_create(Edi_Mainview_Item *item, Evas_Object *parent) } static void -_edi_mainview_item_tab_add(Edi_Path_Options *options, const char *mime) +_edi_mainview_panel_item_tab_add(Edi_Mainview_Panel *panel, Edi_Path_Options *options, const char *mime) { Evas_Object *content, *tab;//, *icon; Edi_Mainview_Item *item; Edi_Editor *editor; - item = _edi_mainview_item_add(options, mime, NULL, NULL); - content = _edi_mainview_content_create(item, _content_frame); - _edi_mainview_view_show(content); + if (!panel) return; + + int id = edi_mainview_panel_id(panel); + + item = edi_mainview_item_add(options, mime, NULL, NULL); + content = _edi_mainview_panel_content_create(item, panel->content); item->view = content; + panel->items = eina_list_append(panel->items, item); + _edi_mainview_panel_show(panel, content); - tab = elm_button_add(tb); + tab = elm_button_add(panel->tabs); evas_object_size_hint_weight_set(tab, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(tab, 0.0, EVAS_HINT_FILL); @@ -310,13 +319,13 @@ _edi_mainview_item_tab_add(Edi_Path_Options *options, const char *mime) elm_layout_signal_callback_add(tab, "mouse,clicked,1", "*", _promote, item); elm_layout_signal_callback_add(tab, "elm,deleted", "elm", _closetab, item); - elm_box_pack_end(tb, tab); + elm_box_pack_end(panel->tabs, tab); evas_object_show(tab); - elm_box_recalculate(tb); + elm_box_recalculate(panel->tabs); item->tab = tab; if (!options->background) - edi_mainview_item_select(item); + edi_mainview_panel_item_select(panel, item); // Set focus on the newly opening window so that one can just start typing editor = (Edi_Editor *)evas_object_data_get(content, "editor"); @@ -326,72 +335,26 @@ _edi_mainview_item_tab_add(Edi_Path_Options *options, const char *mime) if (options->line) { if (options->character > 1) - edi_mainview_goto_position(options->line, options->character); + edi_mainview_panel_goto_position(panel, options->line, options->character); else - edi_mainview_goto(options->line); + edi_mainview_panel_goto(panel, options->line); } - _edi_project_config_tab_add(options->path, mime?mime:options->type, EINA_FALSE); + _edi_project_config_tab_add(options->path, mime?mime:options->type, EINA_FALSE, id); } -static void -_edi_mainview_win_exit(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +static Edi_Mainview_Item * +_get_item_for_path(Edi_Mainview_Panel *panel, const char *path) { + Eina_List *item; Edi_Mainview_Item *it; - evas_object_hide(obj); - - it = evas_object_data_get(obj, "edi_mainview_item"); - _edi_mainview_items = eina_list_remove(_edi_mainview_items, it); - - _edi_project_config_tab_remove(it->path); - eina_stringshare_del(it->path); - - if (edi_noproject()) - edi_close(); - free(it); -} - -static char * -_edi_mainview_win_title_get(const char *path) -{ - char *winname, *filename; - - filename = basename((char*)path); - winname = malloc((8 + strlen(filename)) * sizeof(char)); - snprintf(winname, 8 + strlen(filename), "Edi :: %s", filename); - - return winname; -} - -static void -_edi_mainview_item_win_add(Edi_Path_Options *options, const char *mime) -{ - Evas_Object *win, *content; - Edi_Mainview_Item *item; - Edi_Editor *editor; - - win = elm_win_util_standard_add("mainview", _edi_mainview_win_title_get(options->path)); - if (!win) return; - - elm_win_focus_highlight_enabled_set(win, EINA_TRUE); - evas_object_smart_callback_add(win, "delete,request", _edi_mainview_win_exit, NULL); - item = _edi_mainview_item_add(options, mime, NULL, win); - evas_object_data_set(win, "edi_mainview_item", item); - - content = _edi_mainview_content_create(item, win); - elm_win_resize_object_add(win, content); - _content_load(item); - - // Set focus on the newly opening window so that one can just start typing - editor = (Edi_Editor *)evas_object_data_get(content, "editor"); - if (editor) - elm_object_focus_set(editor->entry, EINA_TRUE); - - evas_object_resize(win, 380 * elm_config_scale_get(), 260 * elm_config_scale_get()); - evas_object_show(win); - - _edi_project_config_tab_add(options->path, mime?mime:options->type, EINA_TRUE); + EINA_LIST_FOREACH(panel->items, item, it) + { + if (it && !strcmp(it->path, path)) + return it; + } + return NULL; } static void @@ -402,7 +365,7 @@ _edi_popup_cancel_cb(void *data, Evas_Object *obj EINA_UNUSED, } static void -_edi_mainview_mime_content_safe_popup(void) +_edi_mainview_panel_mime_content_safe_popup(void) { Evas_Object *popup, *label, *button; @@ -422,203 +385,23 @@ _edi_mainview_mime_content_safe_popup(void) evas_object_show(popup); } -static void -_edi_mainview_tab_stat_done(void *data, Eio_File *handler EINA_UNUSED, const Eina_Stat *stat) -{ - Edi_Path_Options *options; - Edi_Content_Provider *provider; - const char *mime; - - options = data; - if (!S_ISREG(stat->mode)) - return; - - mime = efreet_mime_type_get(options->path); - provider = edi_content_provider_for_mime_get(mime); - if (!provider) - { - _edi_mainview_mime_content_safe_popup(); - return; - } - - options->type = provider->id; - _edi_mainview_item_tab_add(options, mime); -} - -static void -_edi_mainview_win_stat_done(void *data, Eio_File *handler EINA_UNUSED, const Eina_Stat *stat) -{ - Edi_Path_Options *options; - Edi_Content_Provider *provider; - const char *mime; - - options = data; - if (!S_ISREG(stat->mode)) - return; - - mime = efreet_mime_type_get(options->path); - provider = edi_content_provider_for_mime_get(mime); - if (!provider) - { - _edi_mainview_mime_content_safe_popup(); - return; - } - - options->type = provider->id; - _edi_mainview_item_win_add(options, mime); -} - -void -edi_mainview_open_path(const char *path) -{ - Edi_Path_Options *options; - - options = edi_path_options_create(path); - edi_mainview_open(options); -} - void -edi_mainview_open(Edi_Path_Options *options) +edi_mainview_panel_close(Edi_Mainview_Panel *panel) { - Edi_Mainview_Item *it; - - it = _get_item_for_path(options->path); - if (it) - { - edi_mainview_item_select(it); - if (options->line) - { - if (options->character > 1) - edi_mainview_goto_position(options->line, options->character); - else - edi_mainview_goto(options->line); - } - return; - } - - if (options->type == NULL) - { - eio_file_direct_stat(options->path, _edi_mainview_tab_stat_done, dummy, options); - } - else if (!edi_content_provider_for_id_get(options->type)) - { - const char *mime = options->type; - Edi_Content_Provider *provider = edi_content_provider_for_mime_get(mime); - - if (provider) - options->type = provider->id; - else - options->type = NULL; - - _edi_mainview_item_tab_add(options, mime); - } - else - { - _edi_mainview_item_tab_add(options, NULL); - } -} - -void -edi_mainview_open_window_path(const char *path) -{ - Edi_Path_Options *options; - - options = edi_path_options_create(path); - - edi_mainview_open_window(options); -} - -void -edi_mainview_open_window(Edi_Path_Options *options) -{ - Edi_Mainview_Item *it; - - it = _get_item_for_path(options->path); - if (it) - { - edi_mainview_item_select(it); - _edi_mainview_item_close(it); - _edi_mainview_items = eina_list_remove(_edi_mainview_items, it); - } - - if (options->type == NULL) - { - eio_file_direct_stat(options->path, _edi_mainview_win_stat_done, dummy, options); - } - else if (!edi_content_provider_for_id_get(options->type)) - { - const char *mime = options->type; - Edi_Content_Provider *provider = edi_content_provider_for_mime_get(mime); - - if (provider) - options->type = provider->id; - else - options->type = NULL; - - _edi_mainview_item_win_add(options, mime); - } - else - { - _edi_mainview_item_win_add(options, NULL); - } -} - -void -edi_mainview_close_all(void) -{ - Eina_List *item; - Edi_Mainview_Item *it; - - EINA_LIST_FOREACH(_edi_mainview_items, item, it) - { - if (it) - _edi_mainview_item_close(it); - } -} - -void -edi_mainview_refresh_all(void) -{ - Eina_List *item; - Edi_Mainview_Item *it; - char *path; - - EINA_LIST_FOREACH(_edi_mainview_items, item, it) - { - if (it) - { - path = strdup(it->path); - _edi_mainview_item_close(it); - if (ecore_file_exists(path)) - edi_mainview_open_path(path); - free(path); - } - } -} + Edi_Mainview_Item *item; -void -edi_mainview_item_close_path(const char *path) -{ - Eina_List *item; - Edi_Mainview_Item *it; + item = edi_mainview_panel_item_current_get(panel); - EINA_LIST_FOREACH(_edi_mainview_items, item, it) - { - if (it && !strcmp(it->path, path)) - { - _edi_mainview_item_close(it); - return; - } - } + edi_mainview_panel_item_close(panel, item); } void -edi_mainview_save() +edi_mainview_panel_save(Edi_Mainview_Panel *panel) { Edi_Editor *editor; Elm_Code *code; - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); + editor = (Edi_Editor *)evas_object_data_get(panel->current->view, "editor"); if (!editor) return; @@ -631,56 +414,25 @@ edi_mainview_save() } void -edi_mainview_new_window() -{ - Edi_Mainview_Item *item; - - item = edi_mainview_item_current_get(); - if (!item) - return; - - edi_mainview_open_window_path(item->path); -} - -void -edi_mainview_close() -{ - Edi_Mainview_Item *item; - - item = edi_mainview_item_current_get(); - - _edi_mainview_item_close(item); -} - -void -edi_mainview_closeall() -{ - Eina_List *list, *next; - Edi_Mainview_Item *item; - - EINA_LIST_FOREACH_SAFE(_edi_mainview_items, list, next, item) - { - _edi_mainview_item_close(item); - } -} - -void -edi_mainview_undo() +edi_mainview_panel_undo(Edi_Mainview_Panel *panel) { Edi_Editor *editor; - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); + editor = (Edi_Editor *)evas_object_data_get(panel->current->view, "editor"); if (editor) elm_code_widget_undo(editor->entry); } Eina_Bool -edi_mainview_can_undo() +edi_mainview_panel_can_undo(Edi_Mainview_Panel *panel) { Edi_Editor *editor; - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); + if (!panel->current) + return EINA_FALSE; + + editor = (Edi_Editor *)evas_object_data_get(panel->current->view, "editor"); if (!editor) return EINA_FALSE; @@ -689,22 +441,25 @@ edi_mainview_can_undo() } void -edi_mainview_redo() +edi_mainview_panel_redo(Edi_Mainview_Panel *panel) { Edi_Editor *editor; - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); + editor = (Edi_Editor *)evas_object_data_get(panel->current->view, "editor"); if (editor) elm_code_widget_redo(editor->entry); } Eina_Bool -edi_mainview_can_redo() +edi_mainview_panel_can_redo(Edi_Mainview_Panel *panel) { Edi_Editor *editor; - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); + if (!panel->current) + return EINA_FALSE; + + editor = (Edi_Editor *)evas_object_data_get(panel->current->view, "editor"); if (!editor) return EINA_FALSE; @@ -713,11 +468,14 @@ edi_mainview_can_redo() } Eina_Bool -edi_mainview_modified() +edi_mainview_panel_modified(Edi_Mainview_Panel *panel) { Edi_Editor *editor; - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); + if (!panel->current) + return EINA_FALSE; + + editor = (Edi_Editor *)evas_object_data_get(panel->current->view, "editor"); if (!editor) return EINA_FALSE; @@ -725,61 +483,61 @@ edi_mainview_modified() } void -edi_mainview_cut() +edi_mainview_panel_cut(Edi_Mainview_Panel *panel) { Edi_Editor *editor; - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); + editor = (Edi_Editor *)evas_object_data_get(panel->current->view, "editor"); if (editor) elm_code_widget_selection_cut(editor->entry); } void -edi_mainview_copy() +edi_mainview_panel_copy(Edi_Mainview_Panel *panel) { Edi_Editor *editor; - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); + editor = (Edi_Editor *)evas_object_data_get(panel->current->view, "editor"); if (editor) elm_code_widget_selection_copy(editor->entry); } void -edi_mainview_paste() +edi_mainview_panel_paste(Edi_Mainview_Panel *panel) { Edi_Editor *editor; - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); + editor = (Edi_Editor *)evas_object_data_get(panel->current->view, "editor"); if (editor) elm_code_widget_selection_paste(editor->entry); } void -edi_mainview_search() +edi_mainview_panel_search(Edi_Mainview_Panel *panel) { Edi_Editor *editor; - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); + editor = (Edi_Editor *)evas_object_data_get(panel->current->view, "editor"); if (editor) edi_editor_search(editor); } void -edi_mainview_goto(unsigned int number) +edi_mainview_panel_goto(Edi_Mainview_Panel *panel, unsigned int number) { - edi_mainview_goto_position(number, 1); + edi_mainview_panel_goto_position(panel, number, 1); } void -edi_mainview_goto_position(unsigned int row, unsigned int col) +edi_mainview_panel_goto_position(Edi_Mainview_Panel *panel, unsigned int row, unsigned int col) { Edi_Editor *editor; - editor = (Edi_Editor *)evas_object_data_get(_current_view, "editor"); + editor = (Edi_Editor *)evas_object_data_get(panel->current->view, "editor"); if (!editor || row <= 0 || col <= 0) return; @@ -788,7 +546,7 @@ edi_mainview_goto_position(unsigned int row, unsigned int col) } static void -_edi_mainview_goto_popup_go_cb(void *data, +_edi_mainview_panel_goto_popup_go_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -801,28 +559,21 @@ _edi_mainview_goto_popup_go_cb(void *data, } static void -_edi_mainview_goto_popup_cancel_cb(void *data EINA_UNUSED, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) -{ - evas_object_del(_edi_mainview_goto_popup); -} - -static void -_edi_mainview_goto_popup_key_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, +_edi_mainview_panel_goto_popup_key_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) { + Edi_Mainview_Panel *panel = data; Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *)event_info; const char *str; str = elm_object_text_get(obj); if (strlen(str) && (!strcmp(ev->key, "KP_Enter") || !strcmp(ev->key, "Return"))) - _edi_mainview_goto_popup_go_cb(obj, NULL, NULL); + _edi_mainview_panel_goto_popup_go_cb(panel, obj, NULL); } void -edi_mainview_goto_popup_show() +edi_mainview_panel_goto_popup_show(Edi_Mainview_Panel *panel) { Evas_Object *popup, *box, *input, *button; @@ -838,7 +589,7 @@ edi_mainview_goto_popup_show() input = elm_entry_add(box); elm_entry_single_line_set(input, EINA_TRUE); elm_entry_scrollable_set(input, EINA_TRUE); - evas_object_event_callback_add(input, EVAS_CALLBACK_KEY_UP, _edi_mainview_goto_popup_key_up_cb, NULL); + evas_object_event_callback_add(input, EVAS_CALLBACK_KEY_UP, _edi_mainview_panel_goto_popup_key_up_cb, panel); evas_object_size_hint_weight_set(input, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_align_set(input, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(input); @@ -848,92 +599,151 @@ edi_mainview_goto_popup_show() elm_object_text_set(button, "cancel"); elm_object_part_content_set(popup, "button1", button); evas_object_smart_callback_add(button, "clicked", - _edi_mainview_goto_popup_cancel_cb, NULL); + _edi_popup_cancel_cb, NULL); button = elm_button_add(popup); elm_object_text_set(button, "go"); elm_object_part_content_set(popup, "button2", button); evas_object_smart_callback_add(button, "clicked", - _edi_mainview_goto_popup_go_cb, input); + _edi_mainview_panel_goto_popup_go_cb, input); evas_object_show(popup); elm_object_focus_set(input, EINA_TRUE); } static void -_edi_mainview_project_search_popup_cancel_cb(void *data EINA_UNUSED, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) +_edi_mainview_panel_tab_stat_done(void *data, Eio_File *handler EINA_UNUSED, const Eina_Stat *stat) { - evas_object_del(_edi_mainview_search_project_popup); + Edi_Mainview_Panel *panel; + Edi_Path_Options *options; + Edi_Content_Provider *provider; + const char *mime; + + options = data; + if (!S_ISREG(stat->mode)) + return; + + mime = efreet_mime_type_get(options->path); + provider = edi_content_provider_for_mime_get(mime); + if (!provider) + { + _edi_mainview_panel_mime_content_safe_popup(); + return; + } + + options->type = provider->id; + panel = edi_mainview_panel_current_get(); + _edi_mainview_panel_item_tab_add(panel, options, mime); } -static void -_edi_mainview_project_search_cb(void *data, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) +void +edi_mainview_panel_open_path(Edi_Mainview_Panel *panel, const char *path) +{ + Edi_Path_Options *options; + + options = edi_path_options_create(path); + edi_mainview_panel_open(panel, options); +} + +void +edi_mainview_panel_open(Edi_Mainview_Panel *panel, Edi_Path_Options *options) { - const char *text_markup; - char *text; + Edi_Mainview_Item *it; + + edi_mainview_panel_focus(panel); - text_markup = elm_object_text_get((Evas_Object *) data); - if (!text_markup || !text_markup[0]) return; + it = _get_item_for_path(panel, options->path); + if (it) + { + edi_mainview_panel_item_select(panel, it); + if (options->line) + { + if (options->character > 1) + edi_mainview_goto_position(options->line, options->character); + else + edi_mainview_goto(options->line); + } + return; + } - text = elm_entry_markup_to_utf8(text_markup); + if (options->type == NULL) + { + eio_file_direct_stat(options->path, _edi_mainview_panel_tab_stat_done, dummy, options); + } + else if (!edi_content_provider_for_id_get(options->type)) + { + const char *mime = options->type; + Edi_Content_Provider *provider = edi_content_provider_for_mime_get(mime); - edi_searchpanel_show(); - edi_searchpanel_find(text); + if (provider) + options->type = provider->id; + else + options->type = NULL; - free(text); - evas_object_del(_edi_mainview_search_project_popup); + _edi_mainview_panel_item_tab_add(panel, options, mime); + } + else + { + _edi_mainview_panel_item_tab_add(panel, options, NULL); + } } void -edi_mainview_project_search_popup_show(void) +edi_mainview_panel_close_all(Edi_Mainview_Panel *panel) { - Evas_Object *popup, *box, *input, *button; - - popup = elm_popup_add(_main_win); - _edi_mainview_search_project_popup = popup; - elm_object_part_text_set(popup, "title,text", - "Search for"); + Eina_List *item; + Edi_Mainview_Item *it; - box = elm_box_add(popup); - elm_box_horizontal_set(box, EINA_FALSE); - elm_object_content_set(popup, box); + EINA_LIST_FOREACH(panel->items, item, it) + { + if (it) + edi_mainview_panel_item_close(panel, it); + } +} - input = elm_entry_add(box); - elm_entry_single_line_set(input, EINA_TRUE); - elm_entry_scrollable_set(input, EINA_TRUE); - evas_object_event_callback_add(input, EVAS_CALLBACK_KEY_UP, _edi_mainview_goto_popup_key_up_cb, NULL); - evas_object_size_hint_weight_set(input, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(input, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(input); - elm_box_pack_end(box, input); +void +edi_mainview_panel_refresh_all(Edi_Mainview_Panel *panel) +{ + Eina_List *item; + Edi_Mainview_Item *it; + char *path; - button = elm_button_add(popup); - elm_object_text_set(button, "cancel"); - elm_object_part_content_set(popup, "button1", button); - evas_object_smart_callback_add(button, "clicked", - _edi_mainview_project_search_popup_cancel_cb, NULL); + EINA_LIST_FOREACH(panel->items, item, it) + { + if (it) + { + path = strdup(it->path); + edi_mainview_panel_item_close(panel, it); + if (ecore_file_exists(path)) + edi_mainview_panel_open_path(panel, path); + free(path); + } + } +} - button = elm_button_add(popup); - elm_object_text_set(button, "search"); - elm_object_part_content_set(popup, "button2", button); - evas_object_smart_callback_add(button, "clicked", - _edi_mainview_project_search_cb, input); +void +edi_mainview_panel_item_close_path(Edi_Mainview_Panel *panel, const char *path) +{ + Eina_List *item; + Edi_Mainview_Item *it; - evas_object_show(popup); - elm_object_focus_set(input, EINA_TRUE); + EINA_LIST_FOREACH(panel->items, item, it) + { + if (it && !strcmp(it->path, path)) + { + edi_mainview_panel_item_close(panel, it); + return; + } + } } static void -_edi_mainview_next_clicked_cb(void *data EINA_UNUSED, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) +_edi_mainview_panel_next_clicked_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { int x, y, w, h; - Evas_Object *scroller = _tab_scroller; + Evas_Object *scroller = data; elm_scroller_region_get(scroller, &x, &y, &w, &h); x += w * 0.8; @@ -941,24 +751,27 @@ _edi_mainview_next_clicked_cb(void *data EINA_UNUSED, } static void -_edi_mainview_prev_clicked_cb(void *data EINA_UNUSED, - Evas_Object *obj EINA_UNUSED, - void *event_info EINA_UNUSED) +_edi_mainview_panel_prev_clicked_cb(void *data, + Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) { int x, y, w, h; - Evas_Object *scroller = _tab_scroller; + Evas_Object *scroller = data; elm_scroller_region_get(scroller, &x, &y, &w, &h); x -= w * 0.8; elm_scroller_region_bring_in(scroller, x, y, w, h); } -void -edi_mainview_add(Evas_Object *parent, Evas_Object *win) +Edi_Mainview_Panel * +edi_mainview_panel_add(Evas_Object *parent) { - Evas_Object *box, *scroll, *txt, *nf, *tabs, *tab, *bg, *pad, *scr; + Edi_Mainview_Panel *panel; + Evas_Object *box, *scroll, *txt, *nf, *tabs, *tab, *bg, *pad, *scr, *tb; Evas_Object *next, *prev, *ico_next, *ico_prev; - _main_win = win; + _main_win = parent; + + panel = calloc(1, sizeof(*panel)); box = elm_box_add(parent); evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -967,10 +780,10 @@ edi_mainview_add(Evas_Object *parent, Evas_Object *win) elm_box_pack_end(parent, box); tabs = elm_table_add(box); - elm_box_pack_end(box, tabs); evas_object_size_hint_weight_set(tabs, EVAS_HINT_EXPAND, 0); evas_object_size_hint_align_set(tabs, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(tabs); + elm_box_pack_end(box, tabs); bg = elm_box_add(tabs); evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -978,29 +791,38 @@ edi_mainview_add(Evas_Object *parent, Evas_Object *win) evas_object_show(bg); elm_table_pack(tabs, bg, 0, 0, 1, 1); - next = elm_button_add(tabs); - evas_object_size_hint_weight_set(next, 0, 0); - evas_object_size_hint_align_set(next, 0, EVAS_HINT_FILL); - elm_table_pack(tabs, next, 2, 0, 1, 1); - evas_object_smart_callback_add(next, "clicked", - _edi_mainview_next_clicked_cb, NULL); - - ico_next = elm_icon_add(next); - elm_icon_standard_set(ico_next, "go-next"); - elm_object_part_content_set(next, "icon", ico_next); - evas_object_show(next); + scr = elm_scroller_add(parent); + evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, 0.04); + evas_object_size_hint_align_set(scr, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_min_set(scr, 0, 100 * elm_config_scale_get()); + elm_scroller_bounce_set(scr, EINA_FALSE, EINA_FALSE); + elm_scroller_policy_set(scr, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_table_pack(tabs, scr, 0, 0, 1, 1); + evas_object_show(scr); prev = elm_button_add(tabs); evas_object_size_hint_weight_set(prev, 0, 0); evas_object_size_hint_align_set(prev, 0, EVAS_HINT_FILL); elm_table_pack(tabs, prev, 1, 0, 1, 1); evas_object_smart_callback_add(prev, "clicked", - _edi_mainview_prev_clicked_cb, NULL); + _edi_mainview_panel_prev_clicked_cb, scr); ico_prev = elm_icon_add(prev); elm_icon_standard_set(ico_prev, "go-previous"); elm_object_part_content_set(prev, "icon", ico_prev); evas_object_show(prev); + next = elm_button_add(tabs); + evas_object_size_hint_weight_set(next, 0, 0); + evas_object_size_hint_align_set(next, 0, EVAS_HINT_FILL); + elm_table_pack(tabs, next, 2, 0, 1, 1); + evas_object_smart_callback_add(next, "clicked", + _edi_mainview_panel_next_clicked_cb, scr); + + ico_next = elm_icon_add(next); + elm_icon_standard_set(ico_next, "go-next"); + elm_object_part_content_set(next, "icon", ico_next); + evas_object_show(next); + tab = elm_button_add(tabs); evas_object_size_hint_weight_set(tab, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(tab, 0.0, EVAS_HINT_FILL); @@ -1014,34 +836,28 @@ edi_mainview_add(Evas_Object *parent, Evas_Object *win) evas_object_size_hint_min_set(pad, 0, 1.5 * elm_config_scale_get()); elm_box_pack_end(bg, pad); - scr = elm_scroller_add(parent); - evas_object_size_hint_weight_set(scr, EVAS_HINT_EXPAND, 0.04); - evas_object_size_hint_align_set(scr, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_min_set(scr, 0, 100 * elm_config_scale_get()); - elm_scroller_bounce_set(scr, EINA_FALSE, EINA_FALSE); - elm_scroller_policy_set(scr, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - elm_table_pack(tabs, scr, 0, 0, 1, 1); - evas_object_show(scr); - _tab_scroller = scr; - tb = elm_box_add(scr); evas_object_size_hint_weight_set(tb, 0.0, 0.0); evas_object_size_hint_align_set(tb, 0.0, EVAS_HINT_FILL); elm_box_horizontal_set(tb, EINA_TRUE); elm_object_content_set(scr, tb); evas_object_show(tb); + panel->tabs = tb; + panel->box = box; + panel->tb = tb; nf = elm_box_add(parent); evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(nf, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_box_pack_end(box, nf); evas_object_show(nf); - _content_frame = nf; + panel->content = nf; scroll = elm_scroller_add(parent); evas_object_size_hint_weight_set(scroll, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(scroll, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(scroll); + panel->scroll = scroll; txt = elm_label_add(scroll); elm_object_text_set(txt, "<hilight>Welcome</hilight><br><br>Click on any file to edit."); @@ -1050,6 +866,8 @@ edi_mainview_add(Evas_Object *parent, Evas_Object *win) evas_object_show(txt); elm_object_content_set(scroll, txt); - _welcome_panel = scroll; - _edi_mainview_view_show(scroll); + panel->welcome = scroll; + _edi_mainview_panel_show(panel, scroll); + return panel; } + diff --git a/src/bin/mainview/edi_mainview_panel.h b/src/bin/mainview/edi_mainview_panel.h new file mode 100644 index 0000000..edbb1a9 --- /dev/null +++ b/src/bin/mainview/edi_mainview_panel.h @@ -0,0 +1,290 @@ +#ifndef EDI_MAINVIEW_PANEL_H_ +# define EDI_MAINVIEW_PANEL_H_ + +#include <Elementary.h> +#include <Evas.h> + +#include "Edi.h" + +#include "mainview/edi_mainview_item.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file + * @brief These routines are used for managing content panels within the + * main area of the Edi interface. + */ + + +/** + * @struct _Edi_Mainview_Panel + * A panel within mainview, holds many mainview items. + */ +typedef struct _Edi_Mainview_Panel +{ + Eina_List *items; + + Edi_Mainview_Item *current; + Evas_Object *box, *scroll, *tabs, *content, *welcome, *tb; +} Edi_Mainview_Panel; + +/** + * @brief Content management functions. + * @defgroup Content + * + * @{ + * + * Opening and managing content within the view. + * + */ + +/** + * Initialise a new Edi main view panel inside the parent container. + * + * @param parent The mainview parent into which the panel will be loaded. + * @return the panel that represents tha added mainview panel. + * + * @ingroup Content + */ +Edi_Mainview_Panel *edi_mainview_panel_add(Evas_Object *parent); + +/** + * Close mainview by path. + * + * @param panel the mainview panel context + * @praram path The path of file to close. + * + * @ingroup Content + */ +void edi_mainview_panel_item_close_path(Edi_Mainview_Panel *panel, const char *path); + +/** + * Refresh all existing open files. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +void edi_mainview_panel_refresh_all(Edi_Mainview_Panel *panel); + +/** + * Close all existing open files. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +void edi_mainview_panel_close_all(Edi_Mainview_Panel *panel); + +/** + * Open the file at path for editing within this panel. + * Supported types are "text" and "image". + * + * @param panel the mainview panel context + * @param path The absolute path of the file to open. + * + * @ingroup Content + */ +void edi_mainview_panel_open_path(Edi_Mainview_Panel *panel, const char *path); + +/** + * Open the file described in the provided options in this panel + * - path and location etc. + * + * @param panel the mainview panel context + * @param path The path and options of the file to open. + * + * @ingroup Content + */ +void edi_mainview_panel_open(Edi_Mainview_Panel *panel, Edi_Path_Options *options); + +void edi_mainview_panel_item_close(Edi_Mainview_Panel *panel, Edi_Mainview_Item *item); + +void edi_mainview_panel_item_select(Edi_Mainview_Panel *panel, Edi_Mainview_Item *item); + +/** + * Select the previous open tab. + * Previous means the next tab left, if there is one. + * + * @param panel the mainview panel context + * + * @ingroup Tabs + */ +void edi_mainview_panel_item_prev(Edi_Mainview_Panel *panel); + +/** + * Select the next open tab. + * Next means the next tab to the right, if there is one. + * + * @param panel the mainview panel context + * + * @ingroup Tabs + */ +void edi_mainview_panel_item_next(Edi_Mainview_Panel *panel); + +void edi_mainview_panel_tab_select(Edi_Mainview_Panel *panel, unsigned int id); + +Eina_Bool edi_mainview_panel_item_contains(Edi_Mainview_Panel *panel, Edi_Mainview_Item *item); + +Edi_Mainview_Item *edi_mainview_panel_item_current_get(Edi_Mainview_Panel *panel); + +/** + * Save the current file. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +void edi_mainview_panel_save(Edi_Mainview_Panel *panel); + +/** + * Move the current tab to a new window. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +void edi_mainview_panel_new_window(Edi_Mainview_Panel *panel); + +/** + * Close the current file. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +void edi_mainview_panel_close(Edi_Mainview_Panel *panel); + +/** + * Close all open files. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +void edi_mainview_panel_closeall(Edi_Mainview_Panel *panel); + +/** + * Undo the most recent change in the current view. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +void edi_mainview_panel_undo(Edi_Mainview_Panel *panel); + +/** + * Return if editor has been modified + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +Eina_Bool edi_mainview_panel_modified(Edi_Mainview_Panel *panel); + +/** + * See whether the current view can undo a change. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +Eina_Bool edi_mainview_panel_can_undo(Edi_Mainview_Panel *panel); + +/** + * Redo the most recent change in the current view. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +void edi_mainview_panel_redo(Edi_Mainview_Panel *panel); + +/** + * See whether the current view can redo a change. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +Eina_Bool edi_mainview_panel_can_redo(Edi_Mainview_Panel *panel); + +/** + * Cut the current selection into the clipboard. + * + * @param panel the mainview panel context + * +* @ingroup Content + */ +void edi_mainview_panel_cut(Edi_Mainview_Panel *panel); + +/** + * Copy the current selection into the clipboard. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +void edi_mainview_panel_copy(Edi_Mainview_Panel *panel); + +/** + * Paste the current clipboard contents at the current cursor position. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +void edi_mainview_panel_paste(Edi_Mainview_Panel *panel); + +/** + * Search the current view's contents. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +void edi_mainview_panel_search(Edi_Mainview_Panel *panel); + +/** + * Go to a requested line in the panel's current view contents. + * + * @param panel the mainview panel context + * @param line the line number (1 based) to scroll to + * + * @ingroup Content + */ +void edi_mainview_panel_goto(Edi_Mainview_Panel *panel, unsigned int line); + +/** + * Go to a requested line, column position in the panel's current view contents. + * + * @param panel the mainview panel context + * @param row the line number (1 based) to scroll to + * @param col the column position (1 based) to scroll to + * + * @ingroup Content + */ +void edi_mainview_panel_goto_position(Edi_Mainview_Panel *panel, unsigned int row, unsigned int col); + +/** + * Present a popup that will initiate a goto in the current panel view. + * + * @param panel the mainview panel context + * + * @ingroup Content + */ +void edi_mainview_panel_goto_popup_show(); + +/** + * @} + * + */ + +#ifdef __cplusplus +} +#endif + +#endif /* EDI_MAINVIEW_PANEL_H_ */ --
