Fixed navigating using 'Backspace' key
[profile/tv/apps/web/browser.git] / services / QuickAccess / QuickAccess.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <Elementary.h>
18 #include <boost/concept_check.hpp>
19 #include <vector>
20 #include <AbstractMainWindow.h>
21
22 #include "QuickAccess.h"
23 #include "ServiceManager.h"
24 #include "BrowserLogger.h"
25 #include "Tools/EflTools.h"
26 #include "../Tools/BrowserImage.h"
27 #include "Tools/GeneralTools.h"
28
29 #define efl_scale       (elm_config_scale_get() / elm_app_base_scale_get())
30
31 namespace tizen_browser{
32 namespace base_ui{
33
34 EXPORT_SERVICE(QuickAccess, "org.tizen.browser.quickaccess")
35
36 const int QuickAccess::MAX_TILES_NUMBER = 5;
37 const int QuickAccess::MAX_THUMBNAIL_WIDTH = 840;
38 const int QuickAccess::MAX_THUMBNAIL_HEIGHT = 648;
39 const int QuickAccess::BIG_TILE_INDEX = 0;
40 const int QuickAccess::TOP_RIGHT_TILE_INDEX = 3;
41 const int QuickAccess::BOTTOM_RIGHT_TILE_INDEX = 4;
42
43 const std::vector<std::string> QuickAccess::TILES_NAMES = {
44     "elm.swallow.big",
45     "elm.swallow.small_first",
46     "elm.swallow.small_second",
47     "elm.swallow.small_third",
48     "elm.swallow.small_fourth"
49 };
50
51 typedef struct _HistoryItemData
52 {
53         std::shared_ptr<tizen_browser::services::HistoryItem> item;
54         std::shared_ptr<tizen_browser::base_ui::QuickAccess> quickAccess;
55 } HistoryItemData;
56
57 typedef struct _BookmarkItemData
58 {
59         std::shared_ptr<tizen_browser::services::BookmarkItem> item;
60         std::shared_ptr<tizen_browser::base_ui::QuickAccess> quickAccess;
61 } BookmarkItemData;
62
63 QuickAccess::QuickAccess()
64     : m_parent(nullptr)
65     , m_layout(nullptr)
66     , m_bookmarksView(nullptr)
67     , m_mostVisitedView(nullptr)
68     , m_bookmarksButton(nullptr)
69     , m_mostVisitedButton(nullptr)
70     , m_bookmarkGengrid(nullptr)
71     , m_bookmarkManagerButton(nullptr)
72     , m_after_history_thumb(false)
73     , m_parentFocusChain(nullptr)
74     , m_bookmark_item_class(nullptr)
75     , m_detailPopup(this)
76 {
77     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
78     edjFilePath = EDJE_DIR;
79     edjFilePath.append("QuickAccess/QuickAccess.edj");
80     elm_theme_extension_add(nullptr, edjFilePath.c_str());
81     QuickAccess::createItemClasses();
82 }
83
84 QuickAccess::~QuickAccess()
85 {
86     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
87     elm_gengrid_item_class_free(m_bookmark_item_class);
88     eina_list_free(m_parentFocusChain);
89 }
90
91 void QuickAccess::init(Evas_Object* parent)
92 {
93     M_ASSERT(parent);
94     m_parent = parent;
95 }
96
97
98 Evas_Object* QuickAccess::getContent()
99 {
100     M_ASSERT(m_parent);
101     if (!m_layout) {
102         m_layout = createQuickAccessLayout(m_parent);
103     }
104     return m_layout;
105 }
106
107 void QuickAccess::showMostVisited(std::shared_ptr< services::HistoryItemVector > vec)
108 {
109     addHistoryItems(vec);
110     showHistory();
111 }
112
113 void QuickAccess::showBookmarks(std::vector< std::shared_ptr< tizen_browser::services::BookmarkItem > > vec)
114 {
115     addBookmarkItems(vec);
116     showBookmarks();
117 }
118
119 void QuickAccess::createItemClasses()
120 {
121     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
122     if (!m_bookmark_item_class) {
123         m_bookmark_item_class = elm_gengrid_item_class_new();
124         m_bookmark_item_class->item_style = "grid_item";
125         m_bookmark_item_class->func.text_get = _grid_bookmark_text_get;
126         m_bookmark_item_class->func.content_get =  _grid_bookmark_content_get;
127         m_bookmark_item_class->func.state_get = nullptr;
128         m_bookmark_item_class->func.del = nullptr;
129     }
130 }
131
132
133 Evas_Object* QuickAccess::createQuickAccessLayout(Evas_Object* parent)
134 {
135     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
136     m_desktopMode = true;
137
138     Evas_Object* layout = elm_layout_add(parent);
139     elm_layout_file_set(layout, edjFilePath.c_str(), "main_layout");
140     evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
141     evas_object_size_hint_align_set (layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
142
143     m_mostVisitedView = createMostVisitedView(layout);
144     m_bookmarksView   = createBookmarksView  (layout);
145
146     return layout;
147 }
148
149 Evas_Object* QuickAccess::createMostVisitedView (Evas_Object * parent)
150 {
151     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
152
153     Evas_Object* mostVisitedLayout = elm_layout_add(parent);
154     elm_layout_file_set(mostVisitedLayout, edjFilePath.c_str(), "mv_bookmarks");
155     evas_object_size_hint_weight_set(mostVisitedLayout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
156     evas_object_size_hint_align_set (mostVisitedLayout, EVAS_HINT_FILL, EVAS_HINT_FILL);
157
158     Evas_Object* topButtons = createTopButtons(mostVisitedLayout);
159     elm_object_part_content_set(mostVisitedLayout, "elm.swallow.layoutTop", topButtons);
160
161     return mostVisitedLayout;
162 }
163
164 Evas_Object* QuickAccess::createBookmarksView (Evas_Object * parent)
165 {
166     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
167
168     Evas_Object *bookmarkViewLayout = elm_layout_add(parent);
169     elm_layout_file_set(bookmarkViewLayout, edjFilePath.c_str(), "mv_bookmarks");
170     evas_object_size_hint_weight_set(bookmarkViewLayout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
171     evas_object_size_hint_align_set(bookmarkViewLayout, EVAS_HINT_FILL, EVAS_HINT_FILL);
172
173     m_bookmarkGengrid = createBookmarkGengrid(bookmarkViewLayout);
174     elm_object_part_content_set(bookmarkViewLayout, "elm.swallow.grid", m_bookmarkGengrid);
175
176     Evas_Object* topButtons = createTopButtons(bookmarkViewLayout);
177     elm_object_part_content_set(bookmarkViewLayout, "elm.swallow.layoutTop", topButtons);
178
179     Evas_Object* bottomButton = createBottomButton(bookmarkViewLayout);
180     elm_object_part_content_set(bookmarkViewLayout, "elm.swallow.layoutBottom", bottomButton);
181
182     return bookmarkViewLayout;
183 }
184
185 Evas_Object* QuickAccess::createBookmarkGengrid(Evas_Object *parent)
186 {
187     Evas_Object *bookmarkGengrid = elm_gengrid_add(parent);
188
189     elm_gengrid_align_set(bookmarkGengrid, 0, 0);
190     elm_gengrid_select_mode_set(bookmarkGengrid, ELM_OBJECT_SELECT_MODE_ALWAYS);
191     elm_gengrid_multi_select_set(bookmarkGengrid, EINA_FALSE);
192     elm_gengrid_horizontal_set(bookmarkGengrid, EINA_FALSE);
193
194     elm_scroller_policy_set(bookmarkGengrid, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
195     elm_scroller_page_size_set(bookmarkGengrid, 0, 327);
196     evas_object_size_hint_weight_set(bookmarkGengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
197     evas_object_size_hint_align_set(bookmarkGengrid, EVAS_HINT_FILL, EVAS_HINT_FILL);
198     elm_gengrid_item_size_set(bookmarkGengrid, 364 * efl_scale, 320 * efl_scale);
199
200     return bookmarkGengrid;
201 }
202
203 Evas_Object* QuickAccess::createTopButtons (Evas_Object *parent)
204 {
205     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
206
207     Evas_Object *layoutTop = elm_layout_add(parent);
208     elm_layout_file_set(layoutTop, edjFilePath.c_str(), "top_button_item");
209     evas_object_size_hint_weight_set(layoutTop, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
210     evas_object_size_hint_align_set(layoutTop, EVAS_HINT_FILL, EVAS_HINT_FILL);
211     evas_object_show(layoutTop);
212
213     Evas_Object *mostVisitedButton = elm_button_add(layoutTop);
214     elm_object_style_set(mostVisitedButton, "invisible_button");
215     evas_object_smart_callback_add(mostVisitedButton, "clicked", _mostVisited_clicked, this);
216     evas_object_show(mostVisitedButton);
217     elm_layout_content_set(layoutTop, "mostvisited_click", mostVisitedButton);
218     m_mostVisitedButton = mostVisitedButton;
219
220     Evas_Object *bookmarksButton = elm_button_add(layoutTop);
221     elm_object_style_set(bookmarksButton, "invisible_button");
222     evas_object_smart_callback_add(bookmarksButton, "clicked", _bookmark_clicked, this);
223     evas_object_show(bookmarksButton);
224     elm_layout_content_set(layoutTop, "bookmark_click", bookmarksButton);
225     m_bookmarksButton = bookmarksButton;
226
227     return layoutTop;
228 }
229
230 Evas_Object* QuickAccess::createBottomButton(Evas_Object *parent)
231 {
232     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
233
234     Evas_Object *layoutBottom = elm_layout_add(parent);
235     elm_layout_file_set(layoutBottom, edjFilePath.c_str(), "bottom_button_item");
236
237     evas_object_size_hint_weight_set(layoutBottom, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
238     evas_object_size_hint_align_set(layoutBottom, EVAS_HINT_FILL, EVAS_HINT_FILL);
239     evas_object_show(layoutBottom);
240
241     m_bookmarkManagerButton = elm_button_add(layoutBottom);
242     elm_object_style_set(m_bookmarkManagerButton, "invisible_button");
243     evas_object_smart_callback_add(m_bookmarkManagerButton, "clicked", _bookmark_manager_clicked, this);
244     evas_object_show(m_bookmarkManagerButton);
245
246     elm_object_part_content_set(layoutBottom, "bookmarkmanager_click", m_bookmarkManagerButton);
247
248     return layoutBottom;
249 }
250
251
252 void QuickAccess::_mostVisited_clicked(void * data, Evas_Object *, void *)
253 {
254     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
255     QuickAccess* quickAccess = reinterpret_cast<QuickAccess *>(data);
256     quickAccess->mostVisitedClicked();
257 }
258
259 void QuickAccess::_bookmark_clicked(void * data, Evas_Object *, void *)
260 {
261     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
262     QuickAccess* quickAccess = reinterpret_cast<QuickAccess *>(data);
263     quickAccess->bookmarkClicked();
264 }
265
266 void QuickAccess::_bookmark_manager_clicked(void * data, Evas_Object *, void *)
267 {
268     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
269     QuickAccess*  quickAccess = static_cast<QuickAccess *>(data);
270     quickAccess->bookmarkManagerClicked();
271 }
272
273 void QuickAccess::addHistoryItem(std::shared_ptr<services::HistoryItem> hi)
274 {
275     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
276     M_ASSERT(m_historyItems.size() < MAX_TILES_NUMBER);
277
278     int tileNumber = m_historyItems.size();
279     HistoryItemData *itemData = new HistoryItemData();
280     itemData->item = hi;
281     itemData->quickAccess = std::shared_ptr<QuickAccess>(this);
282
283     Evas_Object* tile = elm_button_add(m_mostVisitedView);
284     if (tileNumber == BIG_TILE_INDEX)
285         elm_object_style_set(tile, "big_tile");
286     else
287         elm_object_style_set(tile, "small_tile");
288     evas_object_size_hint_weight_set(tile, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
289     evas_object_size_hint_align_set (tile, EVAS_HINT_FILL, EVAS_HINT_FILL);
290     evas_object_show(tile);
291     elm_object_part_content_set(m_mostVisitedView, TILES_NAMES[tileNumber].c_str(), tile);
292     m_tiles.push_back(tile);
293
294     elm_layout_text_set(tile, "page_title", hi->getTitle().c_str());
295     elm_layout_text_set(tile, "page_url", hi->getUrl().c_str());
296     Evas_Object * thumb = tizen_browser::tools::EflTools::getEvasImage(hi->getThumbnail(), m_parent);
297     elm_object_part_content_set(tile, "elm.thumbnail", thumb);
298     evas_object_smart_callback_add(tile, "clicked", _thumbHistoryClicked, itemData);
299
300     m_historyItems.push_back(hi);
301 }
302
303 void QuickAccess::addHistoryItems(std::shared_ptr<services::HistoryItemVector> items)
304 {
305     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
306     clearHistoryGenlist();
307     int i = 0;
308     for (auto it = items->begin(); it != items->end(); ++it) {
309         i++;
310         if (i > MAX_TILES_NUMBER)
311             break;
312         addHistoryItem(*it);
313     }
314     if (i>0)
315         setEmptyView(false);
316 }
317
318 void QuickAccess::addBookmarkItem(std::shared_ptr<tizen_browser::services::BookmarkItem> bi)
319 {
320     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
321     BookmarkItemData *itemData = new BookmarkItemData();
322     itemData->item = bi;
323     itemData->quickAccess = std::shared_ptr<tizen_browser::base_ui::QuickAccess>(this);
324     elm_gengrid_item_append(m_bookmarkGengrid, m_bookmark_item_class, itemData, _thumbBookmarkClicked, itemData);
325 }
326
327 void QuickAccess::addBookmarkItems(std::vector<std::shared_ptr<tizen_browser::services::BookmarkItem> > items)
328 {
329     clearBookmarkGengrid();
330     for (auto it = items.begin(); it != items.end(); ++it) {
331          addBookmarkItem(*it);
332     }
333 }
334
335
336 char* QuickAccess::_grid_bookmark_text_get(void *data, Evas_Object *, const char *part)
337 {
338         BookmarkItemData *itemData = reinterpret_cast<BookmarkItemData*>(data);
339         if (!strcmp(part, "page_title")) {
340                 return strdup(itemData->item->getTittle().c_str());
341         }
342         if (!strcmp(part, "page_url")) {
343                 return strdup(itemData->item->getAddress().c_str());
344         }
345         return strdup("");
346 }
347
348 Evas_Object * QuickAccess::_grid_bookmark_content_get(void *data, Evas_Object*, const char *part)
349 {
350     BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part);
351     BookmarkItemData *itemData = reinterpret_cast<BookmarkItemData*>(data);
352
353     if (!strcmp(part, "elm.thumbnail")) {
354         if (itemData->item->getThumbnail()) {
355                 Evas_Object * thumb = tizen_browser::tools::EflTools::getEvasImage(itemData->item->getThumbnail(), itemData->quickAccess->m_parent);
356                 return thumb;
357         }
358         else {
359                 return nullptr;
360         }
361     }
362
363     return nullptr;
364 }
365
366 void QuickAccess::_thumbBookmarkClicked(void * data, Evas_Object * , void *)
367 {
368     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
369     HistoryItemData * itemData = reinterpret_cast<HistoryItemData *>(data);
370     itemData->quickAccess->openURLInNewTab(itemData->item, itemData->quickAccess->isDesktopMode());
371     itemData->quickAccess->m_after_history_thumb = false;
372 }
373
374 void QuickAccess::_thumbHistoryClicked(void* data, Evas_Object*, void*)
375 {
376     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
377     HistoryItemData * itemData = reinterpret_cast<HistoryItemData *>(data);
378     itemData->quickAccess->mostVisitedTileClicked(itemData->item, DetailPopup::HISTORY_ITEMS_NO);
379     itemData->quickAccess->m_after_history_thumb = true;
380 }
381
382 void QuickAccess::clearHistoryGenlist()
383 {
384     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
385
386     for (auto it = m_tiles.begin(); it != m_tiles.end(); ++it) {
387         evas_object_smart_callback_del(*it, "clicked", _thumbHistoryClicked);
388         evas_object_del(*it);
389     }
390
391     m_tiles.clear();
392     m_historyItems.clear();
393 }
394
395 void QuickAccess::showHistory()
396 {
397     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
398
399     if (elm_layout_content_get(m_layout, "view") == m_mostVisitedView)
400         return;
401
402     evas_object_hide(m_bookmarksView);
403     elm_layout_content_unset(m_layout, "view");
404     elm_layout_content_set(m_layout, "view", m_mostVisitedView);
405     evas_object_show(m_mostVisitedView);
406
407
408     if (m_historyItems.empty()) {
409         setEmptyView(true);
410         return;
411     }
412     setEmptyView(false);
413     evas_object_show(m_layout);
414     refreshFocusChain();
415     elm_object_focus_set(m_mostVisitedButton, true);
416 }
417
418 void QuickAccess::clearBookmarkGengrid()
419 {
420     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
421     elm_gengrid_clear(m_bookmarkGengrid);
422 }
423
424 void QuickAccess::showBookmarks()
425 {
426     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
427
428     if (elm_layout_content_get(m_layout, "view") == m_bookmarksView && m_bookmarksView != nullptr)
429         return;
430
431     evas_object_hide(m_mostVisitedView);
432     elm_layout_content_unset(m_layout, "view");
433     elm_layout_content_set(m_layout, "view", m_bookmarksView);
434     evas_object_show(m_bookmarksView);
435
436     evas_object_show(m_layout);
437     refreshFocusChain();
438     elm_object_focus_set(m_bookmarksButton, true);
439 }
440
441 void QuickAccess::showUI()
442 {
443     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
444     evas_object_show(m_layout);
445     if (elm_layout_content_get(m_layout, "view") == m_bookmarksView) {
446         evas_object_show(m_bookmarksView);
447     } else {
448         evas_object_show(m_mostVisitedView);
449     }
450 }
451
452 void QuickAccess::hideUI()
453 {
454     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
455     evas_object_hide(m_layout);
456     evas_object_hide(m_mostVisitedView);
457     evas_object_hide(m_bookmarksView);
458     clearHistoryGenlist();
459     clearBookmarkGengrid();
460 }
461
462 void QuickAccess::openDetailPopup(std::shared_ptr<services::HistoryItem> currItem, std::shared_ptr<services::HistoryItemVector> prevItems)
463 {
464     m_detailPopup.show(m_layout, m_parent, currItem, prevItems);
465 }
466
467 void QuickAccess::showNoHistoryLabel()
468 {
469     elm_layout_text_set(m_mostVisitedView, "elm.text.empty", "No visited site");
470     elm_layout_signal_emit(m_mostVisitedView, "empty,view", "quickaccess");
471 }
472
473 void QuickAccess::setEmptyView(bool empty)
474 {
475     BROWSER_LOGD("%s:%d %s, empty: %d", __FILE__, __LINE__, __func__, empty);
476     if(empty) {
477         showNoHistoryLabel();
478     } else {
479         elm_layout_signal_emit(m_mostVisitedView, "not,empty,view", "quickaccess");
480     }
481 }
482
483 bool QuickAccess::isDesktopMode() const
484 {
485     return m_desktopMode;
486 }
487
488 void QuickAccess::setDesktopMode(bool mode)
489 {
490     m_desktopMode = mode;
491 }
492
493 DetailPopup& QuickAccess::getDetailPopup()
494 {
495     return m_detailPopup;
496 }
497
498 void QuickAccess::backButtonClicked()
499 {
500     if (m_detailPopup.isVisible()) {
501         m_detailPopup.hide();
502     } else {
503         hideUI();
504         switchViewToWebPage();
505     }
506 }
507
508 bool QuickAccess::isMostVisitedActive() const
509 {
510     return evas_object_visible_get(m_mostVisitedView);
511 }
512
513 void QuickAccess::refreshFocusChain()
514 {
515     if (!isMostVisitedActive() && m_after_history_thumb) {
516         m_after_history_thumb = false;
517         return;
518     }
519     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
520
521     if (!m_parentFocusChain) {
522         m_parentFocusChain = eina_list_clone(elm_object_focus_custom_chain_get(m_parent));
523     } else {
524         elm_object_focus_custom_chain_unset(m_parent);
525         elm_object_focus_custom_chain_set(m_parent, eina_list_clone(m_parentFocusChain));
526     }
527
528     elm_object_focus_custom_chain_append(m_parent, m_mostVisitedButton, NULL);
529     elm_object_focus_custom_chain_append(m_parent, m_bookmarksButton, NULL);
530     if (isMostVisitedActive()) {
531         for (auto tile = m_tiles.begin(); tile != m_tiles.end(); ++tile) {
532                 elm_object_focus_custom_chain_append(m_parent, *tile, NULL);
533         }
534         // prevent from moving outside of screen
535         elm_object_focus_next_object_set(m_tiles[BIG_TILE_INDEX], m_tiles[BIG_TILE_INDEX], ELM_FOCUS_LEFT);
536         elm_object_focus_next_object_set(m_tiles[TOP_RIGHT_TILE_INDEX], m_tiles[TOP_RIGHT_TILE_INDEX], ELM_FOCUS_RIGHT);
537         elm_object_focus_next_object_set(m_tiles[BOTTOM_RIGHT_TILE_INDEX], m_tiles[BOTTOM_RIGHT_TILE_INDEX], ELM_FOCUS_RIGHT);
538     } else {
539         elm_object_focus_custom_chain_append(m_parent, m_bookmarkGengrid, NULL);
540         elm_object_focus_custom_chain_append(m_parent, m_bookmarkManagerButton, NULL);
541         // prevent from moving outside of screen
542         elm_object_focus_next_object_set(m_bookmarkGengrid, m_bookmarkGengrid, ELM_FOCUS_LEFT);
543         elm_object_focus_next_object_set(m_bookmarkGengrid, m_bookmarkGengrid, ELM_FOCUS_RIGHT);
544     }
545 }
546
547 }
548 }