View: Moved the grid data from base view to each grid file 32/43332/2
authorHyojung Jo <hj903.jo@samsung.com>
Wed, 8 Jul 2015 06:03:46 +0000 (15:03 +0900)
committerHyojung Jo <hj903.jo@samsung.com>
Wed, 8 Jul 2015 08:25:32 +0000 (17:25 +0900)
Change-Id: Ic00fa7d81374908ecd0be49b83f9035af8801810
Signed-off-by: Hyojung Jo <hj903.jo@samsung.com>
18 files changed:
include/define.h
include/grid.h [moved from include/grid/grid_apps.h with 51% similarity]
include/grid/grid_gallery.h [deleted file]
include/grid/grid_movie.h [deleted file]
include/grid/grid_music.h [deleted file]
include/grid/grid_tv.h [deleted file]
include/grid/grid_webs.h [deleted file]
include/utils.h
include/view_base.h [moved from include/view/view_base.h with 100% similarity]
src/common/utils.c
src/grid/grid_apps.c
src/grid/grid_gallery.c
src/grid/grid_movie.c
src/grid/grid_music.c
src/grid/grid_tv.c
src/grid/grid_webs.c
src/main.c
src/view/view_base.c

index 24115a7..e91bb6e 100644 (file)
 #define PART_GENGRID "part.gengrid"
 
 /* Style */
-#define STYLE_TV "style.tv"
-#define STYLE_GALLERY "style.gallery"
-#define STYLE_MOVIE "style.movie"
-#define STYLE_MUSIC "style.music"
-#define STYLE_APPS "style.apps"
-#define STYLE_WEBS "style.webs"
 #define STYLE_MENU_BTN "style.menu.button"
 
 /* Signal */
 
 /* Text */
 #define STR_FAVORITE "Favorite"
-#define STR_TV "TV"
-#define STR_MOVIE "Movie"
-#define STR_GALLERY "Gallery"
-#define STR_MUSIC "Music"
-#define STR_APPS "Apps"
-#define STR_WEBS "Web bookmark"
+#define STR_NULL "(NULL)"
 
 /* Font */
 #define FONT_TIZENSANS_REGULAR "TizenSans"
 #define FONT_TIZENSANS_LIGHT "TizenSans:style=Light"
 
+/* Count */
+#define COUNT_MENU 6
+
 #endif /* __AIR_FAVORITE_DEFINE_H__ */
similarity index 51%
rename from include/grid/grid_apps.h
rename to include/grid.h
index 9217656..1df10e3 100644 (file)
  * limitations under the License.
  */
 
-#ifndef __AIR_FAVORITE_GRID_APPS_H__
-#define __AIR_FAVORITE_GRID_APPS_H__
+#ifndef __AIR_FAVORITE_GRID_H__
+#define __AIR_FAVORITE_GRID_H__
 
-struct grid_class *get_apps_grid_class(void);
+struct grid_data {
+       const char *id;
+       Evas_Object *grid;
+       int item_size_x;
+       int item_size_y;
+       Eina_List *list;
+       struct grid_class *gclass;
 
-#endif /* __AIR_FAVORITE_GRID_APPS_H__ */
+       Eina_List *(*create_item_list)(void);
+       void (*destroy_item_list)(Eina_List *list);
+};
+
+struct grid_data *get_tv_grid_data(void);
+struct grid_data *get_movie_grid_data(void);
+struct grid_data *get_gallery_grid_data(void);
+struct grid_data *get_music_grid_data(void);
+struct grid_data *get_apps_grid_data(void);
+struct grid_data *get_webs_grid_data(void);
+
+#endif /* __AIR_FAVORITE_GRID_H__ */
diff --git a/include/grid/grid_gallery.h b/include/grid/grid_gallery.h
deleted file mode 100644 (file)
index 042e944..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __AIR_FAVORITE_GRID_GALLERY_H__
-#define __AIR_FAVORITE_GRID_GALLERY_H__
-
-struct grid_class *get_gallery_grid_class(void);
-
-#endif /* __AIR_FAVORITE_GRID_GALLERY_H__ */
diff --git a/include/grid/grid_movie.h b/include/grid/grid_movie.h
deleted file mode 100644 (file)
index 1ee778e..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __AIR_FAVORITE_GRID_MOVIE_H__
-#define __AIR_FAVORITE_GRID_MOVIE_H__
-
-struct grid_class *get_movie_grid_class(void);
-
-#endif /* __AIR_FAVORITE_GRID_MOVIE_H__ */
diff --git a/include/grid/grid_music.h b/include/grid/grid_music.h
deleted file mode 100644 (file)
index 6de1d56..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __AIR_FAVORITE_GRID_MUSIC_H__
-#define __AIR_FAVORITE_GRID_MUSIC_H__
-
-struct grid_class *get_music_grid_class(void);
-
-#endif /* __AIR_FAVORITE_GRID_MUSIC_H__ */
diff --git a/include/grid/grid_tv.h b/include/grid/grid_tv.h
deleted file mode 100644 (file)
index 52ff729..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __AIR_FAVORITE_GRID_TV_H__
-#define __AIR_FAVORITE_GRID_TV_H__
-
-struct grid_class *get_tv_grid_class(void);
-
-#endif /* __AIR_FAVORITE_GRID_TV_H__ */
diff --git a/include/grid/grid_webs.h b/include/grid/grid_webs.h
deleted file mode 100644 (file)
index 7cd2d3f..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- * Licensed under the Apache License, Version 2.0 (the License);
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __AIR_FAVORITE_GRID_WEBS_H__
-#define __AIR_FAVORITE_GRID_WEBS_H__
-
-struct grid_class *get_webs_grid_class(void);
-
-#endif /* __AIR_FAVORITE_GRID_WEBS_H__ */
index 60a43b9..9041d5f 100644 (file)
@@ -19,6 +19,7 @@
 
 Evas_Object *add_window(const char *name);
 Evas_Object *add_layout(Evas_Object *parent, const char *group);
+Evas_Object *add_gengrid(Evas_Object *parent, int item_size_x, int item_size_y);
 Evas_Object *add_box(Evas_Object *parent, const char *part,
                Eina_Bool horizontal);
 Evas_Object *add_button(Evas_Object *parent, const char *part,
similarity index 100%
rename from include/view/view_base.h
rename to include/view_base.h
index ecb3c0b..f7ee4d3 100644 (file)
@@ -63,6 +63,35 @@ Evas_Object *add_layout(Evas_Object *parent, const char *group)
        return layout;
 }
 
+Evas_Object *add_gengrid(Evas_Object *parent, int item_size_x, int item_size_y)
+{
+       Evas_Object *grid;
+
+       if (!parent) {
+               _ERR("Invalid argument.");
+               return NULL;
+       }
+
+       grid = elm_gengrid_add(parent);
+       if (!grid) {
+               _ERR("elm_gengrid_add failed.");
+               return NULL;
+       }
+
+       evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND,
+                       EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+       elm_gengrid_multi_select_set(grid, EINA_FALSE);
+       elm_gengrid_horizontal_set(grid, EINA_TRUE);
+       elm_gengrid_align_set(grid, 0.0, 0.0);
+       elm_gengrid_select_mode_set(grid, ELM_OBJECT_SELECT_MODE_ALWAYS);
+       elm_gengrid_item_size_set(grid, elm_config_scale_get() * item_size_x,
+                       elm_config_scale_get() * item_size_y);
+
+       return grid;
+}
+
 Evas_Object *add_box(Evas_Object *parent, const char *part,
                Eina_Bool horizontal)
 {
index 6b56143..134cd25 100644 (file)
 #include <app_contents.h>
 
 #include "define.h"
+#include "grid.h"
 #include "data/app.h"
 
+#define STR_APPS "Apps"
+#define STYLE_APPS "style.apps"
+#define ITEM_APPS_X (212 + 26)
+#define ITEM_APPS_Y (294 + 26)
+
 static char *_text_get(void *data, Evas_Object *obj, const char *part)
 {
        struct app_data *adata;
-       char *title = NULL;
 
        if (!data) {
                _ERR("Data is NULL.");
@@ -34,15 +39,14 @@ static char *_text_get(void *data, Evas_Object *obj, const char *part)
        }
        adata = data;
 
-       title = get_app_name(adata);
-
-       return title;
+       return strdup(get_app_name(adata));
 }
 
 static Evas_Object *_content_get(void *data, Evas_Object *obj, const char *part)
 {
        struct app_data *adata;
        Evas_Object *img = NULL;
+       char *icon;
 
        if (!data || !obj) {
                _ERR("Data is NULL.");
@@ -50,17 +54,19 @@ static Evas_Object *_content_get(void *data, Evas_Object *obj, const char *part)
        }
        adata = data;
 
+       icon = get_app_icon(adata);
+
        img = elm_image_add(obj);
        if (!img) {
                _ERR("elm_image_add failed.");
                return NULL;
        }
 
-       /* FIXME: It should be fixed when the icon path is NULL. */
-       if (get_app_icon(adata))
-               elm_image_file_set(img, get_app_icon(adata), NULL);
-
-       evas_object_show(img);
+       if (!icon || !strcmp(icon, STR_NULL))
+               /* FIXME: It should be fixed when the icon path is NULL. */
+               elm_image_file_set(img, NULL, NULL);
+       else
+               elm_image_file_set(img, icon, NULL);
 
        return img;
 }
@@ -73,7 +79,29 @@ static struct grid_class _gclass = {
        .del = NULL,
 };
 
-struct grid_class *get_apps_grid_class(void)
+static Eina_List *_create_item_list(void)
+{
+       return get_app_favorite_list();
+}
+
+static void _destroy_item_list(Eina_List *list)
+{
+       if (!list)
+               return;
+
+       free_app_favorite_list(list);
+}
+
+static struct grid_data _gdata = {
+       .id = STR_APPS,
+       .item_size_x = ITEM_APPS_X,
+       .item_size_y = ITEM_APPS_Y,
+       .gclass = &_gclass,
+       .create_item_list = _create_item_list,
+       .destroy_item_list = _destroy_item_list,
+};
+
+struct grid_data *get_apps_grid_data(void)
 {
-       return &_gclass;
+       return &_gdata;
 }
index 1de2232..a01e593 100644 (file)
 #include <app_contents.h>
 
 #include "define.h"
+#include "grid.h"
 #include "data/media.h"
 
+#define STR_GALLERY "Gallery"
+#define STYLE_GALLERY "style.gallery"
+#define ITEM_GALLERY_X (200 + 6)
+#define ITEM_GALLERY_Y (200 + 6)
+
 static char *_text_get(void *data, Evas_Object *obj, const char *part)
 {
        app_media *am;
-       char *media_id;
 
        if (!data) {
                _ERR("Data is NULL.");
@@ -34,18 +39,47 @@ static char *_text_get(void *data, Evas_Object *obj, const char *part)
        }
        am = data;
 
-       media_id = get_media_name(am);
-       if (!media_id)
-               return NULL;
-
-       return strdup(media_id);
+       return strdup(get_media_name(am));
 }
 
 static Evas_Object *_content_get(void *data, Evas_Object *obj, const char *part)
 {
-       /* It will be implemented later. */
+       app_media *am;
+       Evas_Object *icon, *img;
+       char *thumbnail;
+
+       if (!data || !obj) {
+               _ERR("Invalid argument.");
+               return NULL;
+       }
+       am = data;
+
+       thumbnail = get_media_thumbnail(am);
+
+       if (!thumbnail) {
+               icon = elm_icon_add(obj);
+               if (!icon) {
+                       _ERR("elm_icon_add failed.");
+                       return NULL;
+               }
+
+               elm_icon_thumb_set(icon, get_media_path(am), NULL);
+               elm_image_aspect_fixed_set(icon, EINA_FALSE);
+
+               return icon;
+       }
 
-       return NULL;
+       img = elm_image_add(obj);
+       if (!img) {
+               _ERR("elm_image_add failed.");
+               return NULL;
+       }
+
+       elm_image_file_set(img, thumbnail, NULL);
+       elm_image_aspect_fixed_set(img, EINA_FALSE);
+       evas_object_show(img);
+
+       return img;
 }
 
 static struct grid_class _gclass = {
@@ -56,7 +90,29 @@ static struct grid_class _gclass = {
        .del = NULL,
 };
 
-struct grid_class *get_gallery_grid_class(void)
+static Eina_List *_create_item_list(void)
+{
+       return get_media_favorite_list(CONTENTS_GALLERY);
+}
+
+static void _destroy_item_list(Eina_List *list)
+{
+       if (!list)
+               return;
+
+       free_media_favorite_list(list);
+}
+
+static struct grid_data _gdata = {
+       .id = STR_GALLERY,
+       .item_size_x = ITEM_GALLERY_X,
+       .item_size_y = ITEM_GALLERY_Y,
+       .gclass = &_gclass,
+       .create_item_list = _create_item_list,
+       .destroy_item_list = _destroy_item_list,
+};
+
+struct grid_data *get_gallery_grid_data(void)
 {
-       return &_gclass;
+       return &_gdata;
 }
index d6f4dc5..91c2d19 100644 (file)
 #include <app_debug.h>
 
 #include "define.h"
+#include "grid.h"
+#include "data/media.h"
+
+#define STR_MOVIE "Movie"
+#define STYLE_MOVIE "style.movie"
+#define ITEM_MOVIE_X (378 + 26)
+#define ITEM_MOVIE_Y (294 + 26)
 
 static char *_text_get(void *data, Evas_Object *obj, const char *part)
 {
@@ -42,7 +49,31 @@ static struct grid_class _gclass = {
        .del = NULL,
 };
 
-struct grid_class *get_movie_grid_class(void)
+static Eina_List *_create_item_list(void)
+{
+       /* It will be implemented later. */
+
+       return NULL;
+}
+
+static void _destroy_item_list(Eina_List *list)
+{
+       if (!list)
+               return;
+
+       free_media_favorite_list(list);
+}
+
+static struct grid_data _gdata = {
+       .id = STR_MOVIE,
+       .item_size_x = ITEM_MOVIE_X,
+       .item_size_y = ITEM_MOVIE_Y,
+       .gclass = &_gclass,
+       .create_item_list = _create_item_list,
+       .destroy_item_list = _destroy_item_list,
+};
+
+struct grid_data *get_movie_grid_data(void)
 {
-       return &_gclass;
+       return &_gdata;
 }
index 0e782fd..c3be79b 100644 (file)
 #include <app_contents.h>
 
 #include "define.h"
+#include "grid.h"
 #include "data/media.h"
 
+#define STR_MUSIC "Music"
+#define STYLE_MUSIC "style.music"
+#define ITEM_MUSIC_X (488 + 26)
+#define ITEM_MUSIC_Y (134 + 26)
+
 static char *_text_get(void *data, Evas_Object *obj, const char *part)
 {
        /* It will be implemented later. */
@@ -45,7 +51,29 @@ static struct grid_class _gclass = {
        .del = NULL,
 };
 
-struct grid_class *get_music_grid_class(void)
+static Eina_List *_create_item_list(void)
+{
+       return get_media_favorite_list(CONTENTS_MUSIC);
+}
+
+static void _destroy_item_list(Eina_List *list)
+{
+       if (!list)
+               return;
+
+       free_media_favorite_list(list);
+}
+
+static struct grid_data _gdata = {
+       .id = STR_MUSIC,
+       .item_size_x = ITEM_MUSIC_X,
+       .item_size_y = ITEM_MUSIC_Y,
+       .gclass = &_gclass,
+       .create_item_list = _create_item_list,
+       .destroy_item_list = _destroy_item_list,
+};
+
+struct grid_data *get_music_grid_data(void)
 {
-       return &_gclass;
+       return &_gdata;
 }
index 5c5a0e6..7c3e246 100644 (file)
 #include <app_debug.h>
 
 #include "define.h"
+#include "grid.h"
+
+#define STR_TV "TV"
+#define STYLE_TV "style.tv"
+#define ITEM_TV_X (378 + 26)
+#define ITEM_TV_Y (294 + 26)
 
 static char *_text_get(void *data, Evas_Object *obj, const char *part)
 {
@@ -42,8 +48,31 @@ static struct grid_class _gclass = {
        .del = NULL,
 };
 
-struct grid_class *get_tv_grid_class(void)
+static Eina_List *_create_item_list(void)
 {
-       return &_gclass;
+       /* It will be implemented later. */
+
+       return NULL;
 }
 
+static void _destroy_item_list(Eina_List *list)
+{
+       if (!list)
+               return;
+
+       /* It will be implemented later. */
+}
+
+static struct grid_data _gdata = {
+       .id = STR_TV,
+       .item_size_x = ITEM_TV_X,
+       .item_size_y = ITEM_TV_Y,
+       .gclass = &_gclass,
+       .create_item_list = _create_item_list,
+       .destroy_item_list = _destroy_item_list,
+};
+
+struct grid_data *get_tv_grid_data(void)
+{
+       return &_gdata;
+}
index fa0d813..8f2f3e0 100644 (file)
 #include <app_debug.h>
 
 #include "define.h"
+#include "grid.h"
+
+#define STR_WEBS "Web bookmark"
+#define STYLE_WEBS "style.webs"
+#define ITEM_WEBS_X (378 + 26)
+#define ITEM_WEBS_Y (294 + 26)
 
 static char *_text_get(void *data, Evas_Object *obj, const char *part)
 {
@@ -42,7 +48,31 @@ static struct grid_class _gclass = {
        .del = NULL,
 };
 
-struct grid_class *get_webs_grid_class(void)
+static Eina_List *_create_item_list(void)
+{
+       /* It will be implemented later. */
+
+       return NULL;
+}
+
+static void _destroy_item_list(Eina_List *list)
+{
+       if (!list)
+               return;
+
+       /* It will be implemented later. */
+}
+
+static struct grid_data _gdata = {
+       .id = STR_WEBS,
+       .item_size_x = ITEM_WEBS_X,
+       .item_size_y = ITEM_WEBS_Y,
+       .gclass = &_gclass,
+       .create_item_list = _create_item_list,
+       .destroy_item_list = _destroy_item_list,
+};
+
+struct grid_data *get_webs_grid_data(void)
 {
-       return &_gclass;
+       return &_gdata;
 }
index 3b48eff..252a18d 100644 (file)
@@ -21,7 +21,7 @@
 
 #include "define.h"
 #include "utils.h"
-#include "view/view_base.h"
+#include "view_base.h"
 
 SET_TAG(PACKAGE);
 
index 641fc02..2f807aa 100644 (file)
 #include "utils.h"
 #include "data/media.h"
 #include "data/app.h"
-#include "grid/grid_tv.h"
-#include "grid/grid_movie.h"
-#include "grid/grid_gallery.h"
-#include "grid/grid_music.h"
-#include "grid/grid_apps.h"
-#include "grid/grid_webs.h"
-
-enum menu_type {
-       MENU_INVALID = -1,
-       MENU_TV = 0,
-       MENU_MOVIE,
-       MENU_GALLERY,
-       MENU_MUSIC,
-       MENU_APPS,
-       MENU_WEBS,
-       MENU_MAX
-};
-
-struct _menu_data {
-       Evas_Object *btn;
-       Evas_Object *grid;
-       Eina_List *list;
-};
+#include "grid.h"
 
 struct _priv {
        struct gridmgr *gmgr;
        Evas_Object *win;
        Evas_Object *base;
        Evas_Object *box;
-       struct _menu_data *mdata[MENU_MAX];
-       enum menu_type cur_menu;
-};
-
-const char *str_menu[] = {
-       STR_TV,
-       STR_MOVIE,
-       STR_GALLERY,
-       STR_MUSIC,
-       STR_APPS,
-       STR_WEBS,
-       NULL
+       Evas_Object *menu[COUNT_MENU];
+       int cur_menu_id;
 };
 
-static struct grid_class *(*_get_grid_class[])(void) = {
-       [MENU_TV] = get_tv_grid_class,
-       [MENU_MOVIE] = get_movie_grid_class,
-       [MENU_GALLERY] = get_gallery_grid_class,
-       [MENU_MUSIC] = get_music_grid_class,
-       [MENU_APPS] = get_apps_grid_class,
-       [MENU_WEBS] = get_webs_grid_class
+static struct grid_data *(*_get_grid_data[COUNT_MENU])(void) = {
+       get_tv_grid_data,
+       get_movie_grid_data,
+       get_gallery_grid_data,
+       get_music_grid_data,
+       get_apps_grid_data,
+       get_webs_grid_data
 };
 
-static Eina_List *_get_contents_list(enum menu_type type)
-{
-       switch (type) {
-       case MENU_TV:
-               /* It will be implemented later. */
-               return NULL;
-
-       case MENU_MOVIE:
-               /* It will be implemented later. */
-               return NULL;
-
-       case MENU_GALLERY:
-               return get_media_favorite_list(CONTENTS_GALLERY);
-
-       case MENU_MUSIC:
-               return get_media_favorite_list(CONTENTS_MUSIC);
-
-       case MENU_APPS:
-               return get_app_favorite_list();
-
-       case MENU_WEBS:
-               /* It will be implemented later. */
-               return NULL;
-
-       default:
-               _ERR("Invalid menu type.");
-               return NULL;
-       }
-}
-
-static bool _load_current_grid(struct _priv *priv, enum menu_type type)
+static bool _load_current_grid(struct _priv *priv, int id)
 {
-       struct _menu_data *mdata;
+       struct grid_data *gdata;
        Eina_List *list = NULL;
        Evas_Object *prev_grid;
 
-       if (!priv || !priv->gmgr || !priv->base ||
-                       type <= MENU_INVALID || type >= MENU_MAX) {
+       if (!priv || !priv->gmgr || !priv->base) {
                _ERR("Invalid argument.");
                return false;
        }
 
+       gdata = _get_grid_data[id]();
+       if (!gdata || !gdata->id || !gdata->grid)
+               return false;
+
        prev_grid = elm_object_part_content_unset(priv->base, PART_GENGRID);
        evas_object_hide(prev_grid);
 
-       mdata = priv->mdata[type];
-       if (!mdata || !mdata->grid)
-               return false;
-
-       if (!mdata->list) {
-               list = _get_contents_list(type);
+       if (!gdata->list) {
+               list = gdata->create_item_list();
                if (!list) {
                        /* 'No contents' should be displayed. */
                        return true;
                }
 
-               mdata->list = list;
+               gdata->list = list;
        }
 
-       if (!gridmgr_append_list(priv->gmgr, str_menu[type], mdata->list)) {
+       if (!gridmgr_append_list(priv->gmgr, gdata->id, gdata->list)) {
                _ERR("Gridmgr append list failed.");
                return false;
        }
 
-       elm_object_part_content_set(priv->base, PART_GENGRID, mdata->grid);
-       evas_object_show(mdata->grid);
+       elm_object_part_content_set(priv->base, PART_GENGRID, gdata->grid);
+       evas_object_show(gdata->grid);
 
        return true;
 }
@@ -163,10 +100,10 @@ static void _menu_focused_cb(int id, void *data, Evas_Object *obj,
        }
        priv = data;
 
-       if (priv->cur_menu == id)
+       if (priv->cur_menu_id == id)
                return;
 
-       priv->cur_menu = id;
+       priv->cur_menu_id = id;
 
        if (!_load_current_grid(priv, id))
                _ERR("Load current grid view failed.");
@@ -196,6 +133,7 @@ static input_handler _menu_input_handler = {
 static bool _draw_top_area(struct _priv *priv)
 {
        Evas_Object *btn;
+       struct grid_data *gdata;
        int i;
 
        if (!priv || !priv->base) {
@@ -211,8 +149,14 @@ static bool _draw_top_area(struct _priv *priv)
                return false;
        }
 
-       for (i = MENU_INVALID + 1; i < MENU_MAX; i++) {
-               btn = add_button(priv->box, NULL, str_menu[i], STYLE_MENU_BTN);
+       for (i = 0; i < COUNT_MENU; i++) {
+               gdata = _get_grid_data[i]();
+               if (!gdata || !gdata->id) {
+                       evas_object_del(priv->box);
+                       return false;
+               }
+
+               btn = add_button(priv->box, NULL, gdata->id, STYLE_MENU_BTN);
                if (!btn) {
                        _ERR("Add button failed.");
                        evas_object_del(priv->box);
@@ -222,62 +166,57 @@ static bool _draw_top_area(struct _priv *priv)
                elm_box_pack_end(priv->box, btn);
                inputmgr_add_callback(btn, i, &_menu_input_handler, priv);
 
-               priv->mdata[i]->btn = btn;
+               priv->menu[i] = btn;
        }
 
-       elm_object_focus_next_object_set(priv->mdata[0]->btn,
-                       priv->mdata[MENU_MAX - 1]->btn, ELM_FOCUS_LEFT);
-       elm_object_focus_next_object_set(priv->mdata[MENU_MAX - 1]->btn,
-                       priv->mdata[0]->btn, ELM_FOCUS_RIGHT);
+       elm_object_focus_next_object_set(priv->menu[0],
+                       priv->menu[COUNT_MENU - 1], ELM_FOCUS_LEFT);
+       elm_object_focus_next_object_set(priv->menu[COUNT_MENU - 1],
+                       priv->menu[0], ELM_FOCUS_RIGHT);
 
-       elm_object_focus_set(priv->mdata[0]->btn, EINA_TRUE);
+       elm_object_focus_set(priv->menu[0], EINA_TRUE);
 
        return true;
 }
 
-static Evas_Object *_add_grid(struct _priv *priv, enum menu_type type)
+static bool _add_grid(struct _priv *priv, int id)
 {
-       struct grid_class *gclass;
+       struct grid_data *gdata;
        Evas_Object *grid;
 
-       if (!priv || !priv->base || !priv->gmgr
-                       || type <= MENU_INVALID || type >= MENU_MAX) {
+       if (!priv || !priv->base || !priv->gmgr) {
                _ERR("Invalid argument.");
-               return NULL;
+               return false;
        }
 
-       grid = elm_gengrid_add(priv->base);
-       if (!grid) {
-               _ERR("elm_gengrid_add failed.");
-               return NULL;
+       gdata = _get_grid_data[id]();
+       if (!gdata || !gdata->id || !gdata->gclass) {
+               _ERR("Get grid data failed.");
+               return false;
        }
 
-       evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND,
-                       EVAS_HINT_EXPAND);
-       evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
-
-       gclass = _get_grid_class[type]();
-       if (!gclass) {
-               _ERR("Get gclass failed.");
-               evas_object_del(grid);
-               return NULL;
+       grid = add_gengrid(priv->base, gdata->item_size_x, gdata->item_size_y);
+       if (!grid) {
+               _ERR("Add grid failed.");
+               return false;
        }
 
-       if (!gridmgr_add_grid(priv->gmgr, str_menu[type], grid, gclass)) {
+       if (!gridmgr_add_grid(priv->gmgr, gdata->id, grid, gdata->gclass)) {
                _ERR("Gridmgr add grid failed.");
                evas_object_del(grid);
-               return NULL;
+               return false;
        }
 
-       return grid;
+       gdata->grid = grid;
+
+       return true;
 }
 
 static Evas_Object *_create(Evas_Object *win, void *data)
 {
        struct _priv *priv;
-       struct _menu_data *mdata;
        struct gridmgr *gmgr;
-       Evas_Object *base, *grid;
+       Evas_Object *base;
        int i;
 
        if (!win) {
@@ -303,47 +242,32 @@ static Evas_Object *_create(Evas_Object *win, void *data)
        gmgr = gridmgr_create();
        if (!gmgr) {
                _ERR("Grid manager initialized failed.");
-               evas_object_del(base);
-               free(priv);
-               return NULL;
+               goto err;
        }
 
        priv->win = win;
        priv->base = base;
        priv->gmgr = gmgr;
-       priv->cur_menu = MENU_INVALID;
+       priv->cur_menu_id = -1;
 
-       for (i = MENU_INVALID + 1; i < MENU_MAX; i++) {
-               grid = _add_grid(priv, i);
-               if (!grid) {
+       for (i = 0; i < COUNT_MENU; i++) {
+               if (!_add_grid(priv, i)) {
                        _ERR("Add grid failed.");
+                       gridmgr_destroy(gmgr);
                        goto err;
                }
-
-               mdata = calloc(1, sizeof(*mdata));
-               if (!mdata) {
-                       _ERR("Calloc failed.");
-                       goto err;
-               }
-
-               mdata->grid = grid;
-               priv->mdata[i] = mdata;
        }
 
        if (!viewmgr_set_view_data(VIEW_ID_BASE, priv)) {
                _ERR("Set view data failed.");
+               gridmgr_destroy(gmgr);
                goto err;
        }
 
        return base;
 
 err:
-       gridmgr_destroy(gmgr);
        evas_object_del(base);
-
-       for (i = MENU_INVALID + 1; i < MENU_MAX; i++)
-               free(priv->mdata[i]);
-
        free(priv);
 
        return NULL;
@@ -380,39 +304,10 @@ static void _hide(void *data)
                evas_object_hide(priv->base);
 }
 
-static void _destroy_data_list(Eina_List *list, enum menu_type type)
-{
-       if (!list)
-               return;
-
-       switch (type) {
-       case MENU_TV:
-               /* It will be implemented later. */
-               break;
-
-       case MENU_MOVIE:
-       case MENU_GALLERY:
-       case MENU_MUSIC:
-               free_media_favorite_list(list);
-               break;
-
-       case MENU_APPS:
-               free_app_favorite_list(list);
-               break;
-
-       case MENU_WEBS:
-               /* It will be implemented later. */
-               break;
-
-       default:
-               _ERR("Invalid menu type.");
-               return;
-       }
-}
-
 static void _destroy(void *data)
 {
        struct _priv *priv;
+       struct grid_data *gdata;
        int i;
 
        if (!data) {
@@ -421,9 +316,10 @@ static void _destroy(void *data)
        }
        priv = data;
 
-       for (i = MENU_INVALID + 1; i < MENU_MAX; i++) {
-               _destroy_data_list(priv->mdata[i]->list, i);
-               free(priv->mdata[i]);
+       for (i = 0; i < COUNT_MENU; i++) {
+               gdata = _get_grid_data[i]();
+               if (gdata->list)
+                       gdata->destroy_item_list(gdata->list);
        }
 
        if (priv->base)