2b68784c1293a55e4662c489a6a4239dce1856a7
[profile/tv/apps/web/browser.git] / services / SettingsUI / SettingsUI.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 <string.h>
20 #include <vector>
21 #include <AbstractMainWindow.h>
22
23 #include "SettingsUI.h"
24 #include "ServiceManager.h"
25 #include "BrowserLogger.h"
26 #include "Tools/EflTools.h"
27
28 #define efl_scale       (elm_config_scale_get() / elm_app_base_scale_get())
29
30 namespace tizen_browser{
31 namespace base_ui{
32
33 EXPORT_SERVICE(SettingsUI, "org.tizen.browser.settingsui")
34
35 struct ItemData {
36     tizen_browser::base_ui::SettingsUI* settingsUI;
37     Elm_Object_Item * e_item;
38 };
39
40 SettingsUI::SettingsUI()
41     : m_settings_layout(nullptr)
42     , m_genListActionBar(nullptr)
43     , m_itemClassActionBar(nullptr)
44     , m_parent(nullptr)
45     , m_item_class(nullptr)
46     , m_scroller(nullptr)
47     , m_items_layout(nullptr)
48 {
49     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
50     m_edjFilePath = EDJE_DIR;
51     m_edjFilePath.append("SettingsUI/SettingsUI.edj");
52 }
53
54 SettingsUI::~SettingsUI()
55 {
56
57 }
58
59 void SettingsUI::show(Evas_Object* parent)
60 {
61     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
62     elm_theme_extension_add(nullptr, m_edjFilePath.c_str());
63     m_settings_layout = elm_layout_add(parent);
64     elm_layout_file_set(m_settings_layout, m_edjFilePath.c_str(), "settings-layout");
65     evas_object_size_hint_weight_set(m_settings_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
66     evas_object_size_hint_align_set(m_settings_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
67     evas_object_show(m_settings_layout);
68
69     showActionBar();
70     showSettingsPage();
71 }
72
73 void SettingsUI::showActionBar()
74 {
75     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
76     elm_theme_extension_add(nullptr, m_edjFilePath.c_str());
77     m_genListActionBar = elm_genlist_add(m_settings_layout);
78     elm_object_part_content_set(m_settings_layout, "actionbar_swallow", m_genListActionBar);
79     elm_genlist_homogeneous_set(m_genListActionBar, EINA_FALSE);
80     elm_genlist_multi_select_set(m_genListActionBar, EINA_FALSE);
81     elm_genlist_select_mode_set(m_genListActionBar, ELM_OBJECT_SELECT_MODE_ALWAYS);
82     elm_genlist_mode_set(m_genListActionBar, ELM_LIST_LIMIT);
83     elm_genlist_decorate_mode_set(m_genListActionBar, EINA_TRUE);
84     evas_object_size_hint_weight_set(m_genListActionBar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
85
86     m_itemClassActionBar = elm_genlist_item_class_new();
87     m_itemClassActionBar->item_style = "settings_action_bar_items";
88     m_itemClassActionBar->func.text_get = nullptr;
89     m_itemClassActionBar->func.content_get = &listActionBarContentGet;
90     m_itemClassActionBar->func.state_get = nullptr;
91     m_itemClassActionBar->func.del = nullptr;
92
93     ItemData *id = new ItemData;
94     id->settingsUI = this;
95     Elm_Object_Item *elmItem = elm_genlist_item_append(m_genListActionBar,    //genlist
96                                                        m_itemClassActionBar,  //item Class
97                                                        id,
98                                                        nullptr,               //parent item
99                                                        ELM_GENLIST_ITEM_NONE, //item type
100                                                        nullptr,
101                                                        nullptr                //data passed to above function
102                                                       );
103     id->e_item = elmItem;
104
105     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
106 }
107
108 void SettingsUI::showSettingsPage()
109 {
110     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
111
112     ItemData *id = new ItemData;
113     id->settingsUI = this;
114
115     m_scroller = elm_scroller_add(m_settings_layout);
116     m_items_layout = elm_layout_add(m_scroller);
117     elm_object_content_set(m_scroller, m_items_layout);
118     elm_layout_file_set(m_items_layout, m_edjFilePath.c_str(), "settings_items");
119     elm_object_part_content_set(m_settings_layout, "settings_scroller_swallow", m_scroller);
120     evas_object_size_hint_weight_set(m_scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
121     evas_object_size_hint_align_set(m_scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
122     elm_scroller_policy_set(m_items_layout, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_AUTO);
123     elm_scroller_bounce_set(m_scroller, EINA_TRUE, EINA_FALSE);
124     elm_scroller_propagate_events_set(m_scroller, EINA_TRUE);
125     evas_object_show(m_scroller);
126     evas_object_show(m_items_layout);
127
128     Evas_Object *del_selected_data_button = elm_button_add(m_items_layout);
129     elm_object_style_set(del_selected_data_button, "basic_button");
130     evas_object_smart_callback_add(del_selected_data_button, "clicked", _del_selected_data_clicked_cb, (void*)id);
131     elm_layout_content_set(m_items_layout, "del_selected_data_click", del_selected_data_button);
132
133     Evas_Object *reset_mv_button = elm_button_add(m_items_layout);
134     elm_object_style_set(reset_mv_button, "basic_button");
135     evas_object_smart_callback_add(reset_mv_button, "clicked", _reset_mv_clicked_cb, (void*)id);
136     elm_layout_content_set(m_items_layout, "reset_mv_click", reset_mv_button);
137
138     Evas_Object *reset_browser_button = elm_button_add(m_items_layout);
139     elm_object_style_set(reset_browser_button, "basic_button");
140     evas_object_smart_callback_add(reset_browser_button, "clicked", _reset_browser_clicked_cb, (void*)id);
141     elm_layout_content_set(m_items_layout, "reset_browser_click", reset_browser_button);
142
143
144     Evas_Object *cache_checkbox = elm_check_add(m_items_layout);
145     elm_layout_content_set(m_items_layout, "cache_cb", cache_checkbox);
146     elm_check_state_set(cache_checkbox, EINA_TRUE);
147     edje_object_signal_callback_add(elm_layout_edje_get(m_items_layout), "mouse,clicked,1", "cache_cb_text", __checkbox_label_click_cb, (void*)id);
148
149     Evas_Object *cookies_checkbox = elm_check_add(m_items_layout);
150     elm_layout_content_set(m_items_layout, "cookies_cb", cookies_checkbox);
151     elm_check_state_set(cookies_checkbox, EINA_TRUE);
152     edje_object_signal_callback_add(elm_layout_edje_get(m_items_layout), "mouse,clicked,1", "cookies_cb_text", __checkbox_label_click_cb, (void*)id);
153
154     Evas_Object *history_checkbox = elm_check_add(m_items_layout);
155     elm_layout_content_set(m_items_layout, "history_cb", history_checkbox);
156     elm_check_state_set(history_checkbox, EINA_TRUE);
157     edje_object_signal_callback_add(elm_layout_edje_get(m_items_layout), "mouse,clicked,1", "history_cb_text", __checkbox_label_click_cb, (void*)id);
158
159
160     Evas_Object *accept_all_rb = elm_radio_add(m_items_layout);
161     elm_object_style_set(accept_all_rb, "settings_radio");
162     elm_layout_content_set(m_items_layout, "accept_all_rb", accept_all_rb);
163
164     Evas_Object *ask_rb = elm_radio_add(m_items_layout);
165     elm_object_style_set(ask_rb, "settings_radio");
166     elm_layout_content_set(m_items_layout, "ask_rb", ask_rb);
167
168     Evas_Object *sr_disable_rb = elm_radio_add(m_items_layout);
169     elm_object_style_set(sr_disable_rb, "settings_radio");
170     elm_layout_content_set(m_items_layout, "sr_disable_rb", sr_disable_rb);
171
172     Evas_Object *bs_enable_rb = elm_radio_add(m_items_layout);
173     elm_object_style_set(bs_enable_rb, "settings_radio");
174     elm_layout_content_set(m_items_layout, "bs_enable_rb", bs_enable_rb);
175
176     Evas_Object *bs_disable_rb = elm_radio_add(m_items_layout);
177     elm_object_style_set(bs_disable_rb, "settings_radio");
178     elm_layout_content_set(m_items_layout, "bs_disable_rb", bs_disable_rb);
179
180     Evas_Object *ts_enable_rb = elm_radio_add(m_items_layout);
181     elm_object_style_set(ts_enable_rb, "settings_radio");
182     elm_layout_content_set(m_items_layout, "ts_enable_rb", ts_enable_rb);
183
184     Evas_Object *ts_disable_rb = elm_radio_add(m_items_layout);
185     elm_object_style_set(ts_disable_rb, "settings_radio");
186     elm_layout_content_set(m_items_layout, "ts_disable_rb", ts_disable_rb);
187
188 }
189
190 Evas_Object* SettingsUI::listActionBarContentGet(void* data, Evas_Object* obj , const char* part)
191 {
192     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
193     if (obj && part) {
194         const char *part_name = "close_click";
195         static const int part_name_len = strlen(part_name);
196         if (!strncmp(part_name, part, part_name_len)) {
197             Evas_Object *close_click = elm_button_add(obj);
198             elm_object_style_set(close_click, "basic_button");
199             evas_object_smart_callback_add(close_click, "clicked", SettingsUI::close_clicked_cb, data);
200             return close_click;
201         }
202     }
203     return nullptr;
204 }
205
206 void SettingsUI::__checkbox_label_click_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
207 {
208     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
209     if (data) {
210         ItemData *id = static_cast<ItemData*>(data);
211
212         if(strcmp(source, "cache_cb_text") == 0 ){
213             Evas_Object *cache_check = elm_layout_content_get(id->settingsUI->m_items_layout, "cache_cb");
214             elm_check_state_set(cache_check, !elm_check_state_get(cache_check));
215         }
216         else if (strcmp(source, "cookies_cb_text") == 0 ){
217             Evas_Object *cookies_check = elm_layout_content_get(id->settingsUI->m_items_layout, "cookies_cb");
218             elm_check_state_set(cookies_check, !elm_check_state_get(cookies_check));
219         }
220         else if (strcmp(source, "history_cb_text") == 0 ){
221             Evas_Object *history_check = elm_layout_content_get(id->settingsUI->m_items_layout, "history_cb");
222             elm_check_state_set(history_check, !elm_check_state_get(history_check));
223         }
224         else{
225             BROWSER_LOGD("[%s:%d] - no matched source", __PRETTY_FUNCTION__, __LINE__);
226         }
227     }
228 }
229
230 void SettingsUI::close_clicked_cb(void* data, Evas_Object*, void*)
231 {
232     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
233     if (data) {
234         ItemData * id = static_cast<ItemData*>(data);
235         id->settingsUI->closeSettingsUIClicked(std::string());
236         id->settingsUI->clearItems();
237     }
238 }
239
240 void SettingsUI::hide()
241 {
242     evas_object_hide(elm_layout_content_get(m_settings_layout, "action_bar_swallow"));
243     evas_object_hide(elm_layout_content_get(m_settings_layout, "settings_scroller_swallow"));
244     evas_object_hide(m_settings_layout);
245 }
246
247 void SettingsUI::_del_selected_data_clicked_cb(void *data, Evas_Object*, void*)
248 {
249     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
250     if (data) {
251         ItemData *id = static_cast<ItemData*>(data);
252         Evas_Object *cache_check = elm_layout_content_get(id->settingsUI->m_items_layout, "cache_cb");
253         Evas_Object *cookies_check = elm_layout_content_get(id->settingsUI->m_items_layout, "cookies_cb");
254         Evas_Object *history_check = elm_layout_content_get(id->settingsUI->m_items_layout, "history_cb");
255         std::string type;
256         elm_check_state_get(cache_check) ? type += "_CACHE" : "";
257         elm_check_state_get(cookies_check) ? type += "_COOKIES" : "";
258         elm_check_state_get(history_check) ? type += "_HISTORY" : "";
259         id->settingsUI->deleteSelectedDataClicked(type);
260     }
261 }
262
263 void SettingsUI::_reset_mv_clicked_cb(void *data, Evas_Object*, void*)
264 {
265     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
266     if (data) {
267         ItemData* itemData = static_cast<ItemData*>(data);
268         itemData->settingsUI->resetMostVisitedClicked(std::string());
269     }
270 }
271
272 void SettingsUI::_reset_browser_clicked_cb(void *data, Evas_Object*, void*)
273 {
274     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
275     if (data) {
276         ItemData* itemData = static_cast<ItemData*>(data);
277         itemData->settingsUI->resetBrowserClicked(std::string());
278     }
279 }
280
281 void SettingsUI::clearItems()
282 {
283     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
284     hide();
285     elm_genlist_clear(m_genListActionBar);
286 }
287
288 }
289 }