Fixed privilege for web-history.admin
[profile/tv/apps/web/browser.git] / services / BookmarksUI / BookmarksUI.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 "BookmarksUI.h"
23 #include "ServiceManager.h"
24 #include "BrowserLogger.h"
25 #include "Tools/EflTools.h"
26 #include "../Tools/BrowserImage.h"
27
28
29 namespace tizen_browser{
30 namespace base_ui{
31
32 EXPORT_SERVICE(BookmarksUI, "org.tizen.browser.bookmarksui")
33
34
35 typedef struct _BookmarkItemData
36 {
37         std::shared_ptr<tizen_browser::services::BookmarkItem> item;
38         std::shared_ptr<tizen_browser::base_ui::BookmarksUI> bookmarksUI;
39 } BookmarkItemData;
40
41 BookmarksUI::BookmarksUI()
42     : m_gengrid(NULL)
43     , m_parent(NULL)
44     , m_item_class(NULL)
45         , m_gengridSetup(false)
46 {
47     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
48 }
49
50 BookmarksUI::~BookmarksUI()
51 {
52
53 }
54
55 void BookmarksUI::init(Evas_Object* p)
56 {
57     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
58     m_parent = p;
59     m_gengrid = elm_gengrid_add(m_parent);
60
61     evas_object_smart_callback_add(m_gengrid, "item,focused", focusItem, NULL);
62     evas_object_smart_callback_add(m_gengrid, "item,unfocused", unFocusItem, NULL);
63     evas_object_smart_callback_add(m_gengrid, "activated", _itemSelected, this);
64
65       if (!m_item_class) {
66             m_item_class = elm_genlist_item_class_new();
67             m_item_class->item_style = "bookmark_item";
68             m_item_class->func.text_get = NULL;
69             m_item_class->func.content_get =  _grid_content_get;
70             m_item_class->func.state_get = NULL;
71             m_item_class->func.del = NULL;
72         }
73 }
74
75
76 Evas_Object * BookmarksUI::getContent()
77 {
78     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
79     M_ASSERT(m_parent);
80
81     if(m_map_bookmark_views.size() == 0) {
82         elm_object_part_content_set(m_gengrid, "elm.swallow.empty", createNoBookmarksLabel());
83     }
84
85
86     if(!m_gengridSetup) {
87         std::string edjFilePath = EDJE_DIR;
88         edjFilePath.append("BookmarksUI/Bookmarks.edj");
89         elm_theme_extension_add(NULL, edjFilePath.c_str());
90
91
92         elm_object_style_set(m_gengrid, "bookmarks");
93
94         elm_gengrid_align_set(m_gengrid, 0, 0);
95         elm_gengrid_item_size_set(m_gengrid, 395, 357);
96         elm_gengrid_select_mode_set(m_gengrid, ELM_OBJECT_SELECT_MODE_ALWAYS);
97         elm_gengrid_multi_select_set(m_gengrid, EINA_FALSE);
98         elm_gengrid_horizontal_set(m_gengrid, EINA_FALSE);
99         elm_gengrid_highlight_mode_set(m_gengrid, EINA_TRUE);
100         elm_scroller_policy_set(m_gengrid, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
101         elm_scroller_page_size_set(m_gengrid, 0, 327);
102
103         evas_object_size_hint_weight_set(m_gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
104         evas_object_size_hint_align_set(m_gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL);
105
106         m_gengridSetup = true;
107     }
108     return m_gengrid;
109 }
110
111 void BookmarksUI::addBookmarkItem(std::shared_ptr<tizen_browser::services::BookmarkItem> bi)
112 {
113     BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
114     BookmarkItemData *itemData = new BookmarkItemData();
115     itemData->item = bi;
116         itemData->bookmarksUI = std::shared_ptr<tizen_browser::base_ui::BookmarksUI>(this);
117         Elm_Object_Item* bookmarkView = elm_gengrid_item_append(m_gengrid, m_item_class, itemData, NULL, this);
118     m_map_bookmark_views.insert(std::pair<std::string,Elm_Object_Item*>(bi->getAddress(),bookmarkView));
119
120     // unselect by default
121     elm_gengrid_item_selected_set(bookmarkView, EINA_FALSE);
122
123     setEmptyGengrid(false);
124 }
125
126 void BookmarksUI::addBookmarkItems(std::vector<std::shared_ptr<tizen_browser::services::BookmarkItem> > items)
127 {
128          BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__);
129          for (auto it = items.begin(); it != items.end(); ++it) {
130                  addBookmarkItem(*it);
131          }
132 }
133
134 void BookmarksUI::removeBookmarkItem(const std::string& uri)
135 {
136     BROWSER_LOGD("[%s] uri=%s", __func__, uri.c_str());
137     if(m_map_bookmark_views.find(uri) == m_map_bookmark_views.end()) {
138         return;
139     }
140
141     Elm_Object_Item* bookmarkView = m_map_bookmark_views.at(uri);
142     elm_object_item_del(bookmarkView);
143     m_map_bookmark_views.erase(uri);
144
145     setEmptyGengrid(0 == m_map_bookmark_views.size());
146 }
147
148 void  BookmarksUI::_item_deleted(void * /* data */, Evas_Object * /* obj */)
149 {
150
151 }
152
153 Evas_Object * BookmarksUI::_grid_content_get(void *data, Evas_Object *obj, const char *part)
154 {
155     BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part);
156     BookmarkItemData *itemData = reinterpret_cast<BookmarkItemData*>(data);
157
158     if (!strcmp(part, "elm.thumbnail")) {
159             if (itemData->item->getThumbnail()) {
160                 Evas_Object * thumb = tizen_browser::tools::EflTools::getEvasImage(itemData->item->getThumbnail(), itemData->bookmarksUI->m_parent);
161                 return thumb;
162         }
163         else {
164                 return NULL;
165         }
166     }
167     else if (!strcmp(part, "favicon")) {
168         Evas_Object * favicon = NULL;
169         if(itemData->item->getFavicon().get()){
170             favicon = tizen_browser::tools::EflTools::getEvasImage(itemData->item->getFavicon(), obj);
171         }
172         return favicon;
173     }
174     else if (!strcmp(part, "elm.label")) {
175                 Evas_Object *label = elm_label_add(obj);
176                 elm_object_style_set(label, "bookmarks_label");
177                 elm_object_text_set(label, itemData->item->getTittle().c_str());
178                 return label;
179     }
180     else if (!strcmp(part, "elm.deleteButton")) {
181                 Evas_Object *deleteButton = elm_button_add(obj);
182                 elm_object_style_set(deleteButton, "deleteButton");
183                 evas_object_smart_callback_add(deleteButton, "clicked", tizen_browser::base_ui::BookmarksUI::_deleteBookmark, data);
184                 return deleteButton;
185     }
186     else if (!strcmp(part, "elm.thumbButton")) {
187                 Evas_Object *thumbButton = elm_button_add(obj);
188                 elm_object_style_set(thumbButton, "thumbButton");
189                 evas_object_smart_callback_add(thumbButton, "clicked", tizen_browser::base_ui::BookmarksUI::_thumbSelected, data);
190                 return thumbButton;
191     }
192     return NULL;
193 }
194
195 void BookmarksUI::_itemSelected(void * data, Evas_Object * /* obj */, void * event_info)
196 {
197         Elm_Object_Item * selected = reinterpret_cast<Elm_Object_Item *>(event_info);
198         BookmarkItemData * itemData = reinterpret_cast<BookmarkItemData *>(elm_object_item_data_get(selected));
199         BookmarksUI * self = reinterpret_cast<BookmarksUI *>(data);
200
201         self->bookmarkClicked(itemData->item);
202 }
203
204 void BookmarksUI::_deleteBookmark(void *data, Evas_Object * /* obj */, void * /* event_info */)
205 {
206         BookmarkItemData * itemData = reinterpret_cast<BookmarkItemData *>(data);
207         itemData->bookmarksUI->bookmarkDeleteClicked(itemData->item);
208 }
209
210 void BookmarksUI::_thumbSelected(void * data, Evas_Object * /* obj */, void * /* event_info */)
211 {
212         BookmarkItemData * itemData = reinterpret_cast<BookmarkItemData *>(data);
213         itemData->bookmarksUI->bookmarkClicked(itemData->item);
214 }
215
216 Evas_Object* BookmarksUI::createNoBookmarksLabel()
217 {
218     Evas_Object *label = elm_label_add(m_parent);
219     elm_object_text_set(label, "No favorite websites.");
220     evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
221     evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
222     return label;
223 }
224
225 void BookmarksUI::setEmptyGengrid(bool setEmpty)
226 {
227     if(setEmpty) {
228         elm_object_part_content_set(m_gengrid, "elm.swallow.empty", createNoBookmarksLabel());
229     } else {
230         elm_object_part_content_set(m_gengrid, "elm.swallow.empty", NULL);
231     }
232 }
233
234 void BookmarksUI::deleteAllItems()
235 {
236     BROWSER_LOGD("Deleting all items from gengrid");
237     elm_gengrid_clear(m_gengrid);
238     m_map_bookmark_views.clear();
239     setEmptyGengrid(true);
240 }
241
242 void BookmarksUI::focusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info)
243 {
244     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
245     Elm_Object_Item *item = reinterpret_cast<Elm_Object_Item*>(event_info);
246     elm_object_item_signal_emit( item, "mouse,in", "over2");
247
248     // selected manually
249     elm_gengrid_item_selected_set(item, EINA_TRUE);
250 }
251
252 void BookmarksUI::unFocusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info)
253 {
254     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
255     Elm_Object_Item *item = reinterpret_cast<Elm_Object_Item*>(event_info);
256     elm_object_item_signal_emit( item, "mouse,out", "over2");
257
258     // unselected manually
259     elm_gengrid_item_selected_set(item, EINA_FALSE);
260 }
261
262 std::shared_ptr<tizen_browser::services::BookmarkItem> BookmarksUI::getSelectedBookmarkItem()
263 {
264     Elm_Object_Item * selected = elm_gengrid_selected_item_get(m_gengrid);
265
266     if (!selected) {
267             BROWSER_LOGD("none selected");
268         return std::make_shared<tizen_browser::services::BookmarkItem>();
269     }
270         BookmarkItemData * itemData = reinterpret_cast<BookmarkItemData *>(elm_object_item_data_get(selected));
271         return itemData->item;
272 }
273
274
275 }
276 }