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_ */

-- 


Reply via email to