2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #include "BookmarksManager.h"
23 #include "BrowserLogger.h"
25 namespace tizen_browser
30 BookmarksManagerItem::BookmarksManagerItem()
31 : action(std::make_shared<Action>())
35 BookmarksManagerItem::BookmarksManagerItem( std::shared_ptr<Action> action)
42 BookmarksManagerItem::BookmarksManagerItem(const BookmarksManagerItem& source)
43 : action(source.action)
47 BookmarksManagerItem::BookmarksManagerItem(const BookmarksManagerItem* source)
48 : action(source->action)
54 BookmarksManagerItem::~BookmarksManagerItem()
56 //elm_genlist_item_class_free(m_itemClass);??
59 BookmarksManager::BookmarksManager(std::shared_ptr< Evas_Object > mainWindow, Evas_Object* parentButton)
60 : MenuButton(mainWindow, parentButton)
62 , m_isPopupShown (false)
64 , m_itemClass(nullptr)
65 , m_internalPopup(nullptr)
66 , m_internalPopupVisible(false)
67 , m_pointerModeEnabled(true)
69 std::string edjFilePath = EDJE_DIR;
70 edjFilePath.append("SimpleUI/BookmarksManager.edj");
71 elm_theme_extension_add(0, edjFilePath.c_str());
73 m_genlist = elm_genlist_add(m_window.get());
75 evas_object_smart_callback_add(m_genlist, "item,focused", focusItem, nullptr);
76 evas_object_smart_callback_add(m_genlist, "item,unfocused", unFocusItem, nullptr);
78 elm_object_style_set(m_genlist, "bookmarks_manager");
79 elm_genlist_homogeneous_set(m_genlist, EINA_TRUE);
80 elm_genlist_multi_select_set(m_genlist, EINA_FALSE);
82 elm_genlist_select_mode_set(m_genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
84 m_itemClass = elm_genlist_item_class_new();
85 m_itemClass->item_style = "bookmarks_manager_item";
87 m_itemClass->func.text_get = &gridTextGet;
88 m_itemClass->func.content_get = &gridOptionLabelGet;
89 m_itemClass->func.state_get = 0;
90 m_itemClass->func.del = 0;
93 BookmarksManager::~BookmarksManager()
98 Evas_Object* BookmarksManager::getContent()
103 tizen_browser::base_ui::MenuButton::ListSize BookmarksManager::calculateSize()
113 Evas_Object* BookmarksManager::getFirstFocus()
118 void BookmarksManager::addAction(sharedAction action)
120 std::shared_ptr<BookmarksManagerItem> bookmarks_managerItem = std::make_shared<BookmarksManagerItem>(action);
121 BROWSER_LOGD("[%s] %x: %s", __func__ , bookmarks_managerItem.get(), bookmarks_managerItem->action->getText().c_str() );
122 Elm_Object_Item* elmItem= elm_genlist_item_append(m_genlist, //genlist
123 m_itemClass, //item Class
124 bookmarks_managerItem.get(), //item data
126 ELM_GENLIST_ITEM_NONE,//item type
130 m_bookmarks_managerItemsMap[elmItem] = bookmarks_managerItem;
131 BROWSER_LOGD("[%s:%d] \n\t %x:%s ", __PRETTY_FUNCTION__, __LINE__, elmItem, bookmarks_managerItem->action->getText().c_str());
132 if(!bookmarks_managerItem->action->isEnabled()){
133 elm_object_item_disabled_set(elmItem, EINA_TRUE);
135 if(bookmarks_managerItem->action->isCheckable()){
136 elm_object_item_signal_emit(elmItem,
137 (bookmarks_managerItem->action->isChecked() ? "switch,on" : "switch,off")
138 , "BookmarksManagerModel");
140 elm_object_item_signal_emit(elmItem, "switch,hide", "BookmarksManagerModel");
142 action->enabledChanged.connect(boost::bind(&BookmarksManager::onEnabledChanged, this, action));
143 m_actionButtonMap[action] = elmItem;
146 void BookmarksManager::onEnabledChanged(sharedAction action)
148 BROWSER_LOGD("[%s]", __func__);
149 refreshAction(action);
152 void BookmarksManager::refreshAction(sharedAction action)
154 BROWSER_LOGD("[%s]", __func__);
155 if(action->isEnabled())
156 elm_object_item_disabled_set(m_actionButtonMap[action], EINA_FALSE);
158 elm_object_item_disabled_set(m_actionButtonMap[action], EINA_TRUE);
161 char* BookmarksManager::gridTextGet(void* data, Evas_Object* /*obj*/, const char* part)
163 BROWSER_LOGD("[%s]", __func__);
164 BookmarksManagerItem *bookmarks_managerItem =reinterpret_cast<BookmarksManagerItem*>(data);
165 if(!strcmp(part, "optionName")){
166 if(!bookmarks_managerItem->action->getText().empty()){
167 return strdup(bookmarks_managerItem->action->getText().c_str());
173 Evas_Object* BookmarksManager::gridOptionLabelGet(void* data, Evas_Object* obj, const char* part)
175 BookmarksManagerItem *bookmarks_managerItem =reinterpret_cast<BookmarksManagerItem*>(data);
176 if(!strcmp(part, "optionValue")){
177 if(bookmarks_managerItem->action->isEnabled() && bookmarks_managerItem->action->isCheckable()){
178 Evas_Object *label = elm_label_add(obj);
179 elm_object_text_set(label, (bookmarks_managerItem->action->isChecked() ? "On" :"Off" ));
180 elm_object_style_set(label, "bookmarks_manager_label");
188 void BookmarksManager::itemClicked(void* data, Evas_Object* /*o*/, void* event_info)
190 BROWSER_LOGD("[%s]", __func__);
192 BookmarksManager* bookmarks_manager = reinterpret_cast<BookmarksManager*>(data);
193 Elm_Object_Item* elmItem = reinterpret_cast<Elm_Object_Item*>(event_info);
194 BROWSER_LOGD("[%s:%d] \n\t %x", __PRETTY_FUNCTION__, __LINE__, elmItem);
195 if(bookmarks_manager->m_bookmarks_managerItemsMap.count(elmItem)){
196 std::shared_ptr<BookmarksManagerItem> bookmarks_managerItem(bookmarks_manager->m_bookmarks_managerItemsMap[elmItem]);// elm_object_item_data_get(elmItem)
197 if(bookmarks_managerItem->action->isEnabled()){
198 if(bookmarks_managerItem->action->isCheckable()) {
199 bookmarks_manager->showInternalPopup(elmItem);
201 bookmarks_managerItem->action->trigger();
207 void BookmarksManager::showPopup()
209 BROWSER_LOGD("[%s:%d] this: %x ", __PRETTY_FUNCTION__, __LINE__, this);
212 m_isPopupShown = false;
214 evas_object_hide(m_popup);
219 m_popup = elm_popup_add(m_window.get());
220 BROWSER_LOGD("[%s:%d] - new popup: %x ", __PRETTY_FUNCTION__, __LINE__, m_popup);
221 evas_object_smart_callback_add(m_popup, "block,clicked", block_clicked, this);
222 // elm_object_content_set(m_popup, getContent());
223 elm_object_part_text_set(m_popup, "title,text", "Add to Bookmark");
226 evas_object_geometry_get(m_window.get(), &x, &y, &w, &h);
227 evas_object_geometry_set(m_popup,0,0,w,h);
229 //elm_object_style_set(m_popup, "message_popup");
231 //evas_object_resize(m_popup, 480, 800);
235 void BookmarksManager::realShow(Evas_Object* popup)
237 elm_object_focus_next_object_set(m_parentButton, getFirstFocus(), ELM_FOCUS_DOWN);
238 elm_object_focus_next_object_set(getFirstFocus(), m_parentButton, ELM_FOCUS_UP);
240 // ListSize listSize = calculateSize();
241 // evas_object_size_hint_min_set(m_popup, listSize.width, listSize.height);
242 // evas_object_size_hint_max_set(m_popup, listSize.width, listSize.height);
243 elm_popup_item_append(popup,"Folde 1",nullptr,nullptr,this);
244 elm_popup_item_append(popup,"Folde 2",nullptr,nullptr,this);
245 elm_popup_item_append(popup,"Folde 3",nullptr,nullptr,this);
246 elm_popup_item_append(popup,"Folde 4",nullptr,nullptr,this);
247 elm_popup_item_append(popup,"Folde 5",nullptr,nullptr,this);
248 elm_popup_item_append(popup,"Folde 6",nullptr,nullptr,this);
249 elm_popup_item_append(popup,"Folde 7",nullptr,nullptr,this);
250 elm_popup_item_append(popup,"Folde 8",nullptr,nullptr,this);
251 elm_popup_item_append(popup,"Folde 8",nullptr,nullptr,this);
252 elm_popup_item_append(popup,"Folde 10",nullptr,nullptr,this);
253 elm_popup_item_append(popup,"Folde 11",nullptr,nullptr,this);
254 elm_popup_item_append(popup,"Folde 12",nullptr,nullptr,this);
255 evas_object_show(popup);
259 void BookmarksManager::unbindFocus()
261 BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
262 elm_object_focus_next_object_set(m_parentButton, nullptr, ELM_FOCUS_DOWN);
265 bool BookmarksManager::isPopupShown()
267 return m_isPopupShown;
270 void BookmarksManager::block_clicked(void *data, Evas_Object *obj, void *event_info)
272 evas_object_hide(obj);
275 void BookmarksManager::hidePopup()
277 BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
278 evas_object_hide(m_popup);
279 m_isPopupShown = false;
282 void BookmarksManager::showInternalPopup(Elm_Object_Item* listItem)
284 BROWSER_LOGD("[%s]", __func__);
285 m_internalPopupVisible = true;
286 m_trackedItem = listItem;
288 if(!m_internalPopup){
289 m_internalPopup = elm_ctxpopup_add(m_window.get());
290 evas_object_smart_callback_add(m_internalPopup, "dismissed", BookmarksManager::dismissedCtxPopup, this);
292 Evas_Object * buttonBox = elm_box_add(m_internalPopup);
293 Evas_Object * radioOn = elm_radio_add(m_internalPopup);
294 Evas_Object * radioOff = elm_radio_add(m_internalPopup);
297 elm_object_text_set(radioOn, "On");
298 elm_object_text_set(radioOff, "Off");
300 elm_object_style_set(radioOn, "bookmarks_manager_radio");
301 elm_object_style_set(radioOff, "bookmarks_manager_radio");
303 elm_box_pack_end(buttonBox, radioOn);
304 elm_box_pack_end(buttonBox, radioOff);
306 m_checkState = (m_bookmarks_managerItemsMap[m_trackedItem]->action->isChecked() ? CheckStateOn : CheckStateOff );
308 elm_radio_state_value_set(radioOn, CheckStateOn);//true
309 elm_radio_value_pointer_set(radioOn, reinterpret_cast<int*>(&m_checkState));
311 elm_radio_state_value_set(radioOff, CheckStateOff);//false
312 elm_radio_value_pointer_set(radioOff, reinterpret_cast<int*>(&m_checkState));
314 elm_radio_group_add(radioOff, radioOn);
316 evas_object_smart_callback_add(radioOn, "changed", radioChanged, this);
317 evas_object_smart_callback_add(radioOff, "changed", radioChanged, this);
319 evas_object_size_hint_weight_set(buttonBox, EVAS_HINT_EXPAND,EVAS_HINT_EXPAND);
320 evas_object_size_hint_align_set(buttonBox, EVAS_HINT_FILL, EVAS_HINT_FILL);
322 evas_object_show(buttonBox);
323 evas_object_show(radioOn);
324 evas_object_show(radioOff);
327 elm_object_content_set(m_internalPopup, buttonBox);
328 elm_ctxpopup_direction_priority_set(m_internalPopup,
329 ELM_CTXPOPUP_DIRECTION_DOWN,
330 ELM_CTXPOPUP_DIRECTION_DOWN,
331 ELM_CTXPOPUP_DIRECTION_DOWN,
332 ELM_CTXPOPUP_DIRECTION_DOWN);
336 evas_object_geometry_get(elm_object_item_track(m_trackedItem), &x, &y, &w, &h);
338 BROWSER_LOGD("[%s:%d] \n\tx:%d; y:%d; w:%d; h:%d ", __PRETTY_FUNCTION__, __LINE__,
340 evas_object_move(m_internalPopup, x + 354, y);//354 is proper value
343 elm_object_style_set(m_internalPopup, "bookmarks_manager_button");
344 evas_object_show(m_internalPopup);
345 if(!m_pointerModeEnabled)
346 elm_object_focus_set(radioOn, EINA_TRUE);
347 elm_object_item_signal_emit(m_trackedItem, "selected", "BookmarksManagerModel");
348 elm_object_signal_emit(m_genlist, "show_popup", "BookmarksManagerModel");
351 void BookmarksManager::dismissedCtxPopup(void* data, Evas_Object* obj, void* /*event_info*/)
353 BROWSER_LOGD("[%s]", __func__);
354 BookmarksManager* bookmarks_manager = static_cast<BookmarksManager*>(data);
355 evas_object_hide(obj);
356 bookmarks_manager->m_internalPopup = 0;
357 elm_object_signal_emit(bookmarks_manager->m_genlist, "hide_popup", "BookmarksManagerModel");
358 elm_object_item_signal_emit(bookmarks_manager->m_trackedItem, "unselected", "BookmarksManagerModel");
361 elm_object_item_untrack(bookmarks_manager->m_trackedItem);
363 bookmarks_manager->m_internalPopupVisible = false;
366 void BookmarksManager::radioChanged(void* data, Evas_Object* /*obj*/, void* /*event_info*/)
368 BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
369 BookmarksManager *bookmarks_manager = static_cast<BookmarksManager*>(data);
370 std::shared_ptr<BookmarksManagerItem> bookmarks_managerItem(bookmarks_manager->m_bookmarks_managerItemsMap[bookmarks_manager->m_trackedItem]);
371 bookmarks_managerItem->action->toggle();
372 elm_object_item_signal_emit(bookmarks_manager->m_trackedItem,
373 (bookmarks_managerItem->action->isChecked() ? "switch,on" : "switch,off")
374 , "BookmarksManagerModel");
375 elm_genlist_item_update(bookmarks_manager->m_trackedItem);
376 elm_object_signal_emit(bookmarks_manager->m_internalPopup, "elm,state,hide", "elm");
379 void BookmarksManager::focusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info)
381 BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
382 Elm_Object_Item *item = reinterpret_cast<Elm_Object_Item*>(event_info);
383 elm_object_item_signal_emit( item, "mouse,in", "option*");
386 void BookmarksManager::unFocusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info)
388 BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
389 Elm_Object_Item *item = reinterpret_cast<Elm_Object_Item*>(event_info);
390 elm_object_item_signal_emit( item, "mouse,out", "option*");
393 void BookmarksManager::setPointerModeEnabled (bool enabled)
395 m_pointerModeEnabled = enabled;
398 bool BookmarksManager::canBeDismissed()
400 BROWSER_LOGD("[%s]", __func__);
401 bool internalPopupVisible = m_internalPopup && m_internalPopupVisible;
402 if(internalPopupVisible) {
403 elm_ctxpopup_dismiss(m_internalPopup);
411 }//namespace tizen_browser