Add history removal 95/85695/5
authorKamil Nowac <k.nowac@samsung.com>
Fri, 26 Aug 2016 13:06:49 +0000 (15:06 +0200)
committerKamil Nowac <k.nowac@samsung.com>
Wed, 31 Aug 2016 12:25:29 +0000 (14:25 +0200)
[Issue]    N/A
[Problem]  No history removal
[Solution] Feature added
[Verify]   Open history-> History should load.
           Open remove mode with context menu
           Select elements and remove them ->
           After browser restart should be no
           removed elements.

Change-Id: I42985c8d64b0014230a84030c179762516fbbae5

13 files changed:
services/BookmarkManagerUI/BookmarkManagerUI.cpp
services/BookmarkManagerUI/BookmarkManagerUI.h
services/HistoryUI/HistoryDaysListManager/HistoryDaysListManager.h
services/HistoryUI/HistoryDaysListManager/HistoryDaysListManagerMob.cpp
services/HistoryUI/HistoryDaysListManager/HistoryDaysListManagerMob.h
services/HistoryUI/HistoryDaysListManager/mob/WebsiteHistoryItem/WebsiteHistoryItemMob.cpp
services/HistoryUI/HistoryDaysListManager/mob/WebsiteHistoryItem/WebsiteHistoryItemMob.h
services/HistoryUI/HistoryDaysListManager/mob/WebsiteHistoryItem/WebsiteHistoryItemVisitItemsMob.cpp
services/HistoryUI/HistoryDaysListManager/mob/WebsiteHistoryItem/WebsiteHistoryItemVisitItemsMob.h
services/HistoryUI/HistoryUI.cpp
services/HistoryUI/HistoryUI.h
services/SimpleUI/SimpleUI.cpp
services/SimpleUI/SimpleUI.h

index 56af8c5fd42189abb348c23a8e9d0739b537eba1..43219d9049179e1b7cca6ba23c96243a2904abc0 100644 (file)
@@ -313,8 +313,8 @@ void BookmarkManagerUI::_cancel_clicked(void* data, Evas_Object*, void*)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     if (data) {
-        BookmarkManagerUI* bookmarkManagerUI = static_cast<BookmarkManagerUI*>(data);
-        bookmarkManagerUI->onBackPressed();
+        auto self = static_cast<BookmarkManagerUI*>(data);
+        self->onBackPressed();
     } else
         BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
 }
@@ -336,7 +336,10 @@ void BookmarkManagerUI::_accept_clicked(void* data, Evas_Object*, void*)
             break;
         case BookmarkManagerState::SelectFolder:
             bookmarkManagerUI->folderSelected(bookmarkManagerUI->m_folder_path.back());
-        break;
+            break;
+        case BookmarkManagerState::HistoryDeleteView:
+            bookmarkManagerUI->removeHistoryItems();
+            break;
         default:
             break;
         }
@@ -345,6 +348,27 @@ void BookmarkManagerUI::_accept_clicked(void* data, Evas_Object*, void*)
         BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
 }
 
+void BookmarkManagerUI::removeHistoryItems()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+
+    auto historyListSize = elm_genlist_items_count(m_historyGenlist);
+
+    for (int i = historyListSize; i > 1; --i) {
+        auto it = elm_genlist_nth_item_get(m_historyGenlist, i);
+        auto check = elm_object_item_part_content_get(it, "elm.swallow.end");
+        if (!check)
+            continue;
+        auto state = elm_check_state_get(check);
+        if (state == EINA_TRUE) {
+            elm_object_item_del(it);
+        }
+    }
+    elm_genlist_realized_items_update(m_historyGenlist);
+    removeSelectedItemsFromHistory();
+    m_naviframe->setRightButtonEnabled(false);
+
+}
 void BookmarkManagerUI::_prev_clicked(void* data, Evas_Object*, void*)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
@@ -465,9 +489,16 @@ void BookmarkManagerUI::addBookmarkItemCurrentFolder(services::SharedBookmarkIte
 void BookmarkManagerUI::addBookmarkItem(BookmarkData* item)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    Elm_Object_Item* bookmarkView = elm_genlist_item_append(m_genlist, m_bookmark_item_class,
-            item, nullptr, ELM_GENLIST_ITEM_NONE, _bookmarkItemClicked, item);
-    m_map_bookmark.insert(std::pair<unsigned int, Elm_Object_Item*>(item->bookmarkItem->getId(), bookmarkView));
+    Elm_Object_Item* bookmarkView = elm_genlist_item_append(
+        m_genlist,
+        m_bookmark_item_class,
+        item,
+        nullptr,
+        ELM_GENLIST_ITEM_NONE,
+        _bookmarkItemClicked,
+        item);
+    m_map_bookmark.insert(
+        std::pair<unsigned int, Elm_Object_Item*>(item->bookmarkItem->getId(), bookmarkView));
     elm_genlist_item_selected_set(bookmarkView, EINA_FALSE);
 }
 
@@ -483,6 +514,10 @@ void BookmarkManagerUI::onBackPressed()
         //TODO: We should go to the previous navigatorToolbar element if it exists.
         closeBookmarkManagerClicked();
         break;
+    case BookmarkManagerState::HistoryDeleteView:
+        changeState(BookmarkManagerState::HistoryView);
+        prepareHistoryContent();
+        break;
     case BookmarkManagerState::HistoryView:
         elm_toolbar_item_selected_set(
             elm_toolbar_first_item_get(m_modulesToolbar),
@@ -520,13 +555,25 @@ void BookmarkManagerUI::showContextMenu()
             alignContextMenu(*window);
         } else if (m_state == BookmarkManagerState::HistoryView) {
             createContextMenu(*window);
-            elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_OPT_REMOVE"), nullptr, nullptr, nullptr);
+            elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_OPT_REMOVE"), nullptr, _cm_history_remove_clicked, this);
             alignContextMenu(*window);
         }
     } else
         BROWSER_LOGE("[%s:%d] Signal not found", __PRETTY_FUNCTION__, __LINE__);
 }
 
+void BookmarkManagerUI::_cm_history_remove_clicked(void* data, Evas_Object*, void*)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data) {
+        auto bookmarkManagerUI = static_cast<BookmarkManagerUI*>(data);
+        _cm_dismissed(nullptr, bookmarkManagerUI->m_ctxpopup, nullptr);
+        bookmarkManagerUI->changeState(BookmarkManagerState::HistoryDeleteView);
+        bookmarkManagerUI->prepareHistoryContent();
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
 void BookmarkManagerUI::_cm_delete_clicked(void* data, Evas_Object*, void* )
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
@@ -614,7 +661,9 @@ void BookmarkManagerUI::prepareHistoryContent()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
 
-    auto historyGenlist = getHistoryGenlistContent(m_box);
+    bool removeMode = (m_state == BookmarkManagerState::HistoryDeleteView);
+    auto historyGenlist = getHistoryGenlistContent(m_box, m_naviframe, removeMode);
+
     elm_box_unpack_all(m_box);
 
     if (historyGenlist && *historyGenlist) {
@@ -746,10 +795,21 @@ void BookmarkManagerUI::changeState(BookmarkManagerState state)
         elm_object_part_content_unset(m_content, "navigator_toolbar");
         elm_object_signal_emit(m_content, "hide_navigator_toolbar", "ui");
         evas_object_show(m_modulesToolbar);
-        elm_genlist_reorder_mode_set(m_genlist, EINA_FALSE);
         elm_box_unpack(m_box, m_select_all);
         evas_object_hide(m_select_all);
         break;
+    case BookmarkManagerState::HistoryDeleteView:
+        updateNoBookmarkText();
+        m_naviframe->setTitle(_("IDS_BR_MBODY_HISTORY"));
+        m_naviframe->setPrevButtonVisible(false);
+        m_naviframe->setLeftButtonVisible(true);
+        m_naviframe->setRightButtonVisible(true);
+        m_naviframe->setRightButtonText(_("IDS_BR_SK_DELETE"));
+        updateDeleteTopContent();
+        elm_object_signal_emit(m_content, "hide_toolbars", "ui");
+        evas_object_hide(m_modulesToolbar);
+        evas_object_hide(m_navigatorToolbar);
+        break;
     case BookmarkManagerState::Default:
     default:
         updateNoBookmarkText();
@@ -793,7 +853,8 @@ void BookmarkManagerUI::reoderBookmarkItems()
 
 void BookmarkManagerUI::updateNoBookmarkText()
 {
-    if (m_map_bookmark.size() || m_state == BookmarkManagerState::HistoryView) {
+    if (m_map_bookmark.size() ||
+        (m_state == BookmarkManagerState::HistoryView || m_state == BookmarkManagerState::HistoryDeleteView)) {
         evas_object_hide(m_empty_layout);
         elm_object_signal_emit(m_content, "hide_overlay", "ui");
     } else {
@@ -806,8 +867,9 @@ void BookmarkManagerUI::updateDeleteClick(int id)
 {
     m_delete_count -= m_map_delete[id] ? 1 : -1;
     m_map_delete[id] = !m_map_delete[id];
-    elm_check_state_set(elm_object_part_content_get(m_select_all, "elm.swallow.end"), m_delete_count
-                        == elm_genlist_items_count(m_genlist));
+    elm_check_state_set(
+        elm_object_part_content_get(m_select_all, "elm.swallow.end"),
+        m_delete_count == elm_genlist_items_count(m_genlist));
     updateDeleteTopContent();
 }
 
index 4f589b48faeb0bd33ba9c39f3d915ac0009b7cd4..87aac3f422b078ccb86686bbfbc90204733c9d08 100644 (file)
@@ -84,7 +84,8 @@ public:
     boost::signals2::signal<void (std::shared_ptr<tizen_browser::services::BookmarkItem>)> bookmarkItemOrderEdited;
     boost::signals2::signal<void (std::shared_ptr<tizen_browser::services::BookmarkItem>)> bookmarkItemDeleted;
     boost::signals2::signal<void (int)> newFolderItemClicked;
-    boost::signals2::signal<Evas_Object* (Evas_Object*)> getHistoryGenlistContent;
+    boost::signals2::signal<Evas_Object* (Evas_Object*, SharedNaviframeWrapper, bool)> getHistoryGenlistContent;
+    boost::signals2::signal<void (void)> removeSelectedItemsFromHistory;
 
 private:
     using FolderData = struct
@@ -115,6 +116,7 @@ private:
     void updateNoBookmarkText();
     void updateDeleteClick(int id);
     void updateDeleteTopContent();
+    void removeHistoryItems();
 
     void prepareHistoryContent();
     void prepareBookmarksContent();
@@ -131,6 +133,7 @@ private:
     static void _genlist_bookmark_realized(void *, Evas_Object *, void *event_info);
     static void _select_all_down(void *data, Evas *, Evas_Object *, void *);
     static void _select_all_state_changed(void *data, Evas_Object *obj, void *);
+    static void _cm_history_remove_clicked(void*, Evas_Object*, void*);
     static void _cm_delete_clicked(void*, Evas_Object*, void*);
     static void _cm_share_clicked(void*, Evas_Object*, void*);
     static void _cm_reorder_clicked(void*, Evas_Object*, void*);
index c40c5d869dfd42a0048047f179f5cc3787207884..ecf2e91351ea1b4dffaa33d6721e849aab80dae1 100644 (file)
@@ -32,13 +32,17 @@ class HistoryDaysListManager
 {
 public:
     virtual ~HistoryDaysListManager() {}
-    virtual Evas_Object* createDaysList(Evas_Object* parentLayout) = 0;
+    virtual Evas_Object* createDaysList(Evas_Object* parentLayout, bool isRemoveMode) = 0;
     virtual void addHistoryItems(const std::shared_ptr<services::HistoryItemVector>& items, HistoryPeriod period) = 0;
     // clear everything including efl objects (result: empty list)
     virtual void clear() = 0;
     virtual void setFocusChain(Evas_Object* obj) = 0;
+    virtual void removeSelectedItems() = 0;
+    virtual bool isSelectAllChecked() const = 0;
     boost::signals2::signal<void (std::string url, std::string title)> signalHistoryItemClicked;
-    boost::signals2::signal<void (std::shared_ptr<const std::vector<int>> itemIds)> signalDeleteHistoryItems;
+    boost::signals2::signal<void (int)> signalDeleteHistoryItems;
+    boost::signals2::signal<void (bool)> setRightButtonEnabledForHistory;
+    boost::signals2::signal<void (int)> setSelectedItemsCount;
 };
 
 }
index 54bb8583cbb4314fbfcd5658b881f9c700780327..ee541a4c68dd4adefc52ea63eb221227326df313 100644 (file)
@@ -26,7 +26,6 @@
 #include "app_i18n.h"
 #include <services/HistoryUI/HistoryDeleteManager.h>
 
-
 #include <GeneralTools.h>
 #include <EflTools.h>
 
@@ -42,6 +41,12 @@ HistoryDaysListManagerMob::HistoryDaysListManagerMob()
     , m_history_day_item_class(elm_genlist_item_class_new())
     , m_history_item_item_class(elm_genlist_item_class_new())
     , m_history_download_item_class(elm_genlist_item_class_new())
+    , m_isRemoveMode(false)
+    , m_delete_count(0)
+    , m_history_count(0)
+    , m_isSelectAllChecked(EINA_FALSE)
+    , m_downloadManagerItem(nullptr)
+    , m_selectAllItem(nullptr)
 {
     createGenlistItemClasses();
     connectSignals();
@@ -49,6 +54,9 @@ HistoryDaysListManagerMob::HistoryDaysListManagerMob()
 
 HistoryDaysListManagerMob::~HistoryDaysListManagerMob()
 {
+    for (auto& data : m_itemDataVector)
+        delete data;
+
     for (auto& dayItem : m_dayItems)
         dayItem->setEflObjectsAsDeleted();
 
@@ -72,7 +80,7 @@ void HistoryDaysListManagerMob::createGenlistItemClasses()
 
     m_history_download_item_class->item_style = "type1";
     m_history_download_item_class->func.text_get = _genlist_history_download_text_get;
-    m_history_download_item_class->func.content_get =  nullptr;
+    m_history_download_item_class->func.content_get =  _genlist_history_download_content_get;
     m_history_download_item_class->func.state_get = nullptr;
     m_history_download_item_class->func.del = nullptr;
     m_history_download_item_class->decorate_all_item_style = "edit_default";
@@ -88,18 +96,97 @@ void HistoryDaysListManagerMob::createGenlistItemClasses()
 char* HistoryDaysListManagerMob::_genlist_history_day_text_get(void* data, Evas_Object *, const char *part)
 {
     if (data && part) {
-        auto item = static_cast<HistoryDayItemData*>(data);
+        auto item(static_cast<HistoryDayItemData*>(data));
         if (!strcmp(part, "elm.text"))
             return strdup(item->day.c_str());
     }
     return nullptr;
 }
 
+Evas_Object* HistoryDaysListManagerMob::_genlist_history_download_content_get(void* data, Evas_Object* obj, const char *part)
+{
+    if (data && part && !strcmp(part, "elm.swallow.end")) {
+        auto id(static_cast<ItemData*>(data));
+        if (id->self->m_isRemoveMode) {
+            auto check(elm_check_add(obj));
+            evas_object_smart_callback_add(check, "changed", _check_state_changed, id);
+            return check;
+        }
+    }
+    return nullptr;
+}
+
+void HistoryDaysListManagerMob::countItemsToDelete()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    m_delete_count = 0;
+    auto it(elm_genlist_first_item_get(m_genlist));
+    while ((it = elm_genlist_item_next_get(it))) {
+        auto check(elm_object_item_part_content_get(it, "elm.swallow.end"));
+        if (!check)
+            continue;
+        auto state(elm_check_state_get(check));
+        m_itemsToDelete[it] = state;
+        if (state == EINA_TRUE)
+            ++m_delete_count;
+        if (m_delete_count == m_history_count) {
+            auto first(elm_genlist_first_item_get(m_genlist));
+            auto firstCheck(elm_object_item_part_content_get(first, "elm.swallow.end"));
+            elm_check_state_set(firstCheck, EINA_TRUE);
+        }
+        if (it == elm_genlist_last_item_get(m_genlist) &&
+            m_delete_count == 0) {
+            auto first(elm_genlist_first_item_get(m_genlist));
+            auto firstCheck(elm_object_item_part_content_get(first, "elm.swallow.end"));
+            elm_check_state_set(firstCheck, EINA_FALSE);
+        }
+    }
+    setSelectedItemsCount(m_delete_count);
+    setRightButtonEnabledForHistory(m_delete_count);
+}
+
+void HistoryDaysListManagerMob::selectAllCheckboxes()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    auto it(elm_genlist_first_item_get(m_genlist));
+    auto firstCheck(elm_object_item_part_content_get(it, "elm.swallow.end"));
+    m_isSelectAllChecked = elm_check_state_get(firstCheck);
+
+    while ((it = elm_genlist_item_next_get(it))) {
+        auto check(elm_object_item_part_content_get(it, "elm.swallow.end"));
+        if (!check)
+            continue;
+        elm_check_state_set(check, m_isSelectAllChecked);
+    }
+    if (m_isSelectAllChecked == EINA_TRUE && elm_genlist_items_count(m_genlist) > 1)
+        m_delete_count = m_history_count;
+    if (m_isSelectAllChecked == EINA_FALSE)
+        m_delete_count = 0;
+    setSelectedItemsCount(m_delete_count);
+    setRightButtonEnabledForHistory(m_delete_count);
+}
+
+void HistoryDaysListManagerMob::_check_state_changed(void* data, Evas_Object* obj, void*)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data) {
+        auto id(static_cast<ItemData*>(data));
+        auto first(elm_genlist_first_item_get(id->self->m_genlist));
+        auto check(elm_object_item_part_content_get(first, "elm.swallow.end"));
+
+        if (check == obj)
+            id->self->selectAllCheckboxes();
+        else
+            id->self->countItemsToDelete();
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
 char* HistoryDaysListManagerMob::_genlist_history_download_text_get(void* data, Evas_Object*, const char *part)
 {
     if (data && part && !strcmp(part, "elm.text")) {
-        auto str = static_cast<const char*>(data);
-        return strdup(str);
+        auto id(static_cast<ItemData*>(data));
+        return strdup(id->str);
     }
     return nullptr;
 }
@@ -107,7 +194,7 @@ char* HistoryDaysListManagerMob::_genlist_history_download_text_get(void* data,
 char* HistoryDaysListManagerMob::_genlist_history_item_text_get(void* data, Evas_Object *, const char *part)
 {
     if (data && part) {
-        auto item = static_cast<WebsiteHistoryItemData*>(data);
+        auto item(static_cast<ItemData*>(data));
         if (!strcmp(part, "elm.text"))
             return strdup(item->websiteVisitItem->historyItem->getTitle().c_str());
         if (!strcmp(part, "elm.text.sub"))
@@ -118,17 +205,16 @@ char* HistoryDaysListManagerMob::_genlist_history_item_text_get(void* data, Evas
 
 Evas_Object* HistoryDaysListManagerMob::_genlist_history_day_content_get(void* data, Evas_Object* obj, const char *part)
 {
-    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     if (data && part && !strcmp(part, "elm.swallow.end")) {
-        auto dayData = static_cast<HistoryDayItemData*>(data);
+        auto dayData(static_cast<HistoryDayItemData*>(data));
 
-        auto arrow_layout = elm_layout_add(obj);
-        auto edjeDir = EDJE_DIR + std::string("HistoryUI/HistoryDaysList.edj");
+        auto arrow_layout(elm_layout_add(obj));
+        auto edjeDir(EDJE_DIR + std::string("HistoryUI/HistoryDaysList.edj"));
         elm_layout_file_set(arrow_layout, edjeDir.c_str(), "arrow-layout");
 
-        auto edje = elm_layout_edje_get(arrow_layout);
+        auto edje(elm_layout_edje_get(arrow_layout));
         edje_object_signal_emit(edje, "state,contracted,signal", "");
-        if(dayData->expanded)
+        if (dayData->expanded)
             edje_object_signal_emit(edje, "state,expanded,signal", "");
 
         return arrow_layout;
@@ -139,8 +225,20 @@ Evas_Object* HistoryDaysListManagerMob::_genlist_history_day_content_get(void* d
 Evas_Object* HistoryDaysListManagerMob::_genlist_history_item_content_get(void *data, Evas_Object* obj, const char *part)
 {
     if (data && !strcmp(part, "elm.swallow.icon")) {
-        auto item = static_cast<WebsiteHistoryItemData*>(data);
-        auto icon = item->favIcon->getEvasImage(obj);
+        auto item(static_cast<ItemData*>(data));
+        auto favicon(item->websiteHistoryItemData->favIcon);
+        if (!favicon) {
+            auto no_icon(elm_icon_add(obj));
+            elm_image_resizable_set(no_icon, EINA_TRUE, EINA_TRUE);
+            evas_object_size_hint_min_set(no_icon,
+                ELM_SCALE_SIZE(64),
+                ELM_SCALE_SIZE(64));
+            evas_object_size_hint_max_set(no_icon,
+                ELM_SCALE_SIZE(64),
+                ELM_SCALE_SIZE(64));
+            return no_icon;
+        }
+        auto icon(favicon->getEvasImage(obj));
         elm_image_resizable_set(icon, EINA_TRUE, EINA_TRUE);
         evas_object_size_hint_min_set(icon,
             ELM_SCALE_SIZE(64),
@@ -150,7 +248,7 @@ Evas_Object* HistoryDaysListManagerMob::_genlist_history_item_content_get(void *
             ELM_SCALE_SIZE(64));
         return icon;
     } else if (!data && !strcmp(part, "elm.swallow.icon")) {
-        auto icon = elm_icon_add(obj);
+        auto icon(elm_icon_add(obj));
         elm_image_resizable_set(icon, EINA_TRUE, EINA_TRUE);
         evas_object_size_hint_min_set(icon,
             ELM_SCALE_SIZE(64),
@@ -160,14 +258,40 @@ Evas_Object* HistoryDaysListManagerMob::_genlist_history_item_content_get(void *
             ELM_SCALE_SIZE(64));
         return icon;
     }
+    if (data && !strcmp(part, "elm.swallow.end")) {
+        auto check(elm_check_add(obj));
+        auto item(static_cast<ItemData*>(data));
+        if (item->self->m_isRemoveMode){
+            elm_genlist_select_mode_set(obj, ELM_OBJECT_SELECT_MODE_NONE);
+            evas_object_smart_callback_add(check, "changed", _check_state_changed, data);
+            if (item->self->m_selectAllItem &&
+                item->self->m_isSelectAllChecked == EINA_TRUE) {
+                auto firstCheck(elm_object_item_part_content_get(item->self->m_selectAllItem, "elm.swallow.end"));
+                elm_check_state_set(firstCheck, item->self->m_isSelectAllChecked);
+            }
+            elm_check_state_set(check, item->self->m_isSelectAllChecked);
+            return check;
+        } else {
+            evas_object_smart_callback_del(check, "changed", _check_state_changed);
+            elm_genlist_select_mode_set(obj, ELM_OBJECT_SELECT_MODE_ALWAYS);
+        }
+    }
     return nullptr;
 }
 
 Evas_Object* HistoryDaysListManagerMob::createDaysList(
-    Evas_Object* parent)
+    Evas_Object* parent, bool isRemoveMode)
 {
+    // TODO Download history is planed for the 2nd phase
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     m_parent = parent;
+
+    m_isRemoveMode = isRemoveMode;
+    if (m_genlist) {
+        elm_genlist_clear(m_genlist);
+        evas_object_del(m_genlist);
+        m_genlist = nullptr;
+    }
     m_genlist = elm_genlist_add(m_parent);
     tools::EflTools::setExpandHints(m_genlist);
     elm_scroller_policy_set(m_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
@@ -177,17 +301,29 @@ Evas_Object* HistoryDaysListManagerMob::createDaysList(
     evas_object_smart_callback_add(m_genlist, "expanded", _tree_item_expanded, this);
     evas_object_smart_callback_add(m_genlist, "contracted", _tree_item_contracted, this);
     evas_object_smart_callback_add(m_genlist, "pressed", _tree_item_pressed, this);
-
-    // TODO Download history is planed for the 2nd phase
-    auto el = elm_genlist_item_append(
-        m_genlist, m_history_download_item_class,
-        _("IDS_BR_BODY_DOWNLOAD_HISTORY"),
-        nullptr, ELM_GENLIST_ITEM_NONE,
-        nullptr, nullptr);
-    elm_object_item_disabled_set(el, EINA_TRUE);
-
-    evas_object_show(m_genlist);
-
+    m_history_count = 0;
+    auto id(new ItemData);
+    id->self = this;
+    id->websiteVisitItem = nullptr;
+    id->websiteHistoryItemData = nullptr;
+    id->str = nullptr;
+    if (!m_isRemoveMode) {
+        id->str = _("IDS_BR_BODY_DOWNLOAD_HISTORY");
+        m_downloadManagerItem = elm_genlist_item_append(
+            m_genlist, m_history_download_item_class,
+            id,
+            nullptr, ELM_GENLIST_ITEM_NONE,
+            nullptr, nullptr);
+        elm_object_item_disabled_set(m_downloadManagerItem, EINA_TRUE);
+    } else {
+        id->str = _("IDS_BR_OPT_SELECT_ALL");
+        m_selectAllItem = elm_genlist_item_append(
+            m_genlist, m_history_download_item_class,
+            id,
+            nullptr, ELM_GENLIST_ITEM_NONE,
+            nullptr, nullptr);
+    }
+    m_itemDataVector.push_back(id);
     return m_genlist;
 }
 
@@ -198,8 +334,8 @@ void HistoryDaysListManagerMob::addHistoryItems(
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     std::vector<WebsiteHistoryItemDataPtr> historyItems;
     for (auto& item : *items) {
-        auto pageViewItem = std::make_shared<WebsiteVisitItemData>(item);
-        std::shared_ptr<tools::BrowserImage> websiteFavicon = item->getFavIcon();
+        auto pageViewItem(std::make_shared<WebsiteVisitItemData>(item));
+        auto websiteFavicon(item->getFavIcon());
         if (!websiteFavicon || websiteFavicon->getSize() == 0)
             websiteFavicon = nullptr;
         historyItems.push_back(
@@ -208,6 +344,7 @@ void HistoryDaysListManagerMob::addHistoryItems(
                 item->getUrl(),
                 websiteFavicon,
                 pageViewItem));
+        ++m_history_count;
     }
     auto dayItem(std::make_shared<HistoryDayItemData>(toString(period), historyItems));
     appendDayItem(dayItem);
@@ -234,12 +371,6 @@ HistoryDayItemMobPtr HistoryDaysListManagerMob::getItem(
 
 void HistoryDaysListManagerMob::connectSignals()
 {
-    HistoryDayItemMob::signaButtonClicked.connect(
-        boost::bind(&HistoryDaysListManagerMob::onHistoryDayItemButtonClicked,
-            this, _1, _2));
-    WebsiteHistoryItemTitleMob::signalButtonClicked.connect(
-        boost::bind(&HistoryDaysListManagerMob::onWebsiteHistoryItemClicked,
-            this, _1, _2));
     WebsiteHistoryItemVisitItemsMob::signalButtonClicked.connect(
         boost::bind(
             &HistoryDaysListManagerMob::onWebsiteHistoryItemVisitItemClicked,
@@ -253,25 +384,31 @@ void HistoryDaysListManagerMob::_tree_item_expanded(void* data, Evas_Object* gen
         BROWSER_LOGD("[%s:%d] data is null", __PRETTY_FUNCTION__, __LINE__);
         return;
     }
-    auto it = static_cast<Elm_Object_Item*>(event_info);
-    auto self = static_cast<HistoryDaysListManagerMob*>(data);
-
+    auto it(static_cast<Elm_Object_Item*>(event_info));
+    auto self(static_cast<HistoryDaysListManagerMob*>(data));
     for (auto& el : self->m_itemData[it]->websiteHistoryItems) {
-        auto itData = new ItemData;
-        itData->historyDaysListManager = self;
+        auto itData(new ItemData);
+        itData->self = self;
         itData->websiteVisitItem = el->websiteVisitItem;
-        elm_genlist_item_append(
-            genlist,
-            self->m_history_item_item_class,
-            el.get(),
-            it,
-            ELM_GENLIST_ITEM_NONE,
-            _item_selected,
-            itData);
+        itData->websiteHistoryItemData = el;
+        itData->str = nullptr;
+        auto listItem(
+            elm_genlist_item_append(
+                genlist,
+                self->m_history_item_item_class,
+                itData,
+                it,
+                ELM_GENLIST_ITEM_NONE,
+                _item_selected,
+                itData));
+        self->m_itemsToDelete[listItem] = EINA_FALSE;
+        self->m_visitItemData[listItem] = el->websiteVisitItem;
+        self->m_itemDataVector.push_back(itData);
     }
     self->m_itemData[it]->expanded = true;
-    auto arrow_layout = elm_object_item_part_content_get(it, "elm.swallow.end");
-    auto edje = elm_layout_edje_get(arrow_layout);
+    auto arrow_layout(
+        elm_object_item_part_content_get(it, "elm.swallow.end"));
+    auto edje(elm_layout_edje_get(arrow_layout));
     edje_object_signal_emit(edje, "state,expanded,signal", "");
     elm_genlist_realized_items_update(genlist);
 }
@@ -279,9 +416,8 @@ void HistoryDaysListManagerMob::_tree_item_expanded(void* data, Evas_Object* gen
 void HistoryDaysListManagerMob::_item_selected(void* data, Evas_Object *, void *)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    auto iD = static_cast<ItemData*>(data);
-    BROWSER_LOGD("[%s:%d] %s", __PRETTY_FUNCTION__, __LINE__, iD->websiteVisitItem->historyItem->getUrl().c_str());
-    iD->historyDaysListManager->signalHistoryItemClicked(
+    auto iD(static_cast<ItemData*>(data));
+    iD->self->signalHistoryItemClicked(
         iD->websiteVisitItem->historyItem->getUrl().c_str(),
         iD->websiteVisitItem->historyItem->getTitle().c_str());
     delete iD;
@@ -290,15 +426,15 @@ void HistoryDaysListManagerMob::_item_selected(void* data, Evas_Object *, void *
 void HistoryDaysListManagerMob::_tree_item_pressed(void* data, Evas_Object*, void* event_info)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    auto it = static_cast<Elm_Object_Item*>(event_info);
-    auto self = static_cast<HistoryDaysListManagerMob*>(data);
+    auto it(static_cast<Elm_Object_Item*>(event_info));
+    auto self(static_cast<HistoryDaysListManagerMob*>(data));
 
-    if (self->m_itemState[it] == EINA_FALSE) {
+    if (self->m_expandedState[it] == EINA_FALSE) {
         elm_genlist_item_expanded_set(it, EINA_TRUE);
-        self->m_itemState[it] = EINA_TRUE;
-    } else if (self->m_itemState[it] == EINA_TRUE) {
+        self->m_expandedState[it] = EINA_TRUE;
+    } else if (self->m_expandedState[it] == EINA_TRUE) {
         elm_genlist_item_expanded_set(it, EINA_FALSE);
-        self->m_itemState[it] = EINA_FALSE;
+        self->m_expandedState[it] = EINA_FALSE;
     }
     return;
 }
@@ -306,30 +442,30 @@ void HistoryDaysListManagerMob::_tree_item_pressed(void* data, Evas_Object*, voi
 void HistoryDaysListManagerMob::_tree_item_contracted(void* data, Evas_Object*, void* event_info)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    auto it = static_cast<Elm_Object_Item*>(event_info);
-    auto self = static_cast<HistoryDaysListManagerMob*>(data);
+    auto it(static_cast<Elm_Object_Item*>(event_info));
+    auto self(static_cast<HistoryDaysListManagerMob*>(data));
     elm_genlist_item_subitems_clear(it);
     self->m_itemData[it]->expanded = false;
 
-    auto arrow_layout = elm_object_item_part_content_get(it, "elm.swallow.end");
-    auto edje = elm_layout_edje_get(arrow_layout);
+    auto arrow_layout(elm_object_item_part_content_get(it, "elm.swallow.end"));
+    auto edje(elm_layout_edje_get(arrow_layout));
     edje_object_signal_emit(edje, "state,contracted,signal", "");
 }
 
 void HistoryDaysListManagerMob::appendDayItem(HistoryDayItemDataPtr dayItemData)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    auto item = std::make_shared<HistoryDayItemMob>(dayItemData);
+    auto item(std::make_shared<HistoryDayItemMob>(dayItemData));
     m_dayItems.push_back(item);
     dayItemData->expanded = false;
-    auto el = elm_genlist_item_append(
+    auto el(elm_genlist_item_append(
         m_genlist, m_history_day_item_class,
         dayItemData.get(),
         nullptr, ELM_GENLIST_ITEM_TREE,
-        nullptr, nullptr);
+        nullptr, nullptr));
 
     m_itemData[el] = dayItemData;
-    m_itemState[el] = EINA_FALSE;
+    m_expandedState[el] = EINA_FALSE;
 }
 
 void HistoryDaysListManagerMob::showNoHistoryMessage(bool show)
@@ -341,37 +477,41 @@ void HistoryDaysListManagerMob::showNoHistoryMessage(bool show)
         elm_object_signal_emit(m_layoutScrollerDays, "hide_empty_message", "ui");
 }
 
-void HistoryDaysListManagerMob::onHistoryDayItemButtonClicked(
-    const HistoryDayItemDataPtrConst clickedItem, bool remove)
-{
-    if (remove)
-        removeItem(clickedItem);
-}
-
-void HistoryDaysListManagerMob::onWebsiteHistoryItemClicked(
-    const WebsiteHistoryItemDataPtrConst clickedItem, bool remove)
-{
-    if (remove)
-        removeItem(clickedItem);
-    else
-        signalHistoryItemClicked(
-            tools::PROTOCOL_DEFAULT + clickedItem->websiteDomain,
-            clickedItem->websiteTitle);
-}
-
 void HistoryDaysListManagerMob::onWebsiteHistoryItemVisitItemClicked(
     const WebsiteVisitItemDataPtrConst clickedItem, bool remove)
 {
     if (remove) {
         removeItem(clickedItem);
-        signalDeleteHistoryItems(
-            std::make_shared<std::vector<int>>(std::initializer_list<int> {
-            clickedItem->historyItem->getId() }));
+        signalDeleteHistoryItems(clickedItem->historyItem->getId());
     } else
-        signalHistoryItemClicked(clickedItem->historyItem->getUrl(),
+        signalHistoryItemClicked(
+            clickedItem->historyItem->getUrl(),
             clickedItem->historyItem->getTitle());
 }
 
+void HistoryDaysListManagerMob::removeSelectedItems()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (m_isSelectAllChecked == EINA_TRUE) {
+        m_visitItemData.clear();
+        m_expandedState.clear();
+        m_itemsToDelete.clear();
+        m_history_count = 0;
+        return;
+    }
+    for (auto& x : m_itemsToDelete) {
+        if (x.second == EINA_TRUE) {
+            onWebsiteHistoryItemVisitItemClicked(
+                m_visitItemData[x.first], true);
+            x.second = EINA_FALSE;
+            m_visitItemData.erase(x.first);
+            m_expandedState.erase(x.first);
+            m_itemsToDelete.erase(x.first);
+            --m_history_count;
+        }
+    }
+}
+
 void HistoryDaysListManagerMob::removeItem(
     HistoryDayItemDataPtrConst historyDayItemData)
 {
@@ -379,7 +519,7 @@ void HistoryDaysListManagerMob::removeItem(
         BROWSER_LOGE("%s remove error", __PRETTY_FUNCTION__);
         return;
     }
-    auto item = getItem(historyDayItemData);
+    auto item(getItem(historyDayItemData));
     if (!item)
         return;
     // remove day item from vector, destructor will clear efl objects
@@ -396,9 +536,9 @@ void HistoryDaysListManagerMob::removeItem(
         return;
     }
     for (auto& dayItem : m_dayItems) {
-        auto websiteHistoryItem = dayItem->getItem(websiteHistoryItemData);
+        auto websiteHistoryItem(dayItem->getItem(websiteHistoryItemData));
         if (websiteHistoryItem) {
-            signalDeleteHistoryItems(websiteHistoryItem->getVisitItemsIds());
+            signalDeleteHistoryItems(websiteHistoryItem->getVisitItemsId());
             dayItem->removeItem(websiteHistoryItemData);
             return;
         }
index 732ea37204fba1c775ddcefa0ff38b3e4fdf1861..1a78262e0b54457e5c6950e2c4182087b0d83a7b 100644 (file)
@@ -21,6 +21,7 @@
 #include <Elementary.h>
 #include <string>
 #include <vector>
+#include <set>
 #include "HistoryDayItemDataTypedef.h"
 #include "HistoryDaysListManager.h"
 #include "HistoryDaysListManagerEdje.h"
@@ -42,32 +43,35 @@ public:
     static char* _genlist_history_day_text_get(void *data, Evas_Object *, const char *part);
     static char* _genlist_history_download_text_get(void* data, Evas_Object*, const char *part);
     static char* _genlist_history_item_text_get(void *data, Evas_Object *, const char *part);
+    static void _check_state_changed(void*, Evas_Object*, void *);
     static void _tree_item_expanded(void*, Evas_Object*, void*);
     static void _tree_item_contracted(void*, Evas_Object*, void*);
     static void _tree_item_pressed(void*, Evas_Object*, void*);
     static void _item_selected(void *data, Evas_Object *obj, void *event_info);
+    static Evas_Object* _genlist_history_download_content_get(void*, Evas_Object* obj, const char *part);
     static Evas_Object* _genlist_history_item_content_get(void *data, Evas_Object *, const char *part);
     static Evas_Object* _genlist_history_day_content_get(void *data, Evas_Object* obj, const char *part);
 
-    Evas_Object* createDaysList(Evas_Object* parent) override;
+    Evas_Object* createDaysList(Evas_Object* parent, bool isRemoveMode = false) override;
     void addHistoryItems(
         const std::shared_ptr<services::HistoryItemVector>& items,
         HistoryPeriod period) override;
     void clear() override;
     void setFocusChain(Evas_Object* /*obj*/) override {}
 
-    void onHistoryDayItemButtonClicked(
-        const HistoryDayItemDataPtrConst clickedItem, bool remove);
-    void onWebsiteHistoryItemClicked(
-        const WebsiteHistoryItemDataPtrConst websiteHistoryItemData,
-        bool remove);
     void onWebsiteHistoryItemVisitItemClicked(
         const WebsiteVisitItemDataPtrConst websiteVisitItemData,
         bool remove);
+    void countItemsToDelete();
+    void selectAllCheckboxes();
+    void removeSelectedItems();
+    bool isSelectAllChecked() const { return m_isSelectAllChecked == EINA_TRUE; }
 
     struct ItemData {
-        HistoryDaysListManagerMob* historyDaysListManager;
+        HistoryDaysListManagerMob* self;
         WebsiteVisitItemDataPtr websiteVisitItem;
+        WebsiteHistoryItemDataPtr websiteHistoryItemData;
+        const char* str;
     };
 
 private:
@@ -109,9 +113,17 @@ private:
     Elm_Genlist_Item_Class* m_history_item_item_class;
     Elm_Genlist_Item_Class* m_history_download_item_class;
     Evas_Object* m_genlist;
-    Evas_Object* m_box;
     std::map<Elm_Object_Item*, HistoryDayItemDataPtr> m_itemData;
-    std::map<Elm_Object_Item*, Eina_Bool> m_itemState;
+    std::map<Elm_Object_Item*, Eina_Bool> m_expandedState;
+    std::map<Elm_Object_Item*, Eina_Bool> m_itemsToDelete;
+    std::map<Elm_Object_Item*, WebsiteVisitItemDataPtr> m_visitItemData;
+    bool m_isRemoveMode;
+    std::vector<ItemData*> m_itemDataVector;
+    size_t m_delete_count;
+    size_t m_history_count;
+    Eina_Bool m_isSelectAllChecked;
+    Elm_Object_Item* m_downloadManagerItem;
+    Elm_Object_Item* m_selectAllItem;
 };
 
 } /* namespace base_ui */
index 5ebf0448af38d31b65e20a3b946fee547414814e..24a7cd3a3fafead8a21078547d63316a8f17c9dc 100644 (file)
@@ -90,9 +90,9 @@ bool WebsiteHistoryItemMob::contains(WebsiteVisitItemDataPtrConst historyVisitIt
     return m_websiteHistoryItemVisitItems->contains(historyVisitItemData);
 }
 
-std::shared_ptr<std::vector<int>> WebsiteHistoryItemMob::getVisitItemsIds()
+int WebsiteHistoryItemMob::getVisitItemsId()
 {
-    return m_websiteHistoryItemVisitItems->getVisitItemsIds();
+    return m_websiteHistoryItemVisitItems->getVisitItemsId();
 }
 
 int WebsiteHistoryItemMob::sizeHistoryVisitItems() {
index a159c8c4179e22b21c719014dab7591740013361..f24e7f7acebbd9764252fc3452792f82563d87b5 100644 (file)
@@ -46,7 +46,7 @@ public:
     void removeItem(WebsiteVisitItemDataPtrConst historyVisitItemData);
     bool contains(WebsiteVisitItemDataPtrConst websiteVisitItemData);
 
-    std::shared_ptr<std::vector<int>> getVisitItemsIds();
+    int getVisitItemsId();
 
     /**
      * @brief invoked when main layout is already removed.
index 452116dc8a613aac46098b87c33226835a74dce3..75d20c5441dd4544a5d78975e7e8c98c960adac8 100755 (executable)
@@ -257,11 +257,9 @@ void WebsiteHistoryItemVisitItemsMob::removeItem(
     }
 }
 
-std::shared_ptr<std::vector<int>> WebsiteHistoryItemVisitItemsMob::getVisitItemsIds()
+int WebsiteHistoryItemVisitItemsMob::getVisitItemsId()
 {
-    auto vec = std::make_shared<std::vector<int>>();
-    vec->push_back(m_websiteVisitItem.websiteVisitItemData->historyItem->getId());
-    return vec;
+    return m_websiteVisitItem.websiteVisitItemData->historyItem->getId();
 }
 
 }
index e056a832ed050167f2a9b4b3255683df3ad080c0..835535ecff7939265f4bc1bd2d30fc173a22b442 100644 (file)
@@ -59,7 +59,7 @@ public:
 
     bool contains(WebsiteVisitItemDataPtrConst websiteVisitItemData);
     void removeItem(WebsiteVisitItemDataPtrConst websiteVisitItemData);
-    std::shared_ptr<std::vector<int>> getVisitItemsIds();
+    int getVisitItemsId();
     int size() {return eina_list_count(elm_box_children_get(m_boxMainVertical));}
 
 private:
index 334a06a33d33833abd919598ac3c11b371ebf53e..9ecda8bdb7d2571f91ee73ec536be25f1419cee1 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <Elementary.h>
 #include <boost/concept_check.hpp>
+#include <boost/format.hpp>
 #include <vector>
 #include <string>
 #include <string.h>
 namespace tizen_browser{
 namespace base_ui{
 
+// TODO History needs solid refactoring. A lot of features are not used in any place.
+
 using namespace services;
 EXPORT_SERVICE(HistoryUI, "org.tizen.browser.historyui")
 
-using HistoryItemData = struct _HistoryItemData
-{
-    std::shared_ptr<tizen_browser::services::HistoryItem> item;
-    std::shared_ptr<tizen_browser::base_ui::HistoryUI> historyUI;
-};
-
-struct ItemData{
-    tizen_browser::base_ui::HistoryUI* historyUI;
-    Elm_Object_Item * e_item;
-};
-
 HistoryUI::HistoryUI()
     : m_parent(nullptr)
     , m_main_layout(nullptr)
     , m_buttonClose(nullptr)
     , m_buttonClear(nullptr)
     , m_daysList(nullptr)
-    , m_historyDeleteManager(std::make_shared<HistoryDeleteManager>())
+    , m_historyDaysListManager(nullptr)
     , m_naviframe(nullptr)
     , m_modulesToolbar(nullptr)
 {
@@ -62,10 +54,16 @@ HistoryUI::HistoryUI()
     m_edjFilePath = EDJE_DIR;
     m_edjFilePath.append("HistoryUI/History.edj");
 
-    m_historyDaysListManager = std::make_shared<HistoryDaysListManagerMob>();
+    if (!m_historyDaysListManager)
+        m_historyDaysListManager = std::make_shared<HistoryDaysListManagerMob>();
 
     m_historyDaysListManager->signalHistoryItemClicked.connect(signalHistoryItemClicked);
     m_historyDaysListManager->signalDeleteHistoryItems.connect(signalDeleteHistoryItems);
+    m_historyDaysListManager->setRightButtonEnabledForHistory.connect(
+        boost::bind(&HistoryUI::setRightButtonEnabled, this, _1));
+    m_historyDaysListManager->setSelectedItemsCount.connect([this](auto count){
+        m_naviframe->setTitle((boost::format(_("IDS_BR_HEADER_PD_SELECTED_ABB")) % count).str());
+    });
 }
 
 HistoryUI::~HistoryUI()
@@ -86,10 +84,15 @@ void HistoryUI::hideUI()
     M_ASSERT(m_main_layout);
     evas_object_hide(m_main_layout);
     clearItems();
-    m_historyDeleteManager->setDeleteMode(false);
     m_naviframe->hide();
 }
 
+void HistoryUI::setRightButtonEnabled(bool enable)
+{
+    BROWSER_LOGD("[%s:%d] %d", __PRETTY_FUNCTION__, __LINE__, enable);
+    m_naviframe->setRightButtonEnabled(enable);
+}
+
 void HistoryUI::init(Evas_Object* parent)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
@@ -100,15 +103,15 @@ void HistoryUI::init(Evas_Object* parent)
 Evas_Object* HistoryUI::getContent()
 {
     M_ASSERT(m_parent);
-    if (!m_naviframe)
-        createHistoryUILayout();
+    createHistoryUILayout();
     return m_naviframe->getLayout();
 }
 
 void HistoryUI::createHistoryUILayout()
 {
     elm_theme_extension_add(nullptr, m_edjFilePath.c_str());
-    m_naviframe = std::make_shared<NaviframeWrapper>(m_parent);
+    if (!m_naviframe)
+        m_naviframe = std::make_shared<NaviframeWrapper>(m_parent);
 
     m_main_layout = elm_layout_add(m_naviframe->getLayout());
     m_naviframe->setContent(m_main_layout);
@@ -134,41 +137,11 @@ void HistoryUI::createTopContent()
     m_naviframe->setTitle(_("IDS_BR_TAB2_HISTORY"));
 }
 
-void HistoryUI::createModulesToolbar()
-{
-    m_modulesToolbar = elm_toolbar_add(m_naviframe->getLayout());
-
-    elm_object_style_set(m_modulesToolbar, "tabbar/notitle");
-    elm_toolbar_shrink_mode_set(m_modulesToolbar, ELM_TOOLBAR_SHRINK_EXPAND);
-    elm_toolbar_select_mode_set(m_modulesToolbar, ELM_OBJECT_SELECT_MODE_ALWAYS);
-    elm_toolbar_transverse_expanded_set(m_modulesToolbar, EINA_TRUE);
-    elm_object_part_content_set(m_naviframe->getLayout(), "action_bar_history", m_modulesToolbar);
-    evas_object_show(m_modulesToolbar);
-
-    elm_toolbar_item_append(m_modulesToolbar, nullptr, _("IDS_BR_BODY_BOOKMARKS"), nullptr, this);
-    elm_toolbar_item_append(m_modulesToolbar, nullptr, _("IDS_BR_MBODY_HISTORY"), nullptr, this);
-}
-
-HistoryItemVectorMap
-HistoryUI::groupItemsByDomain(const HistoryItemVector& historyItems)
-{
-    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    HistoryItemVectorMap groupedMap;
-    for(auto& item : historyItems) {
-        auto domain = tools::extractDomain(item->getUrl());
-        if(groupedMap.find(domain) == groupedMap.end()) {
-            groupedMap.insert(std::pair<std::string, HistoryItemVector>(domain, {}));
-        }
-        groupedMap.find(domain)->second.push_back(item);
-    }
-    return groupedMap;
-}
-
-Evas_Object* HistoryUI::createDaysList(Evas_Object* parent)
+Evas_Object* HistoryUI::createDaysList(Evas_Object* parent, bool isRemoveMode)
 {
     M_ASSERT(history_layout);
 
-    auto list = m_historyDaysListManager->createDaysList(parent);
+    auto list = m_historyDaysListManager->createDaysList(parent, isRemoveMode);
 
     evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
     evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
@@ -176,18 +149,18 @@ Evas_Object* HistoryUI::createDaysList(Evas_Object* parent)
     return list;
 }
 
-void HistoryUI::_close_clicked_cb(void * data, Evas_Object*, void*)
+void HistoryUI::removeSelectedHistoryItems()
 {
-    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    if (!data) {
-        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+    if (!m_historyDaysListManager) {
+        BROWSER_LOGD("[%s:%d] No selected elements to delete");
         return;
     }
-    auto self = static_cast<HistoryUI*>(data);
-    self->closeHistoryUIClicked();
+    if (m_historyDaysListManager->isSelectAllChecked())
+        clearHistoryClicked();
+    m_historyDaysListManager->removeSelectedItems();
 }
 
-void HistoryUI::_clearHistory_clicked(void* data, Evas_Object*, void*)
+void HistoryUI::_close_clicked_cb(void * data, Evas_Object*, void*)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     if (!data) {
@@ -195,8 +168,7 @@ void HistoryUI::_clearHistory_clicked(void* data, Evas_Object*, void*)
         return;
     }
     auto self = static_cast<HistoryUI*>(data);
-    self->clearItems();
-    self->clearHistoryClicked();
+    self->closeHistoryUIClicked();
 }
 
 void HistoryUI::addHistoryItems(
@@ -209,40 +181,11 @@ void HistoryUI::addHistoryItems(
     m_historyDaysListManager->addHistoryItems(items, period);
 }
 
-void HistoryUI::removeHistoryItem(const std::string& uri)
-{
-    BROWSER_LOGD("[%s] uri=%s", __func__, uri.c_str());
-}
-
 void HistoryUI::clearItems()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
     m_historyDaysListManager->clear();
 }
 
-void HistoryUI::showContextMenu()
-{
-    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-
-    auto window = getWindow();
-    if (window) {
-        createContextMenu(*window);
-        elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_OPT_REMOVE"), nullptr, _cm_delete_clicked, this);
-        alignContextMenu(*window);
-    } else
-        BROWSER_LOGE("[%s:%d] Signal not found", __PRETTY_FUNCTION__, __LINE__);
-}
-
-void HistoryUI::_cm_delete_clicked(void* data, Evas_Object*, void* )
-{
-    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    if (!data) {
-        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
-        return;
-    }
-    auto self = static_cast<HistoryUI*>(data);
-    _cm_dismissed(nullptr, self->m_ctxpopup, nullptr);
-}
-
 }
 }
index 539a75afede209f5b5180abcd16ec311943fb26b..4cf33c4bd95fe2eb6d8ed68cff4b62452ef2bc26 100755 (executable)
@@ -52,40 +52,29 @@ public:
     Evas_Object* getContent();
     void showUI();
     void hideUI();
-    Evas_Object* createDaysList(Evas_Object* history_layout);
+    Evas_Object* createDaysList(Evas_Object* history_layout, bool isRemoveMode = false);
+    void removeSelectedHistoryItems();
     virtual std::string getName();
     void addHistoryItems(std::shared_ptr<services::HistoryItemVector>,
             HistoryPeriod period = HistoryPeriod::HISTORY_TODAY);
-    void removeHistoryItem(const std::string& uri);
     void addItems();
+    void setNaviframe(SharedNaviframeWrapper naviframe) { m_naviframe = naviframe;}
 
     //AbstractContextMenu interface implementation
-    virtual void showContextMenu() override;
+    virtual void showContextMenu() override {};
 
     boost::signals2::signal<void ()> closeHistoryUIClicked;
     boost::signals2::signal<void ()> clearHistoryClicked;
-    boost::signals2::signal<void (std::shared_ptr<const std::vector<int>> itemIds)> signalDeleteHistoryItems;
+    boost::signals2::signal<void (int)> signalDeleteHistoryItems;
     boost::signals2::signal<void (std::string url, std::string title)> signalHistoryItemClicked;
 private:
     void clearItems();
     void createHistoryUILayout();
     void createTopContent();
-    void createModulesToolbar();
-
-    HistoryDeleteManagerPtr getHistoryDeleteManager() {return m_historyDeleteManager;}
-
-    /**
-     * @brief Groups history items by domain
-     *
-     * @return key: domain, value: domain's history items
-     */
-    services::HistoryItemVectorMap
-    groupItemsByDomain(const services::HistoryItemVector& historyItems);
+    void setRightButtonEnabled(bool);
 
     static Evas_Object* _listActionBarContentGet(void *data, Evas_Object *obj, const char *part);
-    static void _clearHistory_clicked(void *data, Evas_Object *obj, void *event_info);
     static void _close_clicked_cb(void *data, Evas_Object *obj, void *event_info);
-    static void _cm_delete_clicked(void*, Evas_Object*, void*);
 
     std::string m_edjFilePath;
     Evas_Object *m_parent;
index ad4ed68acd3f9e2c99408b9a93510c2d12dc4f3c..32cb38faa2a093067d5a28e24e03e3a65b3fc1dc 100755 (executable)
@@ -376,7 +376,8 @@ void SimpleUI::connectUISignals()
     m_bookmarkManagerUI->bookmarkItemDeleted.connect(boost::bind(&SimpleUI::onBookmarkDeleted, this, _1));
     m_bookmarkManagerUI->newFolderItemClicked.connect(boost::bind(&SimpleUI::onNewFolderClicked, this, _1));
     m_bookmarkManagerUI->isLandscape.connect(boost::bind(&SimpleUI::isLandscape, this));
-    m_bookmarkManagerUI->getHistoryGenlistContent.connect(boost::bind(&SimpleUI::showHistoryUI, this, _1));
+    m_bookmarkManagerUI->getHistoryGenlistContent.connect(boost::bind(&SimpleUI::showHistoryUI, this, _1, _2, _3));
+    m_bookmarkManagerUI->removeSelectedItemsFromHistory.connect(boost::bind(&HistoryUI::removeSelectedHistoryItems, m_historyUI.get()));
 #if PROFILE_MOBILE
     m_quickAccess->addQuickAccessClicked.connect(boost::bind(&SimpleUI::onNewQuickAccessClicked, this));
 #else
@@ -750,12 +751,10 @@ void SimpleUI::onClearHistoryAllClicked()
     m_historyService->clearAllHistory();
 }
 
-void SimpleUI::onDeleteHistoryItems(
-        std::shared_ptr<const std::vector<int>> itemIds)
+void SimpleUI::onDeleteHistoryItems(int id)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    for (const int& id : *itemIds)
-        m_historyService->deleteHistoryItem(id);
+    m_historyService->deleteHistoryItem(id);
 }
 
 void SimpleUI::onMostVisitedClicked()
@@ -1441,10 +1440,11 @@ void SimpleUI::certPopupButtonClicked(PopupButtons button, std::shared_ptr<Popup
     }
 }
 
-Evas_Object* SimpleUI::showHistoryUI(Evas_Object* parent)
+Evas_Object* SimpleUI::showHistoryUI(Evas_Object* parent, SharedNaviframeWrapper naviframe, bool removeMode)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
-    auto ret = m_historyUI->createDaysList(parent);
+    m_historyUI->setNaviframe(naviframe);
+    auto ret = m_historyUI->createDaysList(parent, removeMode);
     m_historyUI->addHistoryItems(
         m_historyService->getHistoryToday(), HistoryPeriod::HISTORY_TODAY);
     m_historyUI->addHistoryItems(
index 1b87dc51905d12c41dbbe5285577582d60acde22..57770c524ac0011e2f00dbc87529ce9466df9369 100644 (file)
@@ -169,7 +169,7 @@ private:
     void onOpenURL(const std::string& url);
     void onOpenURL(const std::string& url, const std::string& title, bool desktopMode);
     void onClearHistoryAllClicked();
-    void onDeleteHistoryItems(std::shared_ptr<const std::vector<int>> itemIds);
+    void onDeleteHistoryItems(int id);
 
     void onMostVisitedClicked();
     void onQuickAccessClicked();
@@ -254,7 +254,7 @@ private:
     void closeTabUI();
     void switchToMobileMode();
     void switchToDesktopMode();
-    Evas_Object* showHistoryUI(Evas_Object* parent);
+    Evas_Object* showHistoryUI(Evas_Object* parent, SharedNaviframeWrapper naviframe, bool removeMode = false);
     void closeHistoryUI();
     void showSettings(unsigned);
     void closeSettingsUI();