From c3d5d61f316279c6b1aed481337368ca588628d4 Mon Sep 17 00:00:00 2001 From: Gajendra N Date: Fri, 26 Jun 2015 14:13:58 +0530 Subject: [PATCH 01/16] fixup! Unable to delete all history items. 1) Fixes popup button not disabled on deleting last item. 2) Shows proper date and time. Change-Id: I323fdd6a6e7871f153c68f7c10d8587638a1de28 --- services/HistoryService/HistoryService.h | 1 + services/HistoryService/src/HistoryService.cpp | 66 ++++++++++++++++++++++---- services/SimpleUI/SimpleUI.cpp | 1 + 3 files changed, 60 insertions(+), 8 deletions(-) diff --git a/services/HistoryService/HistoryService.h b/services/HistoryService/HistoryService.h index e92cf5d..0e09cab 100644 --- a/services/HistoryService/HistoryService.h +++ b/services/HistoryService/HistoryService.h @@ -43,6 +43,7 @@ public: virtual ~HistoryService(); virtual std::string getName(); + int getHistoryId(const std::string & url); /** * @throws HistoryException on error */ diff --git a/services/HistoryService/src/HistoryService.cpp b/services/HistoryService/src/HistoryService.cpp index a377bf1..5aff218 100644 --- a/services/HistoryService/src/HistoryService.cpp +++ b/services/HistoryService/src/HistoryService.cpp @@ -17,12 +17,16 @@ #include #include #include +#include +#include +#include #include "ServiceManager.h" #include "HistoryService.h" #include "HistoryItem.h" #include "AbstractWebEngine.h" #include "EflTools.h" + namespace tizen_browser { namespace services @@ -60,8 +64,7 @@ void HistoryService::setStorageServiceTestMode(bool testmode) { } int HistoryService::getHistoryItemsCount(){ - return 1; - //return getStorageManager()->getHistoryItemsCount(); + return history_list.size(); } static int __get_duplicated_ids_p(int **ids, int *count, const int limit, const int offset, @@ -122,11 +125,12 @@ void HistoryService::addHistoryItem(std::shared_ptr his){ bp_history_adaptor_set_url(id, (his->getUrl()).c_str()); bp_history_adaptor_set_title(id, (his->getTitle()).c_str()); - + bp_history_adaptor_set_date_visited(id,-1); std::unique_ptr favicon_blob = tizen_browser::tools::EflTools::getBlobPNG(favicon); unsigned char * fav = std::move((unsigned char*)favicon_blob->getData()); bp_history_adaptor_set_icon(id, favicon->width, favicon->height, fav, favicon_blob->getLength()); + history_list.push_back(his); BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); } @@ -141,7 +145,28 @@ void HistoryService::insertOrRefresh(std::shared_ptr hi) { */ void HistoryService::clearAllHistory() { - getStorageManager()->deleteHistory(); + bp_history_adaptor_reset(); + history_list.clear(); +} + +int HistoryService::getHistoryId(const std::string & url) +{ + bp_history_rows_cond_fmt conds; + conds.limit = -1; + conds.offset = 0; + conds.order_offset = BP_HISTORY_O_DATE_CREATED; + conds.ordering = 0; + conds.period_offset = BP_HISTORY_O_DATE_CREATED; + conds.period_type = BP_HISTORY_DATE_ALL; + int *ids = 0; + int ids_count = 0; + int ret = bp_history_adaptor_get_cond_ids_p(&ids ,&ids_count, &conds, BP_HISTORY_O_URL, url.c_str(), 0); + if (ids_count!=0){ + int i = *ids; + free(ids); + return i; + } + return 0; } /** @@ -149,9 +174,12 @@ void HistoryService::clearAllHistory() */ void HistoryService::clearURLHistory(const std::string & url) { - getStorageManager()->deleteHistory(url); - if(0 == getHistoryItemsCount()){ - historyEmpty(true); + int id = getHistoryId(url); + if (id != 0) + bp_history_adaptor_delete(id); + if (0 == (getHistoryItemsCount() - 1)) { + historyEmpty(true); + history_list.clear(); } } @@ -182,13 +210,35 @@ HistoryItemVector& HistoryService::getHistoryItems(int historyDepthInDays, int m BROWSER_LOGD("Error! Could not get ids!"); } - bp_history_offset offset = (BP_HISTORY_O_URL | BP_HISTORY_O_TITLE | BP_HISTORY_O_FAVICON); + bp_history_offset offset = (BP_HISTORY_O_URL | BP_HISTORY_O_TITLE | BP_HISTORY_O_FAVICON | BP_HISTORY_O_DATE_CREATED); for(int i = 0; i< (*count1); i++){ bp_history_info_fmt history_info; bp_history_adaptor_get_info(ids[i],offset,&history_info); + int date; + bp_history_adaptor_get_date_created(ids[i], &date); + + struct tm *item_time_info; + time_t item_time = (time_t)date; + item_time_info = localtime(&item_time); + + int m_year = item_time_info->tm_year; + int m_month = item_time_info->tm_mon + 1; + int m_day = item_time_info->tm_yday; + int m_month_day = item_time_info->tm_mday; + int m_date = date; + int min = item_time_info->tm_min; + int hour= item_time_info->tm_hour; + int sec = item_time_info->tm_sec; + m_year = 2000 + m_year % 100; + std::shared_ptr history = std::make_shared(std::string(history_info.url)); + boost::gregorian::date d(m_year,m_month,m_month_day); + boost::posix_time::ptime t(d,boost::posix_time::time_duration(hour,min,sec)); + history->setLastVisit(t); + history->setUrl(std::string(history_info.url ? history_info.url : "")); + history->setTitle(std::string(history_info.title ? history_info.title : "")); history_list.push_back(history); } ids = NULL; diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index 3b6ee0d..a25ef5d 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -978,6 +978,7 @@ void SimpleUI::disableHistoryButton(bool flag) { BROWSER_LOGD("[%s:%d] flag:%d ", __PRETTY_FUNCTION__, __LINE__, flag); m_history->setEnabled(!flag); + m_settingDeleteHistory->setEnabled(m_historyService->getHistoryItemsCount()); hidePopup(); } -- 2.7.4 From d1cea92b3c285b651f1ea525acc8c62317f5a449 Mon Sep 17 00:00:00 2001 From: Jung Ick Guack Date: Tue, 30 Jun 2015 21:37:15 +0900 Subject: [PATCH 02/16] 1) Fixed a crash of adding bookmark. (Added null checking) 2) Added privilege for using browser-provider Change-Id: I2c9c8b4208e9d1ff7b951419fad15ed404a170bb Signed-off-by: Jung Ick Guack --- manifest.xml.in | 4 ++++ services/BookmarkService/BookmarkService.cpp | 18 ++++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/manifest.xml.in b/manifest.xml.in index b8756da..8c4c7f1 100644 --- a/manifest.xml.in +++ b/manifest.xml.in @@ -73,4 +73,8 @@ + + http://tizen.org/privilege/bookmark.admin + http://tizen.org/privilege/history.admin + diff --git a/services/BookmarkService/BookmarkService.cpp b/services/BookmarkService/BookmarkService.cpp index 2fd0bf7..99b14e2 100644 --- a/services/BookmarkService/BookmarkService.cpp +++ b/services/BookmarkService/BookmarkService.cpp @@ -97,14 +97,16 @@ std::shared_ptr BookmarkService::addToBookmarks( bp_bookmark_adaptor_set_url(bookmark_id, address.c_str()); bp_bookmark_adaptor_set_title(bookmark_id, tittle.c_str()); - - std::unique_ptr thumb_blob = tizen_browser::tools::EflTools::getBlobPNG(thumbnail); - unsigned char * thumb = std::move((unsigned char*)thumb_blob->getData()); - bp_bookmark_adaptor_set_snapshot(bookmark_id, thumbnail->width, thumbnail->height, thumb, thumb_blob->getLength()); - - std::unique_ptr favicon_blob = tizen_browser::tools::EflTools::getBlobPNG(favicon); - unsigned char * fav = std::move((unsigned char*)favicon_blob->getData()); - bp_bookmark_adaptor_set_icon(bookmark_id, favicon->width, favicon->height, fav, favicon_blob->getLength()); + if (thumbnail) { + std::unique_ptr thumb_blob = tizen_browser::tools::EflTools::getBlobPNG(thumbnail); + unsigned char * thumb = std::move((unsigned char*)thumb_blob->getData()); + bp_bookmark_adaptor_set_snapshot(bookmark_id, thumbnail->width, thumbnail->height, thumb, thumb_blob->getLength()); + } + if (favicon) { + std::unique_ptr favicon_blob = tizen_browser::tools::EflTools::getBlobPNG(favicon); + unsigned char * fav = std::move((unsigned char*)favicon_blob->getData()); + bp_bookmark_adaptor_set_icon(bookmark_id, favicon->width, favicon->height, fav, favicon_blob->getLength()); + } m_bookmarks.push_back(bookmark); BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); -- 2.7.4 From 8d99569cc11767afa8c7fd7cda7289bb5c32d3cc Mon Sep 17 00:00:00 2001 From: Jung Ick Guack Date: Thu, 2 Jul 2015 09:43:32 +0900 Subject: [PATCH 03/16] Changed "opengl" to "3d" on elm_config_accel_preference_set Change-Id: I227e313d22ffaf5b5294da53bbf232d1943cd4f7 Signed-off-by: Jung Ick Guack --- core/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) mode change 100644 => 100755 core/main.cpp diff --git a/core/main.cpp b/core/main.cpp old mode 100644 new mode 100755 index f435d7e..9342b05 --- a/core/main.cpp +++ b/core/main.cpp @@ -38,7 +38,8 @@ const std::string DEFAULT_URL = ""; static bool app_create(void * /*app_data*/) { - elm_config_accel_preference_set("opengl"); +// elm_config_accel_preference_set("opengl"); + elm_config_accel_preference_set("3d"); elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK); // Enabling focus -- 2.7.4 From c55051a1a252e538fd50bdc07fcf17713464a3a1 Mon Sep 17 00:00:00 2001 From: Jung Ick Guack Date: Thu, 2 Jul 2015 09:44:48 +0900 Subject: [PATCH 04/16] Fixed app service is not working during runtime. Change-Id: Ie0ed329ba8449debae7e5d81372097b15c62957e Signed-off-by: Jung Ick Guack --- services/SimpleUI/SimpleUI.cpp | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index a25ef5d..f2567ba 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -294,26 +294,27 @@ int SimpleUI::exec(const std::string& _url) } m_initialised = true; - // only when first run - if (url.empty()) { - BROWSER_LOGD("[%s]: changing to homeUrl", __func__); - switchViewToHomePage(); - filterURL(HomePageURL); - if(lastSession.items().size() >= 1){ - for(auto iter=lastSession.items().begin(), - end=lastSession.items().end(); - iter != end; - iter++ - ){ - openNewTab(iter->second); - } - m_sessionService->getStorage()->deleteSession(lastSession); - } - } - else - openNewTab(url); } + // only when first run + if (url.empty()) { + BROWSER_LOGD("[%s]: changing to homeUrl", __func__); + switchViewToHomePage(); + filterURL(HomePageURL); + if(lastSession.items().size() >= 1){ + for(auto iter=lastSession.items().begin(), + end=lastSession.items().end(); + iter != end; + iter++ + ){ + openNewTab(iter->second); + } + m_sessionService->getStorage()->deleteSession(lastSession); + } + } + else + openNewTab(url); + BROWSER_LOGD("[%s]:%d url=%s", __func__, __LINE__, url.c_str()); m_simpleURI->setFocus(); -- 2.7.4 From bf8072a5a99133eea135c87d65559ed750dfde72 Mon Sep 17 00:00:00 2001 From: Jung Ick Guack Date: Thu, 2 Jul 2015 22:08:01 +0900 Subject: [PATCH 05/16] 1) Getting favicon by proper API. 2) Enabling create new tab by tag target attribute. - Removed smart class, Using smart callback 3) Changed toast text when delete data from setting 4) Not set user agent by full string, just set applicatino name for UA 5) Disabled function of private browsing Change-Id: I712044d64b791f28cd9608e876ba9472e8a08300 Signed-off-by: Jung Ick Guack --- services/SimpleUI/SimpleUI.cpp | 4 +-- services/WebKitEngineService/WebView.cpp | 58 ++++++++++++++++++++++++++------ services/WebKitEngineService/WebView.h | 1 + 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index f2567ba..7e514cc 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -422,7 +422,7 @@ void SimpleUI::connectActions() m_showSettingsPopup->triggered.connect(boost::bind(&SimpleUI::showSettingsMenu, this)); // m_settingPointerMode->toggled.connect(boost::bind(&tizen_browser::services::PlatformInputManager::setPointerModeEnabled, m_platformInputManager.get(), _1)); - m_settingPrivateBrowsing->toggled.connect(boost::bind(&SimpleUI::settingsPrivateModeSwitch, this, _1)); +// m_settingPrivateBrowsing->toggled.connect(boost::bind(&SimpleUI::settingsPrivateModeSwitch, this, _1)); m_settingDeleteHistory->triggered.connect(boost::bind(&SimpleUI::settingsDeleteHistory, this)); m_settingDeleteData->triggered.connect(boost::bind(&SimpleUI::settingsDeleteData, this));; m_settingDeleteFavorite->triggered.connect(boost::bind(&SimpleUI::settingsDeleteFavorite, this));; @@ -1061,7 +1061,7 @@ void SimpleUI::onDeleteDataButton(PopupButtons button, std::shared_ptr< PopupDat BROWSER_LOGD("[%s]: OK", __func__); m_webEngine->clearPrivateData(); webTitleBar->removeFavIcon(); - webTitleBar->show("Data deleted"); + webTitleBar->show("All cookies and cache are deleted"); hidePopup(); } } diff --git a/services/WebKitEngineService/WebView.cpp b/services/WebKitEngineService/WebView.cpp index 963e192..75ea343 100644 --- a/services/WebKitEngineService/WebView.cpp +++ b/services/WebKitEngineService/WebView.cpp @@ -46,6 +46,7 @@ #include "ServiceManager.h" #define certificate_crt_path CERTS_DIR +#define APPLICATION_NAME_FOR_USER_AGENT "SamsungBrowser/1.0" using namespace tizen_browser::tools; @@ -75,6 +76,8 @@ WebView::~WebView() void WebView::init(Evas_Object * opener) { #if defined(USE_EWEBKIT) + +#if 0 //not using smart class static Ewk_View_Smart_Class *clasz = NULL; Ewk_Context *context = ewk_context_default_get(); if (!clasz) { @@ -84,13 +87,11 @@ void WebView::init(Evas_Object * opener) // clasz->run_javascript_alert = onJavascriptAlert; // clasz->run_javascript_confirm = onJavascriptConfirm; // clasz->run_javascript_prompt = onJavascriptPrompt; -// clasz->window_create = onWindowCreate; -// clasz->window_close = onWindowClose; - + clasz->window_create = onWindowCreate; + clasz->window_close = onWindowClose; ewk_context_cache_model_set(context, EWK_CACHE_MODEL_PRIMARY_WEBBROWSER); ewk_context_certificate_file_set(context, certificate_crt_path); - } Evas_Smart *smart = evas_smart_class_new(&clasz->sc); @@ -98,8 +99,12 @@ void WebView::init(Evas_Object * opener) /// \todo: Consider process model. Now, One UIProcess / One WebProcess. // if (opener) // m_ewkView = ewk_view_smart_add(evas_object_evas_get(m_parent), smart, context, ewk_view_page_group_get(opener)); -// else + else m_ewkView = ewk_view_smart_add(evas_object_evas_get(m_parent), smart, context, ewk_page_group_create(NULL)); +#else + m_ewkView = ewk_view_add(evas_object_evas_get(m_parent)); +// Ewk_Context *context = ewk_view_context_get(m_ewkView); +#endif evas_object_data_set(m_ewkView, "_container", this); BROWSER_LOGD("%s:%d %s self=%p", __FILE__, __LINE__, __func__, this); @@ -107,14 +112,14 @@ void WebView::init(Evas_Object * opener) evas_object_color_set(m_ewkView, 255, 255, 255, 255); evas_object_size_hint_weight_set(m_ewkView, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(m_ewkView, EVAS_HINT_FILL, EVAS_HINT_FILL); - ewk_view_user_agent_set(m_ewkView, "Mozilla/5.0 (X11; SMART-TV; Linux) AppleWebkit/538.1 (KHTML, like Gecko) Safari/538.1"); + ewk_view_application_name_for_user_agent_set(m_ewkView, APPLICATION_NAME_FOR_USER_AGENT); //\todo: when value is other than 1.0, scroller is located improperly // ewk_view_device_pixel_ratio_set(m_ewkView, 1.0f); #if PLATFORM(TIZEN) ewk_view_resume(m_ewkView); #endif - +#if 0 // set local storage, favion, cookies std::string webkit_path = boost::any_cast (config.get("webkit/dir")); // ewk_context_web_storage_path_set(context, (webkit_path + std::string("/storage")).c_str()); @@ -127,7 +132,7 @@ void WebView::init(Evas_Object * opener) // ewk_cookie_manager_widget_cookie_directory_set(ewk_context_cookie_manager_get(context), webkit_path.c_str()); ewk_favicon_database_icon_change_callback_add(ewk_context_favicon_database_get(context), __faviconChanged, this); - +#endif setupEwkSettings(); registerCallbacks(); #else @@ -149,6 +154,8 @@ void WebView::registerCallbacks() evas_object_smart_callback_add(m_ewkView, "back,forward,list,changed", __backForwardListChanged, this); + evas_object_smart_callback_add(m_ewkView, "create,window", __OnNewWindowRequest, this); + evas_object_smart_callback_add(m_ewkView, "geolocation,permission,request", __geolocationPermissionRequest, this); evas_object_smart_callback_add(m_ewkView, "usermedia,permission,request", __usermediaPermissionRequest, this); evas_object_smart_callback_add(m_ewkView, "notification,permission,request", __notificationPermissionRequest, this); @@ -177,6 +184,8 @@ void WebView::unregisterCallbacks() evas_object_smart_callback_del_full(m_ewkView, "back,forward,list,changed", __backForwardListChanged, this); + evas_object_smart_callback_del_full(m_ewkView, "create,window", __OnNewWindowRequest, this); + evas_object_smart_callback_del_full(m_ewkView, "geolocation,permission,request", __geolocationPermissionRequest, this); evas_object_smart_callback_del_full(m_ewkView, "usermedia,permission,request", __usermediaPermissionRequest, this); evas_object_smart_callback_del_full(m_ewkView, "notification,permission,request", __notificationPermissionRequest, this); @@ -712,6 +721,30 @@ void WebView::__backForwardListChanged(void * data, Evas_Object * /* obj */, voi self->forwardEnableChanged(self->isForwardEnabled()); } +void WebView::__OnNewWindowRequest(void *data, Evas_Object*, void* out) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + + WebView * self = reinterpret_cast(data); + BROWSER_LOGD("Window creating in tab: %s", self->getTabId().toString().c_str()); + + std::shared_ptr> m_webEngine; + m_webEngine = std::dynamic_pointer_cast + < + basic_webengine::AbstractWebEngine,tizen_browser::core::AbstractService + > + (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.webkitengineservice")); + M_ASSERT(m_webEngine); + + /// \todo: Choose newly created tab. + TabId id = m_webEngine->addTab(std::string(), &self->getTabId()); + BROWSER_LOGD("Created tab: %s", id.toString().c_str()); + + Evas_Object* tab_ewk_view = m_webEngine->getTabView(id); + *static_cast(out) = tab_ewk_view; +} + + #if PLATFORM(TIZEN) void WebView::__faviconChanged(const char * uri, void * data) #else @@ -965,12 +998,15 @@ std::shared_ptr WebView::getFavicon() { #if defined(USE_EWEBKIT) if (faviconImage.get() == NULL) { -//#if PLATFORM(TIZEN) + +#if PLATFORM(TIZEN) // Evas_Object * favicon = ewk_view_favicon_get(m_ewkView); -//#else + Evas_Object * favicon = ewk_context_icon_database_icon_object_add(ewk_view_context_get(m_ewkView), ewk_view_url_get(m_ewkView),evas_object_evas_get(m_ewkView)); +#else Ewk_Favicon_Database * database = ewk_context_favicon_database_get(ewk_view_context_get(m_ewkView)); Evas_Object * favicon = ewk_favicon_database_icon_get(database, ewk_view_url_get(m_ewkView), evas_object_evas_get(m_ewkView)); -//#endif +#endif + #ifndef NDEBUG int w = 0, h = 0; evas_object_image_size_get(favicon, &w, &h); diff --git a/services/WebKitEngineService/WebView.h b/services/WebKitEngineService/WebView.h index 0b6b504..ce6233d 100644 --- a/services/WebKitEngineService/WebView.h +++ b/services/WebKitEngineService/WebView.h @@ -165,6 +165,7 @@ private: static void __urlChanged(void * data, Evas_Object * obj, void * event_info); static void __backForwardListChanged(void * data, Evas_Object * obj, void * event_info); + static void __OnNewWindowRequest(void *data, Evas_Object*, void* out); // Favicon - from database #if defined(USE_EWEBKIT) -- 2.7.4 From a16dfb0bd899bd791f1aff1eebc501b2a3153a45 Mon Sep 17 00:00:00 2001 From: Jung Ick Guack Date: Thu, 2 Jul 2015 22:23:14 +0900 Subject: [PATCH 06/16] Release 0.0.9 Change-Id: I8d0ec64259ef4e777885a88cbb589a810d0a52c4 Signed-off-by: Jung Ick Guack --- packaging/org.tizen.browser.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/org.tizen.browser.spec b/packaging/org.tizen.browser.spec index 66ddef9..44c7454 100644 --- a/packaging/org.tizen.browser.spec +++ b/packaging/org.tizen.browser.spec @@ -1,6 +1,6 @@ Name: org.tizen.browser Summary: Tizen TV Open Browser -Version: 0.0.8 +Version: 0.0.9 Release: 0 Group: Applications/Web License: Apache-2.0 -- 2.7.4 From efd182a79d7c101a9a673a27c02f1d4331fdd373 Mon Sep 17 00:00:00 2001 From: "sungwon2.han" Date: Mon, 6 Jul 2015 15:37:14 +0900 Subject: [PATCH 07/16] Change to use wayland functions instead of x functions ecore_x_window_size_get --> ecore_wl_screen_size_get Change-Id: Ib72381ba8e5e515126afe3db2c83d964c0ccd563 Signed-off-by: sungwon2.han --- services/SimpleUI/SimpleUI.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index 7e514cc..25e1648 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include "Config.h" @@ -115,11 +116,12 @@ int SimpleUI::exec(const std::string& _url) elm_win_alpha_set(m_window.get(), EINA_FALSE); // creatin main window - //int width = 1920; - //int height = 1080; + int width = 0; + int height = 0; //ecore_x_window_size_get(ecore_x_window_root_first_get(), &width, &height); - //evas_object_move(m_window.get(), 0, 0); - //evas_object_resize(m_window.get(), width, height); + ecore_wl_screen_size_get(&width, &height); + evas_object_move(m_window.get(), 0, 0); + evas_object_resize(m_window.get(), width, height); // create main layout m_mainLayout = elm_layout_add(m_window.get()); -- 2.7.4 From fcd845fabd9482713d888d0303b221a7428a0ee0 Mon Sep 17 00:00:00 2001 From: "sungwon2.han" Date: Mon, 6 Jul 2015 17:59:07 +0900 Subject: [PATCH 08/16] Temporarily comment out "Back key" process routine Change-Id: I29a9b4ba24a02d78e33c7fc88447187eed59e89c Signed-off-by: sungwon2.han --- services/PlatformInputManager/PlatformInputManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/PlatformInputManager/PlatformInputManager.cpp b/services/PlatformInputManager/PlatformInputManager.cpp index b4c6925..e7cc333 100644 --- a/services/PlatformInputManager/PlatformInputManager.cpp +++ b/services/PlatformInputManager/PlatformInputManager.cpp @@ -170,8 +170,8 @@ Eina_Bool PlatformInputManager::__filter(void *data, void */*loop_data*/, int ty self->rightPressed(); else if(!keyName.compare("KEY_ENTER")) self->enterPressed(); - else if(!keyName.compare("BackSpace")) - self->backPressed(); +// else if(!keyName.compare("BackSpace")) +// self->backPressed(); } else if(type == ECORE_EVENT_KEY_UP) { M_ASSERT(event); Ecore_Event_Key *ev = static_cast(event); -- 2.7.4 From 9dff14d6598e027d47bc2d8de39eccbd88d90c89 Mon Sep 17 00:00:00 2001 From: "sungwon2.han" Date: Tue, 7 Jul 2015 13:50:54 +0900 Subject: [PATCH 09/16] Delete "Private Browsing" menu item from "Settings" Change-Id: Ifb7a23d1bbc618469f055054188e5bc51f0bcc59 Signed-off-by: sungwon2.han --- services/SimpleUI/SimpleUI.cpp | 4 +++- services/SimpleUI/SimpleUI.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index 25e1648..11dd807 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -388,11 +388,13 @@ void SimpleUI::createActions() m_settingPointerMode->setChecked(m_platformInputManager->getPointerModeEnabled()); m_settingPointerMode->setEnabled(true); */ +/* m_settingPrivateBrowsing = sharedAction(new Action("Private browsing")); m_settingPrivateBrowsing->setToolTip("On exit from private mode all cookies, history, and stored data will be deleted"); m_settingPrivateBrowsing->setCheckable(true); m_settingPrivateBrowsing->setChecked(m_webEngine->isPrivateMode()); m_settingPrivateBrowsing->setEnabled(true); +*/ m_settingDeleteHistory = sharedAction(new Action("Delete history")); m_settingDeleteHistory->setToolTip("Delete History"); @@ -943,7 +945,7 @@ void SimpleUI::showSettingsMenu() m_settings = std::make_shared(m_window, rightButtonBar->getButton("setting_button")); //m_settings->addAction( m_settingPointerMode); - m_settings->addAction( m_settingPrivateBrowsing); + //m_settings->addAction( m_settingPrivateBrowsing); m_settings->addAction( m_settingDeleteHistory); m_settings->addAction( m_settingDeleteData); m_settings->addAction( m_settingDeleteFavorite); diff --git a/services/SimpleUI/SimpleUI.h b/services/SimpleUI/SimpleUI.h index 793f87e..5c5f736 100644 --- a/services/SimpleUI/SimpleUI.h +++ b/services/SimpleUI/SimpleUI.h @@ -146,7 +146,7 @@ private: sharedAction m_zoom_in; sharedAction m_showSettingsPopup; sharedAction m_settingPointerMode; - sharedAction m_settingPrivateBrowsing; +// sharedAction m_settingPrivateBrowsing; sharedAction m_settingDeleteHistory; sharedAction m_settingDeleteData; sharedAction m_settingDeleteFavorite; -- 2.7.4 From 62504c62a996bff27364d3647ced0a2ea022ac15 Mon Sep 17 00:00:00 2001 From: "sungwon2.han" Date: Tue, 7 Jul 2015 14:23:30 +0900 Subject: [PATCH 10/16] Change text wrap type of popup object from CHAR to WORD Change-Id: Ib47aa1c143aca49c0fe079383efc77e0aaaacf68 Signed-off-by: sungwon2.han --- services/SimpleUI/SimplePopup.cpp | 2 +- services/SimpleUI/SimpleUI.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/services/SimpleUI/SimplePopup.cpp b/services/SimpleUI/SimplePopup.cpp index f732b78..363e905 100644 --- a/services/SimpleUI/SimplePopup.cpp +++ b/services/SimpleUI/SimplePopup.cpp @@ -48,7 +48,7 @@ namespace base_ui else elm_object_text_set(popup, message.c_str()); - elm_popup_content_text_wrap_type_set(popup, ELM_WRAP_CHAR); + elm_popup_content_text_wrap_type_set(popup, ELM_WRAP_WORD); elm_object_part_text_set(popup, "title,text", title.c_str()); int buttonsCounter = 1; diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index 11dd807..ef0d403 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -1054,7 +1054,7 @@ void SimpleUI::onDeleteHistoryButton(PopupButtons button, std::shared_ptr< Popup m_historyService->clearAllHistory(); m_history->setEnabled(false); webTitleBar->removeFavIcon(); - webTitleBar->show("History deleted"); + webTitleBar->show("All histories are deleted"); hidePopup(); } } -- 2.7.4 From 5a46456b251233e8cb1e9bbbe2582ec93ecd7150 Mon Sep 17 00:00:00 2001 From: Jung Ick Guack Date: Thu, 9 Jul 2015 10:18:46 +0900 Subject: [PATCH 11/16] Fixed privilege for web-history.admin Change-Id: I3c3c35421d7bb229af00e283e4686eafde7268a4 Signed-off-by: Jung Ick Guack --- manifest.xml.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.xml.in b/manifest.xml.in index 8c4c7f1..830ea63 100644 --- a/manifest.xml.in +++ b/manifest.xml.in @@ -75,6 +75,6 @@ http://tizen.org/privilege/bookmark.admin - http://tizen.org/privilege/history.admin + http://tizen.org/privilege/web-history.admin -- 2.7.4 From f3c7262dd08ea78fa364c2012b51b3b3f085e008 Mon Sep 17 00:00:00 2001 From: "k.lis2" Date: Wed, 29 Jul 2015 15:44:44 +0200 Subject: [PATCH 12/16] Task TT-75 Implement "Main page loading UI" view Merge main page UI from the new ui imeplementation. This commit includes the following major changes: * Remove BookmarksUI service * Add MainUI service * Add BookmarksManager * Merge all changes in SimpleUI, code which refers to parts which are to be merged in consecutive tasks is currently ifdef'ed * Merge all changes in BookmarkService and HistoryService Change-Id: Idbdfd334d61af3370be79fa936a31a5e044e514c --- browser_config.h | 3 + core/AbstractInterfaces/AbstractFavoriteService.h | 31 +- core/Config/Config.h | 2 - core/Tools/BookmarkItem.cpp | 1 - core/Tools/BookmarkItem.h | 14 +- core/main.cpp | 5 +- scripts/astylerc | 20 + services/BookmarkService/BookmarkService.cpp | 1260 +++++++++++++++- services/BookmarkService/BookmarkService.h | 78 +- services/BookmarksUI/BookmarksUI.cpp | 276 ---- services/BookmarksUI/BookmarksUI.h | 75 - services/BookmarksUI/edc/Bookmarks.edc | 440 ------ services/BookmarksUI/images/ico_delete.png | Bin 18365 -> 0 bytes services/CMakeLists.txt | 11 +- services/HistoryService/CMakeLists.txt | 4 +- services/HistoryService/{src => }/HistoryItem.cpp | 12 + services/HistoryService/HistoryItem.h | 8 +- services/HistoryService/HistoryService.cpp | 396 +++++ services/HistoryService/HistoryService.h | 9 +- services/HistoryService/src/HistoryService.cpp | 256 ---- services/{BookmarksUI => MainUI}/CMakeLists.txt | 16 +- services/MainUI/MainUI.cpp | 559 ++++++++ services/MainUI/MainUI.h | 106 ++ services/MainUI/edc/MainUI.edc | 1505 ++++++++++++++++++++ services/{BookmarksUI => MainUI}/edc/error.edc | 0 .../images/web_frame_selected.png | Bin .../images/web_shadow.png} | Bin 18109 -> 17700 bytes .../PlatformInputManager/PlatformInputManager.cpp | 5 +- services/SimpleUI/BookmarksManager.cpp | 411 ++++++ services/SimpleUI/BookmarksManager.h | 99 ++ services/SimpleUI/CMakeLists.txt | 31 +- services/SimpleUI/HistoryList.cpp | 8 + services/SimpleUI/SimplePopup.cpp | 9 +- services/SimpleUI/SimpleUI.cpp | 801 +++++++---- services/SimpleUI/SimpleUI.h | 114 +- services/SimpleUI/edc/BookmarksManager.edc | 574 ++++++++ services/SimpleUI/edc/LeftButtonBar.edc | 39 +- services/SimpleUI/edc/MainLayout.edc | 64 +- services/SimpleUI/edc/RightButtonBar.edc | 92 +- services/SimpleUI/edc/webview.edc | 91 ++ services/SimpleUI/images/Black_dot.png | Bin 0 -> 1232 bytes services/SimpleUI/images/btn_bar_back_nor.png | Bin 0 -> 3362 bytes services/SimpleUI/images/btn_bar_forward_nor.png | Bin 0 -> 3385 bytes services/SimpleUI/images/btn_bar_manager_nor.png | Bin 0 -> 2988 bytes services/SimpleUI/images/btn_bar_more_nor.png | Bin 0 -> 3032 bytes services/SimpleUI/images/btn_bar_reload_nor.png | Bin 0 -> 3547 bytes services/SimpleUI/images/btn_bar_stop_nor.png | Bin 0 -> 3255 bytes .../SimpleUI/images/btn_bar_vertical_settings.png | Bin 0 -> 3123 bytes services/SimpleURI/edc/URIEntry.edc | 198 +-- .../WebKitEngineService/WebKitEngineService.cpp | 28 +- services/WebKitEngineService/WebView.cpp | 37 +- 51 files changed, 5940 insertions(+), 1748 deletions(-) create mode 100644 scripts/astylerc delete mode 100644 services/BookmarksUI/BookmarksUI.cpp delete mode 100644 services/BookmarksUI/BookmarksUI.h delete mode 100644 services/BookmarksUI/edc/Bookmarks.edc delete mode 100644 services/BookmarksUI/images/ico_delete.png rename services/HistoryService/{src => }/HistoryItem.cpp (92%) create mode 100644 services/HistoryService/HistoryService.cpp delete mode 100644 services/HistoryService/src/HistoryService.cpp rename services/{BookmarksUI => MainUI}/CMakeLists.txt (62%) create mode 100644 services/MainUI/MainUI.cpp create mode 100644 services/MainUI/MainUI.h create mode 100644 services/MainUI/edc/MainUI.edc rename services/{BookmarksUI => MainUI}/edc/error.edc (100%) rename services/{BookmarksUI => MainUI}/images/web_frame_selected.png (100%) rename services/{BookmarksUI/images/ico_bg_round_shape_37x37.png => MainUI/images/web_shadow.png} (91%) create mode 100644 services/SimpleUI/BookmarksManager.cpp create mode 100644 services/SimpleUI/BookmarksManager.h create mode 100644 services/SimpleUI/edc/BookmarksManager.edc create mode 100644 services/SimpleUI/edc/webview.edc create mode 100644 services/SimpleUI/images/Black_dot.png create mode 100644 services/SimpleUI/images/btn_bar_back_nor.png create mode 100644 services/SimpleUI/images/btn_bar_forward_nor.png create mode 100644 services/SimpleUI/images/btn_bar_manager_nor.png create mode 100644 services/SimpleUI/images/btn_bar_more_nor.png create mode 100644 services/SimpleUI/images/btn_bar_reload_nor.png create mode 100644 services/SimpleUI/images/btn_bar_stop_nor.png create mode 100644 services/SimpleUI/images/btn_bar_vertical_settings.png diff --git a/browser_config.h b/browser_config.h index 6d4258b..3ccb510 100644 --- a/browser_config.h +++ b/browser_config.h @@ -21,4 +21,7 @@ #define PLATFORM(_pl) (defined PLATFORM_##_pl && PLATFORM_##_pl) +// Remove this define when merging from new ui implementation is finished +#define MERGE_ME 0 + #endif diff --git a/core/AbstractInterfaces/AbstractFavoriteService.h b/core/AbstractInterfaces/AbstractFavoriteService.h index a940058..5c24c4f 100644 --- a/core/AbstractInterfaces/AbstractFavoriteService.h +++ b/core/AbstractInterfaces/AbstractFavoriteService.h @@ -25,10 +25,6 @@ #include "browser_config.h" -#include -#include -#include - #include "AbstractService.h" #include "service_macros.h" #include "BookmarkItem.h" @@ -62,7 +58,19 @@ public: std::shared_ptr thumbnail=std::shared_ptr(), std::shared_ptr favicon = std::shared_ptr(), unsigned int dirId = 0) = 0; - /** + /** + * @brief Creates a new folder with name "title" in a folder with id, parent_id + * @return folder_id of created folder + */ + virtual int save_folder(const char *title, int *saved_bookmark_id, int parent_id=0, int by_operator=0)=0; + + /** + * @brief get folder id of a folder with name "title" in folder with id, parent_id + * @return true if found, false otherwise + */ + virtual bool get_folder_id(const char *title, int parent_id, int *folder_id) = 0 ; + + /** * @brief Count bookmarks and subfolders * @return Number of bookmarks and subfolders */ @@ -77,11 +85,18 @@ public: virtual bool bookmarkExists(const std::string & url)= 0; /** - * @brief Get bookmarks from platform service and store it in private m_bookmarksList + * @brief Get bookmarks in a folder from platform service and store it in private m_bookmarksList + * + * @return list of bookmark items in folder with id, folder_id + */ + virtual std::vector > getBookmarks(int folder_id = 0)= 0; + + /** + * @brief Get bookmark folders from platform service and store it in private m_bookmarkFoldersList * - * @return list of bookmark items + * @return list of bookmark folders */ - virtual std::vector > getBookmarks()= 0; + virtual std::vector > getBookmarkFolders()= 0; /** * @brief Delete all bookmarks diff --git a/core/Config/Config.h b/core/Config/Config.h index cd82869..b342c86 100644 --- a/core/Config/Config.h +++ b/core/Config/Config.h @@ -21,8 +21,6 @@ #include #include -//#include -//#include namespace tizen_browser { diff --git a/core/Tools/BookmarkItem.cpp b/core/Tools/BookmarkItem.cpp index 10f7c23..3f994fd 100644 --- a/core/Tools/BookmarkItem.cpp +++ b/core/Tools/BookmarkItem.cpp @@ -54,7 +54,6 @@ BookmarkItem::BookmarkItem( } - BookmarkItem::~BookmarkItem() { } diff --git a/core/Tools/BookmarkItem.h b/core/Tools/BookmarkItem.h index faff1b2..84fe489 100644 --- a/core/Tools/BookmarkItem.h +++ b/core/Tools/BookmarkItem.h @@ -23,10 +23,8 @@ #ifndef BOOKMARKITEM_H #define BOOKMARKITEM_H -#include -#include -#include - +#include "BrowserLogger.h" +#include "Config.h" #include "BrowserImage.h" namespace tizen_browser{ @@ -69,6 +67,12 @@ public: void setTags(const std::vector& tags) { m_tags = tags; }; std::vector getTags() const { return m_tags; }; + bool is_folder(void) const { return m_is_folder; } + bool is_editable(void) const { return m_is_editable; } + + void set_folder_flag(bool flag) { m_is_folder = flag; } + void set_editable_flag(bool flag) { m_is_editable = flag; } + private: unsigned int m_saved_id; std::string m_url; @@ -78,6 +82,8 @@ private: std::shared_ptr m_favicon; unsigned int m_directory; std::vector m_tags; + bool m_is_folder; + bool m_is_editable; }; typedef std::shared_ptr SharedBookmarkItem; diff --git a/core/main.cpp b/core/main.cpp index 9342b05..83d48f0 100755 --- a/core/main.cpp +++ b/core/main.cpp @@ -38,8 +38,9 @@ const std::string DEFAULT_URL = ""; static bool app_create(void * /*app_data*/) { -// elm_config_accel_preference_set("opengl"); - elm_config_accel_preference_set("3d"); +// MERGE_ME not sure which should be chosen +// elm_config_accel_preference_set("opengl"); + elm_config_accel_preference_set("3d"); elm_config_focus_move_policy_set(ELM_FOCUS_MOVE_POLICY_CLICK); // Enabling focus diff --git a/scripts/astylerc b/scripts/astylerc new file mode 100644 index 0000000..22d7cba --- /dev/null +++ b/scripts/astylerc @@ -0,0 +1,20 @@ +# It might not be enough so please keep the code in your eyes. +# for example, +# 1. It does not check below +# a) class Child: public Parent +# b) class Child : public Parent + +style=kr +indent=spaces=4 +pad-oper +pad-header +lineend=linux +add-brackets +indent-switches +unpad-paren +convert-tabs +align-pointer=middle +align-reference=middle +max-instatement-indent=80 +keep-one-line-statements +indent-preprocessor diff --git a/services/BookmarkService/BookmarkService.cpp b/services/BookmarkService/BookmarkService.cpp index 99b14e2..a1ffdae 100644 --- a/services/BookmarkService/BookmarkService.cpp +++ b/services/BookmarkService/BookmarkService.cpp @@ -22,8 +22,8 @@ #include "browser_config.h" #include "BookmarkService.h" +#include -#include #include #include @@ -56,6 +56,7 @@ BookmarkService::BookmarkService() BookmarkService::~BookmarkService() { bp_bookmark_adaptor_deinitialize(); + free_path_history(); } /*private*/ std::shared_ptr BookmarkService::getStorageManager() { @@ -76,40 +77,68 @@ std::shared_ptr BookmarkService::addToBookmarks( unsigned int dirId) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - std::shared_ptr bookmark = std::make_shared(address, tittle, note, dirId); - bookmark->setThumbnail(thumbnail); - bookmark->setFavicon(favicon); + bp_bookmark_property_cond_fmt properties; + properties.parent = -1; + properties.type = 0; + properties.is_operator = -1; + properties.is_editable = -1; + //conditions for querying + bp_bookmark_rows_cond_fmt conds; + conds.limit = 1; + conds.offset = 0; + conds.order_offset = BP_BOOKMARK_O_SEQUENCE; + conds.ordering = 0; + conds.period_offset = BP_BOOKMARK_O_DATE_CREATED; + conds.period_type = BP_BOOKMARK_DATE_ALL; - int bookmark_id = -1; - int ret = bp_bookmark_adaptor_create(&bookmark_id); - if (ret<0){ - BROWSER_LOGE("Error! Could not create new bookmark!"); - return bookmark; - } - int *ids = NULL; - int ids_count = 0; - ret = bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, -1, 0, -1, -1, -1, -1, BP_BOOKMARK_O_SEQUENCE, 0); - if (ret<0){ + int id = -1; + int *ids = nullptr; + int ids_count = -1; + int ret = bp_bookmark_adaptor_get_cond_ids_p(&ids, &ids_count, &properties, &conds, BP_BOOKMARK_O_URL, address.c_str(), 0); + free(ids); + if (ret < 0){ BROWSER_LOGE("Error! Could not get ids!"); return std::make_shared(); } - bp_bookmark_adaptor_set_url(bookmark_id, address.c_str()); + bp_bookmark_info_fmt info; + info.type = 0; + info.parent = dirId; + info.sequence = -1; + info.access_count = -1; + info.editable = 1; + + if (!address.empty()) { + info.url = (char*) address.c_str(); + } + if (!tittle.empty()) + info.title = (char*) tittle.c_str(); + + ret = bp_bookmark_adaptor_easy_create(&id, &info); + if (ret < 0){ + BROWSER_LOGE("Error! Could not create new bookmark!"); + return std::make_shared(); + } - bp_bookmark_adaptor_set_title(bookmark_id, tittle.c_str()); - if (thumbnail) { - std::unique_ptr thumb_blob = tizen_browser::tools::EflTools::getBlobPNG(thumbnail); - unsigned char * thumb = std::move((unsigned char*)thumb_blob->getData()); - bp_bookmark_adaptor_set_snapshot(bookmark_id, thumbnail->width, thumbnail->height, thumb, thumb_blob->getLength()); - } - if (favicon) { - std::unique_ptr favicon_blob = tizen_browser::tools::EflTools::getBlobPNG(favicon); - unsigned char * fav = std::move((unsigned char*)favicon_blob->getData()); - bp_bookmark_adaptor_set_icon(bookmark_id, favicon->width, favicon->height, fav, favicon_blob->getLength()); - } + // max sequence + ret = bp_bookmark_adaptor_set_sequence(id, -1); + if(thumbnail) + { + std::unique_ptr thumb_blob = tizen_browser::tools::EflTools::getBlobPNG(thumbnail); + unsigned char * thumb = std::move((unsigned char*)thumb_blob->getData()); + bp_bookmark_adaptor_set_snapshot(id, thumbnail->width, thumbnail->height, thumb, thumb_blob->getLength()); + } + if(favicon) + { + std::unique_ptr favicon_blob = tizen_browser::tools::EflTools::getBlobPNG(favicon); + unsigned char * fav = std::move((unsigned char*)favicon_blob->getData()); + bp_bookmark_adaptor_set_icon(id, favicon->width, favicon->height, fav, favicon_blob->getLength()); + } + std::shared_ptr bookmark = std::make_shared(address, tittle, note, dirId, id); + bookmark->setThumbnail(thumbnail); + bookmark->setFavicon(favicon); m_bookmarks.push_back(bookmark); - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); bookmarkAdded(bookmark); return bookmark; } @@ -135,35 +164,36 @@ bool BookmarkService::bookmarkExists(const std::string & url) int BookmarkService::getBookmarkId(const std::string & url) { + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); bp_bookmark_property_cond_fmt properties; - bp_bookmark_rows_cond_fmt conds; properties.parent = -1; properties.type = 0; properties.is_operator = 0; properties.is_editable = -1; + bp_bookmark_rows_cond_fmt conds; conds.limit = -1; conds.offset = 0; conds.order_offset = BP_BOOKMARK_O_DATE_CREATED; conds.ordering = 0; conds.period_offset = BP_BOOKMARK_O_DATE_CREATED; conds.period_type = BP_BOOKMARK_DATE_ALL; - int *ids = 0; + int *ids = nullptr; int ids_count = 0; - int ret = bp_bookmark_adaptor_get_cond_ids_p(&ids, &ids_count, - &properties, &conds, BP_BOOKMARK_O_URL, url.c_str(), 0); - if (ids_count!=0){ - int i = *ids; - free(ids); - return i; + int i = 0; + int ret = bp_bookmark_adaptor_get_cond_ids_p(&ids, &ids_count, &properties, &conds, BP_BOOKMARK_O_URL, url.c_str(), 0); + if (ids_count > 0){ + i = *ids; } - return 0; + free(ids); + return i; } -std::vector > BookmarkService::getBookmarks() +std::vector > BookmarkService::getBookmarks(int folder_id) { - int *ids = NULL; + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + int *ids = nullptr; int ids_count = 0; - int ret = bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, -1, 0, -1, -1, -1, -1, BP_BOOKMARK_O_SEQUENCE, 0); + int ret = bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, -1, 0, folder_id, 0, -1, -1, BP_BOOKMARK_O_SEQUENCE, 0); if (ret<0){ BROWSER_LOGE("Error! Could not get ids!"); return std::vector>(); @@ -178,7 +208,7 @@ std::vector > BookmarkService::getBookmarks() bp_bookmark_info_fmt bookmark_info; bp_bookmark_adaptor_get_easy_all(ids[i], &bookmark_info); - std::shared_ptr bookmark = std::make_shared(std::string(bookmark_info.url),std::string(bookmark_info.title), std::string(""), 0); + std::shared_ptr bookmark = std::make_shared(std::string(bookmark_info.url),std::string(bookmark_info.title), std::string(""),(int) bookmark_info.parent, ids[i]); std::shared_ptr bi = std::make_shared(); bi->imageType = tizen_browser::tools::BrowserImage::ImageType::ImageTypePNG; @@ -204,14 +234,1164 @@ std::vector > BookmarkService::getBookmarks() return m_bookmarks; } +std::vector > BookmarkService::getBookmarkFolders() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + int *ids = nullptr; + int ids_count = 0; + int ret = bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, -1, 0, -1, 1, -1, -1, BP_BOOKMARK_O_SEQUENCE, 0); + if (ret<0){ + BROWSER_LOGE("Error! Could not get ids!"); + return std::vector>(); + } + + m_bookmarks.clear(); + + BROWSER_LOGD("Bookmark items: %d", ids_count); + + for(int i = 0; i bookmark = std::make_shared(std::string(bookmark_info.url ? bookmark_info.url : ""),std::string(bookmark_info.title ? bookmark_info.title : ""), std::string(""),(int) bookmark_info.parent, ids[i]); + std::shared_ptr bi = std::make_shared(); + bi->imageType = tizen_browser::tools::BrowserImage::ImageType::ImageTypePNG; + bi->width = bookmark_info.thumbnail_width; + bi->height = bookmark_info.thumbnail_height; + bi->dataSize = bookmark_info.thumbnail_length; + bi->imageData = (void*)malloc(bookmark_info.thumbnail_length); + memcpy(bi->imageData, (void*)bookmark_info.thumbnail, bookmark_info.thumbnail_length); + bookmark->setThumbnail(bi); + + std::shared_ptr fav = std::make_shared(); + unsigned char *image_bytes; + bp_bookmark_adaptor_get_icon(ids[i], &fav->width, &fav->height, &image_bytes, &fav->dataSize); + fav->imageType = tizen_browser::tools::BrowserImage::ImageType::ImageTypePNG; + + fav->imageData = (void*)malloc(bookmark_info.favicon_length); + memcpy(fav->imageData, (void*)image_bytes, bookmark_info.favicon_length); + bookmark->setFavicon(fav); + if(!bookmark_info.is_operator) + m_bookmarks.push_back(bookmark); + else + m_bookmarks.insert(m_bookmarks.begin(),bookmark); + } + free(ids); + return m_bookmarks; +} + + bool BookmarkService::deleteAllBookmarks() { + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); bp_bookmark_adaptor_reset(); m_bookmarks.clear(); bookmarksDeleted(); return true; } +int BookmarkService::get_root_folder_id(void) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + int root_id = 0; + bp_bookmark_adaptor_get_root(&root_id); + return root_id; +} + +int BookmarkService::save_folder(const char *title, int *saved_folder_id, int parent_id, int by_operator) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + + bp_bookmark_property_cond_fmt properties; + properties.parent = parent_id; + properties.type = 1; + properties.is_operator = -1; + properties.is_editable = -1; + //conditions for querying + bp_bookmark_rows_cond_fmt conds; + conds.limit = 1; + conds.offset = 0; + conds.order_offset = BP_BOOKMARK_O_SEQUENCE; + conds.ordering = 0; + conds.period_offset = BP_BOOKMARK_O_DATE_CREATED; + conds.period_type = BP_BOOKMARK_DATE_ALL; + int id = -1; + int *ids = nullptr; + int ids_count = -1; + int ret = bp_bookmark_adaptor_get_cond_ids_p(&ids, &ids_count, &properties, &conds, BP_BOOKMARK_O_TITLE, title, 0); + free(ids); + + if (ret < 0) + return -1; + + if (ids_count > 0) { + return 0; + } + + bp_bookmark_info_fmt info; + info.type = 1; + info.parent = parent_id; + info.sequence = -1; + info.is_operator = by_operator; + info.access_count = -1; + info.editable = 1; + if (title != nullptr && strlen(title) > 0) + { + info.title = (char *)title; + } + ret = bp_bookmark_adaptor_easy_create(&id, &info); + + if (ret == 0) { + ret = bp_bookmark_adaptor_set_sequence(id, -1); // max sequence + if (ret == 0) { + *saved_folder_id = id; + BROWSER_LOGD("bmsvc_add_bookmark is success(id:%d)", *saved_folder_id); + bp_bookmark_adaptor_publish_notification(); + return id; + } + } + BROWSER_LOGD("bmsvc_add_bookmark is failed"); + return -1; +} + +bool BookmarkService::delete_by_id(int id) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("id[%d]", id); + if (bp_bookmark_adaptor_delete(id) < 0) + return false; + else { + bp_bookmark_adaptor_publish_notification(); + return true; + } +} + +bool BookmarkService::delete_by_id_notify(int id) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("id[%d]", id); + + BookmarkItem item; + get_item_by_id(id, &item); + return delete_by_id(id); +} + +bool BookmarkService::delete_by_uri(const char *uri) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("uri[%s]", uri); + bp_bookmark_property_cond_fmt properties; + properties.parent = -1; + properties.type = 0; + properties.is_operator = -1; + properties.is_editable = -1; + //conditions for querying + bp_bookmark_rows_cond_fmt conds; + conds.limit = 1; + conds.offset = 0; + conds.order_offset = BP_BOOKMARK_O_SEQUENCE; + conds.ordering = 0; + conds.period_offset = BP_BOOKMARK_O_DATE_CREATED; + conds.period_type = BP_BOOKMARK_DATE_ALL; + + int *ids = nullptr; + int ids_count = -1; + int ret = bp_bookmark_adaptor_get_cond_ids_p(&ids, &ids_count, &properties, &conds, BP_BOOKMARK_O_URL, uri, 0); + bool result = false; + if (ret >= 0 && ids_count > 0) + { + delete_by_id_notify(ids[0]); + free(ids); + } + + return result; +} + +int BookmarkService::update_bookmark(int id, const char *title, const char *uri, int parent_id, int order, + bool is_duplicate_check_needed, bool is_URI_check_needed) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + + bool is_URI_exist = (uri != nullptr && strlen(uri) > 0); + bool is_title_exist = (title != nullptr && strlen(title) > 0); + int ret = -1; + if (is_duplicate_check_needed) { + bp_bookmark_property_cond_fmt properties; + properties.parent = -1; + properties.type = 0; + properties.is_operator = -1; + properties.is_editable = -1; + //conditions for querying + bp_bookmark_rows_cond_fmt conds; + conds.limit = 1; + conds.offset = 0; + conds.order_offset = BP_BOOKMARK_O_SEQUENCE; + conds.ordering = 0; + conds.period_offset = BP_BOOKMARK_O_DATE_CREATED; + conds.period_type = BP_BOOKMARK_DATE_ALL; + int *ids = nullptr; + int ids_count = -1; + //This is a bookmark item so check for any such URL already exists + if (is_URI_exist && is_URI_check_needed) { + ret = bp_bookmark_adaptor_get_cond_ids_p(&ids, &ids_count, &properties, &conds, BP_BOOKMARK_O_URL, uri, 0); + free(ids); + if (ret < 0) + return -1; + } + //This is a bookmark folder so check for any such folder with same title already exists + else if (is_title_exist) { + ret = bp_bookmark_adaptor_get_cond_ids_p(&ids, &ids_count, &properties, &conds, BP_BOOKMARK_O_TITLE, title, 0); + free(ids); + if (ret < 0) + return -1; + } + + if (ids_count > 0) { + BROWSER_LOGD("same bookmark already exist"); + return 0; + } + } + bp_bookmark_info_fmt info; + info.type = -1; + info.parent = parent_id; + info.sequence = order; + info.editable = -1; + if (is_URI_exist) + info.url = (char *)uri; + if (is_title_exist) + info.title = (char *)title; + + ret = bp_bookmark_adaptor_easy_create(&id, &info); + if (ret == 0) { + BROWSER_LOGD("bp_bookmark_adaptor_easy_create is success"); + bp_bookmark_adaptor_publish_notification(); + return 1; + } + int errcode = bp_bookmark_adaptor_get_errorcode(); + BROWSER_LOGD("bp_bookmark_adaptor_easy_create is failed[%d]", errcode); + return -1; +} + +int BookmarkService::update_bookmark_notify(int id, const char *title, const char *uri, int parent_id, int order, + bool is_duplicate_check_needed, bool is_URI_check_needed) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD(""); + int ret = update_bookmark(id, title, uri, parent_id, order, is_duplicate_check_needed, is_URI_check_needed); + return ret; +} + +bool BookmarkService::is_in_bookmark(const char *uri) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("uri[%s]", uri); + + int id = 0; + return get_id(uri, &id); +} + +bool BookmarkService::is_in_folder(int parent_folder, const char *title) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD(""); + + bp_bookmark_property_cond_fmt properties; + properties.parent = parent_folder; + properties.type = 1; + properties.is_operator = -1; + properties.is_editable = -1; + //conditions for querying + bp_bookmark_rows_cond_fmt conds; + conds.limit = 1; + conds.offset = 0; + conds.order_offset = BP_BOOKMARK_O_SEQUENCE; + conds.ordering = 0; + conds.period_offset = BP_BOOKMARK_O_DATE_CREATED; + conds.period_type = BP_BOOKMARK_DATE_ALL; + + int *ids = nullptr; + int ids_count = -1; + int ret = bp_bookmark_adaptor_get_cond_ids_p(&ids, &ids_count, &properties, &conds, BP_BOOKMARK_O_TITLE, title, 0); + free(ids); + return ((ret >= 0) && (ids_count > 0)); +} + +bool BookmarkService::get_id(const char *uri, int *bookmark_id) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + bp_bookmark_property_cond_fmt properties; + properties.parent = -1; + properties.type = 0; + properties.is_operator = -1; + properties.is_editable = -1; + //conditions for querying + bp_bookmark_rows_cond_fmt conds; + conds.limit = 1; + conds.offset = 0; + conds.order_offset = BP_BOOKMARK_O_SEQUENCE; + conds.ordering = 0; + conds.period_offset = BP_BOOKMARK_O_DATE_CREATED; + conds.period_type = BP_BOOKMARK_DATE_ALL; + + int *ids = nullptr; + int ids_count = -1; + int ret = bp_bookmark_adaptor_get_cond_ids_p(&ids, &ids_count, &properties, &conds, BP_BOOKMARK_O_URL, uri, 0); + free(ids); + bool result = ((ret >= 0) && (ids_count > 0)); + if (result) { + *bookmark_id = ids[0]; + } + return result; +} + +bool BookmarkService::get_folder_id(const char *title, int parent_id, int *folder_id) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + + bp_bookmark_property_cond_fmt properties; + properties.parent = parent_id; + properties.type = 1; + properties.is_operator = -1; + properties.is_editable = -1; + //conditions for querying + bp_bookmark_rows_cond_fmt conds; + conds.limit = 1; + conds.offset = 0; + conds.order_offset = BP_BOOKMARK_O_SEQUENCE; + conds.ordering = 0; + conds.period_offset = BP_BOOKMARK_O_DATE_CREATED; + conds.period_type = BP_BOOKMARK_DATE_ALL; + + int *ids = nullptr; + int ids_count = -1; + int ret = bp_bookmark_adaptor_get_cond_ids_p(&ids, &ids_count, &properties, &conds, BP_BOOKMARK_O_TITLE, title, 0); + free(ids); + bool result = ((ret >= 0) && (ids_count > 0)); + if (result) { + *folder_id = ids[0]; + } + return false; +} + +bool BookmarkService::get_item_by_id(int id, BookmarkItem *item) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("ID: %d", id); + if (!item) { + BROWSER_LOGE("item is nullptr"); + return false; + } + + if (id == get_root_folder_id()) { + item->setTittle("Bookmarks"); + item->setAddress(""); + item->setId(id); + item->set_folder_flag(1); + item->set_editable_flag(1); + item->setDir(-1); + return true; + } + bp_bookmark_info_fmt info; + if (bp_bookmark_adaptor_get_info(id, (BP_BOOKMARK_O_TYPE | BP_BOOKMARK_O_PARENT | BP_BOOKMARK_O_SEQUENCE | + BP_BOOKMARK_O_IS_EDITABLE | BP_BOOKMARK_O_URL |BP_BOOKMARK_O_TITLE), &info) == 0) { + item->setId(id); + item->set_folder_flag(static_cast(info.type)); + item->setDir(info.parent); + item->set_editable_flag(static_cast(info.editable)); + + if (info.url != nullptr && strlen(info.url) > 0) + item->setAddress(info.url); + + if (info.title != nullptr && strlen(info.title) > 0) + item->setTittle(info.title); + + bp_bookmark_adaptor_easy_free(&info); + return true; + } + BROWSER_LOGD("bp_bookmark_adaptor_get_easy_all is failed"); + return false; +} + +std::vector BookmarkService::get_list_by_folder(const int folder_id) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + std::vector list; + BROWSER_LOGD("folder ID: %d", folder_id); + int *ids = nullptr; + int ids_count = -1; + + if (bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, -1, 0, folder_id, -1, -1, -1, BP_BOOKMARK_O_SEQUENCE, 1) < 0) { + BROWSER_LOGD("bp_bookmark_adaptor_get_sequence_child_ids_p is failed"); + return list; + } + + if (ids_count <= 0) { + BROWSER_LOGD("bookmark list is empty"); + free(ids); + return list; + } + + bp_bookmark_info_fmt info; + for(int i = 0; i < ids_count; i++) { + if (bp_bookmark_adaptor_get_info(ids[i], (BP_BOOKMARK_O_TYPE | + BP_BOOKMARK_O_SEQUENCE | + BP_BOOKMARK_O_IS_EDITABLE | BP_BOOKMARK_O_URL | + BP_BOOKMARK_O_TITLE | BP_BOOKMARK_O_IS_OPERATOR), &info) == 0) { + BookmarkItem *item = new BookmarkItem(); + item->setId(ids[i]); + + item->set_folder_flag(static_cast(info.type)); + item->setDir(folder_id); + item->set_editable_flag(static_cast(info.editable)); + + if (info.url != nullptr && strlen(info.url) > 0) + item->setAddress(info.url); + + if (info.title != nullptr && strlen(info.title) > 0) + item->setTittle(info.title); + + list.push_back(item); + bp_bookmark_adaptor_easy_free(&info); + } + } + free(ids); + return list; +} + +bool BookmarkService::get_list_users_by_folder(const int folder_id, std::vector &list) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("folder ID: %d", folder_id); + int *ids = nullptr; + int ids_count = -1; + if (bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, -1, 0, folder_id, -1, 0, -1, BP_BOOKMARK_O_SEQUENCE, 1) < 0) { + BROWSER_LOGD("bp_bookmark_adaptor_get_ids_p is failed"); + return false; + } + + if (ids_count <= 0) { + BROWSER_LOGD("bookmark list is empty"); + free(ids); + return false; + } + + bp_bookmark_info_fmt info; + for(int i = 0; i < ids_count; i++) { + if (bp_bookmark_adaptor_get_info(ids[i], (BP_BOOKMARK_O_TYPE | + BP_BOOKMARK_O_SEQUENCE | + BP_BOOKMARK_O_IS_EDITABLE | BP_BOOKMARK_O_URL | + BP_BOOKMARK_O_TITLE | + BP_BOOKMARK_O_IS_OPERATOR), &info) == 0) { + BookmarkItem *item = new BookmarkItem(); + item->setId(ids[i]); + item->set_folder_flag(static_cast(info.type)); + item->setDir(folder_id); + item->set_editable_flag(static_cast(info.editable)); + + if (info.url != nullptr && strlen(info.url) > 0) + item->setAddress(info.url); + + if (info.title != nullptr && strlen(info.title) > 0) + item->setTittle(info.title); + + if (info.is_operator > 0) { + delete item; + } else { + list.push_back(item); + } + bp_bookmark_adaptor_easy_free(&info); + } + } + free(ids); + return (list.empty() == false); +} + +bool BookmarkService::get_list_by_dividing(const int folder_id, std::vector &list, int *list_item_count, int genlist_block_size) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("folder ID: %d", folder_id); + + int *ids = nullptr; + int ids_count = -1; + if (bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, genlist_block_size, *list_item_count, folder_id, -1, -1, -1, + BP_BOOKMARK_O_SEQUENCE, 1) < 0) { + BROWSER_LOGD("bp_bookmark_adaptor_get_ids_p is failed"); + return false; + } + + if (ids_count <= 0) { + BROWSER_LOGD("bookmark list is empty"); + free(ids); + return false; + } + + bp_bookmark_info_fmt info; + for(int i = 0; i < ids_count; i++) { + if (bp_bookmark_adaptor_get_info(ids[i], (BP_BOOKMARK_O_TYPE | + BP_BOOKMARK_O_SEQUENCE | + BP_BOOKMARK_O_IS_EDITABLE | BP_BOOKMARK_O_URL | + BP_BOOKMARK_O_TITLE | BP_BOOKMARK_O_IS_OPERATOR), &info) == 0) { + BookmarkItem *item = new BookmarkItem(); + item->setId(ids[i]); + item->set_folder_flag(static_cast(info.type)); + item->setDir(folder_id); + item->set_editable_flag(static_cast(info.editable)); + + if (info.url != nullptr && strlen(info.url) > 0) + item->setAddress(info.url); + + if (info.title != nullptr && strlen(info.title) > 0) + item->setTittle(info.title); + + list.push_back(item); + bp_bookmark_adaptor_easy_free(&info); + } + } + free(ids); + return true; +} + +bool BookmarkService::get_list_users_by_dividing(const int folder_id, std::vector &list, int *list_item_count, int genlist_block_size) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("folder ID: %d", folder_id); + int *ids = nullptr; + int ids_count = -1; + if (bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, genlist_block_size, *list_item_count, folder_id, -1, 0, 1, + BP_BOOKMARK_O_SEQUENCE, 1) < 0) { + BROWSER_LOGD("bp_bookmark_adaptor_get_ids_p is failed"); + return false; + } + + if (ids_count <= 0) { + BROWSER_LOGD("bookmark list is empty"); + free(ids); + return false; + } + + bp_bookmark_info_fmt info; + BROWSER_LOGD("list.size() before : %d", list.size()); + BROWSER_LOGD("ids_count: %d", ids_count); + for(int i = 0; i < ids_count; i++) { + BROWSER_LOGD("list.size(): %d", list.size()); + BROWSER_LOGD("index : %d", i); + if (bp_bookmark_adaptor_get_info(ids[i], (BP_BOOKMARK_O_TYPE | + BP_BOOKMARK_O_SEQUENCE | + BP_BOOKMARK_O_IS_EDITABLE | BP_BOOKMARK_O_URL | + BP_BOOKMARK_O_TITLE | + BP_BOOKMARK_O_IS_OPERATOR), &info) == 0) { + BookmarkItem *item = new BookmarkItem(); + item->setId(ids[i]); + item->set_folder_flag(static_cast(info.type)); + item->setDir(folder_id); + item->set_editable_flag(static_cast(info.editable)); + + if (info.url != nullptr && strlen(info.url) > 0) + item->setAddress(info.url); + + if (info.title != nullptr && strlen(info.title) > 0) + item->setTittle(info.title); + + if (info.is_operator > 0) { + BROWSER_LOGD("this is operator bookmark"); + delete item; + } else { + BROWSER_LOGD("item is pushed"); + list.push_back(item); + } + bp_bookmark_adaptor_easy_free(&info); + } + } + BROWSER_LOGD("list.size() after: %d", list.size()); + free(ids); + return (list.empty() == false); +} + +int BookmarkService::_get_folder_count(const int folder_id) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("folder ID: %d", folder_id); + + int *ids = nullptr; + int ids_count = -1; + bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, -1, 0, folder_id, 1, -1, -1, BP_BOOKMARK_O_SEQUENCE, 0); + free(ids); + return ids_count; +} + + +int BookmarkService::_get_bookmarks_count(const int folder_id) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("folder ID: %d", folder_id); + + int *ids = nullptr; + int ids_count = -1; + bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, -1, 0, folder_id, 0, -1, -1, BP_BOOKMARK_O_SEQUENCE, 0); + free(ids); + return ids_count; +} + + +int BookmarkService::_get_total_contents_count(const int folder_id) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("folder ID: %d", folder_id); + + int *ids = nullptr; + int ids_count = -1; + bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, -1, 0, folder_id, 0, -1, -1, BP_BOOKMARK_O_SEQUENCE, 0); + free(ids); + return ids_count; +} + +bool BookmarkService::get_list_operators(const int folder_id, std::vector &list) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("folder ID: %d", folder_id); + int *ids = nullptr; + int ids_count = -1; + + if (bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, -1, 0, folder_id, -1, 1, -1, BP_BOOKMARK_O_SEQUENCE, 1) < 0) { + BROWSER_LOGD("bp_bookmark_adaptor_get_ids_p is failed"); + return false; + } + + if (ids_count <= 0) { + BROWSER_LOGD("bookmark list is empty"); + free(ids); + return false; + } + + bp_bookmark_info_fmt info; + for(int i = 0; i < ids_count; i++) { + if (bp_bookmark_adaptor_get_info(ids[i], (BP_BOOKMARK_O_TYPE | + BP_BOOKMARK_O_SEQUENCE | + BP_BOOKMARK_O_IS_EDITABLE | BP_BOOKMARK_O_URL | + BP_BOOKMARK_O_TITLE), &info) == 0) { + BookmarkItem *item = new BookmarkItem(); + item->setId(ids[i]); + item->set_folder_flag(static_cast(info.type)); + item->setDir(folder_id); + item->set_editable_flag(static_cast(info.editable)); + + if (info.url != nullptr && strlen(info.url) > 0) + item->setAddress(info.url); + + if (info.title != nullptr && strlen(info.title) > 0) + item->setTittle(info.title); + + list.push_back(item); + bp_bookmark_adaptor_easy_free(&info); + } + } + free(ids); + return (list.empty() == false); +} + +bool BookmarkService::get_list_by_keyword(const char *keyword, std::vector &list) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD(""); + + if (!keyword || (strlen(keyword) == 0)) { + BROWSER_LOGD("keyword is nullptr"); + return false; + } + + std::string buf_str(keyword); + buf_str = "%" + buf_str + "%"; + + bp_bookmark_property_cond_fmt properties; + properties.parent = -1; + properties.type = 0; + properties.is_operator = -1; + properties.is_editable = -1; + //conditions for querying + bp_bookmark_rows_cond_fmt conds; + conds.limit = -1; + conds.offset = 0; + conds.order_offset = BP_BOOKMARK_O_TITLE; + conds.ordering = -1; + conds.period_offset = BP_BOOKMARK_O_DATE_CREATED; + conds.period_type = BP_BOOKMARK_DATE_ALL; + + int *ids = nullptr; + int ids_count = -1; + if (bp_bookmark_adaptor_get_cond_ids_p(&ids, &ids_count, &properties, &conds, + (BP_BOOKMARK_O_TITLE | BP_BOOKMARK_O_URL), buf_str.c_str(), 1) < 0) { + BROWSER_LOGE("bp_bookmark_adaptor_get_cond_ids_p is failed"); + return false; + } + + if (ids_count <= 0) { + BROWSER_LOGD("bookmark list is empty"); + free(ids); + return false; + } + + bp_bookmark_info_fmt info; + for(int i = 0; i < ids_count; i++) { + if (bp_bookmark_adaptor_get_info(ids[i], (BP_BOOKMARK_O_TYPE | + BP_BOOKMARK_O_PARENT | BP_BOOKMARK_O_SEQUENCE | + BP_BOOKMARK_O_IS_EDITABLE | BP_BOOKMARK_O_URL | + BP_BOOKMARK_O_TITLE), &info) == 0) { + BookmarkItem *item = new BookmarkItem(); + item->setId(ids[i]); + item->set_folder_flag(static_cast(info.type)); + item->setDir(info.parent); + item->set_editable_flag(static_cast(info.editable)); + + if (info.url != nullptr && strlen(info.url) > 0) + item->setAddress(info.url); + + if (info.title != nullptr && strlen(info.title) > 0) + item->setTittle(info.title); + + list.push_back(item); + bp_bookmark_adaptor_easy_free(&info); + } + } + free(ids); + return true; +} + +void BookmarkService::destroy_list(std::vector &list) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD(""); + + for(unsigned int i = 0 ; i < list.size() ; i++) { + delete list[i]; + } + list.clear(); +} + +bool BookmarkService::get_folder_depth_count(int *depth_count) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("depth_count: %d", *depth_count); + return _get_depth_count_recursive(get_root_folder_id(), 0, depth_count); +} + +bool BookmarkService::_get_depth_count_recursive(int folder_id, int cur_depth, int *depth_count) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("current_depth: %d, depth_count:%d", cur_depth, *depth_count); + + std::vector bookmark_list = get_list_by_folder(folder_id); + if (!bookmark_list.empty()) { + BROWSER_LOGE("get_list_by_folder is failed(folder id:%d)",folder_id); + return false; + } + + for(unsigned int j = 0 ; j < bookmark_list.size() ; j++) { + if (bookmark_list[j]->is_folder()) { + /* Folder item is found. get sub list */ + if ((cur_depth+1) > *depth_count) + *depth_count = cur_depth+1; + + _get_depth_count_recursive(bookmark_list[j]->getId(), cur_depth+1, depth_count); + } + } + destroy_list(bookmark_list); + return true; +} + +bool BookmarkService::set_thumbnail(int id, Evas_Object *thumbnail) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("id : %d", id); + + int w = 0; + int h = 0; + int stride = 0; + int len = 0; + + //platform_Service ps. + //ps.evas_image_size_get(thumbnail, &w, &h, &stride); + len = stride * h; + BROWSER_LOGD("thumbnail w=[%d], h=[%d], stride=[%d], len=[%d]", w, h, stride, len); + + if (len == 0) + return false; + + void *thumbnail_data = evas_object_image_data_get(thumbnail, true); + int ret = bp_bookmark_adaptor_set_snapshot(id, w, h, (const unsigned char *)thumbnail_data, len); + if (ret < 0) { + BROWSER_LOGE("bp_bookmark_adaptor_set_thumbnail is failed"); + return false; + } + return true; +} + +Evas_Object *BookmarkService::get_thumbnail(int id, Evas_Object *parent) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("id : %d", id); + void *thumbnail_data = nullptr; + int w = 0; + int h = 0; + int len = 0; + Evas_Object *icon = nullptr; + + int ret = bp_bookmark_adaptor_get_snapshot(id, &w, &h, (unsigned char **)&thumbnail_data, &len); + BROWSER_LOGE("len: %d, w:%d, h:%d", len, w, h); + if (len > 0){ + /* gengrid event area has scaled with original image if it is evas image. + therefore use elm_image*/ + icon = elm_image_add(parent); + Evas_Object *icon_object = elm_image_object_get(icon); + evas_object_image_colorspace_set(icon_object, EVAS_COLORSPACE_ARGB8888); + evas_object_image_size_set(icon_object, w, h); + evas_object_image_fill_set(icon_object, 0, 0, w, h); + evas_object_image_filled_set(icon_object, true); + evas_object_image_alpha_set(icon_object,true); + + void *target_image_data = evas_object_image_data_get(icon_object, true); + memcpy(target_image_data, thumbnail_data, len); + evas_object_image_data_set(icon_object, target_image_data); + } + + return icon; +} + +bool BookmarkService::set_favicon(int id, Evas_Object *favicon) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("id : %d", id); + + int w = 0; + int h = 0; + int stride = 0; + int len = 0; + + //platform_Service ps. + //ps.evas_image_size_get(favicon, &w, &h, &stride); + len = stride * h; + BROWSER_LOGD("favicon w=[%d], h=[%d], stride=[%d], len=[%d]", w, h, stride, len); + + if (len == 0) + return false; + + void *favicon_data = evas_object_image_data_get(favicon, true); + int ret = bp_bookmark_adaptor_set_icon(id, w, h, (const unsigned char *)favicon_data, len); + if (ret < 0) { + BROWSER_LOGE("bp_bookmark_adaptor_set_favicon is failed"); + return false; + } + return true; +} + +Evas_Object *BookmarkService::get_favicon(int id, Evas_Object *parent) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("id : %d", id); + void *favicon_data = nullptr; + int w = 0; + int h = 0; + int len = 0; + + Evas *e = nullptr; + e = evas_object_evas_get(parent); + if (!e) { + BROWSER_LOGE("canvas is nullptr"); + return nullptr; + } + int ret = bp_bookmark_adaptor_get_icon(id, &w, &h, (unsigned char **)&favicon_data, &len); + if (ret < 0) { + BROWSER_LOGE("bp_bookmark_adaptor_set_favicon is failed"); + return nullptr; + } + + Evas_Object *icon = nullptr; + BROWSER_LOGE("len: %d, w:%d, h:%d", len, w, h); + if (len > 0){ + icon = evas_object_image_filled_add(e); + if (w == 0 || h == 0) { + // Android bookmark. + evas_object_image_memfile_set(icon, favicon_data, len, nullptr, nullptr); + } else { + // Tizen bookmark. + evas_object_image_colorspace_set(icon, EVAS_COLORSPACE_ARGB8888); + evas_object_image_size_set(icon, w, h); + evas_object_image_fill_set(icon, 0, 0, w, h); + evas_object_image_filled_set(icon, true); + evas_object_image_alpha_set(icon,true); + + void *target_image_data = evas_object_image_data_get(icon, true); + memcpy(target_image_data, favicon_data, len); + evas_object_image_data_set(icon, target_image_data); + } + } + return icon; +} + +bool BookmarkService::set_webicon(int id, Evas_Object *webicon) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("id : %d", id); + + int w = 0; + int h = 0; + int stride = 0; + int len = 0; + + //platform_Service ps; + //ps.evas_image_size_get(webicon, &w, &h, &stride); + len = stride * h; + BROWSER_LOGD("webicon w=[%d], h=[%d], stride=[%d], len=[%d]", w, h, stride, len); + + if (len == 0) + return false; + + void *webicon_data = evas_object_image_data_get(webicon, true); + int ret = bp_bookmark_adaptor_set_webicon(id, w, h, (const unsigned char *)webicon_data, len); + if (ret != 0) + BROWSER_LOGE("set webicon is failed"); + return false; +} + +Evas_Object *BookmarkService::get_webicon(int id, Evas_Object *parent) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("id : %d", id); + void *webicon_data = nullptr; + int w = 0; + int h = 0; + int len = 0; + + int ret = bp_bookmark_adaptor_get_webicon(id, &w, &h, (unsigned char **)&webicon_data, &len); + if (ret != 0) { + BROWSER_LOGE("bp_bookmark_adaptor_set_webicon is failed"); + return nullptr; + } + + Evas_Object *icon = nullptr; + BROWSER_LOGE("len: %d, w:%d, h:%d", len, w, h); + if (len > 0){ + Evas *e = evas_object_evas_get(parent); + icon = evas_object_image_filled_add(e); + + evas_object_image_colorspace_set(icon, EVAS_COLORSPACE_ARGB8888); + evas_object_image_size_set(icon, w, h); + evas_object_image_fill_set(icon, 0, 0, w, h); + evas_object_image_filled_set(icon, true); + evas_object_image_alpha_set(icon,true); + + void *target_image_data = evas_object_image_data_get(icon, true); + memcpy(target_image_data, webicon_data, len); + evas_object_image_data_set(icon, target_image_data); + } + + return icon; +} + +bool BookmarkService::set_access_count(int id, int count) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD(""); + return !bp_bookmark_adaptor_set_access_count(id, count); +} + +bool BookmarkService::get_access_count(int id, int *count) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD(""); + return !bp_bookmark_adaptor_get_access_count(id, count); +} + +bool BookmarkService::increase_access_count(int id) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD(""); + int count; + if(get_access_count(id, &count) == false) { + BROWSER_LOGD("get_access_count is failed"); + return false; + } + + if(set_access_count(id, count + 1) == false) { + BROWSER_LOGD("set_access_count is failed"); + return false; + } + + return true; +} + +bool BookmarkService::set_last_sequence(int id) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD(""); + return (bp_bookmark_adaptor_set_sequence(id, -1) == -1); +} + +const char* BookmarkService::get_path_info(void) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("%s", m_path_string.c_str()); + return m_path_string.c_str(); +} + +BookmarkService::folder_info *BookmarkService::get_path_by_index(unsigned int index) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("%s", m_path_history[index]->folder_name); + return m_path_history[index]; +} + +int BookmarkService::get_path_size(void) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("%d", m_path_history.size()); + return m_path_history.size(); +} + +void BookmarkService::push_back_path(folder_info *item) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("path size before push: %d", m_path_history.size()); + m_path_history.push_back(item); +} + +void BookmarkService::pop_back_path(void) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("path size before pop: %d", m_path_history.size()); + m_path_history.pop_back(); +} + +void BookmarkService::clear_path_history(void) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD(""); + free_path_history(); + m_path_history.clear(); +} + +void BookmarkService::free_path_history(void) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD(""); + for(unsigned int i = 0 ; i < m_path_history.size() ; i++) { + if (m_path_history[i]) { + if (m_path_history[i]->folder_name) + free(m_path_history[i]->folder_name); + + free(m_path_history[i]); + } + } +} + +void BookmarkService::change_path_lang(void) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD(""); + m_path_string.clear(); + + char *old_str = m_path_history[0]->folder_name; + m_path_history[0]->folder_name = strdup("Bookmarks"); + free(old_str); + + for(int i = 0 ; i < get_path_size(); i++) { + if (get_path_by_index(i)) { + if (m_path_string.empty()) { + m_path_string = m_path_history[0]->folder_name; + } else { + m_path_string += "/"; + m_path_string += get_path_by_index(i)->folder_name; + } + } + } + BROWSER_LOGD("str: %s", m_path_string.c_str()); +} + +void BookmarkService::path_into_sub_folder(int folder_id, const char *folder_name) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD(""); + + folder_info *item = (folder_info *)calloc(1, sizeof(folder_info)); + + item->folder_id = folder_id; + if (folder_id == get_root_folder_id()) { + item->folder_name = strdup("Bookmarks"); + } else + item->folder_name = strdup(folder_name); + push_back_path(item); + + m_path_string.clear(); + for(int i = 0 ; i < get_path_size() ; i++) { + if (get_path_by_index(i)) { + if (m_path_string.empty()) { + m_path_string = get_path_by_index(i)->folder_name; + } else { + m_path_string += "/"; + m_path_string += get_path_by_index(i)->folder_name; + } + } + } + char *path_string = (elm_entry_utf8_to_markup(m_path_string.c_str())); + m_path_string = path_string; + free(path_string); + BROWSER_LOGD("m_path_string: %s", m_path_string.c_str()); + + m_curr_folder = folder_id; +} + +bool BookmarkService::path_to_upper_folder(int *curr_folder) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD(""); + + int current_depth = get_path_size(); + BROWSER_LOGD("current_depth: %d", current_depth); + + if (current_depth <= 0) { + BROWSER_LOGE("[ERROR] top folder is not valid"); + return true; + } + + int curr_depth = current_depth - 1; + if (curr_depth > 0) { + *curr_folder = get_path_by_index(curr_depth - 1)->folder_id; + if (get_path_by_index(curr_depth) && get_path_by_index(curr_depth)->folder_name) { + free(get_path_by_index(curr_depth)->folder_name); + free(get_path_by_index(curr_depth)); + } + pop_back_path(); + } else { + /* Current folder is root folder */ + if (*curr_folder != get_root_folder_id()) { + BROWSER_LOGE("[ERROR] top folder is not root folder"); + return true; + } + if (get_path_by_index(curr_depth) && get_path_by_index(curr_depth)->folder_name) { + free(get_path_by_index(curr_depth)->folder_name); + free(get_path_by_index(curr_depth)); + } + pop_back_path(); + m_path_string.clear(); + return false; + } + + m_path_string.clear(); + for(int i = 0 ; i < get_path_size() ; i++) { + if (get_path_by_index(i)) { + if (m_path_string.empty()) { + m_path_string = get_path_by_index(i)->folder_name; + } else { + m_path_string += "/"; + m_path_string += get_path_by_index(i)->folder_name; + } + } + } + BROWSER_LOGD("m_path_string: %s", m_path_string.c_str()); + + m_curr_folder = *curr_folder; + return true; +} } /* end of namespace services*/ } /* end of namespace tizen_browser */ diff --git a/services/BookmarkService/BookmarkService.h b/services/BookmarkService/BookmarkService.h index f33db1d..75ed2f2 100644 --- a/services/BookmarkService/BookmarkService.h +++ b/services/BookmarkService/BookmarkService.h @@ -24,7 +24,6 @@ #define BOOKMARKSERVICE_H #include "browser_config.h" - #include #include #include @@ -82,11 +81,12 @@ public: /** * @brief Get bookmarks from platform service and store it in private m_bookmarksList * - * @return list of bookmark items + * @return list of bookmark items, bookmark items in a folder & bookmark folders */ - std::vector > getBookmarks(); + std::vector > getBookmarks(int folder_id = 0); + std::vector > getBookmarkFolders(); - /** + /** * @brief Delete all bookmarks * * @return true if success, false on error @@ -104,19 +104,77 @@ public: void synchronizeBookmarks(); -private: + typedef struct _folder_info { + int folder_id; + char *folder_name; + } folder_info; + + int get_root_folder_id(void); + int save_folder(const char *title, int *saved_bookmark_id, int parent_id=0,int by_operator = 0); + bool delete_by_id(int id); + bool delete_by_id_notify(int id); + bool delete_by_uri(const char *uri); + int update_bookmark(int id, const char *title, const char *uri, int parent_id, int order, + bool is_duplicate_check_needed = false, bool is_URI_check_needed = false); + int update_bookmark_notify(int id, const char *title, const char *uri, int parent_id, int order, + bool is_duplicate_check_needed = false, bool is_URI_check_needed = false); + bool delete_all(void); + bool get_item_by_id(int id, BookmarkItem *item); + std::vector get_list_by_folder(const int folder_id); + bool get_list_users_by_folder(const int folder_id, std::vector &list); + bool get_list_by_dividing(const int folder_id, std::vector &list, int *last_item, int genlist_block_size); + bool get_list_users_by_dividing(const int folder_id, std::vector &list, int *last_item, int genlist_block_size); + int _get_folder_count(const int folder_id); + int _get_bookmarks_count(const int folder_id); + int _get_total_contents_count(const int folder_id); + bool get_list_operators(const int folder_id, std::vector &list); + bool get_list_by_keyword(const char *keyword, std::vector &list); + void destroy_list(std::vector &list); + int get_count(void); + bool get_id(const char *uri, int *bookmark_id); + bool get_folder_id(const char *title, int parent_id, int *folder_id); + bool is_in_bookmark(const char *uri); + bool is_in_folder(int parent_folder, const char *title); + bool get_folder_depth_count(int *depth_count); + bool set_thumbnail(int id, Evas_Object *thumbnail); + Evas_Object *get_thumbnail(int id, Evas_Object *parent); + bool set_favicon(int id, Evas_Object *favicon); + Evas_Object *get_favicon(int id, Evas_Object *parent); + bool set_webicon(int id, Evas_Object *webicon); + Evas_Object *get_webicon(int id, Evas_Object *parent); + bool set_access_count(int id, int count); + bool get_access_count(int id, int *count); + bool increase_access_count(int id); + bool set_last_sequence(int id); + const char* get_path_info(void); + folder_info *get_path_by_index(unsigned int index); + int get_path_size(void); + void push_back_path(folder_info *item); + void pop_back_path(void); + void clear_path_history(void); + void free_path_history(void); + void change_path_lang(void); + void path_into_sub_folder(int folder_id, const char *folder_name); + bool path_to_upper_folder(int *curr_folder); + + bool get_memory_full(void) { return m_memory_full; } + int get_current_folder_id(void) { return m_curr_folder; } +private: + bool _get_depth_count_recursive(int folder_id, int cur_depth, int *depth_count); + + std::vector m_bookmark_list; + std::vector m_path_history; + std::string m_path_string; + bool m_memory_full; + bool m_bookmark_adaptor_initialize; + int m_curr_folder; std::shared_ptr m_storageManager; - std::vector > m_bookmarks; - - /// \todo Need to change getBookmarkId function for finding stored bookmark - check getBookmarkExists function int getBookmarkId(const std::string & url); - std::shared_ptr getStorageManager(); - config::DefaultConfig config; }; diff --git a/services/BookmarksUI/BookmarksUI.cpp b/services/BookmarksUI/BookmarksUI.cpp deleted file mode 100644 index 5e9a505..0000000 --- a/services/BookmarksUI/BookmarksUI.cpp +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * 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. - */ - -#include -#include -#include -#include - -#include "BookmarksUI.h" -#include "ServiceManager.h" -#include "BrowserLogger.h" -#include "Tools/EflTools.h" -#include "../Tools/BrowserImage.h" - - -namespace tizen_browser{ -namespace base_ui{ - -EXPORT_SERVICE(BookmarksUI, "org.tizen.browser.bookmarksui") - - -typedef struct _BookmarkItemData -{ - std::shared_ptr item; - std::shared_ptr bookmarksUI; -} BookmarkItemData; - -BookmarksUI::BookmarksUI() - : m_gengrid(NULL) - , m_parent(NULL) - , m_item_class(NULL) - , m_gengridSetup(false) -{ - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); -} - -BookmarksUI::~BookmarksUI() -{ - -} - -void BookmarksUI::init(Evas_Object* p) -{ - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - m_parent = p; - m_gengrid = elm_gengrid_add(m_parent); - - evas_object_smart_callback_add(m_gengrid, "item,focused", focusItem, NULL); - evas_object_smart_callback_add(m_gengrid, "item,unfocused", unFocusItem, NULL); - evas_object_smart_callback_add(m_gengrid, "activated", _itemSelected, this); - - if (!m_item_class) { - m_item_class = elm_genlist_item_class_new(); - m_item_class->item_style = "bookmark_item"; - m_item_class->func.text_get = NULL; - m_item_class->func.content_get = _grid_content_get; - m_item_class->func.state_get = NULL; - m_item_class->func.del = NULL; - } -} - - -Evas_Object * BookmarksUI::getContent() -{ - BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); - M_ASSERT(m_parent); - - if(m_map_bookmark_views.size() == 0) { - elm_object_part_content_set(m_gengrid, "elm.swallow.empty", createNoBookmarksLabel()); - } - - - if(!m_gengridSetup) { - std::string edjFilePath = EDJE_DIR; - edjFilePath.append("BookmarksUI/Bookmarks.edj"); - elm_theme_extension_add(NULL, edjFilePath.c_str()); - - - elm_object_style_set(m_gengrid, "bookmarks"); - - elm_gengrid_align_set(m_gengrid, 0, 0); - elm_gengrid_item_size_set(m_gengrid, 395, 357); - elm_gengrid_select_mode_set(m_gengrid, ELM_OBJECT_SELECT_MODE_ALWAYS); - elm_gengrid_multi_select_set(m_gengrid, EINA_FALSE); - elm_gengrid_horizontal_set(m_gengrid, EINA_FALSE); - elm_gengrid_highlight_mode_set(m_gengrid, EINA_TRUE); - elm_scroller_policy_set(m_gengrid, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - elm_scroller_page_size_set(m_gengrid, 0, 327); - - evas_object_size_hint_weight_set(m_gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(m_gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); - - m_gengridSetup = true; - } - return m_gengrid; -} - -void BookmarksUI::addBookmarkItem(std::shared_ptr bi) -{ - BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); - BookmarkItemData *itemData = new BookmarkItemData(); - itemData->item = bi; - itemData->bookmarksUI = std::shared_ptr(this); - Elm_Object_Item* bookmarkView = elm_gengrid_item_append(m_gengrid, m_item_class, itemData, NULL, this); - m_map_bookmark_views.insert(std::pair(bi->getAddress(),bookmarkView)); - - // unselect by default - elm_gengrid_item_selected_set(bookmarkView, EINA_FALSE); - - setEmptyGengrid(false); -} - -void BookmarksUI::addBookmarkItems(std::vector > items) -{ - BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); - for (auto it = items.begin(); it != items.end(); ++it) { - addBookmarkItem(*it); - } -} - -void BookmarksUI::removeBookmarkItem(const std::string& uri) -{ - BROWSER_LOGD("[%s] uri=%s", __func__, uri.c_str()); - if(m_map_bookmark_views.find(uri) == m_map_bookmark_views.end()) { - return; - } - - Elm_Object_Item* bookmarkView = m_map_bookmark_views.at(uri); - elm_object_item_del(bookmarkView); - m_map_bookmark_views.erase(uri); - - setEmptyGengrid(0 == m_map_bookmark_views.size()); -} - -void BookmarksUI::_item_deleted(void * /* data */, Evas_Object * /* obj */) -{ - -} - -Evas_Object * BookmarksUI::_grid_content_get(void *data, Evas_Object *obj, const char *part) -{ - BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part); - BookmarkItemData *itemData = reinterpret_cast(data); - - if (!strcmp(part, "elm.thumbnail")) { - if (itemData->item->getThumbnail()) { - Evas_Object * thumb = tizen_browser::tools::EflTools::getEvasImage(itemData->item->getThumbnail(), itemData->bookmarksUI->m_parent); - return thumb; - } - else { - return NULL; - } - } - else if (!strcmp(part, "favicon")) { - Evas_Object * favicon = NULL; - if(itemData->item->getFavicon().get()){ - favicon = tizen_browser::tools::EflTools::getEvasImage(itemData->item->getFavicon(), obj); - } - return favicon; - } - else if (!strcmp(part, "elm.label")) { - Evas_Object *label = elm_label_add(obj); - elm_object_style_set(label, "bookmarks_label"); - elm_object_text_set(label, itemData->item->getTittle().c_str()); - return label; - } - else if (!strcmp(part, "elm.deleteButton")) { - Evas_Object *deleteButton = elm_button_add(obj); - elm_object_style_set(deleteButton, "deleteButton"); - evas_object_smart_callback_add(deleteButton, "clicked", tizen_browser::base_ui::BookmarksUI::_deleteBookmark, data); - return deleteButton; - } - else if (!strcmp(part, "elm.thumbButton")) { - Evas_Object *thumbButton = elm_button_add(obj); - elm_object_style_set(thumbButton, "thumbButton"); - evas_object_smart_callback_add(thumbButton, "clicked", tizen_browser::base_ui::BookmarksUI::_thumbSelected, data); - return thumbButton; - } - return NULL; -} - -void BookmarksUI::_itemSelected(void * data, Evas_Object * /* obj */, void * event_info) -{ - Elm_Object_Item * selected = reinterpret_cast(event_info); - BookmarkItemData * itemData = reinterpret_cast(elm_object_item_data_get(selected)); - BookmarksUI * self = reinterpret_cast(data); - - self->bookmarkClicked(itemData->item); -} - -void BookmarksUI::_deleteBookmark(void *data, Evas_Object * /* obj */, void * /* event_info */) -{ - BookmarkItemData * itemData = reinterpret_cast(data); - itemData->bookmarksUI->bookmarkDeleteClicked(itemData->item); -} - -void BookmarksUI::_thumbSelected(void * data, Evas_Object * /* obj */, void * /* event_info */) -{ - BookmarkItemData * itemData = reinterpret_cast(data); - itemData->bookmarksUI->bookmarkClicked(itemData->item); -} - -Evas_Object* BookmarksUI::createNoBookmarksLabel() -{ - Evas_Object *label = elm_label_add(m_parent); - elm_object_text_set(label, "No favorite websites."); - evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); - return label; -} - -void BookmarksUI::setEmptyGengrid(bool setEmpty) -{ - if(setEmpty) { - elm_object_part_content_set(m_gengrid, "elm.swallow.empty", createNoBookmarksLabel()); - } else { - elm_object_part_content_set(m_gengrid, "elm.swallow.empty", NULL); - } -} - -void BookmarksUI::deleteAllItems() -{ - BROWSER_LOGD("Deleting all items from gengrid"); - elm_gengrid_clear(m_gengrid); - m_map_bookmark_views.clear(); - setEmptyGengrid(true); -} - -void BookmarksUI::focusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) -{ - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - Elm_Object_Item *item = reinterpret_cast(event_info); - elm_object_item_signal_emit( item, "mouse,in", "over2"); - - // selected manually - elm_gengrid_item_selected_set(item, EINA_TRUE); -} - -void BookmarksUI::unFocusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) -{ - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - Elm_Object_Item *item = reinterpret_cast(event_info); - elm_object_item_signal_emit( item, "mouse,out", "over2"); - - // unselected manually - elm_gengrid_item_selected_set(item, EINA_FALSE); -} - -std::shared_ptr BookmarksUI::getSelectedBookmarkItem() -{ - Elm_Object_Item * selected = elm_gengrid_selected_item_get(m_gengrid); - - if (!selected) { - BROWSER_LOGD("none selected"); - return std::make_shared(); - } - BookmarkItemData * itemData = reinterpret_cast(elm_object_item_data_get(selected)); - return itemData->item; -} - - -} -} diff --git a/services/BookmarksUI/BookmarksUI.h b/services/BookmarksUI/BookmarksUI.h deleted file mode 100644 index 33bb924..0000000 --- a/services/BookmarksUI/BookmarksUI.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * 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 BOOKMARKSUI_H -#define BOOKMARKSUI_H - -#include -#include - -#include "AbstractUIComponent.h" -#include "AbstractService.h" -#include "ServiceFactory.h" -#include "service_macros.h" -#include "BookmarkItem.h" - -namespace tizen_browser{ -namespace base_ui{ - -class BROWSER_EXPORT BookmarksUI - : public tizen_browser::interfaces::AbstractUIComponent - , public tizen_browser::core::AbstractService -{ -public: - BookmarksUI(); - ~BookmarksUI(); - void init(Evas_Object *main_layout); - Evas_Object *getContent(); - virtual std::string getName(); - void addBookmarkItem(std::shared_ptr); - void addBookmarkItems(std::vector >); - void removeBookmarkItem(const std::string& uri); - void deleteAllItems(); - std::shared_ptr getSelectedBookmarkItem(); - - - boost::signals2::signal)> bookmarkClicked; - boost::signals2::signal)> bookmarkDeleteClicked; -private: - static Evas_Object * _grid_content_get(void *data, Evas_Object *obj, const char *part); - static void _itemSelected(void * data, Evas_Object * obj, void * event_info); - static void _item_deleted(void *data, Evas_Object *obj); - static void _thumbSelected(void * data, Evas_Object * obj, void * event_info); - static void _deleteBookmark(void *data, Evas_Object *obj, void *event_info); - void setEmptyGengrid(bool setEmpty); - -private: - Evas_Object *m_gengrid; - Evas_Object *m_parent; - Elm_Gengrid_Item_Class * m_item_class; - std::map m_map_bookmark_views; - bool m_gengridSetup; - Evas_Object *createNoBookmarksLabel(); - - static void focusItem(void* data, Evas_Object* obj, void* event_info); - static void unFocusItem(void* data, Evas_Object* obj, void* event_info); -}; - - -} -} - -#endif // BOOKMARKSUI_H diff --git a/services/BookmarksUI/edc/Bookmarks.edc b/services/BookmarksUI/edc/Bookmarks.edc deleted file mode 100644 index 7638300..0000000 --- a/services/BookmarksUI/edc/Bookmarks.edc +++ /dev/null @@ -1,440 +0,0 @@ -#define DEBUG_RECT_OVER(over_part, r, g, b) \ - part { name: __CONCAT("dbg_rect_at_", __stringify(__LINE__)); \ - \ -scale:1; \ - type : RECT; \ - repeat_events: 1; \ - description { \ - state: "default" 0.0; \ - visible: 1; \ - color: r g b 128; \ - rel1 { to: over_part; relative: 0 0; } \ - rel2 { to: over_part; relative: 1 1; } \ - } \ - } - -collections { - -group { name: "elm/label/base/bookmarks_label"; - styles { - style { name: "textblock_white"; - base: "font=Sans font_size="30" color=#D3D3D3"; - } - } - styles { - style { name: "textblock_white_bold"; - base: "font=Sans:style=Bold font_size="30" color=#D3D3D3"; - } - } - - parts { - part { name: "elm.text"; - type: TEXTBLOCK; - description { state: "default" 0.0; - rel1.relative: 0.0 0.0; - rel2.relative: 1.0 1.0; - align: 0.0 0.0; - fixed: 1 1; - text { - style: "textblock_white"; - min: 0 1; - } - } - description { state: "bold" 0.0; - inherit: "default" 0.0; - text { - style: "textblock_white_bold"; - min: 0 1; - } - } - } - } -} - -group { name: "elm/button/base/thumbButton"; - images { - image: "ico_delete.png" COMP; - } - parts { - part { name: "elm.swallow.content"; - type: RECT; - mouse_events: 1; - repeat_events: 1; - description { state: "default" 0.0; - color: 0 0 0 0; - visible: 1; - rel1.relative: 0.0 0.0; - rel2.relative: 1.0 1.0; - align: 0.0 0.0; - } - } - } - - programs { - program { name: "mouse,clicked"; - signal: "mouse,down,1"; - source: "elm.swallow.content"; - action: SIGNAL_EMIT "elm,action,click" ""; - } - } -} - -group { name: "elm/button/base/deleteButton"; - parts { - part { name: "delete_x"; - type: IMAGE; - description { state: "default" 0.0; - min: 27 27; - max: 27 27; - image.normal: "ico_delete.png"; - rel1.relative: 0.0 0.0; - rel2.relative: 1.0 1.0; - align: 0.5 0.5; - visible: 0; - } - description { state: "over" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - - part { name: "elm.swallow.content"; - type: RECT; - mouse_events: 1; - repeat_events: 1; - description { state: "default" 0.0; - color: 0 0 0 0; - visible: 1; - rel1.relative: 0.0 0.0; - rel2.relative: 1.0 1.0; - align: 0.0 0.0; - } - } - } - programs { - program { name: "mouse,clicked"; - signal: "mouse,down,1"; - source: "elm.swallow.content"; - action: SIGNAL_EMIT "elm,action,click" ""; - } - program { name: "mouse_in"; - signal: "mouse,in"; - source: "elm.swallow.content"; - action: STATE_SET "over" 0.0; - target: "delete_x"; - } - program { name: "mouse_out"; - signal: "mouse,out"; - source: "elm.swallow.content"; - action: STATE_SET "default" 0.0; - target: "delete_x"; - } - } -} -group { name: "elm/gengrid/base/bookmarks"; - data { - item: "focus_highlight" "off"; - } - - parts { - part { name: "clipper"; - type: RECT; - mouse_events: 0; - description { state: "default" 0.0; - rel1 { - relative: 0 0; - } - rel2{ - relative: 1 1; - } - } - } - part { name: "background"; - type: RECT; - mouse_events: 0; - description { state: "default" 0.0; - color: 42 50 64 255; - rel1 { - relative: 0 0; - } - rel2{ - relative: 1 1; - } - } - } - part { name: "elm.swallow.content"; - type: SWALLOW; - clip_to: "clipper"; - description { state: "default" 0.0; - rel1 { - relative: 0 0; - offset: 169 110; - } - rel2 { - relative: 1 1; - offset: -169 0; - } - } - } - part { name: "elm.swallow.empty"; - type: SWALLOW; - description { state: "default" 0.0; - align: 0.5 0.5; - rel1 { - relative: 0.5 0.5; - } - rel2 { - relative: 0.5 0.5; - } - } - } - } -} -group { name: "elm/gengrid/item/bookmark_item/default"; - data.item: "texts" "elm.text"; - data.item: "contents" "elm.thumbnail favicon elm.text elm.label elm.deleteButton elm.thumbButton"; - images { - image: "web_frame_selected.png" COMP; - image: "ico_bg_round_shape_37x37.png" COMP; - } - parts { - part { name: "bg"; - clip_to: "disclip"; - mouse_events: 0; - description { state: "default" 0.0; - visible: 0; - color: 255 255 255 0; - } - } - - part { name: "elm.thumbnail"; - clip_to: "disclip"; - type: SWALLOW; - description { state: "default" 0.0; - fixed: 1 0; - align: 0.0 0.0; - min: 373 240; - max: 373 240; - rel1 { - relative: 0.0 0.0; - } - rel2 { - relative: 1.0 1.0; - } - } - description { state: "selected"; - inherit: "default" 0.0; - } - } - - part { name: "focus_highlight"; - type: IMAGE; - description { state: "default" 0.0; - rel1 { - to: "elm.thumbnail"; - relative: 0.0 0.0; - } - rel2 { - to: "elm.thumbnail"; - relative: 1.0 1.0; - } - image.normal: "web_frame_selected.png"; - image.border: 8 8 8 0; - image.border_scale: 1; - image.middle: NONE; - visible: 0; - } - description { state: "selected"; - inherit: "default" 0.0; - visible: 1; - } - } - - part { name: "background"; - clip_to: "disclip"; - type: RECT; - description { state: "default" 0.0; - min: 373 87; - max: 373 87; - align: 0.0 0.0; - color: 30 38 50 255; - rel1 { - to: "elm.thumbnail"; - relative: 0.0 1.0; - offset: 0 0; - } - rel2 { - relative: 1.0 1.0; - } - } - description { state: "selected" 0.0; - inherit: "default" 0.0; - color: 70 143 254 255; - } - } - - part { name: "favicon_bg"; - clip_to: "disclip"; - type: IMAGE; - description { state: "default" 0.0; - fixed: 1 0; - align: 0.0 0.0; - min: 37 37; - max: 37 37; - rel1 { - to: "elm.thumbnail"; - relative: 0.0 1.0; - offset: 25 25; - } - rel2 { - relative: 1.0 1.0; - } - // image.normal: "ico_bg_round_shape_37x37.png"; - } - } - - part { name: "favicon"; - clip_to: "disclip"; - type: SWALLOW; - description { state: "default" 0.0; - fixed: 1 0; - align: 0.5 0.5; - min: 37 37; - max: 37 37; - rel1.to: "favicon_bg"; - rel2.to: "favicon_bg"; - } - } - - part { name: "elm.label"; - clip_to: "disclip"; - type: SWALLOW; - description { state: "default" 0.0; - min: 273 41; - max: 273 41; - align: 0.0 0.0; - rel1 { - to: "favicon_bg"; - relative: 1.0 0.0; - offset: 13 0; - } - rel2 { - relative: 1.0 1.0; - } - } - } - - part { name: "delete_bg"; - clip_to: "disclip"; - type: RECT; - description { state: "default" 0.0; - min: 373 87; - max: 373 87; - align: 0.0 0.0; - color: 70 143 254 204; - rel1.to: "background"; - rel2.to: "background"; - visible: 0; - } - description { state: "over" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - - part { name: "disclip"; - type: RECT; - description { state: "default" 0.0; - rel1.to: "bg"; - rel2.to: "bg"; - } - } - - part { name: "elm.deleteButton"; - clip_to: "disclip"; - type: SWALLOW; - description { state: "default" 0.0; - min: 373 87; - max: 373 87; - align: 0.0 0.0; - rel1 { - to: "elm.thumbnail"; - relative: 0.0 1.0; - offset: 0 0; - } - rel2 { - relative: 1.0 1.0; - } - visible: 1; - } - description { state: "over" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - - part { name: "elm.thumbButton"; - clip_to: "disclip"; - type: SWALLOW; - description { state: "default" 0.0; - rel1.to: "elm.thumbnail"; - rel2.to: "elm.thumbnail"; - } - } - - part { name: "over2"; - type: RECT; - mouse_events: 1; - repeat_events: 1; - description { state: "default" 0.0; - color: 0 0 0 0; - rel1.to: "bg"; - rel2.to: "background"; - } - } - part { name: "over3"; - type: RECT; - mouse_events: 1; - repeat_events: 1; - description { state: "default" 0.0; - color: 0 0 0 0; - rel1.to: "background"; - rel2.to: "background"; - } - } - } - - programs{ - program { name: "mouse_in"; - signal: "mouse,in"; - source: "over2"; - action: STATE_SET "selected" 0.0; - target: "background"; - target: "focus_highlight"; - target: "elm.thumbnail"; - } - program { name: "mouse_out"; - signal: "mouse,out"; - source: "over2"; - action: STATE_SET "default" 0.0; - target: "background"; - target: "focus_highlight"; - target: "elm.thumbnail"; - } - program { name: "mouse_in_delete"; - signal: "mouse,in"; - source: "over3"; - action: STATE_SET "over" 0.0; - target: "delete_bg"; - target: "elm.deleteButton"; - } - program { name: "mouse_out_delete"; - signal: "mouse,out"; - source: "over3"; - action: STATE_SET "default" 0.0; - target: "delete_bg"; - target: "elm.deleteButton"; - } - } -} -} diff --git a/services/BookmarksUI/images/ico_delete.png b/services/BookmarksUI/images/ico_delete.png deleted file mode 100644 index 92f42cccdae78c7360bfd8d7015de1e91a8440b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18365 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 diff --git a/services/CMakeLists.txt b/services/CMakeLists.txt index 8952538..1d32393 100644 --- a/services/CMakeLists.txt +++ b/services/CMakeLists.txt @@ -1,9 +1,18 @@ project(services) add_subdirectory(WebKitEngineService) -add_subdirectory(BookmarksUI) +# MERGE_ME +#add_subdirectory(MoreMenuUI) +add_subdirectory(MainUI) +# MERGE_ME +#add_subdirectory(HistoryUI) +#add_subdirectory(TabUI) add_subdirectory(SimpleUI) +#MERGE_ME +#add_subdirectory(SettingsUI) add_subdirectory(SimpleURI) +#MERGE_ME +#add_subdirectory(BookmarkManagerUI) add_subdirectory(StorageService) add_subdirectory(HistoryService) add_subdirectory(PlatformInputManager) diff --git a/services/HistoryService/CMakeLists.txt b/services/HistoryService/CMakeLists.txt index 7acc4b9..0a5dcf7 100644 --- a/services/HistoryService/CMakeLists.txt +++ b/services/HistoryService/CMakeLists.txt @@ -1,8 +1,8 @@ PROJECT(HistoryService) set(HistoryService_SOURCES - src/HistoryService.cpp - src/HistoryItem.cpp + HistoryService.cpp + HistoryItem.cpp ) set(HistoryService_HEADERS diff --git a/services/HistoryService/src/HistoryItem.cpp b/services/HistoryService/HistoryItem.cpp similarity index 92% rename from services/HistoryService/src/HistoryItem.cpp rename to services/HistoryService/HistoryItem.cpp index ac61514..1d9ce89 100644 --- a/services/HistoryService/src/HistoryItem.cpp +++ b/services/HistoryService/HistoryItem.cpp @@ -32,6 +32,7 @@ HistoryItem::HistoryItem(const std::string & url, : m_url(url) , m_title(title) , m_favIcon(image) + , m_lastVisit() { } @@ -141,6 +142,17 @@ std::shared_ptr HistoryItem::getFavIcon() return m_favIcon; } +void HistoryItem::setThumbnail(std::shared_ptr thumbnail) +{ + m_thumbnail = thumbnail; +}; + +std::shared_ptr HistoryItem::getThumbnail() const +{ + + return m_thumbnail; +}; + void HistoryItem::setUriFavicon(const std::string & uri) { m_urifavicon = uri; } diff --git a/services/HistoryService/HistoryItem.h b/services/HistoryService/HistoryItem.h index 98049c0..1d1e7ab 100644 --- a/services/HistoryService/HistoryItem.h +++ b/services/HistoryService/HistoryItem.h @@ -34,7 +34,9 @@ public: std::shared_ptr image); HistoryItem(HistoryItem && other) throw(); + HistoryItem(const std::string& url); + HistoryItem(const std::string& url, int& date_created); HistoryItem(const HistoryItem& source); virtual ~HistoryItem(); @@ -64,7 +66,10 @@ public: void setVisitCounter(int visitCounter); int getVisitCounter(); - void setFavIcon(std::shared_ptr favIcon); + void setThumbnail(std::shared_ptr thumbnail); + std::shared_ptr getThumbnail() const ; + + void setFavIcon(std::shared_ptr favIcon); std::shared_ptr getFavIcon(); void setUriFavicon(const std::string & uri); @@ -77,6 +82,7 @@ private: std::string m_title; boost::gregorian::date m_visitDate; boost::posix_time::ptime m_lastVisit; + std::shared_ptr m_thumbnail; std::shared_ptr m_favIcon; std::string m_urifavicon; int m_visitCounter; diff --git a/services/HistoryService/HistoryService.cpp b/services/HistoryService/HistoryService.cpp new file mode 100644 index 0000000..f2ebbfb --- /dev/null +++ b/services/HistoryService/HistoryService.cpp @@ -0,0 +1,396 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include +#include +#include + +#include "ServiceManager.h" +#include "HistoryService.h" +#include "HistoryItem.h" +#include "AbstractWebEngine.h" +#include "EflTools.h" + + + + +namespace tizen_browser +{ +namespace services +{ + +EXPORT_SERVICE(HistoryService, DOMAIN_HISTORY_SERVICE) + +HistoryService::HistoryService() : m_testDbMod(false) +{ + BROWSER_LOGD("HistoryService"); +} + +HistoryService::~HistoryService() +{ +} + +std::shared_ptr HistoryService::getStorageManager() +{ + if (!m_storageManager) { + m_storageManager = std::dynamic_pointer_cast < + tizen_browser::services::StorageService, + tizen_browser::core::AbstractService > ( + tizen_browser::core::ServiceManager::getInstance().getService( + DOMAIN_STORAGE_SERVICE)); + } + + M_ASSERT(m_storageManager); + m_storageManager->init(m_testDbMod); + + return m_storageManager; +} + +void HistoryService::setStorageServiceTestMode(bool testmode) { + m_testDbMod = testmode; +} + +int HistoryService::getHistoryItemsCount(){ + int *ids = nullptr; + int count=0; + bp_history_rows_cond_fmt conds; + conds.limit = 20; //no of rows to get negative means no limitation + conds.offset = -1; //the first row's index + conds.order_offset =BP_HISTORY_O_DATE_CREATED; // property to sort + conds.ordering = 1; //way of ordering 0 asc 1 desc + conds.period_offset = BP_HISTORY_O_DATE_CREATED; + conds.period_type = BP_HISTORY_DATE_TODAY; + int ret = bp_history_adaptor_get_cond_ids_p(&ids ,&count, &conds, 0, nullptr, 0); + if (ret<0){ + BROWSER_LOGD("Error! Could not get ids!"); + } + + BROWSER_LOGD("[%s:%d] History Count %d", __PRETTY_FUNCTION__, __LINE__, count); + return count; +} + +static int __get_duplicated_ids_p(int **ids, int *count, const int limit, const int offset, + const bp_history_offset order_column_offset, const int ordering, + const bp_history_offset check_column_offset, + const char *keyword, const int is_like) +{ + bp_history_rows_cond_fmt conds; + conds.limit = limit; + conds.offset = offset; + conds.ordering = ordering; + conds.order_offset = order_column_offset; + conds.period_offset = BP_HISTORY_O_DATE_CREATED; + conds.period_type = BP_HISTORY_DATE_ALL; + + return bp_history_adaptor_get_cond_ids_p(ids, count, &conds, check_column_offset, keyword, is_like); +} + +bool isDuplicate(const char* title) +{ + int *ids=nullptr; + int count=0; + bp_history_rows_cond_fmt conds; + conds.limit = 20; //no of rows to get negative means no limitation + conds.offset = -1; //the first row's index + conds.order_offset =BP_HISTORY_O_DATE_CREATED; // property to sort + conds.ordering = 1; //way of ordering 0 asc 1 desc + conds.period_offset = BP_HISTORY_O_DATE_CREATED; + conds.period_type = BP_HISTORY_DATE_TODAY; + int ret = bp_history_adaptor_get_cond_ids_p(&ids ,&count, &conds, 0, nullptr, 0); + if (ret<0){ + BROWSER_LOGD("Error! Could not get ids!"); + } + + bp_history_offset offset = (BP_HISTORY_O_URL | BP_HISTORY_O_TITLE | BP_HISTORY_O_FAVICON | BP_HISTORY_O_DATE_CREATED); + + for(int i = 0; i< count; i++){ + bp_history_info_fmt history_info; + bp_history_adaptor_get_info(ids[i],offset,&history_info); + if(!strcmp(history_info.title, title)) { + int freq; + bp_history_adaptor_get_frequency(ids[i], &freq); + bp_history_adaptor_set_frequency(ids[i], freq + 1); + return true; + } + } + return false; + +} + + +HistoryItemVector& HistoryService::getMostVisitedHistoryItems() +{ + history_list.clear(); + + int *ids=nullptr; + int count=-1; + bp_history_rows_cond_fmt conds; + conds.limit = 20; //no of rows to get negative means no limitation + conds.offset = -1; //the first row's index + conds.order_offset =BP_HISTORY_O_DATE_CREATED; // property to sort + conds.ordering = 1; //way of ordering 0 asc 1 desc + conds.period_offset = BP_HISTORY_O_DATE_CREATED; + conds.period_type = BP_HISTORY_DATE_TODAY; + + int ret = bp_history_adaptor_get_cond_ids_p(&ids ,&count, &conds, 0, nullptr, 0); + if (ret<0){ + BROWSER_LOGD("Error! Could not get ids!"); + } + + bp_history_offset offset = (BP_HISTORY_O_URL | BP_HISTORY_O_TITLE | BP_HISTORY_O_FAVICON | BP_HISTORY_O_DATE_CREATED); + + int freq_arr[1000]; + for(int i = 0; i< count; i++){ + bp_history_info_fmt history_info; + bp_history_adaptor_get_info(ids[i],offset,&history_info); + + int freq; + if (0 == bp_history_adaptor_get_frequency(ids[i], &freq)) + { + freq_arr[i] = freq; + } + } + + int index_array[6]; + int j=0; + int maximum = freq_arr[0]; + int position = 0; + + for(int k=1; k<=5;k++){ + if(k > count || count == 0) + break; + + maximum = freq_arr[0]; + position = 0; + + for(int i =1;i maximum) + { + maximum = freq_arr[i]; + position = i; + } + } + index_array[j++] = position; + freq_arr[position] = -1; + } + + for(int i = 0; i < j; i++){ + bp_history_info_fmt history_info; + bp_history_adaptor_get_info(ids[index_array[i]],offset,&history_info); + + std::shared_ptr history = std::make_shared(std::string(history_info.url)); + history->setUrl(std::string(history_info.url ? history_info.url : "")); + history->setTitle(std::string(history_info.title ? history_info.title : "")); + + //thumbail + std::shared_ptr hi = std::make_shared(); + hi->imageType = tizen_browser::tools::BrowserImage::ImageType::ImageTypePNG; + hi->width = history_info.thumbnail_width; + hi->height = history_info.thumbnail_height; + hi->dataSize = history_info.thumbnail_length; + hi->imageData = (void*)malloc(history_info.thumbnail_length); + memcpy(hi->imageData, (void*)history_info.thumbnail, history_info.thumbnail_length); + history->setThumbnail(hi); + + history_list.push_back(history); + } + free(ids); + return history_list; +} + +void HistoryService::addHistoryItem(std::shared_ptr his,std::shared_ptr thumbnail){ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + his->setFavIcon(his->getFavIcon()); + his->setThumbnail(thumbnail); + + if(isDuplicate(his->getTitle().c_str())) + return; + + int id = -1; + int ret = bp_history_adaptor_create(&id); + if (ret<0){ + BROWSER_LOGE("Error! Could not create new bookmark!"); + } + + int *ids=nullptr; + int count=-1; + bp_history_rows_cond_fmt conds; + conds.limit = 20; //no of rows to get negative means no limitation + conds.offset = -1; //the first row's index + conds.order_offset =BP_HISTORY_O_DATE_CREATED; // property to sort + conds.ordering = 1; //way of ordering 0 asc 1 desc + conds.period_offset = BP_HISTORY_O_DATE_CREATED; + conds.period_type = BP_HISTORY_DATE_TODAY; + + ret = bp_history_adaptor_get_cond_ids_p(&ids ,&count, &conds, 0, nullptr, 0); + if (ret<0){ + BROWSER_LOGE("Error! Could not get ids!"); + } + + bp_history_adaptor_set_url(id, (his->getUrl()).c_str()); + bp_history_adaptor_set_title(id, (his->getTitle()).c_str()); + bp_history_adaptor_set_date_visited(id,-1); + bp_history_adaptor_set_frequency(id, 1); + + if (thumbnail) { + std::unique_ptr thumb_blob = tizen_browser::tools::EflTools::getBlobPNG(thumbnail); + unsigned char * thumb = std::move((unsigned char*)thumb_blob->getData()); + bp_history_adaptor_set_snapshot(id, thumbnail->width, thumbnail->height, thumb, thumb_blob->getLength()); + } + + std::shared_ptr favicon = his->getFavIcon(); + if (favicon) { + std::unique_ptr favicon_blob = tizen_browser::tools::EflTools::getBlobPNG(favicon); + unsigned char * fav = std::move((unsigned char*)favicon_blob->getData()); + bp_history_adaptor_set_icon(id, favicon->width, favicon->height, fav, favicon_blob->getLength()); + } + + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + historyAdded(his); +} + + +void HistoryService::insertOrRefresh(std::shared_ptr hi) { + /** + * No browser- provider implementation till now. Needs to be done + */ + //getStorageManager()->insertOrRefresh(hi); +} + +/** + * @throws HistoryException on error + */ +void HistoryService::clearAllHistory() +{ + bp_history_adaptor_reset(); + history_list.clear(); + historyAllDeleted(); +} + +int HistoryService::getHistoryId(const std::string & url) +{ + bp_history_rows_cond_fmt conds; + conds.limit = -1; + conds.offset = 0; + conds.order_offset = BP_HISTORY_O_DATE_CREATED; + conds.ordering = 0; + conds.period_offset = BP_HISTORY_O_DATE_CREATED; + conds.period_type = BP_HISTORY_DATE_ALL; + int *ids = nullptr; + int ids_count = 0; + int ret = bp_history_adaptor_get_cond_ids_p(&ids ,&ids_count, &conds, BP_HISTORY_O_URL, url.c_str(), 0); + if (ids_count!=0){ + int i = *ids; + free(ids); + return i; + } + return 0; +} + + +/** + * @throws HistoryException on error + */ +void HistoryService::clearURLHistory(const std::string & url) +{ + int id = getHistoryId(url); + if (id!=0) + bp_history_adaptor_delete(id); + if(0 == getHistoryItemsCount()) + historyEmpty(true); + historyDeleted(url); +} + + +HistoryItemVector& HistoryService::getHistoryItems(int historyDepthInDays, int maxItems) +{ + history_list.clear(); + + int *ids=nullptr; + int count=-1; + bp_history_rows_cond_fmt conds; + conds.limit = 20; //no of rows to get negative means no limitation + conds.offset = -1; //the first row's index + conds.order_offset =BP_HISTORY_O_DATE_CREATED; // property to sort + conds.ordering = 1; //way of ordering 0 asc 1 desc + conds.period_offset = BP_HISTORY_O_DATE_CREATED; + conds.period_type = BP_HISTORY_DATE_TODAY; + + int ret = bp_history_adaptor_get_cond_ids_p(&ids ,&count, &conds, 0, nullptr, 0); + if (ret<0){ + BROWSER_LOGD("Error! Could not get ids!"); + } + + bp_history_offset offset = (BP_HISTORY_O_URL | BP_HISTORY_O_TITLE | BP_HISTORY_O_FAVICON | BP_HISTORY_O_DATE_CREATED); + + for(int i = 0; i< count; i++){ + bp_history_info_fmt history_info; + bp_history_adaptor_get_info(ids[i],offset,&history_info); + + int date; + bp_history_adaptor_get_date_created(ids[i], &date); + + struct tm *item_time_info; + time_t item_time = (time_t)date; + item_time_info = localtime(&item_time); + + int m_year = item_time_info->tm_year; + int m_month = item_time_info->tm_mon + 1; + int m_day = item_time_info->tm_yday; + int m_month_day = item_time_info->tm_mday; + int m_date = date; + int min = item_time_info->tm_min; + int hour= item_time_info->tm_hour; + int sec = item_time_info->tm_sec; + + m_year = 2000 + m_year % 100; + + std::shared_ptr history = std::make_shared(std::string(history_info.url)); + boost::gregorian::date d(m_year,m_month,m_month_day); + boost::posix_time::ptime t(d,boost::posix_time::time_duration(hour,min,sec)); + history->setLastVisit(t); + history->setUrl(std::string(history_info.url ? history_info.url : "")); + history->setTitle(std::string(history_info.title ? history_info.title : "")); + + //thumbail + std::shared_ptr hi = std::make_shared(); + hi->imageType = tizen_browser::tools::BrowserImage::ImageType::ImageTypePNG; + hi->width = history_info.thumbnail_width; + hi->height = history_info.thumbnail_height; + hi->dataSize = history_info.thumbnail_length; + hi->imageData = (void*)malloc(history_info.thumbnail_length); + memcpy(hi->imageData, (void*)history_info.thumbnail, history_info.thumbnail_length); + history->setThumbnail(hi); + + history_list.push_back(history); + } + free(ids); + return history_list; +} + +int HistoryService::getHistoryVisitCounter(const std::string & url) +{ /** + * No browser- provider implementation till now. Needs to be done + */ +// return getStorageManager()->getHistoryVisitCounter(url); + +} + +} +} diff --git a/services/HistoryService/HistoryService.h b/services/HistoryService/HistoryService.h index 0e09cab..3f2c44e 100644 --- a/services/HistoryService/HistoryService.h +++ b/services/HistoryService/HistoryService.h @@ -44,10 +44,12 @@ public: virtual std::string getName(); int getHistoryId(const std::string & url); + /** * @throws HistoryException on error */ - void addHistoryItem(std::shared_ptr hi); + void addHistoryItem(std::shared_ptr hi, + std::shared_ptr thumbnail=std::shared_ptr()); /** * If hi->getUrl() exists on a table HISTORY update visit_counter and visit_date, unless insert hi to database. @@ -75,6 +77,7 @@ public: * @throws HistoryException on error */ HistoryItemVector & getHistoryItems(int historyDepthInDays = 7, int maxItems = 50); + HistoryItemVector & getMostVisitedHistoryItems(); /** * @throws HistoryException on error @@ -89,6 +92,10 @@ public: void setStorageServiceTestMode(bool testmode = true); boost::signals2::signalhistoryEmpty; + boost::signals2::signal)> historyAdded; + boost::signals2::signal historyDeleted; + boost::signals2::signal historyAllDeleted; + private: bool m_testDbMod;; std::vector> history_list; diff --git a/services/HistoryService/src/HistoryService.cpp b/services/HistoryService/src/HistoryService.cpp deleted file mode 100644 index 5aff218..0000000 --- a/services/HistoryService/src/HistoryService.cpp +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * 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. - */ - -#include -#include -#include -#include -#include -#include - -#include "ServiceManager.h" -#include "HistoryService.h" -#include "HistoryItem.h" -#include "AbstractWebEngine.h" -#include "EflTools.h" - -namespace tizen_browser -{ -namespace services -{ - -EXPORT_SERVICE(HistoryService, DOMAIN_HISTORY_SERVICE) - -HistoryService::HistoryService() : m_testDbMod(false) -{ - BROWSER_LOGD("HistoryService"); -} - -HistoryService::~HistoryService() -{ -} - -std::shared_ptr HistoryService::getStorageManager() -{ - if (!m_storageManager) { - m_storageManager = std::dynamic_pointer_cast < - tizen_browser::services::StorageService, - tizen_browser::core::AbstractService > ( - tizen_browser::core::ServiceManager::getInstance().getService( - DOMAIN_STORAGE_SERVICE)); - } - - M_ASSERT(m_storageManager); - m_storageManager->init(m_testDbMod); - - return m_storageManager; -} - -void HistoryService::setStorageServiceTestMode(bool testmode) { - m_testDbMod = testmode; -} - -int HistoryService::getHistoryItemsCount(){ - return history_list.size(); -} - -static int __get_duplicated_ids_p(int **ids, int *count, const int limit, const int offset, - const bp_history_offset order_column_offset, const int ordering, - const bp_history_offset check_column_offset, - const char *keyword, const int is_like) -{ - bp_history_rows_cond_fmt conds; - memset(&conds, 0x00, sizeof(bp_history_rows_cond_fmt)); - - conds.limit = limit; - conds.offset = offset; - conds.ordering = ordering; - conds.order_offset = order_column_offset; - conds.period_offset = BP_HISTORY_O_DATE_CREATED; - conds.period_type = BP_HISTORY_DATE_ALL; - - return bp_history_adaptor_get_cond_ids_p - (ids, count, - &conds, - check_column_offset, - keyword, - is_like); -} - -void HistoryService::addHistoryItem(std::shared_ptr his){ - - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - his->setFavIcon(his->getFavIcon()); - std::shared_ptr favicon = his->getFavIcon(); - - int id = -1; - int ret = bp_history_adaptor_create(&id); - if (ret<0){ - BROWSER_LOGE("Error! Could not create new bookmark!"); - } - - int *ids=NULL; - int count=-1; - int **id1=&ids; - int *count1=&count; - - bp_history_rows_cond_fmt conds; - conds.limit = 20; //no of rows to get negative means no limitation - - conds.offset = -1; //the first row's index - conds.order_offset =BP_HISTORY_O_DATE_CREATED; // property to sort - - conds.ordering = 1; //way of ordering 0 asc 1 desc - - conds.period_offset = BP_HISTORY_O_DATE_CREATED; - conds.period_type = BP_HISTORY_DATE_TODAY; - - ret = bp_history_adaptor_get_cond_ids_p(id1 ,count1, &conds, 0, NULL, 0); - if (ret<0){ - BROWSER_LOGE("Error! Could not get ids!"); - } - - bp_history_adaptor_set_url(id, (his->getUrl()).c_str()); - bp_history_adaptor_set_title(id, (his->getTitle()).c_str()); - bp_history_adaptor_set_date_visited(id,-1); - - std::unique_ptr favicon_blob = tizen_browser::tools::EflTools::getBlobPNG(favicon); - unsigned char * fav = std::move((unsigned char*)favicon_blob->getData()); - bp_history_adaptor_set_icon(id, favicon->width, favicon->height, fav, favicon_blob->getLength()); - history_list.push_back(his); - - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); -} - - -void HistoryService::insertOrRefresh(std::shared_ptr hi) { - getStorageManager()->insertOrRefresh(hi); -} - -/** - * @throws HistoryException on error - */ -void HistoryService::clearAllHistory() -{ - bp_history_adaptor_reset(); - history_list.clear(); -} - -int HistoryService::getHistoryId(const std::string & url) -{ - bp_history_rows_cond_fmt conds; - conds.limit = -1; - conds.offset = 0; - conds.order_offset = BP_HISTORY_O_DATE_CREATED; - conds.ordering = 0; - conds.period_offset = BP_HISTORY_O_DATE_CREATED; - conds.period_type = BP_HISTORY_DATE_ALL; - int *ids = 0; - int ids_count = 0; - int ret = bp_history_adaptor_get_cond_ids_p(&ids ,&ids_count, &conds, BP_HISTORY_O_URL, url.c_str(), 0); - if (ids_count!=0){ - int i = *ids; - free(ids); - return i; - } - return 0; -} - -/** - * @throws HistoryException on error - */ -void HistoryService::clearURLHistory(const std::string & url) -{ - int id = getHistoryId(url); - if (id != 0) - bp_history_adaptor_delete(id); - if (0 == (getHistoryItemsCount() - 1)) { - historyEmpty(true); - history_list.clear(); - } -} - - -HistoryItemVector& HistoryService::getHistoryItems(int historyDepthInDays, int maxItems) -{ - history_list.clear(); - - int *ids=NULL; - int count=-1; - int **id1=&ids; - int *count1=&count; - - bp_history_rows_cond_fmt conds; - conds.limit = 20; //no of rows to get negative means no limitation - - conds.offset = -1; //the first row's index - conds.order_offset =BP_HISTORY_O_DATE_CREATED; // property to sort - - conds.ordering = 1; //way of ordering 0 asc 1 desc - - conds.period_offset = BP_HISTORY_O_DATE_CREATED; - - conds.period_type = BP_HISTORY_DATE_TODAY; - - int ret = bp_history_adaptor_get_cond_ids_p(id1 ,count1, &conds, 0, NULL, 0); - if (ret<0){ - BROWSER_LOGD("Error! Could not get ids!"); - } - - bp_history_offset offset = (BP_HISTORY_O_URL | BP_HISTORY_O_TITLE | BP_HISTORY_O_FAVICON | BP_HISTORY_O_DATE_CREATED); - - for(int i = 0; i< (*count1); i++){ - bp_history_info_fmt history_info; - bp_history_adaptor_get_info(ids[i],offset,&history_info); - - int date; - bp_history_adaptor_get_date_created(ids[i], &date); - - struct tm *item_time_info; - time_t item_time = (time_t)date; - item_time_info = localtime(&item_time); - - int m_year = item_time_info->tm_year; - int m_month = item_time_info->tm_mon + 1; - int m_day = item_time_info->tm_yday; - int m_month_day = item_time_info->tm_mday; - int m_date = date; - int min = item_time_info->tm_min; - int hour= item_time_info->tm_hour; - int sec = item_time_info->tm_sec; - m_year = 2000 + m_year % 100; - - std::shared_ptr history = std::make_shared(std::string(history_info.url)); - boost::gregorian::date d(m_year,m_month,m_month_day); - boost::posix_time::ptime t(d,boost::posix_time::time_duration(hour,min,sec)); - history->setLastVisit(t); - history->setUrl(std::string(history_info.url ? history_info.url : "")); - history->setTitle(std::string(history_info.title ? history_info.title : "")); - history_list.push_back(history); - } - ids = NULL; - free(ids); - - return history_list; -} - -int HistoryService::getHistoryVisitCounter(const std::string & url) -{ - return getStorageManager()->getHistoryVisitCounter(url); -} - -} -} diff --git a/services/BookmarksUI/CMakeLists.txt b/services/MainUI/CMakeLists.txt similarity index 62% rename from services/BookmarksUI/CMakeLists.txt rename to services/MainUI/CMakeLists.txt index 1806b0f..fd1710f 100644 --- a/services/BookmarksUI/CMakeLists.txt +++ b/services/MainUI/CMakeLists.txt @@ -1,11 +1,11 @@ -project(BookmarksUI) +project(MainUI) -set(BookmarksUI_SRCS - BookmarksUI.cpp +set(MainUI_SRCS + MainUI.cpp ) -set(BookmarksUI_HEADERS - BookmarksUI.h +set(MainUI_HEADERS + MainUI.h ) include(Coreheaders) @@ -13,7 +13,7 @@ include(EFLHelpers) include_directories(${CMAKE_SOURCE_DIR}/services/FavoriteService) -add_library(${PROJECT_NAME} SHARED ${BookmarksUI_SRCS}) +add_library(${PROJECT_NAME} SHARED ${MainUI_SRCS}) if(TIZEN_BUILD) target_link_libraries(${PROJECT_NAME} ${pkgs_LDFLAGS}) @@ -24,6 +24,6 @@ install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION services/static) include(EDCCompile) -EDJ_TARGET(Bookmarks.edj - ${CMAKE_CURRENT_SOURCE_DIR}/edc/Bookmarks.edc +EDJ_TARGET(MainUI.edj + ${CMAKE_CURRENT_SOURCE_DIR}/edc/MainUI.edc ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/services/MainUI/MainUI.cpp b/services/MainUI/MainUI.cpp new file mode 100644 index 0000000..d45d22c --- /dev/null +++ b/services/MainUI/MainUI.cpp @@ -0,0 +1,559 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include + +#include "MainUI.h" +#include "ServiceManager.h" +#include "BrowserLogger.h" +#include "Tools/EflTools.h" +#include "../Tools/BrowserImage.h" + +#define efl_scale (elm_config_scale_get() / elm_app_base_scale_get()) + +namespace tizen_browser{ +namespace base_ui{ + +EXPORT_SERVICE(MainUI, "org.tizen.browser.mainui") + +typedef struct _HistoryItemData +{ + std::shared_ptr item; + std::shared_ptr mainUI; +} HistoryItemData; + +typedef struct _BookmarkItemData +{ + std::shared_ptr item; + std::shared_ptr mainUI; +} BookmarkItemData; + +struct ItemData{ + tizen_browser::base_ui::MainUI * mainUI; + const char* button_name; + Elm_Object_Item * e_item; +}; + +MainUI::MainUI() + : m_gengrid(nullptr) + , m_genListTop(nullptr) + , m_genListBottom(nullptr) + , m_parent(nullptr) + , m_big_item_class(nullptr) + , m_medium_item_class(nullptr) + , m_small_item_class(nullptr) + , m_bookmark_item_class(nullptr) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + edjFilePath = EDJE_DIR; + edjFilePath.append("MainUI/MainUI.edj"); +} + +MainUI::~MainUI() +{ +} + +void MainUI::show(Evas_Object* parent) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + elm_theme_extension_add(nullptr, edjFilePath.c_str()); + m_layout = elm_layout_add(parent); + elm_layout_file_set(m_layout, edjFilePath.c_str(), "mv_bookmarks"); + evas_object_size_hint_weight_set(m_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(m_layout); + m_parent = m_layout; + + m_genListMVBig = elm_genlist_add(m_layout); + elm_object_part_content_set(m_layout, "elm.swallow.mvBig", m_genListMVBig); + elm_genlist_homogeneous_set(m_genListMVBig, EINA_FALSE); + elm_genlist_multi_select_set(m_genListMVBig, EINA_FALSE); + elm_genlist_select_mode_set(m_genListMVBig, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_genlist_mode_set(m_genListMVBig, ELM_LIST_LIMIT); + evas_object_size_hint_weight_set(m_genListMVBig, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + m_genListMVMedium = elm_genlist_add(m_layout); + elm_object_part_content_set(m_layout, "elm.swallow.mvMedium", m_genListMVMedium); + elm_genlist_homogeneous_set(m_genListMVMedium, EINA_FALSE); + elm_genlist_multi_select_set(m_genListMVMedium, EINA_FALSE); + elm_genlist_select_mode_set(m_genListMVMedium, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_genlist_mode_set(m_genListMVMedium, ELM_LIST_LIMIT); + evas_object_size_hint_weight_set(m_genListMVMedium, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + m_genListMVSmall = elm_genlist_add(m_layout); + elm_object_part_content_set(m_layout, "elm.swallow.mvSmall", m_genListMVSmall); + elm_genlist_homogeneous_set(m_genListMVSmall, EINA_FALSE); + elm_genlist_multi_select_set(m_genListMVSmall, EINA_FALSE); + elm_genlist_select_mode_set(m_genListMVSmall, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_genlist_mode_set(m_genListMVSmall, ELM_LIST_LIMIT); + evas_object_size_hint_weight_set(m_genListMVSmall, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + if (!m_big_item_class) { + m_big_item_class = elm_genlist_item_class_new(); + m_big_item_class->item_style = "big_grid_item"; + m_big_item_class->func.text_get = _grid_text_get; + m_big_item_class->func.content_get = _grid_content_get; + m_big_item_class->func.state_get = nullptr; + m_big_item_class->func.del = nullptr; + } + + if (!m_medium_item_class) { + m_medium_item_class = elm_genlist_item_class_new(); + m_medium_item_class->item_style = "medium_grid_item"; + m_medium_item_class->func.text_get = _grid_text_get; + m_medium_item_class->func.content_get = _grid_content_get; + m_medium_item_class->func.state_get = nullptr; + m_medium_item_class->func.del = nullptr; + } + + if (!m_small_item_class) { + m_small_item_class = elm_genlist_item_class_new(); + m_small_item_class->item_style = "small_grid_item"; + m_small_item_class->func.text_get = _grid_text_get; + m_small_item_class->func.content_get = _grid_content_get; + m_small_item_class->func.state_get = nullptr; + m_small_item_class->func.del = nullptr; + } + + /*evas_object_smart_callback_add(m_genList, "item,focused", focusItem, this); + evas_object_smart_callback_add(m_genList, "item,unfocused", unFocusItem, nullptr);*/ + + + m_gengrid = elm_gengrid_add(m_layout); + //elm_object_part_content_set(m_layout, "elm.swallow.grid", m_gengrid); + + evas_object_smart_callback_add(m_gengrid, "item,focused", focusItem, nullptr); + evas_object_smart_callback_add(m_gengrid, "item,unfocused", unFocusItem, nullptr); + evas_object_smart_callback_add(m_gengrid, "activated", _itemSelected, this); + + if (!m_bookmark_item_class) { + m_bookmark_item_class = elm_gengrid_item_class_new(); + m_bookmark_item_class->item_style = "grid_item"; + m_bookmark_item_class->func.text_get = _grid_bookmark_text_get; + m_bookmark_item_class->func.content_get = _grid_bookmark_content_get; + m_bookmark_item_class->func.state_get = nullptr; + m_bookmark_item_class->func.del = nullptr; + } + + M_ASSERT(m_parent); + elm_theme_extension_add(nullptr, edjFilePath.c_str()); + elm_gengrid_align_set(m_gengrid, 0, 0); + elm_gengrid_select_mode_set(m_gengrid, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_gengrid_multi_select_set(m_gengrid, EINA_FALSE); + elm_gengrid_horizontal_set(m_gengrid, EINA_FALSE); + //elm_gengrid_highlight_mode_set(m_gengrid, EINA_TRUE); + elm_scroller_policy_set(m_gengrid, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_scroller_page_size_set(m_gengrid, 0, 327); + evas_object_size_hint_weight_set(m_gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_gengrid_item_size_set(m_gengrid, 364 * efl_scale, 320 * efl_scale); + + showTopButtons(); + showBottomButton(); +} + + +void MainUI::showTopButtons() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + elm_theme_extension_add(nullptr, edjFilePath.c_str()); + m_genListTop = elm_genlist_add(m_layout); + elm_object_part_content_set(m_layout, "elm.swallow.genlistTop", m_genListTop); + elm_genlist_homogeneous_set(m_genListTop, EINA_FALSE); + elm_genlist_multi_select_set(m_genListTop, EINA_FALSE); + elm_genlist_select_mode_set(m_genListTop, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_genlist_mode_set(m_genListTop, ELM_LIST_LIMIT); + //elm_genlist_decorate_mode_set(m_genListTop, EINA_TRUE); + evas_object_size_hint_weight_set(m_genListTop, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + /*evas_object_smart_callback_add(m_genList, "item,focused", focusItem, this); + evas_object_smart_callback_add(m_genList, "item,unfocused", unFocusItem, nullptr);*/ + + m_itemClassTop = elm_genlist_item_class_new(); + m_itemClassTop->item_style = "top_button_item"; + m_itemClassTop->func.text_get = nullptr; // &listTopItemTextGet; + m_itemClassTop->func.content_get = &listTopItemContentGet; + m_itemClassTop->func.state_get = 0; + m_itemClassTop->func.del = 0; + + ItemData * id = new ItemData; + id->mainUI = this; + Elm_Object_Item* elmItem = elm_genlist_item_append(m_genListTop, //genlist + m_itemClassTop, //item Class + id, + nullptr, //parent item + ELM_GENLIST_ITEM_NONE,//item type + nullptr, + nullptr //data passed to above function + ); + id->e_item = elmItem; + ItemData * id2 = new ItemData; + id2->mainUI = this; + Elm_Object_Item* elmItem2 = elm_genlist_item_append(m_genListTop, //genlist + m_itemClassTop, //item Class + id2, + nullptr, //parent item + ELM_GENLIST_ITEM_NONE,//item type + nullptr, + nullptr //data passed to above function + ); + id2->e_item = elmItem2; + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); +} + +void MainUI::showBottomButton() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + elm_theme_extension_add(nullptr, edjFilePath.c_str()); + m_genListBottom = elm_genlist_add(m_layout); + elm_object_part_content_set(m_layout, "elm.swallow.genlistBottom", m_genListBottom); + elm_genlist_homogeneous_set(m_genListBottom, EINA_FALSE); + elm_genlist_multi_select_set(m_genListBottom, EINA_FALSE); + elm_genlist_select_mode_set(m_genListBottom, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_genlist_mode_set(m_genListBottom, ELM_LIST_LIMIT); + //elm_genlist_decorate_mode_set(m_genListBottom, EINA_TRUE); + evas_object_size_hint_weight_set(m_genListBottom, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + /*evas_object_smart_callback_add(m_genList, "item,focused", focusItem, this); + evas_object_smart_callback_add(m_genList, "item,unfocused", unFocusItem, nullptr);*/ + + m_itemClassBottom = elm_genlist_item_class_new(); + m_itemClassBottom->item_style = "bottom_button_item"; + m_itemClassBottom->func.text_get = nullptr; + m_itemClassBottom->func.content_get = &listItemBottomContentGet; + m_itemClassBottom->func.state_get = 0; + m_itemClassBottom->func.del = 0; + + ItemData * id = new ItemData; + id->mainUI = this; + Elm_Object_Item* elmItem = elm_genlist_item_append(m_genListBottom, //genlist + m_itemClassBottom, //item Class + id, + nullptr, //parent item + ELM_GENLIST_ITEM_NONE,//item type + nullptr, + nullptr //data passed to above function + ); + id->e_item = elmItem; +} + +Evas_Object* MainUI::listTopItemContentGet(void* data, Evas_Object* obj, const char* part) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if(!strcmp(part, "mostvisited_click")) + { + Evas_Object *mvButton = elm_button_add(obj); + elm_object_style_set(mvButton, "invisible_button"); + evas_object_smart_callback_add(mvButton, "clicked", tizen_browser::base_ui::MainUI::_mostVisited_clicked, data); + return mvButton; + } + else if(!strcmp(part, "bookmark_click")) + { + Evas_Object *bmButton = elm_button_add(obj); + elm_object_style_set(bmButton, "invisible_button"); + evas_object_smart_callback_add(bmButton, "clicked", tizen_browser::base_ui::MainUI::_bookmark_clicked, data); + return bmButton; + } + return nullptr; +} + +void MainUI::_mostVisited_clicked(void * data, Evas_Object * /* obj */, void * event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData* itemData = reinterpret_cast(data); + itemData->mainUI->mostVisitedClicked(std::string()); +} + +void MainUI::_bookmark_clicked(void * data, Evas_Object * /* obj */, void * event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData* itemData = reinterpret_cast(data); + itemData->mainUI->bookmarkClicked(std::string()); +} + +void MainUI::_bookmark_manager_clicked(void * data, Evas_Object * /* obj */, void * event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData* itemData = reinterpret_cast(data); + itemData->mainUI->bookmarkManagerClicked(std::string()); +} + +Evas_Object* MainUI::listItemBottomContentGet(void* data, Evas_Object* obj, const char* part) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if(!strcmp(part, "bookmarkmanager_click")) + { + Evas_Object *bmButton = elm_button_add(obj); + elm_object_style_set(bmButton, "invisible_button"); + evas_object_smart_callback_add(bmButton, "clicked", tizen_browser::base_ui::MainUI::_bookmark_manager_clicked, data); + return bmButton; + } + return nullptr; +} + +void MainUI::addHistoryItem(std::shared_ptr hi) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + if (m_map_history_views.size() >= 5) + return; + + HistoryItemData *itemData = new HistoryItemData(); + itemData->item = hi; + itemData->mainUI = std::shared_ptr(this); + Elm_Object_Item* historyView = nullptr; + + switch(m_map_history_views.size()) + { + case 0: + BROWSER_LOGD("%s:%d %s m_map_history_views.size %d", __FILE__, __LINE__, __func__, m_map_history_views.size()); + historyView = elm_genlist_item_append(m_genListMVBig, m_big_item_class, itemData, nullptr, ELM_GENLIST_ITEM_NONE, nullptr, this); + break; + case 1: + case 2: + BROWSER_LOGD("%s:%d %s m_map_history_views.size %d", __FILE__, __LINE__, __func__, m_map_history_views.size()); + historyView = elm_genlist_item_append(m_genListMVMedium, m_medium_item_class, itemData, nullptr, ELM_GENLIST_ITEM_NONE, nullptr, this); + break; + case 3: + case 4: + BROWSER_LOGD("%s:%d %s m_map_history_views.size %d", __FILE__, __LINE__, __func__, m_map_history_views.size()); + historyView = elm_genlist_item_append(m_genListMVSmall, m_small_item_class, itemData, nullptr, ELM_GENLIST_ITEM_NONE, nullptr, this); + break; + } + + m_map_history_views.insert(std::pair(hi->getUrl(),historyView)); + + setEmptyGengrid(false); +} + +void MainUI::addHistoryItems(std::vector > items) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + int i = 0; + for (auto it = items.begin(); it != items.end(); ++it) { + i++; + if (i > 5) break; + addHistoryItem(*it); + } +} + +void MainUI::addBookmarkItem(std::shared_ptr bi) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + BookmarkItemData *itemData = new BookmarkItemData(); + itemData->item = bi; + itemData->mainUI = std::shared_ptr(this); + Elm_Object_Item* bookmarkView = elm_gengrid_item_append(m_gengrid, m_bookmark_item_class, itemData, nullptr, this); + m_map_bookmark_views.insert(std::pair(bi->getAddress(),bookmarkView)); + + // unselect by default + elm_gengrid_item_selected_set(bookmarkView, EINA_FALSE); + + setEmptyGengrid(false); +} + +void MainUI::addBookmarkItems(std::vector > items) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + for (auto it = items.begin(); it != items.end(); ++it) { + addBookmarkItem(*it); + } +} + +char* MainUI::_grid_text_get(void *data, Evas_Object *obj, const char *part) +{ + HistoryItemData *itemData = reinterpret_cast(data); + if (!strcmp(part, "page_title")) { + return strdup(itemData->item->getTitle().c_str()); + } + if (!strcmp(part, "page_url")) { + return strdup(itemData->item->getUrl().c_str()); + } + return strdup(""); +} + +char* MainUI::_grid_bookmark_text_get(void *data, Evas_Object *obj, const char *part) +{ + BookmarkItemData *itemData = reinterpret_cast(data); + if (!strcmp(part, "page_title")) { + return strdup(itemData->item->getTittle().c_str()); + } + if (!strcmp(part, "page_url")) { + return strdup(itemData->item->getAddress().c_str()); + } + return strdup(""); +} + +Evas_Object * MainUI::_grid_content_get(void *data, Evas_Object *obj, const char *part) +{ + BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part); + HistoryItemData *itemData = reinterpret_cast(data); + + if (!strcmp(part, "elm.thumbnail")) { + if (itemData->item->getThumbnail()) { + Evas_Object * thumb = tizen_browser::tools::EflTools::getEvasImage(itemData->item->getThumbnail(), itemData->mainUI->m_parent); + return thumb; + } + else { + return nullptr; + } + } + else if (!strcmp(part, "elm.thumbButton")) { + Evas_Object *thumbButton = elm_button_add(obj); + elm_object_style_set(thumbButton, "thumbButton"); + evas_object_smart_callback_add(thumbButton, "clicked", tizen_browser::base_ui::MainUI::_thumbSelected, data); + return thumbButton; + } + return nullptr; +} + +Evas_Object * MainUI::_grid_bookmark_content_get(void *data, Evas_Object *obj, const char *part) +{ + BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part); + BookmarkItemData *itemData = reinterpret_cast(data); + + if (!strcmp(part, "elm.thumbnail")) { + if (itemData->item->getThumbnail()) { + Evas_Object * thumb = tizen_browser::tools::EflTools::getEvasImage(itemData->item->getThumbnail(), itemData->mainUI->m_parent); + return thumb; + } + else { + return nullptr; + } + } + else if (!strcmp(part, "elm.thumbButton")) { + Evas_Object *thumbButton = elm_button_add(obj); + elm_object_style_set(thumbButton, "thumbButton"); + evas_object_smart_callback_add(thumbButton, "clicked", tizen_browser::base_ui::MainUI::_thumbSelected, data); + return thumbButton; + } + return nullptr; +} + + +void MainUI::_itemSelected(void * data, Evas_Object * /* obj */, void * event_info) +{ + Elm_Object_Item * selected = reinterpret_cast(event_info); + HistoryItemData * itemData = reinterpret_cast(elm_object_item_data_get(selected)); + MainUI * self = reinterpret_cast(data); + + self->historyClicked(itemData->item); +} + +void MainUI::_thumbSelected(void * data, Evas_Object * /* obj */, void * /* event_info */) +{ + HistoryItemData * itemData = reinterpret_cast(data); + itemData->mainUI->historyClicked(itemData->item); +} + +void MainUI::clearHistoryGenlist() +{ + elm_genlist_clear(m_genListMVSmall); + elm_genlist_clear(m_genListMVBig); + elm_genlist_clear(m_genListMVMedium); + m_map_history_views.clear(); + evas_object_hide(elm_object_part_content_get(m_layout, "elm.swallow.mvBig")); + evas_object_hide(elm_object_part_content_get(m_layout, "elm.swallow.mvSmall")); + evas_object_hide(elm_object_part_content_get(m_layout, "elm.swallow.mvMedium")); +} + +void MainUI::showHistoryGenlist() +{ + evas_object_hide(elm_object_part_content_get(m_layout, "elm.swallow.grid")); + elm_object_part_content_unset(m_layout, "elm.swallow.grid"); + elm_object_part_content_set(m_layout, "elm.swallow.mvBig", m_genListMVBig); + elm_object_part_content_set(m_layout, "elm.swallow.mvSmall", m_genListMVSmall); + elm_object_part_content_set(m_layout, "elm.swallow.mvMedium", m_genListMVMedium); +} + +void MainUI::clearBookmarkGengrid() +{ + elm_gengrid_clear(m_gengrid); + m_map_bookmark_views.clear(); + evas_object_hide(elm_layout_content_get(m_layout, "elm.swallow.grid")); +} + +void MainUI::showBookmarkGengrid() +{ + evas_object_hide(elm_object_part_content_get(m_layout, "elm.swallow.mvBig")); + evas_object_hide(elm_object_part_content_get(m_layout, "elm.swallow.mvSmall")); + evas_object_hide(elm_object_part_content_get(m_layout, "elm.swallow.mvMedium")); + elm_object_part_content_unset(m_layout, "elm.swallow.mvBig"); + elm_object_part_content_unset(m_layout, "elm.swallow.mvSmall"); + elm_object_part_content_unset(m_layout, "elm.swallow.mvMedium"); + elm_object_part_content_set(m_layout, "elm.swallow.grid", m_gengrid); +} + +void MainUI::hide() +{ + BROWSER_LOGD("MainUI Hide"); + evas_object_hide(elm_layout_content_get(m_layout, "elm.swallow.genlistTop")); + evas_object_hide(elm_layout_content_get(m_layout, "elm.swallow.genlistBottom")); + evas_object_hide(m_layout); + clearItems(); +} + +void MainUI::clearItems() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + clearHistoryGenlist(); + clearBookmarkGengrid(); + elm_genlist_clear(m_genListTop); + elm_genlist_clear(m_genListBottom); +} + +Evas_Object* MainUI::createNoHistoryLabel() +{ + Evas_Object *label = elm_label_add(m_parent); + elm_object_text_set(label, "No favorite websites."); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + return label; +} + +void MainUI::setEmptyGengrid(bool setEmpty) +{ + if(setEmpty) { + elm_object_part_content_set(m_gengrid, "elm.swallow.empty", createNoHistoryLabel()); + } else { + elm_object_part_content_set(m_gengrid, "elm.swallow.empty", nullptr); + } +} + +void MainUI::focusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,in", "over2"); + + // selected manually + elm_gengrid_item_selected_set(item, EINA_TRUE); +} + +void MainUI::unFocusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,out", "over2"); + + // unselected manually + elm_gengrid_item_selected_set(item, EINA_FALSE); +} + +} +} diff --git a/services/MainUI/MainUI.h b/services/MainUI/MainUI.h new file mode 100644 index 0000000..c0beb25 --- /dev/null +++ b/services/MainUI/MainUI.h @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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 MAINUI_H +#define MAINUI_H + +#include +#include + +#include "AbstractUIComponent.h" +#include "AbstractService.h" +#include "ServiceFactory.h" +#include "service_macros.h" +#include "services/HistoryService/HistoryItem.h" +#include "BookmarkItem.h" + +namespace tizen_browser{ +namespace base_ui{ + +class BROWSER_EXPORT MainUI + : public tizen_browser::interfaces::AbstractUIComponent + , public tizen_browser::core::AbstractService +{ +public: + MainUI(); + ~MainUI(); + void show(Evas_Object *main_layout); + void hide(); + virtual std::string getName(); + void clearHistoryGenlist(); + void clearBookmarkGengrid(); + void showHistoryGenlist(); + void showBookmarkGengrid(); + void showTopButtons(); + void showBottomButton(); + void clearItems(); + + void addHistoryItem(std::shared_ptr); + void addHistoryItems(std::vector >); + void addBookmarkItem(std::shared_ptr); + void addBookmarkItems(std::vector >); + + boost::signals2::signal)> historyClicked; + boost::signals2::signal mostVisitedClicked; + boost::signals2::signal bookmarkClicked; + boost::signals2::signal bookmarkManagerClicked; +private: + static Evas_Object* listItemBottomContentGet(void *data, Evas_Object *obj, const char *part); + static Evas_Object* listTopItemContentGet(void *data, Evas_Object *obj, const char *part); + //static char* listItemTextGet(void *data, Evas_Object *obj, const char *part); + + static char* _grid_text_get(void *data, Evas_Object *obj, const char *part); + static Evas_Object * _grid_content_get(void *data, Evas_Object *obj, const char *part); + static char* _grid_bookmark_text_get(void *data, Evas_Object *obj, const char *part); + static Evas_Object * _grid_bookmark_content_get(void *data, Evas_Object *obj, const char *part); + static void _itemSelected(void * data, Evas_Object * obj, void * event_info); + static void _item_deleted(void *data, Evas_Object *obj); + static void _thumbSelected(void * data, Evas_Object * obj, void * event_info); + static void _deleteBookmark(void *data, Evas_Object *obj, void *event_info); + void setEmptyGengrid(bool setEmpty); + + static void _mostVisited_clicked(void * data, Evas_Object * obj, void * event_info); + static void _bookmark_clicked(void * data, Evas_Object * obj, void * event_info); + static void _bookmark_manager_clicked(void * data, Evas_Object * obj, void * event_info); +private: + Evas_Object *m_genListTop; + Evas_Object *m_genListMVBig; + Evas_Object *m_genListMVMedium; + Evas_Object *m_genListMVSmall; + Elm_Genlist_Item_Class *m_itemClassTop; + Evas_Object *m_genListBottom; + Elm_Genlist_Item_Class *m_itemClassBottom; + Evas_Object *m_gengrid; + Evas_Object *m_layout; + Evas_Object *m_parent; + Elm_Gengrid_Item_Class * m_big_item_class; + Elm_Gengrid_Item_Class * m_medium_item_class; + Elm_Gengrid_Item_Class * m_small_item_class; + Elm_Gengrid_Item_Class * m_bookmark_item_class; + std::multimap m_map_history_views; + std::map m_map_bookmark_views; + bool m_gengridSetup; + std::string edjFilePath; + Evas_Object *createNoHistoryLabel(); + + static void focusItem(void* data, Evas_Object* obj, void* event_info); + static void unFocusItem(void* data, Evas_Object* obj, void* event_info); +}; + +} +} + +#endif // BOOKMARKSUI_H diff --git a/services/MainUI/edc/MainUI.edc b/services/MainUI/edc/MainUI.edc new file mode 100644 index 0000000..8357ec7 --- /dev/null +++ b/services/MainUI/edc/MainUI.edc @@ -0,0 +1,1505 @@ +#define DEBUG_RECT_OVER(over_part, r, g, b) \ + part { name: __CONCAT("dbg_rect_at_", __stringify(__LINE__)); \ + \ +scale:1; \ + type : RECT; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + visible: 1; \ + color: r g b 128; \ + rel1 { to: over_part; relative: 0 0; } \ + rel2 { to: over_part; relative: 1 1; } \ + } \ + } + +collections { + +#define WIDTH 1920 +#define HEIGHT 181 +#define ITEM_WIDTH 374 +#define PARENT_ITEM_HEIGHT 36 + + group{ + name: "elm/button/base/invisible_button"; + parts{ + part{ + name: "button"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + color: 0 0 0 0; + } + } + part{ + name: "over"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "button";} + rel2 { relative: 1.0 1.0;to: "button";} + color: 0 0 0 0; + } + } + } + programs{ + program { + name: "mouse_click"; + signal: "mouse,clicked,1"; + source: "over"; + script { + emit("elm,action,click", ""); + } + } + } + } + +group { name: "elm/button/base/thumbButton"; + images { + image: "ico_delete.png" COMP; + } + parts { + part { name: "elm.swallow.content"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + align: 0.0 0.0; + } + } + } + + programs { + program { name: "mouse,clicked"; + signal: "mouse,down,1"; + source: "elm.swallow.content"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + } +} + +group { name: "mv_bookmarks"; + data { + item: "focus_highlight" "off"; + } + images { + image: "web_shadow.png" COMP; + } + color_classes{ + color_class{ + name: "defaultBgColor"; + color: 18 22 34 255; + } + color_class{ + name: "focusBgColor"; + color: 69 143 255 255; + } + color_class{ + name: "highlightBgColor"; + color: 69 143 255 102; + } + color_class{ + name: "imageHighlight"; + color: 255 255 255 102; + } + color_class{ + name: "focusbtBgColor"; + color: 22 120 224 255; + } + color_class{ + name: "titleTextColor"; + color: 74 74 74 255; + } + color_class{ + name: "focusTextColor"; + color: 255 255 255 255; + } + color_class{ + name: "highlightTextColor"; + color: 255 255 255 51; + } + color_class{ + name: "urlTextColor"; + color: 116 116 116 204; + } + color_class{ + name: "transparent"; + color: 0 0 0 0; + } + } + + parts { + part { name: "genlistTop_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 255 255 255 255; + min: 1920 181; + max: 1920 181; + align: 0.0 0.0; + fixed: 0 0; + rel1 { + relative: 0 0; offset: 0 104; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "gengrid_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 255 255 255 255; + min: 1920 626; + max: 1920 626; + align: 0.0 0.0; + fixed: 0 0; + rel1 { + relative: 0 1; to: "genlistTop_bg"; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "genlistBottom_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 255 255 255 255; + min: 1920 181; + max: 1920 181; + align: 0.0 0.0; + fixed: 0 0; + rel1 { + relative: 0 1; to: "gengrid_bg"; + } + rel2{ + relative: 1 1; + } + } + } + + part { name: "elm.swallow.grid"; + type: SWALLOW; + description { state: "default" 0.0; + min: 1920 614; + max: 1920 614; + align: 0.0 0.0; + fixed: 0 0; + rel1 { + relative: 0 0; to: "gengrid_bg"; offset: 63 0; + } + rel2 { + relative: 1 1; + offset: 0 0; + } + } + } + part { name: "elm.swallow.mvBig"; + type: SWALLOW; + description { state: "default" 0.0; + min: 800 626; + max: 800 626; + align: 0.0 0.0; + fixed: 0 0; + rel1 { + relative: 0 0; to: "gengrid_bg"; offset: 63 0; + } + rel2 { + relative: 1 1; + offset: 0 0; + } + } + } + part { name: "elm.swallow.mvMedium"; + type: SWALLOW; + description { state: "default" 0.0; + min: 600 626; + max: 600 626; + align: 0.0 0.0; + fixed: 0 0; + rel1 { + relative: 0 0; to: "gengrid_bg"; offset: 889 0; + } + rel2{ + relative: 1 1; + offset: 0 0; + } + } + } + part { name: "elm.swallow.mvSmall"; + type: SWALLOW; + description { state: "default" 0.0; + min: 342 626; + max: 342 626; + align: 0.0 0.0; + fixed: 0 0; + rel1 { + relative: 0 0; to: "gengrid_bg"; offset: 1515 0; + } + rel2 { + relative: 1 1; + offset: 0 0; + } + } + } + + part { name: "elm.swallow.genlistTop"; + type: SWALLOW; + description { state: "default" 0.0; + min: 1920 181; + max: 1920 181; + align: 0.0 0.0; + fixed: 0 0; + rel1 { + relative: 0 0; to: "genlistTop_bg"; + } + rel2 { + relative: 1 1; + offset: 0 0; + } + } + } + part { name: "uri_bar_shadow"; + type: IMAGE; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + fixed: 0 0; + min: 1920 14; + max: 1920 14; + image.normal: "web_shadow.png"; + rel1 { relative: 0.0 0.0; to: "elm.swallow.genlistTop"; } + rel2 { relative: 1.0 1.0; } + } + } + part { name: "elm.swallow.genlistBottom"; + type: SWALLOW; + description { state: "default" 0.0; + min: 1920 181; + max: 1920 181; + align: 0.0 0.0; + fixed: 0 0; + rel1 { + relative: 0 0; to: "genlistBottom_bg"; + } + rel2 { + relative: 1 1; + offset: 0 0; + } + } + } + part { name: "elm.swallow.empty"; + type: SWALLOW; + description { state: "default" 0.0; + align: 0.5 0.5; + rel1 { + relative: 0.5 0.5; + } + rel2 { + relative: 0.5 0.5; + } + } + } + } +} + +group { name: "elm/genlist/item/big_grid_item/default"; + data.item: "texts" "page_title page_url"; + data.item: "contents" "elm.thumbnail elm.thumbButton"; + min: 600 614; + max: 600 614; + images { + image: "web_frame_selected.png" COMP; + image: "ico_bg_round_shape_37x37.png" COMP; + } + parts { + part { name: "bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 800 613; + max: 800 613; + visible: 1; + color: 231 231 231 255; + rel1.offset: 0 13; + } + description { state: "selected"; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "elm.thumbnail"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 1 0; + align: 0.0 0.0; + color : 231 231 231 255; + min: 800 526; + max: 800 526; + rel1 { + relative: 0.0 0.0; to: "bg"; + } + rel2 { + relative: 1.0 1.0; to: "bg"; + } + } + description { state: "selected"; + inherit: "default" 0.0; + } + } + + part { name: "focus_highlight"; + type: IMAGE; + description { state: "default" 0.0; + rel1 { + to: "elm.thumbnail"; + relative: 0.0 0.0; + } + rel2 { + to: "elm.thumbnail"; + relative: 1.0 1.0; + } + image.normal: "web_frame_selected.png"; + image.border: 8 8 8 0; + image.border_scale: 1; + image.middle: NONE; + visible: 0; + } + description { state: "selected"; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "background"; + type: RECT; + description { state: "default" 0.0; + min: 800 87; + max: 800 87; + align: 0.0 0.0; + color: 231 231 231 255; + rel1 { + to: "elm.thumbnail"; + relative: 0.0 1.0; + } + rel2 { + relative: 1.0 1.0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "page_title"; + type: TEXT; + description { state: "default" 0.0; + min: 700 48; + max: 700 48; + align: 0.0 0.5; + rel1 { + to: "background"; + relative: 0.0 0.0; + offset: 17 0; + } + rel2 { + to: "background"; + relative: 1.0 1.0; + } + color: 51 51 51 255; + text { + text: "Web page title"; + font: "Sans"; + size: 27; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + //color: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + + part { name: "page_url"; + type: TEXT; + description { state: "default" 0.0; + min: 700 48; + max: 700 48; + align: 0 0.5; + rel1 { + to: "page_title"; + relative: 0.0 1.0; + } + rel2 { + to: "page_title"; + relative: 1.0 1.0; + } + color: 153 153 153 255; + text { + text: "Web page url"; + font: "Sans"; + size: 24; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + //color: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + + part { name: "elm.thumbButton"; + type: SWALLOW; + description { state: "default" 0.0; + rel1.to: "elm.thumbnail"; + rel2.to: "elm.thumbnail"; + } + } + + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "bg"; + rel2.to: "background"; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "background"; + rel2.to: "background"; + } + } + } + + programs{ + program { name: "mouse_in"; + signal: "mouse,in"; + source: "over2"; + action: STATE_SET "selected" 0.0; + target: "background"; + target: "focus_highlight"; + target: "bg"; + } + program { name: "mouse_out"; + signal: "mouse,out"; + source: "over2"; + action: STATE_SET "default" 0.0; + target: "background"; + target: "focus_highlight"; + target: "bg"; + } + } +} + +group { name: "elm/genlist/item/medium_grid_item/default"; + data.item: "texts" "page_title page_url"; + data.item: "contents" "elm.thumbnail elm.thumbButton"; + images { + image: "web_frame_selected.png" COMP; + image: "ico_bg_round_shape_37x37.png" COMP; + } + parts { + part { name: "bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 600 300; + max: 600 300; + visible: 1; + color: 231 231 231 255; + rel1.offset: 0 13; + } + description { state: "selected"; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "elm.thumbnail"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 1 0; + align: 0.0 0.0; + color : 231 231 231 255; + min: 600 203; + max: 600 203; + rel1 { + relative: 0.0 0.0; to: "bg"; + } + rel2 { + relative: 1.0 1.0; to: "bg"; + } + } + description { state: "selected"; + inherit: "default" 0.0; + } + } + + part { name: "focus_highlight"; + type: IMAGE; + description { state: "default" 0.0; + rel1 { + to: "elm.thumbnail"; + relative: 0.0 0.0; + } + rel2 { + to: "elm.thumbnail"; + relative: 1.0 1.0; + } + image.normal: "web_frame_selected.png"; + image.border: 8 8 8 0; + image.border_scale: 1; + image.middle: NONE; + visible: 0; + } + description { state: "selected"; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "background"; + type: RECT; + description { state: "default" 0.0; + min: 600 87; + max: 600 87; + align: 0.0 0.0; + color: 231 231 231 255; + rel1 { + to: "elm.thumbnail"; + relative: 0.0 1.0; + } + rel2 { + relative: 1.0 1.0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "page_title"; + type: TEXT; + description { state: "default" 0.0; + min: 500 48; + max: 500 48; + align: 0.0 0.5; + rel1 { + to: "background"; + relative: 0.0 0.0; + offset: 17 0; + } + rel2 { + to: "background"; + relative: 1.0 1.0; + } + color: 51 51 51 255; + text { + text: "Web page title"; + font: "Sans"; + size: 27; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + //color: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + + part { name: "page_url"; + type: TEXT; + description { state: "default" 0.0; + min: 500 48; + max: 500 48; + align: 0 0.5; + rel1 { + to: "page_title"; + relative: 0.0 1.0; + } + rel2 { + to: "page_title"; + relative: 1.0 1.0; + } + color: 153 153 153 255; + text { + text: "Web page url"; + font: "Sans"; + size: 24; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + //color: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + + part { name: "elm.thumbButton"; + type: SWALLOW; + description { state: "default" 0.0; + rel1.to: "elm.thumbnail"; + rel2.to: "elm.thumbnail"; + } + } + + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "bg"; + rel2.to: "background"; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "background"; + rel2.to: "background"; + } + } + } + + programs{ + program { name: "mouse_in"; + signal: "mouse,in"; + source: "over2"; + action: STATE_SET "selected" 0.0; + target: "background"; + target: "focus_highlight"; + target: "bg"; + } + program { name: "mouse_out"; + signal: "mouse,out"; + source: "over2"; + action: STATE_SET "default" 0.0; + target: "background"; + target: "focus_highlight"; + target: "bg"; + } + } +} + +group { name: "elm/genlist/item/small_grid_item/default"; + data.item: "texts" "page_title page_url"; + data.item: "contents" "elm.thumbnail elm.thumbButton"; + images { + image: "web_frame_selected.png" COMP; + image: "ico_bg_round_shape_37x37.png" COMP; + } + parts { + part { name: "bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 342 300; + max: 342 300; + visible: 1; + color: 231 231 231 255; + rel1.offset: 0 13; + } + description { state: "selected"; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "elm.thumbnail"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 1 0; + align: 0.0 0.0; + color : 231 231 231 255; + min: 342 203; + max: 342 203; + rel1 { + relative: 0.0 0.0; to: "bg"; + } + rel2 { + relative: 1.0 1.0; to: "bg"; + } + } + description { state: "selected"; + inherit: "default" 0.0; + } + } + + part { name: "focus_highlight"; + type: IMAGE; + description { state: "default" 0.0; + rel1 { + to: "elm.thumbnail"; + relative: 0.0 0.0; + } + rel2 { + to: "elm.thumbnail"; + relative: 1.0 1.0; + } + image.normal: "web_frame_selected.png"; + image.border: 8 8 8 0; + image.border_scale: 1; + image.middle: NONE; + visible: 0; + } + description { state: "selected"; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "background"; + type: RECT; + description { state: "default" 0.0; + min: 342 87; + max: 342 87; + align: 0.0 0.0; + color: 231 231 231 255; + rel1 { + to: "elm.thumbnail"; + relative: 0.0 1.0; + } + rel2 { + relative: 1.0 1.0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "page_title"; + type: TEXT; + description { state: "default" 0.0; + min: 320 48; + max: 320 48; + align: 0.0 0.5; + rel1 { + to: "background"; + relative: 0.0 0.0; + offset: 17 0; + } + rel2 { + to: "background"; + relative: 1.0 1.0; + } + color: 51 51 51 255; + text { + text: "Web page title"; + font: "Sans"; + size: 27; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + //color: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + + part { name: "page_url"; + type: TEXT; + description { state: "default" 0.0; + min: 320 48; + max: 320 48; + align: 0 0.5; + rel1 { + to: "page_title"; + relative: 0.0 1.0; + } + rel2 { + to: "page_title"; + relative: 1.0 1.0; + } + color: 153 153 153 255; + text { + text: "Web page url"; + font: "Sans"; + size: 24; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + //color: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + + part { name: "elm.thumbButton"; + type: SWALLOW; + description { state: "default" 0.0; + rel1.to: "elm.thumbnail"; + rel2.to: "elm.thumbnail"; + } + } + + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "bg"; + rel2.to: "background"; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "background"; + rel2.to: "background"; + } + } + } + + programs{ + program { name: "mouse_in"; + signal: "mouse,in"; + source: "over2"; + action: STATE_SET "selected" 0.0; + target: "background"; + target: "focus_highlight"; + target: "bg"; + } + program { name: "mouse_out"; + signal: "mouse,out"; + source: "over2"; + action: STATE_SET "default" 0.0; + target: "background"; + target: "focus_highlight"; + target: "bg"; + } + } +} + +group { name: "elm/gengrid/item/grid_item/default"; + data.item: "texts" "page_title page_url"; + data.item: "contents" "elm.thumbnail elm.thumbButton"; + images { + image: "web_frame_selected.png" COMP; + image: "ico_bg_round_shape_37x37.png" COMP; + } + parts { + part { name: "bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 338 294; + max: 338 294; + visible: 1; + color: 231 231 231 255; + rel1.offset: -26 -26; + } + description { state: "selected"; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "elm.thumbnail"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 1 0; + align: 0.0 0.0; + color : 231 231 231 255; + min: 338 198; + max: 338 198; + rel1 { + relative: 0.0 0.0; to: "bg"; + } + rel2 { + relative: 1.0 1.0; to: "bg"; + } + } + description { state: "selected"; + inherit: "default" 0.0; + } + } + + part { name: "focus_highlight"; + type: IMAGE; + description { state: "default" 0.0; + rel1 { + to: "elm.thumbnail"; + relative: 0.0 0.0; + } + rel2 { + to: "elm.thumbnail"; + relative: 1.0 1.0; + } + image.normal: "web_frame_selected.png"; + image.border: 8 8 8 0; + image.border_scale: 1; + image.middle: NONE; + visible: 0; + } + description { state: "selected"; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "background"; + type: RECT; + description { state: "default" 0.0; + min: 338 87; + max: 338 87; + align: 0.0 0.0; + color: 231 231 231 255; + rel1 { + to: "elm.thumbnail"; + relative: 0.0 1.0; + } + rel2 { + relative: 1.0 1.0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "page_title"; + type: TEXT; + description { state: "default" 0.0; + min: 300 48; + max: 300 48; + align: 0.0 0.5; + rel1 { + to: "background"; + relative: 0.0 0.0; + offset: 17 0; + } + rel2 { + to: "background"; + relative: 1.0 1.0; + } + color: 51 51 51 255; + text { + text: "Web page title"; + font: "Sans"; + size: 27; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + //color: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + + part { name: "page_url"; + type: TEXT; + description { state: "default" 0.0; + min: 300 48; + max: 300 48; + align: 0 0.5; + rel1 { + to: "page_title"; + relative: 0.0 1.0; + } + rel2 { + to: "page_title"; + relative: 1.0 1.0; + } + color: 153 153 153 255; + text { + text: "Web page url"; + font: "Sans"; + size: 24; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + //color: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + + part { name: "elm.thumbButton"; + type: SWALLOW; + description { state: "default" 0.0; + rel1.to: "elm.thumbnail"; + rel2.to: "elm.thumbnail"; + } + } + + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "bg"; + rel2.to: "background"; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "background"; + rel2.to: "background"; + } + } + } + + programs{ + program { name: "mouse_in"; + signal: "mouse,in"; + source: "over2"; + action: STATE_SET "selected" 0.0; + target: "background"; + target: "focus_highlight"; + target: "bg"; + } + program { name: "mouse_out"; + signal: "mouse,out"; + source: "over2"; + action: STATE_SET "default" 0.0; + target: "background"; + target: "focus_highlight"; + target: "bg"; + } + } +} + +group { name: "elm/genlist/item/top_button_item/default"; + min: 1920 181; + max: 1920 181; + data.item: "texts" "mostvisited_text bookmark_text"; + data.item: "contents" "mostvisited_click bookmark_click"; + parts{ + part { + name: "bg_clipper"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + align: 0 0; + min: 1920 181; + max: 1920 181; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + } + } + part { + name: "mostvisited_button"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + color: 192 192 192 255; + align: 0 0; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "bg_clipper"; offset: 611 58;} + rel2 { relative: 1.0 1.0; to: "bg_clipper"; } + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusbtBgColor; + visible: 1; + } + } + part{ + name: "mostvisited_text"; + type: TEXT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "mostvisited_button";} + rel2 { relative: 1.0 1.0;to: "mostvisited_button";} + color: 0 0 0 255; + text { + text: "Most visited"; + font: "Sans"; + size: 27; + align: 0.5 0.5; + } + } + } + part { + name: "mostvisited_over"; + scale:1; + type: RECT; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "mostvisited_button";} + rel2 { relative: 1.0 1.0; to: "mostvisited_button";} + color_class: transparent; + } + } + part { + name: "mostvisited_click"; + scale:1; + type: SWALLOW; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "mostvisited_over";} + rel2 { relative: 1.0 1.0; to: "mostvisited_over";} + } + } + part { + name: "bookmark_button"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + color: 192 192 192 255; + align: 0 0; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "bg_clipper"; offset: 961 58;} + rel2 { relative: 1.0 1.0; to: "bg_clipper"; } + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusbtBgColor; + visible: 1; + } + } + part{ + name: "bookmark_text"; + type: TEXT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "bookmark_button";} + rel2 { relative: 1.0 1.0;to: "bookmark_button";} + color: 0 0 0 255; + text { + text: "Bookmark"; + font: "Sans"; + size: 27; + align: 0.5 0.5; + } + } + } + part { + name: "bookmark_over"; + scale:1; + type: RECT; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "bookmark_button";} + rel2 { relative: 1.0 1.0; to: "bookmark_button";} + color_class: transparent; + } + } + part { + name: "bookmark_click"; + scale:1; + type: SWALLOW; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "bookmark_over";} + rel2 { relative: 1.0 1.0; to: "bookmark_over";} + color_class: transparent; + } + } + + programs{ + program { + name: "mouse_click_mostvisited"; + signal: "mouse,clicked,1"; + source: "mostvisited_over"; + script { + emit("elm,action,click", ""); + } + } + program { + name: "mouse_in_mostvisited_click"; + signal: "mouse,in"; + source: "mostvisited_*"; + action: STATE_SET "highlight" 0.0; + target: "mostvisited_button"; + target: "mostvisited_over"; + target: "mostvisited_text"; + } + program { + name: "mouse_out_mostvisited_click"; + signal: "mouse,out"; + source: "mostvisited_*"; + action: STATE_SET "default" 0.0; + target: "mostvisited_button"; + target: "mostvisited_over"; + target: "mostvisited_text"; + } + program { + name: "mouse_click_bookmark"; + signal: "mouse,clicked,1"; + source: "bookmark_over"; + script { + emit("elm,action,click", ""); + } + } + program { + name: "mouse_in_bookmark_click"; + signal: "mouse,in"; + source: "bookmark_*"; + action: STATE_SET "highlight" 0.0; + target: "bookmark_button"; + target: "bookmark_over"; + target: "bookmark_text"; + } + program { + name: "mouse_out_bookmark_click"; + signal: "mouse,out"; + source: "bookmark_*"; + action: STATE_SET "default" 0.0; + target: "bookmark_button"; + target: "bookmark_over"; + target: "mostvisited_text"; + } + } + } +} + +group { name: "elm/genlist/item/bottom_button_item/default"; + min: 1920 181; + max: 1920 181; + data.item: "texts" "bookmarkmanager_text"; + data.item: "contents" "bookmarkmanager_click"; + parts{ + part { + name: "bg_clipper"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + align: 0 0; + min: 1920 181; + max: 1920 181; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + } + } + part { + name: "bookmarkmanager_button"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + min: 348 65; + max: 348 65; + color: 192 192 192 255; + rel1 { relative: 0.0 0.0; to: "bg_clipper"; offset: 786 58;} + rel2 { relative: 1.0 1.0; to: "bg_clipper"; } + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusbtBgColor; + visible: 1; + } + } + part{ + name: "bookmarkmanager_text"; + type: TEXT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "bookmarkmanager_button";} + rel2 { relative: 1.0 1.0;to: "bookmarkmanager_button";} + color: 0 0 0 255; + text { + text: "Bookmark Manager"; + font: "Sans"; + size: 27; + align: 0.5 0.5; + } + } + } + part { + name: "bookmarkmanager_over"; + scale:1; + type: RECT; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "bookmarkmanager_button";} + rel2 { relative: 1.0 1.0; to: "bookmarkmanager_button";} + color_class: transparent; + } + } + part { + name: "bookmarkmanager_click"; + scale:1; + type: SWALLOW; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "bookmarkmanager_over";} + rel2 { relative: 1.0 1.0; to: "bookmarkmanager_over";} + } + } + } + programs{ + program { + name: "mouse_click_bookmarkmanager"; + signal: "mouse,clicked,1"; + source: "bookmarkmanager_over"; + script { + emit("elm,action,click", ""); + } + } + program { + name: "mouse_in_bookmarkmanager_click"; + signal: "mouse,in"; + source: "bookmarkmanager_*"; + action: STATE_SET "highlight" 0.0; + target: "bookmarkmanager_button"; + target: "bookmarkmanager_over"; + target: "bookmarkmanager_text"; + } + program { + name: "mouse_out_bookmarkmanager_click"; + signal: "mouse,out"; + source: "bookmarkmanager_*"; + action: STATE_SET "default" 0.0; + target: "bookmarkmanager_button"; + target: "bookmarkmanager_over"; + target: "bookmarkmanager_text"; + } + } + } +} diff --git a/services/BookmarksUI/edc/error.edc b/services/MainUI/edc/error.edc similarity index 100% rename from services/BookmarksUI/edc/error.edc rename to services/MainUI/edc/error.edc diff --git a/services/BookmarksUI/images/web_frame_selected.png b/services/MainUI/images/web_frame_selected.png similarity index 100% rename from services/BookmarksUI/images/web_frame_selected.png rename to services/MainUI/images/web_frame_selected.png diff --git a/services/BookmarksUI/images/ico_bg_round_shape_37x37.png b/services/MainUI/images/web_shadow.png similarity index 91% rename from services/BookmarksUI/images/ico_bg_round_shape_37x37.png rename to services/MainUI/images/web_shadow.png index 00182eda393bba8bd7548044060c54661dd2e1bd..f9018b0a6e15ae5670b67d580b890d1950636066 100644 GIT binary patch delta 422 zcmdnn%ebVAQL!_?&z+Y`ii?4Pf!EW+B?w3}0x=&48<2eGTo$uYv6zcdX!BGqGiDA$ z3o9TpGMRjt*ABsvRJMMx=ASpNxBv$#zx7e$%$#n zMk$l`@mVOF86+neC8g;an3$RCrWpg(S*9gh>LwXknx+}18k?jUnoO4DcOXh#4gUk8 z)G-R#BAo6fR6F^bkl5sK!8YPtjjVgKo6sI6M#IT0qUKD7CYx2;uunK%jSq7pMwJf%Ylun1AeWGKmAl{;sWEN2Lx>n%ElbzaVrq3-YA;A@z37Y adl@qre>2b^V%Uel6***Vz= zdi9JaJzX3_DsG*b;jiryC~>U*d&EQ!9UmQ4pS$N1o)~ZVz?oCasj9g#WXTl!c*h@H zS3Hs|HwqdnhZ*;ut$ro6v%IbPeDM3ESu;QXt9tkH&Uc%MDn_fsXKe0j^h~(0DzB6~ zhA}iq>`p*?nQH)<66^)i{4-Fvdu%7E2|X~z-q z*Q|_*wb%c$zrP|9@Rw=k_FE2;J3b0%voil&zU|T6S6kC99X_sNUd%Uxm*vF!wOyOH z*Ltk7khXUUdeczfd0>H>jDd{A6%Un_q6Z2mgq&tPdtgpg>4D&c0Drz6{5-GDF-~uE zjJ15AWU%71N09snffK8jF;0>Bz&3~F(Iw6g&z`T`bT^}W-twdcuM}4u2t24KD|LLi zWG&AQy^MU*2FV5AO5N5oo@U*-T$i`te;)Fy_sn(nNhohmcJD(olyCW`Ll!S t#7e$Mv0r>P>PF{_ABa?(z4RcNVL893?FdKd%4) diff --git a/services/PlatformInputManager/PlatformInputManager.cpp b/services/PlatformInputManager/PlatformInputManager.cpp index e7cc333..4fc5fbc 100644 --- a/services/PlatformInputManager/PlatformInputManager.cpp +++ b/services/PlatformInputManager/PlatformInputManager.cpp @@ -170,8 +170,9 @@ Eina_Bool PlatformInputManager::__filter(void *data, void */*loop_data*/, int ty self->rightPressed(); else if(!keyName.compare("KEY_ENTER")) self->enterPressed(); -// else if(!keyName.compare("BackSpace")) -// self->backPressed(); + // MERGE_ME dont know if should be commented out + else if(!keyName.compare("BackSpace")) + self->backPressed(); } else if(type == ECORE_EVENT_KEY_UP) { M_ASSERT(event); Ecore_Event_Key *ev = static_cast(event); diff --git a/services/SimpleUI/BookmarksManager.cpp b/services/SimpleUI/BookmarksManager.cpp new file mode 100644 index 0000000..8d82016 --- /dev/null +++ b/services/SimpleUI/BookmarksManager.cpp @@ -0,0 +1,411 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include "BookmarksManager.h" +#include +#include +#include +#include +#include +#include "BrowserLogger.h" + +namespace tizen_browser +{ +namespace base_ui +{ + +BookmarksManagerItem::BookmarksManagerItem() + : action(std::make_shared()) +{ + +} +BookmarksManagerItem::BookmarksManagerItem( std::shared_ptr action) + : action(action) +{ + +} + + +BookmarksManagerItem::BookmarksManagerItem(const BookmarksManagerItem& source) + : action(source.action) +{ + +} +BookmarksManagerItem::BookmarksManagerItem(const BookmarksManagerItem* source) + : action(source->action) +{ + +} + + +BookmarksManagerItem::~BookmarksManagerItem() +{ + //elm_genlist_item_class_free(m_itemClass);?? +} + +BookmarksManager::BookmarksManager(std::shared_ptr< Evas_Object > mainWindow, Evas_Object* parentButton) + : MenuButton(mainWindow, parentButton) + , m_popup (nullptr) + , m_isPopupShown (false) + , m_genlist(nullptr) + , m_itemClass(nullptr) + , m_internalPopup(nullptr) + , m_internalPopupVisible(false) + , m_pointerModeEnabled(true) +{ + std::string edjFilePath = EDJE_DIR; + edjFilePath.append("SimpleUI/BookmarksManager.edj"); + elm_theme_extension_add(0, edjFilePath.c_str()); + + m_genlist = elm_genlist_add(m_window.get()); + + evas_object_smart_callback_add(m_genlist, "item,focused", focusItem, nullptr); + evas_object_smart_callback_add(m_genlist, "item,unfocused", unFocusItem, nullptr); + + elm_object_style_set(m_genlist, "bookmarks_manager"); + elm_genlist_homogeneous_set(m_genlist, EINA_TRUE); + elm_genlist_multi_select_set(m_genlist, EINA_FALSE); + + elm_genlist_select_mode_set(m_genlist, ELM_OBJECT_SELECT_MODE_ALWAYS); + + m_itemClass = elm_genlist_item_class_new(); + m_itemClass->item_style = "bookmarks_manager_item"; + + m_itemClass->func.text_get = &gridTextGet; + m_itemClass->func.content_get = &gridOptionLabelGet; + m_itemClass->func.state_get = 0; + m_itemClass->func.del = 0; +} + +BookmarksManager::~BookmarksManager() +{ + +} + +Evas_Object* BookmarksManager::getContent() +{ + return m_genlist; +} + +tizen_browser::base_ui::MenuButton::ListSize BookmarksManager::calculateSize() +{ + ListSize result; + + result.width = 490; + result.height = 426; + + return result; +} + +Evas_Object* BookmarksManager::getFirstFocus() +{ + return m_genlist; +} + +void BookmarksManager::addAction(sharedAction action) +{ + std::shared_ptr bookmarks_managerItem = std::make_shared(action); + BROWSER_LOGD("[%s] %x: %s", __func__ , bookmarks_managerItem.get(), bookmarks_managerItem->action->getText().c_str() ); + Elm_Object_Item* elmItem= elm_genlist_item_append(m_genlist, //genlist + m_itemClass, //item Class + bookmarks_managerItem.get(), //item data + 0, //parent item + ELM_GENLIST_ITEM_NONE,//item type + itemClicked, + this + ); + m_bookmarks_managerItemsMap[elmItem] = bookmarks_managerItem; + BROWSER_LOGD("[%s:%d] \n\t %x:%s ", __PRETTY_FUNCTION__, __LINE__, elmItem, bookmarks_managerItem->action->getText().c_str()); + if(!bookmarks_managerItem->action->isEnabled()){ + elm_object_item_disabled_set(elmItem, EINA_TRUE); + } + if(bookmarks_managerItem->action->isCheckable()){ + elm_object_item_signal_emit(elmItem, + (bookmarks_managerItem->action->isChecked() ? "switch,on" : "switch,off") + , "BookmarksManagerModel"); + } else { + elm_object_item_signal_emit(elmItem, "switch,hide", "BookmarksManagerModel"); + } + action->enabledChanged.connect(boost::bind(&BookmarksManager::onEnabledChanged, this, action)); + m_actionButtonMap[action] = elmItem; +} + +void BookmarksManager::onEnabledChanged(sharedAction action) +{ + BROWSER_LOGD("[%s]", __func__); + refreshAction(action); +} + +void BookmarksManager::refreshAction(sharedAction action) +{ + BROWSER_LOGD("[%s]", __func__); + if(action->isEnabled()) + elm_object_item_disabled_set(m_actionButtonMap[action], EINA_FALSE); + else + elm_object_item_disabled_set(m_actionButtonMap[action], EINA_TRUE); +} + +char* BookmarksManager::gridTextGet(void* data, Evas_Object* /*obj*/, const char* part) +{ + BROWSER_LOGD("[%s]", __func__); + BookmarksManagerItem *bookmarks_managerItem =reinterpret_cast(data); + if(!strcmp(part, "optionName")){ + if(!bookmarks_managerItem->action->getText().empty()){ + return strdup(bookmarks_managerItem->action->getText().c_str()); + } + } + return strdup(""); +} + +Evas_Object* BookmarksManager::gridOptionLabelGet(void* data, Evas_Object* obj, const char* part) +{ + BookmarksManagerItem *bookmarks_managerItem =reinterpret_cast(data); + if(!strcmp(part, "optionValue")){ + if(bookmarks_managerItem->action->isEnabled() && bookmarks_managerItem->action->isCheckable()){ + Evas_Object *label = elm_label_add(obj); + elm_object_text_set(label, (bookmarks_managerItem->action->isChecked() ? "On" :"Off" )); + elm_object_style_set(label, "bookmarks_manager_label"); + return label; + } + } + return nullptr; + +} + +void BookmarksManager::itemClicked(void* data, Evas_Object* /*o*/, void* event_info) +{ + BROWSER_LOGD("[%s]", __func__); + + BookmarksManager* bookmarks_manager = reinterpret_cast(data); + Elm_Object_Item* elmItem = reinterpret_cast(event_info); + BROWSER_LOGD("[%s:%d] \n\t %x", __PRETTY_FUNCTION__, __LINE__, elmItem); + if(bookmarks_manager->m_bookmarks_managerItemsMap.count(elmItem)){ + std::shared_ptr bookmarks_managerItem(bookmarks_manager->m_bookmarks_managerItemsMap[elmItem]);// elm_object_item_data_get(elmItem) + if(bookmarks_managerItem->action->isEnabled()){ + if(bookmarks_managerItem->action->isCheckable()) { + bookmarks_manager->showInternalPopup(elmItem); + } else{ + bookmarks_managerItem->action->trigger(); + } + } + } +} + +void BookmarksManager::showPopup() +{ + BROWSER_LOGD("[%s:%d] this: %x ", __PRETTY_FUNCTION__, __LINE__, this); + + if (isPopupShown()){ + m_isPopupShown = false; + unbindFocus(); + evas_object_hide(m_popup); + return; + } + + if(!m_popup) { + m_popup = elm_popup_add(m_window.get()); + BROWSER_LOGD("[%s:%d] - new popup: %x ", __PRETTY_FUNCTION__, __LINE__, m_popup); + evas_object_smart_callback_add(m_popup, "block,clicked", block_clicked, this); + // elm_object_content_set(m_popup, getContent()); + elm_object_part_text_set(m_popup, "title,text", "Add to Bookmark"); + + Evas_Coord w,h,x,y; + evas_object_geometry_get(m_window.get(), &x, &y, &w, &h); + evas_object_geometry_set(m_popup,0,0,w,h); + + //elm_object_style_set(m_popup, "message_popup"); + } + //evas_object_resize(m_popup, 480, 800); + realShow(m_popup); +} + +void BookmarksManager::realShow(Evas_Object* popup) +{ + elm_object_focus_next_object_set(m_parentButton, getFirstFocus(), ELM_FOCUS_DOWN); + elm_object_focus_next_object_set(getFirstFocus(), m_parentButton, ELM_FOCUS_UP); + + // ListSize listSize = calculateSize(); + // evas_object_size_hint_min_set(m_popup, listSize.width, listSize.height); + // evas_object_size_hint_max_set(m_popup, listSize.width, listSize.height); + elm_popup_item_append(popup,"Folde 1",nullptr,nullptr,this); + elm_popup_item_append(popup,"Folde 2",nullptr,nullptr,this); + elm_popup_item_append(popup,"Folde 3",nullptr,nullptr,this); + elm_popup_item_append(popup,"Folde 4",nullptr,nullptr,this); + elm_popup_item_append(popup,"Folde 5",nullptr,nullptr,this); + elm_popup_item_append(popup,"Folde 6",nullptr,nullptr,this); + elm_popup_item_append(popup,"Folde 7",nullptr,nullptr,this); + elm_popup_item_append(popup,"Folde 8",nullptr,nullptr,this); + elm_popup_item_append(popup,"Folde 8",nullptr,nullptr,this); + elm_popup_item_append(popup,"Folde 10",nullptr,nullptr,this); + elm_popup_item_append(popup,"Folde 11",nullptr,nullptr,this); + elm_popup_item_append(popup,"Folde 12",nullptr,nullptr,this); + evas_object_show(popup); + m_isPopupShown=true; +} + +void BookmarksManager::unbindFocus() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + elm_object_focus_next_object_set(m_parentButton, nullptr, ELM_FOCUS_DOWN); +} + +bool BookmarksManager::isPopupShown() +{ + return m_isPopupShown; +} + +void BookmarksManager::block_clicked(void *data, Evas_Object *obj, void *event_info) +{ + evas_object_hide(obj); +} + +void BookmarksManager::hidePopup() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + evas_object_hide(m_popup); + m_isPopupShown = false; +} + +void BookmarksManager::showInternalPopup(Elm_Object_Item* listItem) +{ + BROWSER_LOGD("[%s]", __func__); + m_internalPopupVisible = true; + m_trackedItem = listItem; + + if(!m_internalPopup){ + m_internalPopup = elm_ctxpopup_add(m_window.get()); + evas_object_smart_callback_add(m_internalPopup, "dismissed", BookmarksManager::dismissedCtxPopup, this); + } + Evas_Object * buttonBox = elm_box_add(m_internalPopup); + Evas_Object * radioOn = elm_radio_add(m_internalPopup); + Evas_Object * radioOff = elm_radio_add(m_internalPopup); + + + elm_object_text_set(radioOn, "On"); + elm_object_text_set(radioOff, "Off"); + + elm_object_style_set(radioOn, "bookmarks_manager_radio"); + elm_object_style_set(radioOff, "bookmarks_manager_radio"); + + elm_box_pack_end(buttonBox, radioOn); + elm_box_pack_end(buttonBox, radioOff); + + m_checkState = (m_bookmarks_managerItemsMap[m_trackedItem]->action->isChecked() ? CheckStateOn : CheckStateOff ); + + elm_radio_state_value_set(radioOn, CheckStateOn);//true + elm_radio_value_pointer_set(radioOn, reinterpret_cast(&m_checkState)); + + elm_radio_state_value_set(radioOff, CheckStateOff);//false + elm_radio_value_pointer_set(radioOff, reinterpret_cast(&m_checkState)); + + elm_radio_group_add(radioOff, radioOn); + + evas_object_smart_callback_add(radioOn, "changed", radioChanged, this); + evas_object_smart_callback_add(radioOff, "changed", radioChanged, this); + + evas_object_size_hint_weight_set(buttonBox, EVAS_HINT_EXPAND,EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(buttonBox, EVAS_HINT_FILL, EVAS_HINT_FILL); + + evas_object_show(buttonBox); + evas_object_show(radioOn); + evas_object_show(radioOff); + + + elm_object_content_set(m_internalPopup, buttonBox); + elm_ctxpopup_direction_priority_set(m_internalPopup, + ELM_CTXPOPUP_DIRECTION_DOWN, + ELM_CTXPOPUP_DIRECTION_DOWN, + ELM_CTXPOPUP_DIRECTION_DOWN, + ELM_CTXPOPUP_DIRECTION_DOWN); + Evas_Coord w,h,x,y; + +#if PLATFORM(TIZEN) + evas_object_geometry_get(elm_object_item_track(m_trackedItem), &x, &y, &w, &h); + + BROWSER_LOGD("[%s:%d] \n\tx:%d; y:%d; w:%d; h:%d ", __PRETTY_FUNCTION__, __LINE__, + x, y, w, h); + evas_object_move(m_internalPopup, x + 354, y);//354 is proper value +#endif + + elm_object_style_set(m_internalPopup, "bookmarks_manager_button"); + evas_object_show(m_internalPopup); + if(!m_pointerModeEnabled) + elm_object_focus_set(radioOn, EINA_TRUE); + elm_object_item_signal_emit(m_trackedItem, "selected", "BookmarksManagerModel"); + elm_object_signal_emit(m_genlist, "show_popup", "BookmarksManagerModel"); +} + +void BookmarksManager::dismissedCtxPopup(void* data, Evas_Object* obj, void* /*event_info*/) +{ + BROWSER_LOGD("[%s]", __func__); + BookmarksManager* bookmarks_manager = static_cast(data); + evas_object_hide(obj); + bookmarks_manager->m_internalPopup = 0; + elm_object_signal_emit(bookmarks_manager->m_genlist, "hide_popup", "BookmarksManagerModel"); + elm_object_item_signal_emit(bookmarks_manager->m_trackedItem, "unselected", "BookmarksManagerModel"); + +#if PLATFORM(TIZEN) + elm_object_item_untrack(bookmarks_manager->m_trackedItem); +#endif + bookmarks_manager->m_internalPopupVisible = false; +} + +void BookmarksManager::radioChanged(void* data, Evas_Object* /*obj*/, void* /*event_info*/) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BookmarksManager *bookmarks_manager = static_cast(data); + std::shared_ptr bookmarks_managerItem(bookmarks_manager->m_bookmarks_managerItemsMap[bookmarks_manager->m_trackedItem]); + bookmarks_managerItem->action->toggle(); + elm_object_item_signal_emit(bookmarks_manager->m_trackedItem, + (bookmarks_managerItem->action->isChecked() ? "switch,on" : "switch,off") + , "BookmarksManagerModel"); + elm_genlist_item_update(bookmarks_manager->m_trackedItem); + elm_object_signal_emit(bookmarks_manager->m_internalPopup, "elm,state,hide", "elm"); +} + +void BookmarksManager::focusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,in", "option*"); +} + +void BookmarksManager::unFocusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,out", "option*"); +} + +void BookmarksManager::setPointerModeEnabled (bool enabled) +{ + m_pointerModeEnabled = enabled; +} + +bool BookmarksManager::canBeDismissed() +{ + BROWSER_LOGD("[%s]", __func__); + bool internalPopupVisible = m_internalPopup && m_internalPopupVisible; + if(internalPopupVisible) { + elm_ctxpopup_dismiss(m_internalPopup); + return false; + } + return true; +} + +}//namespace base_ui + +}//namespace tizen_browser diff --git a/services/SimpleUI/BookmarksManager.h b/services/SimpleUI/BookmarksManager.h new file mode 100644 index 0000000..b2dbde0 --- /dev/null +++ b/services/SimpleUI/BookmarksManager.h @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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 BOOKSMARK_MANAGER_H +#define BOOKSMARK_MANAGER_H +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Action.h" +#include "MenuButton.h" + +namespace tizen_browser +{ +namespace base_ui +{ + +struct BookmarksManagerItem{ + std::shared_ptr action; + BookmarksManagerItem(); + BookmarksManagerItem(std::shared_ptr action); + BookmarksManagerItem(const BookmarksManagerItem& source); + BookmarksManagerItem(const BookmarksManagerItem* source); + ~BookmarksManagerItem(); +}; + + +class BookmarksManager: public MenuButton +{ +public: + BookmarksManager(std::shared_ptr< Evas_Object > mainWindow, Evas_Object* parentButton); + ~BookmarksManager(); + virtual Evas_Object *getContent(); + virtual ListSize calculateSize(); + virtual Evas_Object* getFirstFocus(); + void addAction(sharedAction action); + void onEnabledChanged(sharedAction action); + void refreshAction(sharedAction action); + void setPointerModeEnabled (bool enabled); + void showPopup(); + void hidePopup(); + bool isPopupShown(); + virtual bool canBeDismissed(); +private: + static char *gridTextGet(void *data, Evas_Object* obj, const char *part); + static Evas_Object *gridOptionLabelGet(void* data, Evas_Object* /*obj*/, const char* part); + static void itemClicked(void *data, Evas_Object *o, void *event_info); + static void block_clicked(void *data, Evas_Object *obj, void *event_info); + + void showInternalPopup(Elm_Object_Item* parent); + static void dismissedCtxPopup(void* data, Evas_Object* obj, void* event_info); + static void radioChanged(void *data, Evas_Object *obj, void *event_info); + +private: + Evas_Object *m_popup; + Evas_Object *m_genlist; + Evas_Object *m_internalPopup; + Elm_Object_Item *m_trackedItem; + Elm_Genlist_Item_Class *m_itemClass; + bool m_internalPopupVisible; + bool m_pointerModeEnabled; + std::map> m_bookmarks_managerItemsMap; + std::map m_actionButtonMap; + enum CheckState{ + CheckStateOn=1 + ,CheckStateOff=2 + }; + CheckState m_checkState; + void realShow(Evas_Object* popup); + void unbindFocus(); + bool m_isPopupShown; + + static void focusItem(void* data, Evas_Object* obj, void* event_info); + static void unFocusItem(void* data, Evas_Object* obj, void* event_info); +}; + +}//namespace base_ui + +}//namespace tizen_browser + +#endif // BOOKSMARK_MANAGER_H diff --git a/services/SimpleUI/CMakeLists.txt b/services/SimpleUI/CMakeLists.txt index 4053a76..bc3292c 100644 --- a/services/SimpleUI/CMakeLists.txt +++ b/services/SimpleUI/CMakeLists.txt @@ -8,6 +8,7 @@ set(SimpleUI_SRCS SimplePopup.cpp ZoomList.cpp TabList.cpp + BookmarksManager.cpp Settings.cpp SimpleScroller.cpp WebTitleBar.cpp @@ -22,6 +23,7 @@ set(SimpleUI_HEADERS SimplePopup.h ZoomList.h TabList.h + BookmarksManager.h Settings.h SimpleScroller.h HistoryList.h @@ -41,10 +43,18 @@ include_directories(${CMAKE_SOURCE_DIR}/services/SimpleURI) include_directories(${CMAKE_SOURCE_DIR}/services/WebEngineService) include_directories(${CMAKE_SOURCE_DIR}/services/WebEngineService/src) include_directories(${CMAKE_SOURCE_DIR}/services/StorageService) +#MERGE_ME +#include_directories(${CMAKE_SOURCE_DIR}/services/BookmarkManagerUI) include_directories(${CMAKE_SOURCE_DIR}/services/StorageService/Storage/include) include_directories(${CMAKE_SOURCE_DIR}/services/FavoriteService) include_directories(${CMAKE_SOURCE_DIR}/services/HistoryService) -include_directories(${CMAKE_SOURCE_DIR}/services/BookmarksUI) +include_directories(${CMAKE_SOURCE_DIR}/services/MoreMenuUI) +#MERGE_ME +#include_directories(${CMAKE_SOURCE_DIR}/services/HistoryUI) +include_directories(${CMAKE_SOURCE_DIR}/services/MainUI) +#MERGE_ME +#include_directories(${CMAKE_SOURCE_DIR}/services/SettingsUI) +#include_directories(${CMAKE_SOURCE_DIR}/services/TabUI) include_directories(${CMAKE_SOURCE_DIR}/services/PlatformInputManager) include_directories(${CMAKE_SOURCE_DIR}/services/SessionStorage) @@ -57,13 +67,27 @@ add_library(${PROJECT_NAME} SHARED ${SimpleUI_SRCS}) add_dependencies(${PROJECT_NAME} SimpleURI) add_dependencies(${PROJECT_NAME} StorageService) add_dependencies(${PROJECT_NAME} HistoryService) -add_dependencies(${PROJECT_NAME} BookmarksUI) +#MERGE_ME +#add_dependencies(${PROJECT_NAME} MoreMenuUI) +#add_dependencies(${PROJECT_NAME} BookmarkManagerUI) +add_dependencies(${PROJECT_NAME} MainUI) +#MERGE_ME +#add_dependencies(${PROJECT_NAME} HistoryUI) +#add_dependencies(${PROJECT_NAME} SettingsUI) +#add_dependencies(${PROJECT_NAME} TabUI) add_dependencies(${PROJECT_NAME} PlatformInputManager) add_dependencies(${PROJECT_NAME} SessionStorage) target_link_libraries(${PROJECT_NAME} SimpleURI) target_link_libraries(${PROJECT_NAME} StorageService) target_link_libraries(${PROJECT_NAME} HistoryService) -target_link_libraries(${PROJECT_NAME} BookmarksUI) +#MERGE_ME +#target_link_libraries(${PROJECT_NAME} MoreMenuUI) +target_link_libraries(${PROJECT_NAME} MainUI) +#MERGE_ME +#target_link_libraries(${PROJECT_NAME} HistoryUI) +#target_link_libraries(${PROJECT_NAME} SettingsUI) +#target_link_libraries(${PROJECT_NAME} TabUI) +#target_link_libraries(${PROJECT_NAME} BookmarkManagerUI) target_link_libraries(${PROJECT_NAME} PlatformInputManager) target_link_libraries(${PROJECT_NAME} SessionStorage) target_link_libraries(${PROJECT_NAME} ${EFL_LDFLAGS}) @@ -86,6 +110,7 @@ set(edcFiles AuthenticationPopup.edc TabItem.edc ZoomItem.edc + BookmarksManager.edc Settings.edc ScrollerDefault.edc HistoryItem.edc diff --git a/services/SimpleUI/HistoryList.cpp b/services/SimpleUI/HistoryList.cpp index 60623a6..508ae8f 100644 --- a/services/SimpleUI/HistoryList.cpp +++ b/services/SimpleUI/HistoryList.cpp @@ -21,6 +21,12 @@ #include "EflTools.h" #include +#if MERGE_ME +#include +#include +#include +#include +#endif namespace tizen_browser { @@ -210,11 +216,13 @@ char* HistoryList::listItemTextGet(void* data, Evas_Object* /* obj */, const cha return strdup(id->h_item->getUrl().c_str()); } } +#if MERGE_ME else if(!strcmp(part, "page_time")) { std::string retstr = boost::posix_time::to_simple_string(id->h_item->getLastVisit().time_of_day()); return strdup(retstr.c_str()); } +#endif return strdup(""); } diff --git a/services/SimpleUI/SimplePopup.cpp b/services/SimpleUI/SimplePopup.cpp index 363e905..57e2898 100644 --- a/services/SimpleUI/SimplePopup.cpp +++ b/services/SimpleUI/SimplePopup.cpp @@ -23,10 +23,10 @@ namespace base_ui evas_object_del(popup); } - SimplePopup::SimplePopup() : content(NULL) { } + SimplePopup::SimplePopup() : content(nullptr) { } SimplePopup::SimplePopup(const std::string &title, const std::string &message) - : content(NULL) + : content(nullptr) , title(title) , message(message) { } @@ -43,12 +43,15 @@ namespace base_ui popup = elm_popup_add(mainUi->getMainWindow().get()); evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - if(content != NULL) + if(content != nullptr) elm_object_content_set(popup, content); else elm_object_text_set(popup, message.c_str()); elm_popup_content_text_wrap_type_set(popup, ELM_WRAP_WORD); +#if MERGE_ME + elm_popup_content_text_wrap_type_set(popup, ELM_WRAP_CHAR); +#endif elm_object_part_text_set(popup, "title,text", title.c_str()); int buttonsCounter = 1; diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index ef0d403..381088f 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -17,7 +17,6 @@ #include "browser_config.h" #if defined(USE_EWEBKIT) -//#include #include #endif @@ -40,11 +39,11 @@ #include "BrowserImage.h" #include "SimpleURI.h" #include "SimpleUI.h" -#include "../BookmarksUI/BookmarksUI.h" #include "BookmarkItem.h" #include "Tools/EflTools.h" #include "BrowserImage.h" #include "HistoryItem.h" +#include "BookmarkItem.h" #include "boost/date_time/gregorian/gregorian.hpp" #include "boost/date_time/posix_time/posix_time.hpp" #include "NetworkErrorHandler.h" @@ -58,24 +57,31 @@ EXPORT_SERVICE(SimpleUI, "org.tizen.browser.simpleui") const std::string HomePageURL = "about:home"; -SimpleUI::SimpleUI(/*Evas_Object *window*/) +SimpleUI::SimpleUI() : AbstractMainWindow() - , m_mainLayout(NULL) - , m_progressBar(NULL) - , m_popup(NULL) + , m_mainLayout(nullptr) + , m_progressBar(nullptr) + , m_popup(nullptr) +#if MERGE_ME , m_settings() + , m_moreMenuUI() + , m_tabUI() + , m_bookmarkManagerUI() +#endif + , m_mainUI() , m_initialised(false) + , m_isHomePageActive(false) , m_currentZoom(ZOOM_TYPE_100) , items_vector() , m_networkErrorPopup(0) , m_wvIMEStatus(false) { - elm_init(static_cast(NULL), static_cast(NULL)); + elm_init(0, nullptr); ewk_context_default_get(); Evas_Object *main_window = elm_win_util_standard_add("browserApp", "browserApp"); - if (main_window == NULL) + if (main_window == nullptr) BROWSER_LOGE("Failed to create main window"); -// m_zoomList = NULL; + setMainWindow(main_window); } @@ -97,16 +103,30 @@ std::string SimpleUI::edjePath(const std::string &file) return std::string(EDJE_DIR) + file; } -std::vector > SimpleUI::getBookmarks() +std::vector > SimpleUI::getBookmarks(int folder_id) +{ + return m_favoriteService->getBookmarks(folder_id); +} + +std::vector > SimpleUI::getHistory() { - return m_favoriteService->getBookmarks(); + return m_historyService->getMostVisitedHistoryItems(); } + +std::vector > SimpleUI::getBookmarkFolders() +{ + return m_favoriteService->getBookmarkFolders(); +} + + + int SimpleUI::exec(const std::string& _url) { BROWSER_LOGD("[%s] _url=%s, initialised=%d", __func__, _url.c_str(), m_initialised); std::string url = _url; Session::Session lastSession; + if(!m_initialised){ if (m_window.get()) { config::DefaultConfig config; @@ -115,10 +135,9 @@ int SimpleUI::exec(const std::string& _url) m_favoritesLimit = boost::any_cast (config.get("FAVORITES_LIMIT")); elm_win_alpha_set(m_window.get(), EINA_FALSE); - // creatin main window + // creating main window int width = 0; int height = 0; - //ecore_x_window_size_get(ecore_x_window_root_first_get(), &width, &height); ecore_wl_screen_size_get(&width, &height); evas_object_move(m_window.get(), 0, 0); evas_object_resize(m_window.get(), width, height); @@ -168,29 +187,23 @@ int SimpleUI::exec(const std::string& _url) // bookmarks UI BROWSER_LOGD("[%s:%d] service: bookmarksui ", __PRETTY_FUNCTION__, __LINE__); - m_bookmarksUI = - std::dynamic_pointer_cast - - (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.bookmarksui")); - M_ASSERT(m_bookmarksUI); - m_bookmarksUI->init(m_mainLayout); // favorites service BROWSER_LOGD("[%s:%d] service: favoriteservice ", __PRETTY_FUNCTION__, __LINE__); std::string favoriteService(boost::any_cast < std::string > (config.get("favorite_service_name"))); - BROWSER_LOGD("favorite config"); + BROWSER_LOGD("favorite config"); m_favoriteService = std::dynamic_pointer_cast (tizen_browser::core::ServiceManager::getInstance().getService(favoriteService)); - BROWSER_LOGD("favorite create"); + BROWSER_LOGD("favorite create"); M_ASSERT(m_favoriteService); -// m_favoriteService->synchronizeBookmarks(); - BROWSER_LOGD("favorite before getBookmarks"); + m_favoriteService->synchronizeBookmarks(); + BROWSER_LOGD("favorite before getBookmarks"); m_favoriteService->getBookmarks(); - BROWSER_LOGD("favorite after getBookmarks"); + BROWSER_LOGD("favorite after getBookmarks"); - // history service + // history service BROWSER_LOGD("[%s:%d] service: historyservice ", __PRETTY_FUNCTION__, __LINE__); m_historyService = std::dynamic_pointer_cast @@ -211,22 +224,19 @@ int SimpleUI::exec(const std::string& _url) m_platformInputManager->backPressed.connect(boost::bind(&SimpleUI::onBackPressed, this)); createActions(); + // left buttons leftButtonBar = std::make_shared(m_mainLayout, "SimpleUI/LeftButtonBar.edj", "left_button_bar"); leftButtonBar->addAction(m_back, "prev_button"); leftButtonBar->addAction(m_forward, "next_button"); leftButtonBar->addAction(m_reload, "refresh_stop_button"); - leftButtonBar->addAction(m_bookmark, "bookmark_button"); //register action that will be used later by buttons leftButtonBar->registerEnabledChangedCallback(m_stopLoading, "refresh_stop_button"); - leftButtonBar->registerEnabledChangedCallback(m_unbookmark, "bookmark_button"); // right buttons rightButtonBar = std::make_shared(m_mainLayout, "SimpleUI/RightButtonBar.edj", "right_button_bar"); rightButtonBar->addAction(m_tab, "tab_button"); - rightButtonBar->addAction(m_history, "history_button"); - rightButtonBar->addAction(m_zoom_in, "zoom_in_button"); - rightButtonBar->addAction(m_showSettingsPopup, "setting_button"); + rightButtonBar->addAction(m_showMoreMenu, "setting_button"); m_progressBar = elm_progressbar_add(m_mainLayout); elm_object_style_set(m_progressBar,"play_buffer"); @@ -234,7 +244,6 @@ int SimpleUI::exec(const std::string& _url) webTitleBar = std::make_shared(m_mainLayout, "SimpleUI/WebTitleBar.edj", "web_title_bar"); elm_object_part_content_set(m_mainLayout, "web_title_bar", webTitleBar->getContent()); - // put components on layout elm_object_part_content_set(m_mainLayout, "uri_entry", m_simpleURI->getContent(m_mainLayout)); elm_object_part_content_set(m_mainLayout, "uri_bar_buttons_left", leftButtonBar->getContent()); elm_object_part_content_set(m_mainLayout, "uri_bar_buttons_right", rightButtonBar->getContent()); @@ -261,20 +270,15 @@ int SimpleUI::exec(const std::string& _url) m_favoriteService->bookmarkAdded.connect(boost::bind(&SimpleUI::onBookmarkAdded, this,_1)); m_favoriteService->bookmarkDeleted.connect(boost::bind(&SimpleUI::onBookmarkRemoved, this, _1)); - m_favoriteService->bookmarksDeleted.connect(boost::bind(&tizen_browser::base_ui::BookmarksUI::deleteAllItems, m_bookmarksUI.get())); - m_bookmarksUI->bookmarkClicked.connect(boost::bind(&SimpleUI::onBookmarkClicked, this,_1)); - m_bookmarksUI->bookmarkDeleteClicked.connect(boost::bind(&SimpleUI::onBookmarkDeleteClicked, this,_1)); - - m_historyService->historyEmpty.connect(boost::bind(&SimpleUI::disableHistoryButton, this, _1)); + //m_historyService->historyEmpty.connect(boost::bind(&SimpleUI::disableHistoryButton, this, _1)); + m_historyService->historyAdded.connect(boost::bind(&SimpleUI::onHistoryAdded, this,_1)); + m_historyService->historyDeleted.connect(boost::bind(&SimpleUI::onHistoryRemoved, this,_1)); connectActions(); elm_layout_signal_callback_add(m_simpleURI->getContent(), "slide_websearch", "elm", SimpleUI::favicon_clicked, this); - // add bookmarks for main screen - m_bookmarksUI->addBookmarkItems(getBookmarks()); - // show main layout and window evas_object_show(m_mainLayout); evas_object_show(m_window.get()); @@ -296,29 +300,32 @@ int SimpleUI::exec(const std::string& _url) } m_initialised = true; + // only when first run + if (url.empty()) { + BROWSER_LOGD("[%s]: changing to homeUrl", __func__); + switchViewToHomePage(); +#if MERGE_ME // Not sure if this should be enabled + filterURL(HomePageURL); +#endif + if(lastSession.items().size() >= 1){ + for(auto iter=lastSession.items().begin(), + end=lastSession.items().end(); + iter != end; + iter++ + ){ + openNewTab(iter->second); + } + m_sessionService->getStorage()->deleteSession(lastSession); + } + } + else + openNewTab(url); } - // only when first run - if (url.empty()) { - BROWSER_LOGD("[%s]: changing to homeUrl", __func__); - switchViewToHomePage(); - filterURL(HomePageURL); - if(lastSession.items().size() >= 1){ - for(auto iter=lastSession.items().begin(), - end=lastSession.items().end(); - iter != end; - iter++ - ){ - openNewTab(iter->second); - } - m_sessionService->getStorage()->deleteSession(lastSession); - } - } - else - openNewTab(url); - BROWSER_LOGD("[%s]:%d url=%s", __func__, __LINE__, url.c_str()); + saveFolder("Bookmark Bar",0,1); + m_simpleURI->setFocus(); return 0; @@ -326,9 +333,9 @@ int SimpleUI::exec(const std::string& _url) void SimpleUI::loadThemes() { - elm_theme_extension_add(NULL, edjePath("SimpleUI/ZoomItem.edj").c_str()); - elm_theme_extension_add(NULL, edjePath("SimpleUI/TabItem.edj").c_str()); - elm_theme_extension_add(NULL, edjePath("SimpleUI/ErrorMessage.edj").c_str()); + elm_theme_extension_add(nullptr, edjePath("SimpleUI/ZoomItem.edj").c_str()); + elm_theme_extension_add(nullptr, edjePath("SimpleUI/TabItem.edj").c_str()); + elm_theme_extension_add(nullptr, edjePath("SimpleUI/ErrorMessage.edj").c_str()); elm_theme_overlay_add(0, edjePath("SimpleUI/ScrollerDefault.edj").c_str()); elm_theme_overlay_add(0, edjePath("SimpleUI/Tooltip.edj").c_str()); @@ -337,6 +344,7 @@ void SimpleUI::loadThemes() void SimpleUI::createActions() { ///\todo Add MulitStateAction. and convert m_stopLoading and m_reload actons to it? + m_back = sharedAction(new Action("Back")); m_back->setToolTip("Previous"); m_back->setIcon("browser/toolbar_prev"); @@ -352,35 +360,14 @@ void SimpleUI::createActions() m_reload = sharedAction(new Action("Reload")); m_reload->setToolTip("Reload"); m_reload->setIcon("browser/toolbar_reload"); - - m_bookmark = sharedAction(new Action("Bookmark")); - m_bookmark->setToolTip("Add to favorite"); - m_bookmark->setIcon("browser/toolbar_bookmark"); - - m_unbookmark = sharedAction(new Action("Unbookmark")); - m_unbookmark->setToolTip("Unfavorite"); - m_unbookmark->setIcon("browser/toolbar_unbookmark"); - m_tab = sharedAction(new Action("Tabs")); m_tab->setToolTip("Tab page"); m_tab->setIcon("browser/toolbar_tab"); //m_tab->setCheckable(true); - m_history = sharedAction(new Action("History")); - m_history->setToolTip("History"); - m_history->setIcon("browser/toolbar_history"); - if(m_historyService->getHistoryItemsCount() == 0){ - m_history->setEnabled(false); - } - - m_zoom_in = sharedAction(new Action("Zoom in")); - m_zoom_in->setToolTip("Zoom in/out"); - m_zoom_in->setIcon("browser/toolbar_zoom_in"); - - - m_showSettingsPopup = sharedAction(new Action("Settings")); - m_showSettingsPopup->setToolTip("Settings"); - m_showSettingsPopup->setIcon("browser/toolbar_setting"); + m_showMoreMenu = sharedAction(new Action("Settings")); + m_showMoreMenu->setToolTip("Settings"); + m_showMoreMenu->setIcon("browser/toolbar_setting"); /* m_settingPointerMode = sharedAction(new Action("Pointer mode")); m_settingPointerMode->setToolTip("Switch to Pointer Mode"); @@ -388,13 +375,12 @@ void SimpleUI::createActions() m_settingPointerMode->setChecked(m_platformInputManager->getPointerModeEnabled()); m_settingPointerMode->setEnabled(true); */ -/* + m_settingPrivateBrowsing = sharedAction(new Action("Private browsing")); m_settingPrivateBrowsing->setToolTip("On exit from private mode all cookies, history, and stored data will be deleted"); m_settingPrivateBrowsing->setCheckable(true); m_settingPrivateBrowsing->setChecked(m_webEngine->isPrivateMode()); m_settingPrivateBrowsing->setEnabled(true); -*/ m_settingDeleteHistory = sharedAction(new Action("Delete history")); m_settingDeleteHistory->setToolTip("Delete History"); @@ -404,73 +390,101 @@ void SimpleUI::createActions() m_settingDeleteFavorite = sharedAction(new Action("Delete favorite site")); m_settingDeleteFavorite->setToolTip("Delete favorite site"); + + m_bookmarks_manager_Add_NewFolder = sharedAction(new Action("+ New Folder")); + m_bookmarks_manager_Add_NewFolder->setToolTip("Add a new Folder"); + + m_bookmarks_manager_BookmarkBar = sharedAction(new Action("Bookmark Bar")); + m_bookmarks_manager_BookmarkBar->setToolTip("show Bookmark bar"); + + m_bookmarks_manager_Folder3 = sharedAction(new Action("Folder 3")); + m_bookmarks_manager_Folder3->setToolTip("open Folder 3"); + + m_bookmarks_manager_Folder2 = sharedAction(new Action("Folder 2")); + m_bookmarks_manager_Folder2->setToolTip("open Folder 2"); + + m_bookmarks_manager_Folder1 = sharedAction(new Action("Folder 1")); + m_bookmarks_manager_Folder1->setToolTip("open Folder 1"); } void SimpleUI::connectActions() { //left bar m_back->triggered.connect(boost::bind(&tizen_browser::basic_webengine::AbstractWebEngine::back, m_webEngine.get())); - m_back->triggered.connect(boost::bind(&SimpleUI::switchViewToBrowser, this)); + m_back->triggered.connect(boost::bind(&SimpleUI::updateBrowserView, this)); m_forward->triggered.connect(boost::bind(&tizen_browser::basic_webengine::AbstractWebEngine::forward, m_webEngine.get())); m_stopLoading->triggered.connect(boost::bind(&tizen_browser::basic_webengine::AbstractWebEngine::stopLoading, m_webEngine.get())); m_reload->triggered.connect(boost::bind(&tizen_browser::basic_webengine::AbstractWebEngine::reload, m_webEngine.get())); - m_reload->triggered.connect(boost::bind(&SimpleUI::switchViewToBrowser, this)); - - m_bookmark->triggered.connect(boost::bind(&SimpleUI::addToBookmarks, this)); - m_unbookmark->triggered.connect(boost::bind(&SimpleUI::deleteBookmark, this)); + m_reload->triggered.connect(boost::bind(&SimpleUI::updateBrowserView, this)); //right bar - m_tab->triggered.connect(boost::bind(&SimpleUI::showTabMenu, this)); - m_zoom_in->triggered.connect(boost::bind(&SimpleUI::showZoomMenu, this)); - m_history->triggered.connect(boost::bind(&SimpleUI::showHistory, this)); - m_showSettingsPopup->triggered.connect(boost::bind(&SimpleUI::showSettingsMenu, this)); + m_tab->triggered.connect(boost::bind(&SimpleUI::showTabUI, this)); + m_showMoreMenu->triggered.connect(boost::bind(&SimpleUI::showMoreMenu, this)); -// m_settingPointerMode->toggled.connect(boost::bind(&tizen_browser::services::PlatformInputManager::setPointerModeEnabled, m_platformInputManager.get(), _1)); +// m_settingPointerMode->toggled.connect(boost::bind(&tizen_browser::services::PlatformInputManager::setPointerModeEnabled, m_platformInputManager.get(), _1)); +#if MERGE_ME + m_settingPrivateBrowsing->toggled.connect(boost::bind(&SimpleUI::settingsPrivateModeSwitch, this, _1)); +#endif + //m_settingDeleteHistory->triggered.connect(boost::bind(&SimpleUI::settingsDeleteHistory, this)); + //m_settingDeleteData->triggered.connect(boost::bind(&SimpleUI::settingsDeleteData, this));; + //m_settingDeleteFavorite->triggered.connect(boost::bind(&SimpleUI::settingsDeleteFavorite, this));; +#if MERGE_ME // m_settingPrivateBrowsing->toggled.connect(boost::bind(&SimpleUI::settingsPrivateModeSwitch, this, _1)); m_settingDeleteHistory->triggered.connect(boost::bind(&SimpleUI::settingsDeleteHistory, this)); m_settingDeleteData->triggered.connect(boost::bind(&SimpleUI::settingsDeleteData, this));; m_settingDeleteFavorite->triggered.connect(boost::bind(&SimpleUI::settingsDeleteFavorite, this));; +#endif } -void SimpleUI::updateBrowserView() +void SimpleUI::updateURIBarView() { + m_simpleURI->changeUri(m_webEngine->getURI()); + leftButtonBar->setActionForButton("refresh_stop_button", m_reload); + stopEnable(true); + reloadEnable(true); + hideProgressBar(); +} + +void SimpleUI::updateWebView() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); evas_object_hide(elm_object_part_content_get(m_mainLayout, "web_view")); elm_object_part_content_unset(m_mainLayout, "web_view"); elm_object_part_content_set(m_mainLayout, "web_view", m_webEngine->getLayout()); evas_object_show(m_webEngine->getLayout()); } +void SimpleUI::updateBrowserView() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if(isHomePageActive()) + hideMainUI(); + + updateWebView(); + + updateURIBarView(); +} + void SimpleUI::switchToTab(const tizen_browser::basic_webengine::TabId& tabId) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); if(m_webEngine->currentTabId() != tabId) { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); m_webEngine->switchToTab(tabId); - switchViewToBrowser(); } -// if(!m_webEngine->isLoadError()){ -// BROWSER_LOGD("[%s:%d] swiching to web_view ", __PRETTY_FUNCTION__, __LINE__); -// updateBrowserView(); -// switchViewToBrowser(); -// } else { -// BROWSER_LOGD("[%s:%d] LOAD ERROR!", __PRETTY_FUNCTION__, __LINE__); -// loadError(); -// } - if(m_webEngine->isLoadError()){ BROWSER_LOGD("[%s:%d] LOAD ERROR!", __PRETTY_FUNCTION__, __LINE__); loadError(); - } else { - BROWSER_LOGD("[%s:%d] swiching to web_view ", __PRETTY_FUNCTION__, __LINE__); - updateBrowserView(); - switchViewToBrowser(); + return; } + BROWSER_LOGD("[%s:%d] swiching to web_view ", __PRETTY_FUNCTION__, __LINE__); + updateBrowserView(); } bool SimpleUI::isHomePageActive() { - BROWSER_LOGD("[%s]:%d", __func__, elm_object_part_content_get(m_mainLayout,"web_view") == m_bookmarksUI->getContent()); - return elm_object_part_content_get(m_mainLayout,"web_view") == m_bookmarksUI->getContent(); + BROWSER_LOGD("[%s:%d] isHomePageActive : %d", __PRETTY_FUNCTION__, __LINE__, m_isHomePageActive); + return m_isHomePageActive; } bool SimpleUI::isErrorPageActive() @@ -479,9 +493,9 @@ bool SimpleUI::isErrorPageActive() return elm_object_part_content_get(m_mainLayout, "web_view") == m_errorLayout; } - void SimpleUI::switchViewToHomePage() { +#if MERGE_ME // remove if(!isHomePageActive()){ evas_object_hide(elm_object_part_content_get(m_mainLayout,"web_view")); elm_object_part_content_unset(m_mainLayout, "web_view"); @@ -489,45 +503,32 @@ void SimpleUI::switchViewToHomePage() evas_object_show(m_bookmarksUI->getContent()); //m_simpleURI->changeUri(HomePageURL); filterURL(HomePageURL); + } +#endif + BROWSER_LOGD("[%s:%d] isHomePageActive : %d", __PRETTY_FUNCTION__, __LINE__, m_isHomePageActive); + if(isHomePageActive()) + return; - } + showMainUI(); + filterURL(HomePageURL); m_webEngine->disconnectCurrentWebViewSignals(); - - leftButtonBar->setActionForButton("bookmark_button", m_bookmark); leftButtonBar->setActionForButton("refresh_stop_button", m_reload); - zoomEnable(false); - addBookmarkEnable(false); - removeBookmarkEnable(false); stopEnable(false); reloadEnable(false); forwardEnable(false); backEnable(false); + evas_object_hide(leftButtonBar->getContent()); + elm_object_signal_emit(m_mainLayout, "shiftback_uri", "ui"); + elm_object_signal_emit(m_simpleURI->getContent(), "shiftback_uribg", "ui"); webTitleBar->hide(); hideProgressBar(); } -void SimpleUI::switchViewToBrowser() -{ - if (isHomePageActive() || isErrorPageActive()) { - updateBrowserView(); - } - - m_simpleURI->changeUri(m_webEngine->getURI()); - leftButtonBar->setActionForButton("refresh_stop_button", m_reload); - zoomEnable(true); - removeBookmarkEnable(true); - stopEnable(true); - reloadEnable(true); - bookmarkCheck(); - - hideProgressBar(); -} - void SimpleUI::checkTabId(const tizen_browser::basic_webengine::TabId& id){ BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); if(m_webEngine->currentTabId() != id || isErrorPageActive()){ @@ -542,13 +543,14 @@ void SimpleUI::openNewTab(const std::string &uri) } void SimpleUI::closeTab(){ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); auto tabId = m_webEngine->currentTabId(); closeTab(tabId); } void SimpleUI::closeTab(const tizen_browser::basic_webengine::TabId& id) { - + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); m_currentSession.removeItem(id.toString()); m_webEngine->closeTab(id); updateView(); @@ -561,22 +563,63 @@ void SimpleUI::bookmarkCheck() if(m_favoriteService->bookmarkExists(m_webEngine->getURI())){ BROWSER_LOGD("[%s] There is bookmark for this site [%s], set indicator on!", __func__, m_webEngine->getURI().c_str()); - leftButtonBar->setActionForButton("bookmark_button", m_unbookmark); + // MERGE_ME + //leftButtonBar->setActionForButton("bookmark_button", m_unbookmark); } else{ BROWSER_LOGD("[%s] There is no bookmark for this site [%s], set indicator off", __func__, m_webEngine->getURI().c_str()); - leftButtonBar->setActionForButton("bookmark_button", m_bookmark); - addBookmarkEnable(m_favoriteService->countBookmarksAndSubFolders() < m_favoritesLimit); + // MERGE_ME + //leftButtonBar->setActionForButton("bookmark_button", m_bookmark); + //addBookmarkEnable(m_favoriteService->countBookmarksAndSubFolders() < m_favoritesLimit); } } void SimpleUI::onBookmarkAdded(std::shared_ptr bookmarkItem) { - m_bookmarksUI->addBookmarkItem(bookmarkItem); +#if 0 BROWSER_LOGI("Bookmark added with address %s",bookmarkItem->getAddress().c_str()); bookmarkCheck(); webTitleBar->removeFavIcon(); webTitleBar->show("Added to favorites"); +#endif +} + +void SimpleUI::onHistoryAdded(std::shared_ptr historyItem) +{ +#if 0 + m_mainUI->addHistoryItem(historyItem); + BROWSER_LOGI("Bookmark added with address %s",historyItem->getUrl().c_str()); +#endif +} + +void SimpleUI::onHistoryClicked(std::shared_ptr historyItem) +{ + std::string historyAddress = historyItem->getUrl(); + openNewTab(historyAddress); +} + +void SimpleUI::onMostVisitedClicked(const std::string&) +{ + BROWSER_LOGD("[%s]", __func__); + m_mainUI->clearHistoryGenlist(); + m_mainUI->clearBookmarkGengrid(); + m_mainUI->addHistoryItems(getHistory()); + m_mainUI->showHistoryGenlist(); +} + +void SimpleUI::onBookmarkButtonClicked(const std::string&) +{ + BROWSER_LOGD("[%s]", __func__); + m_mainUI->clearBookmarkGengrid(); + m_mainUI->clearHistoryGenlist(); + m_mainUI->addBookmarkItems(getBookmarks()); + m_mainUI->showBookmarkGengrid(); +} + +void SimpleUI::onBookmarkManagerButtonClicked(const std::string&) +{ + BROWSER_LOGD("[%s]", __func__); + showBookmarkManagerMenu(); } void SimpleUI::onBookmarkClicked(std::shared_ptr bookmarkItem) @@ -593,12 +636,18 @@ void SimpleUI::onBookmarkDeleteClicked(std::shared_ptrremoveBookmarkItem(uri.c_str()); bookmarkCheck(); - webTitleBar->removeFavIcon(); webTitleBar->show("Removed from favorites"); +#endif +} + +void SimpleUI::onHistoryRemoved(const std::string& uri) +{ + BROWSER_LOGD("[%s] deleted %s", __func__, uri.c_str()); + //m_mainUI->removeHistoryItem(uri.c_str()); } void SimpleUI::onReturnPressed(MenuButton *m) @@ -610,7 +659,7 @@ void SimpleUI::onReturnPressed(MenuButton *m) m->hidePopup(); } -void SimpleUI::setwvIMEStatus(bool status) +void SimpleUI::setwvIMEStatus(bool status) { BROWSER_LOGD("[%s]", __func__); m_wvIMEStatus = status; @@ -619,7 +668,7 @@ void SimpleUI::setwvIMEStatus(bool status) void SimpleUI::onBackPressed() { BROWSER_LOGD("[%s]", __func__); - if (!m_simpleURI->hasFocus() && !m_wvIMEStatus) + if (!m_simpleURI->hasFocus() && !m_wvIMEStatus && !isHomePageActive() && m_back->isEnabled()) m_webEngine->backButtonClicked(); } @@ -645,38 +694,42 @@ void SimpleUI::stopEnable(bool enable) void SimpleUI::addBookmarkEnable(bool enable) { - m_bookmark->setEnabled(enable); + //MERGE_ME + //m_bookmark->setEnabled(enable); } void SimpleUI::removeBookmarkEnable(bool enable) { - m_unbookmark->setEnabled(enable); + //MERGE_ME + //m_unbookmark->setEnabled(enable); } void SimpleUI::zoomEnable(bool enable) { m_zoom_in->setEnabled(enable); } - void SimpleUI::settingsButtonEnable(bool enable) { - m_showSettingsPopup->setEnabled(enable); + m_showMoreMenu->setEnabled(enable); } - void SimpleUI::loadStarted() { BROWSER_LOGD("Switching \"reload\" to \"stopLoading\"."); showProgressBar(); + elm_object_signal_emit(m_simpleURI->getContent(), "shiftright_uribg", "ui"); + elm_object_signal_emit(m_mainLayout, "shiftright_uri", "ui"); + evas_object_show(leftButtonBar->getContent()); leftButtonBar->setActionForButton("refresh_stop_button", m_stopLoading); addBookmarkEnable(false); - zoomEnable(false); if(!m_webEngine->isPrivateMode()){ m_currentSession.updateItem(m_webEngine->currentTabId().toString(), m_webEngine->getURI()); } - //if(!m_platformInputManager->getPointerModeEnabled()) - // elm_object_focus_set(leftButtonBar->getButton("refresh_stop_button"), EINA_TRUE); +#if 0 + if(!m_platformInputManager->getPointerModeEnabled()) + elm_object_focus_set(leftButtonBar->getButton("refresh_stop_button"), EINA_TRUE); +#endif } void SimpleUI::progressChanged(double progress) @@ -697,8 +750,6 @@ void SimpleUI::loadFinished() addBookmarkEnable(m_favoriteService->countBookmarksAndSubFolders() < m_favoritesLimit); - zoomEnable(true); - if(m_simpleURI->getCurrentIconTyep() != SimpleURI::IconTypeFav){ m_simpleURI->setFavIcon(m_webEngine->getFavicon()); webTitleBar->setFavIcon(m_webEngine->getFavicon()); @@ -711,39 +762,26 @@ void SimpleUI::loadFinished() m_historyService->addHistoryItem(std::make_shared (m_webEngine->getURI(), m_webEngine->getTitle(), m_webEngine->getFavicon())); - m_history->setEnabled(true); } -/* +#if 0 if(!m_platformInputManager->getPointerModeEnabled()) elm_object_focus_set(leftButtonBar->getButton("refresh_stop_button"), EINA_TRUE); -*/ +#endif } void SimpleUI::loadError() { BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); -// if(!isHomePageActive()){ -// evas_object_hide(elm_object_part_content_get(m_mainLayout,"web_view")); -// elm_object_part_content_unset(m_mainLayout, "web_view"); -// elm_object_part_content_set(m_mainLayout, "web_view", m_bookmarksUI->getContent()); -// evas_object_show(m_bookmarksUI->getContent()); -// //m_simpleURI->changeUri(HomePageURL); -// m_bookmarksUI->showErrorMsg(); -// //filterURL(HomePageURL); -// } - setErrorButtons(); - evas_object_hide(elm_object_part_content_get(m_mainLayout,"web_view")); - elm_object_part_content_unset(m_mainLayout, "web_view"); + hideWebView(); elm_object_part_content_set(m_mainLayout, "web_view",m_errorLayout); //evas_object_show(m_errorLayout); } void SimpleUI::setErrorButtons() { - leftButtonBar->setActionForButton("bookmark_button", m_bookmark); +// leftButtonBar->setActionForButton("bookmark_button", m_bookmark); leftButtonBar->setActionForButton("refresh_stop_button", m_reload); - zoomEnable(false); - addBookmarkEnable(false); +// addBookmarkEnable(false); stopEnable(false); reloadEnable(true); forwardEnable(false); @@ -773,7 +811,7 @@ void SimpleUI::filterURL(const std::string& url) m_webEngine->setURI(url); } m_simpleURI->clearFocus(); - addBookmarkEnable(false); + //addBookmarkEnable(false); } void SimpleUI::webEngineURLChanged(const std::string& url) @@ -827,34 +865,62 @@ void SimpleUI::zoomLevelChanged(int zoom_level) m_webEngine->setZoomFactor(zoom_level); m_currentZoom = static_cast (zoom_level); } -void SimpleUI::showTabMenu() -{ - if( !m_tabList ){ - BROWSER_LOGD("[%s:%d] - make_shared ", __PRETTY_FUNCTION__, __LINE__); - m_tabList = std::make_shared(m_window, - rightButtonBar->getButton("tab_button")); - m_tabList->newTabClicked.connect(boost::bind(&SimpleUI::newTabClicked,this)); - m_tabList->tabClicked.connect(boost::bind(&SimpleUI::tabClicked, this, _1)); - m_tabList->tabDelete.connect(boost::bind(&SimpleUI::closeTab, this, _1)); - m_platformInputManager->rightPressed.connect(boost::bind(&TabList::rightPressed, m_tabList.get())); - m_platformInputManager->leftPressed.connect(boost::bind(&TabList::leftPressed, m_tabList.get())); - m_platformInputManager->enterPressed.connect(boost::bind(&TabList::enterPressed, m_tabList.get())); +void SimpleUI::AddBookmarkPopup(std::string& str) +{ + BROWSER_LOGD("[%s]", __func__); + if(!m_bookmarks_manager){ + m_bookmarks_manager = std::make_shared(m_window, + rightButtonBar->getButton("bookmark_button")); + m_bookmarks_manager->addAction( m_bookmarks_manager_Add_NewFolder); + m_bookmarks_manager->addAction( m_bookmarks_manager_BookmarkBar); + m_bookmarks_manager->addAction( m_bookmarks_manager_Folder1); + m_bookmarks_manager->addAction( m_bookmarks_manager_Folder2); + m_bookmarks_manager->addAction( m_bookmarks_manager_Folder3); } m_platformInputManager->returnPressed.disconnect_all_slots(); - m_platformInputManager->returnPressed.connect(boost::bind(&SimpleUI::onReturnPressed, this, m_tabList.get())); - hidePopup.connect(boost::bind(&SimpleUI::onReturnPressed, this, m_tabList.get())); - m_tabList->addItems(m_webEngine->getTabContents()); - m_tabList->setCurrentTabId(m_webEngine->currentTabId()); - m_tabList->disableNewTabBtn(m_tabList->getItemcCount() >= m_tabLimit); - m_tabList->showPopup(); + m_platformInputManager->returnPressed.connect(boost::bind(&SimpleUI::onReturnPressed, this, m_bookmarks_manager.get())); + hidePopup.connect(boost::bind(&SimpleUI::onReturnPressed, this, m_bookmarks_manager.get())); + m_bookmarks_manager->showPopup(); } -void SimpleUI::newTabClicked() +void SimpleUI::AddNewFolderPopup(std::string& str) +{ + BROWSER_LOGD("[%s]", __func__); +} + +void SimpleUI::showTabUI() +{ +#if MERGE_ME + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_tabUI = + std::dynamic_pointer_cast + + (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.tabui")); + M_ASSERT(m_tabUI); + m_tabUI->closeTabUIClicked.connect(boost::bind(&SimpleUI::closeTabUI, this,_1)); + m_tabUI->newTabClicked.connect(boost::bind(&SimpleUI::newTabClicked, this,_1)); + m_tabUI->tabClicked.connect(boost::bind(&SimpleUI::tabClicked, this,_1)); + m_tabUI->newIncognitoTabClicked.connect(boost::bind(&SimpleUI::newTabClicked, this,_1)); + m_tabUI->show(m_window.get()); + m_tabUI->addTabItems(m_webEngine->getTabContents()); +#endif +} + +void SimpleUI::closeTabUI(const std::string& str) +{ +#if MERGE_ME + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_tabUI = nullptr; +#endif +} + +void SimpleUI::newTabClicked(const std::string& str) { BROWSER_LOGD("%s", __func__); switchViewToHomePage(); } + void SimpleUI::tabClicked(const tizen_browser::basic_webengine::TabId& tabId) { BROWSER_LOGD("%s", __func__); @@ -939,52 +1005,196 @@ void SimpleUI::authPopupButtonClicked(PopupButtons button, std::shared_ptrgetContent(m_mainLayout)); + evas_object_hide(rightButtonBar->getContent()); + evas_object_hide(leftButtonBar->getContent()); + elm_object_part_content_unset(m_mainLayout, "uri_entry"); + elm_object_part_content_unset(m_mainLayout, "uri_bar_buttons_left"); + elm_object_part_content_unset(m_mainLayout, "uri_bar_buttons_right"); +} + +void SimpleUI::showURIBar() +{ + elm_object_part_content_unset(m_mainLayout, "uri_entry"); + elm_object_part_content_unset(m_mainLayout, "uri_bar_buttons_left"); + elm_object_part_content_unset(m_mainLayout, "uri_bar_buttons_right"); + elm_object_part_content_set(m_mainLayout, "uri_entry", m_simpleURI->getContent(m_mainLayout)); + elm_object_part_content_set(m_mainLayout, "uri_bar_buttons_left", leftButtonBar->getContent()); + elm_object_part_content_set(m_mainLayout, "uri_bar_buttons_right", rightButtonBar->getContent()); + evas_object_show(m_simpleURI->getContent(m_mainLayout)); + evas_object_show(leftButtonBar->getContent()); + evas_object_show(rightButtonBar->getContent()); + m_simpleURI->setFocus(); +} +#endif + +void SimpleUI::hideWebView() +{ + evas_object_hide(elm_object_part_content_get(m_mainLayout,"web_view")); + elm_object_part_content_unset(m_mainLayout, "web_view"); +} + +void SimpleUI::hideMainUI() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if(m_mainUI) + m_mainUI->hide(); + m_mainUI = nullptr; + m_isHomePageActive = false; +} + +void SimpleUI::showMainUI() { - if(!m_settings){ - m_settings = std::make_shared(m_window, - rightButtonBar->getButton("setting_button")); - //m_settings->addAction( m_settingPointerMode); - //m_settings->addAction( m_settingPrivateBrowsing); - m_settings->addAction( m_settingDeleteHistory); - m_settings->addAction( m_settingDeleteData); - m_settings->addAction( m_settingDeleteFavorite); - //m_settingPointerMode->toggled.connect(boost::bind(&tizen_browser::base_ui::Settings::setPointerModeEnabled, m_settings.get(), _1)); + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_mainUI = + std::dynamic_pointer_cast + + (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.mainui")); + M_ASSERT(m_mainUI); + hideWebView(); + m_mainUI->show(m_window.get()); + m_mainUI->addHistoryItems(getHistory()); + + m_historyService->historyAllDeleted.connect(boost::bind(&tizen_browser::base_ui::MainUI::clearHistoryGenlist, m_mainUI.get())); + m_mainUI->historyClicked.connect(boost::bind(&SimpleUI::onHistoryClicked, this,_1)); + m_mainUI->mostVisitedClicked.connect(boost::bind(&SimpleUI::onMostVisitedClicked, this,_1)); + m_mainUI->bookmarkClicked.connect(boost::bind(&SimpleUI::onBookmarkButtonClicked, this,_1)); + m_mainUI->bookmarkManagerClicked.connect(boost::bind(&SimpleUI::onBookmarkManagerButtonClicked, this,_1)); + m_isHomePageActive = true; +} + +void SimpleUI::showHistoryUI(const std::string& str) +{ +#if MERGE_ME + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_historyUI = + std::dynamic_pointer_cast + + (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.historyui")); + M_ASSERT(m_historyUI); + m_historyUI->closeHistoryUIClicked.connect(boost::bind(&SimpleUI::closeHistoryUI, this,_1)); + m_historyUI->historyItemClicked.connect(boost::bind(&SimpleUI::onHistoryClicked, this,_1)); + m_historyUI->addHistoryItems(getHistory()); + m_historyUI->show(m_window.get()); +#endif +} + +void SimpleUI::closeHistoryUI(const std::string& str) +{ +#if MERGE_ME + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_historyUI = nullptr; +#endif +} + +void SimpleUI::showSettingsUI(const std::string& str) +{ +#if MERGE_ME + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if(!m_settingsUI){ + m_settingsUI = + std::dynamic_pointer_cast + + (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.settingsui")); + M_ASSERT(m_settingsUI); + m_settingsUI->closeSettingsUIClicked.disconnect_all_slots(); + m_settingsUI->closeSettingsUIClicked.connect(boost::bind(&SimpleUI::closeSettingsUI, this,_1)); + m_settingsUI->deleteSelectedDataClicked.disconnect_all_slots(); + m_settingsUI->deleteSelectedDataClicked.connect(boost::bind(&SimpleUI::settingsDeleteSelectedData, this,_1)); + m_settingsUI->resetMostVisitedClicked.disconnect_all_slots(); + m_settingsUI->resetMostVisitedClicked.connect(boost::bind(&SimpleUI::settingsResetMostVisited, this,_1)); + m_settingsUI->resetBrowserClicked.disconnect_all_slots(); + m_settingsUI->resetBrowserClicked.connect(boost::bind(&SimpleUI::settingsResetBrowser, this,_1)); + m_settingsUI->show(m_window.get()); + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); } - m_platformInputManager->returnPressed.disconnect_all_slots(); - m_platformInputManager->returnPressed.connect(boost::bind(&SimpleUI::onReturnPressed, this, m_settings.get())); - hidePopup.connect(boost::bind(&SimpleUI::onReturnPressed, this, m_settings.get())); - m_settingDeleteHistory->setEnabled(m_historyService->getHistoryItemsCount()); - m_settingDeleteFavorite->setEnabled(m_favoriteService->countBookmarksAndSubFolders()); - m_settings->showPopup(); +#endif +} + +void SimpleUI::closeSettingsUI(const std::string& str) +{ +#if MERGE_ME + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_settingsUI.reset(); +#endif +} +void SimpleUI::showMoreMenu() +{ +#if MERGE_ME + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + bool current_tab_as_new_tab = isHomePageActive() || (m_historyService->getHistoryItemsCount() == 0); + if(!m_moreMenuUI){ + m_moreMenuUI = + std::dynamic_pointer_cast + + (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.moremenuui")); + M_ASSERT(m_moreMenuUI); + m_moreMenuUI->historyUIClicked.connect(boost::bind(&SimpleUI::showHistoryUI, this,_1)); + m_moreMenuUI->settingsClicked.connect(boost::bind(&SimpleUI::showSettingsUI, this,_1)); + m_moreMenuUI->closeMoreMenuClicked.disconnect_all_slots(); + m_moreMenuUI->closeMoreMenuClicked.connect(boost::bind(&SimpleUI::closeMoreMenu, this,_1)); + m_moreMenuUI->AddBookmarkInput.disconnect_all_slots(); + m_moreMenuUI->AddBookmarkInput.connect(boost::bind(&SimpleUI::addToBookmarks, this,_1)); + m_moreMenuUI->BookmarkFolderCreated.disconnect_all_slots(); + m_moreMenuUI->BookmarkFolderCreated.connect(boost::bind(&SimpleUI::NewFolder, this,_1,_2,_3)); + m_moreMenuUI->show(m_window.get()); + m_moreMenuUI->getBookmarkFolderList(getBookmarkFolders()); + m_moreMenuUI->showCurrentTab(current_tab_as_new_tab ? nullptr : m_historyService->getHistoryItems().front()); + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + } +#endif } -void SimpleUI::showHistory() +void SimpleUI::closeMoreMenu(const std::string& str) { - if(!m_historyList) { - m_historyList = std::make_shared(m_window, rightButtonBar->getButton("history_button")); - m_historyList->clickedHistoryItem.connect(boost::bind(&SimpleUI::openLinkFromPopup, this,_1)); - m_historyList->deleteHistoryItem.connect(boost::bind(&tizen_browser::services::HistoryService::clearURLHistory, m_historyService.get(),_1)); - m_historyList->deleteHistoryItem.connect(boost::bind(&SimpleUI::hideHistory, this)); +#if MERGE_ME + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_moreMenuUI.reset() ; +#endif +} - m_platformInputManager->rightPressed.connect(boost::bind(&HistoryList::rightPressed, m_historyList.get())); - m_platformInputManager->leftPressed.connect(boost::bind(&HistoryList::leftPressed, m_historyList.get())); - m_platformInputManager->enterPressed.connect(boost::bind(&HistoryList::enterPressed, m_historyList.get())); +void SimpleUI::showBookmarkManagerMenu() +{ +#if MERGE_ME + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if(!m_bookmarkManagerUI){ + m_bookmarkManagerUI = + std::dynamic_pointer_cast + + (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.bookmarkmanagerui")); + M_ASSERT(m_bookmarkManagerUI); + m_bookmarkManagerUI->closeBookmarkManagerClicked.disconnect_all_slots(); + m_bookmarkManagerUI->closeBookmarkManagerClicked.connect(boost::bind(&SimpleUI::closeBookmarkManagerMenu, this,_1)); + m_bookmarkManagerUI->saveFolderClicked.disconnect_all_slots(); + m_bookmarkManagerUI->saveFolderClicked.connect(boost::bind(&SimpleUI::saveFolder, this,_1,_2,_3)); + m_bookmarkManagerUI->bookmarkFolderClicked.disconnect_all_slots(); + m_bookmarkManagerUI->bookmarkFolderClicked.connect(boost::bind(&SimpleUI::updateBookmakMangaerGenGrid, this,_1)); + m_bookmarkManagerUI->show(m_window.get()); + m_bookmarkManagerUI->addBookmarkFolderItems(getBookmarkFolders()); + m_bookmarkManagerUI->showTopContent(); } - m_platformInputManager->returnPressed.disconnect_all_slots(); - m_platformInputManager->returnPressed.connect(boost::bind(&SimpleUI::onReturnPressed, this, m_historyList.get())); - hidePopup.connect(boost::bind(&SimpleUI::onReturnPressed, this, m_historyList.get())); - m_historyList->addItems(m_historyService->getHistoryItems()); - m_historyList->showPopup(); +#endif } -void SimpleUI::disableHistoryButton(bool flag) +void SimpleUI::updateBookmakMangaerGenGrid(int folder_id) { - BROWSER_LOGD("[%s:%d] flag:%d ", __PRETTY_FUNCTION__, __LINE__, flag); - m_history->setEnabled(!flag); - m_settingDeleteHistory->setEnabled(m_historyService->getHistoryItemsCount()); - hidePopup(); +#if MERGE_ME + m_bookmarkManagerUI->updateGengrid(); + m_bookmarkManagerUI->addBookmarkItems(getBookmarks(folder_id)); + m_bookmarkManagerUI->showTopContent(); +#endif +} + +void SimpleUI::closeBookmarkManagerMenu(std::string& str) +{ +#if MERGE_ME + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_bookmarkManagerUI.reset(); +#endif } void SimpleUI::openLinkFromPopup(const std::string &uri) @@ -1010,75 +1220,80 @@ void SimpleUI::settingsPrivateModeSwitch(bool newState) BROWSER_LOGD("[%s:%d] webEngine private mode: %s", __PRETTY_FUNCTION__, __LINE__, (m_webEngine->isPrivateMode() ? "true" : "false")); } -void SimpleUI::settingsDeleteHistory() +void SimpleUI::settingsDeleteSelectedData(const std::string& str) { BROWSER_LOGD("[%s]: Deleting Hisory", __func__); SimplePopup *popup = SimplePopup::createPopup(); - popup->setTitle("Delete history"); + popup->setTitle("Delete selected data"); popup->addButton(OK); popup->addButton(CANCEL); - popup->setMessage("Are you sure you want to clear all browsing history?"); - popup->buttonClicked.connect(boost::bind(&SimpleUI::onDeleteHistoryButton, this, _1, _2)); + popup->setMessage("Are you sure you want to delete all selected data?"); + std::shared_ptr popupData = std::make_shared(); + popupData->text = str; + popup->setData(popupData); + popup->buttonClicked.connect(boost::bind(&SimpleUI::onDeleteSelectedDataButton, this, _1, _2)); popup->show(); } -void SimpleUI::settingsDeleteData() +void SimpleUI::onDeleteSelectedDataButton(PopupButtons button, std::shared_ptr< PopupData > popupData) { - BROWSER_LOGD("[%s]", __func__); - SimplePopup *popup = SimplePopup::createPopup(); - popup->setTitle("Delete data"); - popup->addButton(OK); - popup->addButton(CANCEL); - popup->setMessage("Are you sure you want to clear all cookies and cache?"); - popup->buttonClicked.connect(boost::bind(&SimpleUI::onDeleteDataButton, this, _1, _2)); - popup->show(); - + if(button == OK){ + BROWSER_LOGD("[%s]: OK", __func__); + std::string dataText = std::static_pointer_cast(popupData)->text; + BROWSER_LOGD("[%s]: TYPE : %s", __func__, dataText.c_str()); + if (dataText.find("CACHE") != std::string::npos) + m_webEngine->clearPrivateData(); + if (dataText.find("COOKIES") != std::string::npos) + m_webEngine->clearPrivateData(); + if (dataText.find("HISTORY") != std::string::npos) + m_historyService->clearAllHistory(); + //webTitleBar->removeFavIcon(); + //webTitleBar->show("History deleted"); + } } -void SimpleUI::settingsDeleteFavorite() +void SimpleUI::settingsResetMostVisited(const std::string& str) { - BROWSER_LOGD("[%s]", __func__); + BROWSER_LOGD("[%s]: Deleting Hisory", __func__); SimplePopup *popup = SimplePopup::createPopup(); - popup->setTitle("Delete favorite site"); + popup->setTitle("Delete most visited"); popup->addButton(OK); popup->addButton(CANCEL); - popup->setMessage("Are you sure you want to clear all favorite site?"); - popup->buttonClicked.connect(boost::bind(&SimpleUI::onDeleteFavoriteButton, this, _1, _2)); + popup->setMessage("Are you sure you want to delete most visited sites?"); + popup->buttonClicked.connect(boost::bind(&SimpleUI::onDeleteMostVisitedButton, this, _1, _2)); popup->show(); } -void SimpleUI::onDeleteHistoryButton(PopupButtons button, std::shared_ptr< PopupData > /*popupData*/) +void SimpleUI::onDeleteMostVisitedButton(PopupButtons button, std::shared_ptr< PopupData > /*popupData*/) { if(button == OK){ BROWSER_LOGD("[%s]: OK", __func__); - m_historyService->clearAllHistory(); - m_history->setEnabled(false); + BROWSER_LOGD("[%s]: Deleting most visited", __func__); + /*m_historyService->clearAllHistory(); webTitleBar->removeFavIcon(); - webTitleBar->show("All histories are deleted"); - hidePopup(); + webTitleBar->show("History deleted");*/ } } -void SimpleUI::onDeleteDataButton(PopupButtons button, std::shared_ptr< PopupData > /*popupData*/) +void SimpleUI::settingsResetBrowser(const std::string& str) { - if(button == OK){ - BROWSER_LOGD("[%s]: OK", __func__); - m_webEngine->clearPrivateData(); - webTitleBar->removeFavIcon(); - webTitleBar->show("All cookies and cache are deleted"); - hidePopup(); - } + BROWSER_LOGD("[%s]: Deleting Hisory", __func__); + SimplePopup *popup = SimplePopup::createPopup(); + popup->setTitle("Reset browser"); + popup->addButton(OK); + popup->addButton(CANCEL); + popup->setMessage("Are you sure you want to reset browser?"); + popup->buttonClicked.connect(boost::bind(&SimpleUI::onResetBrowserButton, this, _1, _2)); + popup->show(); } -void SimpleUI::onDeleteFavoriteButton(PopupButtons button, std::shared_ptr< PopupData > /*popupData*/) +void SimpleUI::onResetBrowserButton(PopupButtons button, std::shared_ptr< PopupData > /*popupData*/) { if(button == OK){ BROWSER_LOGD("[%s]: OK", __func__); - m_favoriteService->deleteAllBookmarks(); - bookmarkCheck(); - webTitleBar->removeFavIcon(); - webTitleBar->show("Favorites deleted"); - hidePopup(); + BROWSER_LOGD("[%s]: Resetting browser", __func__); + /*webTitleBar->removeFavIcon(); + webTitleBar->show("History deleted");*/ } } @@ -1114,7 +1329,7 @@ void SimpleUI::updateView() { switchViewToHomePage(); elm_object_part_text_set(rightButtonBar->getContent(), "tabs_number", ""); } else { - if (isHomePageActive() != true) { + if (!isHomePageActive()) { updateBrowserView(); } elm_object_part_text_set(rightButtonBar->getContent(), "tabs_number", (boost::format("%1%") % tabs).str().c_str()); @@ -1167,8 +1382,6 @@ void SimpleUI::hideProgressBar() evas_object_hide(m_progressBar); } - - void SimpleUI::searchWebPage(std::string &text, int flags) { m_webEngine->searchOnWebsite(text, flags); @@ -1184,12 +1397,50 @@ void SimpleUI::favicon_clicked(void *data, Evas_Object */*obj*/, const char */*e } } -void SimpleUI::addToBookmarks(void) -{ +void SimpleUI::addToBookmarks(int folder_id) +{ BROWSER_LOGD("[%s,%d],", __func__, __LINE__); if (m_favoriteService) - m_favoriteService->addToBookmarks(m_webEngine->getURI(), m_webEngine->getTitle(), std::string(), + { if( m_webEngine && !m_webEngine->getURI().empty()) + { m_favoriteService->addToBookmarks(m_webEngine->getURI(), m_webEngine->getTitle(), std::string(), m_webEngine->getSnapshotData(373, 240), - m_webEngine->getFavicon()); + m_webEngine->getFavicon(),(unsigned int)folder_id); + } + } +} + +void SimpleUI::saveFolder(const char* title,int folder_id, int by_operator) +{ BROWSER_LOGD("[%s,%d],", __func__, __LINE__); + int id = -1; + if (m_favoriteService) + m_favoriteService->save_folder(title, &id, folder_id, by_operator); + if (id >= 0 ) + { BROWSER_LOGD("[%s], Added New Folder", __func__); + } +#if MERGE_ME + if(m_bookmarkManagerUI) + { m_bookmarkManagerUI->updateGengrid(); + m_bookmarkManagerUI->addBookmarkFolderItems(getBookmarkFolders()); + } +#endif +} + + + +void SimpleUI::NewFolder(const char* title,int folder_id, int by_operator) +{ BROWSER_LOGD("[%s,%d],", __func__, __LINE__); + int id = -1; + if (m_favoriteService) + m_favoriteService->save_folder(title, &id, folder_id, by_operator); + if (id >= 0 ) + { BROWSER_LOGD("[%s], Added New Folder", __func__); + } + if (m_favoriteService) + { if( m_webEngine && !m_webEngine->getURI().empty()) + { m_favoriteService->addToBookmarks(m_webEngine->getURI(), m_webEngine->getTitle(), std::string(), + m_webEngine->getSnapshotData(373, 240), + m_webEngine->getFavicon(),(unsigned int)id); + } + } } void SimpleUI::deleteBookmark(void) diff --git a/services/SimpleUI/SimpleUI.h b/services/SimpleUI/SimpleUI.h index 5c5f736..d106d49 100644 --- a/services/SimpleUI/SimpleUI.h +++ b/services/SimpleUI/SimpleUI.h @@ -26,9 +26,6 @@ #include -//#include -//#include - #include "AbstractMainWindow.h" #include "AbstractService.h" #include "AbstractFavoriteService.h" @@ -37,9 +34,21 @@ // components #include "AbstractWebEngine.h" -#include "BookmarksUI.h" +#if MERGE_ME +#include "BookmarkManagerUI.h" +#include "MoreMenuUI.h" +#include "HistoryUI.h" +#include "SettingsUI.h" +#endif +#include "MainUI.h" +#if MERGE_ME +#include "TabUI.h" +#endif #include "ButtonBar.h" #include "HistoryService.h" +#if MERGE_ME +#include "BookmarkManagerUI.h" +#endif #include "SimpleURI.h" #include "SimpleScroller.h" #include "WebTitleBar.h" @@ -53,6 +62,7 @@ #include "WebConfirmation.h" #include "ZoomList.h" #include "TabList.h" +#include "BookmarksManager.h" #include "Settings.h" #include "HistoryList.h" #include "NetworkErrorHandler.h" @@ -68,8 +78,6 @@ void AbstractMainWindow::setMainWindow(Evas_Object * rawPtr) m_window = std::shared_ptr(rawPtr, evas_object_del); } - - class BROWSER_EXPORT SimpleUI : public AbstractMainWindow { public: @@ -106,24 +114,35 @@ private: bool isHomePageActive(); void switchViewToHomePage(); - void switchViewToBrowser(); void updateBrowserView(); + void updateWebView(); + void updateURIBarView(); void updateView(); void openNewTab(const std::string &uri); void switchToTab(const tizen_browser::basic_webengine::TabId& tabId); - void newTabClicked(); + void newTabClicked(const std::string &); void tabClicked(const tizen_browser::basic_webengine::TabId& tabId); void tabCreated(); void tabClosed(const tizen_browser::basic_webengine::TabId& id); void bookmarkCheck(); - std::vector > getBookmarks(); + std::vector > getBookmarks(int folder_id = 0); + std::vector > getBookmarkFolders(); + std::vector > getHistory(); void onBookmarkAdded(std::shared_ptr bookmarkItem); + void onBookmarkClicked(std::shared_ptr bookmarkItem); void onBookmarkDeleteClicked(std::shared_ptr bookmarkItem); void onBookmarkRemoved(const std::string& uri); + void onHistoryAdded(std::shared_ptr historyItem); + void onHistoryRemoved(const std::string& uri); + void onHistoryClicked(std::shared_ptr historyItem); + void onMostVisitedClicked(const std::string&); + void onBookmarkButtonClicked(const std::string&); + void onBookmarkManagerButtonClicked(const std::string&); + void handleConfirmationRequest(basic_webengine::WebConfirmationPtr webConfirmation); void authPopupButtonClicked(PopupButtons button, std::shared_ptr popupData); @@ -133,8 +152,6 @@ private: void setwvIMEStatus(bool status); - - sharedAction m_back; sharedAction m_forward; sharedAction m_stopLoading; @@ -142,14 +159,22 @@ private: sharedAction m_bookmark; sharedAction m_unbookmark; sharedAction m_tab; - sharedAction m_history; + sharedAction m_share; sharedAction m_zoom_in; - sharedAction m_showSettingsPopup; + sharedAction m_showMoreMenu; + sharedAction m_showBookmarkManagerUI; sharedAction m_settingPointerMode; -// sharedAction m_settingPrivateBrowsing; + sharedAction m_settingPrivateBrowsing; sharedAction m_settingDeleteHistory; sharedAction m_settingDeleteData; sharedAction m_settingDeleteFavorite; + sharedAction m_mostvisited; + sharedAction m_bookmarksvisited; + sharedAction m_bookmarks_manager_Add_NewFolder; + sharedAction m_bookmarks_manager_BookmarkBar; + sharedAction m_bookmarks_manager_Folder1; + sharedAction m_bookmarks_manager_Folder2; + sharedAction m_bookmarks_manager_Folder3; /** * \brief filters URL before it is passed to WebEngine. @@ -173,13 +198,13 @@ private: * and this is a back function that checks if address emited from browser should be changed. */ void webEngineURLChanged(const std::string& url); - - /** + void onmostHistoryvisitedClicked(); + void onBookmarkvisitedClicked(); + /** * @brief Adds current page to bookmarks. * */ - void addToBookmarks(void); - + void addToBookmarks(int); /** * @brief Remove current page from bookmarks * @@ -197,31 +222,48 @@ private: void showHistory(); void hideHistory(); - - /** - * \brief shows Tab showTabMenu - */ - void showTabMenu(); - - void showSettingsMenu(); + void AddBookmarkPopup(std::string& str); + void AddNewFolderPopup(std::string& str); + + void saveFolder(const char* title, int folder_id, int by_user); + void NewFolder(const char* title, int folder_id, int by_user); + void showTabUI(); + void closeTabUI(const std::string& str); + void showMoreMenu(); + void closeMoreMenu(const std::string& str); + void showHistoryUI(const std::string& str); + void closeHistoryUI(const std::string& str); + void showMainUI(); + void hideMainUI(); + void showURIBar(); + void hideURIBar(); + void hideWebView(); void hideSettingsMenu(); + void showSettingsUI(const std::string&); + void closeSettingsUI(const std::string&); void showProgressBar(); void hideProgressBar(); + void closeBookmarkManagerMenu(std::string& str); + void updateBookmakMangaerGenGrid(int folder_id); + void showBookmarkManagerMenu(); void showPopup(Evas_Object *content, char* btn1_text, char* btn2_text); - void closeTab(); void closeTab(const tizen_browser::basic_webengine::TabId& id); void settingsPointerModeSwitch(bool newState); void settingsPrivateModeSwitch(bool newState); - void settingsDeleteHistory(); void settingsDeleteData(); void settingsDeleteFavorite(); - void onDeleteHistoryButton(PopupButtons button, std::shared_ptr popupData); + void settingsDeleteSelectedData(const std::string& str); + void settingsResetMostVisited(const std::string& str); + void settingsResetBrowser(const std::string& str); + void onDeleteSelectedDataButton(PopupButtons button, std::shared_ptr popupData); + void onDeleteMostVisitedButton(PopupButtons button, std::shared_ptr popupData); + void onResetBrowserButton(PopupButtons button, std::shared_ptr popupData); void onDeleteDataButton(PopupButtons button, std::shared_ptr popupData); void onDeleteFavoriteButton(PopupButtons button, std::shared_ptr popupData); void tabLimitPopupButtonClicked(PopupButtons button, std::shared_ptr< PopupData > /*popupData*/); @@ -242,6 +284,7 @@ private: Evas_Object *m_mainLayout; Evas_Object *m_progressBar; Evas_Object *m_popup; + Evas_Object *m_entry; Evas_Object *m_errorLayout; CustomPopup *m_ownPopup; SimpleScroller *m_scroller; @@ -249,19 +292,32 @@ private: std::shared_ptr> m_webEngine; std::shared_ptr m_simpleURI; std::shared_ptr leftButtonBar; + std::shared_ptr webviewbar; + std::shared_ptr rightButtonBar; std::shared_ptr m_favoriteService; std::shared_ptr m_historyService; - std::shared_ptr m_bookmarksUI; +#if MERGE_ME + std::shared_ptr m_moreMenuUI; + std::shared_ptr m_bookmarkManagerUI; +#endif + std::shared_ptr m_mainUI; +#if MERGE_ME + std::shared_ptr m_historyUI; + std::shared_ptr m_settingsUI; + std::shared_ptr m_tabUI; +#endif std::shared_ptr m_zoomList; std::shared_ptr m_tabList; std::shared_ptr m_platformInputManager; std::shared_ptr m_sessionService; tizen_browser::Session::Session m_currentSession; + std::shared_ptr m_bookmarks_manager; std::shared_ptr m_settings; std::shared_ptr m_historyList; std::shared_ptr webTitleBar; bool m_initialised; + bool m_isHomePageActive; zoom_type m_currentZoom; int m_tabLimit; int m_favoritesLimit; diff --git a/services/SimpleUI/edc/BookmarksManager.edc b/services/SimpleUI/edc/BookmarksManager.edc new file mode 100644 index 0000000..0b6e9b9 --- /dev/null +++ b/services/SimpleUI/edc/BookmarksManager.edc @@ -0,0 +1,574 @@ +#define WIDTH 473 +#define HEIGHT 490 +#define DEBUG_RECT_OVER(over_part, r, g, b) \ + part { name: __CONCAT("dbg_rect_at_", __stringify(__LINE__)); \ + \ +scale:1; \ + type : RECT; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + visible: 1; \ + color: r g b 128; \ + rel1 { to: over_part; relative: 0 0; } \ + rel2 { to: over_part; relative: 1 1; } \ + } \ + } +data { item: "width" WIDTH; item: "height" HEIGHT; } +color_classes{ + color_class{ + name: "defaultFontColor"; + color: 211 211 211 255; + } + color_class{ + name: "disabledFontColor"; + color: 60 60 60 160; + } + color_class{ + name: "selectedItemFontColor"; + color: 255 255 255 255; + } + color_class{ + name: "transparent"; + color: 0 0 0 0; + } + color_class{ + name: "selectedBackground"; + color: 69 143 255 255; + } + color_class{ + name: "dimmColor"; + color: 0 0 0 128; + } + color_class{ + name: "on_offBackgroundColor"; + color: 255 255 255 255; + } +} +collections { + group{ name: "elm/genlist/base/bookmarks_manager"; + min: 473 426; + max: 473 426; + parts{ + part { name: "clipper"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + rel1 { + relative: 0 0; + } + rel2{ + relative: 1 1; + } + } + } + part{ + name: "background"; + type: RECT; + description{ + state: "default" 0.0; + color: 18 22 34 255; + rel1{ + relative: 0 0; + } + rel2{ + relative: 1 1; + } + } + } + part{ + name: "elm.swallow.content"; + type: SWALLOW; + clip_to: "clipper"; + mouse_events: 1; + description{ + state: "default" 0.0; + align: 0.5 0.5; + fixed: 1 1; + rel1{ + relative: 0 0; + } + rel2{ + relative: 1 1; + } + } + } + part{ + name: "elm.swallow.empty"; + type: SWALLOW; + description{ + state: "default" 0.0; + fixed: 1 1; + rel1{ + relative: 0.5 0.5; + } + rel2{ + relative: 0.5 0.5; + } + } + } + part{ name: "dimmer"; + type: RECT; + description{ + state: "default" 0.0; + color: 0 0 0 128; + visible: 0; + } + description{ + state: "popup_show" 0.0; + inherit: "default"; + visible:1; + } + } + }//parts + programs{ + program{ + name: "show_popup"; + signal: "show_popup"; + source: "SettingsModel"; + action: STATE_SET "popup_show" 0.0; + target: "dimmer"; + } + program{ + name: "hide_popup"; + signal: "hide_popup"; + source: "SettingsModel"; + action: STATE_SET "default" 0.0; + target: "dimmer"; + } + } + }//group + group{ name: "elm/genlist/item/bookmarks_manager_item/default"; + alias: "elm/genlist/item_odd/bookmarks_manager_item/default"; + alias: "elm/genlist/item_compress/bookmarks_manager_item/default"; + alias: "elm/genlist/item_compress_odd/bookmarks_manager_item/default"; + min: 473 80; + max: 473 80; + data.item: "texts" "optionName"; + data.item: "contents" "optionValue"; + parts{ + part{ + name: "value_helper"; + mouse_events:0; + description{ + state: "default" 0.0; + color: 0 0 0 0; + } + description{ + state: "on" 0.0; + color: 0 0 0 0; + } + description{ + state: "off" 0.0; + color: 0 0 0 0; + } + } + part{ + name: "optionBackground"; + type: RECT; + mouse_events: 1; + description{ + state: "default" 0.0; + color_class: "transparent"; + rel1{ + relative: 0.0 0.0; + } + rel2{ + relative: 1.0 1.0; + } + } + description{ + state: "mouseOver" 0.0; + inherit: "default"; + color_class: "selectedBackground"; + } + description{ + state: "mouseOut" 0.0; + inherit: "default"; + } + description{ + state: "selected" 0.0; + inherit: "mouseOver"; + } + } + part{ name:"optionName"; + type: TEXT; + description{ + state: "default" 0.0; + align: 0 0.5; + min: 298 80; + max: 298 80; + color_class: "defaultFontColor"; + rel1{ + relative: 0.0 0.0; + offset: 25 0; + } + rel2.relative: 1.0 1.0; + text{ + size: 30; + align: 0 0.5; + } + } + description{ + state: "mouseOut" 0.0; + inherit: "default"; + } + description{ + state: "mouseOver" 0.0; + inherit: "default" 0.0; + color_class: "selectedItemFontColor"; + } + description{ + state: "disabled" 0.0; + inherit: "default" 0.0; + color_class: "disabledFontColor"; + } + } + part{ name: "optionValue"; + type: SWALLOW; + description{ + state: "default" 0.0; + align: 0 0.5; + fixed: 1 1; + min: 100 40; + max: 100 40; + visible: 1; + rel1{ + relative: 1.0 0.0; + to: "optionName"; + offset: 25 0; + } + rel2{ + relative: 1.0 1.0; + } + } + } + programs{ + program{ name: "mouse_in"; + signal: "mouse,in"; + source: "option*"; + script{ + new cur_state_helper[31]; + new Float:index; + get_state(PART:"optionName", cur_state_helper, 30, index); + if(!strcmp(cur_state_helper,"default")){ + set_state(PART:"optionBackground", "mouseOver", 0.0); + } + } + } + program{ name: "mouse_out"; + signal: "mouse,out"; + source: "option*"; + script{ + new st[31]; + new Float:vl + get_state(PART:"optionBackground", st, 30, vl); + if(strcmp(st,"selected")){ + set_state(PART:"optionBackground", "mouseOut", 0.0); + } + } + } + program{ signal: "selected"; + source: "SettingsModel"; + action: STATE_SET "selected" 0.0; + target: "optionBackground"; + } + program{ signal: "unselected"; + source: "SettingsModel"; + action: STATE_SET "mouseOut" 0.0; + target: "optionBackground"; + } + program{ name: "go_disabled"; + signal: "elm,state,disabled"; source: "elm"; + action: STATE_SET "disabled" 0.0; + target: "optionName"; + } + program{ name: "go_enabled"; + signal: "elm,state,enabled"; source: "elm"; + action: STATE_SET "default" 0.0; + target: "optionName"; + } + program{ name: "go_Off"; + signal: "switch,off"; + source: "SettingsModel"; + action: STATE_SET "off" 0.0; + target: "value_helper"; + } + program{ name: "go_On"; + signal: "switch,on"; + source: "SettingsModel"; + action: STATE_SET "on" 0.0; + target: "value_helper"; + } + program{ name: "go_switch_hide"; + signal: "switch,hide"; + source: "SettingsModel"; + action: STATE_SET "default" 0.0; + target: "value_helper"; + } + }//programs + }//parts + }//group + group{ name: "elm/ctxpopup/bg/bookmarks_manager_button"; + parts { + part{ + name: "base_bg"; + type: RECT; + mouse_events: 1; + description{ + state: "default" 0.0; + color: 0 0 0 0; + } + } + } + programs{ + program { + signal: "mouse,clicked,*"; + source: "base_bg"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + } + }//group: "elm/ctxpopup/bg/bookmarks_manager_button"; + group{ name: "elm/ctxpopup/base/bookmarks_manager_button"; + max: 0 0; + parts{ + part{ + name: "base"; + scale: 1; + type: RECT; + description{ + state: "default" 0.0; + min: 185 164; + max: 185 164; + //color: 0 0 0 0; + color_class: "transparent"; + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + color_class: "on_offBackgroundColor"; + visible: 1; + } + } + part{ + name: "elm.swallow.content"; + scale: 1; + type: SWALLOW; + description{ + state: "default" 0.0; + rel1{ + to:"base"; + relative: 0 0; + } + rel2{ + to:"base"; + relative:1 1; + } + } + } + } + programs { + program { + signal: "elm,state,show"; source: "elm"; + action: STATE_SET "visible" 0.0; + transition: LINEAR 0.2; + target: "base"; + } + program { + signal: "elm,state,hide"; source: "elm"; + action: STATE_SET "default" 0.0; + transition: LINEAR 0.3; + target: "base"; + after: "hide2"; + } + program { name: "hide2"; + action: SIGNAL_EMIT "elm,action,hide,finished" ""; + } + } + }//group "elm/ctxpopup/base/bookmarks_manager_button"; + group{ name: "elm/radio/base/bookmarks_manager_radio"; + images.image: "check_foc.png" COMP; + images.image: "check_nor.png" COMP; + parts{ + part{name: "item_bg"; type: RECT; mouse_events:0; + scale: 1; + description{ + state: "default" 0.0; + color_class: "transparent"; + min: 185 82; + max: 185 82; + } + description{ + state: "mouse_over" 0.0; + inherit: "default"; + color_class: "selectedBackground"; + } + } + part{name: "left_spacer"; type: SPACER; + scale: 1; + description{ + state: "default" 0.0; + min: 20 82; + max: 20 82; + align: 0 0; + rel1{ + relative:0 0; + to: item_bg; + } + } + } + part{name: "elm.text"; type: TEXT; mouse_events: 0; + scale: 1; + description{ + state: "default" 0.0; + color_class: "defaultFontColor"; + align: 0 0.5; + rel1{ + relative: 1 0; + to: "left_spacer"; + } + rel2{ + relative: 0 1; + to_x: "indicator"; + to_y: "right_spacer"; + } + text{ + size: 30; + align: 0 0.5; + } + } + description{ + state: "mouse_over" 0.0; + inherit: "default"; + color_class: "selectedItemFontColor"; + } + } + part { name: "indicator"; mouse_events: 0; + scale: 1; + type: IMAGE; + description { state: "default" 0.0; + align: 1 0.5; + rel2{ + relative: 0 1; + to: "right_spacer"; + } + min: 38 38; + max: 38 38; + visible: 0; + } + description { + state: "selected" 0.0; + inherit: "default" 0.0; + visible: 1; + image.normal: "check_foc.png"; + } + description{ + state: "selected_mouse_over" 0.0; + inherit: "selected"; + image.normal: "check_nor.png"; + } + } + part{ name: "right_spacer"; type: SPACER; + scale: 1; + description{ + state: "default" 0.0; + min: 20 82; + max: 20 82; + align: 1 1; + rel2{ + relative:1 1; + to: item_bg; + } + } + } + part{ name: "event"; type: RECT; + description{ + state: "default" 0.0; + color: 0 0 0 0; + } + } + }//parts + script { + public mouse_in() { + new st[31]; + new Float:vl + get_state(PART:"indicator", st, 30, vl) + if(!strcmp(st,"selected")) + set_state(PART:"indicator", "selected_mouse_over", 0.0); + set_state(PART:"item_bg", "mouse_over", 0.0); + set_state(PART:"elm.text", "mouse_over", 0.0); + } + public mouse_out() { + new st[31]; + new Float:vl + get_state(PART:"indicator", st, 30, vl) + if(!strcmp(st,"selected_mouse_over")) + set_state(PART:"indicator", "selected", 0.0); + set_state(PART:"item_bg", "default", 0.0); + set_state(PART:"elm.text", "default", 0.0); + } + } + programs{ + program{ + signal: "mouse,clicked,1"; source: "event"; + action: SIGNAL_EMIT "elm,action,radio,toggle" ""; + } + program{ + signal: "mouse,in"; source: "event"; + script{ + mouse_in(); + } + } + program{ + signal: "mouse,out"; source: "event"; + script{ + mouse_out(); + } + } + program{ + signal: "elm,action,focus"; source: "elm"; + script{ + mouse_in(); + } + } + program{ + signal: "elm,action,unfocus"; source: "elm"; + script{ + mouse_out(); + } + } + program{ + signal: "elm,state,radio,on"; source: "elm"; + action: STATE_SET "selected" 0.0; + target: "indicator"; + } + program{ + signal: "elm,state,radio,off"; source: "elm"; + action: STATE_SET "default" 0.0; + target: "indicator"; + } + } + }//group "elm/radio/base/bookmarks_manager_radio"; + + group { name: "elm/label/base/bookmarks_manager_label"; + styles { + style { name: "label_style"; + base: "font="FNBD" font_size=30 text_class=tb_plain align=center color=#d3d3d3ff"; + tag: "br" "\n"; + tag: "hilight" "+ font="FNBD" color=#d3d3d3ff text_class=tb_plain"; + tag: "b" "+ font="FNBD" color=#d3d3d3ff text_class=tb_light"; + } + } + parts { + part { name: "elm.text"; type: TEXTBLOCK; + scale: 1; + description { state: "default" 0.0; + text { style: "label_style"; + min: 1 1; + } + } + } + } + } +}//collections diff --git a/services/SimpleUI/edc/LeftButtonBar.edc b/services/SimpleUI/edc/LeftButtonBar.edc index 7491c3d..5de8ab2 100644 --- a/services/SimpleUI/edc/LeftButtonBar.edc +++ b/services/SimpleUI/edc/LeftButtonBar.edc @@ -3,17 +3,13 @@ collections { -FOUR_STATE_IMAGE_BUTTON("browser/toolbar_prev", 70, 70, "web_ico_prev.png") +FOUR_STATE_IMAGE_BUTTON("browser/toolbar_prev", 82, 102, "btn_bar_back_nor.png") -FOUR_STATE_IMAGE_BUTTON("browser/toolbar_next", 70, 70, "web_ico_next.png") +FOUR_STATE_IMAGE_BUTTON("browser/toolbar_next", 82, 102, "btn_bar_forward_nor.png") -FOUR_STATE_IMAGE_BUTTON("browser/toolbar_reload", 70, 70, "web_ico_reload.png") +FOUR_STATE_IMAGE_BUTTON("browser/toolbar_reload", 82, 102, "btn_bar_reload_nor.png") -FOUR_STATE_IMAGE_BUTTON("browser/toolbar_stop", 70, 70, "web_ico_stop.png") - -FOUR_STATE_IMAGE_BUTTON("browser/toolbar_bookmark", 70, 70, "web_ico_favorite_on.png") - -FOUR_STATE_IMAGE_BUTTON("browser/toolbar_unbookmark", 70, 70, "web_ico_favorite_off.png") +FOUR_STATE_IMAGE_BUTTON("browser/toolbar_stop", 82, 102, "btn_bar_stop_nor.png") group { name: "left_button_bar"; @@ -99,33 +95,6 @@ FOUR_STATE_IMAGE_BUTTON("browser/toolbar_unbookmark", 70, 70, "web_ico_favorite_ } } - ADD_SPACER("spacer_3", "refresh_stop_button", 10, 70) - - part { name: "bookmark_button"; - type : SWALLOW; - scale: 1; - description { - state: "default" 0.0; - visible: 1; - align: 0.0 0.0; - fixed: 1 1; - min: 70 70; - max: 70 70; - rel1 { relative: 1.0 0.0; to: spacer_3; } - rel2 { relative: 0.0 0.0; } - } - description { - state: "hidden" 0.0; - inherit: "default" 0.0; - visible: 0; - } - description { - state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - } } } diff --git a/services/SimpleUI/edc/MainLayout.edc b/services/SimpleUI/edc/MainLayout.edc index 3e70303..aedfdbd 100644 --- a/services/SimpleUI/edc/MainLayout.edc +++ b/services/SimpleUI/edc/MainLayout.edc @@ -1,3 +1,6 @@ +#define URI_LENGTH 1720 +#define URI_LENGTH_SHORT 1460 +#define URI_WIDTH 82 #include "Spacer.edc" #define DEBUG_RECT_OVER(over_part, r, g, b) \ part { name: __CONCAT("dbg_rect_at_", __stringify(__LINE__)); \ @@ -8,7 +11,7 @@ scale:1; \ description { \ state: "default" 0.0; \ visible: 1; \ - color: r g b 128; \ + color: r g b 255; \ rel1 { to: over_part; relative: 0 0; } \ rel2 { to: over_part; relative: 1 1; } \ } \ @@ -27,14 +30,14 @@ collections { visible: 1; fixed: 1 1; align: 0 0; - min: 0 130; - max: 99999 130; - color: 18 22 34 230; + min: 1920 104; + max: 1920 104; + color: 255 255 255 255; rel1 { relative: 0.0 0.0; } rel2 { relative: 1.0 0.0; } } } - ADD_SPACER_OVER("left_spacer", "uri_bar_bg", 74, 130) + ADD_SPACER_OVER("left_spacer", "uri_bar_bg", 7, 104) part { name: "uri_bar_buttons_left"; type : SWALLOW; scale: 1; @@ -42,8 +45,8 @@ collections { state: "default" 0.0; visible: 1; align: 0 0.5; - min: 310 70; - max: 310 70; + min: 246 102; + max: 246 102; fixed: 1 1; rel1 { relative: 1.0 1.0; to: "left_spacer"; } rel2 { relative: 0.0 0.0; to: "left_spacer"; } @@ -59,7 +62,7 @@ collections { visible: 1; } } - ADD_SPACER("left_buttons_spacer", "uri_bar_buttons_left", 39, 70) + ADD_SPACER("left_buttons_spacer", "uri_bar_buttons_left", 0.5, 102) part { name: "uri_entry"; type : SWALLOW; scale: 1; @@ -67,9 +70,18 @@ collections { state: "default" 0.0; visible: 1; align: 0.0 0.5; - min: 994 70; - max: 994 70; + min: URI_LENGTH URI_WIDTH; + max: URI_LENGTH URI_WIDTH; fixed: 1 1; + rel1 { relative: 1.0 0.5; to: "left_spacer"; } + rel2 { relative: 1.0 0.5; to: "left_spacer"; } + } + description { + state: "moveright" 0.0; + inherit: "default" 0.0; + visible: 1; + min: URI_LENGTH_SHORT URI_WIDTH; + max: URI_LENGTH_SHORT URI_WIDTH; rel1 { relative: 1.0 0.5; to: "left_buttons_spacer"; } rel2 { relative: 1.0 0.5; to: "left_buttons_spacer"; } } @@ -84,7 +96,7 @@ collections { visible: 1; } } - ADD_SPACER("right_buttons_spacer", "uri_entry", 39, 70) + ADD_SPACER("right_buttons_spacer", "uri_entry", 26, 102) part { name: "uri_bar_buttons_right"; type : SWALLOW; scale: 1; @@ -92,8 +104,8 @@ collections { state: "default" 0.0; visible: 1; align: 0.0 0.5; - min: 390 70; - max: 390 70; + min: 164 102; + max: 164 102; fixed: 1 1; rel1 { relative: 1.0 0.5; to: "right_buttons_spacer"; } rel2 { relative: 1.0 0.5; to: "right_buttons_spacer"; } @@ -109,7 +121,7 @@ collections { visible: 1; } } - ADD_SPACER("right_spacer", "uri_bar_buttons_right", 74, 70) + ADD_SPACER("right_spacer", "uri_bar_buttons_right", 74, 102) part { name: "web_view"; type : SWALLOW; scale: 1; @@ -156,8 +168,8 @@ collections { visible: 1; align: 0.0 0.0; fixed: 0 0; - min: 1936 8; - max: 1936 8; + min: 1920 2; + max: 1920 2; rel1 { relative: 0.0 0.0; offset: -12 -10; @@ -198,14 +210,16 @@ collections { } } + part {name: "popup_bg"; type: RECT; scale: 1; + mouse_events: 1; description {state: "default" 0.0; visible: 0; min: 1920 1080; fixed: 1 1; - color: 100 100 100 0; + color: 100 100 100 128; rel1 {relative: 0.0 0.0; } rel2 {relative: 1.0 1.0; } } @@ -219,7 +233,7 @@ collections { description { state: "default" 0.0; visible: 0; min: 0 0; - max: 1920 1080; + max: 700 800; align: 0.5 0.5; rel1 { relative: 0.0 0.0; to: "web_view";} rel2 { relative: 1.0 1.0; to: "web_view";} @@ -232,7 +246,20 @@ collections { } } } +} programs { + program { name: "shiftright_uribar"; + signal: "shiftright_uri"; + source: "ui"; + action: STATE_SET "moveright" 0.0; + target: "uri_entry"; + } + program { name: "shiftback_uribar"; + signal: "shiftback_uri"; + source: "ui"; + action: STATE_SET "default" 0.0; + target: "uri_entry"; + } program { name: "hide_progress"; signal: "hide_progressbar_bg"; source: "ui"; @@ -261,3 +288,4 @@ collections { } } } +} diff --git a/services/SimpleUI/edc/RightButtonBar.edc b/services/SimpleUI/edc/RightButtonBar.edc index 0c5aed8..164289e 100644 --- a/services/SimpleUI/edc/RightButtonBar.edc +++ b/services/SimpleUI/edc/RightButtonBar.edc @@ -1,11 +1,8 @@ #include "ImageButton.edc" #include "Spacer.edc" collections { -FOUR_STATE_IMAGE_BUTTON("browser/toolbar_tab", 70, 70, "web_ico_tab.png") -FOUR_STATE_IMAGE_BUTTON("browser/toolbar_history", 70, 70, "web_ico_history.png") -FOUR_STATE_IMAGE_BUTTON("browser/toolbar_zoom_in", 70, 70, "web_ico_zoom_in.png") -FOUR_STATE_IMAGE_BUTTON("browser/toolbar_rss", 70, 70, "web_ico_rss.png") -FOUR_STATE_IMAGE_BUTTON("browser/toolbar_setting", 70, 70, "web_ico_setting.png") +FOUR_STATE_IMAGE_BUTTON("browser/toolbar_tab", 82, 102, "btn_bar_manager_nor.png") +FOUR_STATE_IMAGE_BUTTON("browser/toolbar_setting", 82, 102, "btn_bar_more_nor.png") group { name: "right_button_bar"; parts { @@ -44,9 +41,9 @@ FOUR_STATE_IMAGE_BUTTON("browser/toolbar_setting", 70, 70, "web_ico_setting.png" align: 0.0 0.0; min: 70 70; max: 70 70; - color: 255 255 255 153; - rel1 { relative: 0.0 0.0; to: "tab_button"; offset: -3 4;} - rel2 { relative: 1.0 1.0; to: "tab_button";} + color: 86 86 86 255; + rel1 { relative: 0.0 0.0; to: "tab_button"; offset: 5 13; } + rel2 { relative: 1.0 1.0; to: "tab_button"; } text { text: ""; font: "Tizen:style=Bold"; @@ -56,81 +53,6 @@ FOUR_STATE_IMAGE_BUTTON("browser/toolbar_setting", 70, 70, "web_ico_setting.png" } } ADD_SPACER("spacer_1", "tab_button", 10, 70) - part { name: "history_button"; - type : SWALLOW; - scale: 1; - description { - state: "default" 0.0; - visible: 1; - fixed: 1 1; - align: 0.0 0.0; - min: 70 70; - max: 70 70; - rel1 { relative: 1.0 0.0; to: "spacer_1"; } - rel2 { relative: 0.0 0.0; } - } - description { - state: "hidden" 0.0; - inherit: "default" 0.0; - visible: 0; - } - description { - state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - ADD_SPACER("spacer_2", "history_button", 10, 70) - part { name: "zoom_in_button"; - type : SWALLOW; - scale: 1; - description { - state: "default" 0.0; - visible: 1; - fixed: 1 1; - align: 0.0 0.0; - min: 70 70; - max: 70 70; - rel1 { relative: 1.0 0.0; to: "spacer_2"; } - rel2 { relative: 0.0 0.0; } - } - description { - state: "hidden" 0.0; - inherit: "default" 0.0; - visible: 0; - } - description { - state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - ADD_SPACER("spacer_3", "zoom_in_button", 10, 70) - part { name: "rss_button"; - type : SWALLOW; - scale: 1; - description { - state: "default" 0.0; - visible: 1; - fixed: 1 1; - align: 0.0 0.0; - min: 70 70; - max: 70 70; - rel1 { relative: 1.0 0.0; to: "spacer_3"; } - rel2 { relative: 0.0 0.0; } - } - description { - state: "hidden" 0.0; - inherit: "default" 0.0; - visible: 0; - } - description { - state: "visible" 0.0; - inherit: "default" 0.0; - visible: 1; - } - } - ADD_SPACER("spacer_4", "rss_button", 10, 70) part { name: "setting_button"; type : SWALLOW; scale: 1; @@ -142,7 +64,7 @@ FOUR_STATE_IMAGE_BUTTON("browser/toolbar_setting", 70, 70, "web_ico_setting.png" min: 70 70; max: 70 70; fixed: 1 1; - rel1 { relative: 1.0 0.0; to: "spacer_4"; } + rel1 { relative: 1.0 0.0; to: "spacer_1"; } rel2 { relative: 0.0 0.0; } } description { @@ -158,4 +80,4 @@ FOUR_STATE_IMAGE_BUTTON("browser/toolbar_setting", 70, 70, "web_ico_setting.png" } } } -} \ No newline at end of file +} diff --git a/services/SimpleUI/edc/webview.edc b/services/SimpleUI/edc/webview.edc new file mode 100644 index 0000000..0602899 --- /dev/null +++ b/services/SimpleUI/edc/webview.edc @@ -0,0 +1,91 @@ +#include "ImageButton.edc" +#include "Spacer.edc" +collections { + +FOUR_STATE_IMAGE_BUTTON("browser/toolbar_history", 70, 70, "web_ico_history.png") +FOUR_STATE_IMAGE_BUTTON("browser/toolbar_bookmark", 70, 70, "web_ico_favorite_on.png") + + group { + name: "web_view_bar"; + parts { + part { name: "most_visited_button"; + type :RECT; + scale: 1; + description { + + state: "default" 0.0; + visible: 1; + fixed :1 1; + align: 0.5 0.5; + min: 70 70; + max: 70 70; + + + + rel1 { + + relative: 1.0 1.0; + + offset: 150 150; + + } + + rel2 { + + relative: 0.9 0.8; + + offset: 150 150; + + } +} + +} + + + +part { name: "visited_bookmarks"; + type :RECT; + scale: 1; + description { + + state: "default" 0.0; + visible: 1; + + align: 0.5 0.5; + min: 70 70; + max: 70 70; + + fixed :1 1; + + + rel1 { + + relative: 1.0 1.0; + + offset: 150 150; + + } + + rel2 { + + relative: 0.9 0.8; + + offset: 150 150; + + } +} + +} + + + + + + + + + + + } + } + } diff --git a/services/SimpleUI/images/Black_dot.png b/services/SimpleUI/images/Black_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..21d05e5b6a2b305668c052336bda723fa82dfe10 GIT binary patch literal 1232 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 JwGh{+{{eEhJkS6D literal 0 HcmV?d00001 diff --git a/services/SimpleUI/images/btn_bar_forward_nor.png b/services/SimpleUI/images/btn_bar_forward_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..ef0b78d5b0239fe2c2ff1e13815c5b8c6597ad6f GIT binary patch literal 3385 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 literal 0 HcmV?d00001 diff --git a/services/SimpleUI/images/btn_bar_manager_nor.png b/services/SimpleUI/images/btn_bar_manager_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..3a96d3c89e124ecfbc178c4fd8d4bef81a0011af GIT binary patch literal 2988 zcmZuzXHXMr7X1*UH<6C;LNC&*bVw+n3j`Acr4tYlP?RPZdh=04x zkQ$0~0fCibP)e5fXJ>b2f829s?mhR+ocrr0Ubi%6qUWUt05F-r4Q$T&pYo)oK1Wnf zH{_h?{NeTw0ARTMPf>up7u*2QTY1A^*ROl|1^PYk^7Dt7z+e#n`+lC@cRc_Ip26Cp z5w;tg+NAjds96H$xtX602Q9<~nv7vj7n2gCV>L|>ESl!9Zo6b?NX6G%m_V75f_che zEzOujKSi@5_$np(bwX1A@nYC(pNVGD+R$13q|SQPKDKU{rj?d43$A3Xf?+I&3S9aY z-P756Utu&tiMerB{EoimKZFQq!*f9n zio$dNx$Kc(0K7Co)$olZLx7S8?4D+w>R?I+$eSQN;ow~ZXeF>R)B;*YAa9)zD+#E= zfOD^~a4?9;1?)z9NUfh&YgpH%&M%c)tA!U)H;ijAJB7%_4t zEmy~j(WJ)sp1l&?q4K)TQ23CP>{-jAR}Ts|W{~^-|J=r~C=EY7y}Gh8W!edKaOp>e zpP}2GT9K!Be@AGYkPg3nS`vv=ycKCob@Z)$@W8zI%J4I~7}wdgRO6Ed2J#92m{6yQ zD;_1qzHH4FkYbScbYHPpC=vQhvP*Q7?7p-heN3sdpaS0A(V+-SmnpmDM)}K3oD~(= zx zf=vJo%FoSn!Np`>t9 zk2%u&=`&3;#WMM%u-CV2`E1eU znq~17=rTWq?wbhv(?n|f4)YEx*cumO)d+O3G=L8(R2(+YImnhBNk4Tzl-<4dFk32ez_jvPixq%4n0`0OQuWqVoW-IMCWD7G%S?Hng{lZEm{laYeqC73O)ec- zJ^8MoIH-c;vdg9OOXvQ}Wu0X$wRy#Pd#6FQ)`s4O0jmzb0;kvo*b`y0J2{j*0!lHW z6lluCNc~8M3&%&Hj|D%c=xPu>e$`HI>pv~T>vQO*MpZ|xwp9yy_5Mh!79_3b5Yh?W z%(2%azE6CiaanUo?ucL%kByH-#_6W`C!lyo6tY!w-^!S( zNa<9_-qD&-YgBI3?Uwbl9~?(vQ6_iIuBgjO)u`UP`)T21dp~{&yTq^@#+4)2d&@th zh|qozTgq83%O8{T@DgWp$}>2Z$}Hsji`j($J|^L$e8;US zw~^U35iMe&7Cw=;+xny0>M4A-80_d*W5c&*C%11|q2%lr>RtZCVfl185|e7!iCozn zPo^YhgID?D{rW%W&OZN8UfGFvANCye+*q5JDR5xUs>oi;X1>QXJ@bKS;l_vU!(WC( zx$GecVpB8@hJXE8>tnM=X&+%oQy1|Dae(-PP~91wt9O|^x;L`J7uNhs`NufXp_z25 z)AxyJM`33%?m6ypY;s&j(yd9X*f`2M_PteY=^L=!Lpe%$N+ZmSo5X(|=O5KZ*rZNe z-7;qG`Rmgeb~i|dNtMa&?-$)m!u|#!D;p%b1(E=h#>}IqVO5JXV}Cv3NAt_wf#&Vy z8RgsN9Xq%>G+GVnj7)6Khn^S{|6+NetYsf!x{v7dp4o^R%Rui9KgDKZ!y{yW&pH!d z;lkG42n%;u{B|2z0~bdP$;s=Q&6)(qy^n!=wZzrS$dAapw;E2qn}M5JXBlHwJxwo~ z@@nvoKKPx`mijPH(gt6F8e#6BCFCb3d1AakU3;!&Kh%%ZMLJyIoQt?Geo7c^>}3z;*WOY@mjVQ!e6Yd~1?0k~312y_cQw+4phr>1OK|&s$=5 zd$+)+zF;MV+Xpv}x7&hdgZOt}FR)mxJcc}xAbb6Oe`x!q^f-ejBZEvunX`Z5rX)i= z|2H9Sa2pE%LPY_qtzHzBWEw<2iXEN?xyU90PrE>Oj*(P! zHs{U%jPef=b06z*?Q|1IjZT4B7Hs%m;s5pE-MI(=nM?`Rv{?q(Odpt>M+7E@ LmIgIY=cs=JYqxe$ literal 0 HcmV?d00001 diff --git a/services/SimpleUI/images/btn_bar_more_nor.png b/services/SimpleUI/images/btn_bar_more_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..f51cb548cf8c3b465d245c9552fc69b2e31065e5 GIT binary patch literal 3032 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 F{{UPBp$7l} literal 0 HcmV?d00001 diff --git a/services/SimpleUI/images/btn_bar_stop_nor.png b/services/SimpleUI/images/btn_bar_stop_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..c5cdc11ca8ea537497a1a794d79d40362f8659a9 GIT binary patch literal 3255 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 + if(m_currentWebView) + return m_currentWebView->getURI(); + else + return std::string(""); } bool WebKitEngineService::isLoadError() const @@ -134,7 +137,10 @@ bool WebKitEngineService::isLoadError() const std::string WebKitEngineService::getTitle() const { M_ASSERT(m_currentWebView); - return m_currentWebView->getTitle(); + if(m_currentWebView) + return m_currentWebView->getTitle(); + else + return std::string(""); } void WebKitEngineService::stopLoading(void) @@ -414,7 +420,11 @@ bool WebKitEngineService::isPrivateMode() const std::shared_ptr WebKitEngineService::getSnapshotData(int width, int height) { M_ASSERT(m_currentWebView); - return m_currentWebView->captureSnapshot(width, height); + if(m_currentWebView) + return m_currentWebView->captureSnapshot(width, height); + else + return std::make_shared(); + } std::shared_ptr WebKitEngineService::getSnapshotData(TabId id, int width, int height){ @@ -443,7 +453,10 @@ bool WebKitEngineService::hasFocus() const std::shared_ptr WebKitEngineService::getFavicon() { M_ASSERT(m_currentWebView); - return m_currentWebView->getFavicon(); + if(m_currentWebView) + return m_currentWebView->getFavicon(); + else + return std::make_shared(); } void WebKitEngineService::webViewClicked() @@ -470,8 +483,7 @@ void WebKitEngineService::setZoomFactor(int zoomFactor) void WebKitEngineService::clearPrivateData() { for(std::map::const_iterator it = m_tabs.begin(); it != m_tabs.end(); it++){ - auto item = *it; - item.second->clearPrivateData(); + it->second->clearPrivateData(); } } @@ -488,7 +500,7 @@ void WebKitEngineService::_IMEStateChanged(bool enable) void WebKitEngineService::backButtonClicked() const { M_ASSERT(m_currentWebView); - if (isBackEnabled()) { + if (isBackEnabled()) { m_currentWebView->back(); } else { app_efl_exit(); diff --git a/services/WebKitEngineService/WebView.cpp b/services/WebKitEngineService/WebView.cpp index 75ea343..7751826 100644 --- a/services/WebKitEngineService/WebView.cpp +++ b/services/WebKitEngineService/WebView.cpp @@ -24,7 +24,6 @@ #include "WebView.h" #if defined(USE_EWEBKIT) -//#include #include #endif @@ -46,7 +45,11 @@ #include "ServiceManager.h" #define certificate_crt_path CERTS_DIR +#if MERGE_ME #define APPLICATION_NAME_FOR_USER_AGENT "SamsungBrowser/1.0" +#else +#define APPLICATION_NAME_FOR_USER_AGENT "Mozilla/5.0 (X11; SMART-TV; Linux) AppleWebkit/538.1 (KHTML, like Gecko) Safari/538.1" +#endif using namespace tizen_browser::tools; @@ -57,7 +60,8 @@ namespace webkitengine_service { WebView::WebView(Evas_Object * obj, TabId tabId) : m_parent(obj) , m_tabId(tabId) - , m_ewkView(NULL) + , m_title(std::string()) + , m_ewkView(nullptr) , m_isLoading(false) , m_loadError(false) { @@ -78,7 +82,7 @@ void WebView::init(Evas_Object * opener) #if defined(USE_EWEBKIT) #if 0 //not using smart class - static Ewk_View_Smart_Class *clasz = NULL; + static Ewk_View_Smart_Class *clasz = nullptr; Ewk_Context *context = ewk_context_default_get(); if (!clasz) { clasz = smartClass(); @@ -87,11 +91,13 @@ void WebView::init(Evas_Object * opener) // clasz->run_javascript_alert = onJavascriptAlert; // clasz->run_javascript_confirm = onJavascriptConfirm; // clasz->run_javascript_prompt = onJavascriptPrompt; - clasz->window_create = onWindowCreate; - clasz->window_close = onWindowClose; +// clasz->window_create = onWindowCreate; +// clasz->window_close = onWindowClose; + ewk_context_cache_model_set(context, EWK_CACHE_MODEL_PRIMARY_WEBBROWSER); ewk_context_certificate_file_set(context, certificate_crt_path); + } Evas_Smart *smart = evas_smart_class_new(&clasz->sc); @@ -99,8 +105,8 @@ void WebView::init(Evas_Object * opener) /// \todo: Consider process model. Now, One UIProcess / One WebProcess. // if (opener) // m_ewkView = ewk_view_smart_add(evas_object_evas_get(m_parent), smart, context, ewk_view_page_group_get(opener)); - else - m_ewkView = ewk_view_smart_add(evas_object_evas_get(m_parent), smart, context, ewk_page_group_create(NULL)); +// else + m_ewkView = ewk_view_smart_add(evas_object_evas_get(m_parent), smart, context, ewk_page_group_create(nullptr)); #else m_ewkView = ewk_view_add(evas_object_evas_get(m_parent)); // Ewk_Context *context = ewk_view_context_get(m_ewkView); @@ -481,7 +487,7 @@ std::shared_ptr WebView::captureSnapshot(int M_ASSERT(targetHeight); Evas_Coord vw, vh; std::shared_ptr noImage = std::make_shared(); - evas_object_geometry_get(m_ewkView, NULL, NULL, &vw, &vh); + evas_object_geometry_get(m_ewkView, nullptr, nullptr, &vw, &vh); if (vw == 0 || vh == 0) return noImage; @@ -679,7 +685,7 @@ void WebView::__loadError(void* data, Evas_Object * obj, void* ewkError) { BROWSER_LOGD("Stop signal emitted"); BROWSER_LOGD("Error description: %s", ewk_error_description_get(error)); - evas_object_smart_callback_call(obj, "load,stop", NULL); + evas_object_smart_callback_call(obj, "load,stop", nullptr); } else { @@ -964,7 +970,7 @@ bool WebView::hasFocus() const double WebView::getZoomFactor() const { - if(EINA_UNLIKELY(m_ewkView == NULL)){ + if(EINA_UNLIKELY(m_ewkView == nullptr)){ return 1.0; } @@ -997,16 +1003,15 @@ std::shared_ptr WebView::getFavicon() { M_ASSERT(m_ewkView); #if defined(USE_EWEBKIT) - if (faviconImage.get() == NULL) { - -#if PLATFORM(TIZEN) -// Evas_Object * favicon = ewk_view_favicon_get(m_ewkView); - Evas_Object * favicon = ewk_context_icon_database_icon_object_add(ewk_view_context_get(m_ewkView), ewk_view_url_get(m_ewkView),evas_object_evas_get(m_ewkView)); + if (faviconImage.get() == nullptr) { +#if MERGE_ME +//#if PLATFORM(TIZEN) + Evas_Object * favicon = ewk_view_favicon_get(m_ewkView); + Evas_Object * favicon = ewk_context_icon_database_icon_object_add(ewk_view_context_get(m_ewkView), ewk_view_url_get(m_ewkView),evas_object_evas_get(m_ewkView)); #else Ewk_Favicon_Database * database = ewk_context_favicon_database_get(ewk_view_context_get(m_ewkView)); Evas_Object * favicon = ewk_favicon_database_icon_get(database, ewk_view_url_get(m_ewkView), evas_object_evas_get(m_ewkView)); #endif - #ifndef NDEBUG int w = 0, h = 0; evas_object_image_size_get(favicon, &w, &h); -- 2.7.4 From e9cddc2ca1637e6dc37c323cb9131da879aa0418 Mon Sep 17 00:00:00 2001 From: "k.lis2" Date: Tue, 4 Aug 2015 10:27:40 +0200 Subject: [PATCH 13/16] Task TT-78 Implement Tab Manager view [Issue#] https://bugs.tizen.org/jira/browse/TT-78 [Problem] Task TT-78 Implement Tab Manager view [Cause] - [Solution] Add TabUI. Enable code referring to TabUI in SimpleUI. [Verify] Perform basic sanity check. Change-Id: I3745297ce0e82320ccd32d0897ac3d3716574fbc --- services/BookmarkService/BookmarkService.cpp | 5 +- services/CMakeLists.txt | 2 +- services/SimpleUI/CMakeLists.txt | 7 +- services/SimpleUI/SimpleUI.cpp | 30 +- services/SimpleUI/SimpleUI.h | 4 +- services/TabUI/CMakeLists.txt | 29 + services/TabUI/TabUI.cpp | 500 ++++++++ services/TabUI/TabUI.h | 99 ++ services/TabUI/edc/TabUI.edc | 1421 +++++++++++++++++++++++ services/TabUI/edc/error.edc | 144 +++ services/TabUI/images/btn_bar_incognito_dis.png | Bin 0 -> 3046 bytes services/TabUI/images/btn_bar_incognito_foc.png | Bin 0 -> 3029 bytes services/TabUI/images/btn_bar_incognito_nor.png | Bin 0 -> 3043 bytes services/TabUI/images/btn_bar_new_dis.png | Bin 0 -> 2980 bytes services/TabUI/images/btn_bar_new_foc.png | Bin 0 -> 2963 bytes services/TabUI/images/btn_bar_new_nor.png | Bin 0 -> 2977 bytes services/TabUI/images/btn_bar_stop_nor.png | Bin 0 -> 3255 bytes services/TabUI/images/ico_delete.png | Bin 0 -> 18365 bytes services/TabUI/images/web_frame_selected.png | Bin 0 -> 17687 bytes services/TabUI/images/web_shadow.png | Bin 0 -> 17700 bytes 20 files changed, 2215 insertions(+), 26 deletions(-) create mode 100644 services/TabUI/CMakeLists.txt create mode 100644 services/TabUI/TabUI.cpp create mode 100644 services/TabUI/TabUI.h create mode 100644 services/TabUI/edc/TabUI.edc create mode 100644 services/TabUI/edc/error.edc create mode 100644 services/TabUI/images/btn_bar_incognito_dis.png create mode 100644 services/TabUI/images/btn_bar_incognito_foc.png create mode 100644 services/TabUI/images/btn_bar_incognito_nor.png create mode 100644 services/TabUI/images/btn_bar_new_dis.png create mode 100644 services/TabUI/images/btn_bar_new_foc.png create mode 100644 services/TabUI/images/btn_bar_new_nor.png create mode 100644 services/TabUI/images/btn_bar_stop_nor.png create mode 100644 services/TabUI/images/ico_delete.png create mode 100644 services/TabUI/images/web_frame_selected.png create mode 100644 services/TabUI/images/web_shadow.png diff --git a/services/BookmarkService/BookmarkService.cpp b/services/BookmarkService/BookmarkService.cpp index a1ffdae..7e30362 100644 --- a/services/BookmarkService/BookmarkService.cpp +++ b/services/BookmarkService/BookmarkService.cpp @@ -207,8 +207,9 @@ std::vector > BookmarkService::getBookmarks(int fo { bp_bookmark_info_fmt bookmark_info; bp_bookmark_adaptor_get_easy_all(ids[i], &bookmark_info); - - std::shared_ptr bookmark = std::make_shared(std::string(bookmark_info.url),std::string(bookmark_info.title), std::string(""),(int) bookmark_info.parent, ids[i]); + std::string url = (bookmark_info.url != nullptr) ? bookmark_info.url : ""; + std::string title = (bookmark_info.title != nullptr) ? bookmark_info.title : ""; + std::shared_ptr bookmark = std::make_shared(url, title, std::string(""),(int) bookmark_info.parent, ids[i]); std::shared_ptr bi = std::make_shared(); bi->imageType = tizen_browser::tools::BrowserImage::ImageType::ImageTypePNG; diff --git a/services/CMakeLists.txt b/services/CMakeLists.txt index 1d32393..547901f 100644 --- a/services/CMakeLists.txt +++ b/services/CMakeLists.txt @@ -6,7 +6,7 @@ add_subdirectory(WebKitEngineService) add_subdirectory(MainUI) # MERGE_ME #add_subdirectory(HistoryUI) -#add_subdirectory(TabUI) +add_subdirectory(TabUI) add_subdirectory(SimpleUI) #MERGE_ME #add_subdirectory(SettingsUI) diff --git a/services/SimpleUI/CMakeLists.txt b/services/SimpleUI/CMakeLists.txt index bc3292c..62578b1 100644 --- a/services/SimpleUI/CMakeLists.txt +++ b/services/SimpleUI/CMakeLists.txt @@ -54,7 +54,7 @@ include_directories(${CMAKE_SOURCE_DIR}/services/MoreMenuUI) include_directories(${CMAKE_SOURCE_DIR}/services/MainUI) #MERGE_ME #include_directories(${CMAKE_SOURCE_DIR}/services/SettingsUI) -#include_directories(${CMAKE_SOURCE_DIR}/services/TabUI) +include_directories(${CMAKE_SOURCE_DIR}/services/TabUI) include_directories(${CMAKE_SOURCE_DIR}/services/PlatformInputManager) include_directories(${CMAKE_SOURCE_DIR}/services/SessionStorage) @@ -74,7 +74,7 @@ add_dependencies(${PROJECT_NAME} MainUI) #MERGE_ME #add_dependencies(${PROJECT_NAME} HistoryUI) #add_dependencies(${PROJECT_NAME} SettingsUI) -#add_dependencies(${PROJECT_NAME} TabUI) +add_dependencies(${PROJECT_NAME} TabUI) add_dependencies(${PROJECT_NAME} PlatformInputManager) add_dependencies(${PROJECT_NAME} SessionStorage) target_link_libraries(${PROJECT_NAME} SimpleURI) @@ -86,7 +86,8 @@ target_link_libraries(${PROJECT_NAME} MainUI) #MERGE_ME #target_link_libraries(${PROJECT_NAME} HistoryUI) #target_link_libraries(${PROJECT_NAME} SettingsUI) -#target_link_libraries(${PROJECT_NAME} TabUI) +target_link_libraries(${PROJECT_NAME} TabUI) +#MERGE_ME #target_link_libraries(${PROJECT_NAME} BookmarkManagerUI) target_link_libraries(${PROJECT_NAME} PlatformInputManager) target_link_libraries(${PROJECT_NAME} SessionStorage) diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index 381088f..edf05bd 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -65,7 +65,9 @@ SimpleUI::SimpleUI() #if MERGE_ME , m_settings() , m_moreMenuUI() +#endif , m_tabUI() +#if MERGE_ME , m_bookmarkManagerUI() #endif , m_mainUI() @@ -891,28 +893,22 @@ void SimpleUI::AddNewFolderPopup(std::string& str) void SimpleUI::showTabUI() { -#if MERGE_ME BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - m_tabUI = - std::dynamic_pointer_cast - - (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.tabui")); - M_ASSERT(m_tabUI); - m_tabUI->closeTabUIClicked.connect(boost::bind(&SimpleUI::closeTabUI, this,_1)); - m_tabUI->newTabClicked.connect(boost::bind(&SimpleUI::newTabClicked, this,_1)); - m_tabUI->tabClicked.connect(boost::bind(&SimpleUI::tabClicked, this,_1)); - m_tabUI->newIncognitoTabClicked.connect(boost::bind(&SimpleUI::newTabClicked, this,_1)); - m_tabUI->show(m_window.get()); - m_tabUI->addTabItems(m_webEngine->getTabContents()); -#endif + m_tabUI = std::dynamic_pointer_cast + (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.tabui")); + M_ASSERT(m_tabUI); + m_tabUI->closeTabUIClicked.connect(boost::bind(&SimpleUI::closeTabUI, this,_1)); + m_tabUI->newTabClicked.connect(boost::bind(&SimpleUI::newTabClicked, this,_1)); + m_tabUI->tabClicked.connect(boost::bind(&SimpleUI::tabClicked, this,_1)); + m_tabUI->newIncognitoTabClicked.connect(boost::bind(&SimpleUI::newTabClicked, this,_1)); + m_tabUI->show(m_window.get()); + m_tabUI->addTabItems(m_webEngine->getTabContents()); } void SimpleUI::closeTabUI(const std::string& str) { -#if MERGE_ME - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - m_tabUI = nullptr; -#endif + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_tabUI = nullptr; } void SimpleUI::newTabClicked(const std::string& str) diff --git a/services/SimpleUI/SimpleUI.h b/services/SimpleUI/SimpleUI.h index d106d49..ea7220c 100644 --- a/services/SimpleUI/SimpleUI.h +++ b/services/SimpleUI/SimpleUI.h @@ -41,9 +41,7 @@ #include "SettingsUI.h" #endif #include "MainUI.h" -#if MERGE_ME #include "TabUI.h" -#endif #include "ButtonBar.h" #include "HistoryService.h" #if MERGE_ME @@ -305,8 +303,8 @@ private: #if MERGE_ME std::shared_ptr m_historyUI; std::shared_ptr m_settingsUI; - std::shared_ptr m_tabUI; #endif + std::shared_ptr m_tabUI; std::shared_ptr m_zoomList; std::shared_ptr m_tabList; std::shared_ptr m_platformInputManager; diff --git a/services/TabUI/CMakeLists.txt b/services/TabUI/CMakeLists.txt new file mode 100644 index 0000000..570381c --- /dev/null +++ b/services/TabUI/CMakeLists.txt @@ -0,0 +1,29 @@ +project(TabUI) + +set(TabUI_SRCS + TabUI.cpp + ) + +set(TabUI_HEADERS + TabUI.h + ) + +include(Coreheaders) +include(EFLHelpers) + +include_directories(${CMAKE_SOURCE_DIR}/services/FavoriteService) + +add_library(${PROJECT_NAME} SHARED ${TabUI_SRCS}) + +if(TIZEN_BUILD) + target_link_libraries(${PROJECT_NAME} ${pkgs_LDFLAGS}) +endif(TIZEN_BUILD) + +install(TARGETS ${PROJECT_NAME} + LIBRARY DESTINATION services + ARCHIVE DESTINATION services/static) + +include(EDCCompile) +EDJ_TARGET(TabUI.edj + ${CMAKE_CURRENT_SOURCE_DIR}/edc/TabUI.edc + ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/services/TabUI/TabUI.cpp b/services/TabUI/TabUI.cpp new file mode 100644 index 0000000..5646f26 --- /dev/null +++ b/services/TabUI/TabUI.cpp @@ -0,0 +1,500 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include + +#include "TabUI.h" +#include "ServiceManager.h" +#include "BrowserLogger.h" +#include "Tools/EflTools.h" +#include "../Tools/BrowserImage.h" + +#define efl_scale (elm_config_scale_get() / elm_app_base_scale_get()) + +namespace tizen_browser{ +namespace base_ui{ + +EXPORT_SERVICE(TabUI, "org.tizen.browser.tabui") + +typedef struct _TabItemData +{ + std::shared_ptr item; + std::shared_ptr tabUI; +} TabItemData; + +struct ItemData{ + tizen_browser::base_ui::TabUI* tabUI; + Elm_Object_Item * e_item; +}; + +TabUI::TabUI() + : m_gengrid(NULL) + , m_tab_layout(NULL) + , m_genListTop(NULL) + , m_genListActionBar(NULL) + , m_parent(NULL) + , m_itemClassActionBar(NULL) + , m_itemClassTop(NULL) + , m_item_class(NULL) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + edjFilePath = EDJE_DIR; + edjFilePath.append("TabUI/TabUI.edj"); +} + +TabUI::~TabUI() +{ + +} + +void TabUI::show(Evas_Object* parent) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + //m_parent = p; + elm_theme_extension_add(NULL, edjFilePath.c_str()); + m_tab_layout = elm_layout_add(parent); + elm_layout_file_set(m_tab_layout, edjFilePath.c_str(), "tab-layout"); + evas_object_size_hint_weight_set(m_tab_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_tab_layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(m_tab_layout); + + showActionBar(); + showTopButtons(); + + m_gengrid = elm_gengrid_add(m_tab_layout); + elm_object_part_content_set(m_tab_layout, "tab_gengird", m_gengrid); + + evas_object_smart_callback_add(m_gengrid, "item,focused", focusItem, NULL); + evas_object_smart_callback_add(m_gengrid, "item,unfocused", unFocusItem, NULL); + evas_object_smart_callback_add(m_gengrid, "activated", _itemSelected, this); + + if (!m_item_class) { + m_item_class = elm_gengrid_item_class_new(); + m_item_class->item_style = "tab_item"; + m_item_class->func.text_get = _grid_text_get; + m_item_class->func.content_get = _tab_grid_content_get; + m_item_class->func.state_get = NULL; + m_item_class->func.del = NULL; + } + + M_ASSERT(m_parent); + elm_gengrid_align_set(m_gengrid, 0, 0); + elm_gengrid_select_mode_set(m_gengrid, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_gengrid_multi_select_set(m_gengrid, EINA_FALSE); + elm_gengrid_horizontal_set(m_gengrid, EINA_FALSE); + elm_gengrid_highlight_mode_set(m_gengrid, EINA_TRUE); + elm_scroller_policy_set(m_gengrid, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_scroller_page_size_set(m_gengrid, 0, 327); + + evas_object_size_hint_weight_set(m_gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); + + elm_gengrid_item_size_set(m_gengrid, 364 * efl_scale, 320 * efl_scale); +} + + +void TabUI::showActionBar() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + elm_theme_extension_add(NULL, edjFilePath.c_str()); + m_genListActionBar = elm_genlist_add(m_tab_layout); + elm_object_part_content_set(m_tab_layout, "action_bar_genlist", m_genListActionBar); + elm_genlist_homogeneous_set(m_genListActionBar, EINA_FALSE); + elm_genlist_multi_select_set(m_genListActionBar, EINA_FALSE); + elm_genlist_select_mode_set(m_genListActionBar, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_genlist_mode_set(m_genListActionBar, ELM_LIST_LIMIT); + elm_genlist_decorate_mode_set(m_genListActionBar, EINA_TRUE); + evas_object_size_hint_weight_set(m_genListActionBar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + // evas_object_smart_callback_add(m_genList, "item,focused", focusItem, this); + // evas_object_smart_callback_add(m_genList, "item,unfocused", unFocusItem, NULL);*/ + + m_itemClassActionBar = elm_genlist_item_class_new(); + m_itemClassActionBar->item_style = "action_bar_items"; + m_itemClassActionBar->func.text_get = NULL; // &listTopItemTextGet; + m_itemClassActionBar->func.content_get = &listActionBarContentGet; + m_itemClassActionBar->func.state_get = 0; + m_itemClassActionBar->func.del = 0; + + ItemData * id = new ItemData; + id->tabUI = this; + Elm_Object_Item* elmItem = elm_genlist_item_append(m_genListActionBar, //genlist + m_itemClassActionBar, //item Class + id, + NULL, //parent item + ELM_GENLIST_ITEM_NONE,//item type + NULL, + NULL //data passed to above function + ); + id->e_item = elmItem; + ItemData * id2 = new ItemData; + id2->tabUI = this; + Elm_Object_Item* elmItem2 = elm_genlist_item_append(m_genListActionBar, //genlist + m_itemClassActionBar, //item Class + id2, + NULL, //parent item + ELM_GENLIST_ITEM_NONE,//item type + NULL, + NULL //data passed to above function + ); + id2->e_item = elmItem2; + + ItemData * id3 = new ItemData; + id3->tabUI = this; + Elm_Object_Item* elmItem3 = elm_genlist_item_append(m_genListActionBar, //genlist + m_itemClassActionBar, //item Class + id3, + NULL, //parent item + ELM_GENLIST_ITEM_NONE,//item type + NULL, + NULL //data passed to above function + ); + id3->e_item = elmItem3; + + /*ItemData * id4 = new ItemData; + id4->tabUI = this; + Elm_Object_Item* elmItem4 = elm_genlist_item_append(m_genListActionBar, //genlist + m_itemClassActionBar, //item Class + //id.get(), //item data + id4, + NULL, //parent item + ELM_GENLIST_ITEM_NONE,//item type + NULL, + NULL //data passed to above function + ); + id4->e_item = elmItem4;*/ + + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + +} + +Evas_Object* TabUI::listActionBarContentGet(void* data, Evas_Object* obj , const char* part) +{ + //ItemData *itemData = reinterpret_cast(data); + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if(!strcmp(part, "newtab_click")) + { + BROWSER_LOGD("############in new tab button part##################"); + Evas_Object *newtabButton = elm_button_add(obj); + elm_object_style_set(newtabButton, "tab_button"); + evas_object_smart_callback_add(newtabButton, "clicked", tizen_browser::base_ui::TabUI::_newtab_clicked, data); + return newtabButton; + } + else if(!strcmp(part, "newincognitotab_click")) + { + Evas_Object *newincognitotabButton = elm_button_add(obj); + elm_object_style_set(newincognitotabButton, "tab_button"); + evas_object_smart_callback_add(newincognitotabButton, "clicked", tizen_browser::base_ui::TabUI::_newincognitotab_clicked, data); + return newincognitotabButton; + } + else if(!strcmp(part, "closetabs_click")) + { + Evas_Object *closetabsButton = elm_button_add(obj); + elm_object_style_set(closetabsButton, "tab_button"); + evas_object_smart_callback_add(closetabsButton, "clicked", tizen_browser::base_ui::TabUI::_closetabs_clicked, data); + return closetabsButton; + } + else if(!strcmp(part, "close_click")) + { + Evas_Object *close_click = elm_button_add(obj); + elm_object_style_set(close_click, "tab_button"); + evas_object_smart_callback_add(close_click, "clicked", TabUI::close_clicked_cb, data); + return close_click; + } + return NULL; +} + +void TabUI::close_clicked_cb(void* data, Evas_Object* /* obj */, void* /* event_info */) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData * id = static_cast(data); + id->tabUI->closeTabUIClicked(std::string()); + id->tabUI->clearItems(); +} + +void TabUI::hide() +{ + evas_object_hide(elm_layout_content_get(m_tab_layout, "action_bar_genlist")); + evas_object_hide(elm_layout_content_get(m_tab_layout, "top_bar_genlist")); + evas_object_hide(elm_layout_content_get(m_tab_layout, "tab_gengird")); + evas_object_hide(m_tab_layout); +} + +void TabUI::showTopButtons() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + elm_theme_extension_add(NULL, edjFilePath.c_str()); + m_genListTop = elm_genlist_add(m_tab_layout); + elm_object_part_content_set(m_tab_layout, "top_bar_genlist", m_genListTop); + elm_genlist_homogeneous_set(m_genListTop, EINA_FALSE); + elm_genlist_multi_select_set(m_genListTop, EINA_FALSE); + elm_genlist_select_mode_set(m_genListTop, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_genlist_mode_set(m_genListTop, ELM_LIST_LIMIT); + elm_genlist_decorate_mode_set(m_genListTop, EINA_TRUE); + evas_object_size_hint_weight_set(m_genListTop, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + /*evas_object_smart_callback_add(m_genList, "item,focused", focusItem, this); + evas_object_smart_callback_add(m_genList, "item,unfocused", unFocusItem, NULL);*/ + + m_itemClassTop = elm_genlist_item_class_new(); + m_itemClassTop->item_style = "top_buttons"; + m_itemClassTop->func.text_get = NULL;// &listTapTopItemTextGet; + m_itemClassTop->func.content_get = &listTopButtonItemsContentGet; + m_itemClassTop->func.state_get = 0; + m_itemClassTop->func.del = 0; + + ItemData * id = new ItemData; + id->tabUI = this; + Elm_Object_Item* elmItem = elm_genlist_item_append(m_genListTop, //genlist + m_itemClassTop, //item Class + id, + NULL, //parent item + ELM_GENLIST_ITEM_NONE,//item type + NULL, + NULL //data passed to above function + ); + id->e_item = elmItem; + ItemData * id2 = new ItemData; + id2->tabUI = this; + Elm_Object_Item* elmItem2 = elm_genlist_item_append(m_genListTop, //genlist + m_itemClassTop, //item Class + id2, + NULL, //parent item + ELM_GENLIST_ITEM_NONE,//item type + NULL, + NULL //data passed to above function + ); + id2->e_item = elmItem2; + + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); +} + +Evas_Object* TabUI::listTopButtonItemsContentGet(void* data, Evas_Object* obj , const char* part) +{ + //ItemData *itemData = reinterpret_cast(data); + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if(!strcmp(part, "openedtabs_button")) + { + Evas_Object *openedtabsButton = elm_button_add(obj); + elm_object_style_set(openedtabsButton, "tab_button"); + evas_object_smart_callback_add(openedtabsButton, "clicked", tizen_browser::base_ui::TabUI::_openedtabs_clicked, data); + return openedtabsButton; + } + else if(!strcmp(part, "onotherdevices_button")) + { + Evas_Object *onotherdevicesButton = elm_button_add(obj); + elm_object_style_set(onotherdevicesButton, "tab_button"); + evas_object_smart_callback_add(onotherdevicesButton, "clicked", tizen_browser::base_ui::TabUI::_onotherdevices_clicked, data); + return onotherdevicesButton; + } + return NULL; +} + +void TabUI::_newtab_clicked(void * data, Evas_Object * /* obj */, void * event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData* itemData = reinterpret_cast(data); + itemData->tabUI->clearItems(); + itemData->tabUI->newTabClicked(std::string()); + +} +void TabUI::_openedtabs_clicked(void * data, Evas_Object * /* obj */, void * event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + /*ItemData* itemData = reinterpret_cast(data); + itemData->tabUI->newTabClicked(std::string());*/ +} + +void TabUI::_onotherdevices_clicked(void * data, Evas_Object * /* obj */, void * event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + /*ItemData* itemData = reinterpret_cast(data); + itemData->tabUI->newTabClicked(std::string());*/ +} + +void TabUI::_newincognitotab_clicked(void * data, Evas_Object * /* obj */, void * event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData* itemData = reinterpret_cast(data); + itemData->tabUI->clearItems(); + itemData->tabUI->newIncognitoTabClicked(std::string()); +} + +void TabUI::_closetabs_clicked(void * data, Evas_Object * /* obj */, void * event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData* itemData = reinterpret_cast(data); + itemData->tabUI->closeTabsClicked(std::string()); +} + +/* +char* TabUI::listItemTopTextGet(void* data, Evas_Object* obj , const char* part) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData * id = static_cast(data); + if(!strcmp(part, "Tabmanager")) + { + if(!id->h_item->getTitle().empty()){ + return strdup(id->h_item->getTitle().c_str()); + } + } + else if(!strcmp(part, "tab_url")) + { + if(!id->h_item->getUrl().empty()){ + return strdup(id->h_item->getUrl().c_str()); + } + } + return strdup(""); +} +*/ + +void TabUI::addTabItem(std::shared_ptr hi) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + if (m_map_tab_views.size() >= 10) + return; + TabItemData *itemData = new TabItemData(); + itemData->item = hi; + itemData->tabUI = std::shared_ptr(this); + Elm_Object_Item* tabView = elm_gengrid_item_append(m_gengrid, m_item_class, itemData, NULL, this); + m_map_tab_views.insert(std::pair(hi->getTitle(),tabView)); + + // unselect by default + elm_gengrid_item_selected_set(tabView, EINA_FALSE); + setEmptyGengrid(false); +} + +void TabUI::addTabItems(std::vector>items) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + int i = 0; + for (auto it = items.begin(); it != items.end(); ++it) { + i++; + if (i > 10) break; + addTabItem(*it); + } +} + + +char* TabUI::_grid_text_get(void *data, Evas_Object *obj, const char *part) +{ + TabItemData *itemData = reinterpret_cast(data); + if (!strcmp(part, "tab_title")) { + return strdup(itemData->item->getTitle().c_str()); + } + if (!strcmp(part, "tab_url")) { + //return strdup(itemData->item->getUrl().c_str()); + return strdup(""); + } + + return strdup(""); +} + +Evas_Object * TabUI::_tab_grid_content_get(void *data, Evas_Object *obj, const char *part) +{ + + BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part); + TabItemData *itemData = reinterpret_cast(data); + + if (!strcmp(part, "tab_thumbnail")) { + if (itemData->item->getThumbnail()) { + Evas_Object * thumb = tizen_browser::tools::EflTools::getEvasImage(itemData->item->getThumbnail(), itemData->tabUI->m_parent); + return thumb; + } + else { + return NULL; + } + } + else if (!strcmp(part, "tab_thumbButton")) { + Evas_Object *thumbButton = elm_button_add(obj); + elm_object_style_set(thumbButton, "tab_thumbButton"); + evas_object_smart_callback_add(thumbButton, "clicked", tizen_browser::base_ui::TabUI::_thumbSelected, data); + return thumbButton; + } + return NULL; + +} + +void TabUI::_itemSelected(void * data, Evas_Object * /* obj */, void * event_info) +{ + Elm_Object_Item * selected = reinterpret_cast(event_info); + TabItemData * itemData = reinterpret_cast(elm_object_item_data_get(selected)); + TabUI * self = reinterpret_cast(data); + +// self->historyClicked(itemData->item); +} + +void TabUI::_thumbSelected(void * data, Evas_Object * /* obj */, void * /* event_info */ ) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + TabItemData * itemData = reinterpret_cast(data); + itemData->tabUI->clearItems(); + itemData->tabUI->tabClicked(itemData->item->getId()); +} + +void TabUI::clearItems() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + hide(); + elm_gengrid_clear(m_gengrid); + elm_genlist_clear(m_genListActionBar); + elm_genlist_clear(m_genListTop); + m_map_tab_views.clear(); +} + +Evas_Object* TabUI::createNoHistoryLabel() +{ + Evas_Object *label = elm_label_add(m_parent); + elm_object_text_set(label, "No favorite websites."); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + return label; +} + +void TabUI::setEmptyGengrid(bool setEmpty) +{ + if(setEmpty) { + elm_object_part_content_set(m_gengrid, "elm.swallow.empty", createNoHistoryLabel()); + } else { + elm_object_part_content_set(m_gengrid, "elm.swallow.empty", NULL); + } +} + +void TabUI::focusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,in", "over2"); + + // selected manually + elm_gengrid_item_selected_set(item, EINA_TRUE); +} + +void TabUI::unFocusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,out", "over2"); + + // unselected manually + elm_gengrid_item_selected_set(item, EINA_FALSE); +} + +} +} diff --git a/services/TabUI/TabUI.h b/services/TabUI/TabUI.h new file mode 100644 index 0000000..505ca5a --- /dev/null +++ b/services/TabUI/TabUI.h @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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 TABUI_H +#define TABUI_H + +#include +#include + +#include "AbstractUIComponent.h" +#include "AbstractService.h" +#include "ServiceFactory.h" +#include "service_macros.h" +#include "services/HistoryService/HistoryItem.h" +#include "TabId.h" +namespace tizen_browser{ +namespace base_ui{ + +class BROWSER_EXPORT TabUI + : public tizen_browser::interfaces::AbstractUIComponent + , public tizen_browser::core::AbstractService +{ +public: + TabUI(); + ~TabUI(); + void show(Evas_Object *main_layout); + virtual std::string getName(); + void showActionBar(); + void showTopButtons(); + void clearItems(); + void hide(); + + void addTabItem(std::shared_ptr); + void addTabItems(std::vector > items); +// void addBookmarkItem(std::shared_ptr); +// void addbookmarkItems(std::vector >); + + boost::signals2::signal tabClicked; + boost::signals2::signal newTabClicked; + boost::signals2::signal newIncognitoTabClicked; + boost::signals2::signal closeTabsClicked; + boost::signals2::signal openedTabsClicked; + boost::signals2::signal onOtherDevicesClicked; + boost::signals2::signal closeTabUIClicked; +private: + static Evas_Object* listActionBarContentGet(void *data, Evas_Object *obj, const char *part); + static Evas_Object* listTopButtonItemsContentGet(void *data, Evas_Object *obj, const char *part); + //static char* listItemTextGet(void *data, Evas_Object *obj, const char *part); + + static char* _grid_text_get(void *data, Evas_Object *obj, const char *part); + static Evas_Object * _tab_grid_content_get(void *data, Evas_Object *obj, const char *part); + static void _itemSelected(void * data, Evas_Object * obj, void * event_info); + static void _item_deleted(void *data, Evas_Object *obj); + static void _thumbSelected(void * data, Evas_Object * obj, void * event_info); + static void _deleteBookmark(void *data, Evas_Object *obj, void *event_info); + static void close_clicked_cb(void *data, Evas_Object *obj, void *event_info); + void setEmptyGengrid(bool setEmpty); + + static void _openedtabs_clicked(void * data, Evas_Object * obj, void * event_info); + static void _newtab_clicked(void * data, Evas_Object * obj, void * event_info); + static void _newincognitotab_clicked(void * data, Evas_Object * obj, void * event_info); + static void _closetabs_clicked(void * data, Evas_Object * obj, void * event_info); + static void _onotherdevices_clicked(void * data, Evas_Object * obj, void * event_info); +private: + Evas_Object *m_tab_layout; + Evas_Object *m_genListActionBar; + Elm_Genlist_Item_Class *m_itemClassActionBar; + Evas_Object *m_genListTop; + Elm_Genlist_Item_Class *m_itemClassTop; + Evas_Object *m_gengrid; + Evas_Object *m_parent; + + Elm_Gengrid_Item_Class * m_item_class; + std::map m_map_tab_views; + bool m_gengridSetup; + std::string edjFilePath; + Evas_Object *createNoHistoryLabel(); + + static void focusItem(void* data, Evas_Object* obj, void* event_info); + static void unFocusItem(void* data, Evas_Object* obj, void* event_info); +}; + +} +} + +#endif // BOOKMARKSUI_H diff --git a/services/TabUI/edc/TabUI.edc b/services/TabUI/edc/TabUI.edc new file mode 100644 index 0000000..e4e88cd --- /dev/null +++ b/services/TabUI/edc/TabUI.edc @@ -0,0 +1,1421 @@ +#define DEBUG_RECT_OVER(over_part, r, g, b) \ + part { name: __CONCAT("dbg_rect_at_", __stringify(__LINE__)); \ + \ +scale:1; \ + type : RECT; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + visible: 1; \ + color: r g b 128; \ + rel1 { to: over_part; relative: 0 0; } \ + rel2 { to: over_part; relative: 1 1; } \ + } \ + } + +collections +{ +#define WIDTH 1920 +#define HEIGHT 181 +#define ITEM_WIDTH 374 + + group{ + name: "elm/button/base/tab_button"; + parts{ + part{ + name: "button"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + color: 0 0 0 0; + } + } + part{ + name: "over"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "button";} + rel2 { relative: 1.0 1.0;to: "button";} + color: 0 0 0 0; + } + } + } + programs{ + program { + name: "mouse_click"; + signal: "mouse,clicked,1"; + source: "over"; + script { + emit("elm,action,click", ""); + } + } + } + } + +group { name: "elm/button/base/tab_thumbButton"; + images { + image: "ico_delete.png" COMP; + } + parts { + part { name: "elm.swallow.content"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + align: 0.0 0.0; + } + } + } + + programs { + program { name: "mouse,clicked"; + signal: "mouse,down,1"; + source: "elm.swallow.content"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + } +} + +group { + name: "tab-layout"; + data { + item: "highlight_focus" "off"; + } + images { + image: "btn_bar_stop_nor.png" COMP; + } + color_classes{ + color_class{ + name: "defaultBgColor"; + color: 18 22 34 255; + } + color_class{ + name: "focusBgColor"; + color: 69 143 255 255; + } + color_class{ + name: "highlightBgColor"; + color: 69 143 255 102; + } + color_class{ + name: "imageHighlight"; + color: 255 255 255 102; + } + color_class{ + name: "focusbtBgColor"; + color: 22 120 224 255; + } + color_class{ + name: "titleTextColor"; + color: 74 74 74 255; + } + color_class{ + name: "focusTextColor"; + color: 255 255 255 255; + } + color_class{ + name: "highlightTextColor"; + color: 255 255 255 51; + } + color_class{ + name: "urlTextColor"; + color: 116 116 116 204; + } + color_class{ + name: "transparent"; + color: 0 0 0 0; + } + } + + images { + image: "web_shadow.png" COMP; + } + parts { + part { name: "action_bar_genlist_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + min: 1920 104; + max: 1920 104; + color: 70 143 254 255; + rel1 { + relative: 0 0; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "top_bar_genlist_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + min: 1920 181; + max: 1920 181; + color: 70 143 254 255; + rel1 { + relative: 0 1; to: "action_bar_genlist_bg"; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "gengrid_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + min: 1920 714; + max: 1920 714; + color: 231 231 231 255; + rel1 { + relative: 0 1; to: "top_bar_genlist_bg"; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "no_of_tabs_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + min: 1920 81; + max: 1920 81; + color: 231 231 231 255; + rel1 { + relative: 0 1; to: "gengrid_bg"; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "action_bar_genlist"; + type : SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 1920 104; + max: 1920 104; + align: 0.0 0.0; + fixed: 0 0; + rel1 { relative: 0.0 0.0; to: "action_bar_genlist_bg";} + rel2 { relative: 1.0 1.0; } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "top_bar_genlist"; + type : SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 1920 181; + max: 1920 181; + align: 0.0 0.0; + fixed: 0 0; + rel1 { relative: 0.0 0.0; to: "top_bar_genlist_bg"; offset: 0 0;} + rel2 { relative: 1.0 1.0; } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "tab_gengird"; + type : SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 1920 714; + max: 1920 714; + align: 0.0 0.0; + fixed: 0 0; + rel1 { relative: 0.0 0.0; to: "gengrid_bg"; offset: 63 63;} + rel2 { relative: 1.0 1.0; } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "uri_bar_shadow"; + type: IMAGE; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + fixed: 0 0; + min: 1920 14; + max: 1920 14; + image.normal: "web_shadow.png"; + rel1 { relative: 0.0 1.0; to: "action_bar_genlist_bg"; } + rel2 { relative: 1.0 1.0; } + } + } + part { name: "text_genlist"; + type : SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 1920 81; + max: 1920 81; + align: 0.0 0.0; + fixed: 0 0; + rel1 { relative: 0.0 0.0; to: "top_bar_genlist_bg"; offset: 0 0;} + rel2 { relative: 1.0 1.0; } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } +} + + +/*group { name: "elm/genlist/base/openedtabs_onotherdevices"; + data { + item: "focus_highlight" "off"; + } + + parts { + part { name: "clipper"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 70 143 254 255; + rel1 { + relative: 0 0; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "background"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 255 255 255 255; + rel1 { + relative: 0 0; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + description { state: "default" 0.0; + rel1 { + relative: 0 0; + offset: 62 0; + } + rel2 { + relative: 1 1; + offset: 0 0; + } + } + } + part { name: "elm.swallow.empty"; + type: SWALLOW; + description { state: "default" 0.0; + align: 0.5 0.5; + rel1 { + relative: 0.5 0.5; + } + rel2 { + relative: 0.5 0.5; + } + } + } + } +}*/ + +group { name: "elm/gengrid/item/tab_item/default"; + data.item: "texts" "tab_title tab_url"; + data.item: "contents" "tab_thumbnail tab_thumbButton"; + images { + image: "web_frame_selected.png" COMP; + image: "ico_bg_round_shape_37x37.png" COMP; + } + parts { + part { name: "bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 338 294; + max: 338 294; + visible: 1; + color: 255 255 255 255; + rel1.offset: -26 -26; + } + description { state: "selected"; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "tab_thumbnail"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 1 0; + align: 0.0 0.0; + color : 255 255 255 255; + min: 338 198; + max: 338 198; + rel1 { + relative: 0.0 0.0; to: "bg"; + } + rel2 { + relative: 1.0 1.0; to: "bg"; + } + } + description { state: "selected"; + inherit: "default" 0.0; + } + } + + part { name: "focus_highlight"; + type: IMAGE; + description { state: "default" 0.0; + rel1 { + to: "tab_thumbnail"; + relative: 0.0 0.0; + } + rel2 { + to: "tab_thumbnail"; + relative: 1.0 1.0; + } + image.normal: "web_frame_selected.png"; + image.border: 8 8 8 0; + image.border_scale: 1; + image.middle: NONE; + visible: 0; + } + description { state: "selected"; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "background"; + type: RECT; + description { state: "default" 0.0; + min: 338 87; + max: 338 87; + align: 0.0 0.0; + color: 255 255 255 255; + rel1 { + to: "tab_thumbnail"; + relative: 0.0 1.0; + } + rel2 { + relative: 1.0 1.0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "tab_title"; + type: TEXT; + description { state: "default" 0.0; + min: 300 48; + max: 300 48; + align: 0.0 0.5; + rel1 { + to: "background"; + relative: 0.0 0.0; + offset: 17 0; + } + rel2 { + to: "background"; + relative: 1.0 1.0; + } + color: 51 51 51 255; + text { + text: "Web page title"; + font: "Sans"; + size: 27; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + //color: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + + part { name: "tab_url"; + type: TEXT; + description { state: "default" 0.0; + min: 300 48; + max: 300 48; + align: 0 0.5; + rel1 { + to: "tab_title"; + relative: 0.0 1.0; + } + rel2 { + to: "tab_title"; + relative: 1.0 1.0; + } + color: 153 153 153 255; + text { + text: "Web page url"; + font: "Sans"; + size: 24; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + //color: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + + part { name: "tab_thumbButton"; + type: SWALLOW; + description { state: "default" 0.0; + rel1.to: "tab_thumbnail"; + rel2.to: "tab_thumbnail"; + } + } + + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "bg"; + rel2.to: "background"; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "background"; + rel2.to: "background"; + } + } + } + + programs{ + program { name: "mouse_in"; + signal: "mouse,in"; + source: "over2"; + action: STATE_SET "selected" 0.0; + target: "background"; + target: "focus_highlight"; + target: "bg"; + } + program { name: "mouse_out"; + signal: "mouse,out"; + source: "over2"; + action: STATE_SET "default" 0.0; + target: "background"; + target: "focus_highlight"; + target: "bg"; + } + } +} +group { name: "elm/genlist/item/action_bar_items/default"; + min: 1920 104; + max: 1920 104; + data.item: "texts" "closetabs_text"; + data.item: "contents" "newtab_click newincognitotab_click closetabs_click close_click"; + images { + image: "btn_bar_new_nor.png" COMP; + image: "btn_bar_new_foc.png" COMP; + image: "btn_bar_incognito_nor.png" COMP; + image: "btn_bar_incognito_foc.png" COMP; + } + parts{ + part { + name: "bg_clipper"; + scale:1; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + align: 0 0; + min: 1920 104; + max: 1920 104; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + } + } + + part { + name: "newtab_button"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + color: 255 255 255 255; + align: 0 0; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "bg_clipper"; offset: 63 1;} + rel2 { relative: 1.0 1.0; to: "bg_clipper"; } + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusbtBgColor; + visible: 1; + } + } + part { + name: "newtab_icon"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "newtab_button";} + rel2 { relative: 1.0 1.0; to: "newtab_button";} + image.normal: "btn_bar_new_nor.png"; + } + description { state: "highlight" 0.0; + image.normal: "btn_bar_new_foc.png"; + inherit: "default" 0.0; + visible: 1; + } + description { state: "focus" 0.0; + inherit: "highlight" 0.0; + } + } + part { + name: "newtab_over"; + scale:1; + type: RECT; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "newtab_button";} + rel2 { relative: 1.0 1.0; to: "newtab_button";} + color_class: transparent; + } + } + + part { + name: "newtab_click"; + scale:1; + type: SWALLOW; + mouse_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "newtab_over";} + rel2 { relative: 1.0 1.0; to: "newtab_over";} + } + } + + part { + name: "newincognitotab_button_bg"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + align: 0 0; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "bg_clipper"; offset: 175 1;} + rel2 { relative: 1.0 1.0; to: "bg_clipper"; } + } + } + part { + name: "newincognitotab_button"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "newincognitotab_button_bg"; } + rel2 { relative: 1.0 1.0; to: "newincognitotab_button_bg"; } + color_class: transparent; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusbtBgColor; + visible: 1; + } + } + part { + name: "newincognitotab_icon"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "newincognitotab_button";} + rel2 { relative: 1.0 1.0; to: "newincognitotab_button";} + image.normal: "btn_bar_incognito_nor.png"; + } + description { state: "highlight" 0.0; + image.normal: "btn_bar_incognito_foc.png"; + inherit: "default" 0.0; + visible: 1; + } + description { state: "focus" 0.0; + inherit: "highlight" 0.0; + } + } + part { + name: "newincognitotab_over"; + scale:1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "newincognitotab_button";} + rel2 { relative: 1.0 1.0; to: "newincognitotab_button";} + color_class: transparent; + } + } + + part { + name: "newincognitotab_click"; + scale:1; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "newincognitotab_over";} + rel2 { relative: 1.0 1.0; to: "newincognitotab_over";} + color_class: transparent; + } + } + + part { + name: "item3_bg"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 348 65; + max: 348 65; + align: 0.5 0.5; + rel1 { relative: 0.0 0.0;to: "bg_clipper";} + rel2 { relative: 1.0 1.0;to: "bg_clipper";} + color : 255 255 255 255; + + } + } + + part { + name: "Tabmanager"; + scale:1; + mouse_events: 1; + type: TEXT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 .3; + min: 348 65; + max: 348 65; + color: 116 116 116 255; + rel1 { relative: 0.0 0.0; to: "item3_bg"; } + rel2 { relative: 1.0 1.0; to: "item3_bg"; } + text { + text: "Tab Manager"; + font: "Sans"; + size: 40; + align: 0.5 0.5; + } + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor1; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusbtBgColor1; + visible: 1; + } + } + part { + name: "closetabs_button_bg"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + color: 192 192 192 255; + align: 0 0; + min: 220 65; + max: 220 65; + rel1 { relative: 0.0 0.0; to: "bg_clipper"; offset: 1500 20;} + rel2 { relative: 1.0 1.0; to: "bg_clipper"; } + } + } + part { + name: "closetabs_button"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + + min: 220 65; + max: 220 65; + rel1 { relative: 0.0 0.0; to: "closetabs_button_bg"; } + rel2 { relative: 1.0 1.0; to: "closetabs_button_bg"; } + color_class: transparent; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusbtBgColor; + visible: 1; + } + } + part{ + name: "closetabs_text"; + type: TEXT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "closetabs_button";} + rel2 { relative: 1.0 1.0;to: "closetabs_button";} + color: 0 0 0 255; + text { + text: "Close all"; + font: "Sans"; + size: 27; + align: 0.5 0.5; + } + } + } + + part { + name: "closetabs_over"; + scale:1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + + min: 220 65; + max: 220 65; + rel1 { relative: 0.0 0.0; to: "closetabs_button";} + rel2 { relative: 1.0 1.0; to: "closetabs_button";} + color_class: transparent; + } + } + + part { + name: "closetabs_click"; + scale:1; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 220 65; + max: 220 65; + rel1 { relative: 0.0 0.0; to: "closetabs_over";} + rel2 { relative: 1.0 1.0; to: "closetabs_over";} + color_class: transparent; + } + } + part { + name: "close_bg"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0.5; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "bg_clipper"; offset: 1758 0;} + rel2 { relative: 1.0 1.0; to: "bg_clipper";} + color_class: transparent; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusDelBgColor; + visible: 1; + } + } + part { + name: "close_icon"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "close_bg";} + rel2 { relative: 1.0 1.0; to: "close_bg";} + image.normal: "btn_bar_stop_nor.png"; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { state: "focus" 0.0; + inherit: "highlight" 0.0; + } + } + part { + name: "close_over"; + scale:1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "close_bg";} + rel2 { relative: 1.0 1.0; to: "close_bg";} + color_class: transparent; + } + } + part { + name: "close_click"; + scale:1; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "close_over";} + rel2 { relative: 1.0 1.0; to: "close_over";} + color_class: transparent; + } + } + + programs{ + + program { + name: "mouse_click_newtab"; + signal: "mouse,clicked,1"; + source: "newtab_over"; + script { + emit("elm,action,click", ""); + } + } + program { + name: "mouse_in_newtab_click"; + signal: "mouse,in"; + source: "newtab_*"; + action: STATE_SET "highlight" 0.0; + target: "newtab_button"; + target: "newtab_over"; + target: "newtab_icon"; + } + program { + name: "mouse_out_newtab_click"; + signal: "mouse,out"; + source: "newtab_*"; + action: STATE_SET "default" 0.0; + target: "newtab_button"; + target: "newtab_over"; + target: "newtab_icon"; + } + + program { + name: "mouse_click_newincognitotab"; + + signal: "mouse,clicked,1"; + source: "newincognitotab_over"; + script { + emit("elm,action,click", ""); + } + } + program { + name: "mouse_in_newincognitotab_click"; + signal: "mouse,in"; + source: "newincognitotab_*"; + action: STATE_SET "highlight" 0.0; + target: "newincognitotab_button"; + target: "newincognitotab_over"; + target: "newincognitotab_icon"; + } + program { + name: "mouse_out_newincognitotab_click"; + signal: "mouse,out"; + source: "newincognitotab_*"; + action: STATE_SET "default" 0.0; + target: "newincognitotab_button"; + target: "newincognitotab_over"; + target: "newincognitotab_icon"; + } + program { + name: "mouse_click_closetabs"; + signal: "mouse,clicked,1"; + source: "closetabs_over"; + script { + emit("elm,action,click", ""); + } + } + program { + name: "mouse_in_closetabs_click"; + signal: "mouse,in"; + source: "closetabs_*"; + action: STATE_SET "highlight" 0.0; + target: "closetabs_button"; + target: "closetabs_over"; + target: "closetabs_text"; + } + program { + name: "mouse_out_closetabs_click"; + signal: "mouse,out"; + source: "closetabs_*"; + action: STATE_SET "default" 0.0; + target: "closetabs_button"; + target: "closetabs_over"; + target: "closetabs_text"; + } + program { + name: "mouse_in_close_click"; + signal: "mouse,in"; + source: "close_click"; + script { + emit("mouse_in_close_click", ""); + } + } + program { + name: "mouse_out_close_click"; + signal: "mouse,out"; + source: "close_click"; + script { + emit("mouse_out_close_click", ""); + } + } + program { + name: "mouse_in_close"; + signal: "mouse_in_close_click"; + source: ""; + action: STATE_SET "highlight" 0.0; + target: "close_over"; + target: "close_bg"; + target: "close_icon"; + } + program { + name: "mouse_out_close"; + signal: "mouse_out_close_click"; + source: ""; + action: STATE_SET "default" 0.0; + target: "close_over"; + target: "close_bg"; + target: "close_icon"; + } + } + } +} + +group { name: "elm/genlist/item/top_buttons/default"; + min: 1920 181; + max: 1920 181; + data.item: "texts" "openedtabs_button_text onotherdevices_button_text"; + data.item: "contents" "openedtabs_click onotherdevices_click"; + parts{ + part { + name: "bg_clipper"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + color: 231 231 231 255; + align: 0 0; + min: 1920 181; + max: 1920 181; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + } + } + part { + name: "button_bg"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + color: 192 192 192 255; + align: 0 0; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "bg_clipper"; offset: 611 67;} + rel2 { relative: 1.0 1.0; to: "bg_clipper"; } + } + } + part { + name: "openedtabs_button"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0.5 0.5; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "button_bg"; } + rel2 { relative: 1.0 1.0; to: "button_bg"; } + color_class: transparent; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusbtBgColor; + visible: 1; + } + } + part{ + name: "openedtabs_over"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "openedtabs_button";} + rel2 { relative: 1.0 1.0;to: "openedtabs_button";} + color: 0 0 0 0; + } + } + part{ + name: "openedtabs_text"; + type: TEXT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "button_bg";} + rel2 { relative: 1.0 1.0;to: "button_bg";} + color: 0 0 0 255; + text { + text: "Opened Tabs"; + font: "Sans"; + size: 27; + align: 0.5 0.5; + } + } + } + + part { + name: "openedtabs_click"; + scale:1; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "openedtabs_over";} + rel2 { relative: 1.0 1.0; to: "openedtabs_over";} + color_class: transparent; + } + } + part { + name: "onotherdevices_button_bg"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + color: 192 192 192 255; + align: 0 0; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "bg_clipper"; offset: 961 67;} + rel2 { relative: 1.0 1.0; to: "bg_clipper"; } + } + } + part { + name: "onotherdevices_button"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "onotherdevices_button_bg"; } + rel2 { relative: 1.0 1.0; to: "onotherdevices_button_bg"; } + color_class: transparent; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusbtBgColor; + visible: 1; + } + } + part{ + name: "onotherdevices_over"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "onotherdevices_button";} + rel2 { relative: 1.0 1.0;to: "onotherdevices_button";} + color: 0 0 0 0; + } + } + part{ + name: "onotherdevices_text"; + type: TEXT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "onotherdevices_button_bg";} + rel2 { relative: 1.0 1.0;to: "onotherdevices_button_bg";} + color: 0 0 0 255; + text { + text: "On Other Devices"; + font: "Sans"; + size: 27; + align: 0.5 0.5; + } + } + } + + part { + name: "onotherdevicess_click"; + scale:1; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 348 65; + max: 348 65; + rel1 { relative: 0.0 0.0; to: "onotherdevices_over";} + rel2 { relative: 1.0 1.0; to: "onotherdevices_over";} + color_class: transparent; + } + } + } + programs{ + + program { + name: "mouse_click_openedtabs"; + signal: "mouse,clicked,1"; + source: "openedtabs_over"; + script { + emit("elm,action,click", ""); + } + } + program { + name: "mouse_in_openedtabs_click"; + signal: "mouse,in"; + source: "openedtabs_*"; + action: STATE_SET "highlight" 0.0; + target: "openedtabs_button"; + target: "openedtabs_over"; + target: "openedtabs_text"; + } + program { + name: "mouse_out_openedtabs_click"; + signal: "mouse,out"; + source: "openedtabs_*"; + action: STATE_SET "default" 0.0; + target: "openedtabs_button"; + target: "openedtabs_over"; + target: "openedtabs_text"; + } + + program { + name: "mouse_click_onotherdevices"; + signal: "mouse,clicked,1"; + source: "onotherdevices_over"; + script { + emit("elm,action,click", ""); + } + } + program { + name: "mouse_in_onotherdevices_click"; + signal: "mouse,in"; + source: "onotherdevices_*"; + action: STATE_SET "highlight" 0.0; + target: "onotherdevices_button"; + target: "onotherdevices_over"; + target: "onotherdevices_text"; + } + program { + name: "mouse_out_onotherdevices_click"; + signal: "mouse,out"; + source: "onotherdevices_*"; + action: STATE_SET "default" 0.0; + target: "onotherdevices_button"; + target: "onotherdevices_over"; + target: "onotherdevices_text"; + } + } + } +} diff --git a/services/TabUI/edc/error.edc b/services/TabUI/edc/error.edc new file mode 100644 index 0000000..0291971 --- /dev/null +++ b/services/TabUI/edc/error.edc @@ -0,0 +1,144 @@ +collections { + images { + image: "web_browsing_icon_error.png" COMP; + } + group { name: "error_message"; + styles { + style { name: "mssage_style"; + base: "font=Sans font_size=35 color=#d3d3d3 wrap=word align=0.5"; + } + style { name: "mssage_hint_style"; + base: "font=Sans font_size=24 color=#868686 wrap=word align=0.5"; + } + } + parts { + part{ + name: "message_background"; + type: RECT; + description{ + state: "default" 0.0; + visible: 1; + rel1.relative: 0 0; + rel2.relative: 1 1; + color: 42 50 64 255; + } + } + part{ + name: "error_message_background"; + type:RECT; + description{ + state: "default" 0.0; + visible: 1; + min: 1582 730; + max: 1582 730; + fixed: 1 1; + align: 0.5 0.5; + color: 30 38 50 153; + } + } + part{ + name: "err_ico"; + type: IMAGE; + description{ + state: "default" 0.0; + visible: 1; + min: 140 140; + max:140 140; + fixed: 1 1; + align: 0.5 0; + rel1{ + relative: 0 0; + offset:0 163; + to: "error_message_background"; + } + rel2{ + relative: 1 1; + to: "error_message_background"; + } + image{ + normal: "web_browsing_icon_error.png"; + } + } + } + + part{ + name: "error_text"; + type: TEXTBLOCK; + description{ + state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 1502 96; + max: 1502 96; + //color: 211 211 211 255; + align: 0.5 0; + rel1{ + relative: 0 1; + to_x: "error_message_background"; + to_y: "err_ico"; + } + rel2{ + relative: 1 1; + to: "error_message_background"; + } + text{ + style: "mssage_style"; + text: "Server not found.
sdf Please check the followings:"; + //min: 0 0; + //max: 1 1; + //align: 1 0; + //size: 35; + } + } + } + + + part{ + name: "error_hint"; + type: TEXTBLOCK; + description{ + state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 1502 117; + max: 1502 117; + color: 134 134 134 255; + align: 0.5 0; + rel1{ + relative: 0 1; + to_x: "error_message_background"; + to_y: "error_text"; + } + rel2{ + relative: 1 1; + to: "error_message_background"; + } + text{ + max: 0 1; + style: "mssage_hint_style"; + text: "Check for any typing error in URL.
" + "Check your network settings.
" + "Try again later.
" + "Click refresh to reload."; + } + } + } + } +/* + programs { + program { name: "mouse_down"; + signal: "mouse,down,1"; + source: "logo"; + action: STATE_SET "hide" 0.0; + target: "logo"; + } + program { name: "mouse_up"; + signal: "mouse,up,1"; + source: "logo"; + action: STATE_SET "default" 0.0; + target: "logo"; + } + } +*/ + } +} diff --git a/services/TabUI/images/btn_bar_incognito_dis.png b/services/TabUI/images/btn_bar_incognito_dis.png new file mode 100644 index 0000000000000000000000000000000000000000..a6bbd1a978f917137f1946242f61679153be6f71 GIT binary patch literal 3046 zcmX|@cQ_SnAII+#*(-Z@L{>PqY|gP~IC6~2h+`xpPgZo0EhE_-q3ltSqZ2Z-9U=1= z*&%u}I%K_`=X&4gkMHOEyRYlM?(6sc{&mOSFw>`};idrq&>I@)Sf2aea-*U+C#t&( zdT!Ld2DT3Xpk?`65Rm(V695`>4+P@I4R@aap9k(fzEDF10_yAUUAxjs`3XRRMro-)t7%@VG;iz~;|4s(0fKn~ zX$?rbZcK$?1zI7=@DiY<2f<*og{?pVIdJTEab5y9B!Q#Ic#;EH^>%F3eqF0!S`$BSDyLQrFQlv+VNWILM`>dt#V<-Q8|dcTa){3^fFTVls~5j^suQ#n}~S=cUt?p-NvZ02TtmhfgJ7 zb=(+L3XJz@(ba8o_uI4ue~}X1Y8kcaLBaa8&93j?-RKsk;-{uomX{}uI^p(CeKujI z==M9UHYfKE!_|&S``{Jp7s1=c^-UcNga+j>t6T6~J3h4M=F3WZ5kjvfsucOsIg? zMG^ozjXrH(MXAUz?okUvfoDH8PxK3}0*ssCGd}=s>j+69`|32isQ}O^h!B6P&9m3W zDbY&7+jeoLjrQ14@d;e0vmMR^r@4#a^>-AjiiC^C48G+PcZ7Y_;*)Q+aF0p%WsqvO z{=lH_%lOBMD!)y%DT10@yN8O!Nnkn-;+%jIOs3+EtuXr zeb=j&Qu(0j6Xp7otrb&oF`g266TFP8 zgI7gnRwk;_pwgmJf3sP!W~&ri(yZHPdlbQ--EAb|Afk^>AzZ|+Sxs5ZmeQ26o2skq z*GN@(74sA}>IAmjFWt`0|8yIZZ{kxr7u>w|hc^s%f;{p5Q@XEDhoY#X6QUr}5jfR8 zEBN`S@xi)@zbp{9Id5 zFx}3zG{u*Qm8hDinsg5i3>FQJ=P2Z<%S_0w<*nsSh!9y)mO(Gs~bx%mEz6P%_{T9(H(Dp;d*i94P0+mCMk$DIB#5- z6WW;r-SD}lV>`V$J?vxH(-U<{`q(LkNfL4y=B!^nq{J%rKS48D+El_ap(>7 zs@ucz)3@V0kpy;uC6Ei5yvM zk0(WEf>wB9efnB*W}d$zyVJ?hkMCgf{(_|1n0iZz7#& z^nM~*L#$25+{Rpw43Fwanlj#-f-nXjFy#2Pi$wtUdCIBd z=$Z>*-jmVi=SQZ1g%RDe#5L6>Rf5CLhk%`0;tGq+2b` z7yqZ;AUT=adpD1^+5%?+`F_5dXEa}a1br-e=6?8Y-|9>0Q94(8`WZP{_U^HZoFwu5 zzX^3QurviA94_QZFHbJD_~@nI0%<+-AMKe6JfG;Uk(fvL4nJ`T4>*PoJ8kMK?f-*-?~@>*`W zJzeOx;t=*p&+eX9Bx@>EyH6od5#6#B4eNeaH{27F?(gEVTkuO^#F@-eE0UbravNWV z|8vNF=#};Rd8lw@_r&>D)zf^d71N$7E2K2;;PiW^RVYF2e;)e>H0L+8|HZ#C{t0B+ e&j7&L85v*_6@b2P=uJ2;5*X^5>D0g-BmWEaN0s^j literal 0 HcmV?d00001 diff --git a/services/TabUI/images/btn_bar_incognito_foc.png b/services/TabUI/images/btn_bar_incognito_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..686e40d259b5b3bfb264c2594d504535b6f32570 GIT binary patch literal 3029 zcmai0Rag}27X1;VOQaFc&>@}DFhi%n07FSLAR?eBB}lh~NIM8Boq`OGboU@2IfRr5 z2pkCqCFXMOdAV=*VeR#OYk%L~Yp)6yK~3G$KU6XhmS8r4+ewyKJ;<-yzd4;;5^D42{+$j zR>3bFK@H-=UmEzBF_A;eph@A3>HNZ66!iM>Tt#zCrk&Tcv`9Dx3gd}WQo@s&Ohu>@ zDQC&nx!$Biy^T*CI$a5Q>owhi|2BHjIHS5*b%<&hBkLfi&eD}Ol?|sZhu*yQHLAa- zZ)IIfJ%WcJ_{5}>Y46pqT_HwT3zz;W2cc@5kV1&#vGzD zz#gtd8t#4ZhHsC=<1SUaxfwvFfrcsJo|16p}7lX757$%Rqo0;oq@} z2jHODr}K*-IdQm0)XG=@VPEZBr;rbXyX(F11K_SEuNZu&L9L%00L{V(;W`bDqfSQ)R~I^|&K%{Up}aj^P^U0kY9J=nvW-PPDJpekhA2*oN#sOk}xFkLI&d*O}P!yWpyRZ z65$XFUCslQhgTHh?6g0nD-8gt$g|iM9m$sw^`<14tMmv^pr{NCKb`r<)qO2t$PNtZo_P2CvMuc?x+7;%L(@0q%@4gAe?luKn&| zb(WHhL+Fa|Of#fj7pD)2hxN$wG9 z^{OXRcqsz8H4w9oTJK($UgucnITJWEX_U)OI%{y7g`nKD3LM5NV?g1 zRb*vnAu4q%O)GVFTIFhXOHn1QTFus{5wsfp`T}+WI>=P)Rn(^WocUrYWht|fisEsN zScO+HM^Uq8K>LHzy_|x!yWs_fKBY@Rt($*tgo>ZT&%OVY9_vseNE@hmNpaLzR^?t< zKObdI@qXM-Q<#0XI;_|!(p5lA)4e|LDl*o6+f9*?bkr8L7?u&HS1CtJ}JQ5G;v0`(AD7IQ4H#d5JzCcMqnV|-l#i4&QK%Kwmlam6 z5WA;5FaJsAlUkpcyYMwd9BsGcO%p@E1YDlZPYAs5MhL(JX+X&7Glhq^LtlZm26NVJBDhqCn?v6AJ z;nL(^?Y}1MGITMlyg(Pn8d!;PBEGd&-BYMn_6x#Mt}$J`6>CXarTj4wE$lsIQn_oD zT@%*IA8h0makq0Qva^xMYlq5$aw8^mXJKa7-UK0Tz1-;ZCl>mHp!ii^( z3gVih&@jx~cIA&PZl#0RQ6)9_JNOa&4_t0(PdD{8r zd8f9{wx3K!RL7^cmx9l9aDUOgl2Nt}(m#X`dd_b}PG%qv#*$H)sL(L6-wTeoH|UT} z7wqyqI-mVd^!_UoT7;xcr4}Wu-N8rygL>S?b*qn7d9{iT-rN4$$`=`vCjHH?n)7Nf zc3zmh;MT?vcl;JdfjoBcs5R&(GhuqFKtW}(^)T26--|z9W?l??C~%G)Zk`Je*sE?a zX>mAG-_@9dEyhi$*27DhLICIf+hsbF^{0?$f&`D>?~lztm!4*@Wn>UYh;t6lT%<*Dm;WZj zMc2#-fM7lV!lMBAO}OMO03J&Ku)as`C z9|@Vm1&;LY-^ttBEh2-;i3Qnn70O%Lh;-8+R~dM9)2>i3yi<=Pp)iAJM3M-lK{O~Y z#s6t7&6?Gvn&2(_JJ(uYv+z%7hRI$V|9C!rs2}F-$gL6iLHo&F4xQRj{sV{Q`MJRL z8?CJg{&htEo%aQ6O`tntg4MFn^G`JXDo<$s6XYsqY-ed$l|b_E-mM{R{)3G)zUAEH zrS?nlAk$*$IoiIoVn0_HvyuYBQ)+ugIc zBBmBW&g%_NXgADn7iW*VpxK1x+7h6m3EBhF zZ|jqy7=T(x3bX{MX%V2%IsE3JkO(*oI6Ex^6H(wG@MLWapwP#;p#;F@ITs^AVLITX zca7Ho?uwvl_)elGK!^hdH~nsTFeM7abuHa=KwT4P$I(*M15!#LZW+x{Q`h3Sl!-|n9U;izkHIN1~owY})(N8$@^C#U7})!|BCH2@X^!bi?UAPuZ2 zMPiiq`76F1BKNx#g%6LC-0Er68bRU4jOD)X-)uCC(y-Iht1By0dfiYP$9~JOb7ZG| zyXD!v-{DH9M~B}&Eb&H2+C^v+9e?W_JTNF`AAUv_?KHcVs(so-adFBq#@(&!ghdE5 zESu8#rD)_O?@JbQCqSPGec~Iva9LUqIU!V8kO6g`Dg>eFqGfi@gunC!Xb}PJOGg0g zwfJ;=6(l7@xkoJy2VU%|o@p2I0hF8WGd}?CYVeA|`x{hyNdeF(j1aCE9MbKk?y(uZ)MA|$@2Qo2 zY5q8p7IX-&a?QjOI3*%@Qb?I|V~)8xbcpDZcsW1EGnjJgr_1O_m?gqF zEp#~cl>M*B$JuH%rz`dW$;i{#R&9yr5%s3ZUnv`5*fKfRXsuTiUt9tt@=}=!^S}7N zV^vO;En5Fl=}t3~ssig3Z~uOsM5_CqxL8jY^zCgCvJB^ex7<~fl|8I=cd7_m5)Pe* z-v$!VMQFB@$r1%ZIUR4P>mUpeMpHUvob0^P*JjA%$OxlNI|aBi%JkpyH(&eRecee? zA`YP=!ZSgaN)Mq8jfZv1@zN#0Bn7Z(S9IULfsfLSYK`7E z{F+RvHMF`2V^(V#S4J=WFi(Ccib+?$xcXJ*7^^$8`;kZO_kiYWbD1}cvcFi44s2+D z&;Cw$5J*WC%NW%gj}&CdzfN);$r5gXcg@3Uv@E2|m&?h%W>s2LpiQ>S+02pUie+&X z$TAYH$@vjk$RE`u&(*c;QrxAx1eJ)9KIEDb>-TwYX_u@56;y7}J@O+S7l+>&#~ z(UPQGQC=hulhTv2Y%tq@?xsqzoa1-=BEX1jU9dEJKRj`sVOMBLh^<8004w2Y>s67J zorS2>sWh$B-fEMr*)Bzwv}v|jokUQp_v#7Q3TPu!aaYmn=F{eLrR1edhRO3pJ>EU9`HA_t`1K7p4R`X) z46!9bC5i@$2E9XrL$8J=a%J+BB_<`;^Vjny^B0;Ntb?pYFlCtcuDbOr)+JUunAZC- z*78=x2n%bw2CZszHQz)_bxY~BQmj#iQDwmdva9YV<};?eiKT9JiWpym@y3KXBAu9# zO`mGIb~4&B!kWXLo+*=1#Z6OJa#(YOKX~WQpm0ZFJ`eX|M>XuzLDmKYi5R9Go|0O| z&<_Z8d!Wtp$Fz~mNbG~C{rIE={m22aY!$J5ww}4ZwiUgALqEI4kkLbQenWoeb{W2Q zM|Q_!CvNuTp!7?j0xPKpU%L8W-%M9WR4HC&ihC_og&V_+Ban^jJP>C{x@GlbT~l#j z#gXGKv&t_O|Ch@u%Sv+dlJi#fgL3UneN6+#T|Nc&F$=IKJQpq(Ar~W{6van?But1< zkFdFNavbuQ>tl+l0^apk{q(kaav@foQ9U)XI&!t6n#;ZKM_M)4(RvOp9p^zEV-o&- z;tPr6nqyK|IHf>LT#RL`YKm_>f^|e9TPAR17WQC4>bH%*|?W9DzpY-qUB77Za|Ly?^h+!s+&Y+!A_;VmXvK2hwNf8(f6zJcub} zDi@;@QOHs=h&Q_Z{6Ffn!eva!e0%hPd@1C?ogAG=Zpeu2Nc~m ztun#9pQMUKRt7;g-Pm>u9j{ehZ6ebvnmU24Q&rL^yAay zUhKZS*rw~GTYQEoj@7pm+ztKeD5dz-x=bf_yb5Y-@IM+s+sPv07+!{1c02Q(;Uo4ga<9M6aqcfGyAMh3g z7KY<)cp)rZR*~e zAI{OcfudBhR2ENP^eplCY6P!r9FZ*?-JnvKd6XPlwMa5{^AQJ<1L6tI+so6+H_tn< zak6PP9#k2b*qjeJ)yChXc_FQ26|A=p|Lifd5jmED+#60tXQIQx#eUB^;9p@v*PU?- zo-{tY&9niFqnZ~<>x!+4INQDV0ekiMReH< zoshQ1P`9HEwgNfa+(BFLPo|5B@dA0}xwicfpQBGlhYL(|;r;?=xPg}GK!Kg=R^wLt z1GR1SY1mxcxT?+h?9}e;6VLX*!u^q1?IYrtsNwVU!&DmB)zsY7fmo{8t%BPs^72cn z{%0GfrLbX_Vg3T<^H=8sHOx$q@Z<5VN!&=zNKy7)cE(5V$Hixx?OQCh_@2(58y`Lg zNlDy2xO1}I5jY#jvHN;~#(3p1=M%vT_up?1&A*hMWUyppTo4iF?4LSIiQ+H&Ca1HG znIQlnd;p-L0Qh}z=^Fq%6bE3_0RV*@0GNHA*?-akfPh+8LmeJ8^J7+@yi=Uvs>#du zy;TyGkB!*1MAjxZvGnTJSK{#94$_kQ{AXAmKt}flMf5+IsYMcz{R<&Z^+=+B!H`D3 zpQEfMv^qDv8Ppc85URY=Z0+U#MoX6M!NHm7r0DO)2(3sWj}&$#xt)T1nLYcP+dpjO z0~c!3nb^`eukz}o`Qy+-Bf~+zS8qR(Wu3ln79cCj|MZ{n6}rFUA@tDn?qr{R=)3I4 z$okO7Pl?DzE0i5-JgZCeaoV0Mnsnz?2p;uFhP2De{(@ZR|M7RlKYRYcX#Zt5zqlX- XCMjH_l#m?r%M^jGrjbSs)FJY}wa}D( literal 0 HcmV?d00001 diff --git a/services/TabUI/images/btn_bar_new_dis.png b/services/TabUI/images/btn_bar_new_dis.png new file mode 100644 index 0000000000000000000000000000000000000000..af49c5af52731fb146af572791cd28382e524afb GIT binary patch literal 2980 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 literal 0 HcmV?d00001 diff --git a/services/TabUI/images/btn_bar_stop_nor.png b/services/TabUI/images/btn_bar_stop_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..c5cdc11ca8ea537497a1a794d79d40362f8659a9 GIT binary patch literal 3255 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 literal 0 HcmV?d00001 diff --git a/services/TabUI/images/web_frame_selected.png b/services/TabUI/images/web_frame_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..4470ca4a328ef0d26bbe8a92764757a7a217b2a7 GIT binary patch literal 17687 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 SOF&k3)ON6OvCgyFvg_YNdqf}r literal 0 HcmV?d00001 diff --git a/services/TabUI/images/web_shadow.png b/services/TabUI/images/web_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..f9018b0a6e15ae5670b67d580b890d1950636066 GIT binary patch literal 17700 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 literal 0 HcmV?d00001 -- 2.7.4 From 4f3c9dd7f588a1e77b887de1f85ed40934f7b778 Mon Sep 17 00:00:00 2001 From: "k.lis2" Date: Tue, 4 Aug 2015 10:16:56 +0200 Subject: [PATCH 14/16] Task TT-76 Implement Bookmark view [Issue#] https://bugs.tizen.org/jira/browse/TT-76 [Task] TT-76 Implement Bookmark view [Cause] - [Solution] Add BookmarkManagerUI. Enable code referring to BookmarkManagerUI in SimpleUI. [Verify] Perform basic sanity check. Change-Id: I196746e4153d0b9ce86b562fbcd82f33068eef14 --- core/AbstractInterfaces/AbstractFavoriteService.h | 2 +- core/Tools/BookmarkItem.cpp | 13 +- core/Tools/BookmarkItem.h | 8 +- services/BookmarkManagerUI/AddNewFolderPopup.cpp | 142 +++ services/BookmarkManagerUI/AddNewFolderPopup.h | 59 ++ services/BookmarkManagerUI/BookmarkManagerUI.cpp | 549 ++++++++++ services/BookmarkManagerUI/BookmarkManagerUI.h | 106 ++ services/BookmarkManagerUI/CMakeLists.txt | 40 + .../BookmarkManagerUI/edc/AddNewFolderPopup.edc | 198 ++++ .../BookmarkManagerUI/edc/BookmarkManagerUI.edc | 1118 ++++++++++++++++++++ .../BookmarkManagerUI/images/btn_bar_new_dis.png | Bin 0 -> 2980 bytes .../BookmarkManagerUI/images/btn_bar_new_foc.png | Bin 0 -> 2963 bytes .../BookmarkManagerUI/images/btn_bar_new_nor.png | Bin 0 -> 2977 bytes .../BookmarkManagerUI/images/btn_bar_stop_nor.png | Bin 0 -> 3255 bytes services/BookmarkManagerUI/images/favicon.png | Bin 0 -> 13397 bytes .../BookmarkManagerUI/images/ic_add_bookmark.png | Bin 0 -> 2036 bytes .../images/ic_more_bookmark_foc.png | Bin 0 -> 2008 bytes .../images/ic_more_bookmark_nor.png | Bin 0 -> 2089 bytes .../images/ic_more_desktopview_foc.png | Bin 0 -> 4066 bytes .../images/ic_more_desktopview_nor.png | Bin 0 -> 4372 bytes .../BookmarkManagerUI/images/ic_more_exit_foc.png | Bin 0 -> 1558 bytes .../BookmarkManagerUI/images/ic_more_exit_nor.png | Bin 0 -> 1604 bytes .../images/ic_more_focusmode_foc.png | Bin 0 -> 2053 bytes .../images/ic_more_focusmode_nor.png | Bin 0 -> 2062 bytes .../images/ic_more_history_foc.png | Bin 0 -> 2892 bytes .../images/ic_more_history_nor.png | Bin 0 -> 2918 bytes .../images/ic_more_minibrowser_foc.png | Bin 0 -> 1472 bytes .../images/ic_more_minibrowser_nor.png | Bin 0 -> 1524 bytes .../images/ic_more_mobileview_foc.png | Bin 0 -> 3929 bytes .../images/ic_more_mobileview_nor.png | Bin 0 -> 4205 bytes .../images/ic_more_pointermode_foc.png | Bin 0 -> 3180 bytes .../images/ic_more_pointermode_nor.png | Bin 0 -> 3346 bytes .../images/ic_more_readermode_foc.png | Bin 0 -> 1943 bytes .../images/ic_more_readermode_nor.png | Bin 0 -> 2021 bytes .../images/ic_more_setting_foc.png | Bin 0 -> 4600 bytes .../images/ic_more_setting_nor.png | Bin 0 -> 4936 bytes .../BookmarkManagerUI/images/ic_more_share_foc.png | Bin 0 -> 2653 bytes .../BookmarkManagerUI/images/ic_more_share_nor.png | Bin 0 -> 2854 bytes .../BookmarkManagerUI/images/ic_more_zoom_foc.png | Bin 0 -> 3419 bytes .../BookmarkManagerUI/images/ic_more_zoom_nor.png | Bin 0 -> 3524 bytes .../images/ic_thumbnail_folder.png | Bin 0 -> 1522 bytes .../images/ic_thumbnail_folder_all.png | Bin 0 -> 1378 bytes .../images/ic_thumbnail_folder_mark.png | Bin 0 -> 1831 bytes .../images/ico_bg_round_shape_37x37.png | Bin 0 -> 18109 bytes services/BookmarkManagerUI/images/ico_delete.png | Bin 0 -> 18365 bytes .../BookmarkManagerUI/images/modal_dialogs_bg.png | 0 .../images/modal_dialogs_title_bg.png | 0 .../images/web_frame_selected.png | Bin 0 -> 17687 bytes services/BookmarkManagerUI/images/web_shadow.png | Bin 0 -> 17700 bytes services/BookmarkService/BookmarkService.cpp | 9 +- services/BookmarkService/BookmarkService.h | 2 +- services/CMakeLists.txt | 3 +- services/SimpleUI/CMakeLists.txt | 8 +- services/SimpleUI/SimpleUI.cpp | 10 - services/SimpleUI/SimpleUI.h | 7 +- 55 files changed, 2235 insertions(+), 39 deletions(-) create mode 100644 services/BookmarkManagerUI/AddNewFolderPopup.cpp create mode 100644 services/BookmarkManagerUI/AddNewFolderPopup.h create mode 100644 services/BookmarkManagerUI/BookmarkManagerUI.cpp create mode 100644 services/BookmarkManagerUI/BookmarkManagerUI.h create mode 100644 services/BookmarkManagerUI/CMakeLists.txt create mode 100644 services/BookmarkManagerUI/edc/AddNewFolderPopup.edc create mode 100644 services/BookmarkManagerUI/edc/BookmarkManagerUI.edc create mode 100644 services/BookmarkManagerUI/images/btn_bar_new_dis.png create mode 100644 services/BookmarkManagerUI/images/btn_bar_new_foc.png create mode 100644 services/BookmarkManagerUI/images/btn_bar_new_nor.png create mode 100644 services/BookmarkManagerUI/images/btn_bar_stop_nor.png create mode 100644 services/BookmarkManagerUI/images/favicon.png create mode 100644 services/BookmarkManagerUI/images/ic_add_bookmark.png create mode 100644 services/BookmarkManagerUI/images/ic_more_bookmark_foc.png create mode 100644 services/BookmarkManagerUI/images/ic_more_bookmark_nor.png create mode 100644 services/BookmarkManagerUI/images/ic_more_desktopview_foc.png create mode 100644 services/BookmarkManagerUI/images/ic_more_desktopview_nor.png create mode 100644 services/BookmarkManagerUI/images/ic_more_exit_foc.png create mode 100644 services/BookmarkManagerUI/images/ic_more_exit_nor.png create mode 100644 services/BookmarkManagerUI/images/ic_more_focusmode_foc.png create mode 100644 services/BookmarkManagerUI/images/ic_more_focusmode_nor.png create mode 100644 services/BookmarkManagerUI/images/ic_more_history_foc.png create mode 100644 services/BookmarkManagerUI/images/ic_more_history_nor.png create mode 100644 services/BookmarkManagerUI/images/ic_more_minibrowser_foc.png create mode 100644 services/BookmarkManagerUI/images/ic_more_minibrowser_nor.png create mode 100644 services/BookmarkManagerUI/images/ic_more_mobileview_foc.png create mode 100644 services/BookmarkManagerUI/images/ic_more_mobileview_nor.png create mode 100644 services/BookmarkManagerUI/images/ic_more_pointermode_foc.png create mode 100644 services/BookmarkManagerUI/images/ic_more_pointermode_nor.png create mode 100644 services/BookmarkManagerUI/images/ic_more_readermode_foc.png create mode 100644 services/BookmarkManagerUI/images/ic_more_readermode_nor.png create mode 100644 services/BookmarkManagerUI/images/ic_more_setting_foc.png create mode 100644 services/BookmarkManagerUI/images/ic_more_setting_nor.png create mode 100644 services/BookmarkManagerUI/images/ic_more_share_foc.png create mode 100644 services/BookmarkManagerUI/images/ic_more_share_nor.png create mode 100644 services/BookmarkManagerUI/images/ic_more_zoom_foc.png create mode 100644 services/BookmarkManagerUI/images/ic_more_zoom_nor.png create mode 100644 services/BookmarkManagerUI/images/ic_thumbnail_folder.png create mode 100644 services/BookmarkManagerUI/images/ic_thumbnail_folder_all.png create mode 100644 services/BookmarkManagerUI/images/ic_thumbnail_folder_mark.png create mode 100644 services/BookmarkManagerUI/images/ico_bg_round_shape_37x37.png create mode 100644 services/BookmarkManagerUI/images/ico_delete.png create mode 100644 services/BookmarkManagerUI/images/modal_dialogs_bg.png create mode 100644 services/BookmarkManagerUI/images/modal_dialogs_title_bg.png create mode 100644 services/BookmarkManagerUI/images/web_frame_selected.png create mode 100644 services/BookmarkManagerUI/images/web_shadow.png diff --git a/core/AbstractInterfaces/AbstractFavoriteService.h b/core/AbstractInterfaces/AbstractFavoriteService.h index 5c24c4f..4d32920 100644 --- a/core/AbstractInterfaces/AbstractFavoriteService.h +++ b/core/AbstractInterfaces/AbstractFavoriteService.h @@ -89,7 +89,7 @@ public: * * @return list of bookmark items in folder with id, folder_id */ - virtual std::vector > getBookmarks(int folder_id = 0)= 0; + virtual std::vector > getBookmarks(int folder_id = -1)= 0; /** * @brief Get bookmark folders from platform service and store it in private m_bookmarkFoldersList diff --git a/core/Tools/BookmarkItem.cpp b/core/Tools/BookmarkItem.cpp index 3f994fd..b427afd 100644 --- a/core/Tools/BookmarkItem.cpp +++ b/core/Tools/BookmarkItem.cpp @@ -31,23 +31,24 @@ namespace services{ BookmarkItem::BookmarkItem() : m_saved_id(0) -, m_url(std::string()) -, m_tittle(std::string()) -, m_thumbnail(std::shared_ptr()) -, m_favicon(std::shared_ptr()) +, m_url() +, m_title() +, m_note() +, m_thumbnail(std::make_shared()) +, m_favicon(std::make_shared()) { } BookmarkItem::BookmarkItem( const std::string& url, - const std::string& tittle, + const std::string& title, const std::string& note, unsigned int dir, unsigned int id ) : m_saved_id(id) , m_url(url) -, m_tittle(tittle) +, m_title(title) , m_note(note) , m_directory(dir) { diff --git a/core/Tools/BookmarkItem.h b/core/Tools/BookmarkItem.h index 84fe489..fd34070 100644 --- a/core/Tools/BookmarkItem.h +++ b/core/Tools/BookmarkItem.h @@ -36,7 +36,7 @@ public: BookmarkItem(); BookmarkItem( const std::string& url, - const std::string& tittle, + const std::string& title, const std::string& note, unsigned int dir = 0, unsigned int id = 0 @@ -46,8 +46,8 @@ public: void setAddress(const std::string & url) { m_url = url; }; std::string getAddress() const { return m_url; }; - void setTittle(const std::string & tittle) { m_tittle = tittle; }; - std::string getTittle() const { return m_tittle; }; + void setTittle(const std::string & tittle) { m_title = tittle; }; + std::string getTittle() const { return m_title; }; void setNote(const std::string& note){m_note = note;}; std::string getNote() const { return m_note;}; @@ -76,7 +76,7 @@ public: private: unsigned int m_saved_id; std::string m_url; - std::string m_tittle; + std::string m_title; std::string m_note; std::shared_ptr m_thumbnail; std::shared_ptr m_favicon; diff --git a/services/BookmarkManagerUI/AddNewFolderPopup.cpp b/services/BookmarkManagerUI/AddNewFolderPopup.cpp new file mode 100644 index 0000000..10b6114 --- /dev/null +++ b/services/BookmarkManagerUI/AddNewFolderPopup.cpp @@ -0,0 +1,142 @@ + + +#include +#include +#include + +#include "Tools/EflTools.h" +#include "BrowserLogger.h" + +#include "AddNewFolderPopup.h" +#include "BrowserLogger.h" +#include "ServiceManager.h" +#include "AbstractMainWindow.h" + + +namespace tizen_browser{ +namespace base_ui{ + +AddNewFolderPopup::AddNewFolderPopup(Evas_Object* main_layout) : + m_popup(nullptr), + m_cancel_button(nullptr), + m_editfield_entry(nullptr), + m_ok_button(nullptr), + m_mainLayout(main_layout) +{ +} + +AddNewFolderPopup::AddNewFolderPopup(Evas_Object *main_layout, Evas_Object *content, const std::string& message, + const std::string& title, const std::string& okButtonText, + const std::string& cancelButtonText) : + m_popup(nullptr), + m_cancel_button(nullptr), + m_editfield_entry(nullptr), + m_ok_button(nullptr), + m_content(content), + m_message(message), + m_title(title), + m_okButtonText(okButtonText), + m_cancelButtonText(cancelButtonText), + m_mainLayout(main_layout) +{ + +} + +void AddNewFolderPopup::setTitle(const std::string& title) +{ + m_title = title; +} + +void AddNewFolderPopup::setMessage(const std::string& message) +{ + m_message = message; +} + +void AddNewFolderPopup::setContent(Evas_Object* content) +{ + m_content = content; +} + +void AddNewFolderPopup::setOkButtonText(const std::string& okButtonText) +{ + m_okButtonText = okButtonText; +} + +void AddNewFolderPopup::setCancelButtonText(const std::string& cancelButtonText) +{ + m_cancelButtonText = cancelButtonText; +} + +void AddNewFolderPopup::show() +{ + std::string edjePath = std::string(EDJE_DIR); + edjePath.append("BookmarkManagerUI/AddNewFolderPopup.edj"); + elm_theme_extension_add(0, edjePath.c_str()); + m_popup = elm_popup_add(m_mainLayout); + evas_object_size_hint_weight_set(m_popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + /* for margins */ + Evas_Object *layout = elm_layout_add(m_popup); + elm_layout_file_set(layout, edjePath.c_str() , "popup_input_text"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(m_popup, layout); + elm_object_part_text_set(m_popup, "title,text", m_title.c_str()); + + m_editfield_entry = elm_entry_add(layout); + elm_object_style_set(m_editfield_entry, "uri_entry_popup"); + evas_object_size_hint_weight_set(m_editfield_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_editfield_entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_entry_editable_set(m_editfield_entry, EINA_TRUE); + elm_entry_cnp_mode_set(m_editfield_entry, ELM_CNP_MODE_PLAINTEXT); + elm_entry_scrollable_set(m_editfield_entry, EINA_TRUE); + elm_entry_autocapital_type_set(m_editfield_entry, ELM_AUTOCAPITAL_TYPE_NONE); + elm_entry_prediction_allow_set(m_editfield_entry, EINA_FALSE); + elm_entry_single_line_set(m_editfield_entry, EINA_TRUE); + + elm_entry_input_panel_layout_set(m_editfield_entry, ELM_INPUT_PANEL_LAYOUT_URL); + elm_entry_input_panel_return_key_type_set(m_editfield_entry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE); + elm_object_part_content_set(layout, "elm.swallow.content" , m_editfield_entry); + elm_entry_cursor_end_set(m_editfield_entry); + + m_cancel_button = elm_button_add(m_popup); + elm_object_style_set(m_cancel_button, "popup"); + elm_object_part_content_set(m_popup, "button1",m_cancel_button); + elm_object_part_text_set(m_cancel_button, "elm.text", m_cancelButtonText.c_str()); + evas_object_smart_callback_add(m_cancel_button, "clicked", popup_cancel_cb, this); + + m_ok_button = elm_button_add(m_popup); + elm_object_style_set(m_ok_button, "popup"); + elm_object_part_content_set(m_popup, "button2", m_ok_button); + elm_object_part_text_set(m_ok_button, "elm.text", m_okButtonText.c_str()); + evas_object_smart_callback_add(m_ok_button, "clicked", popup_ok_cb, this); + + evas_object_show(m_popup); +} + +void AddNewFolderPopup::hide() +{ + evas_object_hide(m_popup); + elm_object_signal_emit(m_mainLayout, "elm,state,hide", "elm"); +} + +void AddNewFolderPopup::popup_ok_cb(void *data, Evas_Object *, void*) +{ + BROWSER_LOGD("[%s],", __func__); + if (data != nullptr) + { + AddNewFolderPopup *ownPopup = static_cast(data); + ownPopup->on_ok(ownPopup->m_editfield_entry); + } +} +void AddNewFolderPopup::popup_cancel_cb(void *data, Evas_Object *, void*) +{ + BROWSER_LOGD("[%s],", __func__); + if (data != nullptr) + { + AddNewFolderPopup *ownPopup = static_cast(data); + ownPopup->on_cancel(ownPopup->m_editfield_entry); + } +} + +} +} diff --git a/services/BookmarkManagerUI/AddNewFolderPopup.h b/services/BookmarkManagerUI/AddNewFolderPopup.h new file mode 100644 index 0000000..4f2d6a5 --- /dev/null +++ b/services/BookmarkManagerUI/AddNewFolderPopup.h @@ -0,0 +1,59 @@ +#ifndef ADDNEWFOLDERPOPUP_H +#define ADDNEWFOLDERPOPUP_H + +#include +#include + +#include "AbstractUIComponent.h" +#include "AbstractService.h" +#include "ServiceFactory.h" +#include "service_macros.h" +#include "BookmarkItem.h" + + + +namespace tizen_browser{ +namespace base_ui{ + +class AddNewFolderPopup{ + +public: + AddNewFolderPopup(Evas_Object *main_layout); + AddNewFolderPopup(Evas_Object *main_layout, Evas_Object *content, const std::string& message, + const std::string& title, const std::string& okButtonText, const std::string& cancelButtonText); + + /* + * These setters should be called before showing popup. + */ + void setContent(Evas_Object *content); + void setMessage(const std::string &message); + void setTitle(const std::string &title); + void setOkButtonText(const std::string &okButtonText); + void setCancelButtonText(const std::string &cancelButtonText); + + void show(); + void hide(); + boost::signals2::signal on_ok; + boost::signals2::signal on_cancel; + + +private: + static void popup_ok_cb(void *data, Evas_Object *, void*); + static void popup_cancel_cb(void *data, Evas_Object *, void*); + Evas_Object *m_popup; + Evas_Object *m_cancel_button; + Evas_Object *m_editfield_entry; + Evas_Object *m_ok_button; + Evas_Object *m_content; + std::string m_message; + std::string m_title; + std::string m_okButtonText; + std::string m_cancelButtonText; + +protected: + Evas_Object *m_mainLayout; +}; + +} +} +#endif diff --git a/services/BookmarkManagerUI/BookmarkManagerUI.cpp b/services/BookmarkManagerUI/BookmarkManagerUI.cpp new file mode 100644 index 0000000..a44f7bd --- /dev/null +++ b/services/BookmarkManagerUI/BookmarkManagerUI.cpp @@ -0,0 +1,549 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include + +#include "AddNewFolderPopup.h" +#include "BookmarkManagerUI.h" +#include "ServiceManager.h" +#include "BrowserLogger.h" +#include "Tools/EflTools.h" +#include "../Tools/BrowserImage.h" + +namespace tizen_browser{ +namespace base_ui{ + +EXPORT_SERVICE(BookmarkManagerUI, "org.tizen.browser.bookmarkmanagerui") + +struct ItemData +{ + tizen_browser::base_ui::BookmarkManagerUI * m_bookmarkManager; + tizen_browser::services::BookmarkItem * h_item; + Elm_Object_Item * e_item; +}; + +typedef struct +{ + std::shared_ptr item; + std::shared_ptr bookmarkManagerUI; +} BookmarkItemData, BookmarkFolderItemData; + +BookmarkManagerUI::BookmarkManagerUI() + : m_genList(nullptr) + , popup_content(nullptr) + , b_mm_layout(nullptr) + , m_itemClass(nullptr) + , m_gengrid(nullptr) + , m_parent(nullptr) + , m_item_class(nullptr) + , m_detail_item_class(nullptr) + , m_gengridSetup(false) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + edjFilePath = EDJE_DIR; + edjFilePath.append("BookmarkManagerUI/BookmarkManagerUI.edj"); +} + +BookmarkManagerUI::~BookmarkManagerUI() +{ +} + +void BookmarkManagerUI::show(Evas_Object* parent) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_parent = parent; + m_folder.clear(); + elm_theme_extension_add(nullptr, edjFilePath.c_str()); + b_mm_layout = elm_layout_add(parent); + elm_layout_file_set(b_mm_layout, edjFilePath.c_str(), "bookmarkmanager-layout"); + evas_object_size_hint_weight_set(b_mm_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(b_mm_layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(b_mm_layout); + + m_gengrid = elm_gengrid_add(b_mm_layout); + elm_object_part_content_set(b_mm_layout, "elm.swallow.grid", m_gengrid); + + elm_object_style_set(m_gengrid, "back_ground"); + evas_object_smart_callback_add(m_gengrid, "item,focused", focusItem, nullptr); + evas_object_smart_callback_add(m_gengrid, "item,unfocused", unFocusItem, nullptr); + evas_object_smart_callback_add(m_gengrid, "activated", _itemSelected, this); + + if (!m_item_class) { + m_item_class = elm_gengrid_item_class_new(); + m_item_class->item_style = "grid_bm_item"; + m_item_class->func.text_get = _grid_text_get; + m_item_class->func.content_get = _grid_content_get; + m_item_class->func.state_get = nullptr; + m_item_class->func.del = nullptr; + } + + if (!m_detail_item_class) { + m_detail_item_class = elm_gengrid_item_class_new(); + m_detail_item_class->item_style = "grid_ds_item"; + m_detail_item_class->func.text_get = _grid_bookmark_text_get; + m_detail_item_class->func.content_get = _grid_bookmark_content_get; + m_detail_item_class->func.state_get = nullptr; + m_detail_item_class->func.del = nullptr; + } + + elm_gengrid_align_set(m_gengrid, 0, 0); + elm_gengrid_select_mode_set(m_gengrid, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_gengrid_multi_select_set(m_gengrid, EINA_FALSE); + elm_gengrid_horizontal_set(m_gengrid, EINA_TRUE); + elm_scroller_policy_set(m_gengrid, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_scroller_page_size_set(m_gengrid, 0, 327); + evas_object_size_hint_weight_set(m_gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); + double efl_scale = elm_config_scale_get() / elm_app_base_scale_get(); + elm_gengrid_item_size_set(m_gengrid, 404 * efl_scale, 320 * efl_scale); +} + +void BookmarkManagerUI::showTopContent() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + elm_theme_extension_add(nullptr, edjFilePath.c_str()); + m_genList = elm_genlist_add(b_mm_layout); + elm_object_part_content_set(b_mm_layout, "elm.swallow.genlist", m_genList); + elm_genlist_homogeneous_set(m_genList, EINA_FALSE); + elm_genlist_multi_select_set(m_genList, EINA_FALSE); + elm_genlist_select_mode_set(m_genList, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_genlist_mode_set(m_genList, ELM_LIST_LIMIT); + elm_genlist_decorate_mode_set(m_genList, EINA_TRUE); + evas_object_size_hint_weight_set(m_genList, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + /*evas_object_smart_callback_add(m_genList, "item,focused", focusItem, this); + evas_object_smart_callback_add(m_genList, "item,unfocused", unFocusItem, nullptr);*/ + + m_itemClass = elm_genlist_item_class_new(); + m_itemClass->item_style = "topContent"; + m_itemClass->func.text_get = &listItemTextGet; + m_itemClass->func.content_get = &listItemContentGet; + m_itemClass->func.state_get = 0; + m_itemClass->func.del = 0; + + ItemData * id = new ItemData; + id->m_bookmarkManager = this; + Elm_Object_Item* elmItem = elm_genlist_item_append(m_genList, //genlist + m_itemClass, //item Class + id, + nullptr, //parent item + ELM_GENLIST_ITEM_NONE, //item type + nullptr, + nullptr //data passed to above function + ); + id->e_item = elmItem; + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); +} + +Evas_Object* BookmarkManagerUI::listItemContentGet(void* data, Evas_Object* obj, const char* part) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if ((data != nullptr) && (obj != nullptr) && (part != nullptr)) + { + const char *part_name1 = "new_folder_click"; + const char *part_name2 = "close_click"; + static const int part_name1_len = strlen(part_name1); + static const int part_name2_len = strlen(part_name2); + ItemData * id = static_cast(data); + if(!strncmp(part_name1, part, part_name1_len)) + { + Evas_Object *new_folder_click = elm_button_add(obj); + elm_object_style_set(new_folder_click, "hidden_button"); + evas_object_smart_callback_add(new_folder_click, "clicked", BookmarkManagerUI::new_folder_clicked_cb, id); + return new_folder_click; + } + if(!strncmp(part_name2, part, part_name2_len)) + { + Evas_Object *close_click = elm_button_add(obj); + elm_object_style_set(close_click, "hidden_button"); + evas_object_smart_callback_add(close_click, "clicked", BookmarkManagerUI::close_clicked_cb, id); + return close_click; + } + } + return nullptr; +} + +void BookmarkManagerUI::item_clicked_cb(void*, Evas_Object*, void*) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); +} + +void BookmarkManagerUI::close_clicked_cb(void* data, Evas_Object*, void*) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if (data != nullptr) + { + ItemData * id = static_cast(data); + id->m_bookmarkManager->closeBookmarkManagerClicked(std::string()); + id->m_bookmarkManager->clearItems(); + } +} + +void BookmarkManagerUI::new_folder_clicked_cb(void* data, Evas_Object*, void*) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if (data != nullptr) + { + ItemData * id = static_cast(data); + id->m_bookmarkManager->newFolderPopup(); + } +} + +void BookmarkManagerUI::newFolderPopup() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_popup.reset(new AddNewFolderPopup(m_parent, nullptr,"Add New Folder?","New Folder","Ok","Cancel")); + m_popup->on_ok.disconnect_all_slots(); + m_popup->on_ok.connect(boost::bind(&BookmarkManagerUI::NewFolderCreate, this, _1)); + m_popup->on_cancel.disconnect_all_slots(); + m_popup->on_cancel.connect(boost::bind(&BookmarkManagerUI::CancelClicked, this, _1)); + m_popup->show(); +} + +void BookmarkManagerUI::NewFolderCreate(Evas_Object * popup_content) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if (popup_content != nullptr) + { + m_folderName = elm_entry_entry_get(popup_content); + saveFolderClicked(m_folderName.c_str(), 0,0); + m_popup->hide(); + } +} + +void BookmarkManagerUI::CancelClicked(Evas_Object * popup) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if (popup != nullptr) + { + m_popup->hide(); + } +} + +char* BookmarkManagerUI::listItemTextGet(void* data, Evas_Object*, const char* part) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if ((data != nullptr) && (part != nullptr)) + { + const char *part_name = "folder_text"; + static const int part_name_len = strlen(part_name); + ItemData * id = static_cast(data); + if(!strncmp(part_name, part, part_name_len)) + { + if(!id->m_bookmarkManager->m_folder.empty()) + { + std::string s = std::string("Bookmark > ") + id->m_bookmarkManager->m_folder; + return strdup(s.c_str()); + } + } + } + return strdup("Bookmark"); +} + +void BookmarkManagerUI::hide() +{ + evas_object_hide(elm_layout_content_get(b_mm_layout, "elm.swallow.grid")); + evas_object_hide(elm_layout_content_get(b_mm_layout, "elm.swallow.genlist")); + evas_object_hide(b_mm_layout); +} + +Evas_Object * BookmarkManagerUI::getGenList() +{ + return m_genList; +} + +Evas_Object * BookmarkManagerUI::getContent() +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + return m_gengrid; +} + +void BookmarkManagerUI::setEmptyGengrid(bool setEmpty) +{ + if(setEmpty) { + elm_object_part_content_set(m_gengrid, "elm.swallow.empty", createNoHistoryLabel()); + } else { + elm_object_part_content_set(m_gengrid, "elm.swallow.empty", nullptr); + } +} + +Evas_Object* BookmarkManagerUI::createNoHistoryLabel() +{ + Evas_Object *label = elm_label_add(m_parent); + if (label != nullptr) + { + elm_object_text_set(label, "No favorite websites."); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + } + return label; +} + +void BookmarkManagerUI::addBookmarkFolderItem(std::shared_ptr hi) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + BookmarkFolderItemData *itemData = new BookmarkFolderItemData(); + itemData->item = hi; + itemData->bookmarkManagerUI.reset(this); + Elm_Object_Item* BookmarkFolderView = elm_gengrid_item_append(m_gengrid, m_item_class, itemData, nullptr, this); + m_map_bookmark_folder_views.insert(std::pair(hi->getAddress(),BookmarkFolderView)); + elm_gengrid_item_selected_set(BookmarkFolderView, EINA_FALSE); + setEmptyGengrid(false); +} + +void BookmarkManagerUI::addBookmarkFolderItems(std::vector > items) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + for (auto it = items.begin(); it != items.end(); ++it) + { + addBookmarkFolderItem(*it); + } + elm_object_part_content_set(b_mm_layout, "elm.swallow.grid",getContent()); + evas_object_show(getContent()); +} + + +void BookmarkManagerUI::addBookmarkItem(std::shared_ptr hi) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + BookmarkItemData *itemData = new BookmarkItemData(); + itemData->item = hi; + itemData->bookmarkManagerUI.reset(this); + Elm_Object_Item* BookmarkView = elm_gengrid_item_append(m_gengrid, m_detail_item_class, itemData, nullptr, this); + m_map_bookmark_folder_views.insert(std::pair(hi->getAddress(),BookmarkView)); + elm_gengrid_item_selected_set(BookmarkView, EINA_FALSE); + setEmptyGengrid(false); +} + +void BookmarkManagerUI::addBookmarkItems(std::vector > items) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + for (auto it = items.begin(); it != items.end(); ++it) + { + addBookmarkItem(*it); + } + elm_object_part_content_set(b_mm_layout, "elm.swallow.grid",getContent()); + evas_object_show(getContent()); +} + +char* BookmarkManagerUI::_grid_text_get(void *data, Evas_Object *, const char *part) +{ + if ((data != nullptr) && (part != nullptr)) + { + BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part); + BookmarkFolderItemData *itemData = static_cast(data); + const char *part_name1 = "page_title"; + const char *part_name2 = "page_url"; + static const int part_name1_len = strlen(part_name1); + static const int part_name2_len = strlen(part_name2); + ItemData * id = static_cast(data); + if (!strncmp(part_name1, part, part_name1_len) && !itemData->item->getTittle().empty()) + { + return strdup(itemData->item->getTittle().c_str()); + } + if (!strncmp(part_name2, part, part_name2_len) && !itemData->item->getAddress().empty()) + { + return strdup(itemData->item->getAddress().c_str()); + } + } + return strdup(""); +} + +Evas_Object * BookmarkManagerUI::_grid_content_get(void *data, Evas_Object *obj, const char *part) +{ + if ((data != nullptr) && (obj != nullptr) && (part != nullptr)) + { + BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part); + BookmarkFolderItemData *itemData = static_cast(data); + const char *part_name1 = "elm.thumbnail"; + const char *part_name2 = "elm.thumbButton"; + static const int part_name1_len = strlen(part_name1); + static const int part_name2_len = strlen(part_name2); + if (!strncmp(part_name1, part, part_name1_len)) + { + Evas_Object * thumb = nullptr; + std::shared_ptr image = itemData->item->getThumbnail(); + if (image) + { + thumb = tizen_browser::tools::EflTools::getEvasImage(image, itemData->bookmarkManagerUI->m_parent); + } + return thumb; + } + else if (!strncmp(part_name2, part, part_name2_len)) + { + Evas_Object *thumbButton = elm_button_add(obj); + if (thumbButton != nullptr) + { + elm_object_style_set(thumbButton, "thumbButton"); + evas_object_smart_callback_add(thumbButton, "clicked", tizen_browser::base_ui::BookmarkManagerUI::_thumbSelected, data); + } + return thumbButton; + } + } + return nullptr; +} + +char* BookmarkManagerUI::_grid_bookmark_text_get(void *data, Evas_Object *, const char *part) +{ + if ((data != nullptr) && (part != nullptr)) + { + BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part); + BookmarkItemData *itemData = static_cast(data); + const char *part_name1 = "page_title"; + const char *part_name2 = "page_url"; + static const int part_name1_len = strlen(part_name1); + static const int part_name2_len = strlen(part_name2); + if (!strncmp(part_name1, part, part_name1_len)) + { + return strdup(itemData->item->getTittle().c_str()); + } + else if (!strncmp(part_name2, part, part_name2_len)) + { + return strdup(itemData->item->getAddress().c_str()); + } + } + return strdup(""); +} + +Evas_Object * BookmarkManagerUI::_grid_bookmark_content_get(void *data, Evas_Object *obj, const char *part) +{ + if ((data != nullptr) && (obj != nullptr) && (part != nullptr)) + { + BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part); + BookmarkItemData *itemData = static_cast(data); + const char *part_name1 = "elm.thumbnail"; + const char *part_name2 = "elm.thumbButton"; + static const int part_name1_len = strlen(part_name1); + static const int part_name2_len = strlen(part_name2); + if (!strncmp(part_name1, part, part_name1_len)) + { + std::shared_ptr image = itemData->item->getThumbnail(); + if (image) + { + return tizen_browser::tools::EflTools::getEvasImage(image, itemData->bookmarkManagerUI->m_parent); + } + else + { + return nullptr; + } + } + else if (!strncmp(part_name2, part, part_name2_len)) + { + Evas_Object *thumbButton = elm_button_add(obj); + if (thumbButton != nullptr) + { + elm_object_style_set(thumbButton, "thumbButton"); + evas_object_smart_callback_add(thumbButton, "clicked", tizen_browser::base_ui::BookmarkManagerUI::_bookmark_thumbSelected, data); + } + return thumbButton; + } + } + return nullptr; +} + +void BookmarkManagerUI::_itemSelected(void * data, Evas_Object *, void * event_info) +{ + (void)data; + (void)event_info; +#if 0 + if ((data != nullptr) && (event_info != nullptr)) + { + Elm_Object_Item * selected = static_cast(event_info); + BookmarkManagerUI * self = static_cast(data); + HistoryItemData * itemData = static_cast(elm_object_item_data_get(selected)); + if (itemData != nullptr) + { + self->bookmarkClicked(itemData->item); + } + } +#endif +} + +void BookmarkManagerUI::_thumbSelected(void * data, Evas_Object *, void *) +{ + if (data != nullptr) + { + BookmarkFolderItemData * itemData = reinterpret_cast(data); + BROWSER_LOGD("Folder ID: %d" , itemData->item->getId()); + itemData->bookmarkManagerUI->set_folder(itemData->item->getTittle().c_str()); + itemData->bookmarkManagerUI->bookmarkFolderClicked(itemData->item->getId()); + } +} + + +void BookmarkManagerUI::_bookmark_thumbSelected(void * data, Evas_Object *, void *) +{ + (void)data; +#if 0 + if (data != nullptr) + { + HistoryItemData * itemData = reinterpret_cast(data); + itemData->bookmarkManagerUI->bookmarkClicked(itemData->item); + } +#endif +} + +void BookmarkManagerUI::clearItems() +{ + hide(); + BROWSER_LOGD("Deleting all items from gengrid"); + elm_gengrid_clear(m_gengrid); + elm_genlist_clear(m_genList); + m_map_bookmark_folder_views.clear(); + elm_theme_extension_del(nullptr, edjFilePath.c_str()); + elm_theme_full_flush(); + elm_cache_all_flush(); +} + + +void BookmarkManagerUI::updateGengrid() +{ + elm_genlist_clear(m_genList); + elm_gengrid_clear(m_gengrid); + m_map_bookmark_folder_views.clear(); +} + +void BookmarkManagerUI::focusItem(void*, Evas_Object*, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if (event_info != nullptr) + { + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,in", "over2"); + + // selected manually + elm_gengrid_item_selected_set(item, EINA_TRUE); + } +} + +void BookmarkManagerUI::unFocusItem(void*, Evas_Object*, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if (event_info != nullptr) + { + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,out", "over2"); + + // unselected manually + elm_gengrid_item_selected_set(item, EINA_FALSE); + } +} + +} +} diff --git a/services/BookmarkManagerUI/BookmarkManagerUI.h b/services/BookmarkManagerUI/BookmarkManagerUI.h new file mode 100644 index 0000000..419f508 --- /dev/null +++ b/services/BookmarkManagerUI/BookmarkManagerUI.h @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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 BOOKMARKMANAGERUI_H +#define BOOKMARKMANAGERUI_H + +#include +#include + +#include "AbstractUIComponent.h" +#include "AbstractService.h" +#include "ServiceFactory.h" +#include "service_macros.h" +#include "services/HistoryService/HistoryItem.h" +#include "BookmarkItem.h" +#include "AddNewFolderPopup.h" + +namespace tizen_browser{ +namespace base_ui{ + +class BROWSER_EXPORT BookmarkManagerUI + : public tizen_browser::interfaces::AbstractUIComponent + , public tizen_browser::core::AbstractService +{ +public: + BookmarkManagerUI(); + ~BookmarkManagerUI(); + void show(Evas_Object *main_layout); + Evas_Object *getContent(); + Evas_Object *getGenList(); + void showTopContent(); + virtual std::string getName(); + void addBookmarkFolderItem(std::shared_ptr); + void addBookmarkFolderItems(std::vector >); + void addBookmarkItem(std::shared_ptr); + void addBookmarkItems(std::vector >); + void hide(); + void clearItems(); + void set_folder(const std::string &name) {m_folder = name;}; + void updateGengrid(); + void newFolderPopup(); + Evas_Object* createNoHistoryLabel(); + void setEmptyGengrid(bool setEmpty); + + boost::signals2::signal closeBookmarkManagerClicked; + boost::signals2::signal addNewFolderClicked; + boost::signals2::signal saveFolderClicked; + boost::signals2::signal bookmarkFolderClicked; + +private: + static char* _grid_text_get(void *data, Evas_Object *obj, const char *part); + static Evas_Object * _grid_content_get(void *data, Evas_Object *obj, const char *part); + static char* _grid_bookmark_text_get(void *data, Evas_Object *obj, const char *part); + static Evas_Object * _grid_bookmark_content_get(void *data, Evas_Object *obj, const char *part); + + static void _itemSelected(void * data, Evas_Object * obj, void * event_info); + static void _thumbSelected(void * data, Evas_Object * obj, void * event_info); + static void _bookmark_thumbSelected(void * data, Evas_Object *, void *); + + void NewFolderCreate(Evas_Object * popup_content); + void CancelClicked(Evas_Object * popup_content); + + static Evas_Object* listItemContentGet(void *data, Evas_Object *obj, const char *part); + static char* listItemTextGet(void *data, Evas_Object *, const char *part); + + static void item_clicked_cb(void *, Evas_Object *, void *); + static void close_clicked_cb(void *data, Evas_Object *, void *); + static void new_folder_clicked_cb(void *data, Evas_Object *, void *); + +private: + std::string m_folderName; + Evas_Object *m_genList; + Evas_Object *popup_content; + std::shared_ptr m_popup; + Evas_Object *b_mm_layout; + Elm_Genlist_Item_Class *m_itemClass; + Evas_Object *m_gengrid; + Evas_Object *m_parent; + Elm_Gengrid_Item_Class * m_item_class; + Elm_Gengrid_Item_Class * m_detail_item_class; + std::map m_map_bookmark_folder_views; + std::string edjFilePath; + std::string m_folder; + bool m_gengridSetup; + + static void focusItem(void*, Evas_Object*, void* event_info); + static void unFocusItem(void*, Evas_Object*, void* event_info); +}; + +} +} + +#endif // BOOKMARKSUI_H diff --git a/services/BookmarkManagerUI/CMakeLists.txt b/services/BookmarkManagerUI/CMakeLists.txt new file mode 100644 index 0000000..7ff57b7 --- /dev/null +++ b/services/BookmarkManagerUI/CMakeLists.txt @@ -0,0 +1,40 @@ +project(BookmarkManagerUI) + +set(BookmarkManagerUI_SRCS + BookmarkManagerUI.cpp + AddNewFolderPopup.cpp + ) + +set(BookmarkManagerUI_HEADERS + BookmarkManagerUI.h + AddNewFolderPopup.h + ) + +include(Coreheaders) +include(EFLHelpers) + +include_directories(${CMAKE_SOURCE_DIR}/services/FavoriteService) + +add_library(${PROJECT_NAME} SHARED ${BookmarkManagerUI_SRCS}) + +if(TIZEN_BUILD) + target_link_libraries(${PROJECT_NAME} ${pkgs_LDFLAGS}) +endif(TIZEN_BUILD) + +install(TARGETS ${PROJECT_NAME} + LIBRARY DESTINATION services + ARCHIVE DESTINATION services/static) + +#please do not add edc/ directory +set(edcFiles + BookmarkManagerUI.edc + AddNewFolderPopup.edc + ) + +foreach(edec ${edcFiles}) + string(REPLACE ".edc" ".edj" target_name ${edec}) + EDJ_TARGET(${target_name} + ${CMAKE_CURRENT_SOURCE_DIR}/edc/${edec} + ${CMAKE_CURRENT_BINARY_DIR}) +endforeach(edec) + diff --git a/services/BookmarkManagerUI/edc/AddNewFolderPopup.edc b/services/BookmarkManagerUI/edc/AddNewFolderPopup.edc new file mode 100644 index 0000000..3ae44b9 --- /dev/null +++ b/services/BookmarkManagerUI/edc/AddNewFolderPopup.edc @@ -0,0 +1,198 @@ +#define POPUP_EDITFIELD_LAYOUT_MINMAX_HEIGHT_INC 40 +#define POPUP_CONTENT_DEFAULT_PADDING_LEFT_MIN_INC 65 +#define POPUP_CONTENT_DEFAULT_PADDING_RIGHT_MIN_INC 65 + +collections { + +group { name: "elm/entry/selection/browser_entry"; + parts { + part { name: "bg"; + scale:1; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 255 255 255 255; + } + } + } +} +group { name: "elm/entry/cursor/browser_entry"; + parts { + part { name: "bg"; + scale:1; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 22 120 237 255; + min: 2 36; + max: 2 36; + visible: 0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "bg"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + } + } +} +group { + name: "popup_input_text"; + parts { + part { + name: "elm.text.message"; + type: TEXT; + scale: 1; + description { + state: "default" 0.0; + min: 0 0 ; + max: 670 80 ; + align: 0.0 0.5; + rel1 { + relative: 0.0 0.0; offset: 65 0; + } + rel2 { + relative: 1.0 1.0; + } + color: 0 0 0 255; + text + { text: "Add a New Folder?"; + font: "Sans,Edje-Vera"; + size: 34; + min: 0 1; + align: 0.0 0.5; + } + } + } + part { + name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 0 POPUP_EDITFIELD_LAYOUT_MINMAX_HEIGHT_INC; + max: -1 POPUP_EDITFIELD_LAYOUT_MINMAX_HEIGHT_INC; + align: 0.0 0.5; + min: 0 0 ; + max: 540 100 ; + rel1 { + relative: 0.0 1.0 ; + to: "elm.text.message"; + } + rel2 { + relative: 1.0 1.0; + } + } + } + } + } + group { + name: "elm/entry/base-single/uri_entry_popup"; + styles { + style { + name: "browser-entry-uri-style-unselected"; + base: "font=Sans:style=SVD_Medium font_size="34" wrap=none color=#515151"; + } + style { + name: "browser-entry-uri-style-selected"; + base: "font=Sans:style=SVD_Medium font_size="34" wrap=none color=#dddddd"; + } + } + data { + item: focus_highlight "off"; + } + parts { + + part { name: "bg"; + scale:1; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 255 255 255 255; + } + } + + part { + name: "elm.guide"; + scale:1; + type: TEXTBLOCK; + mouse_events: 0; + description { state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + align: 0.0 0.0; + text { + style: "browser-entry-uri-style-unselected"; + min: 0 1; + } + } + description { state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "label.text.clip"; + scale:1; + type: RECT; + description { + state: "default" 0.0; + } + } + part { + name: "elm.text"; + scale:1; + multiline: 0; + entry_mode: EDITABLE; + select_mode: DEFAULT; + cursor_mode: BEFORE; + type: TEXTBLOCK; + clip_to: "label.text.clip"; + source: "elm/entry/selection/browser_entry"; + source4: "elm/entry/cursor/browser_entry"; + description { state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + align: 0.0 0.0; + text { + style: "browser-entry-uri-style-unselected"; + min: 0 1; + } + } + } + } + programs { + program { name: "focus"; + signal: "load"; + source: ""; + action: FOCUS_SET; + target: "elm.text"; + } + program { name: "gdisabled"; + signal: "elm,guide,disabled"; + source: "elm"; + action: STATE_SET "hidden" 0.0; + target: "elm.guide"; + } + program { name: "genabled"; + signal: "elm,guide,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.guide"; + } + } +}//group +} diff --git a/services/BookmarkManagerUI/edc/BookmarkManagerUI.edc b/services/BookmarkManagerUI/edc/BookmarkManagerUI.edc new file mode 100644 index 0000000..6b29ccb --- /dev/null +++ b/services/BookmarkManagerUI/edc/BookmarkManagerUI.edc @@ -0,0 +1,1118 @@ +#define RESOURCE_IMAGE_LOSSY( FILE_NAME ) \ + group { \ + name: FILE_NAME; \ + images.image: FILE_NAME LOSSY 100; \ + parts { \ + part { name: "image"; \ + description { \ + state: "default" 0.0; \ + image.normal: FILE_NAME; \ + aspect: 1 1; \ + aspect_preference: BOTH; \ + } \ + } \ + } \ + } + +collections { + +RESOURCE_IMAGE_LOSSY("ic_more_exit_nor.png") +RESOURCE_IMAGE_LOSSY("btn_bar_new_nor.png") +RESOURCE_IMAGE_LOSSY("btn_bar_new_foc.png") +RESOURCE_IMAGE_LOSSY("ic_thumbnail_folder.png") +RESOURCE_IMAGE_LOSSY("ic_thumbnail_folder_all.png") +RESOURCE_IMAGE_LOSSY("ic_thumbnail_folder_mark.png") + +#define WIDTH 1920 +#define HEIGHT 181 +#define ITEM_WIDTH 1200 + + group { + name: "elm/genlist/item/topContent/default"; + min: WIDTH HEIGHT; + max: WIDTH HEIGHT; + images { + image: "ico_delete.png" COMP; + image: "ic_add_bookmark" COMP; + image: "thumbnail.png" COMP; + image: "btn_bar_stop_nor.png" COMP; + } + data.item: "texts" "webpage_title webpage_url folder_text"; + data.item: "contents" "favicon star_click close_click new_folder_click"; + color_classes{ + color_class{ + name: "defaultBgColor"; + color: 18 22 34 255; + } + color_class{ + name: "focusBgColor"; + color: 69 143 255 255; + } + color_class{ + name: "highlightBgColor"; + color: 69 143 255 102; + } + color_class{ + name: "imageHighlight"; + color: 255 255 255 102; + } + color_class{ + name: "focusDelBgColor"; + color: 96 114 146 255; + } + color_class{ + name: "titleTextColor"; + color: 74 74 74 255; + } + color_class{ + name: "focusTextColor"; + color: 255 255 255 255; + } + color_class{ + name: "highlightTextColor"; + color: 255 255 255 51; + } + color_class{ + name: "urlTextColor"; + color: 116 116 116 204; + } + color_class{ + name: "transparent"; + color: 0 0 0 0; + } + } + parts { + part { + name: "bg_rect"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + align: 0 0; + min: 1920 285; + max: 1920 285; + rel1 { relative: 0.0 0.0; offset: 0 0;} + } + } + part { + name: "action_bar_bg"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 1920 104; + max: 1920 104; + align: 0 0; + rel1 { relative: 0.0 0.0;to: "bg_rect"; offset: 0 0;} + rel2 { relative: 1.0 1.0;to: "bg_rect";} + color : 255 255 255 255; + } + } + part { name: "action_bar_shadow"; + type: IMAGE; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + fixed: 0 0; + min: 1920 5; + max: 1920 5; + image.normal: "web_shadow.png"; + rel1 { relative: 0.0 1.0; to: "action_bar_bg"; } + rel2 { relative: 1.0 1.0; } + } + } + part { + name: "new_folder_bg"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "action_bar_bg"; offset: 10 0;} + rel2 { relative: 1.0 1.0; to: "action_bar_bg";} + color_class: transparent; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusDelBgColor; + visible: 1; + } + } + part { + name: "new_folder_icon"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "new_folder_bg";} + rel2 { relative: 1.0 1.0; to: "new_folder_bg";} + image.normal: "btn_bar_new_nor.png"; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { state: "focus" 0.0; + inherit: "highlight" 0.0; + image.normal: btn_bar_new_foc.png; + } + } + part { + name: "new_folder_over"; + scale:1; + type: RECT; + mouse_events :1; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "new_folder_bg";} + rel2 { relative: 1.0 1.0; to: "new_folder_bg";} + color_class: transparent; + } + } + part { + name: "new_folder_click"; + scale:1; + type: SWALLOW; + mouse_events :1; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "new_folder_over";} + rel2 { relative: 1.0 1.0; to: "new_folder_over";} + color_class: transparent; + } + } + part { + name: "title_text"; + scale: 1; + type: TEXT; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "action_bar_bg";} + rel2 { relative: 1.0 1.0;to: "action_bar_bg";} + color: 116 116 116 255; + text { + text: "Bookmark Manager"; + font: "Sans"; + size: 42; + align: 0.5 0.5; + } + } + } + part { + name: "close_bg"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0.5; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "action_bar_bg"; offset: 1828 0;} + rel2 { relative: 1.0 1.0; to: "action_bar_bg";} + color_class: transparent; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusDelBgColor; + visible: 1; + } + } + part { + name: "close_icon"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "close_bg";} + rel2 { relative: 1.0 1.0; to: "close_bg";} + image.normal: "btn_bar_stop_nor.png"; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { state: "focus" 0.0; + inherit: "highlight" 0.0; + } + } + part { + name: "close_over"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "close_bg";} + rel2 { relative: 1.0 1.0; to: "close_bg";} + color_class: transparent; + } + } + part { + name: "close_click"; + scale:1; + mouse_events: 1; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "close_over";} + rel2 { relative: 1.0 1.0; to: "close_over";} + color_class: transparent; + } + } + + part { + name: "folder_bg"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0.0; + min: 1920 181; + max: 1920 181; + rel1 { relative: 0.0 1.0; to: "action_bar_bg";} + rel2 { relative: 1.0 1.0; } + color_class: transparent; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusDelBgColor; + visible: 1; + } + } + part { + name: "folder_text"; + scale: 1; + type: TEXT; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "folder_bg"; offset : 62 104; } + rel2 { relative: 1.0 1.0;to: "folder_bg";} + color: 116 116 116 255; + text { + text: "Bookmark"; + font: "Sans"; + size: 34; + align: 0.0 0.0; + } + } + } + } + programs{ + program { + name: "mouse_in_close_click"; + signal: "mouse,in"; + source: "close_click"; + script { + emit("mouse_in_close_click", ""); + } + } + program { + name: "mouse_out_close_click"; + signal: "mouse,out"; + source: "close_click"; + script { + emit("mouse_out_close_click", ""); + } + } + program { + name: "mouse_in_new_folder_click"; + signal: "mouse,in"; + source: "new_folder_*"; + script { + emit("mouse_in_new_folder_click", ""); + } + } + program { + name: "mouse_out_new_folder_click"; + signal: "mouse,out"; + source: "new_folder_*"; + script { + emit("mouse_out_new_folder_click", ""); + } + } + program { + name: "mouse_in_close"; + signal: "mouse_in_close_click"; + source: ""; + action: STATE_SET "highlight" 0.0; + target: "close_over"; + target: "close_bg"; + target: "close_icon"; + } + program { + name: "mouse_out_close"; + signal: "mouse_out_close_click"; + source: ""; + action: STATE_SET "default" 0.0; + target: "close_over"; + target: "close_bg"; + target: "close_icon"; + } + program { + name: "mouse_in_new_folder"; + signal: "mouse_in_new_folder_click"; + source: ""; + action: STATE_SET "highlight" 0.0; + target: "new_folder_over"; + target: "new_folder_bg"; + target: "new_folder_icon"; + } + program { + name: "mouse_out_new_folder"; + signal: "mouse_out_new_folder_click"; + source: ""; + action: STATE_SET "default" 0.0; + target: "new_folder_over"; + target: "new_folder_bg"; + target: "new_folder_icon"; + } + + } + } + + group{ + name: "elm/button/base/hidden_button"; + parts{ + part{ + name: "button"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + color: 0 0 0 0; + } + } + part{ + name: "over"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "button";} + rel2 { relative: 1.0 1.0;to: "button";} + color: 0 0 0 0; + } + } + } + programs{ + program { + name: "mouse_click"; + signal: "mouse,clicked,1"; + source: "over"; + script { + emit("elm,action,click", ""); + } + } + } + } + +group { + name: "bookmarkmanager-layout"; + data { + item: "highlight_focus" "off"; + } + + images { + image: "web_shadow.png" COMP; + } + parts { + part { name: "window_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.0 0.0; + visible: 1; + min: 1920 1080; + max: 1920 1080; + rel1 { + relative: 0 0; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "genlist_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + min: 1920 285; + max: 1920 285; + color: 70 143 254 255; + rel1 { + relative: 0 0; to: "window_bg"; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "elm.swallow.genlist"; + type : SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 1920 285; + max: 1920 285; + align: 0.0 0.0; + fixed: 0 0; + rel1 { relative: 0.0 0.0; to: "genlist_bg";} + rel2 { relative: 1.0 1.0; to: "genlist_bg";} + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "gengrid_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + min: 1920 614; + max: 1920 614; + color: 255 255 255 255; + rel1 { + relative: 0 1; to: "genlist_bg"; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "elm.swallow.grid"; + type : SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 1920 795; + max: 1920 795; + align: 0.0 0.0; + fixed: 0 0; + rel1 { relative: 0.0 0.0; to: "gengrid_bg"; offset: 63 0;} + rel2 { relative: 1.0 1.0; to: "gengrid_bg";} + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "genlist2_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + min: 1920 181; + max: 1920 181; + color: 255 255 255 255; + rel1 { + relative: 0 1; to: "gengrid_bg"; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "elm.swallow.genlist2"; + type : SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 1920 149; + max: 1920 149; + align: 0.0 0.0; + fixed: 0 0; + rel1 { relative: 0.0 0.0; to: "genlist2_bg"; offset: 0 32;} + rel2 { relative: 1.0 1.0; to: "genlist2_bg";} + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "elm.swallow.empty"; + type: SWALLOW; + description { state: "default" 0.0; + align: 0.5 0.5; + rel1 { + relative: 0.5 0.5; + } + rel2 { + relative: 0.5 0.5; + } + } + } + } +} + +group { name: "elm/gengrid/base/back_ground"; + data { + item: "focus_highlight" "off"; + } + + parts { + part { name: "clipper"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 70 143 254 255; + rel1 { + relative: 0 0; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "background"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 255 255 255 255; + rel1 { + relative: 0 0; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + description { state: "default" 0.0; + rel1 { + relative: 0 0; + offset: 0 0; + } + rel2 { + relative: 1 1; + offset: 0 0; + } + } + } + part { name: "elm.swallow.empty"; + type: SWALLOW; + description { state: "default" 0.0; + align: 0.5 0.5; + rel1 { + relative: 0.5 0.5; + } + rel2 { + relative: 0.5 0.5; + } + } + } + } +} + +group { name: "elm/gengrid/item/grid_bm_item/default"; + data.item: "texts" "page_title page_url"; + data.item: "contents" "elm.thumbnail elm.thumbButton"; + images { + image: "web_frame_selected.png" COMP; + image: "ico_bg_round_shape_37x37.png" COMP; + } + parts { + part { name: "win_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 378 294; + max: 378 294; + visible: 0; + align: 0.0 0.0; + color: 231 231 231 255; + rel1.offset: -26 -26; + } + description { state: "selected"; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 378 212; + max: 378 212; + visible: 1; + align: 0.0 0.0; + color : 97 109 124 255; + rel1 { + relative: 0.0 0.0; to: "win_bg"; + } + rel2 { + relative: 1.0 1.0; + } + + } + description { state: "selected"; + inherit: "default" 0.0; + } + } + + part { name: "folder_image"; + type: IMAGE; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0.5 0.5; + fixed: 0 0; + min: 140 140; + max: 140 140; + image.normal: "ic_thumbnail_folder.png"; + rel1 { relative: 0.0 0.0; to: "bg"; } + rel2 { relative: 1.0 1.0; to: "bg"; } + } + } + + part { name: "elm.thumbnail"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 1 0; + align: 0.0 0.0; + min: 378 212; + max: 378 212; + rel1 { + relative: 0.0 0.0; to: "bg"; + } + rel2 { + relative: 1.0 1.0; to: "bg"; + } + } + description { state: "selected"; + inherit: "default" 0.0; + } + } + + part { name: "focus_highlight"; + type: IMAGE; + description { state: "default" 0.0; + + rel1 { + to: "elm.thumbnail"; + relative: 0.0 0.0; + } + rel2 { + to: "elm.thumbnail"; + relative: 1.0 1.0; + } + image.normal: "web_frame_selected.png"; + image.border: 8 8 8 0; + image.border_scale: 1; + image.middle: NONE; + visible: 0; + } + description { state: "selected"; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "background"; + type: RECT; + description { state: "default" 0.0; + min: 378 82; + max: 378 82; + align: 0.0 0.0; + color: 86 98 113 255; + rel1 { + to: "elm.thumbnail"; + relative: 0.0 1.0; + } + rel2 { + relative: 1.0 1.0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 0 119 246 255; + } + } + + part { name: "page_title"; + type: TEXT; + description { state: "default" 0.0; + min: 342 54; + max: 342 54; + align: 0.0 0.5; + rel1 { + to: "background"; + relative: 0.0 0.0; + offset: 18 0; + } + rel2 { + to: "background"; + relative: 1.0 1.0; + } + color: 255 255 255 255; + text { + text: "Web page title"; + font: "Sans"; + size: 28; + align: 0 0.5; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + //color: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + + part { name: "elm.thumbButton"; + type: SWALLOW; + description { state: "default" 0.0; + rel1.to: "elm.thumbnail"; + rel2.to: "elm.thumbnail"; + } + } + + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "win_bg"; + rel2.to: "background"; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "background"; + rel2.to: "background"; + } + } + } + + programs{ + program { name: "mouse_in"; + signal: "mouse,in"; + source: "over2"; + action: STATE_SET "selected" 0.0; + target: "background"; + target: "focus_highlight"; + //target: "bg"; + } + program { name: "mouse_out"; + signal: "mouse,out"; + source: "over2"; + action: STATE_SET "default" 0.0; + target: "background"; + target: "focus_highlight"; + //target: "bg"; + } + } +} + +group { name: "elm/gengrid/item/grid_ds_item/default"; + data.item: "texts" "page_title page_url"; + data.item: "contents" "elm.thumbnail elm.thumbButton"; + images { + image: "web_frame_selected.png" COMP; + image: "ico_bg_round_shape_37x37.png" COMP; + } + parts { + part { name: "bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 378 294; + max: 378 294; + visible: 1; + color: 231 231 231 255; + rel1.offset: -26 -26; + } + description { state: "selected"; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "elm.thumbnail"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 1 0; + align: 0.0 0.0; + color : 231 231 231 255; + min: 378 198; + max: 378 198; + rel1 { + relative: 0.0 0.0; to: "bg"; + } + rel2 { + relative: 1.0 1.0; to: "bg"; + } + } + description { state: "selected"; + inherit: "default" 0.0; + } + } + + part { name: "focus_highlight"; + type: IMAGE; + description { state: "default" 0.0; + rel1 { + to: "elm.thumbnail"; + relative: 0.0 0.0; + } + rel2 { + to: "elm.thumbnail"; + relative: 1.0 1.0; + } + image.normal: "web_frame_selected.png"; + image.border: 8 8 8 0; + image.border_scale: 1; + image.middle: NONE; + visible: 0; + } + description { state: "selected"; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "background"; + type: RECT; + description { state: "default" 0.0; + min: 378 96; + max: 378 96; + align: 0.0 0.0; + color: 231 231 231 255; + rel1 { + to: "elm.thumbnail"; + relative: 0.0 1.0; + } + rel2 { + relative: 1.0 1.0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "page_title"; + type: TEXT; + description { state: "default" 0.0; + min: 300 48; + max: 300 48; + align: 0.0 0.5; + rel1 { + to: "background"; + relative: 0.0 0.0; + offset: 17 0; + } + rel2 { + to: "background"; + relative: 1.0 1.0; + } + color: 51 51 51 255; + text { + text: "Web page title"; + font: "Sans"; + size: 27; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + //color: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + + part { name: "page_url"; + type: TEXT; + description { state: "default" 0.0; + min: 300 48; + max: 300 48; + align: 0 0.5; + rel1 { + to: "page_title"; + relative: 0.0 1.0; + } + rel2 { + to: "page_title"; + relative: 1.0 1.0; + } + color: 153 153 153 255; + text { + text: "Web page url"; + font: "Sans"; + size: 24; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + //color: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + + part { name: "elm.thumbButton"; + type: SWALLOW; + description { state: "default" 0.0; + rel1.to: "elm.thumbnail"; + rel2.to: "elm.thumbnail"; + } + } + + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "bg"; + rel2.to: "background"; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "background"; + rel2.to: "background"; + } + } + } + + programs{ + program { name: "mouse_in"; + signal: "mouse,in"; + source: "over2"; + action: STATE_SET "selected" 0.0; + target: "background"; + target: "focus_highlight"; + target: "bg"; + } + program { name: "mouse_out"; + signal: "mouse,out"; + source: "over2"; + action: STATE_SET "default" 0.0; + target: "background"; + target: "focus_highlight"; + target: "bg"; + } + } + +} + +} diff --git a/services/BookmarkManagerUI/images/btn_bar_new_dis.png b/services/BookmarkManagerUI/images/btn_bar_new_dis.png new file mode 100644 index 0000000000000000000000000000000000000000..af49c5af52731fb146af572791cd28382e524afb GIT binary patch literal 2980 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 literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/btn_bar_stop_nor.png b/services/BookmarkManagerUI/images/btn_bar_stop_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..c5cdc11ca8ea537497a1a794d79d40362f8659a9 GIT binary patch literal 3255 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 PM;~=nZIv>mm#_a1)GRY* literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/ic_add_bookmark.png b/services/BookmarkManagerUI/images/ic_add_bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea3265455d6c20f2682df08e0690120fa1e3adb GIT binary patch literal 2036 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 literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/ic_more_desktopview_foc.png b/services/BookmarkManagerUI/images/ic_more_desktopview_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..21bcc68b5136282a2a51cfc0d5a9a0f79cf36103 GIT binary patch literal 4066 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 G%D(^(M#QiH literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/ic_more_exit_foc.png b/services/BookmarkManagerUI/images/ic_more_exit_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..779fc486324ba4350b68c6f8f9f49d1077f9f089 GIT binary patch literal 1558 zcmbVMZ%i9y7_T+xfM6IHTKS;IEj3eUd)GhL-i?m6y{qk@&;UZ6NI2R9E^xi}dW=HI z9E(Iz=Z6I(PLVHW8nz)i6&8^3r^}pyu#G6$KtC`yW&%ON!ZH?(Z=r=@$Ubb`qe216)FIlhMpcNK<0AXo@D7TF%yt^P zdIyUe{fxSh3G(%V2h^i#UknVidvc(NBglp*5Li$Yx{l;M^&I099i#~cUsPV!OIS!u zr!nfyI8GTU9f}$aT8t#MW`o6`F;WIJ#<3gLXtC(c7-d8dtrn?;Y2ItzuN zIy{DT_<|zs^DwcvEQlM$8lH$HtO7%eyim;Zb+Ha`)$k%8tl|BTwFraum$E)D-w=Ey zQl8D-l8nF}WxO_l=b#OJ33iwGR$QYaahpvGGNAM*iraLES*x?+HjN%JAXYev_5L5t z)F2skq&XgImY4~2U}U=0`e3njco-izF#*n+*^E<5njRL)rM=`){< zB>%7|4Yv*)Dtj+6&@zxLo0kSMRN=UJ3ornCvJBWWRKRX2gH%z+@a3;=6L}Zx(;qgc zo#m9aj?qUKZ*>j7`O`n;XKtp>+-+Z5yV%p7bbcxH_M!ZHdv~MQ5i9-ds&00^@;Bd& zi5qj&b6NchX}O{A7Qg1Q53gQ(*xY?LYjUvTgW(sa=Z+riCf^zjcYOJ$T$u+f3G z^;voON1t9kS&}&u`o5)$$kM#C=E74;%X=y=XdkY>JJwA*yRJks5i2LCvj*2#%(a$D0Kf^3O@zkPNPPS0uUsO|bVZfUtR!2QZ( z9Qa!?NjU;{{+feJ{!^K4mYo&bwm)9l`)e5^k{sz5Q!dAxI`XG>Q2Au9rQ*cDFX1^0 literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/ic_more_exit_nor.png b/services/BookmarkManagerUI/images/ic_more_exit_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..b6dcd889bc6efa4962b1f43b02b21f093e04a136 GIT binary patch literal 1604 zcmeAS@N?(olHy`uVBq!ia0vp^(?OVn4M{( zJaZG%Q-e|yQz{EjrrIztFsEgPM3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWv2L<~p`n7AnVzAE zshOFfj)IYap^?4;5Si&3npl~dSs9rtK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xx^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr> zm4GgVcpk{1iHq`zbF$JDTz5Q`N^fZsd*)yF1AWQ8NHOu6e}keGZP~V zQ%6fnR|{7YLqiL5V>1^QV@Go*b0Z5^b3>RJ*z{T$I-58*DVb5UwyNq$jCetr%t1q5W|m*f{` zkk2Xf$O6-{>>&nPlIHs5ftw?$;v=Fj^o_siF;=smON@8`6;S2w==UB{SwVoL4ooi-LIQ3->Ut_0t!Xu#@ z@r}C1GJh^T-Y$BUomqO$T2?cOxK%%LpC|RmzFGF=tYgec=Iq;LntH3aePWn|#eXsh zPd{+Pb>D#_Q)8}|9%Z}s6g@OJN^?Y+a?*0Dv@|MJ#JKq46hV9#ML{+CS^jYwk=Wh}_SNqr}`GwoF zEa5%v-~IHL+-KuwhMzre>^${##$Oh^5djXrtiW6G|G&rySzlMP4c~Ha|B(Q(~_ctdz#}%)*#F69spxPb|0|sNUYU84BRck=yx~Hq3%Q~loCIDqOQbYg% literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/ic_more_focusmode_foc.png b/services/BookmarkManagerUI/images/ic_more_focusmode_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..f5fdac8488ea3b34dadac6f9e03d71b2326fa922 GIT binary patch literal 2053 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 literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/ic_more_history_foc.png b/services/BookmarkManagerUI/images/ic_more_history_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..a397ea056b2ad8e5d6971886c1f9b8a449bfa982 GIT binary patch literal 2892 zcmbVOd0bOh7LK*WiXxpNBBix4KvhCkvX_8Jf`on31PzvuJRm~yViE`eglSquiUkZJ zS|nB}(uzg{0wxv^3q^tppdiZtMFPmkB4|MrbP_9_`J?S`X5M}8-Fxmk-*=XK?(e?L zpn&Zb<{y|tAP@_NH!Z~27nq)R&5ZB$r<&!)&Q?liNkhSCsf;5AARat03V<>MoERVk z;PB-8ngLe`WO+0{j3s6H`%$={0Ld}wAd>_lBN_s6bx#s;xN(3K8U@7gg;dzo)jAlI z&!fVacz?9N$P{Lp8ghsK;-ZLJF!smCQ-(ep^`Wv6b6Y#2?VCN zUTaIFA;7=g_(N?;m|O&)LI4SvAm$p^BieomY|PzX8!{;xy`cn(`Nl=z#M3}-f&dUo z88j-)_yx)1^C;VB1RR!x_aKw$Bsva*ArV~&G@6SCaT^g!q7yMo9Djr*c+d$rJPnUV zyO1y#I-cy|VdTMV^CXezbWb{I3Cj>lq#Pj^ShCAE+I@q?{Uw&-DF!%FP#gw=@kYDAK3RKV{tUHmzN6> zji%!<7_t`*?csv+Bzs};Xd>DZ_6E!Qe{zO0I)gG5$A1*d(v-0RO~ctkt z$B2zvV;nZFfk0NIGH4!QNj>95@)hO>N~$^j*K^Lj=9KZ>Sym zdFf)#4ZqVbmCl=Cy@#NBWt2~*g5Xm^yXA=Abx=chii_3kXu*}v4cFRy1`Z{~xDJp< zZ@XG9Jia<4nv~t%KeGGwOy9YYkrBvyUm!nxYb$aq5@LAE)J((wP52XpVhz3eWJdVD%gC;{-G$gWeWX>q3~FO)5b-io`*VSI#x4VDm90F9AV-A2ZJoz9{cucLFrK@x zW!|GbHXIecalR%bvHYC&#P)YW&(!hG8JwEKmFkJEpOIGa8pAtzmRbs?htlVG!hyWG zeq!?IJ>LDM_a5i@Uu1=T5*S8CsP zr_)EMJfF#Ox0cr${N`K)))#Y~@624=rz%TOAw!*umeme6wAarT5#VeqZFZRh*Fko5 z@=~=y5Z4i_bvnL9d0_J1^>ulI9cBr(o8%1fI;<}B@;eDz~){5RZYPb9}PjWD! z-Krd9m~}r&cd+q224xNhaU=Ewrd%ksy1jCqr0E`rK8qKwCSV0)wvtLqs^yNUhUcBT zG(VoifaT9|S`2Hy_pAd_On$6g_;2FFTD<&&0!VRm*f=9;!;3-q0xEkv%Tcyu)CMoC3ihtg%dQq@}X zzILXGWVhL-be`hfpZm)!_eRO#a`!Khvm1I!(i@J$Kl{g^ewEca_$Or-8l8L!^<7!V z%2KoQQU&R`$u&V!VX@xNs8N;ddR=2>RYZ+KlsevxKrrY1WKD7Ww>42uIGfq`)+G8w znfFDdUHLiRChVb`>yZBL!*x$Qz(?Dj<^)d_{?p2wIP2(tQy4r3ylCstCDxeDTOpWL zexjzmbO%j)WSPZe)~Q97u5sLUSlO8lbW5y?v|W^6T_a> z;$Y0$hoky|lBcRgdx5M1KIfqx9~;(VP9^n^>3v}w{ z-7E&~45(AR8|LKXcj~jdn$k8hy%vt_WGWSr8570Up6bKTI`VTEgNsq-iRa-UT|GYU zbYU#TT+wl5<`aW{L;8cKhP4C4gOR0LF*in8MlK!)6OMPNT`9xdGYWtIAapu)U&PI? zDt6MA)c{&ues^A4?!eX1ztz~EQpT>_f8EUWn&A0n8&t=94Vm&@I1&df^+VqZw;Yy&rS4!|j}ZdHw9J zm?O^<;O-;eXYaqT3e`D%H;CoM{}jQjZQI`R$yG}q_iOk4bgr#;qraqUs`BsIXq~=I zIWHMPMQG)jmFvUXo6IKc`$)d1w9=Q>$Qucf4|Pwfb@zKF9!kFU#GcFP*J#=^OSmdK z$BWUywg!qwDoU@2s}FOII3!Ef|9T~0=JQA9vO-oMkPx}PbyJ3#`ikB4Vna&AfyY(v z&8<4MSMYOk?ThZjN98s#@~ye>@Tb#BH6z4(i+TKCJ57L?~9Dm9#B7Bk3`LeGqTM$?Fef0}ATCr zYu*+&damfm`SRElyHB|M70`Jd$0{2sX)TqSvEZzQT6#^^olEi&_>?RG3XC| z-g%2(@Wbd?sr5(u-|tCh4xvsz{*hO_vcxj5D27UZ%1=e^=ay7^Cs0>Kl@&^s`~<G0q;Gm=F#z0BUUoIT%G!5%9SH8xqA26^KbuWav9y zl1f$&BcYIYCO`-o`aUS8lPiQO6mcQu2rQg~LZcygJOYg~$K%mv5DW^9L84SQ9*)M5 z%<&`)0rKI3s=SE;0!eN(+Yi1}8X0;F0K!N}q(mY?NU#W@CUfQzFA z06PjU5F4&D(70lbh!+O%gaU|~k?k*x0LV~Pr0=J|4|8(*gIFN`kSJBkkWuU~BpQK2 z^7-m{y|WerZruNb@t4+OkLWNi(v2$?Mu<47^$0Xv2di@T_m0$ts%S_qBA#kd*r7Bb zCxXuv0QNL8RP_ZBzzZPR(C|2ng*k;tq+8H&XtV_Zi>J}B6oL%_V?igN*E#+QYi^4s z5{PI53Wc>mqv_@ptPR$JNI>IlDR>lyKv~Dy3&a3hz~Qd@<*EFBz~cWFOQMRnY(OaT z5DG)rE5P-b5D%cRa+H!4m`sC1Mlx^1PodjVt0saszBdLO$eOeo4H)@J}UT za5SQ=Emjph-5iZ3+Tu_YERIUF#h9ZAC@S;=HsJrs8B!GtQe7PXRV?d6stQz#f0VvT z`D62N1*#n*Qf-Z;U*>{ApigD?G>S)*ayl!d(8E*b#G;c^y8{dcGrP~ozh>QmYsc7_ zy2WO;B|^_kQ>@!M3L#y)_vPr?exiG%qzqGH9CJOdFfTtfgB5#*XO~>xi)nxC)A42C z@GE83RF=4N_ggDw*@JH{4^DQp99fwjjCJv3u~;Cx1ZvI36TT;WL9H9rO)dU2<$obQ z)q!(vI7UR6kJfadJnge;^7Fr!ZM91Rh3C_GxtT+&Uz0mYevsApjD<>f z7_GVxE}|Y-?;qGDO>?yB9-}xO)n;F88sGnQQXp;A$I~ZFp56j{N82Njduee>%zI^_xlM%D2*0bs<$5jc zeVVZ4;TA3IzGn`rzIPNJvW+v$6>fiq$H%ONhaQ%`{ui1IWmedN8*;>zmtR1KVg9FS z@zQyt)tA?`kadJ3gB*-gg>$q*-%smDxWBT%d?MazO8pB z+IIZn^X<)AtAWs+`zi9)=&y3KQ`c@5+`iAX5N0Jk%bi!;U1qg;Ho7*PoBhLCxg3 zN0K0nh0h`u9VW|!rCn14JHQ-K4EbaVEOt}P+!(k~W+Wflrl=_R5f<=lHzk(veDz&E)X&HsHD86McrWsQGsR<4Sh2pQZ1T-Ne}>Ywd%J z`UjY$r#@M^pStake0r%p_3^$pq|$uIz~Pk|#6;T}>uv`llg)jRdrI_0+@@0baer`W z+BLreiaGp5+m+d#nBy*#vKjfUj}#Rx+b&;88JpU_H$B^!nHli(s`AXfU+bX_8jAX| zg~V(_Yt+-)>wYmuft~qY&Zx%P0+Tlnv>DwZBbQ0rD;p;3=9bvA!yy-J8IC_9f^YAb zKD0IeF-D`J!Z~Vnv*JQQV%-ak9C(uttcdw5wvbcqS1^0p&(Mbba_q)6%h!kVnlmyo zZoIY2<9WL1rCO!Ods}uolpR0Yu@zs{q~py3$WohjPZE~O)~uC-NbsvMxZVVo&z-dw zqZ(q9@ExM&lY*J@uIe}1nBpY8(BrNA`CfhP;gz?M#^GX%35RWsKfhjfjqfntdK)P1 zH8EP{&$`BUu1?@g&-glx54)z{yIz!*-Bx3j_gO-)b!6?-(fH5Zlw(^I8J+x`vQ~C_ zwI5o{Y2_n#7mtkh#IPrVNz0qpsx15ZiWt`-9=#as8G5C?x7l;7wL1O{c{D(VL#yXUFUpnk zjlkryrR`OI2E{!iqw|%o?Zf#>U5fl!4y;rtX{n9PmWNEI9R3!#d)MuNOmq2sWtBm4 z(Og&O+Y5c9heli(FxX4jdswnq2h~~d;G6P`=@~&@ zNBE4^)Lk$$r{BENmQ&h4U$itB*tG-f?su?usED;?vj4#CZAQDn^Nkm`D>R`a70-Dt z$;wx2je|PpqaOWt5x-(5~uArd)pb0kplxRETLQ

;4pTXqLd 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 literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/ic_more_mobileview_nor.png b/services/BookmarkManagerUI/images/ic_more_mobileview_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..91aebfe29e531e5f9607b9b6995b2e94bb628e17 GIT binary patch literal 4205 zcmbVQXIN8Pv!;khvjmZ@Az(vD0g{kNkrIj$PyquRS_q+&4g{o#g7juXKt!Y{pb-!? zfD{!%3+*W7DAIBe1q2bL2*M4PbMKGye9ygiKYOpWXV%R7&YGFEf9!;l*5*>;3gQ9+ z0#cS1rl48Ri433z(c71#51OlO00DhH^+7l| z7K){q5Pf_t!e~U>Fl#$Pm_GsK2{JSQ>M_xLfIuPx4`c=gkmzWpKIjK7n*YA3hJb)S zOc?(9pr1iGU{3-~$TT7l4%XHrKw&T-0s)5Uz!3Lck%~U^2}c0z;utn;2SJntTgQdMJs3XKIq@ zs=pCTiF5+Zm%{KRlYpCucn@+ALm$MC^yd}=DOl`3z$E&wMDbGwVd5ze7#Io(4BXt; z4{JK(H1WT~_*ZMXT_}YJIZdRKgJ=YPJ-k$ZJM(k*pNTdN`O%$Pi-Anhs-mje;qA%Xa`rf&*u{yFk<6@7)$!^J)8?Av7GC?9W5kK%2y)gr1u1nY$}170 zqH*x;!HOYrNQD78H>g2(Ls`lOIBx5`l9CMe@fda9*%V$1!O;NPJ^lL9&bRXw8*^F) z{%g7Oc%C>fidgoi3M-nkkm9X)c2EAgaPo^b$12j2;@qwGF=zJB>pGa%<}G=2P6vJ4 zG?CXoSn(tosn{Y{+w1b&4dUAf3M_c@r4jC?Wk7KDy%7+gN`18bl+m{7%H{e=1SmQ@+Mb5-YRk$ zPjxXz)(k8wip!Cfop{r;dhzQjyzUfzHP&a&!Rrdw->0f*Lf#MVO7zg(VMB1mVF+j0^=*V)V=dU z9IxoQ>W-!Py}^HiNPHT`BkEJ^{Gzv&Y`#7Z7XKNTP^L#IoQLt6X9o>^q#9qFv2wk_ zcXYJcV72OP8|$7njT#D}#Sc#EhNu#1U{Ar%cQ5*#wQw%N?BhvuY~NN8Inut56kg;f z-vcU7V4L@-JTqv=3+t-I5%j7RBy-W_Xrs|urpZ}4>>^5XfEF^#Y z{FHUnWvnz^xopO4dWZ#&FB|g0a07vhOhftVC+3!tJ0EoHio()}O_)um)~*Kbs8YWu zFC)og(r#W<`%1r`-Hhn&Wz;9aK93vTYv-G;D)sQPXI%-~is&;+lGEYYTcA0D@^m$` zfj`^7_c2pz-_3$XkfzkMdG-36tqjqNMO#m6#229vr*;^San}s@X@%Bd0Jt&T8-gJ+ zZV<2TozdUTopBpIgFzqV(^68uw%!hdrt4{VZq3}KM+S|6a*{3#w!J?t+n)uy)NP+@ zgow?xdZ@?k>Oe<|+AeR1SlO<*jH^oy96b`tUG+YENlKD4x!`J3{D*uOyYvs?Ap2@9 zk4*oZR(&JSvåVi8Fk3zl%xu>xL1@oxdE-SWG$8F*Q>W@6viF{00S*N6VpKxB? z?r=?F$e$Y>_Aq(@cuvN13)i@Dt>jsklvKRfJs5-XAyrMV*8reJpT(WBdlc#%7d_h@ zV->k0Pf#0Xt-W3YXtuX+|GuZJtZa$E)rpClO=>>Ti9tHmA1k9^xUoUrr3DefV8p(e zTSafUOGY=UG6eNKO39z}nw-B&EGrpmxi)7XguA%9 z;z}^oaJv7(`S`o^^ej}(LC-rKK=%#xusYoV9TRP* z!@K<=-YRFe*qNw&y70zEhe}em-Tf%}V`D@4WOci8*+eK-3ia{!s{eb}Y>60=$ojwf zL^x+Z0A$bF^`6tY_Z%zs>Vx8!Hb8jsgjm9np3{MN`MS3YyL%?nPPl{`9n$Oli&H&V z<1jjM`ug6f$tm$?!Nor6d-hj2zXN16D2xfsg^Jl71$yRHl>{|}sSruj$`i60__VT< zlC+7*S5+Tm26p4D{nV55W-FbrImXni6HSZ}pPoH!oI*g1!Go$Z*c|H)`0!O&@wHca zWv;9>Bs>t^{5AhN`;svkH+-uYo5kkt2YrQcmBaM%OJQ#H5*-#^^{iq|eJ6BxEUfZ9 zzUOszcJ=_kX|1z6b#Tx)Pegt}(d2veH_g<+r8sAmt%?t-<`#3S68ukQgfSvPt|um* zkhW!+544LZhuU0!9by041DpqT$aJsEJq~0|ovdd=Q%DtQM;cC!jenkVv@hNI#g@dy z^usCSk_zX@q6XO`Lz?2m1K3ahZ^D2|h>@K?)w|xwg zjQ(2<=dJ!!5SMYU-jZ-)r@D>vI;yU#KZSLB_3)L*Gt(i`rM7pW)WEh~L$Zl3tnhO` zkjeyuEz5`XQD`aS#HO#MN0u}%VP@`nVehd0T&mqNn))m|v#qHsA6i=WJIwWinrX%& z2_1%4waYCkhBEy68Ho~fc5vm;otm1Ov&LUNKHjg>AUw0b^hex@k+MD<&`xW)3)R3L3O+I38C^RMlL<&E#NLad8e0Zs(%Gb%rKE^tBYsCaP3I%;D zQjaSMwN(exQ_6MdLn>CwM@t+1zGoMv?DrW=$Rtt&sh$*X@o)IP48aHeYb*DAzV`Nq33cJKj7#LC4L5^}-tHZ!O&sjvCob&{} z!C`FT*frQKeO1qE+v6XfekPfi>-X(Tyo6NRRmVuqfV7We_UpV!nc{uxa#}A#(=8$r zCU`3=z~W}VsV|8Vjf*dy#LQegPQ^b9#J{=H(ki1;D;R2`99ylytC&@Q2ek`*Q=09a z3y)U0UBt*Rhjtko1X!v*7n&9OYixg^%(s$~{a}qp%;I_Y08g>&dI{>y6ZdCtiLBJ5 zzE=R;t#SjU$`cwYHnCDKbB_A=?SSwb_hSb%41S6a&p*%7g;>TFqw{YVsT{T2 z;$G7=lio&lk)C>>pj?D3MwcO9GmjE7Uq`X0GvrJ*!C7K=G$M9M&o|=7R?0z*Eccg?9K0s8rVoM0wt{NS@0Hp z{MzOA3Kc)cnFY;`M{|cJy;Wq}Y4(V6^p4ZwQ00lwp1o%hBhR3Qtn6KK5f5em-Xro8 yU>v|l`2oitjDASt06zFX4F3m%o$(uDP=UC0a)>x0%4G8gfF;J-lx6IG{=WdHF?!Dc literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/ic_more_pointermode_foc.png b/services/BookmarkManagerUI/images/ic_more_pointermode_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..8785d75a32e56194cfad14a628c2d55bf920e36e GIT binary patch literal 3180 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 literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/ic_more_readermode_foc.png b/services/BookmarkManagerUI/images/ic_more_readermode_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..d257732fc053c20177ace08285da20d483e3a8f1 GIT binary patch literal 1943 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%0DrRk}1lz^~^m?n2h%Dr_fV`tEOTsZ!6`V9w zY(@F2zM_Zar$^n0#fWmt4ou8}MfiFHbhOEFK74$#_t8ZJ=8XDgs_lW^!9V!(5~nUu z@;2P>9L|<&*?TZdP`>xPq_k7$ab==TfRDanRguX2{i}?*BaTQOVL>SMIU_uFbsWmZ zu!#6jN4!7HlCL6=a-WESjeKR`B~84(2M=Ne-lJ2W*2>8T(yZV60j~NXQUkn0$C4jT z+$evj!T^Yi^@3D-dt5+PH)kIodhA`D)r5A-*maYZ#kW7fA99V?G(wEt_4biZdj`4D zQ|d&Ae`&L2%%!G l{a?cWOSdqekKD!2b=X+%5%rL~`_8`@TT2HEhM8B?zW}&QFVFx0 literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/ic_more_setting_nor.png b/services/BookmarkManagerUI/images/ic_more_setting_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..284d4237339ebbe4cc5aa8c24486c5d01a726fba GIT binary patch literal 4936 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 literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/ic_more_share_foc.png b/services/BookmarkManagerUI/images/ic_more_share_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..dadf09bd38e1a78fe7647a38af172a99a08caf5d GIT binary patch literal 2653 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\~q?AZkE8C<^8=}1$>cC9>Z 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 literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/ic_thumbnail_folder_all.png b/services/BookmarkManagerUI/images/ic_thumbnail_folder_all.png new file mode 100644 index 0000000000000000000000000000000000000000..c23e195c8a3d6587bc0f869c9b94ee4aedd56073 GIT binary patch literal 1378 zcmbVMUu@e%821=V)znUXK!Q$CS*|AjXo-DJ?AUIzE{UBjV(Cg6tr4B3xb`KnTHBd@ zN!-E^1U9s(NN8eJr3s|&r4L9G1MxC6Sg6D_)a_x?3IhQHgg~Ow9tJ|%UO4AZ`J=86 zoNV9k?!NE)efPWXd~$STU(fcP+X;f`N$r<2xS#Xiu5I{x{&H*&?)s3DLt}OU)l>%( zG2NboWXe>FFauS6=IB*8L=amGMmC3X=>w8xn?cpL33_H3dlSUauvb>KDTv5PSTw9C zb?4(xDbmoR)Hs)B(&Yp!8T)4)I5s@ocN!a7yV;pCq%+X9 zD~^WGqcG5M#@cO8Qp-XX@53>Rn6GcT(!T<=7 z5HHK2SR@`{1tkJHF*fq$Ie}**2^quy2Y|u}Ae>MHK?YoiRgyg0@l9DSQY{U3cn!?k z_DyW+DT$AtJ;>@k9gwQNh^@NiG?aMS+RO1Q2K9RNGhoKbp}v8QL$7e-uk+3Rj>H*GnG{ z)-MmV@Qrcs)p&6>{UbqaIh~SYS?}w$Z!h$G#`Nxee(qd%@2b}Ith`KQ8RE&iyXNvc zu0Dd>h5F1v>EsUmYH)VJ9O{XTB?*>igoi>08B#p9q8jAV45sK|H=d05Jd#8{&X$>J~5|o`f%uaD>40 zMW><>2BRbcR!zsEc2asiNm?WzXt�b}kDi@<2!|7P~Px942MKv^p^oaWFA!xCa47 zt$M;_Ax$_2xDk;pcrhuZQ<=Uxg4vRiG6RfRr-`B{109G3gjj6QY<8b(%Gye1ps&-I z)!M3YT2L?pwc^Euo~nm2+~Z7fH+LYnA(f3JjWAI~K?-49Uu;G(G7*;2sV^*p$sm!# z0v<=imx;wnk&*{NA|Y1*!(5qAF64-mLdb(Lo3Dr~7xK9>F(iZd5TxXb*&?A_!4oPJ z3Kb;cDLlT3n3Y5@J?e>TqT){bistl{C@KVU#f0P=kuV&A=4D64Na4xgw!R&Xp^K5F}Po*^5+sl?)b(*m9W&lC$OX zXQ@qfwddKS@noW+E)pIDURKc)lP& z7Fza4MZ%t-H+6opj1$j%qS|(WtzTB`PPp793F-s{(NT*#HMR}umsRkB6@h`wH%1u& z&3>|oz2C`|)f2*B7Pv|u(Ax{o4gBDxd;Am|+t=^JY_`X?w&T6|0T&B58~k^&fh7yQ zF70H~khhond6&+k#EcGDGN;bZnES9IdtW&m5{O3ZFrMCut&#>_FFF{F<-dQ`5ldum zw7b|xDg%8rUCrI=Hx6#@XgI@=1`gRrTI?sb*4^8by>>9}^S9(>kM@UDWz|G4-*c|w z$KG`crTXv*fXJd>f`QBRjo+{OD>hFtsn!a)9 zWRh={Hq`0gfA{Ep&A5L;UFqbnS8q1`b&?zi>7MW5f<_TD2R}2MrSl>gA^XlTYFivl zV{P*#!56lpcf;COj(}3vYOZ8?`?^mCE?;>Trm9svkh>1==(CzQUF#~7oYIbl+LqPh z5k$k2(HDOGU*M6Qf0j*@6f9Ef+TwHL+gvNR`SpjkAHc^B)+hab{_5%Q!bbeNVQ?k>N~ebPHi~;&9&j~&hA^mxgAWRBjRp#$<2{d zJ|O*_tnU4ep#A`7(=v5h$Ygh9&Zgm83|&>$;X38SE?q?`^V^)hN0S?P!_QOnYkfXy z&j~&nW2`z>n$x#tz{PGEF6uq>6Nx{_S#b|n^oAY@?qM!N&L-E8X!V$Ql-{Z}S;l;k zvuQP{q7rNMg7`!?d(&;@7E`T8={`8CzTNN8h4)PS{o(aku)J99YgKH&vF`i9A1{S6 zYhQY=U>vL8QQi*KU-&fg3DUmRXkm+R*}U5x*r&Zc`EiHiQROE=G(*5cD@KA^RY Qx_@1X%2c>X{_d`S0KGJi(f|Me literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/ico_bg_round_shape_37x37.png b/services/BookmarkManagerUI/images/ico_bg_round_shape_37x37.png new file mode 100644 index 0000000000000000000000000000000000000000..00182eda393bba8bd7548044060c54661dd2e1bd GIT binary patch literal 18109 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 literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/modal_dialogs_bg.png b/services/BookmarkManagerUI/images/modal_dialogs_bg.png new file mode 100644 index 0000000..e69de29 diff --git a/services/BookmarkManagerUI/images/modal_dialogs_title_bg.png b/services/BookmarkManagerUI/images/modal_dialogs_title_bg.png new file mode 100644 index 0000000..e69de29 diff --git a/services/BookmarkManagerUI/images/web_frame_selected.png b/services/BookmarkManagerUI/images/web_frame_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..4470ca4a328ef0d26bbe8a92764757a7a217b2a7 GIT binary patch literal 17687 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 SOF&k3)ON6OvCgyFvg_YNdqf}r literal 0 HcmV?d00001 diff --git a/services/BookmarkManagerUI/images/web_shadow.png b/services/BookmarkManagerUI/images/web_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..f9018b0a6e15ae5670b67d580b890d1950636066 GIT binary patch literal 17700 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 literal 0 HcmV?d00001 diff --git a/services/BookmarkService/BookmarkService.cpp b/services/BookmarkService/BookmarkService.cpp index 7e30362..2489359 100644 --- a/services/BookmarkService/BookmarkService.cpp +++ b/services/BookmarkService/BookmarkService.cpp @@ -190,7 +190,7 @@ int BookmarkService::getBookmarkId(const std::string & url) std::vector > BookmarkService::getBookmarks(int folder_id) { - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + BROWSER_LOGD("[%s:%d] folder_id = %d", __func__, __LINE__, folder_id); int *ids = nullptr; int ids_count = 0; int ret = bp_bookmark_adaptor_get_ids_p(&ids, &ids_count, -1, 0, folder_id, 0, -1, -1, BP_BOOKMARK_O_SEQUENCE, 0); @@ -200,15 +200,15 @@ std::vector > BookmarkService::getBookmarks(int fo } m_bookmarks.clear(); - BROWSER_LOGD("Bookmark items: %d", ids_count); for(int i = 0; i bookmark = std::make_shared(url, title, std::string(""),(int) bookmark_info.parent, ids[i]); std::shared_ptr bi = std::make_shared(); @@ -228,7 +228,6 @@ std::vector > BookmarkService::getBookmarks(int fo fav->imageData = (void*)malloc(bookmark_info.favicon_length); memcpy(fav->imageData, (void*)image_bytes, bookmark_info.favicon_length); bookmark->setFavicon(fav); - m_bookmarks.push_back(bookmark); } free(ids); diff --git a/services/BookmarkService/BookmarkService.h b/services/BookmarkService/BookmarkService.h index 75ed2f2..8ce4790 100644 --- a/services/BookmarkService/BookmarkService.h +++ b/services/BookmarkService/BookmarkService.h @@ -83,7 +83,7 @@ public: * * @return list of bookmark items, bookmark items in a folder & bookmark folders */ - std::vector > getBookmarks(int folder_id = 0); + std::vector > getBookmarks(int folder_id = -1); std::vector > getBookmarkFolders(); /** diff --git a/services/CMakeLists.txt b/services/CMakeLists.txt index 547901f..8a137c9 100644 --- a/services/CMakeLists.txt +++ b/services/CMakeLists.txt @@ -11,8 +11,7 @@ add_subdirectory(SimpleUI) #MERGE_ME #add_subdirectory(SettingsUI) add_subdirectory(SimpleURI) -#MERGE_ME -#add_subdirectory(BookmarkManagerUI) +add_subdirectory(BookmarkManagerUI) add_subdirectory(StorageService) add_subdirectory(HistoryService) add_subdirectory(PlatformInputManager) diff --git a/services/SimpleUI/CMakeLists.txt b/services/SimpleUI/CMakeLists.txt index 62578b1..6234cb8 100644 --- a/services/SimpleUI/CMakeLists.txt +++ b/services/SimpleUI/CMakeLists.txt @@ -43,8 +43,7 @@ include_directories(${CMAKE_SOURCE_DIR}/services/SimpleURI) include_directories(${CMAKE_SOURCE_DIR}/services/WebEngineService) include_directories(${CMAKE_SOURCE_DIR}/services/WebEngineService/src) include_directories(${CMAKE_SOURCE_DIR}/services/StorageService) -#MERGE_ME -#include_directories(${CMAKE_SOURCE_DIR}/services/BookmarkManagerUI) +include_directories(${CMAKE_SOURCE_DIR}/services/BookmarkManagerUI) include_directories(${CMAKE_SOURCE_DIR}/services/StorageService/Storage/include) include_directories(${CMAKE_SOURCE_DIR}/services/FavoriteService) include_directories(${CMAKE_SOURCE_DIR}/services/HistoryService) @@ -69,7 +68,7 @@ add_dependencies(${PROJECT_NAME} StorageService) add_dependencies(${PROJECT_NAME} HistoryService) #MERGE_ME #add_dependencies(${PROJECT_NAME} MoreMenuUI) -#add_dependencies(${PROJECT_NAME} BookmarkManagerUI) +add_dependencies(${PROJECT_NAME} BookmarkManagerUI) add_dependencies(${PROJECT_NAME} MainUI) #MERGE_ME #add_dependencies(${PROJECT_NAME} HistoryUI) @@ -87,8 +86,7 @@ target_link_libraries(${PROJECT_NAME} MainUI) #target_link_libraries(${PROJECT_NAME} HistoryUI) #target_link_libraries(${PROJECT_NAME} SettingsUI) target_link_libraries(${PROJECT_NAME} TabUI) -#MERGE_ME -#target_link_libraries(${PROJECT_NAME} BookmarkManagerUI) +target_link_libraries(${PROJECT_NAME} BookmarkManagerUI) target_link_libraries(${PROJECT_NAME} PlatformInputManager) target_link_libraries(${PROJECT_NAME} SessionStorage) target_link_libraries(${PROJECT_NAME} ${EFL_LDFLAGS}) diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index edf05bd..e585130 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -67,9 +67,7 @@ SimpleUI::SimpleUI() , m_moreMenuUI() #endif , m_tabUI() -#if MERGE_ME , m_bookmarkManagerUI() -#endif , m_mainUI() , m_initialised(false) , m_isHomePageActive(false) @@ -1155,7 +1153,6 @@ void SimpleUI::closeMoreMenu(const std::string& str) void SimpleUI::showBookmarkManagerMenu() { -#if MERGE_ME BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); if(!m_bookmarkManagerUI){ m_bookmarkManagerUI = @@ -1173,24 +1170,19 @@ void SimpleUI::showBookmarkManagerMenu() m_bookmarkManagerUI->addBookmarkFolderItems(getBookmarkFolders()); m_bookmarkManagerUI->showTopContent(); } -#endif } void SimpleUI::updateBookmakMangaerGenGrid(int folder_id) { -#if MERGE_ME m_bookmarkManagerUI->updateGengrid(); m_bookmarkManagerUI->addBookmarkItems(getBookmarks(folder_id)); m_bookmarkManagerUI->showTopContent(); -#endif } void SimpleUI::closeBookmarkManagerMenu(std::string& str) { -#if MERGE_ME BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); m_bookmarkManagerUI.reset(); -#endif } void SimpleUI::openLinkFromPopup(const std::string &uri) @@ -1412,12 +1404,10 @@ void SimpleUI::saveFolder(const char* title,int folder_id, int by_operator) if (id >= 0 ) { BROWSER_LOGD("[%s], Added New Folder", __func__); } -#if MERGE_ME if(m_bookmarkManagerUI) { m_bookmarkManagerUI->updateGengrid(); m_bookmarkManagerUI->addBookmarkFolderItems(getBookmarkFolders()); } -#endif } diff --git a/services/SimpleUI/SimpleUI.h b/services/SimpleUI/SimpleUI.h index ea7220c..a6c4acc 100644 --- a/services/SimpleUI/SimpleUI.h +++ b/services/SimpleUI/SimpleUI.h @@ -35,7 +35,6 @@ // components #include "AbstractWebEngine.h" #if MERGE_ME -#include "BookmarkManagerUI.h" #include "MoreMenuUI.h" #include "HistoryUI.h" #include "SettingsUI.h" @@ -44,9 +43,7 @@ #include "TabUI.h" #include "ButtonBar.h" #include "HistoryService.h" -#if MERGE_ME #include "BookmarkManagerUI.h" -#endif #include "SimpleURI.h" #include "SimpleScroller.h" #include "WebTitleBar.h" @@ -125,7 +122,7 @@ private: void tabClosed(const tizen_browser::basic_webengine::TabId& id); void bookmarkCheck(); - std::vector > getBookmarks(int folder_id = 0); + std::vector > getBookmarks(int folder_id = -1); std::vector > getBookmarkFolders(); std::vector > getHistory(); void onBookmarkAdded(std::shared_ptr bookmarkItem); @@ -297,8 +294,8 @@ private: std::shared_ptr m_historyService; #if MERGE_ME std::shared_ptr m_moreMenuUI; - std::shared_ptr m_bookmarkManagerUI; #endif + std::shared_ptr m_bookmarkManagerUI; std::shared_ptr m_mainUI; #if MERGE_ME std::shared_ptr m_historyUI; -- 2.7.4 From c79f0292ce2be1980c308135587d65ab01702c5f Mon Sep 17 00:00:00 2001 From: "k.lis2" Date: Tue, 4 Aug 2015 10:24:57 +0200 Subject: [PATCH 15/16] Task TT-77 Implement More Menu view [Issue#] https://bugs.tizen.org/jira/browse/TT-77 [Task] TT-77 Implement More Menu view [Cause] - [Solution] Add MoreMenuUI. Enable code referring to MoreMenuUI in SimpleUI [Verify] Perform basic sanity check. Change-Id: If623da956d560be47550a429f461443919ce3675 --- services/CMakeLists.txt | 5 +- services/MoreMenuUI/AddBookmarkPopup.cpp | 344 ++++++++ services/MoreMenuUI/AddBookmarkPopup.h | 70 ++ services/MoreMenuUI/CMakeLists.txt | 44 + services/MoreMenuUI/MoreMenuUI.cpp | 460 ++++++++++ services/MoreMenuUI/MoreMenuUI.h | 117 +++ services/MoreMenuUI/NewFolderPopup.cpp | 170 ++++ services/MoreMenuUI/NewFolderPopup.h | 50 ++ services/MoreMenuUI/edc/AddBookmarkPopup.edc | 370 ++++++++ services/MoreMenuUI/edc/MoreMenu.edc | 969 +++++++++++++++++++++ services/MoreMenuUI/edc/NewFolderPopup.edc | 463 ++++++++++ services/MoreMenuUI/edc/error.edc | 144 +++ services/MoreMenuUI/images/btn_bar_new_dis.png | Bin 0 -> 2980 bytes services/MoreMenuUI/images/btn_bar_new_foc.png | Bin 0 -> 2963 bytes services/MoreMenuUI/images/btn_bar_new_nor.png | Bin 0 -> 2977 bytes services/MoreMenuUI/images/btn_bar_stop_nor.png | Bin 0 -> 3255 bytes services/MoreMenuUI/images/favicon.png | Bin 0 -> 13397 bytes services/MoreMenuUI/images/ic_add_bookmark.png | Bin 0 -> 2036 bytes .../MoreMenuUI/images/ic_more_bookmark_foc.png | Bin 0 -> 2008 bytes .../MoreMenuUI/images/ic_more_bookmark_nor.png | Bin 0 -> 2089 bytes .../MoreMenuUI/images/ic_more_desktopview_foc.png | Bin 0 -> 4066 bytes .../MoreMenuUI/images/ic_more_desktopview_nor.png | Bin 0 -> 4372 bytes services/MoreMenuUI/images/ic_more_exit_foc.png | Bin 0 -> 1558 bytes services/MoreMenuUI/images/ic_more_exit_nor.png | Bin 0 -> 1604 bytes .../MoreMenuUI/images/ic_more_focusmode_foc.png | Bin 0 -> 2053 bytes .../MoreMenuUI/images/ic_more_focusmode_nor.png | Bin 0 -> 2062 bytes services/MoreMenuUI/images/ic_more_history_foc.png | Bin 0 -> 2892 bytes services/MoreMenuUI/images/ic_more_history_nor.png | Bin 0 -> 2918 bytes .../MoreMenuUI/images/ic_more_minibrowser_foc.png | Bin 0 -> 1472 bytes .../MoreMenuUI/images/ic_more_minibrowser_nor.png | Bin 0 -> 1524 bytes .../MoreMenuUI/images/ic_more_mobileview_foc.png | Bin 0 -> 3929 bytes .../MoreMenuUI/images/ic_more_mobileview_nor.png | Bin 0 -> 4205 bytes .../MoreMenuUI/images/ic_more_pointermode_foc.png | Bin 0 -> 3180 bytes .../MoreMenuUI/images/ic_more_pointermode_nor.png | Bin 0 -> 3346 bytes .../MoreMenuUI/images/ic_more_readermode_foc.png | Bin 0 -> 1943 bytes .../MoreMenuUI/images/ic_more_readermode_nor.png | Bin 0 -> 2021 bytes services/MoreMenuUI/images/ic_more_setting_foc.png | Bin 0 -> 4600 bytes services/MoreMenuUI/images/ic_more_setting_nor.png | Bin 0 -> 4936 bytes services/MoreMenuUI/images/ic_more_share_foc.png | Bin 0 -> 2653 bytes services/MoreMenuUI/images/ic_more_share_nor.png | Bin 0 -> 2854 bytes services/MoreMenuUI/images/ic_more_zoom_foc.png | Bin 0 -> 3419 bytes services/MoreMenuUI/images/ic_more_zoom_nor.png | Bin 0 -> 3524 bytes .../MoreMenuUI/images/ico_bg_round_shape_37x37.png | Bin 0 -> 18109 bytes services/MoreMenuUI/images/ico_delete.png | Bin 0 -> 18365 bytes services/MoreMenuUI/images/modal_dialogs_bg.png | Bin 0 -> 18648 bytes .../MoreMenuUI/images/modal_dialogs_title_bg.png | Bin 0 -> 18226 bytes services/MoreMenuUI/images/web_frame_selected.png | Bin 0 -> 17687 bytes services/MoreMenuUI/images/web_shadow.png | Bin 0 -> 17700 bytes services/SimpleUI/CMakeLists.txt | 3 +- services/SimpleUI/SimpleUI.cpp | 6 +- services/SimpleUI/SimpleUI.h | 4 +- 51 files changed, 3206 insertions(+), 13 deletions(-) create mode 100644 services/MoreMenuUI/AddBookmarkPopup.cpp create mode 100644 services/MoreMenuUI/AddBookmarkPopup.h create mode 100644 services/MoreMenuUI/CMakeLists.txt create mode 100644 services/MoreMenuUI/MoreMenuUI.cpp create mode 100644 services/MoreMenuUI/MoreMenuUI.h create mode 100644 services/MoreMenuUI/NewFolderPopup.cpp create mode 100644 services/MoreMenuUI/NewFolderPopup.h create mode 100644 services/MoreMenuUI/edc/AddBookmarkPopup.edc create mode 100644 services/MoreMenuUI/edc/MoreMenu.edc create mode 100644 services/MoreMenuUI/edc/NewFolderPopup.edc create mode 100644 services/MoreMenuUI/edc/error.edc create mode 100644 services/MoreMenuUI/images/btn_bar_new_dis.png create mode 100644 services/MoreMenuUI/images/btn_bar_new_foc.png create mode 100644 services/MoreMenuUI/images/btn_bar_new_nor.png create mode 100644 services/MoreMenuUI/images/btn_bar_stop_nor.png create mode 100644 services/MoreMenuUI/images/favicon.png create mode 100644 services/MoreMenuUI/images/ic_add_bookmark.png create mode 100644 services/MoreMenuUI/images/ic_more_bookmark_foc.png create mode 100644 services/MoreMenuUI/images/ic_more_bookmark_nor.png create mode 100644 services/MoreMenuUI/images/ic_more_desktopview_foc.png create mode 100644 services/MoreMenuUI/images/ic_more_desktopview_nor.png create mode 100644 services/MoreMenuUI/images/ic_more_exit_foc.png create mode 100644 services/MoreMenuUI/images/ic_more_exit_nor.png create mode 100644 services/MoreMenuUI/images/ic_more_focusmode_foc.png create mode 100644 services/MoreMenuUI/images/ic_more_focusmode_nor.png create mode 100644 services/MoreMenuUI/images/ic_more_history_foc.png create mode 100644 services/MoreMenuUI/images/ic_more_history_nor.png create mode 100644 services/MoreMenuUI/images/ic_more_minibrowser_foc.png create mode 100644 services/MoreMenuUI/images/ic_more_minibrowser_nor.png create mode 100644 services/MoreMenuUI/images/ic_more_mobileview_foc.png create mode 100644 services/MoreMenuUI/images/ic_more_mobileview_nor.png create mode 100644 services/MoreMenuUI/images/ic_more_pointermode_foc.png create mode 100644 services/MoreMenuUI/images/ic_more_pointermode_nor.png create mode 100644 services/MoreMenuUI/images/ic_more_readermode_foc.png create mode 100644 services/MoreMenuUI/images/ic_more_readermode_nor.png create mode 100644 services/MoreMenuUI/images/ic_more_setting_foc.png create mode 100644 services/MoreMenuUI/images/ic_more_setting_nor.png create mode 100644 services/MoreMenuUI/images/ic_more_share_foc.png create mode 100644 services/MoreMenuUI/images/ic_more_share_nor.png create mode 100644 services/MoreMenuUI/images/ic_more_zoom_foc.png create mode 100644 services/MoreMenuUI/images/ic_more_zoom_nor.png create mode 100644 services/MoreMenuUI/images/ico_bg_round_shape_37x37.png create mode 100644 services/MoreMenuUI/images/ico_delete.png create mode 100644 services/MoreMenuUI/images/modal_dialogs_bg.png create mode 100644 services/MoreMenuUI/images/modal_dialogs_title_bg.png create mode 100644 services/MoreMenuUI/images/web_frame_selected.png create mode 100644 services/MoreMenuUI/images/web_shadow.png diff --git a/services/CMakeLists.txt b/services/CMakeLists.txt index 8a137c9..5515ac1 100644 --- a/services/CMakeLists.txt +++ b/services/CMakeLists.txt @@ -1,14 +1,13 @@ project(services) add_subdirectory(WebKitEngineService) -# MERGE_ME -#add_subdirectory(MoreMenuUI) +add_subdirectory(MoreMenuUI) add_subdirectory(MainUI) # MERGE_ME #add_subdirectory(HistoryUI) add_subdirectory(TabUI) add_subdirectory(SimpleUI) -#MERGE_ME +# MERGE_ME #add_subdirectory(SettingsUI) add_subdirectory(SimpleURI) add_subdirectory(BookmarkManagerUI) diff --git a/services/MoreMenuUI/AddBookmarkPopup.cpp b/services/MoreMenuUI/AddBookmarkPopup.cpp new file mode 100644 index 0000000..fea26c4 --- /dev/null +++ b/services/MoreMenuUI/AddBookmarkPopup.cpp @@ -0,0 +1,344 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include + +#include "Tools/EflTools.h" +#include "AddBookmarkPopup.h" +#include "BrowserLogger.h" + +namespace tizen_browser{ +namespace base_ui{ + +typedef struct _BookmarkFolderItemData +{ + int index; + std::shared_ptr item; + std::shared_ptr addBookmarkPopup; +} BookmarkFolderItemData; + + +AddBookmarkPopup::AddBookmarkPopup(Evas_Object* main_layout): + m_popup(nullptr), + m_gengrid(nullptr), + m_mainLayout(main_layout), + m_itemClass(nullptr) +{ +} + +AddBookmarkPopup::~AddBookmarkPopup () +{} + +void AddBookmarkPopup::show() +{ + BROWSER_LOGD("[%s],", __func__); + bm_edjFilePath = EDJE_DIR; + bm_edjFilePath.append("MoreMenuUI/AddBookmarkPopup.edj"); + elm_theme_extension_add(0, bm_edjFilePath.c_str()); + m_popup = elm_layout_add(m_mainLayout); + if (m_popup != nullptr) + { + elm_object_signal_emit(m_mainLayout, "elm,state,show", "elm"); + elm_layout_file_set(m_popup, bm_edjFilePath.c_str(), "bookmark_popup"); + BROWSER_LOGI("PATH: %s", bm_edjFilePath.c_str()); + + m_gengrid = elm_gengrid_add(m_popup); + + if (m_gengrid != nullptr) + { + evas_object_smart_callback_add(m_gengrid, "item,focused", focusItem, nullptr); + evas_object_smart_callback_add(m_gengrid, "item,unfocused", unFocusItem, nullptr); + // evas_object_smart_callback_add(m_gengrid, "activated", _itemSelected, this); + + if (!m_itemClass) { + m_itemClass = elm_gengrid_item_class_new(); + m_itemClass->item_style = "folder_grid_item"; + m_itemClass->func.text_get = _grid_text_get; + m_itemClass->func.content_get = _grid_content_get; + m_itemClass->func.state_get = nullptr; + m_itemClass->func.del = nullptr; + } + + elm_gengrid_align_set(m_gengrid, 0, 0); + elm_gengrid_select_mode_set(m_gengrid, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_gengrid_multi_select_set(m_gengrid, EINA_FALSE); + elm_gengrid_horizontal_set(m_gengrid, EINA_FALSE); + elm_scroller_policy_set(m_gengrid, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_scroller_page_size_set(m_gengrid, 0, 327); + evas_object_size_hint_weight_set(m_gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); + double efl_scale = elm_config_scale_get() / elm_app_base_scale_get(); + elm_gengrid_item_size_set(m_gengrid, 226 * efl_scale, 226 * efl_scale); + + elm_object_part_content_set(m_popup, "elm.swallow.gengrid", m_gengrid); + elm_object_part_content_set(m_mainLayout, "popup", m_popup); + evas_object_show(m_gengrid); + } + } +} + +void AddBookmarkPopup::hide() +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + elm_object_signal_emit(m_mainLayout, "elm,state,hide", "elm"); + evas_object_hide(elm_layout_content_get(m_popup, "elm.swallow.gengrid")); + evas_object_hide(elm_layout_content_get(m_mainLayout, "popup")); + evas_object_hide(m_gengrid); + evas_object_hide(m_popup); + clearItems(); +} + +Evas_Object * AddBookmarkPopup::getContent() +{ + return m_gengrid; +} + +void AddBookmarkPopup::setEmptyGengrid(bool setEmpty) +{ + if(setEmpty) { + elm_object_part_content_set(m_gengrid, "elm.swallow.empty", createNoHistoryLabel()); + } else { + elm_object_part_content_set(m_gengrid, "elm.swallow.empty", nullptr); + } +} + +Evas_Object* AddBookmarkPopup::createNoHistoryLabel() +{ + Evas_Object *label = elm_label_add(m_popup); + if (label != nullptr) + { + elm_object_text_set(label, "No favorite websites."); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + } + return label; +} + +void AddBookmarkPopup::addBookmarkFolderItem(std::shared_ptr hi , int ind) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + BookmarkFolderItemData *itemData = new BookmarkFolderItemData(); + if (itemData != nullptr) + { + itemData->item = hi; + itemData->index = ind; + itemData->addBookmarkPopup = std::shared_ptr(this); + Elm_Object_Item* BookmarkFolderView = elm_gengrid_item_append(m_gengrid, m_itemClass, itemData, nullptr, this); + if (BookmarkFolderView) + { + if(ind == 1) + { + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + m_map_bookmark_folder_views.insert(std::pair("new_folder_button",BookmarkFolderView)); + } + else + m_map_bookmark_folder_views.insert(std::pair(hi->getAddress(),BookmarkFolderView)); + + elm_gengrid_item_selected_set(BookmarkFolderView, EINA_FALSE); + setEmptyGengrid(false); + } + } +} + +void AddBookmarkPopup::addBookmarkFolderItems(std::vector > items) +{ + BROWSER_LOGD("%s:%d %s Bookmark Folder Items: %d", __FILE__, __LINE__, __func__, items.size()); + int i = 1; + addBookmarkFolderItem(nullptr, i); + for (auto it = items.begin(); it != items.end(); ++it, ++i) { + addBookmarkFolderItem(*it, i); + } + elm_object_part_content_set(m_popup, "elm.swallow.gengrid",getContent()); + evas_object_show(getContent()); +} + +char* AddBookmarkPopup::_grid_text_get(void *data, Evas_Object *, const char *part) +{ + BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part); + if ((data != nullptr) && (part != nullptr)) + { + static const char* part_name = "page_title"; + static const int part_len = strlen(part_name); + + BookmarkFolderItemData *itemData = reinterpret_cast(data); + if (!strncmp(part, part_name, part_len)) { + if(itemData->item) + return strdup(itemData->item->getTittle().c_str()); + } + } + return strdup(""); +} + +const char* AddBookmarkPopup::getImageFileNameForType(int index, bool focused) +{ + static char* file_name = ""; + if (index == 1) + { + if (focused) + { + file_name = "btn_bar_new_foc.png"; + } + else + { + file_name = "btn_bar_new_nor.png"; + } + } + return file_name; +} + +Evas_Object * AddBookmarkPopup::_grid_content_get(void *data, Evas_Object *obj, const char *part) +{ + BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part); + if ((data != nullptr) && (obj != nullptr) && (part != nullptr)) + { + BookmarkFolderItemData *itemData = reinterpret_cast(data); + + static const char* part1_name = "elm.thumbnail"; + static const char* part2_name = "elm.thumbButton"; + static const int part1_len = strlen(part1_name); + static const int part2_len = strlen(part2_name); + + if (!strncmp(part, part1_name, part1_len) && (itemData->index == 1)) { + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + Evas_Object* thumb_nail = elm_icon_add(obj); + const char* file_name = getImageFileNameForType(itemData->index, false); + BROWSER_LOGD("%s:%d %s file=%s", __FILE__, __LINE__, __func__, file_name); + if (thumb_nail != nullptr) + { + elm_image_file_set(thumb_nail, itemData->addBookmarkPopup->bm_edjFilePath.c_str(), file_name); + } + return thumb_nail; + } + if (!strncmp(part, part2_name, part2_len)) { + Evas_Object *thumbButton = elm_button_add(obj); + if (thumbButton != nullptr) + { + elm_object_style_set(thumbButton, part2_name); + if(itemData->index == 1) + { + evas_object_smart_callback_add(thumbButton, "clicked", tizen_browser::base_ui::AddBookmarkPopup::_newFolderButton, data); + evas_object_event_callback_add(thumbButton, EVAS_CALLBACK_MOUSE_IN, __cb_mouse_in, data); + evas_object_event_callback_add(thumbButton, EVAS_CALLBACK_MOUSE_OUT, __cb_mouse_out, data); + } + else + evas_object_smart_callback_add(thumbButton, "clicked", tizen_browser::base_ui::AddBookmarkPopup::_thumbSelected, data); + } + return thumbButton; + } + + } + return nullptr; +} + +void AddBookmarkPopup::__cb_mouse_in(void * data, Evas *, Evas_Object *obj, void *) +{ + BROWSER_LOGD("[%s:%d]", __PRETTY_FUNCTION__, __LINE__); + if ((data != nullptr) && (obj != nullptr)) + { + elm_object_focus_set(obj, EINA_TRUE); + BookmarkFolderItemData *itemData = reinterpret_cast(data); + + const char* file_name = getImageFileNameForType(itemData->index, true); + Elm_Object_Item * selected = itemData->addBookmarkPopup->m_map_bookmark_folder_views["new_folder_button"]; + if (selected != nullptr) + { + Evas_Object *thumb_nail = elm_object_item_part_content_get(selected, "elm.thumbnail"); + if (thumb_nail != nullptr) + { + elm_image_file_set(thumb_nail, itemData->addBookmarkPopup->bm_edjFilePath.c_str(), file_name); + } + } + } +} + +void AddBookmarkPopup::__cb_mouse_out(void * data, Evas *e, Evas_Object *obj, void *event_info) +{ + BROWSER_LOGD("[%s:%d]", __PRETTY_FUNCTION__, __LINE__); + BookmarkFolderItemData *itemData = reinterpret_cast(data); + elm_object_focus_set(obj, EINA_FALSE); + const char* file_name = getImageFileNameForType(itemData->index, false); + Elm_Object_Item * selected = itemData->addBookmarkPopup->m_map_bookmark_folder_views["new_folder_button"]; + Evas_Object *thumb_nail = elm_object_item_part_content_get(selected, "elm.thumbnail"); + elm_image_file_set(thumb_nail, itemData->addBookmarkPopup->bm_edjFilePath.c_str(), file_name); +} + +void AddBookmarkPopup::_itemSelected(void * data, Evas_Object * /* obj */, void * event_info) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + /*Elm_Object_Item * selected = reinterpret_cast(event_info); + HistoryItemData * itemData = reinterpret_cast(elm_object_item_data_get(selected)); + AddBookmarkPopup * self = reinterpret_cast(data); + + self->bookmarkClicked(itemData->item);*/ +} + + +void AddBookmarkPopup::_newFolderButton(void * data, Evas_Object * /* obj */, void * /* event_info */) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + BookmarkFolderItemData * itemData = reinterpret_cast(data); + itemData->addBookmarkPopup->addNewFolderClicked(std::string()); +} + +void AddBookmarkPopup::_thumbSelected(void * data, Evas_Object * /* obj */, void * /* event_info */) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + BookmarkFolderItemData * itemData = reinterpret_cast(data); + itemData->addBookmarkPopup->folderSelected(itemData->item->getId()); +} + +void AddBookmarkPopup::clearItems() +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + elm_gengrid_clear(m_gengrid); + m_map_bookmark_folder_views.clear(); + elm_theme_extension_del(nullptr, bm_edjFilePath.c_str()); + elm_theme_full_flush(); + elm_cache_all_flush(); +} + + +void AddBookmarkPopup::updateGengrid() +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + elm_gengrid_clear(m_gengrid); + m_map_bookmark_folder_views.clear(); +} + +void AddBookmarkPopup::focusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,in", "over2"); + + // selected manually + elm_gengrid_item_selected_set(item, EINA_TRUE); +} + +void AddBookmarkPopup::unFocusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,out", "over2"); + + // unselected manually + elm_gengrid_item_selected_set(item, EINA_FALSE); +} + +} +} diff --git a/services/MoreMenuUI/AddBookmarkPopup.h b/services/MoreMenuUI/AddBookmarkPopup.h new file mode 100644 index 0000000..62d86e7 --- /dev/null +++ b/services/MoreMenuUI/AddBookmarkPopup.h @@ -0,0 +1,70 @@ +#ifndef ADDBOOKMARKPOPUP_H +#define ADDBOOKMARKPOPUP_H + +#include +#include + +#include "AbstractUIComponent.h" +#include "AbstractService.h" +#include "ServiceFactory.h" +#include "service_macros.h" +#include "BookmarkItem.h" + +namespace tizen_browser{ +namespace base_ui{ + +class AddBookmarkPopup{ + +public: + AddBookmarkPopup(Evas_Object *main_layout); + ~AddBookmarkPopup(); + + Evas_Object *getContent(); + void addBookmarkFolderItem(std::shared_ptr , int); + void addBookmarkFolderItems(std::vector >); + void clearItems(); + void updateGengrid(); + Evas_Object* createNoHistoryLabel(); + void setEmptyGengrid(bool setEmpty); + + boost::signals2::signal blockClicked; + boost::signals2::signal folderSelected; + boost::signals2::signal addNewFolderClicked; + /** + * Theese setters should be called before showing popup. + */ + void show(); + void hide(); + +private: + static char* _grid_text_get(void *data, Evas_Object *, const char *part); + static Evas_Object * _grid_content_get(void *data, Evas_Object *obj, const char *part); + static void _itemSelected(void * data, Evas_Object * obj, void * event_info); + static void _thumbSelected(void * data, Evas_Object * obj, void * event_info); + static void _newFolderButton(void *data, Evas_Object *obj, void *event_info); + static Evas_Object* listItemContentGet(void *data, Evas_Object *obj, const char *part); + static char* listItemTextGet(void *data, Evas_Object *obj, const char *part); + + static void item_clicked_cb(void *data, Evas_Object *obj, void *event_info); + static void close_clicked_cb(void *data, Evas_Object *obj, void *event_info); + + static const char* getImageFileNameForType(int index, bool focused); + + Evas_Object *m_mainLayout; + Evas_Object *m_popup; + Evas_Object *m_gengrid; + + Elm_Gengrid_Item_Class * m_itemClass; + std::map m_map_bookmark_folder_views; + std::string bm_edjFilePath; + bool m_gengridSetup; + + static void __cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info); + static void __cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info); + + static void focusItem(void* data, Evas_Object* obj, void* event_info); + static void unFocusItem(void* data, Evas_Object* obj, void* event_info); +}; +} +} +#endif diff --git a/services/MoreMenuUI/CMakeLists.txt b/services/MoreMenuUI/CMakeLists.txt new file mode 100644 index 0000000..611598b --- /dev/null +++ b/services/MoreMenuUI/CMakeLists.txt @@ -0,0 +1,44 @@ +project(MoreMenuUI) + +set(MoreMenuUI_SRCS + MoreMenuUI.cpp + AddBookmarkPopup.cpp + NewFolderPopup.cpp + ) + +set(MoreMenuUI_HEADERS + MoreMenuUI.h + AddBookmarkPopup.h + NewFolderPopup.h + ) + +include(Coreheaders) +include(EFLHelpers) + +include_directories(${CMAKE_SOURCE_DIR}/services/FavoriteService) + +add_library(${PROJECT_NAME} SHARED ${MoreMenuUI_SRCS}) + +if(TIZEN_BUILD) + target_link_libraries(${PROJECT_NAME} ${pkgs_LDFLAGS}) +endif(TIZEN_BUILD) + +install(TARGETS ${PROJECT_NAME} + LIBRARY DESTINATION services + ARCHIVE DESTINATION services/static) + +include(EDCCompile) +#please do not add edc/ directory +set(edcFiles + MoreMenu.edc + AddBookmarkPopup.edc + NewFolderPopup.edc + ) + +foreach(edec ${edcFiles}) + string(REPLACE ".edc" ".edj" target_name ${edec}) + EDJ_TARGET(${target_name} + ${CMAKE_CURRENT_SOURCE_DIR}/edc/${edec} + ${CMAKE_CURRENT_BINARY_DIR}) +endforeach(edec) + diff --git a/services/MoreMenuUI/MoreMenuUI.cpp b/services/MoreMenuUI/MoreMenuUI.cpp new file mode 100644 index 0000000..492f3ea --- /dev/null +++ b/services/MoreMenuUI/MoreMenuUI.cpp @@ -0,0 +1,460 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include + +#include "MoreMenuUI.h" +#include "ServiceManager.h" +#include "BrowserLogger.h" +#include "Tools/EflTools.h" +#include "../Tools/BrowserImage.h" + +#define efl_scale (elm_config_scale_get() / elm_app_base_scale_get()) + +namespace tizen_browser{ +namespace base_ui{ + +EXPORT_SERVICE(MoreMenuUI, "org.tizen.browser.moremenuui") + +struct ItemData{ + tizen_browser::base_ui::MoreMenuUI * m_moreMenu; + tizen_browser::services::HistoryItem * h_item; + Elm_Object_Item * e_item; + }; + +typedef struct _MoreItemData +{ + ItemType item; + std::shared_ptr moreMenuUI; +} MoreMenuItemData; + +MoreMenuUI::MoreMenuUI() + : m_gengrid(NULL) + , m_parent(NULL) + , m_item_class(NULL) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + edjFilePath = EDJE_DIR; + edjFilePath.append("MoreMenuUI/MoreMenu.edj"); +} + +MoreMenuUI::~MoreMenuUI() +{ +} + +void MoreMenuUI::show(Evas_Object* parent) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_parent = parent; + elm_theme_extension_add(NULL, edjFilePath.c_str()); + m_mm_layout = elm_layout_add(parent); + elm_layout_file_set(m_mm_layout, edjFilePath.c_str(), "moremenu-layout"); + evas_object_size_hint_weight_set(m_mm_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_mm_layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(m_mm_layout); + + m_gengrid = elm_gengrid_add(m_mm_layout); + elm_object_part_content_set(m_mm_layout, "elm.swallow.grid", m_gengrid); + + /*evas_object_smart_callback_add(m_gengrid, "item,focused", focusItem, NULL); + evas_object_smart_callback_add(m_gengrid, "item,unfocused", unFocusItem, NULL); + evas_object_smart_callback_add(m_gengrid, "activated", _itemSelected, this);*/ + + if (!m_item_class) { + m_item_class = elm_gengrid_item_class_new(); + m_item_class->item_style = "menu_item"; + m_item_class->func.text_get = _grid_text_get; + m_item_class->func.content_get = _grid_content_get; + m_item_class->func.state_get = NULL; + m_item_class->func.del = NULL; + } + + elm_gengrid_align_set(m_gengrid, 0, 0); + elm_gengrid_select_mode_set(m_gengrid, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_gengrid_multi_select_set(m_gengrid, EINA_FALSE); + elm_gengrid_horizontal_set(m_gengrid, EINA_FALSE); + elm_scroller_policy_set(m_gengrid, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); + elm_scroller_page_size_set(m_gengrid, 0, 327); + evas_object_size_hint_weight_set(m_gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_gengrid_item_size_set(m_gengrid, 364 * efl_scale, 320 * efl_scale); + + addItems(); +} + +void MoreMenuUI::showCurrentTab(const std::shared_ptr item) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + elm_theme_extension_add(NULL, edjFilePath.c_str()); + m_genList = elm_genlist_add(m_mm_layout); + elm_object_part_content_set(m_mm_layout, "elm.swallow.genlist", m_genList); + elm_genlist_homogeneous_set(m_genList, EINA_FALSE); + elm_genlist_multi_select_set(m_genList, EINA_FALSE); + elm_genlist_select_mode_set(m_genList, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_genlist_mode_set(m_genList, ELM_LIST_LIMIT); + elm_genlist_decorate_mode_set(m_genList, EINA_TRUE); + evas_object_size_hint_weight_set(m_genList, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + /*evas_object_smart_callback_add(m_genList, "item,focused", focusItem, this); + evas_object_smart_callback_add(m_genList, "item,unfocused", unFocusItem, NULL);*/ + + m_itemClass = elm_genlist_item_class_new(); + m_itemClass->item_style = "current_tab"; + m_itemClass->func.text_get = &listItemTextGet; + m_itemClass->func.content_get = &listItemContentGet; + m_itemClass->func.state_get = 0; + m_itemClass->func.del = 0; + + ItemData * id = new ItemData; + id->m_moreMenu = this; + id->h_item = item ? item.get() : NULL; + Elm_Object_Item* elmItem = elm_genlist_item_append(m_genList, //genlist + m_itemClass, //item Class + id, + NULL, //parent item + ELM_GENLIST_ITEM_NONE, //item type + NULL, + NULL //data passed to above function + ); + id->e_item = elmItem; + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); +} + +Evas_Object* MoreMenuUI::listItemContentGet(void* data, Evas_Object* obj, const char* part) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData * id = static_cast(data); + if(!strcmp(part, "favicon") && id->h_item && id->h_item->getFavIcon()) + { + // Currently favicon is not getting fetched from the engine, so we are showing Google's favicon by default. + Evas_Object* thumb_nail = elm_icon_add(obj); + const char* file_name = "favicon.png"; + elm_image_file_set(thumb_nail, id->m_moreMenu->edjFilePath.c_str(), file_name); + return thumb_nail; + //return tizen_browser::tools::EflTools::getEvasImage(id->h_item->getFavIcon(), obj); + } + else if(!strcmp(part, "star_click")) + { + Evas_Object *star_click = elm_button_add(obj); + elm_object_style_set(star_click, "hidden_button"); + evas_object_smart_callback_add(star_click, "clicked", MoreMenuUI::star_clicked_cb, id); + return star_click; + } + else if(!strcmp(part, "close_click")) + { + Evas_Object *close_click = elm_button_add(obj); + elm_object_style_set(close_click, "hidden_button"); + evas_object_smart_callback_add(close_click, "clicked", MoreMenuUI::close_clicked_cb, id); + return close_click; + } + return NULL; +} + +void MoreMenuUI::item_clicked_cb(void* data, Evas_Object* /* obj */, void* /* event_info */) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); +} + +void MoreMenuUI::star_clicked_cb(void* data, Evas_Object* /* obj */, void* /* event_info */) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData * id = static_cast(data); + id->m_moreMenu->AddBookmarkPopupCalled(); +} + +void MoreMenuUI::AddBookmarkPopupCalled() +{ //m_map_bookmark_folder_list.clear(); + popup = std::shared_ptr (new AddBookmarkPopup(m_mm_layout)); + popup->show(); + popup->addBookmarkFolderItems(m_map_bookmark_folder_list); + popup->folderSelected.disconnect_all_slots(); + popup->folderSelected.connect(boost::bind(&MoreMenuUI::addToBookmarks, this, _1)); + popup->addNewFolderClicked.disconnect_all_slots(); + popup->addNewFolderClicked.connect(boost::bind(&MoreMenuUI::newFolderPopup, this,_1)); +} + +void MoreMenuUI::newFolderPopup(std::string) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_popup = std::shared_ptr (new NewFolderPopup(m_mm_layout, NULL,"Add New Folder for adding to Bookmark","New Folder","Add to bookmark","Cancel")); + m_popup->on_ok.disconnect_all_slots(); + m_popup->on_ok.connect(boost::bind(&MoreMenuUI::NewFolderCreate, this, _1)); + m_popup->on_cancel.disconnect_all_slots(); + m_popup->on_cancel.connect(boost::bind(&MoreMenuUI::CancelClicked, this, _1)); + popup->hide(); + m_popup->show(); +} + +void MoreMenuUI::NewFolderCreate(Evas_Object * popup_content) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_folderName = elm_entry_entry_get(popup_content); + BookmarkFolderCreated(m_folderName.c_str(), 0,0); + m_popup->hide(); +} + +void MoreMenuUI::CancelClicked(Evas_Object * popup) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_popup->hide(); +} + +void MoreMenuUI::addToBookmarks(int folder_id) +{ + AddBookmarkInput(folder_id); + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + popup->hide(); + popup.reset(); +} +void MoreMenuUI::close_clicked_cb(void* data, Evas_Object* /* obj */, void* /* event_info */) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData * id = static_cast(data); + id->m_moreMenu->closeMoreMenuClicked(std::string()); + id->m_moreMenu->clearItems(); +} + +char* MoreMenuUI::listItemTextGet(void* data, Evas_Object* /* obj */, const char* part) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData * id = static_cast(data); + if(!strcmp(part, "webpage_title")) + { + if(!id->h_item) + return strdup("New Tab"); + if(!id->h_item->getTitle().empty()){ + return strdup(id->h_item->getTitle().c_str()); + } + } + else if(!strcmp(part, "webpage_url")) + { + if(!id->h_item) + return strdup(""); + if(!id->h_item->getUrl().empty()){ + return strdup(id->h_item->getUrl().c_str()); + } + } + return strdup(""); +} + +void MoreMenuUI::hide() +{ + evas_object_hide(elm_layout_content_get(m_mm_layout, "elm.swallow.grid")); + evas_object_hide(elm_layout_content_get(m_mm_layout, "elm.swallow.genlist")); + evas_object_hide(m_mm_layout); +} + +void MoreMenuUI::addItems() +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + for (size_t i = 0; i < 10; i++) { + MoreMenuItemData *itemData = new MoreMenuItemData(); + itemData->item = static_cast(i);; + itemData->moreMenuUI = std::shared_ptr(this); + Elm_Object_Item* bookmarkView = elm_gengrid_item_append(m_gengrid, m_item_class, itemData, NULL, this); + m_map_menu_views.insert(std::pair(itemData->item, bookmarkView)); + elm_gengrid_item_selected_set(bookmarkView, EINA_FALSE); + } + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); +} + +char* MoreMenuUI::_grid_text_get(void *data, Evas_Object *obj, const char *part) +{ + MoreMenuItemData *itemData = reinterpret_cast(data); + + BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part); + if (!strcmp(part, "menu_label")) { + const char* item_name = NULL; + switch(itemData->item) { + case READER_MODE: + item_name = "Reader mode"; break; + case BOOKMARK_MANAGER: + item_name = "Bookmark manager"; break; + case HISTORY: + item_name = "History"; break; + case SCREEN_ZOOM: + item_name = "Screen zoom"; break; + case START_MINIBROWSER: + item_name = "Start minibrowser"; break; + case FOCUS_MODE: + item_name = "Focus mode"; break; + case VIEW_MOBILE_WEB: + item_name = "View mobile web"; break; + case SHARE: + item_name = "Share"; break; + case SETTINGS: + item_name = "Settings"; break; + case EXIT_BROWSER: + item_name = "Exit browser"; break; + default: + item_name = ""; + } + return strdup(item_name); + } + return NULL; +} + +static const char* getImageFileNameForType(ItemType type, bool focused) +{ + const char* file_name = NULL; + switch(type) { + case READER_MODE: + file_name = focused ? "ic_more_readermode_foc.png" : "ic_more_readermode_nor.png"; break; + case BOOKMARK_MANAGER: + file_name = focused ? "ic_more_bookmark_foc.png" : "ic_more_bookmark_nor.png"; break; + case HISTORY: + file_name = focused ? "ic_more_history_foc.png" : "ic_more_history_nor.png"; break; + case SCREEN_ZOOM: + file_name = focused ? "ic_more_zoom_foc.png" : "ic_more_zoom_nor.png"; break; + case START_MINIBROWSER: + file_name = focused ? "ic_more_minibrowser_foc.png" : "ic_more_minibrowser_nor.png"; break; + case FOCUS_MODE: + file_name = focused ? "ic_more_focusmode_foc.png" : "ic_more_focusmode_nor.png"; break; + case VIEW_MOBILE_WEB: + file_name = focused ? "ic_more_mobileview_foc.png" : "ic_more_mobileview_nor.png"; break; + case SHARE: + file_name = focused ? "ic_more_share_foc.png" : "ic_more_share_nor.png"; break; + case SETTINGS: + file_name = focused ? "ic_more_setting_foc.png" : "ic_more_setting_nor.png"; break; + case EXIT_BROWSER: + file_name = focused ? "ic_more_exit_foc.png" : "ic_more_exit_nor.png"; break; + default: + file_name = ""; + } + return file_name; +} + +Evas_Object * MoreMenuUI::_grid_content_get(void *data, Evas_Object *obj, const char *part) +{ + BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part); + MoreMenuItemData *itemData = reinterpret_cast(data); + + if (!strcmp(part, "thumbnail_item")) { + Evas_Object* thumb_nail = elm_icon_add(obj); + const char* file_name = getImageFileNameForType(itemData->item, false); + elm_image_file_set(thumb_nail, itemData->moreMenuUI->edjFilePath.c_str(), file_name); + return thumb_nail; + } + else if (!strcmp(part, "thumbbutton_item")) { + Evas_Object *thumbButton = elm_button_add(obj); + elm_object_style_set(thumbButton, "clickButton"); + evas_object_smart_callback_add(thumbButton, "clicked", tizen_browser::base_ui::MoreMenuUI::_thumbSelected, data); + evas_object_event_callback_add(thumbButton, EVAS_CALLBACK_MOUSE_IN, __cb_mouse_in, data); + evas_object_event_callback_add(thumbButton, EVAS_CALLBACK_MOUSE_OUT, __cb_mouse_out, data); + return thumbButton; + } + return NULL; +} + +void MoreMenuUI::__cb_mouse_in(void * data, Evas *e, Evas_Object *obj, void *event_info) +{ + BROWSER_LOGD("[%s:%d]", __PRETTY_FUNCTION__, __LINE__); + elm_object_focus_set(obj, EINA_TRUE); + MoreMenuItemData *itemData = reinterpret_cast(data); + + const char* file_name = getImageFileNameForType(itemData->item, true); + Elm_Object_Item * selected = itemData->moreMenuUI->m_map_menu_views[itemData->item]; + Evas_Object *thumb_nail = elm_object_item_part_content_get(selected, "thumbnail_item"); + elm_image_file_set(thumb_nail, itemData->moreMenuUI->edjFilePath.c_str(), file_name); +} + +void MoreMenuUI::__cb_mouse_out(void * data, Evas *e, Evas_Object *obj, void *event_info) +{ + BROWSER_LOGD("[%s:%d]", __PRETTY_FUNCTION__, __LINE__); + MoreMenuItemData *itemData = reinterpret_cast(data); + elm_object_focus_set(obj, EINA_FALSE); + const char* file_name = getImageFileNameForType(itemData->item, false); + Elm_Object_Item * selected = itemData->moreMenuUI->m_map_menu_views[itemData->item]; + Evas_Object *thumb_nail = elm_object_item_part_content_get(selected, "thumbnail_item"); + elm_image_file_set(thumb_nail, itemData->moreMenuUI->edjFilePath.c_str(), file_name); +} + +void MoreMenuUI::_itemSelected(void * data, Evas_Object * /* obj */, void * event_info) +{ + BROWSER_LOGD("[%s:%d]", __PRETTY_FUNCTION__, __LINE__); +} + +void MoreMenuUI::_thumbSelected(void * data, Evas_Object * /* obj */, void * /* event_info */) +{ + BROWSER_LOGD("[%s:%d]", __PRETTY_FUNCTION__, __LINE__); + MoreMenuItemData *itemData = reinterpret_cast(data); + switch(itemData->item) { + case READER_MODE: + break; + case BOOKMARK_MANAGER: + break; + case HISTORY: + itemData->moreMenuUI->historyUIClicked(std::string()); break; + case SCREEN_ZOOM: + break; + case START_MINIBROWSER: + break; + case FOCUS_MODE: + break; + case VIEW_MOBILE_WEB: + break; + case SHARE: + break; + case SETTINGS: + itemData->moreMenuUI->settingsClicked(std::string()); break; + case EXIT_BROWSER: + break; + } +} + +void MoreMenuUI::getBookmarkFolderList(std::vector > folderList) +{ + m_map_bookmark_folder_list = folderList; +} + +void MoreMenuUI::clearItems() +{ + hide(); + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + elm_gengrid_clear(m_gengrid); + elm_genlist_clear(m_genList); + m_map_menu_views.clear(); + m_map_bookmark_folder_list.clear(); + elm_theme_extension_del(NULL, edjFilePath.c_str()); + elm_theme_full_flush(); + elm_cache_all_flush(); +} + +void MoreMenuUI::focusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,in", "over2"); + + // selected manually + elm_gengrid_item_selected_set(item, EINA_TRUE); +} + +void MoreMenuUI::unFocusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,out", "over2"); + + // unselected manually + elm_gengrid_item_selected_set(item, EINA_FALSE); +} + +} +} diff --git a/services/MoreMenuUI/MoreMenuUI.h b/services/MoreMenuUI/MoreMenuUI.h new file mode 100644 index 0000000..7bff048 --- /dev/null +++ b/services/MoreMenuUI/MoreMenuUI.h @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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 MOREMENUUI_H +#define MOREMENUUI_H + +#include +#include + +#include "AbstractUIComponent.h" +#include "AbstractService.h" +#include "ServiceFactory.h" +#include "service_macros.h" +//#include "../SimpleUI/SimpleUI.h" + +#include "BookmarkItem.h" +#include "AddBookmarkPopup.h" +#include "NewFolderPopup.h" +#include "../BookmarkManagerUI/AddNewFolderPopup.h" +#include "services/HistoryService/HistoryItem.h" + +namespace tizen_browser{ +namespace base_ui{ + +class SimpleUI; +enum ItemType { + READER_MODE, + BOOKMARK_MANAGER, + HISTORY, + SCREEN_ZOOM, + START_MINIBROWSER, + FOCUS_MODE, + VIEW_MOBILE_WEB, + SHARE, + SETTINGS, + EXIT_BROWSER +} item; + +class BROWSER_EXPORT MoreMenuUI + : public tizen_browser::interfaces::AbstractUIComponent + , public tizen_browser::core::AbstractService +{ +public: + MoreMenuUI(); + ~MoreMenuUI(); + void show(Evas_Object *main_layout); + void showCurrentTab(const std::shared_ptr item); + virtual std::string getName(); + void addItems(); + void hide(); + void clearItems(); + void getBookmarkFolderList(std::vector > ); + + boost::signals2::signal historyUIClicked; + boost::signals2::signal BookmarkFolderCreated; + boost::signals2::signal closeMoreMenuClicked; + boost::signals2::signal BookmarkFoldersListImport; + boost::signals2::signal settingsClicked; + boost::signals2::signal AddBookmarkInput; +private: + static char* _grid_text_get(void *data, Evas_Object *obj, const char *part); + static Evas_Object * _grid_content_get(void *data, Evas_Object *obj, const char *part); + static void _itemSelected(void * data, Evas_Object * obj, void * event_info); + static void _thumbSelected(void * data, Evas_Object * obj, void * event_info); + + static Evas_Object* listItemContentGet(void *data, Evas_Object *obj, const char *part); + static char* listItemTextGet(void *data, Evas_Object *obj, const char *part); + + void newFolderPopup(std::string); + void NewFolderCreate(Evas_Object * popup_content); + void CancelClicked(Evas_Object * popup_content); + + void AddBookmarkPopupCalled(); + void addToBookmarks(int folder_id); + static void item_clicked_cb(void *data, Evas_Object *obj, void *event_info); + static void star_clicked_cb(void *data, Evas_Object *obj, void *event_info); + static void close_clicked_cb(void *data, Evas_Object *obj, void *event_info); + + static void __cb_mouse_in(void *data, Evas *e, Evas_Object *obj, void *event_info); + static void __cb_mouse_out(void *data, Evas *e, Evas_Object *obj, void *event_info); + +private: + Evas_Object *m_genList; + std::shared_ptr m_popup; + Evas_Object *m_mm_layout; + std::shared_ptr popup; + Elm_Genlist_Item_Class *m_itemClass; + Evas_Object *m_gengrid; + Evas_Object *m_parent; + Elm_Gengrid_Item_Class * m_item_class; + std::map m_map_menu_views; + std::vector > m_map_bookmark_folder_list; + std::string edjFilePath; + std::string m_folderName; + bool m_gengridSetup; + + static void focusItem(void* data, Evas_Object* obj, void* event_info); + static void unFocusItem(void* data, Evas_Object* obj, void* event_info); +}; + +} +} + +#endif // BOOKMARKSUI_H diff --git a/services/MoreMenuUI/NewFolderPopup.cpp b/services/MoreMenuUI/NewFolderPopup.cpp new file mode 100644 index 0000000..32b8f69 --- /dev/null +++ b/services/MoreMenuUI/NewFolderPopup.cpp @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include + +#include "Tools/EflTools.h" +#include "NewFolderPopup.h" +#include "BrowserLogger.h" + +#define efl_scale (elm_config_scale_get() / elm_app_base_scale_get()) + +namespace tizen_browser{ +namespace base_ui{ + +NewFolderPopup::NewFolderPopup(Evas_Object* main_layout) : + m_popup(NULL), + m_content(NULL), + m_mainLayout(main_layout) +{ + +} + +NewFolderPopup::NewFolderPopup(Evas_Object *main_layout, Evas_Object *content, const char *message, char* title, char* okButtonText, char* cancelButtonText) : + m_popup(NULL), + m_mainLayout(main_layout), + m_content(content), + m_message(message), + m_title(title), + m_okButtonText(okButtonText), + m_cancelButtonText(cancelButtonText) +{ + +} + +void NewFolderPopup::setTitle(const std::string& title) +{ + m_title = title; +} + +void NewFolderPopup::setMessage(const std::string& message) +{ + m_message = message; +} + +void NewFolderPopup::setContent(Evas_Object* content) +{ + m_content = content; +} + +void NewFolderPopup::setOkButtonText(const std::string& okButtonText) +{ + m_okButtonText = okButtonText; +} + +void NewFolderPopup::setCancelButtonText(const std::string& cancelButtonText) +{ + m_cancelButtonText = cancelButtonText; +} + +void NewFolderPopup::show() +{ + BROWSER_LOGD("[%si %d],", __func__, __LINE__); + std::string edjePath = std::string(EDJE_DIR); + edjePath.append("MoreMenuUI/NewFolderPopup.edj"); + elm_theme_extension_add(0, edjePath.c_str()); + m_popup = elm_layout_add(m_mainLayout); + elm_layout_file_set(m_popup, edjePath.c_str(), "new_folder_popup"); + elm_object_part_text_set(m_popup, "title_text", m_title.c_str()); + + Evas_Object *buttonsBox = elm_box_add(m_popup); + elm_box_horizontal_set(buttonsBox, EINA_TRUE); + + /* for margins */ + Evas_Object *layout = elm_layout_add(m_popup); + elm_layout_file_set(layout, edjePath.c_str() , "popup_input_text"); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_content_set(m_popup, layout); + elm_object_part_text_set(m_popup, "title,text", m_title.c_str()); + + m_editfield_entry = elm_entry_add(layout); + elm_object_style_set(m_editfield_entry, "uri_entry_popup"); + evas_object_size_hint_weight_set(m_editfield_entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_editfield_entry, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_entry_editable_set(m_editfield_entry, EINA_TRUE); + elm_entry_cnp_mode_set(m_editfield_entry, ELM_CNP_MODE_PLAINTEXT); + elm_entry_scrollable_set(m_editfield_entry, EINA_TRUE); + elm_entry_autocapital_type_set(m_editfield_entry, ELM_AUTOCAPITAL_TYPE_NONE); + elm_entry_prediction_allow_set(m_editfield_entry, EINA_FALSE); + elm_entry_single_line_set(m_editfield_entry, EINA_TRUE); + + elm_entry_input_panel_layout_set(m_editfield_entry, ELM_INPUT_PANEL_LAYOUT_URL); + elm_entry_input_panel_return_key_type_set(m_editfield_entry, ELM_INPUT_PANEL_RETURN_KEY_TYPE_DONE); + elm_object_part_content_set(layout, "elm.swallow.content" , m_editfield_entry); + elm_entry_cursor_end_set(m_editfield_entry); + + if (!m_okButtonText.empty()) + { + BROWSER_LOGD("Button1, %s", edjePath.c_str()); + Evas_Object *btn1 = elm_button_add(buttonsBox); + evas_object_size_hint_weight_set(btn1, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn1, 0.5, 0.5); + elm_object_style_set(btn1, "bookmark_button"); + elm_object_part_text_set(btn1, "elm.text", m_okButtonText.c_str()); + elm_box_pack_end(buttonsBox, btn1); + evas_object_smart_callback_add(btn1, "clicked", popup_ok_cb, (void*)this); + evas_object_show(btn1); + } + + if (!m_cancelButtonText.empty()) + { + BROWSER_LOGD("Button2"); + Evas_Object *btn2 = elm_button_add(buttonsBox); + evas_object_size_hint_weight_set(btn2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(btn2, 0.5, 0.5); + elm_object_style_set(btn2, "bookmark_button"); + elm_object_part_text_set(btn2, "elm.text", m_cancelButtonText.c_str()); + elm_box_pack_end(buttonsBox, btn2); + evas_object_smart_callback_add(btn2, "clicked", popup_cancel_cb, (void*)this); + evas_object_show(btn2); + } + + if(!m_message.empty()) + elm_object_part_text_set(m_popup, "elm.text", m_message.c_str()); + + evas_object_show(m_editfield_entry); + evas_object_show(buttonsBox); + evas_object_show(layout); + elm_object_part_content_set(m_popup, "buttons", buttonsBox); + elm_object_part_content_set(m_popup, "content", layout); + elm_object_part_content_set(m_mainLayout, "popup", m_popup); + + elm_object_signal_emit(m_mainLayout, "elm,state,show", "elm"); +} + +void NewFolderPopup::hide() +{ + evas_object_hide(m_popup); + elm_object_signal_emit(m_mainLayout, "elm,state,hide", "elm"); +} + +void NewFolderPopup::popup_ok_cb(void *data, Evas_Object *btn, void*) +{ + BROWSER_LOGD("[%s],", __func__); + NewFolderPopup *ownPopup = static_cast(data); + ownPopup->on_ok(ownPopup->m_editfield_entry); +} +void NewFolderPopup::popup_cancel_cb(void *data, Evas_Object *btn, void*) +{ + BROWSER_LOGD("[%s],", __func__); + NewFolderPopup *ownPopup = static_cast(data); + ownPopup->on_cancel(ownPopup->m_editfield_entry); +} + +} +} diff --git a/services/MoreMenuUI/NewFolderPopup.h b/services/MoreMenuUI/NewFolderPopup.h new file mode 100644 index 0000000..18edd11 --- /dev/null +++ b/services/MoreMenuUI/NewFolderPopup.h @@ -0,0 +1,50 @@ +#ifndef NEWFOLDERPOPUP_H +#define NEWFOLDERPOPUP_H + +#include +#include + +#include "AbstractUIComponent.h" +#include "AbstractService.h" +#include "ServiceFactory.h" +#include "service_macros.h" +#include "BookmarkItem.h" + +namespace tizen_browser{ +namespace base_ui{ + +class NewFolderPopup{ + +public: + NewFolderPopup(Evas_Object *main_layout); + NewFolderPopup(Evas_Object *main_layout, Evas_Object *content, const char *message, char *title, char* okButtonText, char* cancelButtonText); + + /** + * Theese setters should be called before showing popup. + */ + void setContent(Evas_Object *content); + void setMessage(const std::string &message); + void setTitle(const std::string &title); + void setOkButtonText(const std::string &okButtonText); + void setCancelButtonText(const std::string &cancelButtonText); + + void show(); + void hide(); + boost::signals2::signal on_ok; + boost::signals2::signal on_cancel; + +private: + static void popup_ok_cb(void *data, Evas_Object *btn, void*); + static void popup_cancel_cb(void *data, Evas_Object *btn, void*); + Evas_Object *m_popup; + Evas_Object *m_editfield_entry; + Evas_Object *m_content; + std::string m_message, m_title, m_okButtonText, m_cancelButtonText; + +protected: + Evas_Object *m_mainLayout; +}; + +} +} +#endif diff --git a/services/MoreMenuUI/edc/AddBookmarkPopup.edc b/services/MoreMenuUI/edc/AddBookmarkPopup.edc new file mode 100644 index 0000000..ec3c60a --- /dev/null +++ b/services/MoreMenuUI/edc/AddBookmarkPopup.edc @@ -0,0 +1,370 @@ +#define CONTENT_HEIGHT 99; +#define CONTENT_BG_HEIGHT (CONTENT_HEIGHT+294); + +#define DEBUG_RECT_OVER(over_part, r, g, b) \ + part { name: __CONCAT("dbg_rect_at_", __stringify(__LINE__)); \ + \ +scale:1; \ + type : RECT; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + visible: 1; \ + color: r g b 128; \ + rel1 { to: over_part; relative: 0 0; } \ + rel2 { to: over_part; relative: 1 1; } \ + } \ + } + +#define RESOURCE_IMAGE_LOSSY( FILE_NAME ) \ + group { \ + name: FILE_NAME; \ + images.image: FILE_NAME LOSSY 100; \ + parts { \ + part { name: "image"; \ + description { \ + state: "default" 0.0; \ + image.normal: FILE_NAME; \ + min: 134 167; \ + max: 134 167; \ + aspect_preference: BOTH; \ + } \ + } \ + } \ + } + + + +collections{ + RESOURCE_IMAGE_LOSSY("btn_bar_new_foc.png") + RESOURCE_IMAGE_LOSSY("btn_bar_new_nor.png") + + group { name: "bookmark_popup"; + parts{ + part{ name: "content_bg"; + type: RECT; + scale: 1; + description{ + state: "default" 0.0; + visible: 1; + fixed: 1 1; + color: 255 255 255 255; + align: 0.5 0.5; + min: 740 658; + max: 740 884; + rel1 {relative: 0.0 0.0;} + rel2 {relative: 1.0 1.0;} + } + } + part{ name: "title_bg"; + type: RECT; + description{ + state: "default" 0.0; + visible: 1; + color: 255 255 255 255; + min: 740 144; + max: 740 144; + align: 0.0 0; + rel1 {relative: 0.0 0.0; to: "content_bg"; offset: 0 0;} + rel2 {relative: 1.0 1.0; to: "content_bg";} + } + } + part{ name: "title_text_bm"; + type: TEXT; + description{ + state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 {relative: 0.0 0.0; to: "title_bg"; offset: 40 46;} + rel2 {relative: 1.0 1.0; to: "title_bg"; offset: -40 0;} + color: 51 51 51 255; + text{ + text: "Add to bookmark"; + font: "Sans"; + size: 42; + align: 0.5 0.0; + } + } + } + part{ name: "sub_title_text_bm"; + type: TEXT; + description{ + state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 {relative: 0.0 0.0; to: "title_bg"; offset: 40 112;} + rel2 {relative: 1.0 1.0; to: "title_bg"; offset: -40 0;} + color: 104 104 104 255; + text{ + text: "Select folder for adding to bookmark"; + font: "Sans"; + size: 32; + align: 0.5 0.0; + } + } + } + part{ name: "gengrid_bg"; + type: RECT; + mouse_events: 0; + description{ + state: "default" 0.0; + visible: 1; + color: 255 255 255 255; + rel1 {relative: 0.0 1.0; to: "title_bg"; offset: 40 40;} + rel2 {relative: 1.0 1.0; } + align: 0 0; + min: 698 452; + max: 698 678; + } + } + part{ name: "elm.swallow.gengrid"; + type: SWALLOW; + scale: 1; + description{ + state: "default" 0.0; + visible: 1; + fixed: 0 0; + rel1 {relative: 0.0 0.0; to: "gengrid_bg";} + rel2 {relative: 1.0 1.0; to: "gengrid_bg";} + align: 0.0 0.0; + min: 698 452; + max: 698 678; + } + } + } + } + + /* group { + name: "own_popup_bm_long"; + inherit: "own_popup_bm"; + parts { + part{ name: "content"; + type: SWALLOW; + scale: 1; + description{ + state: "default" 0.0; + visible: 1; + rel1 {relative: 0.0 0.0;} + rel2 {relative: 1.0 1.0;} + fixed: 1 1; + align: 0.5 0.5; + min: 542 0; + max: 542 450; + } + } + } + } + */ + +group { name: "elm/gengrid/item/folder_grid_item/default"; + data.item: "texts" "page_title"; + data.item: "contents" "elm.thumbnail elm.thumbButton"; + images { + image: "web_frame_selected.png" COMP; + image: "ico_bg_round_shape_37x37.png" COMP; + image: "btn_bar_new_nor.png" COMP; + } + parts { + part { name: "bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + min: 226 226; + max: 226 226; + color: 255 255 255 255; + rel1.offset: -18 -18; + } + description { state: "selected"; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "thumbnail_bg"; + type: RECT; + description { state: "default" 0.0; + visible: 1; + min: 208 208; + max: 208 208; + align: 0.0 0.0; + color : 231 231 231 255; + rel1 { + relative: 0.0 0.0; to: "bg"; + } + rel2 { + relative: 1.0 1.0; to: "bg"; + } + } + description { state: "selected"; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + part { name: "elm.thumbnail"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 1 0; + visible: 1; + align: 0.0 0.0; + color : 255 255 255 255; + rel1 { + relative: 0.0 0.0; to: "thumbnail_bg"; + } + rel2 { + relative: 1.0 1.0; to: "thumbnail_bg"; + } + } + description { state: "selected"; + inherit: "default" 0.0; + } + } + part { name: "page_title"; + type: TEXT; + description { state: "default" 0.0; + align: 0.5 0.5; + rel1 { + to: "thumbnail_bg"; + relative: 0.0 0.0; + offset: 0 0; + } + rel2 { + to: "thumbnail_bg"; + relative: 1.0 1.0; + } + color: 51 51 51 255; + text { + text: "Web page title"; + font: "Sans"; + size: 32; + align: 0.5 0.5; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + //color: highlightTextColor; + } + } + part { name: "elm.thumbButton"; + type: SWALLOW; + mouse_events: 1; + description { state: "default" 0.0; + rel1.to: "elm.thumbnail"; + rel2.to: "elm.thumbnail"; + } + } + part { name: "over"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "thumbnail_bg"; + rel2.to: "thumbnail_bg"; + } + } + } + programs{ + program { + name: "mouse_click_newtab"; + signal: "mouse,clicked,1"; + source: "over"; + script { + emit("elm,action,click", ""); + } + } + program { + name: "mouse_click_thumbbutton"; + signal: "mouse,clicked"; + source: "elm.thumbButton"; + script { + emit("clicked", "elm.thumbButton"); + } + } + program { name: "mouse_in"; + signal: "mouse,in"; + source: "over"; + action: STATE_SET "selected" 0.0; + target: "thumbnail_bg"; + target: "page_title"; + } + program { name: "mouse_out"; + signal: "mouse,out"; + source: "over"; + action: STATE_SET "default" 0.0; + target: "thumbnail_bg"; + target: "page_title"; + } + } +} + + +group{ + name: "elm/button/base/hidden_bm_button"; + parts{ + part{ + name: "button"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + color: 0 0 0 0; + } + } + part{ + name: "over"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "button";} + rel2 { relative: 1.0 1.0;to: "button";} + color: 0 0 0 0; + } + } + } + programs{ + program { + name: "mouse_click"; + signal: "mouse,clicked,1"; + source: "over"; + script { + emit("elm,action,click", ""); + } + } + } + } +group { name: "elm/button/base/elm.thumbButton"; + images { + image: "ico_delete.png" COMP; + } + parts { + part { name: "elm.swallow.content"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + align: 0.0 0.0; + } + } + } + + programs { + program { name: "mouse,clicked"; + signal: "mouse,down,1"; + source: "elm.swallow.content"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + } + +} diff --git a/services/MoreMenuUI/edc/MoreMenu.edc b/services/MoreMenuUI/edc/MoreMenu.edc new file mode 100644 index 0000000..e7b67a7 --- /dev/null +++ b/services/MoreMenuUI/edc/MoreMenu.edc @@ -0,0 +1,969 @@ +#define DEBUG_RECT_OVER(over_part, r, g, b) \ + part { name: __CONCAT("dbg_rect_at_", __stringify(__LINE__)); \ + \ +scale:1; \ + type : RECT; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + visible: 1; \ + color: r g b 128; \ + rel1 { to: over_part; relative: 0 0; } \ + rel2 { to: over_part; relative: 1 1; } \ + } \ + } + +#define RESOURCE_IMAGE_LOSSY( FILE_NAME ) \ + group { \ + name: FILE_NAME; \ + images.image: FILE_NAME LOSSY 100; \ + parts { \ + part { name: "image"; \ + description { \ + state: "default" 0.0; \ + image.normal: FILE_NAME; \ + aspect: 1 1; \ + aspect_preference: BOTH; \ + } \ + } \ + } \ + } + +collections { + +RESOURCE_IMAGE_LOSSY("ic_more_readermode_nor.png") +RESOURCE_IMAGE_LOSSY("ic_more_bookmark_nor.png") +RESOURCE_IMAGE_LOSSY("ic_more_history_nor.png") +RESOURCE_IMAGE_LOSSY("ic_more_zoom_nor.png") +RESOURCE_IMAGE_LOSSY("ic_more_minibrowser_nor.png") +RESOURCE_IMAGE_LOSSY("ic_more_focusmode_nor.png") +RESOURCE_IMAGE_LOSSY("ic_more_mobileview_nor.png") +RESOURCE_IMAGE_LOSSY("ic_more_share_nor.png") +RESOURCE_IMAGE_LOSSY("ic_more_setting_nor.png") +RESOURCE_IMAGE_LOSSY("ic_more_exit_nor.png") +RESOURCE_IMAGE_LOSSY("ic_add_bookmark.png") +RESOURCE_IMAGE_LOSSY("ic_more_readermode_foc.png") +RESOURCE_IMAGE_LOSSY("ic_more_bookmark_foc.png") +RESOURCE_IMAGE_LOSSY("ic_more_history_foc.png") +RESOURCE_IMAGE_LOSSY("ic_more_zoom_foc.png") +RESOURCE_IMAGE_LOSSY("ic_more_minibrowser_foc.png") +RESOURCE_IMAGE_LOSSY("ic_more_focusmode_foc.png") +RESOURCE_IMAGE_LOSSY("ic_more_mobileview_foc.png") +RESOURCE_IMAGE_LOSSY("ic_more_share_foc.png") +RESOURCE_IMAGE_LOSSY("ic_more_setting_foc.png") +RESOURCE_IMAGE_LOSSY("ic_more_exit_foc.png") +RESOURCE_IMAGE_LOSSY("favicon.png") + +#define WIDTH 1920 +#define HEIGHT 366 +#define ITEM_WIDTH 1200 + + group { + name: "elm/genlist/item/current_tab/default"; + min: WIDTH HEIGHT; + max: WIDTH HEIGHT; + images { + image: "ico_delete.png" COMP; + image: "ic_add_bookmark" COMP; + image: "thumbnail.png" COMP; + image: "btn_bar_stop_nor.png" COMP; + } + data.item: "texts" "webpage_title webpage_url"; + data.item: "contents" "favicon star_click close_click"; + color_classes{ + color_class{ + name: "defaultBgColor"; + color: 18 22 34 255; + } + color_class{ + name: "focusBgColor"; + color: 69 143 255 255; + } + color_class{ + name: "highlightBgColor"; + color: 69 143 255 102; + } + color_class{ + name: "imageHighlight"; + color: 255 255 255 102; + } + color_class{ + name: "focusDelBgColor"; + color: 96 114 146 255; + } + color_class{ + name: "titleTextColor"; + color: 74 74 74 255; + } + color_class{ + name: "focusTextColor"; + color: 255 255 255 255; + } + color_class{ + name: "highlightTextColor"; + color: 255 255 255 51; + } + color_class{ + name: "urlTextColor"; + color: 116 116 116 204; + } + color_class{ + name: "transparent"; + color: 0 0 0 0; + } + } + parts { + part { + name: "bg_rect"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + color: 231 231 231 255; + align: 0 0; + min: 1920 366; + max: 1920 366; + rel1 { relative: 0.0 0.0; offset: 0 0;} + } + } + part { + name: "action_bar_bg"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 1920 104; + max: 1920 104; + align: 0 0; + rel1 { relative: 0.0 0.0;to: "bg_rect"; offset: 0 0;} + rel2 { relative: 1.0 1.0;to: "bg_rect";} + color : 255 255 255 255; + } + } + part { name: "action_bar_shadow"; + type: IMAGE; + scale: 1; + repeat_events: 1; + description { + state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + fixed: 0 0; + min: 1920 14; + max: 1920 14; + image.normal: "web_shadow.png"; + rel1 { relative: 0.0 1.0; to: "action_bar_bg"; } + rel2 { relative: 1.0 1.0; } + } + } + part { name: "moremenu_title"; + scale: 1; + type: TEXT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 500 58; + max: 500 58; + align: 0.5 0.5; + rel1 { relative: 0.0 0.0; to: "action_bar_bg";} + rel2 { relative: 1.0 1.0; to: "action_bar_bg";} + color_class: titleTextColor; + text { + text: "More menu"; + font: "Sans"; + size: 58; + align: 0.5 0.5; + } + } + } + part { + name: "close_bg"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0.5; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "action_bar_bg"; offset: 1758 0;} + rel2 { relative: 1.0 1.0; to: "action_bar_bg";} + color_class: transparent; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusDelBgColor; + visible: 1; + } + } + part { + name: "close_icon"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "close_bg";} + rel2 { relative: 1.0 1.0; to: "close_bg";} + image.normal: "btn_bar_stop_nor.png"; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { state: "focus" 0.0; + inherit: "highlight" 0.0; + } + } + part { + name: "close_over"; + scale:1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "close_bg";} + rel2 { relative: 1.0 1.0; to: "close_bg";} + color_class: transparent; + } + } + part { + name: "close_click"; + scale:1; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "close_over";} + rel2 { relative: 1.0 1.0; to: "close_over";} + color_class: transparent; + } + } + part { + name: "item_background"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 1200 78; + max: 1200 78; + align: 0 0; + rel1 { relative: 0.0 0.0;to: "bg_rect"; offset: 62 190;} + rel2 { relative: 1.0 1.0;to: "bg_rect";} + color : 231 231 231 231; + //color_class: defaultBgColor; + } + } + //SPACER_ITEM_BR("horizontal_line", ITEM_WIDTH, 2, "bg_rect") + part { + name: "favicon_bg"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 0; + min: 58 58; + max: 58 58; + align: 0.0 0.5; + rel1 { relative: 0.0 0.0; to: "item_background";} + rel2 { relative: 1.0 1.0; to: "item_background";} + color_class: transparent; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: imageHighlight; + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusTextColor; + } + } + part { + name: "favicon"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 58 58; + max: 58 58; + align: 0.0 0.0; + rel1 { relative: 0.0 0.0; to: "favicon_bg";} + rel2 { relative: 1.0 1.0; to: "favicon_bg";} + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: imageHighlight; + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusTextColor; + } + } + part { + name: "webpage_title"; + scale: 1; + type: TEXT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 216 36; + max: 216 36; + align: 0 0.0; + rel1 { relative: 0.0 0.0; to: "item_background"; offset: 98 0;} + rel2 { relative: 1.0 1.0; to: "item_background";} + color_class: titleTextColor; + text { + text: "Web page title"; + font: "font_name"; + size: 36; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: highlightTextColor; + } + } + part { + name: "webpage_url"; + scale: 1; + type: TEXT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 765 27; + max: 765 27; + align: 0 0; + rel1 { relative: 0.0 0.0; to: "item_background"; offset: 98 51;} + rel2 { relative: 1.0 1.0; to: "item_background";} + color_class: urlTextColor; + text { + text: "http:/onet.pl"; + font: "font_name"; + size: 27; + align: 0 0.5; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusTextColor; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: highlightTextColor; + } + } + part { + name: "star_bg"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + min: 338 58; + max: 338 58; + rel1 { relative: 0.0 0.0; to: "bg_rect"; offset: 1519 200;} + rel2 { relative: 1.0 1.0; to: "bg_rect";} + color: 255 255 255 255; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusDelBgColor; + visible: 1; + } + } + part{ + name: "add_to_bookmark_text"; + type: TEXT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "star_bg";} + rel2 { relative: 1.0 1.0;to: "star_bg";} + color: 0 0 0 255; + text { + text: "Add to bookmark"; + font: "Sans"; + size: 28; + align: 0.5 0.5; + } + } + } + + part { + name: "star_over"; + scale:1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 338 58; + max: 338 58; + rel1 { relative: 0.0 0.0; to: "star_bg";} + rel2 { relative: 1.0 1.0; to: "star_bg";} + color_class: transparent; + } + } + part { + name: "star_click"; + scale:1; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 338 58; + max: 338 58; + rel1 { relative: 0.0 0.0; to: "star_over";} + rel2 { relative: 1.0 1.0; to: "star_over";} + color_class: transparent; + } + } + } + programs{ + program { + name: "mouse_in_star_click"; + signal: "mouse,in"; + source: "star_click"; + script { + emit("mouse_in_star_click", ""); + } + } + program { + name: "mouse_out_star_click"; + signal: "mouse,out"; + source: "star_click"; + script { + emit("mouse_out_star_click", ""); + } + } + program { + name: "mouse_in_star"; + signal: "mouse_in_star_click"; + source: ""; + action: STATE_SET "highlight" 0.0; + //target: "item_background"; + //target: "favicon"; + //target: "webpage_title"; + //target: "webpage_url"; + target: "star_bg"; + //target: "star_icon"; + //target: "over"; + } + program { + name: "mouse_out_star"; + signal: "mouse_out_star_click"; + source: ""; + action: STATE_SET "default" 0.0; + //target: "item_background"; + //target: "favicon"; + //target: "webpage_title"; + //target: "webpage_url"; + target: "star_bg"; + //target: "star_icon"; + //target: "over"; + } + program { + name: "mouse_in_close_click"; + signal: "mouse,in"; + source: "close_click"; + script { + emit("mouse_in_close_click", ""); + } + } + program { + name: "mouse_out_close_click"; + signal: "mouse,out"; + source: "close_click"; + script { + emit("mouse_out_close_click", ""); + } + } + program { + name: "mouse_in_close"; + signal: "mouse_in_close_click"; + source: ""; + action: STATE_SET "highlight" 0.0; + //target: "item_background"; + //target: "favicon"; + //target: "webpage_title"; + //target: "webpage_url"; + //target: "star_bg"; + //target: "star_icon"; + //target: "over"; + target: "close_over"; + target: "close_bg"; + target: "close_icon"; + } + program { + name: "mouse_out_close"; + signal: "mouse_out_close_click"; + source: ""; + action: STATE_SET "default" 0.0; + //target: "item_background"; + //target: "favicon"; + //target: "webpage_title"; + //target: "webpage_url"; + //target: "star_bg"; + //target: "star_icon"; + //target: "over"; + target: "close_over"; + target: "close_bg"; + target: "close_icon"; + } + } + } + + group{ + name: "elm/button/base/hidden_button"; + parts{ + part{ + name: "button"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + color: 0 0 0 0; + } + } + part{ + name: "over"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "button";} + rel2 { relative: 1.0 1.0;to: "button";} + color: 0 0 0 0; + } + } + } + programs{ + program { + name: "mouse_click"; + signal: "mouse,clicked,1"; + source: "over"; + script { + emit("elm,action,click", ""); + } + } + } + } + +group { name: "elm/button/base/clickButton"; + images { + image: "ico_delete.png" COMP; + } + parts { + part { name: "elm.swallow.content"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + align: 0.0 0.0; + } + } + } + + programs { + program { name: "mouse,clicked"; + signal: "mouse,down,1"; + source: "elm.swallow.content"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + } +} + +group { + name: "moremenu-layout"; + data { + item: "highlight_focus" "off"; + } + + images { + image: "web_shadow.png" COMP; + } + parts { + part { name: "genlist_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + min: 1920 366; + max: 1920 366; + color: 70 143 254 255; + rel1 { + relative: 0 0; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "gengrid_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + min: 1920 714; + max: 1920 714; + color: 231 231 231 255; + rel1 { + relative: 0 1; to: "genlist_bg"; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "elm.swallow.genlist"; + type : SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 1920 366; + max: 1920 366; + align: 0.0 0.0; + fixed: 0 0; + rel1 { relative: 0.0 0.0; to: "genlist_bg";} + rel2 { relative: 1.0 1.0; } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "elm.swallow.grid"; + type : SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 1920 714; + max: 1920 714; + align: 0.0 0.0; + fixed: 0 0; + rel1 { relative: 0.0 0.0; to: "gengrid_bg"; offset: 63 0;} + rel2 { relative: 1.0 1.0; } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "elm.swallow.empty"; + type: SWALLOW; + description { state: "default" 0.0; + align: 0.5 0.5; + rel1 { + relative: 0.5 0.5; + } + rel2 { + relative: 0.5 0.5; + } + } + } + part {name: "popup_bg"; + type: RECT; + scale: 1; + mouse_events: 1; + description {state: "default" 0.0; + visible: 0; + align: 0.0 0.0; + min: 1920 1080; + max: 1920 1080; + fixed: 1 1; + color: 0 0 0 102; + rel1 {relative: 0.0 0.0; } + rel2 {relative: 1.0 1.0; } + } + description {state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + part { name: "popup"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + visible: 0; + min: 740 658; + max: 740 884; + fixed: 1 1; + align: 0.5 0.5; + rel1 { relative: 0.0 0.0; to: "popup_bg";} + rel2 { relative: 1.0 1.0; to: "popup_bg";} + } + description { state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + max: 1920 1080; + } + } + } + programs{ + program {name: "show_popup"; + signal: "elm,state,show"; source: "elm"; + action: STATE_SET "visible" 0.0; + transition: LINEAR 0.0; + target: "popup"; + target: "popup_bg"; + } + program {name: "hide_popup"; + signal: "elm,state,hide"; source: "elm"; + action: STATE_SET "default" 0.0; + transition: LINEAR 0.0; + target: "popup"; + target: "popup_bg"; + } + + } + + } +} + +group { name: "elm/gengrid/item/menu_item/default"; + data.item: "texts" "menu_label"; + data.item: "contents" "thumbnail_item thumbbutton_item"; + images { + image: "web_frame_selected.png" COMP; + image: "ico_bg_round_shape_37x37.png" COMP; + } + styles { + style { name: "textblock_white"; + base: "font=Sans font_size="20" color=#5c5c5c"; + } + } + styles { + style { name: "textblock_white_bold"; + base: "font=Sans:style=Bold font_size="20" color=#5c5c5c"; + } + } + parts { + part { name: "thumbnail_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + min: 338 294; + max: 338 294; + visible: 1; + color: 255 255 255 255; + rel1.offset: -26 -26; + } + description { state: "selected"; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "thumbnail_item"; + type: SWALLOW; + description { state: "default" 0.0; + fixed: 1 0; + align: 0.0 0.0; + //color : 255 255 255 255; + min: 338 207; + max: 338 207; + rel1 { + relative: 0.0 0.0; to: "thumbnail_bg"; + } + rel2 { + relative: 1.0 1.0; to: "thumbnail_bg"; + } + } + description { state: "selected"; + inherit: "default" 0.0; + } + } + + part { name: "highlight_focus"; + type: IMAGE; + description { state: "default" 0.0; + rel1 { + to: "thumbnail_item"; + relative: 0.0 0.0; + } + rel2 { + to: "thumbnail_item"; + relative: 1.0 1.0; + } + image.normal: "web_frame_selected.png"; + image.border: 8 8 8 0; + image.border_scale: 1; + image.middle: NONE; + visible: 0; + } + description { state: "selected"; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "menu_label_bg"; + type: RECT; + description { state: "default" 0.0; + min: 338 87; + max: 338 87; + align: 0.0 0.0; + color: 255 255 255 255; + rel1 { + to: "thumbnail_item"; + relative: 0.0 1.0; + } + rel2 { + relative: 1.0 1.0; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "menu_label"; + type: TEXT; + description { state: "default" 0.0; + min: 338 87; + max: 338 87; + align: 0 0; + fixed: 0 0; + visible: 1; + rel1 { + to: "menu_label_bg"; + relative: 0.0 0.0; + } + rel2 { + to: "menu_label_bg"; + relative: 1.0 1.0; + } + color: 92 92 92 255; + text { + text: "Web page title"; + font: "Sans"; + size: 28; + align: 0.5 0.5; + } + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + } + } + + part { name: "thumbbutton_item"; + type: SWALLOW; + description { state: "default" 0.0; + rel1.to: "thumbnail_bg"; + rel2.to: "thumbnail_bg"; + } + } + + part { name: "over2"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "thumbnail_bg"; + rel2.to: "menu_label_bg"; + } + } + part { name: "over3"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + rel1.to: "menu_label_bg"; + rel2.to: "menu_label_bg"; + } + } + } + + programs{ + program { name: "mouse_in"; + signal: "mouse,in"; + source: "over2"; + action: STATE_SET "selected" 0.0; + target: "menu_label_bg"; + target: "highlight_focus"; + target: "thumbnail_bg"; + target: "menu_label"; + } + program { name: "mouse_out"; + signal: "mouse,out"; + source: "over2"; + action: STATE_SET "default" 0.0; + target: "menu_label_bg"; + target: "highlight_focus"; + target: "thumbnail_bg"; + target: "menu_label"; + } + } +} +} diff --git a/services/MoreMenuUI/edc/NewFolderPopup.edc b/services/MoreMenuUI/edc/NewFolderPopup.edc new file mode 100644 index 0000000..7be85ae --- /dev/null +++ b/services/MoreMenuUI/edc/NewFolderPopup.edc @@ -0,0 +1,463 @@ +#define CONTENT_HEIGHT 99; +#define POPUP_EDITFIELD_LAYOUT_MINMAX_HEIGHT_INC 40 +#define POPUP_CONTENT_DEFAULT_PADDING_LEFT_MIN_INC 65 +#define POPUP_CONTENT_DEFAULT_PADDING_RIGHT_MIN_INC 65 +#define CONTENT_BG_HEIGHT (CONTENT_HEIGHT+294); +#define DEBUG_RECT_OVER(over_part, r, g, b) \ + part { name: __CONCAT("dbg_rect_at_", __stringify(__LINE__)); \ + \ +scale:1; \ + type : RECT; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + visible: 1; \ + color: r g b 128; \ + rel1 { to: over_part; relative: 0 0; } \ + rel2 { to: over_part; relative: 1 1; } \ + } \ + } +#define SPACER_ITEM_BR(spacer_name, W, H, elem) \ + part { name: spacer_name; \ + type: RECT; \ + scale:1; \ + description { \ + state: "default" 0.0; \ + visible: 1; \ + align: 0 0; \ + min: W H; \ + max: W H; \ + fixed: 1 1; \ + color: 227 227 227 255; \ + rel1 { relative: 0.0 1.0; to: elem;} \ + rel2 { relative: 1.0 1.0; } \ + } \ + description { \ + state: "focus" 0.0; \ + inherit: "default" 0.0; \ + color: 0 119 246 255; \ + } \ + } +#define SPACER_ITEM_HOR(spacer_name, W, H, elem) \ + part { name: spacer_name; \ + type: RECT; \ + scale:1; \ + description { \ + state: "default" 0.0; \ + visible: 1; \ + align: 0 0; \ + min: W H; \ + max: W H; \ + fixed: 1 1; \ + color: 227 227 227 255; \ + rel1 { relative: 0.0 0.0; to: elem;} \ + rel2 { relative: 1.0 1.0; to: elem;} \ + } \ + description { \ + state: "focus" 0.0; \ + inherit: "default" 0.0; \ + color: 0 119 246 255; \ + } \ + } \ + +collections{ + group { name: "new_folder_popup"; + images{ + image: "modal_dialogs_bg.png" COMP; + image: "modal_dialogs_title_bg.png" COMP; + } + parts{ +part{ name: "content_bg"; + type: RECT; + scale: 1; + description{ + state: "default" 0.0; + visible: 1; + fixed: 1 1; + color: 255 255 255 255; + align: 0.5 0.5; + min: 740 378; + max: 740 378; + rel1 {relative: 0.0 0.0;} + rel2 {relative: 1.0 1.0;} + } + } + part{ name: "title_bg"; + type: RECT; + description{ + state: "default" 0.0; + visible: 1; + color: 255 255 255 255; + min: 740 144; + max: 740 144; + align: 0.0 0; + rel1 {relative: 0.0 0.0; to: "content_bg"; offset: 0 0;} + rel2 {relative: 1.0 1.0; to: "content_bg";} + } + } + part{ name: "title_text_bm"; + type: TEXT; + description{ + state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 {relative: 0.0 0.0; to: "title_bg"; offset: 40 46;} + rel2 {relative: 1.0 1.0; to: "title_bg"; offset: -40 0;} + color: 51 51 51 255; + text{ + text: "Add New Folder"; + font: "Sans"; + size: 42; + align: 0.5 0.0; + } + } + } + part{ name: "sub_title_text_bm"; + type: TEXT; + description{ + state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 {relative: 0.0 0.0; to: "title_bg"; offset: 40 112;} + rel2 {relative: 1.0 1.0; to: "title_bg"; offset: -40 0;} + color: 104 104 104 255; + text{ + text: "Add folder for adding to bookmark"; + font: "Sans"; + size: 32; + align: 0.5 0.0; + } + } + } + part{ name: "content"; + type: SWALLOW; + scale: 1; + description{ + state: "default" 0.0; + visible: 1; + rel1 {relative: 0.0 1.0; to: "title_bg"; offset: 100 0;} + rel2 {relative: 1.0 1.0;} + fixed: 1 1; + color: 0 0 0 255; + align: 0.0 0.0; + min: 540 144; + max: 540 144; + } + } + SPACER_ITEM_BR("horizontal_line", 740, 1, "content") + part{ + name: "buttons"; + type: SWALLOW; + scale: 1; + description{ + state: "default" 0.0; + visible: 1; + rel1 {relative: 0.0 1.0; to: "content"; offset: -100 1;} + rel2 {relative: 1.0 1.0;} + align: 0.0 0.0; + min: 740 90; + max: 740 90; + } + } + } + } + /*****************************************************************/ + group { + name: "elm/button/base/bookmark_button"; + parts { + part { + name: "bg"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + align: 0.5 0.5; + fixed: 1 1; + color: 225 225 225 255; + min: 370 90; + max: 370 90; + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + color: 0 119 246 255; + } + description { state: "dim" 0.0; + inherit: "default" 0.0; + color: 225 225 225 102; + } + } + SPACER_ITEM_HOR("vertical_line", 1, 90,"bg") + part { + name: "elm.text"; + type: TEXT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0.5 0.5; + min: 360 70; + rel1 { relative: 0.0 0.0; to: "bg"; offset: 30 0;} + rel2 { relative: 1.0 1.0; to: "bg"; offset: -30 0;} + color: 87 87 87 255; + text { + text: "dshfj"; + font: "font_name"; + size: 36; + align: 0.5 0.5; + min: 1 1; + } + } + description { state: "focus" 0.0; + inherit: "default" 0.0; + color: 255 255 255 255; + text.font: "Tizen:style=Bold"; + } + description { state: "dim" 0.0; + inherit: "default" 0.0; + color: 89 89 89 102; + } + } + part { + name: "over"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + rel1 { relative: 0.0 0.0; to: "bg";} + rel2 { relative: 1.0 1.0; to: "bg";} + color: 0 0 0 0; + } + } + } + programs{ + program { + name: "mouse_in"; + signal: "mouse,in"; + source: "over"; + action: STATE_SET "focus" 0.0; + target: "elm.text"; + target: "bg"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if(!strcmp(st, "default")) { + set_state(PART:"bg", "focus", 0.0); + set_state(PART:"elm.text", "focus", 0.0); + } + } + } + program { + name: "mouse_out"; + signal: "mouse,out"; + source: "over"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + target: "bg"; + script { + new st[31]; + new Float:vl; + get_state(PART:"elm.text", st, 30, vl); + if(!strcmp(st, "focus")) { + set_state(PART:"bg", "visible", 0.0); + set_state(PART:"elm.text", "visible", 0.0); + } + } + } + program { + name: "mouse_click"; + signal: "mouse,clicked,1"; + source: "over"; + script { + emit("elm,action,click", ""); + } + } + program { + name: "disable"; + signal: "elm,state,disabled"; + source: "elm"; + action: STATE_SET "dim" 0.0; + target: "elm.text"; + target: "bg"; + } + program { + name: "enable"; + signal: "elm,state,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.text"; + target: "bg"; + } + } + } +group { name: "elm/entry/selection/browser_entry"; + parts { + part { name: "bg"; + scale:1; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 255 255 255 255; + } + } + } +} +group { name: "elm/entry/cursor/browser_entry"; + parts { + part { name: "bg"; + scale:1; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 22 120 237 255; + min: 2 36; + max: 2 36; + visible: 0; + } + description { + state: "focused" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + programs { + program { name: "focused"; + signal: "elm,action,focus"; + source: "elm"; + action: STATE_SET "focused" 0.0; + target: "bg"; + } + program { name: "unfocused"; + signal: "elm,action,unfocus"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "bg"; + } + } +} + group { + name: "elm/entry/base-single/uri_entry_popup"; + styles { + style { + name: "browser-entry-uri-style-unselected"; + base: "font=Sans:style=SVD_Medium font_size="34" wrap=none color=#515151"; + } + style { + name: "browser-entry-uri-style-selected"; + base: "font=Sans:style=SVD_Medium font_size="34" wrap=none color=#dddddd"; + } + } + data { + item: focus_highlight "off"; + } + parts { + + part { name: "bg"; + scale:1; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 255 255 255 255; + } + } + + part { + name: "elm.guide"; + scale:1; + type: TEXTBLOCK; + mouse_events: 0; + description { state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + align: 0.0 0.0; + text { + style: "browser-entry-uri-style-unselected"; + min: 0 1; + } + } + description { state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + } + part { name: "label.text.clip"; + scale:1; + type: RECT; + description { + state: "default" 0.0; + } + } + part { + name: "elm.text"; + scale:1; + multiline: 0; + entry_mode: EDITABLE; + select_mode: DEFAULT; + cursor_mode: BEFORE; + type: TEXTBLOCK; + clip_to: "label.text.clip"; + source: "elm/entry/selection/browser_entry"; + source4: "elm/entry/cursor/browser_entry"; + description { state: "default" 0.0; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + align: 0.0 0.0; + text { + style: "browser-entry-uri-style-unselected"; + min: 0 1; + } + } + } + } + programs { + program { name: "focus"; + signal: "load"; + source: ""; + action: FOCUS_SET; + target: "elm.text"; + } + program { name: "gdisabled"; + signal: "elm,guide,disabled"; + source: "elm"; + action: STATE_SET "hidden" 0.0; + target: "elm.guide"; + } + program { name: "genabled"; + signal: "elm,guide,enabled"; + source: "elm"; + action: STATE_SET "default" 0.0; + target: "elm.guide"; + } + } +}//group + +group { + name: "popup_input_text"; + parts { + part { + name: "elm.swallow.content"; + type: SWALLOW; + scale: 1; + description { + state: "default" 0.0; + min: 0 POPUP_EDITFIELD_LAYOUT_MINMAX_HEIGHT_INC; + max: -1 POPUP_EDITFIELD_LAYOUT_MINMAX_HEIGHT_INC; + align: 0.0 0.5; + min: 0 0 ; + max: 540 100 ; + rel1 { + relative: 0.0 0.0 ; + } + rel2 { + relative: 1.0 1.0; + } + } + } + } + } + + +} diff --git a/services/MoreMenuUI/edc/error.edc b/services/MoreMenuUI/edc/error.edc new file mode 100644 index 0000000..0291971 --- /dev/null +++ b/services/MoreMenuUI/edc/error.edc @@ -0,0 +1,144 @@ +collections { + images { + image: "web_browsing_icon_error.png" COMP; + } + group { name: "error_message"; + styles { + style { name: "mssage_style"; + base: "font=Sans font_size=35 color=#d3d3d3 wrap=word align=0.5"; + } + style { name: "mssage_hint_style"; + base: "font=Sans font_size=24 color=#868686 wrap=word align=0.5"; + } + } + parts { + part{ + name: "message_background"; + type: RECT; + description{ + state: "default" 0.0; + visible: 1; + rel1.relative: 0 0; + rel2.relative: 1 1; + color: 42 50 64 255; + } + } + part{ + name: "error_message_background"; + type:RECT; + description{ + state: "default" 0.0; + visible: 1; + min: 1582 730; + max: 1582 730; + fixed: 1 1; + align: 0.5 0.5; + color: 30 38 50 153; + } + } + part{ + name: "err_ico"; + type: IMAGE; + description{ + state: "default" 0.0; + visible: 1; + min: 140 140; + max:140 140; + fixed: 1 1; + align: 0.5 0; + rel1{ + relative: 0 0; + offset:0 163; + to: "error_message_background"; + } + rel2{ + relative: 1 1; + to: "error_message_background"; + } + image{ + normal: "web_browsing_icon_error.png"; + } + } + } + + part{ + name: "error_text"; + type: TEXTBLOCK; + description{ + state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 1502 96; + max: 1502 96; + //color: 211 211 211 255; + align: 0.5 0; + rel1{ + relative: 0 1; + to_x: "error_message_background"; + to_y: "err_ico"; + } + rel2{ + relative: 1 1; + to: "error_message_background"; + } + text{ + style: "mssage_style"; + text: "Server not found.
sdf Please check the followings:"; + //min: 0 0; + //max: 1 1; + //align: 1 0; + //size: 35; + } + } + } + + + part{ + name: "error_hint"; + type: TEXTBLOCK; + description{ + state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 1502 117; + max: 1502 117; + color: 134 134 134 255; + align: 0.5 0; + rel1{ + relative: 0 1; + to_x: "error_message_background"; + to_y: "error_text"; + } + rel2{ + relative: 1 1; + to: "error_message_background"; + } + text{ + max: 0 1; + style: "mssage_hint_style"; + text: "Check for any typing error in URL.
" + "Check your network settings.
" + "Try again later.
" + "Click refresh to reload."; + } + } + } + } +/* + programs { + program { name: "mouse_down"; + signal: "mouse,down,1"; + source: "logo"; + action: STATE_SET "hide" 0.0; + target: "logo"; + } + program { name: "mouse_up"; + signal: "mouse,up,1"; + source: "logo"; + action: STATE_SET "default" 0.0; + target: "logo"; + } + } +*/ + } +} diff --git a/services/MoreMenuUI/images/btn_bar_new_dis.png b/services/MoreMenuUI/images/btn_bar_new_dis.png new file mode 100644 index 0000000000000000000000000000000000000000..af49c5af52731fb146af572791cd28382e524afb GIT binary patch literal 2980 zcmZ8jcRUn+AODK%m6@c@9@#USJLBwda!9r#=_tRf=#ql)ashc}8}K zo{T8t9=)DFe$Vs#@%g-8ug~ZGS?|9-akotM8ECK20st5c;5ruP_{ZF-DbGE!ryFt( zG(K>fM*z^V{xLF;lXn>aS~E`=?A9$0v>*DB2igZ>0E0n%9-`en@4EpIFoU&3AuKmI z)DP$Pp+>Qo=SFA?c4~+PGy%hwDkR2B!)zGKTR6>b-gZe>mx8;uAeKBS36scfE>0g$ zJ4Lm^`!XrwRcw6!@nY~RuZiZvwV|{6NsaZ&J#5`DRVy`p23*cu0YhH~y>{tKL{De; z;)-c)zohAwNiZmWC3Gz)S%TQw^jOT42fwIntg{16G_(U zmwMBP8p8&(f|8)cKueDdgUu4M1O*hpalplS8QhWpj>1pZ#sCI;lpRb4?4I+olNF=_ z2&-GH4)9O~mBY8=bpcWuu(=y`DuXErAZ=jn4hJ<2pq0Q(R|}}=fwXySlqjGG29CY_ z`~e^`8?fo^TC4rIQO&$AcCJ)*tr}iHSvSm%TEdsg+FJ6O2*H5!2AiVO1*aS>$@ai( zF4-`7rZ0Pg02HLMpI^Io8bDyICJ+>paEuNTn;$7je9q3xXRE^%K3V`Q`h||1iA&X8 z!KhMVyw6?=?ofE#r7QUBFu}c+Nvj?dY|L2i`TWsFw=e}iJ-xcJGG*8awR7sX4mm@$ zJG5G#-v1S?4brgryxwMMw@%T?Xq|) z<<+)}vu$)Ij*5{`fzEa)GnCd9bM>L4Xk|E5BzmZZN6b;`vlfqhtGP#Xnh&F7yVZL} zbswhRPSp8rBF$km6xzMitWLZ$v1HEiNd6>h&g`fo-ZnS|OM(ETFP6=m&nQ&^E@Kgo zfLOtKcGVwVP>#8y*O;o>3uMDjqMP+)o`=<%tAD1ihv7?=u0-m+r2FLRCzF%RQIPxT z;kzs9iHe2mpDH|2MFNItckiRrTqeMd9WB;b%lGw><&ua+|2;#lRpwRsRZ6!kS#7IVITmxJ zg@{WE$+pm{LY&1L^O#ar`M+|Mhaxx(jEbsWrjK3m;Pg23eDl?>@zPxSHPg&b)}sR( z`d>4@lJEP|GeomT^u(e>xN!%hZ*d(dBIzU<>qb(oeNi8fHZ-=IzJQi!p zI^}6fP%kelREEhJ%30T0>^*naq*~7MJ<9VlrCAp#$=nN#pJ)3nx+Kb7EN_gLal7MH zo{^b>tbkXTSLkoGC{}NmV2fLHn{1B57`1y0h3^RKqml_1vFn!8mUAVvB^)N|DhJh) z( zqSbh$dWb*FVfGzbup*~)r_9C3RQ!nAt8u-*^_UVpyYDOuEPHo*cfS&%6yg;!GTAiQ z$+0lO7mF6F8mk)j3=Iyw9Gb{h$W@n_lwHqV&z;O&XmGR*uocIZ;@-O%)UMbT+w9<) zA4J(I+Y}+KZ0+mxs<2gp6HQf3C6`L@rfH@X`4gy)njg46Tv-EG&FT~-u^Q)%3vog@ zbD|o$sylYlTGB!qL;gNhr(%eiW~|_`tyK6=b~iHl;21gDu`*6 zOWsqPQEHTL)a;gYw;3EqVvz>-jjk$7id8Es@sYx1Db2Oj;DlIY*&r(x-q2;_LX*kp-YR&!e zK&4w$?OE4@ga)Z==~R7Qbt#n>Z6s)M(BiKMTaigIs#=trwfo1RxPIk~iu@Zx+kl zR)@9-1(|q--EHd+Z>uNs+M=_fU5yIanw{LXH$zId9pu*bz$vk^Hn*`H2{ z%m%D-$DsQ^X3suCQ?Sr4XM5)Xn z5n@vW4u*gAQSE)RTS*^bNL3T@8nKV~jZoYfovU}6JbEy)!yVlGQ~ujH(XRRMRHN?$ z(TdEC7HWxFlX?Hd|^?ml~y;lE%y^&e{L&~U#;j`3(WG2|f1^|Ca1F-1`fJznsoako`U3%x-VFMj)M8M3qSzZR-41-0z+hhBZ6o&wIcR;rA^;DgpkaBf6;2_V0?`gJ8p@iZ(zJI7UMW+KqGDrLM&i88)HWb|mO1l6L>p zn}(EVW}q3I1T6-dx+G{!mY@a5Cj$-x&Q8nVmN;+_db&0S(3s=w5E5Yfl81#PKNUc( zy2NP%Hx*Dhd^dzb1jO(Hom&&eF#qlfYgxgYz`%+k0Nn97k>$BZpR&c!Jn4>At8I;W- z6E4T_ZGRAe{8W~UZTHUt@$}Vryh0L|{;v4uM{**slhg9~>TrdRCIE~6VI${alJ%Tu z6>_xKd7;1#ncE$j{6|NLu5}EW4IqDG#%kZ^?`?DnQgGALt1By02Hj9w$9}8Ob5!Tu zcB`}dzr$2dj}E`JE%ArT*oW(p9e?W_JTNM{HvEDr%4v2jS?{!whIq<7#@ns$ghPrl zFPky>CTZt9+m|WgjfcJv`6Mt(ytlL-kBhO46iBkfSFNu;ZJNlTX15U=2$Pf7($85%Hm?{sKHcvo6 zEaBXHYJQiLV(oOBQdRnZOvGtSi=On$@H#WKue1#?T&W^wlx`u-mwW!wImxW~xnKO= zbE-X4C|Lhe;l?nNtPbmyYX8noA=`alN}{I=T6DRtRj53Ytjy^Ew+Yl?um4kEgrG1{c=UGRg z^im9Rqc3^|v(mL9yTY}?vu8_Dz{4Rk|m>M`6kDFuCxGg zMLyXET2+8Ge`gk3dR6XGj?z#htG;1TRbl!VryHBwk^8&v{!Lfr(yyCjez6)I*wFi) z`JMD2fR-+XC9*dTCCrh_PQi}i2w;DgWmL>DmdMeIkW!T1%39B6$o95Gieg2du%z}= zryHaTrgMo(BFf5(%je5!EcY!35XohCEJCYwEoCj1%c#C)R9Kc{Zf#j`S)j^PN@L4W zrQQgQw_(<2@#NNBMqQ?`w`TdZcb8jwAT-V#^?_nMo^%y4kHY1<1#5?IR4Q&n_072Mb6tjK?mc$P{L5ZFUOjIF$pv`?4UIRAcXG^) zam6CVDn=?sy+eaTg+mkB^0{i#lQQeM>$#J;3ylsofi_~;QtSs8{kj#KV(T4j%Y$ee zCF>%jrHy^PZWX3VV4}IIx#UU-&LqvGB5wlKRr3@38C%xKQL{QlPN>FuVM85JPHd>g zPt{#JX{~9YO`*@v)F|j;r|B!WZMef8zV~BRzO6i;gMYQ75&G#MV?z>!9A+Gzl3m7L z9T4eu$5`Z!>7m$AxQCJZaf$JU5d#vL>JqtJJ#&4nD+d0DzV?g3qlcK>`rOX#Qo_3( zg&p^u*xA>Ea<4`5tYsg5>FR@hGg}?epn07x<+)H9W(qS6M>VYTNjgiWT2)QfG!_Mv zA35%_ssB>6I_1PO>b*G%g1T4XeCEfMXYvI@woNnGHI7K?;BoIk`S#{cyPaM;dFaHb_ugYvmC;fCD~{16I6ijJcuq~ zEt6mpQ_j#diZi+S@?TnvqNS|Q1oo~52qaMlb#iy2cqK;^M&hPmcB0o!_TZw%!7qNK zw#WzZf08W{Tg62Qm8G;8(HYI{*{udD&W=8VfD{j<6A)6s4#`xmdY=9E$H(%BaY@F|<8c-%m(U ze6{N)nZ$7GiXmKg|j2}|bK)gj9ApRf}c1GtK94C(-jO=iQwEU9$F;1{;IXYAS+(xh@ zu{0ic9d|j=KdC>`sE#k+ILCyN8 z({_&84G^bOptF4bs%MGMM>}X`a8(evc__>4Dpr5S7iSaxowYk>)VDF<(M~4fnb76i$XZV5U=>Vafsut6h zy9b)vTGOz(*l`Wp^VzB0*{2@u0r~qQvwBD5(UHUFsfWo7u*=EW$pbNTFW% zH2lssPD^0J_l5=Y*v<>j2dddvCBu%#wqfyC%9+s04jYwE%Ph<6KCkQ~^D;5CAO+BE{yLa8a{k@;Kd;4(dL!n$ge%@{#k6Zx=oJUz8U>4g< zswYcF5W_fRhM~7PBPo|TBoWDwCLqF1Mr#nqT{OpN)4bo6PGY_wi5EjbGq$hbM&%lMs2J55Y;$F(n(60r6*%1hor24aMFE^9O&&| zSr^v`C+G74w4{v>xSw3`5`fb%6_wjOog^KAAaIg`6m%NrcS_!j#nbFSa_tC^Q3Rd- zX?F}skqkg1I2lq3G;|1%s2l+cP)GzEhh3c4z+ExmDEMM?5+G5hxgi9=HiMgypfC+^ z-EfW50`AJ7dhA|;Hh@b41~e|%_&bqygMkD zRXSXj=Ih}I0EKCcS85M00#~@CpUC|_Md8zvM7IVSjV4gIJ#TgB^T!+QqEyV>+{XI)tU)it)@jHp^b*nS z&}nt?=vSD^`N{Fuj#a*JY5QmoYO|0DBh481LAT8X#bM*v( zgI4dZFG8e*NcYHkxJ^$XoXet>k-f9VUreJwt5*ifVT04V@kh2bJ~n(RkiETWyn zH@mJcbWxl;%11%?db=UC5b_7en|_YM)e#V(n9({85l4wH8XU5nX6`ZRKGfpfmLI59 zeQ16=krs3bwS|)rX%3R!aN?eiBXCZD^Cpur=SH7$cj*z)C-QN9ieoV2F-()wlQK_$ zaarnd9H{zTQ;fCKX-QKa1kw@bF>Sh18Q~3Ps$VFZpqO$6wkVxqiq8-HrSejk3iChv zy=PNRk}ul&T;)zPpP~jGknH@%LL$@qNK(AN2U34Wlq}t4xSpq)vZ|l0?p`%vYy7dx zSbYEyeYkcfnLJSdgv*IjQx9$gH<{Hd=eo%!OE*uZKt>p4)-A}BUT*kapoQ*NFN?FZ zR4iOily{mw<%R@pNF20RfsZ~ODlLdfy{2FP7B)dYp)>K=oOfHaB41XIjW_+%`~%Mh z62%NruG@pr>!|gfb(wYcb?yUOa+I@%@7q(0RUz}ChX$-0v>UP;#I8BgnwD?!%oodx zV03aRHjtVkwD~);*zy~)PxBND%$^L9LF}$t& zE&ChcQ2-@X3}fU#972dSpM``4!5YBwF2|^pbuy8404Av*wVSh*OOxwu2^T?&JZDTB zBF{9)6v$*3k$_cHmR2rRQdk~Z4#QF^?puV`>R8HHtW}VG$*QufMBUxBV7EY2D3`}p zBFepC>TkoWFXD-NF!>mAnG`nf1vSQ`UHxjm_>VxES}^$OIF&OLu7(wcL@ z(VD1QSy7}2l`)X9YBWF0a8oB)%ke#ZGD^Y2fag{eyI)CZVBzg4Pt?{jS^?UWd5g-=e7BDp4G2YKJ zH^!6-mns`68x4$(j24eh=gQ@)O3g@bA+ zzA-G^>w&V!pVUP#BQQ@Q591Q!4I_rdv(?1&+4~m<+t&^JkA3Y|f+vnq`HlJAd*!%y z`||r9`>_kJM`T|M7g)^I-F^X^(e-L-aEA1uy;qJ{Ug^%8>j72*UVq z&2ZamXQ#o>xj!bWE8$#!Hq7m5CKX~d88uTPY9cneYPj78zo*u4pKRq|)36@Y(RahX zO@AhF+H^|n38NH@j*Yg8QBU@XgR_lGWy=MOFF>CxYyH;B(pt(#NSP|W6Elz#QL7Yx zs4}n6BHNsaN0sP72LERkP2p)-X`SG|}sGSI>$$_4Taq!FU zX>D>re0?${q8pef!HU#2BPyfCe5C@Wyk}fq(yB`BQjssyQhgzn+{Wo>#13N9?b&d( zYjne9-{Zt)3C>KCPo9mb)z_`X$kC9}Z!jC784;2OgsYX?$Iae%4BiL`4{QksZlhe%Ub3Ee+oxG)UiLL6UcP$+gcF1pB)rt<8O)a{jtNzmdCK(dU0v#d zTOF6E9|2-i@>G_8z3N}(_0bAi-##H*KH;QNntzrQQoTYldFvSmf<2 zRo(Am`@9S~_Fzn)fcdica=4b6Nh0iYYIg=Zo-pNV3cRy#x zr$8C0`$zZA_PPQV0yuuWS*9^vf6nzn2=D%@{@CJk*;zVkdODtnFz4{xMMeyF^>1>y z=$RV>5X=t%G7^Aa_$%B7;He}4JB|P-}=hBQ|&`aggB^%imsLd vKil+Q{{IyIcbe$`nf}abbj%U}fX5Sp=xwUu%I9RmSGs_{wux3P#4+OE&*pDL literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/btn_bar_stop_nor.png b/services/MoreMenuUI/images/btn_bar_stop_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..c5cdc11ca8ea537497a1a794d79d40362f8659a9 GIT binary patch literal 3255 zcmY+GRag}I7RCPv(%m7PA*4H{VTPC?r5sX97!XNON|0s{B&8h$q)Q10DW#i1K)R#_ z1g?aj)a88V-iPzB_xgS7ZLhr_cI;gPZ3I&WV;4^^2m%I!c=>obyFPLPz<(BFf-*JPVpKj^ zJc8jG=L%^vS$}oFvpbXwLi@2BUTwO-%x}zC1L3LPBUfgOM=#3({$# zHO_*Bh_~n$182)YZ`~$aPBw-wKTN4?Rvu#NMu^&o$9ZxOv+Jc zL}mectplXePoZk+O~LD=vTBtYdE_<2tcXRtiI7N94t^YhNr+z7{)Tz< zG}X7mApr7{8Lp>2yzs|SR^xE830O*7k?qffS6mJbtC#B|6<%rpEc=FxUJ8rVv4$!V zhPq!C+}acA? zUOf68qI7<8{O!{UPne`lm^Q)bw~nDBy`ozqDI}2&^BalU=M7|6=j`KLT?mIpb3yu5 zBU;Xo^7h?Xjx|D@(#>_$o^>;Qd1tyr5)}QX5D7U%GtM=Duw!CjcBY zd$xb&C&mwTiC7--yV_U1(9XLJLY)yQ-T>U!;1M+)s8j7F20$Y(Oz^!r+fh5Sa2w&R z_M7wVWaoCWkx-tl4k$I0^g-w?A3K4{a43KD@OySaJF%~7?9y#UF43u8l%gGGA1Rf+ zsQ%a!=eF~=gpm-a_Yu?CbIzji9A21nClE7bMV)fC!wG2Pcp&{~dLu5~WEr@G@e5Ok z8Jzt<+2@9QjI~x%vSJ^Q3_p)<(Uy1>R%@jEmHY#&u~d#VQmcUM%L8AD>_o=AoG(80 ztjh7S`I}!VT&QLfRbaj1ZQq%Rq`Dr7i}rLvYwie>q&g1Pa8;65^sv6aSBc*od+az; z<3~UnrrAa!OW+5E*mJ1E&GpO;rs1WKTRhSo2(d|auey7jzGG{3u;9V8`U z%;Cb^leCF+V$?xsSeG0RZ7fWZuQBNcqNdPvjCM?G%)^*_OSmjY8qUg{+CTfit(Hjs zl`ur8FKP|5*10CN#|9(bt3vQE7&y-w(qDXDJuHrsfiG~bj) zCeadFm5()kXB1OPC;cQ_emH^=p<7f{kT%Zh!sK$|`tG}L6U{;zhe5^{J0@%SaTh{Z)Lp+%=&ry;D+D6htLwWS9_=Ezd#FU;viQ4#$lOs0#sW_ae=Q^DrU3-;zX z1$sDl1=`SjKh!@i}d>fD*|lA(t3>&PS$Sa=^5$f z74Qn93hkX%+3MXAOmVAbv&C5$rFyRppEaL0DiL=RvuQG8vQR==!l z->l*H*`s7HGxyW|&|E#wlEr}5%|Ew-#V$-Q-2apuYm=K3){*lN&XMDomAYlTJ(bwS zdgp!`!E8F!U`6(6_8H5O$&I5*Zzr@~YEi|z_E@j-th)EO_q^pL!9UdAk7@o|M$x)V=lHAPM%$dqrYOu5Pw-m;fVm~?|YS%1_E%vZ29#NL^ z7DeV}mNs=-RhX*Vlg(AlB{U_C2B`)Wxs#~Q_dl`y*s=ze_v_PybJbXPY_L7bfeF>n zUER5t+L{{N6#Vi+nTR50hO&a)l0D>cy$`*@J%z<=-0MBn;O?XJEish&2=&Oc)GC&4 zP@u~dW0EtjjbcJIK8`p<$HnS~4~k}}h~}{MEcCUm>G&Rd+bjo;9bcb|tn4?%SvTEvmLy=$k ziTys4$}bh4H>)bEN^*;mix##+a%~NL4TFZAp1HPBOR(qMR}ZcNuSP*h=xsa{er%X} znAMH5)4*q(pA%FS=A3@j&g`nk=QXM`s3(S3g|D|)ak}*VNUGvI+04Wx<6J4D?uLAy z{6b{EVIS8SLe3Wz6NQXcP4GgSvyMt+$oP%U!yYeb{Lx6)Sj<657|OpB(UB2UDHnaH zG%MF6-K5$h>TEGIVU96JJkq@-FDh6q>+$H*()sRT%nD|OY&D1}Q>@R%DwL>Obn#f~Ab{w-4z2ZYPiibg*}zxWq4|7p$) z&rE;9dBW)oaaMPtS{+-yb(((WZc}C8?!DWKKZbun#7&8vYWzCEKBjDHoH!}8qfOcS z*QZO&zMlw%EQQ(2*F7uTUK#;wTPGw-Cma+CvrprLDwm1I|9Z-fVi$V|%|6K1$}!14 zvvRO%G8|GFo!njwJlCH4i|Vzsl0|^dp=rPC>{j@AD(YY)9+QR%4iWu5Z#P$f4cc_X zEj^_2+;5`xT^`fCirZ9dQN&pveDpo2om;0vene)!Q?Pa4_T5&xOdU7uZGPRHUEOHy z*0>kg`XR{qWQ#3V4!3aB8t{|xYH}i1UU{MQFwpa)`{a0uaUsNq?*cd2Jmbf=SJh(J zVtb^vt3Cr;h?!8ex}2ZhpMU3U)IwD{(NIB6=tHj*7he zimK1W)_DnRwgpC z2shRTAn-N-p%DQ5zPi>e0G@~gux$r`LM8xAo+-B7S^(g!AT-oX{bzs7wIl~V6i#bk@hQ3ng@rj?q_bw^IqD zcAqLHkJCW_EgV9Uq;`XZ2k&1L#`AygA4(#CL#~N;NHZa2=F#N-ob$Pd6~a<9!|Z}< zGv)qm8J4E(X_cf^(#w_qo%v2hdc^0>lhtQT_pjtM`JVd)iiX6?(!F~ zJM%M-l1j;~rH$!%6ZVp4(I81m?nF3jwA3EV!(Q`dul#WQRN5gVM3u70wZdzUjQP!> zSZ8g~FQ54A)e+B@5DY1_b?skh|vFe|Ipv7 dn9SJ617yxM>C;IsZ(d&pKxi6hR735;{|l5<^*ESM@AT1>+@PN`oGjxd{rP3*#!w^H4NJ+@32%E!5hMO&wz8VE5e4%GTeb&rSvh2XE6!&j@Cu zr3toyLIkXCXaxKq?f^Fqj*PsYyOoWL9gNM|&cVq|mVLjejh)TOR+imROiM`1UD?jj z=}Ca6-HQNiJ(~a*8!20Mc{w&2KQJHwVh6Kg^Mkm$d4c_8+5eUc2A*$*1=-pDCV{!g zvj1b0k(Mr-GSt(KO-w+D-$qCr#3n8(01_3F5|!d(6BYsq34(+Lg(UbvLSQioun>st zzkb*OZJxIF;O8oj|4SF}Cd=*!gSmqR1$}*e1$;#Wpq>tbASo#+K_Ov5VPSrNg5S&E z4QA!X@8-qvF9|AkUN)Xi?l32)8{3UUD{H7XOqLz6^q(m}-2W}s&FjD11UO94&&pj8 zBp`G%rN0SnZT?N??(OONw{lw>K|5DFh@BhE3!nx4n-=hrme#+?|5vdP$iJz*V9)LT zdv53J1?lWrwtHfdyX5k+`-D8c2+Q`rydmQ`Y(^`IznMkFGr|5oAL`W z0T7#(m5r0z&B*`Yuv4*u*~zj4{ukyKlH>=8=z%1`AP`tooL2}0783f0R10eBWbgm~ zl1hMuCBdR1{}(9`d|NA+)&G~+)&^`3^@Laf5pcR$uY&Gw4u5OY(gLfydBLpQZ0yuk zWZ8kq2{<{~f~AC&MWhr#!YV3KLLiVTNJ&XZMM+FpTt!$!QbJNf>R-GnP#f=?IQ)y( z_P=>W{v+?rioS^ySjEoM$;Zz2u_qM5_IEVEPXE~!q5mlFzj$r`vn`}zxl{3%*ZY#TBJWtHNdeD^##W8{NbYtX%hp)*LzGvA0wvtdCkr4 zPdyP8{cI(wr(vYN#+6s2xkeCkJ94uzRc}Be9AV3A%1JIgJcF6{N`UciYMhQVY+$kH zLCe2-WBC^_8D1l&!5K?!F%}5audNQtvqgA~j{LY>NOAC`3T7IK^Synj8r}wB4V{#` z`cuVftn+Iq{s(*$&&l2S8t*h2y zWyC)pT2#j2{55oPaDH+i4Ji**&a#y5U7C@@+K)p^@D#RMr{zLQNKX(XM*}qH`?c^> ze<;qoY{5FXB{UqHs((9x@mC2U&3ULRYh8dm&btcKT+co!&xy8uw=WeMlG0OIbv+@s zcg%v5#U@w_w}dET<5UR&rV6)9_?IiNC(c9t>Yt%Sq$eU>1Q##)&ojk+yzsKfDo7Rt z<6THGv47JZ?Zo`R!*M<|-CbRUl(&6`WYt-*Ft%T+k1x3}<2ch`x~?xZYL^Z9kaI$z zS-}^F-67jJ6gdRf?u=V%m3NNB2Sc4H)=$g{UkzBR&yAFJ)?aAxQmi-46QA^jVE~5U$`f;B$;jA+^F4^27e{#>2QaR)LNYV{G~#^Ek)4gYVD(`^heOP+zj;hN!r@c>rgJSZupr=L9441Cbd`5f zF}r;W=P7M;)1@opR;bvC0<`0jd3SuN8qRtI#`#_uToBycM0yO3=LaSNr;wkO zylIO$qk|N-RZd^K7Y$5Z#R(C5h8jr9I#TAPdl%Kz46?~hcCT|Q{O{WGw)}Na5O6Bx`nv>vUvsxmHAiw~rpKEr zj9OlfjVLCWJrhngVaduf@=s>jbygv2m?I@jeaCUcf#Lk=x9z$fj`~$pcR53}^0*e` zua+5IZib4{!C=&!`}$*=3n;Odk$>tGDJyl=$g{|f`mVFH){Q`}mb}dbMXu}F9Nr^E z?<@H3syK@BF?V+rM>)3y5p;~=7K@@=yXl|SIk}MP(lG~G)9mY5q3BV9vx)8)`+?gK zuQ5vg;{y1J{imGwk-fjB757$2%8-Pqz0DJn>ZHk>Jo`m&wW=Vi5qDfTH@_cP91g;4 z(q!Z-`Uc@)k;d5$b;*UQf+mRkLDNImo=H)GcvD(((R`q#3j%FoKld3O-Elnxt8 zU@Hzu%NWfp@lS^_5t5r#AkAm?xAiYvB#Mzs+=EsjATE~Oqx8ht&98zy2aX6vZo&R2 zMT6@)MuLlIGv0b1v8&#xm>HqE!}~>yZg*|cnvGZ+g^^2Rp4Y$WTIq_eb>7O({ruoq zAn&&nv1Vt>QG8I?|2C11zcvh;-SBj}>>E=4;b1ltvmT=A=9*^KdFH3-Cmp<4Q}}%- zeDDf;j%(hOUQF84Lm(yP@k*mcPE-OZSTiqw8MzN}%DgJrRvw}`--A$h_w+^K={a6t znyx#NXfAY`1SanP;_>uc#i3cZJ=G7p5-B4Qi&1wA+^75XtLqkz*-!4&9~H$_VRF-& z>jh?X&VL7F3JfSAMin7b8)z=1=X#t`ksrFI&&o=vhlcxtcq+W;QrCAPuVg-LerCLu zNDSxCUZJ1*nJx5d=oZiXcV@`5tAvq|my;4vVOIjEh!0&Re`LwOO8?|fW>9^lGjjBW zZbag#TY*K{VgPjW$$V8=sF@3X^TO_*pExwM55YUQ>6Ll&7Vy6w_Y5D+_VkCm>={y& zNyykV-_q+GYo1v(+ppYSFvBDiM)W<8&%M5yPnN#-m&x|1wa%mRoY!(e&TGn-0W14& zk+BFH`aKVgw3DE~!&8N8uu8e|V|$Sx>-~+TH@VY0yb;Agf8ib3jxz;3*!|qs(XwU3 zV7a@}yojDqPf0sw>d*$mF@@y?!Zx# zP?*~NNn7=*4-P0<*3F^4C$u&LV#5jW(}~sn^b|;&>9y8YSjb^*=y7Mp3Ehh_0;yS9 zvC+#pUv1GkSkU8_LDTZ*HCMKE60Md~VpsCl2&b!yP_ZGGU9Eoj;taNirS2@mX6)ts za^ZyfwEW}9D{)kq8E-*ZN%t3V>>CYi=Rk{d$?;jMO>mnXgmVibQFC4O!<&tJ)cX2Y z$3nD*-dg6FhB@o+XW3IHvX%^6O|=&coa&4@N^Kq9Y;>SF+1VZQxQaht;NRjaj_b2G z4NJXaVqR~fOiHvp_bAY|4@`DE4E#|dWw~9gZCEzA`JywO{>A2D%S<+WHo5M2DVka- z{VOh(3-yYrT}Fu`QV9N+X8UEO@8-c;4miFaD`}<4jCRVLNB7@uIbcXe_SFM#X4Sv=n%eScI&-B zo&|OCFtWZ#f7kmqPG58_i~Y#uYjgK<9VpR6hr?Za4r2Q_byU^}%xoib#k{aK4t`jI zb3Pu(jitv{_+r~+6?`n|#TE&Pr9=xQ3&Hzkia+1$tZ!i0<)zyaE2Do?MX32fIqOBU zqk6uu|HJOVx2cG4Mj(o$0EqPmGaiXjA{c#x(IPc}pI&iK0oS6{JZl9Cf@kv@-CMEXO|YW6t%)|1#TzG zUvSO~tK<1cyC?TlQ&_*b=2%xRKuF?%kBYP}VvywyfsJHZ5|a?gRTXi3aGyraB+E*( z*OqSMNHP6OsBOv9yiH)dyMPPeP}m_8s>2z)itZhUt}}{T6epA z44*zK$iL(HEW2ck63uy>eQ&ozughLoTYo^gS=)m+g9n%t^Aqgg2Hi;DThBj(uovb@ zZr#$j>BDQ~m+MFVs~b`=LWok0(9T8}KG?k9E%`YRlz5SBwa`9^h&4;j(RF z7j1HZ<*~_HVeN~9=hD4IVcM#b{`~_JQ91op3oaSfcTBbP1IXlch+ujf=~6B}O+2!> zskZuHT;|Dh8STLoicf(_7B8YzlM)ovyyeKZM-C0g<4>o-Qj@!hl<30YCeougi>mp_ zT7h7UJ;0U@N|{a3@n(t7-VkiR{M{Fei?u*V0mHozyu19T!b}0#Wqlrxpn35M1vm!} z635r++MAgUOr~HN*rw_QO7z*g2F<1xz7ajWJm`R{BT1O{;~Zhs?XOQgECRI5KRuF% z62T0V5*RH~ep+OF=^m?_&)ZE!661g)h=!hSw1ngp z+wldD?^?J3l1Pq%c=0!~=$Oz+)eCQPIgku9(J?g}U(rYB0aIT|0A&NUYXYcOuu0*$ z;BoLOnh2KMx8w8N;OU%sBw!tWSjH(TbmKn4s?XV}DV082!C^*UaW7hV`ffoGw|)OL z3-j1(1qb8!%*1dThky_kO0>W&l*n;M_lUZs*4+2k3TmpabVueFxVj%8jboqNPnKDh z4Csb$G8Ak*KxU)2=J`&+X?_i_Gt~ndIgrLCk$WBCK@-(3OhhnRW73ZY!Qbj!OEY+a zyTuf;I`lP++aSyVs$o~2GplIvPl{PpXIt|-KEklZ-?^Urrpmy(MppS6$W3?a4y-{#!fcq z;SXie$XE zL@H*zFwCNx&G4Dl1Pm;8d8H6-{dv;@KFvSe=K_$4A(>sDB~{@vhmqOEuKC$Fp;kLJ z{i#=B%z$YcPIIlp-tgK$F$><`?`X{l@xgaB-Go48wDy2ovR`s_Pv&+yPmPuXb*;QX zQ&xisT5Cmy%N!8^#FY{~VLoHVhrx{dAbPq`0~a9{p5Z`LK*JUfn@Sz5(^AJ>p}O(e z9LS%-{Js(e4V8KPxXkNsNbRc^o&lqZN!ncb4*lmA+RZ!1Dp@ZMqL+i>a}!g?xJv*J zs@Fnbq`h%sfWK%A%fz8`; zARk@heSLjg<{{p==2AFJiN05w%uthzcn?ILdIgy9v(33SGRTrE6Eh8vdpW$X!L1{X z4QkuW&uLaSeBJ<&j3;i%*!RZRBP2G#K^jfWVZ*|mo|z`aubF4}ICsztC>&s9(z7yg zW{(pi;@A4E<_IVqo;f+6YoxjLH@~XgusoR%1_@}+*hb+y)d7n?#>8ar!SE9asWKTU z#LG8%&a=Bju*d9NU6a*oU&S`pj59s5Ty6;clXT;z#fE=LK5zIe7u4^qkR_tj)2eTn z^wQJJ*t11Z8mP=bE)eh>eeo%Z?ehR-Xfqf%T$r!~DBh?gjtt;uA7o8C`tr#dJ9`Nh z7R2&XW5kkASuY)kXt4rfKhPkrWLSR#*rQ&o zKBg-^YFxut~D8B*@knLFIev$N|wgXunRnTZvW za03c|QbtM&EbllY!^k2frvT0%p_Y}Xm=toPnZ6WQy(m$7$nr!Lru}?AU*ZHJDY|pV3+ff474mNe@` zFk$MzW>kQ+UVL5wxT=x1iAq|5o2yOL&W(x*H+^R?wl{a@Mgj@OH@hc>XnI?Nd{h=KFk~Y=#;`&G7#B<9 zAd8Yopx1BIwVc^b?dMdnN>C_pOx`_G?m6Gg{q&qrC4~c7q@;(|VJ!``d8_7YG%T*+ z5&p5ADe`BZQ#(_bw%7_DVx7E&el_^AMJf2+%KdKA=fqYl+k-CVIWY;-Nb18@=22A0VypS-)-w0EcSWq+ABmt-7_JF*CY?4Qq_b zcR?Vbq?WziKJ7bPCm~m)bzeCTA7r+FS=H;D-3T5zweNvFrR*R9{p3%oIr9lo&gviz zS(aZ{NUVF)fAIaFIb61ejl6q+5?$V&qXhTRpZmJbx-qqS^+n{B? zVC$%>iEfxQug6tge$cyMyP;xDm(FQcu(s3^ye!s zQTrcDlCLl*$CYA@s~xs!j%D`Wh%2ZdxyP@2^X*JDjl|58U;?W3iSD0#wx*?_I|G}; zNBO3dE0_c#pv2i)o#=f-9FLTUdwp)Oayyl9w!NFa)77{`ZyM@e>ExqrvcfeODa8Zp zy$F|?{hfIht1RwJtA->7c<-^9?2o>NA9(+;pySSefK)6`Y`F5NFT=xSE+#sWeAn@9 z<4-4<|G|CbUCr3sFE8QaHP&geli|un&Gdpxf`D&dWELWGpUaCbq%MTYkWs5|#=Fs; znwYo%o2|WRjT&(H2EY^@;<&${wI7Gn^w#aGfum5JUOAiHG3`XPNgZb(`S!>sn@dNM!(;m|*B4n4|qVuP>=*lS3 z^1nyEtOqVZzep^)e%Y_fG;Q${#VXS+;B}amoOV?fJW%35DLP|(tHT)^2LJXDI^n5I~iv zrME+m$Sz&Zcb$1(Z~JXtE;k<w$6$mS7UC;%@bMy|9KglW3x^IaNiH<*LmH>^DGDIWwE+G-DP}?c-Cr%id zKF_i4=K+_CTVZ50NH@YTGFyS!U9z{ptF3@`IPXcIh#=raJ!-VCQ{9bV37OGSmAujt zfYPi$N$@nVX>J||P!T@HJFT^Smm6rsh+P|7cJ@cUN>ZQ|Zsp)vsk0ElvT($Q0GVC9 z{!tj+qPf}E3WNfL7qj5jp54@zDK=!-j%=m=98jipRgzj=O15!unIGn8NUQ=Q_nZRq z%l1zXPPO$wP{0=5YNJnA(+PJ1n*n<~=^&?t6OlJ}2vsg5 z@x}+g3r)ImURY|=Rm;M&!@uxHy`79NYl zQS1kfY4G-tqvIq6AIQs5m@JPwnr+=Q~Q#-W7&6V5gd1SnoD;vC&33J-%Hl3ZU>*|5U^&unE|^8?D2N6sQstf7GGw!1+HDa z$h-#xAAB%T)iN`)AK&dxeLp)vfv}qgKvvR6qXN>V?TrB^(3dziNq@JijvAPa0AfjB zBKds{Xhf|hvRQ1ll50R@C1$vVIfz6F}j%URbJI z+vRo>iZm1p-~*S^T+ZH%Tc&%JSFB-VlQBXTUM{9u2qyt%{7O6J&~&fM){2?SBh!6q zC19?9G1Rt1@9tR{snMv-WVbpks2u(>Nz+_(Iz#Uv_He*R0DbVFa&pd$g zCi;SrK=Q^;z+QsbFj>&ua zAmjSfdu7eu=dRxf-pOsFGPFetY|#n;aHuF(SDO~)o*i%6b^OlA*c^Ge*C^IHwh|cU z<59hoOFA;v^>)-)WC;Mt{_GV`(61)+ONW?m|H@Y$Kfs>aql`>z%0)piO4JCaRFr0{ zjjMHh&_33i;9Tf?fx|`H`j+l&&16Kw+9FdI6M=5FNHQB7)ONqSHy7)F6pv$BSjfi_ zzY?HIG856z6_=V_AJRQeiT>tze7tNM+HP9JIzjmafQ;vQ4!#{Xh*CZl49PPzCv?zT zu}4Q}ITRPH4adH5Zl3V|b&&0UX3O|%X{)H+P=T*6_LMBH?NOzic_bMJHFcWxiD!(y zLBy$upb<~?n02uC;6C1VeSyyhVPcwT`P5x zB7eSkOX|S$b#3@V$)D%R45SXlYN}QXL01j2;(Ny;3YNqDzHUzt)ZO9K7 z=F-L_GE<-wD6Siq31PA+65o3wB65!DMMB@c|HR?ef5N<}^D^E!y`<~5Y_v|%7y)>a zH@l1F=KC4G3NtLjg8h$@v4+0CmQ8Y6uFeAgkR8&yU^@*X{7G{N_G>cs9gI(vvR;%r zTCU5)`AIT@dAw}aj#Ds=UdDGnN&U_zGubnvnmk+G9|~-i>3*@QZ2k^4@L1F^@ONv> zjLU1{bmC4z%RMU=)?XE$ql6r$U)QZ#T7Faa^#YoEg@`k1@-@cwj+tSTQnT~cH;m2o zqq$B#iw=C|SucW8)a)|0f7Q*9?;=hHSL`f2a_J<3YJA;lm$qBjkd*5&v9-=jG@BH} zKy!Y!(v4Wxg=czUmPud{{vWI?FodFRICR_QsWl4(;C8bb)mu@@qBUiPaN?E-YAWDh zLbcwlZ0uIpGuCagVXo=aL<0Lm_W;-|o9A{Y*M*2{%HmUI3wH&OeR6}j!Xw`NTkeBQ zj~^vhPx>S}TBj*+dj$&1NrTCZK=#8L3}mYlod)H&>6*YnVBg$7;;aC&)=#h0l5c*y zAjD|SJS#Ds=#M0|lpzLgc}d53p9a*fn(lX{Iy!Y`cw+!yC#vbVa< z^<%VV%%Kfo>2hPAf1n791RUhGy8iXvR-T)j4HIBReR`tS)CSPOQ8UHF3^{1ba~Wij zz^G`cmwlXSI(m0`Vdu7G(rWC;xVk{o#j4qwS#@JRhd6VRr zXH0y)rkrzj4>uiuO{PS)`{C1)pocG}slJL-};AQxhS$V2*U&hCDz+~CeEb(GTd}C z0zT}W=x(0dmD_o^AR<_JL;Vmbf_NzqK>En^+ta!{5N`T*tPkeP;E14HpyII-b2b?; zqPKCLX@2?Pz>DYIK({*h4gg2v%3kmPnAw(cF)FS{hPaAwclhV`Ab|_aF=hP1yPEjq9HQ7^;vu=H|#r%j_ z1Q=Nhq8LbGb=OU#qqdyPUK2nvR5g(l4ePXR)qE8wVpaL&@H|Uok2pB|z^iu@)-JM; zYm@K71yE_#HQj!f8;2+X(6YOoea?S3g9RPpgBgYNgkjq~9~5I=EYCfp8@S@Ql^IwJ`1f)c;r`+5+iDhb~vLUPshQ z=QVMMo%%6#dhWeODP@fZM_T-TKs>wmk*|B?g;Ax?4Qv*sO(oF!Y>zy*R{F1}R#Aa^ z>j@e(Xin>Z{P}(UV!CYYqUY1lpWi(u8x*)197tF(0l(!SzIte0{d88jHE#+uCr8M` zr;7`Z5Gaz!6$Ug)I*$*i|ER+F8cSPbhQJJ$WMWtNp#NG)Qw| z4bStp9|BEUNP+H>3M$T!{#`g$s-@-~Vl!$lFS-lB?hbj$wSjM@FgDWFi+#$5n1?F* zt@}V-!VgF$YtbDchq?||p!~owaY+p35KijS6BD;TlsCdETgjh3oq3`U`v4Rfx@rJ4 z{2WJX3Sm@JNpho;dVbGKw$aF*ArntWwq!CvVPr9T^CILO>jLO!ivEYOHRpJ&+Mu&q z7Tp7`p2^xU6+K0Gn_*$%Fs7meOO-QZF+gR2A3)AS&kCIBemz|I8V0)`zyK78&tqyvZE8C4**{Jn*>pfC(^65yaGPjK8L<)DU1L( zSTYs~j$f8VO;Xhas|DyYWydQZOompSxcWhRjJ*O;0c1@3Qmag17UA_Si1TP!xtE!K zj_vCr-_U{IO8Qa`s)B#l1Guz>PEyFkv`NsiPfez{U9`WUc^18PoPjjaQLIWzPsVUf zT%QKKt>>=aAM!(V^UNKxFpHvT*PN+4o?cy^IgURV4IQLb(2D{c^YOqu)>i0MS#h!C zt3=1 zgfKl*bI5HaIqN(XLocBS0E%^qXUE#igMbCuPt`S3W3ydb?yL6hEM0C7eU9UN09#i?Sau zr+(d%Qyheva+6?tL3crWz>wx_SFFI6kq*pv>)_u_EFw9?%wXHXJ7~ zn(LMK*vonZtyPG;?R)x}z+W>&Gnjzvk-8FH# z!0Hc|I%cfcO&w>jh$R~ddHRF_{+S4-)kUlvd@63U6-Sv^2z1j%MbSwQXl@yQ>DM+&zuM zQD*8BNy`V%TGYz_xkFO2jNo1jKL|;il^k`QL2`y>X*ZW)GWPwoHlOcsAL3EBSRl@C zZr=cRSj?!CboI9Ezrzb&!(Yk=x1yqgFqh6P`a#W07y4(Nd6pY&7Krd3tsss&OJ_TT z2H3OWAM!!wSt2rg)+2c0S;kJ!yia<<9s#!v1I?(Tq)oaqP@u%rgWHSq>OO|Idv^{sL&<-C8a}lwi9<-J z59KGk1J2C&KG#up*x8sFOSN~Ogwm){GF&Y)itjpQBqWfTUa~2?vv0U9_Qc@3DNjP~ zR^9HwaaVGG3TIV@1C>? zTCf)-@cx)x-y9PDW&n7QE%H19RxE&drZl?N5&1E4< z=pNe0G#%RXN5XLEQ1IFUb4HDdf2O|!>b~kVNZc?o9yO3ZQZjv;Ibl%X*ydZhl!j1( z_jz151xtFxy^sCNja*xNC}GGa-KKiduX-{%dRpN}>w;W}?VfG@_U#L{2^%IXxtX+q zhTis^giBAA=%@xfxl!FsZ{2WC=o(94h%Sb8KjJwi^3|7?pyEHCP7s^j8fGt0s$e*P zTalaj zm@`M4ZfP4T)_DL7h6?98!`+wi)i^uDY{E4&P~N~by`-yQ;ELmH&rlh+`5O&co)doG zqWPz^KV;LUxjKLHFUH?5C>@6L@!mLmBI|kduxgiFL$+lDqt{3iu{>zpa>~(~(G0~} zYjuTwdzBY?J78z`O34Q9OGT|#-_3VUbmnK!QoxHVUA(`^pfAa%v@;W8$%sb8bKXe& zak8mnZu)$R{FEr*)=~}8j-LtvOH#e@W;tiubksSk;4e!v_nSG7%oV7aS$Y;PWArb9 z1g;YP8GNE7b2>}hT=9b>zB^2O@On+@dQCs>vg6tu^Coz4-#fjpNF%<_z^mj;8g*21 zHuJ8{{I53MXLgzC%$Pj{p1kifzYb#mir^jd!O-$T;$Yo8d88ax3sXONoPUoJO}RsP z1R51+mkU93o9{$rGg|=~5&oN(YX{JmeAcTezDte=?fWs(@h zOT%VyobqL%P``Uta+So`SPd-i?kdEB8z%)-H`g;#YZc|6F(I&({oYhM#(TZKXL;flX0>MSb7^FhC>jGb6q3edkQ}k zWDd+4DVnk|!{%D};t>D&oF96*>D!H^1MXXUy~d^kSylu04Il^ZVo$TJ)6KD62N+r^ z6okofPs@+Vb-AALFH+;!a*9Wv>oNYy+`J%BXTMQJI9C7%`265F@5-k`vA(lC8^B#^ zkx0RZMGBeJJNwYgkgCyGLN@-<=hvm;ooy+zbjh|^BX>@Sj%0Ujd~FP5a28UWSas^) zSo4JU4$L>Ute=tC24Cu9&bB=uL@yv&mK@7V;@r!u^!S&M#ZNe9J-&puLO9z4DVCRp&l&px3Dkco zph1Jlp@A5q;I~xRAH9#IG%1-NK<&t#t}cQ4YBI PM;~=nZIv>mm#_a1)GRY* literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/ic_add_bookmark.png b/services/MoreMenuUI/images/ic_add_bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea3265455d6c20f2682df08e0690120fa1e3adb GIT binary patch literal 2036 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 literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/ic_more_desktopview_foc.png b/services/MoreMenuUI/images/ic_more_desktopview_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..21bcc68b5136282a2a51cfc0d5a9a0f79cf36103 GIT binary patch literal 4066 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 G%D(^(M#QiH literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/ic_more_exit_foc.png b/services/MoreMenuUI/images/ic_more_exit_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..779fc486324ba4350b68c6f8f9f49d1077f9f089 GIT binary patch literal 1558 zcmbVMZ%i9y7_T+xfM6IHTKS;IEj3eUd)GhL-i?m6y{qk@&;UZ6NI2R9E^xi}dW=HI z9E(Iz=Z6I(PLVHW8nz)i6&8^3r^}pyu#G6$KtC`yW&%ON!ZH?(Z=r=@$Ubb`qe216)FIlhMpcNK<0AXo@D7TF%yt^P zdIyUe{fxSh3G(%V2h^i#UknVidvc(NBglp*5Li$Yx{l;M^&I099i#~cUsPV!OIS!u zr!nfyI8GTU9f}$aT8t#MW`o6`F;WIJ#<3gLXtC(c7-d8dtrn?;Y2ItzuN zIy{DT_<|zs^DwcvEQlM$8lH$HtO7%eyim;Zb+Ha`)$k%8tl|BTwFraum$E)D-w=Ey zQl8D-l8nF}WxO_l=b#OJ33iwGR$QYaahpvGGNAM*iraLES*x?+HjN%JAXYev_5L5t z)F2skq&XgImY4~2U}U=0`e3njco-izF#*n+*^E<5njRL)rM=`){< zB>%7|4Yv*)Dtj+6&@zxLo0kSMRN=UJ3ornCvJBWWRKRX2gH%z+@a3;=6L}Zx(;qgc zo#m9aj?qUKZ*>j7`O`n;XKtp>+-+Z5yV%p7bbcxH_M!ZHdv~MQ5i9-ds&00^@;Bd& zi5qj&b6NchX}O{A7Qg1Q53gQ(*xY?LYjUvTgW(sa=Z+riCf^zjcYOJ$T$u+f3G z^;voON1t9kS&}&u`o5)$$kM#C=E74;%X=y=XdkY>JJwA*yRJks5i2LCvj*2#%(a$D0Kf^3O@zkPNPPS0uUsO|bVZfUtR!2QZ( z9Qa!?NjU;{{+feJ{!^K4mYo&bwm)9l`)e5^k{sz5Q!dAxI`XG>Q2Au9rQ*cDFX1^0 literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/ic_more_exit_nor.png b/services/MoreMenuUI/images/ic_more_exit_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..b6dcd889bc6efa4962b1f43b02b21f093e04a136 GIT binary patch literal 1604 zcmeAS@N?(olHy`uVBq!ia0vp^(?OVn4M{( zJaZG%Q-e|yQz{EjrrIztFsEgPM3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)DJWv2L<~p`n7AnVzAE zshOFfj)IYap^?4;5Si&3npl~dSs9rtK!Fm_wxX0Ys~{IQs9ivwtx`rwNr9EVetCJh zUb(Seeo?xx^|#0uTKVr7^KE~&-IMVSR9nfZANAQKal@=Hr> zm4GgVcpk{1iHq`zbF$JDTz5Q`N^fZsd*)yF1AWQ8NHOu6e}keGZP~V zQ%6fnR|{7YLqiL5V>1^QV@Go*b0Z5^b3>RJ*z{T$I-58*DVb5UwyNq$jCetr%t1q5W|m*f{` zkk2Xf$O6-{>>&nPlIHs5ftw?$;v=Fj^o_siF;=smON@8`6;S2w==UB{SwVoL4ooi-LIQ3->Ut_0t!Xu#@ z@r}C1GJh^T-Y$BUomqO$T2?cOxK%%LpC|RmzFGF=tYgec=Iq;LntH3aePWn|#eXsh zPd{+Pb>D#_Q)8}|9%Z}s6g@OJN^?Y+a?*0Dv@|MJ#JKq46hV9#ML{+CS^jYwk=Wh}_SNqr}`GwoF zEa5%v-~IHL+-KuwhMzre>^${##$Oh^5djXrtiW6G|G&rySzlMP4c~Ha|B(Q(~_ctdz#}%)*#F69spxPb|0|sNUYU84BRck=yx~Hq3%Q~loCIDqOQbYg% literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/ic_more_focusmode_foc.png b/services/MoreMenuUI/images/ic_more_focusmode_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..f5fdac8488ea3b34dadac6f9e03d71b2326fa922 GIT binary patch literal 2053 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 literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/ic_more_history_foc.png b/services/MoreMenuUI/images/ic_more_history_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..a397ea056b2ad8e5d6971886c1f9b8a449bfa982 GIT binary patch literal 2892 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

;4pTXqLd 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 literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/ic_more_mobileview_nor.png b/services/MoreMenuUI/images/ic_more_mobileview_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..91aebfe29e531e5f9607b9b6995b2e94bb628e17 GIT binary patch literal 4205 zcmbVQXIN8Pv!;khvjmZ@Az(vD0g{kNkrIj$PyquRS_q+&4g{o#g7juXKt!Y{pb-!? zfD{!%3+*W7DAIBe1q2bL2*M4PbMKGye9ygiKYOpWXV%R7&YGFEf9!;l*5*>;3gQ9+ z0#cS1rl48Ri433z(c71#51OlO00DhH^+7l| z7K){q5Pf_t!e~U>Fl#$Pm_GsK2{JSQ>M_xLfIuPx4`c=gkmzWpKIjK7n*YA3hJb)S zOc?(9pr1iGU{3-~$TT7l4%XHrKw&T-0s)5Uz!3Lck%~U^2}c0z;utn;2SJntTgQdMJs3XKIq@ zs=pCTiF5+Zm%{KRlYpCucn@+ALm$MC^yd}=DOl`3z$E&wMDbGwVd5ze7#Io(4BXt; z4{JK(H1WT~_*ZMXT_}YJIZdRKgJ=YPJ-k$ZJM(k*pNTdN`O%$Pi-Anhs-mje;qA%Xa`rf&*u{yFk<6@7)$!^J)8?Av7GC?9W5kK%2y)gr1u1nY$}170 zqH*x;!HOYrNQD78H>g2(Ls`lOIBx5`l9CMe@fda9*%V$1!O;NPJ^lL9&bRXw8*^F) z{%g7Oc%C>fidgoi3M-nkkm9X)c2EAgaPo^b$12j2;@qwGF=zJB>pGa%<}G=2P6vJ4 zG?CXoSn(tosn{Y{+w1b&4dUAf3M_c@r4jC?Wk7KDy%7+gN`18bl+m{7%H{e=1SmQ@+Mb5-YRk$ zPjxXz)(k8wip!Cfop{r;dhzQjyzUfzHP&a&!Rrdw->0f*Lf#MVO7zg(VMB1mVF+j0^=*V)V=dU z9IxoQ>W-!Py}^HiNPHT`BkEJ^{Gzv&Y`#7Z7XKNTP^L#IoQLt6X9o>^q#9qFv2wk_ zcXYJcV72OP8|$7njT#D}#Sc#EhNu#1U{Ar%cQ5*#wQw%N?BhvuY~NN8Inut56kg;f z-vcU7V4L@-JTqv=3+t-I5%j7RBy-W_Xrs|urpZ}4>>^5XfEF^#Y z{FHUnWvnz^xopO4dWZ#&FB|g0a07vhOhftVC+3!tJ0EoHio()}O_)um)~*Kbs8YWu zFC)og(r#W<`%1r`-Hhn&Wz;9aK93vTYv-G;D)sQPXI%-~is&;+lGEYYTcA0D@^m$` zfj`^7_c2pz-_3$XkfzkMdG-36tqjqNMO#m6#229vr*;^San}s@X@%Bd0Jt&T8-gJ+ zZV<2TozdUTopBpIgFzqV(^68uw%!hdrt4{VZq3}KM+S|6a*{3#w!J?t+n)uy)NP+@ zgow?xdZ@?k>Oe<|+AeR1SlO<*jH^oy96b`tUG+YENlKD4x!`J3{D*uOyYvs?Ap2@9 zk4*oZR(&JSvåVi8Fk3zl%xu>xL1@oxdE-SWG$8F*Q>W@6viF{00S*N6VpKxB? z?r=?F$e$Y>_Aq(@cuvN13)i@Dt>jsklvKRfJs5-XAyrMV*8reJpT(WBdlc#%7d_h@ zV->k0Pf#0Xt-W3YXtuX+|GuZJtZa$E)rpClO=>>Ti9tHmA1k9^xUoUrr3DefV8p(e zTSafUOGY=UG6eNKO39z}nw-B&EGrpmxi)7XguA%9 z;z}^oaJv7(`S`o^^ej}(LC-rKK=%#xusYoV9TRP* z!@K<=-YRFe*qNw&y70zEhe}em-Tf%}V`D@4WOci8*+eK-3ia{!s{eb}Y>60=$ojwf zL^x+Z0A$bF^`6tY_Z%zs>Vx8!Hb8jsgjm9np3{MN`MS3YyL%?nPPl{`9n$Oli&H&V z<1jjM`ug6f$tm$?!Nor6d-hj2zXN16D2xfsg^Jl71$yRHl>{|}sSruj$`i60__VT< zlC+7*S5+Tm26p4D{nV55W-FbrImXni6HSZ}pPoH!oI*g1!Go$Z*c|H)`0!O&@wHca zWv;9>Bs>t^{5AhN`;svkH+-uYo5kkt2YrQcmBaM%OJQ#H5*-#^^{iq|eJ6BxEUfZ9 zzUOszcJ=_kX|1z6b#Tx)Pegt}(d2veH_g<+r8sAmt%?t-<`#3S68ukQgfSvPt|um* zkhW!+544LZhuU0!9by041DpqT$aJsEJq~0|ovdd=Q%DtQM;cC!jenkVv@hNI#g@dy z^usCSk_zX@q6XO`Lz?2m1K3ahZ^D2|h>@K?)w|xwg zjQ(2<=dJ!!5SMYU-jZ-)r@D>vI;yU#KZSLB_3)L*Gt(i`rM7pW)WEh~L$Zl3tnhO` zkjeyuEz5`XQD`aS#HO#MN0u}%VP@`nVehd0T&mqNn))m|v#qHsA6i=WJIwWinrX%& z2_1%4waYCkhBEy68Ho~fc5vm;otm1Ov&LUNKHjg>AUw0b^hex@k+MD<&`xW)3)R3L3O+I38C^RMlL<&E#NLad8e0Zs(%Gb%rKE^tBYsCaP3I%;D zQjaSMwN(exQ_6MdLn>CwM@t+1zGoMv?DrW=$Rtt&sh$*X@o)IP48aHeYb*DAzV`Nq33cJKj7#LC4L5^}-tHZ!O&sjvCob&{} z!C`FT*frQKeO1qE+v6XfekPfi>-X(Tyo6NRRmVuqfV7We_UpV!nc{uxa#}A#(=8$r zCU`3=z~W}VsV|8Vjf*dy#LQegPQ^b9#J{=H(ki1;D;R2`99ylytC&@Q2ek`*Q=09a z3y)U0UBt*Rhjtko1X!v*7n&9OYixg^%(s$~{a}qp%;I_Y08g>&dI{>y6ZdCtiLBJ5 zzE=R;t#SjU$`cwYHnCDKbB_A=?SSwb_hSb%41S6a&p*%7g;>TFqw{YVsT{T2 z;$G7=lio&lk)C>>pj?D3MwcO9GmjE7Uq`X0GvrJ*!C7K=G$M9M&o|=7R?0z*Eccg?9K0s8rVoM0wt{NS@0Hp z{MzOA3Kc)cnFY;`M{|cJy;Wq}Y4(V6^p4ZwQ00lwp1o%hBhR3Qtn6KK5f5em-Xro8 yU>v|l`2oitjDASt06zFX4F3m%o$(uDP=UC0a)>x0%4G8gfF;J-lx6IG{=WdHF?!Dc literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/ic_more_pointermode_foc.png b/services/MoreMenuUI/images/ic_more_pointermode_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..8785d75a32e56194cfad14a628c2d55bf920e36e GIT binary patch literal 3180 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 literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/ic_more_readermode_foc.png b/services/MoreMenuUI/images/ic_more_readermode_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..d257732fc053c20177ace08285da20d483e3a8f1 GIT binary patch literal 1943 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%0DrRk}1lz^~^m?n2h%Dr_fV`tEOTsZ!6`V9w zY(@F2zM_Zar$^n0#fWmt4ou8}MfiFHbhOEFK74$#_t8ZJ=8XDgs_lW^!9V!(5~nUu z@;2P>9L|<&*?TZdP`>xPq_k7$ab==TfRDanRguX2{i}?*BaTQOVL>SMIU_uFbsWmZ zu!#6jN4!7HlCL6=a-WESjeKR`B~84(2M=Ne-lJ2W*2>8T(yZV60j~NXQUkn0$C4jT z+$evj!T^Yi^@3D-dt5+PH)kIodhA`D)r5A-*maYZ#kW7fA99V?G(wEt_4biZdj`4D zQ|d&Ae`&L2%%!G l{a?cWOSdqekKD!2b=X+%5%rL~`_8`@TT2HEhM8B?zW}&QFVFx0 literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/ic_more_setting_nor.png b/services/MoreMenuUI/images/ic_more_setting_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..284d4237339ebbe4cc5aa8c24486c5d01a726fba GIT binary patch literal 4936 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 literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/ic_more_share_foc.png b/services/MoreMenuUI/images/ic_more_share_foc.png new file mode 100644 index 0000000000000000000000000000000000000000..dadf09bd38e1a78fe7647a38af172a99a08caf5d GIT binary patch literal 2653 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\~q?AZkE8C<^8=}1$>cC9>Z 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 literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/modal_dialogs_bg.png b/services/MoreMenuUI/images/modal_dialogs_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce45069dc7bbb227b25b6933ded0d229002daba GIT binary patch literal 18648 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 Mwux4ero+kq0-UcVr~m)} literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/modal_dialogs_title_bg.png b/services/MoreMenuUI/images/modal_dialogs_title_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..36aaab46b500605f4e162c0f3fe92a999493bd13 GIT binary patch literal 18226 zcmeI33p7+~-@vz{+;0`Bq%$rdnHe+2Fw+>9am_7^(0$D88I#LQX3Fj4kld=1q+BD_ zDR&j6L?sC&L`OGDg`^I>C2=Zz8x`$pzVog3eCu8BTC>+;=KuUJ&-47A|MTC^p0#%T zDkmFRsYOx%0La?eTDn4?^PoQ|2{GvZ>Ui)l^dZT$_2L15G^CK8Cjz7&S^yb1vniBS zt9&?o4$p_fMc7d&2yP&U$@T*QAoxM18;k1JH{WFV(OV1qxQGMx99Ja?gsa8w2*pG# zT{TICm2qlE?kl-mnPX)&OQk+LPIT|yh&@U!dNRAD?umD+9o-vsEN<704^P65`QE7< ze%3g4_Aa@%a4@s9S-eU@CfU}&#V|r9&tl1($5C}PwNJWHW|2~wTtGphl%d8O)er$j z!bzm%>Q&;G0FmI^(h@+GV@8$!;@ENd7Zz#jL?U*IRPhsy?Ij`<0khD(7AF8RYmtb| zR4q3kdls;%f$rS}tU>~tw10he8;HmpNedGJ)*et(63I>k5c9w|OTcFZP}sbBmlfct z4=6J2YY4zSB%p8S!L$WVodc?x6r@W42^m1&B`$gyFe?n$RIi~C4D3t;6s_NQkX|n@ zR_N7*NTrpK$~6gAk!vN8Tf{v)P)l^0?39-);%Pt8(#=rSA!!S-kvRFsgEs*nJ5dRm z?ciu|lU#9A6Mk=*+(zV!%VOi|-rikfJ~fjAWv^xW zo~Z@%dRbL9cMi4)cYVx?lc5WZ6=F^B_eaz(?#FeYb$v2tDX)6z?%xrl|OVO zL?e8no-_xIzcL-Q$zBRXFzxnl0e}sbnkedxQqwvK0I!Z@Q7<^26!u;%vTY+a5 zne4$I>Ah9pBmW?QOsUhadcHv1pvF%hReROqw6UIK620NHdZA1~?V?kw3q>p9hv?0x zgJ#W*w5pQC&kC|Y(3Y6ndOCPI-LuU_EY`%$c_3*dDZ108T3bCS*Zz#wg*kuKEbzu+ zVm)p3H15nzn1@yfi=)&SY0izOV71Hl{bYCgcWUe0R_oRPSB*ZsybPS}B8{Z$4;a2B z;)DZwh~@Rs-I?82yA8Tky4BvSmCE!s+w%K}+fyCa8=F@y>`~~!^@xF~SabJd>8=lR zk5K0rCake2I#T9((j_)`9&T$op)qQ{o&E8mqX%y<@=^8~W}ke{zcA(-K z`fQ%3JQsZ%BqJN66jc|;(pi|XKzspfVbFq;sSYO=-rl{ij;e2jd70XqCZEP}_tY)Z z{Y5G9hSb582el5W=%T54`6u!p^O~t!Xw~QR(J4yEH!0vS)#9flGnS%ZvEp{+!Gc7p*G1K19ly*R9lEr)|SZXquhb>vrGmVUASJ zd`A=FP%$ds_qfWD3d^9&0XYMyS(i3MWI1qh9)(=&eZP1+dXzfq|2}8PM#fXDR7O** zU8ZRP>6+md4oMYV*Z$gtvi_u{P`9tmXHxYu9yYcKO%(*B;Xn z(^Av2cYNVEknZYOeqz~)6%H#L>Kbo09&NmnW|(1uxr^=1=*_sB(Rpsun&35hWw~YN zLA#RfH7C3V$|?h**ATppd%CY#Uus>HS+w*{MNvi0oSbr}B&UL`JFKgxUYA`j%R9I5 zRL?!J_Tn=Cvh6gMw=(P8wc@J-Nf(p0U)cWJsEN32?0vZc)itW&yfcA{#MQ({=}m_Q zOt)Wqo7{(Hc{VFF-!teco7b?chMnn_aodKa%qr(a4aV(`x8Ko#N+F{%RB9jAU+iAV zAKJ41Noea(W=3g7b$@RA$pQQTdmy&s@J-y|Wm#SZyjxf6DUV%xT1=%6AJq5lEDU$1 zI7hP1_G+N%=tPgAyQj__56T~=y;3H>BL^PtB6pFD9$_DOZMH{?iD_1oy2`FW_hdcAu3*UP!4jixbbOYjp1F zikGlJ59Z~@_#1@ef~@6@{WnW*wC^)I^y=_<|J>@iPxhA`kFobas(L=VSh$%`LfR72 zF4d(pdwI-iu|m@MU1hrdZO#S#9x27)7qvnieIqwqxv}HQSrOlt((Y0{(c52k-0ffQ z?1}d3JWG2Ylc_>hir-bN*sh$S^y@vHj^G}ZSk8^hX&nd7Gk@@2U8K z)`w?lcSizR22{c--{JmjYhPPAJW9TPsoh<~-LZ|?27a*nP&#Z{9G~AelKjDceUX#@ zmi{`?R?$&$4Y{(r<$tuPwwh2~6Yea3X(Lzn^QE!OS3yWwysZ0ghiac{a4kc+`-UYu zhnL6_A8gwbR`^8x_Rrf?S*qyG7U^%&tux%xKdkj$d%^i8x#iA_N1-2W+JBZmgd=%{ ztQ@3XXFurMaXX3irg=~1!OZR9sJ}WkwI3}D>!mk!ZkFe~x}d;+(rPunyLUz9il%jM z&hy`twD-*OIPZ~ulDN_T1^)$UEa|p$UB#h_^y2b$zU2d<7te+{=Xa_eNpvt;mP*e>e?ljt_K@nHoRT^q5n!yN092P zW1aHO-M=7y)fxBs>-3P@t(*@@3zL$@XNjf`exw^9+W}xjJ)7#u_jGh1(mDPp8iV5v zqJsUo&_NUcNT$JD8r>J1e;-^?qTSt@5rTqK5X02K+rAJiAoRk zr4tzHrerBnFcAvi5AtbQNeKIZ)`aaQ&R!2;l@O@3x%_llUcsi~^P&k1g z!VqPMr0Zib2qOXtV~8VQFnS2AKE?oz(MMwmNDPLEGa_Q}h)vF&`3Vb?7JQEs3BYs?F#ZZTLbB!)iyAIukpP>Fz8?6aJL5fP4Z#T(V!pb54rH5 z!DGHV1n%c2kT33E4daXYhqLFinbV8&mG6Y+hi+gn`v-0lnkl!*RG3;J5|n>LN+3w% za{{Rxjvsj{%ch^7pvNa24|V{96U19aLc^`6mwGx7Xi4LPWGEGJNPQdxcM1B1kL8dHWF&v?^XVCbx??k~G5;26CQNFT;$Kf#8%#gnoW!m!V7>EXmN^QEWDYXrzxN;PFf&BxuOQBMopk5J@nC{^95tCV_#$;y@$9JausBd&|kGq59^EPCpY%D3;6daPsN|%{^LG^e82!f z2|pET((1=ScpN4_h!zN%v!I;#U$)^?z^^^vkxA%@n(W8^e^>(^ZQH-M0t74`Z-6&4 zMjGSr-biBuoHx>&Ni#%ZF$^O**2vf!kHvpp;s4$hn9g0g4=sQNGRWx9llt87-?V6d zukQVO+vckZ{~y^l|Jb5U?Z2;!;OE-?ZP6q#=tL$b(4WR9v;Ao-5X}u>k^~rUn8t&>P*mb5F?mF%19>C_4 zv7dT_HP7&xI3Z0zb%PG`AQ_q(ya{f-iX9C4d0Mie8#!;{_Jo0M{gXa$#djUOW;jAH zrX6P}J~>XM(~KkcWL=+Xg%0%4vjqCf!^Afw|I1DBpZqdCqkl3gES9hn7!bjt5SL&+ zFs%?542WP+h)XaZm{y1j21KwZ#3h&yOe@3%10q-y;u6dUrWN9X0TC<;aS7%F(+Y9H zfCv_axCHZoX@$68Km?0IT!Q()v_f1kAc939F2Q_YS|KhN5W%7lmta0Htq>Osh+t8O zOE4dpR)`A*M6f8tC72IPE5ro@B3KmS63hpt72<*c5iAOE3FZUS3UR@J2o{C71oMGu zg}7iq1dBpkg89I-LR>H)f<+-N!F*s^AubpY!J-hCU_LOd5El%HU{Q!mFdvv!hzkZp zuqebOm=8=V#03K)SQLm$YWnqDFaUZdHwb$9_Ih=FHT2>xf^O^T2mql=0U#m@0R9?> zKKlS*t3Cj{*aQH?Q~*%s?B96J8nTVIvoxm$KPYU*tP~YdFl)IiB0VHFw>4CGHbz^) z@2550;h{>)4=TWKRXZ(r`_^tI#oT7{BfjuMb_(x!Pf)E{HWh9-+%n> z+&ztVW2}TB<89HISO4VxCU$5wy3Hy!tO&(wdzg46-)gIAL9!#A@VF@5S)pBSq|oVv gv42GTqd&s{nR>0AJ7j&G*sAP;h0FNNd*k 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 SOF&k3)ON6OvCgyFvg_YNdqf}r literal 0 HcmV?d00001 diff --git a/services/MoreMenuUI/images/web_shadow.png b/services/MoreMenuUI/images/web_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..f9018b0a6e15ae5670b67d580b890d1950636066 GIT binary patch literal 17700 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 literal 0 HcmV?d00001 diff --git a/services/SimpleUI/CMakeLists.txt b/services/SimpleUI/CMakeLists.txt index 6234cb8..4a5c6d7 100644 --- a/services/SimpleUI/CMakeLists.txt +++ b/services/SimpleUI/CMakeLists.txt @@ -79,8 +79,7 @@ add_dependencies(${PROJECT_NAME} SessionStorage) target_link_libraries(${PROJECT_NAME} SimpleURI) target_link_libraries(${PROJECT_NAME} StorageService) target_link_libraries(${PROJECT_NAME} HistoryService) -#MERGE_ME -#target_link_libraries(${PROJECT_NAME} MoreMenuUI) +target_link_libraries(${PROJECT_NAME} MoreMenuUI) target_link_libraries(${PROJECT_NAME} MainUI) #MERGE_ME #target_link_libraries(${PROJECT_NAME} HistoryUI) diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index e585130..d5e6a6d 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -64,8 +64,8 @@ SimpleUI::SimpleUI() , m_popup(nullptr) #if MERGE_ME , m_settings() - , m_moreMenuUI() #endif + , m_moreMenuUI() , m_tabUI() , m_bookmarkManagerUI() , m_mainUI() @@ -1118,7 +1118,6 @@ void SimpleUI::closeSettingsUI(const std::string& str) void SimpleUI::showMoreMenu() { -#if MERGE_ME BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); bool current_tab_as_new_tab = isHomePageActive() || (m_historyService->getHistoryItemsCount() == 0); if(!m_moreMenuUI){ @@ -1140,15 +1139,12 @@ void SimpleUI::showMoreMenu() m_moreMenuUI->showCurrentTab(current_tab_as_new_tab ? nullptr : m_historyService->getHistoryItems().front()); BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); } -#endif } void SimpleUI::closeMoreMenu(const std::string& str) { -#if MERGE_ME BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); m_moreMenuUI.reset() ; -#endif } void SimpleUI::showBookmarkManagerMenu() diff --git a/services/SimpleUI/SimpleUI.h b/services/SimpleUI/SimpleUI.h index a6c4acc..9d64421 100644 --- a/services/SimpleUI/SimpleUI.h +++ b/services/SimpleUI/SimpleUI.h @@ -34,8 +34,8 @@ // components #include "AbstractWebEngine.h" -#if MERGE_ME #include "MoreMenuUI.h" +#if MERGE_ME #include "HistoryUI.h" #include "SettingsUI.h" #endif @@ -292,9 +292,7 @@ private: std::shared_ptr rightButtonBar; std::shared_ptr m_favoriteService; std::shared_ptr m_historyService; -#if MERGE_ME std::shared_ptr m_moreMenuUI; -#endif std::shared_ptr m_bookmarkManagerUI; std::shared_ptr m_mainUI; #if MERGE_ME -- 2.7.4 From b288c117c1eb97713006a0988809c844dc55e232 Mon Sep 17 00:00:00 2001 From: "k.lis2" Date: Tue, 4 Aug 2015 16:06:54 +0200 Subject: [PATCH 16/16] Task TT-80 Implement History view [Issue#] https://bugs.tizen.org/jira/browse/TT-80 [Task] TT-80 Implement History view [Cause] - [Solution] Add HistoryUI. Enable code referring to HistoryUI in SimpleUI [Verify] Perform basic sanity check. Change-Id: I87c20a27f825cda1ec7166e16133f2a5328c45a4 --- services/CMakeLists.txt | 3 +- services/HistoryUI/CMakeLists.txt | 29 + services/HistoryUI/HistoryUI.cpp | 384 ++++++++++++ services/HistoryUI/HistoryUI.h | 91 +++ services/HistoryUI/edc/History.edc | 827 +++++++++++++++++++++++++ services/HistoryUI/edc/error.edc | 144 +++++ services/HistoryUI/images/btn_bar_stop_nor.png | Bin 0 -> 3255 bytes services/HistoryUI/images/ico_delete.png | Bin 0 -> 18365 bytes services/SimpleUI/CMakeLists.txt | 7 +- services/SimpleUI/SimpleUI.cpp | 25 +- services/SimpleUI/SimpleUI.h | 4 +- 11 files changed, 1491 insertions(+), 23 deletions(-) create mode 100644 services/HistoryUI/CMakeLists.txt create mode 100644 services/HistoryUI/HistoryUI.cpp create mode 100644 services/HistoryUI/HistoryUI.h create mode 100644 services/HistoryUI/edc/History.edc create mode 100644 services/HistoryUI/edc/error.edc create mode 100644 services/HistoryUI/images/btn_bar_stop_nor.png create mode 100644 services/HistoryUI/images/ico_delete.png diff --git a/services/CMakeLists.txt b/services/CMakeLists.txt index 5515ac1..167a2f8 100644 --- a/services/CMakeLists.txt +++ b/services/CMakeLists.txt @@ -3,8 +3,7 @@ project(services) add_subdirectory(WebKitEngineService) add_subdirectory(MoreMenuUI) add_subdirectory(MainUI) -# MERGE_ME -#add_subdirectory(HistoryUI) +add_subdirectory(HistoryUI) add_subdirectory(TabUI) add_subdirectory(SimpleUI) # MERGE_ME diff --git a/services/HistoryUI/CMakeLists.txt b/services/HistoryUI/CMakeLists.txt new file mode 100644 index 0000000..9d3bd37 --- /dev/null +++ b/services/HistoryUI/CMakeLists.txt @@ -0,0 +1,29 @@ +project(HistoryUI) + +set(HistoryUI_SRCS + HistoryUI.cpp + ) + +set(HistoryUI_HEADERS + HistoryUI.h + ) + +include(Coreheaders) +include(EFLHelpers) + +include_directories(${CMAKE_SOURCE_DIR}/services/FavoriteService) + +add_library(${PROJECT_NAME} SHARED ${HistoryUI_SRCS}) + +if(TIZEN_BUILD) + target_link_libraries(${PROJECT_NAME} ${pkgs_LDFLAGS}) +endif(TIZEN_BUILD) + +install(TARGETS ${PROJECT_NAME} + LIBRARY DESTINATION services + ARCHIVE DESTINATION services/static) + +include(EDCCompile) +EDJ_TARGET(History.edj + ${CMAKE_CURRENT_SOURCE_DIR}/edc/History.edc + ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/services/HistoryUI/HistoryUI.cpp b/services/HistoryUI/HistoryUI.cpp new file mode 100644 index 0000000..be63ad0 --- /dev/null +++ b/services/HistoryUI/HistoryUI.cpp @@ -0,0 +1,384 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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. + */ + +#include +#include +#include +#include + +#include "HistoryUI.h" +#include "ServiceManager.h" +#include "BrowserLogger.h" +#include "Tools/EflTools.h" +#include "../Tools/BrowserImage.h" + + +namespace tizen_browser{ +namespace base_ui{ + +EXPORT_SERVICE(HistoryUI, "org.tizen.browser.historyui") + +typedef struct _HistoryItemData +{ + std::shared_ptr item; + std::shared_ptr historyUI; +} HistoryItemData; + +struct ItemData{ + tizen_browser::base_ui::HistoryUI* historyUI; + Elm_Object_Item * e_item; +}; + +static std::vector m_history_item_data; + +#define efl_scale (elm_config_scale_get() / elm_app_base_scale_get()) +HistoryUI::HistoryUI() + : m_gengrid(NULL) + , m_parent(NULL) + , m_item_class(NULL) + , m_gengridSetup(false) + , m_history_layout(NULL) + , m_historyitem_layout(NULL) + , m_genListActionBar(NULL) + , m_genListToday(NULL) + , m_itemClassToday(NULL) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + edjFilePath = EDJE_DIR; + edjFilePath.append("HistoryUI/History.edj"); +} + +HistoryUI::~HistoryUI() +{ +} + +void HistoryUI::show(Evas_Object* parent) +{ + elm_theme_extension_add(NULL, edjFilePath.c_str()); + m_history_layout = elm_layout_add(parent); + elm_layout_file_set(m_history_layout, edjFilePath.c_str(), "history-layout"); + evas_object_size_hint_weight_set(m_history_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_history_layout, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(m_history_layout); + + showActionBar(); + + m_gengrid = elm_gengrid_add(m_history_layout); + elm_object_part_content_set(m_history_layout, "history_gengird", m_gengrid); + + /*evas_object_smart_callback_add(m_gengrid, "item,focused", focusItem, NULL); + evas_object_smart_callback_add(m_gengrid, "item,unfocused", unFocusItem, NULL); + evas_object_smart_callback_add(m_gengrid, "activated", _itemSelected, this);*/ + + if (!m_item_class) { + m_item_class = elm_gengrid_item_class_new(); + m_item_class->item_style = "history_item"; + m_item_class->func.text_get = _grid_text_get; + m_item_class->func.content_get = _history_grid_content_get; + m_item_class->func.state_get = NULL; + m_item_class->func.del = NULL; + } + + M_ASSERT(m_parent); + elm_gengrid_align_set(m_gengrid, 0, 0); + elm_gengrid_select_mode_set(m_gengrid, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_gengrid_multi_select_set(m_gengrid, EINA_FALSE); + elm_gengrid_horizontal_set(m_gengrid, EINA_TRUE); + elm_gengrid_highlight_mode_set(m_gengrid, EINA_TRUE); + elm_scroller_policy_set(m_gengrid, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_ON); + elm_scroller_page_size_set(m_gengrid, 0, 580); + + evas_object_size_hint_weight_set(m_gengrid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(m_gengrid, EVAS_HINT_FILL, EVAS_HINT_FILL); + + elm_gengrid_item_size_set(m_gengrid, 580 * efl_scale, 580 * efl_scale); + + addItems(); + +} + +void HistoryUI::showActionBar() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + elm_theme_extension_add(NULL, edjFilePath.c_str()); + m_genListActionBar = elm_genlist_add(m_history_layout); + elm_object_part_content_set(m_history_layout, "action_bar_history_genlist", m_genListActionBar); + elm_genlist_homogeneous_set(m_genListActionBar, EINA_FALSE); + elm_genlist_multi_select_set(m_genListActionBar, EINA_FALSE); + elm_genlist_select_mode_set(m_genListActionBar, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_genlist_mode_set(m_genListActionBar, ELM_LIST_LIMIT); + elm_genlist_decorate_mode_set(m_genListActionBar, EINA_TRUE); + evas_object_size_hint_weight_set(m_genListActionBar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + m_itemClassActionBar = elm_genlist_item_class_new(); + m_itemClassActionBar->item_style = "action_bar_history_items"; + m_itemClassActionBar->func.text_get = NULL; // &listTopItemTextGet; + m_itemClassActionBar->func.content_get = &listActionBarContentGet; + m_itemClassActionBar->func.state_get = 0; + m_itemClassActionBar->func.del = 0; + + ItemData * id = new ItemData; + id->historyUI = this; + Elm_Object_Item* elmItem = elm_genlist_item_append(m_genListActionBar, //genlist + m_itemClassActionBar, //item Class + id, + NULL, //parent item + ELM_GENLIST_ITEM_NONE,//item type + NULL, + NULL //data passed to above function + ); + id->e_item = elmItem; + ItemData * id2 = new ItemData; + id2->historyUI = this; + Elm_Object_Item* elmItem2 = elm_genlist_item_append(m_genListActionBar, //genlist + m_itemClassActionBar, //item Class + id2, + NULL, //parent item + ELM_GENLIST_ITEM_NONE,//item type + NULL, + NULL //data passed to above function + ); + id2->e_item = elmItem2; +} + +Evas_Object* HistoryUI::listActionBarContentGet(void* data, Evas_Object* obj , const char* part) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + if(!strcmp(part, "clearhistory_click")) + { + Evas_Object *clearHistoryButton = elm_button_add(obj); + elm_object_style_set(clearHistoryButton, "history_button"); + evas_object_smart_callback_add(clearHistoryButton, "clicked", tizen_browser::base_ui::HistoryUI::_clearhistory_clicked, data); + return clearHistoryButton; + } + else if(!strcmp(part, "close_click")) + { + Evas_Object *close_click = elm_button_add(obj); + elm_object_style_set(close_click, "history_button"); + evas_object_smart_callback_add(close_click, "clicked", HistoryUI::close_clicked_cb, data); + return close_click; + } + + return NULL; +} + +void HistoryUI::close_clicked_cb(void * data, Evas_Object * /* obj */, void * event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData * id = static_cast(data); + id->historyUI->closeHistoryUIClicked(std::string()); + id->historyUI->clearItems(); +} + +char* HistoryUI::listTodayTextGet(void* data, Evas_Object* obj , const char* part) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + HistoryItemData * id = static_cast(data); + if(!strcmp(part, "history_url_text")) + { + if(!id->item->getUrl().empty()){ + std::string str = id->item->getTitle() + " - " + id->item->getUrl(); + return strdup(str.c_str()); + } + } + return NULL; +} + +void HistoryUI::_clearhistory_clicked(void * data, Evas_Object * /* obj */, void * event_info) +{ + /* + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + ItemData* itemData = reinterpret_cast(data); + itemData->tabUI->clearItems(); + itemData->tabUI->newTabClicked(std::string()); + */ +} + +void HistoryUI::addItems() +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + for (size_t i = 0; i < 1; i++) { + HistoryItemData *itemData = new HistoryItemData(); + itemData->historyUI = std::shared_ptr(this); + Elm_Object_Item* historyView = elm_gengrid_item_append(m_gengrid, m_item_class, itemData, NULL, this); + elm_gengrid_item_selected_set(historyView, EINA_FALSE); + } + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); +} + +void HistoryUI::addHistoryItem(std::shared_ptr hi) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + HistoryItemData *itemData = new HistoryItemData(); + itemData->item = hi; + itemData->historyUI = std::shared_ptr(this); + m_history_item_data.push_back(itemData); + setEmptyGengrid(false); +} + +void HistoryUI::addHistoryItems(std::vector > items) +{ + BROWSER_LOGD("%s:%d %s", __FILE__, __LINE__, __func__); + m_history_item_data.clear(); + for (auto it = items.begin(); it != items.end(); ++it) + addHistoryItem(*it); +} + +char* HistoryUI::_grid_text_get(void *data, Evas_Object *obj, const char *part) +{ + BROWSER_LOGD("%s:%d %s part=%s", __FILE__, __LINE__, __func__, part); + HistoryItemData *itemData = reinterpret_cast(data); + const char* item_name = NULL; + if (!strcmp(part, "menu_label")) { + item_name = "Today"; + return strdup(item_name); + } + return NULL; +} + +Evas_Object * HistoryUI::_history_grid_content_get(void *data, Evas_Object *obj, const char *part) +{ + BROWSER_LOGD("[%s:%d] part : %s", __PRETTY_FUNCTION__, __LINE__, part); + HistoryItemData * id = static_cast(data); + if(!strcmp(part, "history_genlist")) + { + id->historyUI->m_genListToday = elm_genlist_add(id->historyUI->m_history_layout); + + elm_genlist_homogeneous_set(id->historyUI->m_genListToday, EINA_FALSE); + elm_genlist_multi_select_set(id->historyUI->m_genListToday, EINA_FALSE); + elm_genlist_select_mode_set(id->historyUI->m_genListToday, ELM_OBJECT_SELECT_MODE_ALWAYS); + elm_genlist_mode_set(id->historyUI->m_genListToday, ELM_LIST_LIMIT); + elm_genlist_decorate_mode_set(id->historyUI->m_genListToday, EINA_TRUE); + evas_object_size_hint_weight_set(id->historyUI->m_genListToday, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + id->historyUI->m_itemClassToday = elm_genlist_item_class_new(); + id->historyUI->m_itemClassToday->item_style = "history_url_items"; + id->historyUI->m_itemClassToday->func.text_get = &listTodayTextGet; + id->historyUI->m_itemClassToday->func.content_get = NULL; + id->historyUI->m_itemClassToday->func.state_get = 0; + id->historyUI->m_itemClassToday->func.del = 0; + + for(auto it = m_history_item_data.begin(); it != m_history_item_data.end(); it++) { + Elm_Object_Item* historyView = elm_genlist_item_append(id->historyUI->m_genListToday, id->historyUI->m_itemClassToday, *it, NULL, ELM_GENLIST_ITEM_NONE, NULL, id->historyUI.get()); + id->historyUI->m_map_history_views.insert(std::pair((*it)->item->getUrl(), historyView)); + } + + return id->historyUI->m_genListToday; + } + return NULL; +} + +void HistoryUI::removeHistoryItem(const std::string& uri) +{ + BROWSER_LOGD("[%s] uri=%s", __func__, uri.c_str()); + if(m_map_history_views.find(uri) == m_map_history_views.end()) { + return; + } + + Elm_Object_Item* historyView = m_map_history_views.at(uri); + elm_object_item_del(historyView); + m_map_history_views.erase(uri); + + setEmptyGengrid(0 == m_map_history_views.size()); +} + +void HistoryUI::_item_deleted(void * /* data */, Evas_Object * /* obj */) +{ + +} + +void HistoryUI::_itemSelected(void * data, Evas_Object * /* obj */, void * event_info) +{ + Elm_Object_Item * selected = reinterpret_cast(event_info); + HistoryItemData * itemData = reinterpret_cast(elm_object_item_data_get(selected)); + HistoryUI * self = reinterpret_cast(data); + + self->historyItemClicked(itemData->item); +} + +void HistoryUI::_deleteHistory(void *data, Evas_Object * /* obj */, void * /* event_info */) +{ + HistoryItemData * itemData = reinterpret_cast(data); + //itemData->historysUI->historyDeleteClicked(itemData->item); +} + +void HistoryUI::_thumbSelected(void * data, Evas_Object * /* obj */, void * /* event_info */) +{ + HistoryItemData * itemData = reinterpret_cast(data); + // itemData->historysUI->historyClicked(itemData->item); +} + +Evas_Object* HistoryUI::createNoHistorysLabel() +{ + Evas_Object *label = elm_label_add(m_parent); + elm_object_text_set(label, "No favorite websites."); + evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL); + return label; +} + +void HistoryUI::setEmptyGengrid(bool setEmpty) +{ + if(setEmpty) { + elm_object_part_content_set(m_gengrid, "elm.swallow.empty", createNoHistorysLabel()); + } else { + elm_object_part_content_set(m_gengrid, "elm.swallow.empty", NULL); + } +} + +void HistoryUI::hide() +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + evas_object_hide(elm_layout_content_get(m_history_layout, "m_genListToday")); + evas_object_hide(elm_layout_content_get(m_history_layout, "m_gengrid")); + evas_object_hide(elm_layout_content_get(m_history_layout, "m_genListActionBar")); + evas_object_hide(m_history_layout); +} + +void HistoryUI::clearItems() +{ + hide(); + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + elm_genlist_clear(m_genListToday); + elm_gengrid_clear(m_gengrid); + elm_genlist_clear(m_genListActionBar); + m_map_history_views.clear(); + m_history_item_data.clear(); + setEmptyGengrid(true); +} + +void HistoryUI::focusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,in", "over2"); + + // selected manually + elm_gengrid_item_selected_set(item, EINA_TRUE); +} + +void HistoryUI::unFocusItem(void* /*data*/, Evas_Object* /*obj*/, void* event_info) +{ + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + Elm_Object_Item *item = reinterpret_cast(event_info); + elm_object_item_signal_emit( item, "mouse,out", "over2"); + + // unselected manually + elm_gengrid_item_selected_set(item, EINA_FALSE); +} + +} +} diff --git a/services/HistoryUI/HistoryUI.h b/services/HistoryUI/HistoryUI.h new file mode 100644 index 0000000..89c26a3 --- /dev/null +++ b/services/HistoryUI/HistoryUI.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * + * 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 HISTORYUI_H +#define HISTORYUI_H + +#include +#include + +#include "AbstractUIComponent.h" +#include "AbstractService.h" +#include "ServiceFactory.h" +#include "service_macros.h" +#include "services/HistoryService/HistoryItem.h" + +namespace tizen_browser{ +namespace base_ui{ + +class BROWSER_EXPORT HistoryUI + : public tizen_browser::interfaces::AbstractUIComponent + , public tizen_browser::core::AbstractService +{ +public: + HistoryUI(); + ~HistoryUI(); + void init(Evas_Object *main_layout); + virtual std::string getName(); + void addHistoryItem(std::shared_ptr); + void addHistoryItems(std::vector >); + void removeHistoryItem(const std::string& uri); + void clearItems(); + void hide(); + void showActionBar(); + void show(Evas_Object *main_layout); + void addItems(); + boost::signals2::signal closeHistoryUIClicked; + boost::signals2::signal)> historyItemClicked; + boost::signals2::signal)> historyDeleteClicked; +private: + static char* _grid_text_get(void *data, Evas_Object *obj, const char *part); + static Evas_Object * _history_grid_content_get(void *data, Evas_Object *obj, const char *part); + static Evas_Object * _grid_content_get(void *data, Evas_Object *obj, const char *part); + static Evas_Object* listActionBarContentGet(void *data, Evas_Object *obj, const char *part); + static Evas_Object* listTodayContentGet(void *data, Evas_Object *obj, const char *part); + static void _itemSelected(void * data, Evas_Object * obj, void * event_info); + static void _item_deleted(void *data, Evas_Object *obj); + static void _thumbSelected(void * data, Evas_Object * obj, void * event_info); + static void _deleteHistory(void *data, Evas_Object *obj, void *event_info); + static void _clearhistory_clicked(void *data, Evas_Object *obj, void *event_info); + void setEmptyGengrid(bool setEmpty); + static char* listTodayTextGet(void* data, Evas_Object* obj , const char* part); + static void close_clicked_cb(void *data, Evas_Object *obj, void *event_info); + +private: + + Evas_Object *m_history_layout; + Evas_Object *m_historyitem_layout; + Evas_Object *m_genListActionBar; + Evas_Object *m_genListToday; + Elm_Genlist_Item_Class *m_itemClassActionBar; + Elm_Genlist_Item_Class *m_itemClassToday; + Evas_Object *m_gengrid; + Evas_Object *m_parent; + Elm_Gengrid_Item_Class * m_item_class; + std::map m_map_history_views; + bool m_gengridSetup; + std::string edjFilePath; + Evas_Object *createNoHistorysLabel(); + + static void focusItem(void* data, Evas_Object* obj, void* event_info); + static void unFocusItem(void* data, Evas_Object* obj, void* event_info); +}; + + +} +} + +#endif // BOOKMARKSUI_H diff --git a/services/HistoryUI/edc/History.edc b/services/HistoryUI/edc/History.edc new file mode 100644 index 0000000..4f36aef --- /dev/null +++ b/services/HistoryUI/edc/History.edc @@ -0,0 +1,827 @@ + +#define DEBUG_RECT_OVER(over_part, r, g, b) \ + part { name: __CONCAT("dbg_rect_at_", __stringify(__LINE__)); \ + \ +scale:1; \ + type : RECT; \ + repeat_events: 1; \ + description { \ + state: "default" 0.0; \ + visible: 1; \ + color: r g b 128; \ + rel1 { to: over_part; relative: 0 0; } \ + rel2 { to: over_part; relative: 1 1; } \ + } \ + } + +collections { + +group{ + name: "elm/button/base/history_button"; + parts{ + part{ + name: "button"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + color: 0 0 0 0; + } + } + part{ + name: "over"; + type: RECT; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "button";} + rel2 { relative: 1.0 1.0;to: "button";} + color: 0 0 0 0; + } + } + } + programs{ + program { + name: "mouse_click"; + signal: "mouse,clicked,1"; + source: "over"; + script { + emit("elm,action,click", ""); + } + } + } + } + +group { + name: "history-layout"; + data { + item: "highlight_focus" "off"; + } + images { + image: "btn_bar_stop_nor.png" COMP; + } + color_classes{ + color_class{ + name: "defaultBgColor"; + color: 18 22 34 255; + } + color_class{ + name: "focusBgColor"; + color: 69 143 255 255; + } + color_class{ + name: "highlightBgColor"; + color: 69 143 255 102; + } + color_class{ + name: "imageHighlight"; + color: 255 255 255 102; + } + color_class{ + name: "focusbtBgColor"; + color: 22 120 224 255; + } + color_class{ + name: "titleTextColor"; + color: 74 74 74 255; + } + color_class{ + name: "focusTextColor"; + color: 255 255 255 255; + } + color_class{ + name: "highlightTextColor"; + color: 255 255 255 51; + } + color_class{ + name: "urlTextColor"; + color: 116 116 116 204; + } + color_class{ + name: "transparent"; + color: 0 0 0 0; + } + } + + images { + image: "web_shadow.png" COMP; + } + parts { + part { name: "action_bar_history_genlist_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + min: 1920 104; + max: 1920 104; + color: 70 143 254 255; + rel1 { + relative: 0 0; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "gengrid_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + min: 1920 976; + max: 1920 976; + color: 231 231 231 255; + rel1 { + relative: 0 1; to: "action_bar_history_genlist_bg"; + } + + rel2{ + relative: 1 1; + } + } + } + part { name: "action_bar_history_genlist"; + type : SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 1920 104; + max: 1920 104; + align: 0.0 0.0; + fixed: 0 0; + rel1 { relative: 0.0 0.0; to: "action_bar_history_genlist_bg";} + rel2 { relative: 1.0 1.0; } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part { name: "history_gengird"; + type : SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 1920 976; + max: 1920 976; + align: 0.0 0.0; + fixed: 0 0; + rel1 { relative: 0.0 0.0; to: "gengrid_bg"; offset: 63 63;} + rel2 { relative: 1.0 1.0; } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } +} + + + group { name: "elm/genlist/item/history_url_items/default"; + min: 500 600; + max: 500 600; + data.item: "texts" "history_url_text"; + //data.item: "contents" "clearhistory_click"; + parts{ + part { + name: "bg_clipper"; + scale:1; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + align: 0 0; + min: 1004 60; + max: 1004 60; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + } + } + part { + name: "history_url_text"; + scale:1; + mouse_events: 1; + type: TEXT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + min: 1004 55; + max: 1004 55; + color: 116 116 116 255; + rel1 { relative: 0.0 0.0; to: "bg_clipper"; } + rel2 { relative: 1.0 1.0; to: "bg_clipper"; } + text { + text: "Title - url"; + font: "Sans"; + size: 28; + align: 0.0 0.0; + } + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor1; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusbtBgColor1; + visible: 1; + } + } + } + +} + group { name: "elm/genlist/item/action_bar_history_items/default"; + min: 1920 104; + max: 1920 104; + data.item: "texts" "clearhistory_text"; + data.item: "contents" "clearhistory_click close_click"; + parts{ + part { + name: "bg_clipper"; + scale:1; + type: RECT; + description { + state: "default" 0.0; + color: 255 255 255 255; + align: 0 0; + min: 1920 104; + max: 1920 104; + rel1 { relative: 0.0 0.0;} + rel2 { relative: 1.0 1.0;} + } + } + + + part { + name: "item3_bg"; + type: SWALLOW; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 348 65; + max: 348 65; + align: 0.5 0.5; + rel1 { relative: 0.0 0.0;to: "bg_clipper";} + rel2 { relative: 1.0 1.0;to: "bg_clipper";} + color : 255 255 255 255; + + } + } + + part { + name: "HistoryManager"; + scale:1; + mouse_events: 1; + type: TEXT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 .3; + min: 348 65; + max: 348 65; + color: 116 116 116 255; + rel1 { relative: 0.0 0.0; to: "item3_bg"; } + rel2 { relative: 1.0 1.0; to: "item3_bg"; } + text { + text: "History Manager"; + font: "Sans"; + size: 40; + align: 0.5 0.5; + } + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor1; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusbtBgColor1; + visible: 1; + } + } + part { + name: "clearhistory_button_bg"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + color: 192 192 192 255; + align: 0 0; + min: 220 65; + max: 220 65; + rel1 { relative: 0.0 0.0; to: "bg_clipper"; offset: 1500 20;} + rel2 { relative: 1.0 1.0; to: "bg_clipper"; } + } + } + part { + name: "clearhistory_button"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + + min: 220 65; + max: 220 65; + rel1 { relative: 0.0 0.0; to: "clearhistory_button_bg"; } + rel2 { relative: 1.0 1.0; to: "clearhistory_button_bg"; } + color_class: transparent; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusbtBgColor; + visible: 1; + } + } + part{ + name: "clearhistory_text"; + type: TEXT; + scale: 1; + description { state: "default" 0.0; + + visible: 1; + fixed: 1 1; + rel1 { relative: 0.0 0.0;to: "clearhistory_button";} + rel2 { relative: 1.0 1.0;to: "clearhistory_button";} + color: 0 0 0 255; + text { + text: "Clear History"; + font: "Sans"; + size: 27; + align: 0.5 0.5; + } + } + } + + part { + name: "clearhistory_over"; + scale:1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + + min: 220 65; + max: 220 65; + rel1 { relative: 0.0 0.0; to: "clearhistory_button";} + rel2 { relative: 1.0 1.0; to: "clearhistory_button";} + color_class: transparent; + } + } + + part { + name: "clearhistory_click"; + scale:1; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 220 65; + max: 220 65; + rel1 { relative: 0.0 0.0; to: "clearhistory_over";} + rel2 { relative: 1.0 1.0; to: "clearhistory_over";} + color_class: transparent; + } + } + + part { + name: "close_bg"; + scale:1; + mouse_events: 1; + type: RECT; + description { + state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0.5; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "bg_clipper"; offset: 1758 0;} + rel2 { relative: 1.0 1.0; to: "bg_clipper";} + color_class: transparent; + } + description { + state: "highlight" 0.0; + inherit: "default" 0.0; + color_class: focusBgColor; + visible: 1; + } + description { + state: "focus" 0.0; + inherit: "default" 0.0; + color_class: focusDelBgColor; + visible: 1; + } + } + part { + name: "close_icon"; + type: IMAGE; + scale: 1; + description { state: "default" 0.0; + visible: 1; + fixed: 1 1; + align: 0 0; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "close_bg";} + rel2 { relative: 1.0 1.0; to: "close_bg";} + image.normal: "btn_bar_stop_nor.png"; + } + description { state: "highlight" 0.0; + inherit: "default" 0.0; + visible: 1; + } + description { state: "focus" 0.0; + inherit: "highlight" 0.0; + } + } + part { + name: "close_over"; + scale:1; + + type: RECT; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "close_bg";} + rel2 { relative: 1.0 1.0; to: "close_bg";} + color_class: transparent; + } + } + part { + name: "close_click"; + scale:1; + type: SWALLOW; + description { + state: "default" 0.0; + visible: 1; + align: 0 0; + fixed: 1 1; + min: 82 102; + max: 82 102; + rel1 { relative: 0.0 0.0; to: "close_over";} + rel2 { relative: 1.0 1.0; to: "close_over";} + color_class: transparent; + } + } + + } + programs{ + + program { + name: "mouse_click_clearhistory"; + signal: "mouse,clicked,1"; + source: "clearhistory_over"; + script { + emit("elm,action,click", ""); + } + } + program { + name: "mouse_in_clearhistory_click"; + signal: "mouse,in"; + source: "clearhistory_*"; + action: STATE_SET "highlight" 0.0; + target: "clearhistory_button"; + target: "clearhistory_over"; + target: "clearhistory_text"; + } + program { + name: "mouse_out_clearhistory_click"; + signal: "mouse,out"; + source: "clearhistory_*"; + action: STATE_SET "default" 0.0; + target: "clearhistory_button"; + target: "clearhistory_over"; + target: "clearhistory_text"; + } + program { + name: "mouse_in_close_click"; + signal: "mouse,in"; + source: "close_click"; + script { + emit("mouse_in_close_click", ""); + } + } + program { + name: "mouse_out_close_click"; + signal: "mouse,out"; + source: "close_click"; + script { + emit("mouse_out_close_click", ""); + } + } + program { + name: "mouse_in_close"; + signal: "mouse_in_close_click"; + source: ""; + action: STATE_SET "highlight" 0.0; + target: "close_over"; + target: "close_bg"; + target: "close_icon"; + } + program { + + name: "mouse_out_close"; + signal: "mouse_out_close_click"; + source: ""; + action: STATE_SET "default" 0.0; + target: "close_over"; + target: "close_bg"; + target: "close_icon"; + } + } + } + +group { name: "elm/gengrid/item/history_item/default"; + +data.item: "texts" "menu_label"; + data.item: "contents" "history_genlist"; + images { + image: "web_frame_selected.png" COMP; + image: "ico_bg_round_shape_37x37.png" COMP; + } + styles { + style { name: "textblock_white"; + base: "font=Sans font_size="20" color=#5c5c5c"; + } + } + +styles { + style { name: "textblock_white_bold"; + base: "font=Sans:style=Bold font_size="20" color=#5c5c5c"; + } + } + parts { + + part { name: "menu_label_bg"; + type: RECT; + description { state: "default" 0.0; + min: 1004 80; + max: 1004 80; + align: 0.0 0.0; + color: 0 0 0 0; + + } + description { state: "selected" 0.0; + inherit: "default" 0.0; + color: 70 143 254 255; + } + } + + part { name: "menu_label"; + type: TEXT; + description { state: "default" 0.0; + min: 1004 80; + max: 1004 80; + align: 0.5 0.5; + fixed: 0 0; + visible: 1; + rel1 { relative: 0.0 0.0;to: "menu_label_bg";} + rel2 { relative: 1.0 1.0;to: "menu_label_bg";} + + color: 92 92 92 255; + text { + text: "Web page title"; + font: "Sans"; + size: 28; + align: 0.0 0.0; + } + } + } + + + part { name: "genlist_bg"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + visible: 1; + align: 0.0 0.0; + min: 1004 600; + max: 1004 600; + color: 255 255 255 255; + rel1 { + relative: 0 1; to: "menu_label_bg"; + } + rel2{ + relative: 1 1; + } + } + } + + part { name: "history_genlist"; + type : SWALLOW; + scale: 1; + description { + state: "default" 0.0; + visible: 1; + min: 1004 600; + max: 1004 600; + align: 0.0 0.0; + fixed: 0 0; + rel1 { relative: 0.0 0.0; to: "genlist_bg";} + rel2 { relative: 1.0 1.0; } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + +} +} + +group { name: "elm/button/base/thumbButton"; + images { + image: "ico_delete.png" COMP; + } + parts { + part { name: "elm.swallow.content"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + align: 0.0 0.0; + } + } + } + + programs { + program { name: "mouse,clicked"; + signal: "mouse,down,1"; + source: "elm.swallow.content"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + } +} + +group { name: "elm/button/base/deleteButton"; + parts { + part { name: "delete_x"; + type: IMAGE; + description { state: "default" 0.0; + min: 27 27; + max: 27 27; + image.normal: "ico_delete.png"; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + align: 0.5 0.5; + visible: 0; + } + description { state: "over" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + + part { name: "elm.swallow.content"; + type: RECT; + mouse_events: 1; + repeat_events: 1; + description { state: "default" 0.0; + color: 0 0 0 0; + visible: 1; + rel1.relative: 0.0 0.0; + rel2.relative: 1.0 1.0; + align: 0.0 0.0; + } + } + } + programs { + program { name: "mouse,clicked"; + signal: "mouse,down,1"; + source: "elm.swallow.content"; + action: SIGNAL_EMIT "elm,action,click" ""; + } + program { name: "mouse_in"; + signal: "mouse,in"; + source: "elm.swallow.content"; + action: STATE_SET "over" 0.0; + target: "delete_x"; + } + program { name: "mouse_out"; + signal: "mouse,out"; + source: "elm.swallow.content"; + action: STATE_SET "default" 0.0; + target: "delete_x"; + } + } +} + +group { name: "elm/gengrid/base/bookmarks"; + data { + item: "focus_highlight" "off"; + } + + parts { + part { name: "clipper"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + rel1 { + relative: 0 0; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "background"; + type: RECT; + mouse_events: 0; + description { state: "default" 0.0; + color: 42 50 64 255; + rel1 { + relative: 0 0; + } + rel2{ + relative: 1 1; + } + } + } + part { name: "elm.swallow.content"; + type: SWALLOW; + clip_to: "clipper"; + description { state: "default" 0.0; + rel1 { + relative: 0 0; + offset: 169 110; + } + rel2 { + relative: 1 1; + offset: -169 0; + } + } + } + part { name: "elm.swallow.empty"; + type: SWALLOW; + description { state: "default" 0.0; + align: 0.5 0.5; + rel1 { + relative: 0.5 0.5; + } + rel2 { + relative: 0.5 0.5; + } + } + } + } +} +} diff --git a/services/HistoryUI/edc/error.edc b/services/HistoryUI/edc/error.edc new file mode 100644 index 0000000..0291971 --- /dev/null +++ b/services/HistoryUI/edc/error.edc @@ -0,0 +1,144 @@ +collections { + images { + image: "web_browsing_icon_error.png" COMP; + } + group { name: "error_message"; + styles { + style { name: "mssage_style"; + base: "font=Sans font_size=35 color=#d3d3d3 wrap=word align=0.5"; + } + style { name: "mssage_hint_style"; + base: "font=Sans font_size=24 color=#868686 wrap=word align=0.5"; + } + } + parts { + part{ + name: "message_background"; + type: RECT; + description{ + state: "default" 0.0; + visible: 1; + rel1.relative: 0 0; + rel2.relative: 1 1; + color: 42 50 64 255; + } + } + part{ + name: "error_message_background"; + type:RECT; + description{ + state: "default" 0.0; + visible: 1; + min: 1582 730; + max: 1582 730; + fixed: 1 1; + align: 0.5 0.5; + color: 30 38 50 153; + } + } + part{ + name: "err_ico"; + type: IMAGE; + description{ + state: "default" 0.0; + visible: 1; + min: 140 140; + max:140 140; + fixed: 1 1; + align: 0.5 0; + rel1{ + relative: 0 0; + offset:0 163; + to: "error_message_background"; + } + rel2{ + relative: 1 1; + to: "error_message_background"; + } + image{ + normal: "web_browsing_icon_error.png"; + } + } + } + + part{ + name: "error_text"; + type: TEXTBLOCK; + description{ + state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 1502 96; + max: 1502 96; + //color: 211 211 211 255; + align: 0.5 0; + rel1{ + relative: 0 1; + to_x: "error_message_background"; + to_y: "err_ico"; + } + rel2{ + relative: 1 1; + to: "error_message_background"; + } + text{ + style: "mssage_style"; + text: "Server not found.
sdf Please check the followings:"; + //min: 0 0; + //max: 1 1; + //align: 1 0; + //size: 35; + } + } + } + + + part{ + name: "error_hint"; + type: TEXTBLOCK; + description{ + state: "default" 0.0; + visible: 1; + fixed: 1 1; + min: 1502 117; + max: 1502 117; + color: 134 134 134 255; + align: 0.5 0; + rel1{ + relative: 0 1; + to_x: "error_message_background"; + to_y: "error_text"; + } + rel2{ + relative: 1 1; + to: "error_message_background"; + } + text{ + max: 0 1; + style: "mssage_hint_style"; + text: "Check for any typing error in URL.
" + "Check your network settings.
" + "Try again later.
" + "Click refresh to reload."; + } + } + } + } +/* + programs { + program { name: "mouse_down"; + signal: "mouse,down,1"; + source: "logo"; + action: STATE_SET "hide" 0.0; + target: "logo"; + } + program { name: "mouse_up"; + signal: "mouse,up,1"; + source: "logo"; + action: STATE_SET "default" 0.0; + target: "logo"; + } + } +*/ + } +} diff --git a/services/HistoryUI/images/btn_bar_stop_nor.png b/services/HistoryUI/images/btn_bar_stop_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..c5cdc11ca8ea537497a1a794d79d40362f8659a9 GIT binary patch literal 3255 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 literal 0 HcmV?d00001 diff --git a/services/SimpleUI/CMakeLists.txt b/services/SimpleUI/CMakeLists.txt index 4a5c6d7..96ceae1 100644 --- a/services/SimpleUI/CMakeLists.txt +++ b/services/SimpleUI/CMakeLists.txt @@ -48,8 +48,7 @@ include_directories(${CMAKE_SOURCE_DIR}/services/StorageService/Storage/include) include_directories(${CMAKE_SOURCE_DIR}/services/FavoriteService) include_directories(${CMAKE_SOURCE_DIR}/services/HistoryService) include_directories(${CMAKE_SOURCE_DIR}/services/MoreMenuUI) -#MERGE_ME -#include_directories(${CMAKE_SOURCE_DIR}/services/HistoryUI) +include_directories(${CMAKE_SOURCE_DIR}/services/HistoryUI) include_directories(${CMAKE_SOURCE_DIR}/services/MainUI) #MERGE_ME #include_directories(${CMAKE_SOURCE_DIR}/services/SettingsUI) @@ -70,8 +69,8 @@ add_dependencies(${PROJECT_NAME} HistoryService) #add_dependencies(${PROJECT_NAME} MoreMenuUI) add_dependencies(${PROJECT_NAME} BookmarkManagerUI) add_dependencies(${PROJECT_NAME} MainUI) +add_dependencies(${PROJECT_NAME} HistoryUI) #MERGE_ME -#add_dependencies(${PROJECT_NAME} HistoryUI) #add_dependencies(${PROJECT_NAME} SettingsUI) add_dependencies(${PROJECT_NAME} TabUI) add_dependencies(${PROJECT_NAME} PlatformInputManager) @@ -81,8 +80,8 @@ target_link_libraries(${PROJECT_NAME} StorageService) target_link_libraries(${PROJECT_NAME} HistoryService) target_link_libraries(${PROJECT_NAME} MoreMenuUI) target_link_libraries(${PROJECT_NAME} MainUI) +target_link_libraries(${PROJECT_NAME} HistoryUI) #MERGE_ME -#target_link_libraries(${PROJECT_NAME} HistoryUI) #target_link_libraries(${PROJECT_NAME} SettingsUI) target_link_libraries(${PROJECT_NAME} TabUI) target_link_libraries(${PROJECT_NAME} BookmarkManagerUI) diff --git a/services/SimpleUI/SimpleUI.cpp b/services/SimpleUI/SimpleUI.cpp index d5e6a6d..0862b66 100644 --- a/services/SimpleUI/SimpleUI.cpp +++ b/services/SimpleUI/SimpleUI.cpp @@ -1062,26 +1062,21 @@ void SimpleUI::showMainUI() void SimpleUI::showHistoryUI(const std::string& str) { -#if MERGE_ME BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - m_historyUI = - std::dynamic_pointer_cast - - (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.historyui")); - M_ASSERT(m_historyUI); - m_historyUI->closeHistoryUIClicked.connect(boost::bind(&SimpleUI::closeHistoryUI, this,_1)); - m_historyUI->historyItemClicked.connect(boost::bind(&SimpleUI::onHistoryClicked, this,_1)); - m_historyUI->addHistoryItems(getHistory()); - m_historyUI->show(m_window.get()); -#endif + m_historyUI = + std::dynamic_pointer_cast + (tizen_browser::core::ServiceManager::getInstance().getService("org.tizen.browser.historyui")); + M_ASSERT(m_historyUI); + m_historyUI->closeHistoryUIClicked.connect(boost::bind(&SimpleUI::closeHistoryUI, this,_1)); + m_historyUI->historyItemClicked.connect(boost::bind(&SimpleUI::onHistoryClicked, this,_1)); + m_historyUI->addHistoryItems(getHistory()); + m_historyUI->show(m_window.get()); } void SimpleUI::closeHistoryUI(const std::string& str) { -#if MERGE_ME - BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); - m_historyUI = nullptr; -#endif + BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__); + m_historyUI = nullptr; } void SimpleUI::showSettingsUI(const std::string& str) diff --git a/services/SimpleUI/SimpleUI.h b/services/SimpleUI/SimpleUI.h index 9d64421..713beda 100644 --- a/services/SimpleUI/SimpleUI.h +++ b/services/SimpleUI/SimpleUI.h @@ -35,8 +35,8 @@ // components #include "AbstractWebEngine.h" #include "MoreMenuUI.h" -#if MERGE_ME #include "HistoryUI.h" +#if MERGE_ME #include "SettingsUI.h" #endif #include "MainUI.h" @@ -295,8 +295,8 @@ private: std::shared_ptr m_moreMenuUI; std::shared_ptr m_bookmarkManagerUI; std::shared_ptr m_mainUI; -#if MERGE_ME std::shared_ptr m_historyUI; +#if MERGE_ME std::shared_ptr m_settingsUI; #endif std::shared_ptr m_tabUI; -- 2.7.4