[Porting_2.4_UI_to_3.0] Context Menu 55/79655/4
authorm.kawonczyk <m.kawonczyk@samsung.com>
Fri, 20 May 2016 15:25:10 +0000 (17:25 +0200)
committerm.kawonczyk <m.kawonczyk@samsung.com>
Tue, 19 Jul 2016 10:50:17 +0000 (12:50 +0200)
[Issue]        N/A
[Problem]      There are no context menu shown on menu pressed.
[Solution]     Create and show context menu.
[Verify]       Open browser and check every if correct context
               menu is visible (check guidelines)

Change-Id: I0d2fe89ee16b9f6fdfebadf2fc2bd47e2916dc32

core/AbstractInterfaces/AbstractContextMenu.h [new file with mode: 0644]
services/BookmarkManagerUI/BookmarkManagerUI.cpp
services/BookmarkManagerUI/BookmarkManagerUI.h
services/HistoryUI/HistoryUI.cpp
services/HistoryUI/HistoryUI.h
services/SimpleUI/SimpleUI.cpp
services/SimpleUI/SimpleUI.h
services/TabUI/TabUI.cpp
services/TabUI/TabUI.h
services/WebPageUI/WebPageUI.cpp
services/WebPageUI/WebPageUI.h

diff --git a/core/AbstractInterfaces/AbstractContextMenu.h b/core/AbstractInterfaces/AbstractContextMenu.h
new file mode 100644 (file)
index 0000000..0ef4aa7
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 2016 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.
+ */
+
+/*
+ * AbstractContextMenu.h
+ *
+ *  Created on: May 20, 2016
+ *      Author: m.kawonczyk@samsung.com
+ */
+
+#ifndef __ABSTRACT_CONTEXT_MENU_H__
+#define __ABSTRACT_CONTEXT_MENU_H__
+
+#include <efl_extension.h>
+
+namespace tizen_browser
+{
+namespace interfaces
+{
+
+/**
+ * @brief This interface defines rotatable object,
+ * which reacts on mobile device oriantation change.
+ */
+class AbstractContextMenu
+{
+public:
+    /**
+     * @brief Abstract method for showing context menu.
+     */
+    virtual void showContextMenu() = 0;
+
+    /**
+     * @brief Boost signal, returns main window pointer.
+     * Class which implements AbstractContextMenu has to connect this signal in SimpleUI class.
+     */
+    boost::signals2::signal<Evas_Object* ()> getWindow;
+
+protected:
+    static void _cm_dismissed(void *, Evas_Object * obj, void *)
+    {
+        evas_object_del(obj);
+        obj = nullptr;
+    }
+
+    /**
+     * @brief Method for creating ctxpopup before appending items.
+     */
+    void createContextMenu(Evas_Object* parent)
+    {
+        if (m_ctxpopup)
+            _cm_dismissed(nullptr, m_ctxpopup, nullptr);
+
+        m_ctxpopup = elm_ctxpopup_add(parent);
+        elm_object_style_set(m_ctxpopup, "more/default");
+
+        eext_object_event_callback_add(m_ctxpopup, EEXT_CALLBACK_BACK, eext_ctxpopup_back_cb, nullptr);
+        eext_object_event_callback_add(m_ctxpopup, EEXT_CALLBACK_MORE, eext_ctxpopup_back_cb, nullptr);
+        evas_object_smart_callback_add(m_ctxpopup, "dismissed", _cm_dismissed, nullptr);
+    }
+
+    /**
+     * @brief Method for aligning ctxpopup after appending items.
+     */
+    void alignContextMenu(Evas_Object* parent)
+    {
+        Evas_Coord w, h;
+        evas_object_geometry_get(parent, NULL, NULL, &w, &h);
+
+        elm_ctxpopup_direction_priority_set(m_ctxpopup, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP,
+                ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP);
+        evas_object_move(m_ctxpopup, w/2, h);
+        evas_object_show(m_ctxpopup);
+    }
+
+    Evas_Object *m_ctxpopup;
+};
+
+}//namespace interfaces
+}//namespace tizen_browser
+
+#endif /* __ABSTRACT_CONTEXT_MENU_H__ */
index 031cb80bbaf56235e9e8ae5d2e23df0f2e9ed1b9..6d3e392b7a09663cfb47b5f3fa0bc0ddcea7a552 100644 (file)
@@ -338,6 +338,76 @@ void BookmarkManagerUI::orientationChanged()
 }
 #endif
 
+void BookmarkManagerUI::showContextMenu()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+
+    boost::optional<Evas_Object*> window = getWindow();
+    if (window) {
+        createContextMenu(*window);
+
+        elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_SK_DELETE"), nullptr, _cm_delete_clicked, this);
+        elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_OPT_SHARE"), nullptr, _cm_share_clicked, this);
+        elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_OPT_REORDER_ABB"), nullptr, _cm_reorder_clicked, this);
+        elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_BUTTON_EDIT"), nullptr, _cm_edit_clicked, this);
+        elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_SK3_CREATE_FOLDER"), nullptr, _cm_create_folder_clicked, this);
+
+        alignContextMenu(*window);
+    } else
+        BROWSER_LOGE("[%s:%d] Signal not found", __PRETTY_FUNCTION__, __LINE__);
+}
+
+void BookmarkManagerUI::_cm_delete_clicked(void* data, Evas_Object*, void* )
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        BookmarkManagerUI* bookmarkManagerUI = static_cast<BookmarkManagerUI*>(data);
+        _cm_dismissed(nullptr, bookmarkManagerUI->m_ctxpopup, nullptr);
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
+void BookmarkManagerUI::_cm_share_clicked(void* data, Evas_Object*, void* )
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        BookmarkManagerUI* bookmarkManagerUI = static_cast<BookmarkManagerUI*>(data);
+        _cm_dismissed(nullptr, bookmarkManagerUI->m_ctxpopup, nullptr);
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
+void BookmarkManagerUI::_cm_reorder_clicked(void* data, Evas_Object*, void* )
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        BookmarkManagerUI* bookmarkManagerUI = static_cast<BookmarkManagerUI*>(data);
+        _cm_dismissed(nullptr, bookmarkManagerUI->m_ctxpopup, nullptr);
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
+void BookmarkManagerUI::_cm_edit_clicked(void* data, Evas_Object*, void* )
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        BookmarkManagerUI* bookmarkManagerUI = static_cast<BookmarkManagerUI*>(data);
+        _cm_dismissed(nullptr, bookmarkManagerUI->m_ctxpopup, nullptr);
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
+void BookmarkManagerUI::_cm_create_folder_clicked(void* data, Evas_Object*, void* )
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        BookmarkManagerUI* bookmarkManagerUI = static_cast<BookmarkManagerUI*>(data);
+        _cm_dismissed(nullptr, bookmarkManagerUI->m_ctxpopup, nullptr);
+        bookmarkManagerUI->newFolderItemClicked();
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
 void BookmarkManagerUI::addCustomFolders(services::SharedBookmarkFolderList folders)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
index 4aeee1e00c8d9f75c2b9634922d0b3ec05680d8d..ef2d8461a586f4602062e8c4d171947a3baccc68 100644 (file)
@@ -20,6 +20,7 @@
 #include <Evas.h>
 #include <boost/signals2/signal.hpp>
 
+#include "AbstractContextMenu.h"
 #include "AbstractUIComponent.h"
 #if PROFILE_MOBILE
 #include "AbstractRotatable.h"
@@ -37,7 +38,8 @@ namespace tizen_browser{
 namespace base_ui{
 
 class BROWSER_EXPORT BookmarkManagerUI
-        : public tizen_browser::interfaces::AbstractUIComponent
+        : public interfaces::AbstractContextMenu
+        , public tizen_browser::interfaces::AbstractUIComponent
         , public tizen_browser::core::AbstractService
 #if PROFILE_MOBILE
         , public tizen_browser::interfaces::AbstractRotatable
@@ -59,6 +61,9 @@ public:
     void addNewFolder();
     virtual void orientationChanged() override;
 #endif
+    //AbstractContextMenu interface implementation
+    virtual void showContextMenu() override;
+
     void addCustomFolders(services::SharedBookmarkFolderList folders);
     void addCustomFolders(std::vector<std::shared_ptr<tizen_browser::services::BookmarkItem> >);
 
@@ -103,6 +108,11 @@ private:
     static void _grid_content_delete(void *data, Evas_Object *obj);
     static char* _grid_all_folder_title_text_get(void *data, Evas_Object *obj, const char *part);
     static char* _grid_folder_title_text_get(void *data, Evas_Object *obj, const char *part);
+    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*);
+    static void _cm_edit_clicked(void*, Evas_Object*, void*);
+    static void _cm_create_folder_clicked(void*, Evas_Object*, void*);
 
     std::map<std::string,Elm_Object_Item*> m_map_bookmark;
     std::string m_edjFilePath;
index ee8b226a39a33fe285c28e86ba9d0199081f3a7d..31c24ae2403123568f2b78e1a4f2ca4aa2c51952 100644 (file)
@@ -21,6 +21,7 @@
 #include <string.h>
 #include <AbstractMainWindow.h>
 
+#include "app_i18n.h"
 #include "HistoryUI.h"
 #include "ServiceManager.h"
 #include "BrowserLogger.h"
@@ -234,5 +235,30 @@ void HistoryUI::clearItems()
     m_historyDaysListManager->clear();
 }
 
+void HistoryUI::showContextMenu()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+
+    boost::optional<Evas_Object*> window = getWindow();
+    if (window) {
+        createContextMenu(*window);
+
+        elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_SK_DELETE"), 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 != nullptr) {
+        HistoryUI* historyUI = static_cast<HistoryUI*>(data);
+        _cm_dismissed(nullptr, historyUI->m_ctxpopup, nullptr);
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
 }
 }
index 6d086444fc7ead0191d91c18eda19e7ef46281bd..d8eba9a619c6a5bf0213f3f4be9548644ccc22f7 100755 (executable)
@@ -23,6 +23,7 @@
 
 #include "HistoryPeriod.h"
 #include <services/HistoryService/HistoryItemTypedef.h>
+#include "AbstractContextMenu.h"
 #include "AbstractUIComponent.h"
 #include "AbstractService.h"
 #include "ServiceFactory.h"
@@ -41,7 +42,8 @@ class HistoryDeleteManager;
 typedef std::shared_ptr<HistoryDeleteManager> HistoryDeleteManagerPtr;
 
 class BROWSER_EXPORT HistoryUI
-    : public tizen_browser::interfaces::AbstractUIComponent
+    : public interfaces::AbstractContextMenu
+    , public tizen_browser::interfaces::AbstractUIComponent
     , public tizen_browser::core::AbstractService
 {
 public:
@@ -58,6 +60,10 @@ public:
     void removeHistoryItem(const std::string& uri);
     Evas_Object* createActionBar(Evas_Object* history_layout);
     void addItems();
+
+    //AbstractContextMenu interface implementation
+    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;
@@ -79,6 +85,7 @@ private:
     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 54d3b8d0a6d3424909c8289377ae4e04eddd1a7f..bca1a356c03415bda3d9769dcce271c44f364833 100644 (file)
@@ -322,6 +322,11 @@ void SimpleUI::connectUISignals()
     m_webPageUI->bookmarkManagerClicked.connect(boost::bind(&SimpleUI::showBookmarkManagerUI, this));
     m_webPageUI->focusWebView.connect(boost::bind(&tizen_browser::basic_webengine::AbstractWebEngine<Evas_Object>::setFocus, m_webEngine.get()));
     m_webPageUI->unfocusWebView.connect(boost::bind(&tizen_browser::basic_webengine::AbstractWebEngine<Evas_Object>::clearFocus, m_webEngine.get()));
+    m_webPageUI->getWindow.connect(boost::bind(&SimpleUI::getMainWindow, this));
+    m_webPageUI->isBookmark.connect(boost::bind(&SimpleUI::checkBookmark, this));
+    m_webPageUI->showBookmarkFlowUI.connect(boost::bind(&SimpleUI::showBookmarkFlowUI, this, _1));
+    m_webPageUI->showFindOnPageUI.connect(boost::bind(&SimpleUI::showFindOnPageUI, this, std::string()));
+    m_webPageUI->showSettingsUI.connect(boost::bind(&SimpleUI::showSettingsUI, this));
 #if PROFILE_MOBILE
     m_webPageUI->hideMoreMenu.connect(boost::bind(&SimpleUI::closeMoreMenu, this));
     m_webPageUI->getURIEntry().mobileEntryFocused.connect(boost::bind(&WebPageUI::mobileEntryFocused, m_webPageUI));
@@ -349,6 +354,7 @@ void SimpleUI::connectUISignals()
     m_tabUI->tabClicked.connect(boost::bind(&SimpleUI::tabClicked, this,_1));
     m_tabUI->closeTabsClicked.connect(boost::bind(&SimpleUI::closeTabsClicked, this,_1));
     m_tabUI->isIncognito.connect(boost::bind(&SimpleUI::isIncognito, this, _1));
+    m_tabUI->getWindow.connect(boost::bind(&SimpleUI::getMainWindow, this));
 #if PROFILE_MOBILE
     m_tabUI->isLandscape.connect(boost::bind(&SimpleUI::isLandscape, this));
     bool desktop_ua = false;
@@ -363,6 +369,7 @@ void SimpleUI::connectUISignals()
     m_historyUI->signalDeleteHistoryItems.connect(boost::bind(&SimpleUI::onDeleteHistoryItems, this, _1));
     m_historyUI->closeHistoryUIClicked.connect(boost::bind(&SimpleUI::closeHistoryUI, this));
     m_historyUI->signalHistoryItemClicked.connect(boost::bind(&SimpleUI::onOpenURL, this, _1, _2, desktop_ua));
+    m_historyUI->getWindow.connect(boost::bind(&SimpleUI::getMainWindow, this));
 
     M_ASSERT(m_settingsUI.get());
     m_settingsUI->closeSettingsUIClicked.connect(boost::bind(&SimpleUI::closeSettingsUI, this));
@@ -420,6 +427,7 @@ void SimpleUI::connectUISignals()
     m_bookmarkManagerUI->customFolderClicked.connect(boost::bind(&SimpleUI::onBookmarkCustomFolderClicked, this, _1));
     m_bookmarkManagerUI->allFolderClicked.connect(boost::bind(&SimpleUI::onBookmarkAllFolderClicked, this));
     m_bookmarkManagerUI->specialFolderClicked.connect(boost::bind(&SimpleUI::onBookmarkSpecialFolderClicked, this));
+    m_bookmarkManagerUI->getWindow.connect(boost::bind(&SimpleUI::getMainWindow, this));
 #if PROFILE_MOBILE
     m_bookmarkManagerUI->newFolderItemClicked.connect(boost::bind(&SimpleUI::onNewFolderClicked, this));
     m_bookmarkManagerUI->isLandscape.connect(boost::bind(&SimpleUI::isLandscape, this));
@@ -1076,8 +1084,10 @@ void SimpleUI::onEscapePressed()
 #else
 void SimpleUI::onMenuButtonPressed()
 {
-    BROWSER_LOGD("[%s]", __func__);
-    showMoreMenu();
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    interfaces::AbstractContextMenu *view = dynamic_cast<interfaces::AbstractContextMenu*>(m_viewManager.topOfStack());
+    if (view)
+        view->showContextMenu();
 }
 
 void SimpleUI::onRotation()
@@ -1121,6 +1131,11 @@ int SimpleUI::getRotation()
 }
 #endif
 
+Evas_Object* SimpleUI::getMainWindow()
+{
+    return main_window;
+}
+
 void SimpleUI::reloadEnable(bool enable)
 {
     m_webPageUI->setReloadButtonEnabled(enable);
index 7db348199d3a806a9ed3a55b476b0d54214a4828..06e3e37ad35278256ec6797c5e740eefb366d450 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <Evas.h>
 
+#include "AbstractContextMenu.h"
 #include "AbstractMainWindow.h"
 #include "AbstractService.h"
 #include "AbstractFavoriteService.h"
@@ -278,13 +279,13 @@ private:
     void closeSettingsUI();
 
     void showBookmarkFlowUI(bool state);
+    void showFindOnPageUI(const std::string& str);
 #if PROFILE_MOBILE
     void showCertificatePopup();
     void showCertificatePopup(const std::string& host, const std::string& pem, services::CertificateContents::HOST_TYPE type);
     void showUnsecureConnectionPopup();
     void closeBookmarkFlowUI();
 
-    void showFindOnPageUI(const std::string& str);
     void findWord(const struct FindData& fdata);
     void closeFindOnPageUI();
 
@@ -296,6 +297,7 @@ private:
     int getRotation();
     static void __orientation_changed(void* data, Evas_Object*, void*);
 #endif
+    Evas_Object* getMainWindow();
     void closeBookmarkDetailsUI();
     void closeBookmarkManagerUI();
     void showBookmarkManagerUI();
index 1c9871a1836df5c8450c1b4055102548a68fa9a8..9aaeed0f0d0f7c84300732331b5e100b7e45d29a 100644 (file)
@@ -313,6 +313,60 @@ void TabUI::orientationChanged()
 }
 #endif
 
+void TabUI::showContextMenu()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+
+    boost::optional<Evas_Object*> window = getWindow();
+    if (window) {
+        createContextMenu(*window);
+
+        elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_BODY_SYNC_OPEN_PAGES"), nullptr, _cm_sync_clicked, this);
+        elm_ctxpopup_item_append(m_ctxpopup, "Secret mode security", nullptr, _cm_secret_clicked, this);
+        if (elm_gengrid_items_count(m_gengrid) != 0)
+            elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_OPT_CLOSE_ALL"), nullptr, _cm_close_clicked, this);
+        alignContextMenu(*window);
+    } else
+        BROWSER_LOGE("[%s:%d] Signal not found", __PRETTY_FUNCTION__, __LINE__);
+}
+
+void TabUI::_cm_sync_clicked(void* data, Evas_Object*, void* )
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        TabUI* tabUI = static_cast<TabUI*>(data);
+        _cm_dismissed(nullptr, tabUI->m_ctxpopup, nullptr);
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
+void TabUI::_cm_secret_clicked(void* data, Evas_Object*, void*)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        TabUI* tabUI = static_cast<TabUI*>(data);
+        _cm_dismissed(nullptr, tabUI->m_ctxpopup, nullptr);
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
+void TabUI::_cm_close_clicked(void* data, Evas_Object*, void*)
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        TabUI* tabUI = static_cast<TabUI*>(data);
+        _cm_dismissed(nullptr, tabUI->m_ctxpopup, nullptr);
+        Elm_Object_Item* it = elm_gengrid_first_item_get(tabUI->m_gengrid);
+        while (it) {
+            TabItemData *item = (TabItemData *)elm_object_item_data_get(it);
+            tabUI->closeTabsClicked(item->item->getId());
+            it = elm_gengrid_item_next_get(it);
+        }
+        //Todo: set empty state
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
 Evas_Object* TabUI::createTopButtons(Evas_Object* parent)
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
index 0563baec17a15bc5cb1f1978f513744a78ccfcda..462b1259f8b6293b1ef151d155782e2d29664ce0 100644 (file)
@@ -20,6 +20,7 @@
 #include <Evas.h>
 #include <boost/signals2/signal.hpp>
 
+#include "AbstractContextMenu.h"
 #include "AbstractUIComponent.h"
 #include "AbstractService.h"
 #include "ServiceFactory.h"
@@ -33,7 +34,8 @@ namespace tizen_browser{
 namespace base_ui{
 
 class BROWSER_EXPORT TabUI
-        : public tizen_browser::interfaces::AbstractUIComponent
+        : public tizen_browser::interfaces::AbstractContextMenu
+        , public tizen_browser::interfaces::AbstractUIComponent
         , public tizen_browser::core::AbstractService
 #if PROFILE_MOBILE
         , public tizen_browser::interfaces::AbstractRotatable
@@ -57,6 +59,9 @@ public:
     virtual void orientationChanged() override;
 #endif
 
+    //AbstractContextMenu interface implementation
+    virtual void showContextMenu() override;
+
     boost::signals2::signal<void (const tizen_browser::basic_webengine::TabId&)> tabClicked;
     boost::signals2::signal<void ()> newTabClicked;
     boost::signals2::signal<void ()> newIncognitoTabClicked;
@@ -91,6 +96,9 @@ private:
 #endif
     static void _focus_in(void * data, Evas*, Evas_Object * obj, void * event_info);
     static Eina_Bool _ready(void *data);
+    static void _cm_sync_clicked(void*, Evas_Object*, void*);
+    static void _cm_secret_clicked(void*, Evas_Object*, void*);
+    static void _cm_close_clicked(void*, Evas_Object*, void*);
 
     void createTabUILayout();
     Evas_Object* createActionBar(Evas_Object* parent);
index bbc45c4ae80b5c8abe6c8cd4c5eb7031b62882c0..a21bbfaa39f91818596f5f562bc458b1bbf1680b 100755 (executable)
@@ -420,6 +420,121 @@ void WebPageUI::orientationChanged()
 }
 #endif
 
+void WebPageUI::showContextMenu()
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+
+    boost::optional<Evas_Object*> window = getWindow();
+    if (window) {
+        createContextMenu(*window);
+
+        if (m_statesMgr->equals(WPUState::QUICK_ACCESS)) {
+            //TODO: Add translation
+            elm_ctxpopup_item_append(m_ctxpopup, "Edit Quick access", nullptr, _cm_edit_qa_clicked, this);
+        } else if (m_statesMgr->equals(WPUState::MAIN_WEB_PAGE)) {
+            elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_OPT_SHARE"), nullptr, _cm_share_clicked, this);
+            elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_OPT_FIND_ON_PAGE"), nullptr, _cm_find_on_page_clicked, this);
+
+            boost::optional<bool> bookmark = isBookmark();
+            if (bookmark) {
+                //TODO: Add translation
+                elm_ctxpopup_item_append(m_ctxpopup, *bookmark ? "Remove from bookmarks" : "Add to Bookmarks",
+                        nullptr, _cm_bookmark_flow_clicked, this);
+            } else
+                BROWSER_LOGE("[%s:%d] Signal not found", __PRETTY_FUNCTION__, __LINE__);
+
+            //TODO: "dont add this item if it is already in a quick access
+            elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_OPT_ADD_TO_QUICK_ACCESS"), nullptr, _cm_add_to_qa_clicked, this);
+            elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_BODY_DESKTOP_VIEW"), nullptr, _cm_desktop_view_page_clicked, this);
+        } else {
+            BROWSER_LOGW("[%s] State not handled, context menu not shown", __PRETTY_FUNCTION__);
+            return;
+        }
+
+        elm_ctxpopup_item_append(m_ctxpopup, _("IDS_BR_BODY_SETTINGS"), nullptr, _cm_settings_clicked, this);
+        alignContextMenu(*window);
+    } else
+        BROWSER_LOGE("[%s:%d] Signal not found", __PRETTY_FUNCTION__, __LINE__);
+}
+
+void WebPageUI::_cm_edit_qa_clicked(void* data, Evas_Object*, void* )
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        WebPageUI* webPageUI = static_cast<WebPageUI*>(data);
+        _cm_dismissed(nullptr, webPageUI->m_ctxpopup, nullptr);
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
+void WebPageUI::_cm_share_clicked(void* data, Evas_Object*, void* )
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        WebPageUI* webPageUI = static_cast<WebPageUI*>(data);
+        _cm_dismissed(nullptr, webPageUI->m_ctxpopup, nullptr);
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
+void WebPageUI::_cm_find_on_page_clicked(void* data, Evas_Object*, void* )
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        WebPageUI* webPageUI = static_cast<WebPageUI*>(data);
+        _cm_dismissed(nullptr, webPageUI->m_ctxpopup, nullptr);
+        webPageUI->showFindOnPageUI();
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
+void WebPageUI::_cm_bookmark_flow_clicked(void* data, Evas_Object*, void* )
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        WebPageUI* webPageUI = static_cast<WebPageUI*>(data);
+        _cm_dismissed(nullptr, webPageUI->m_ctxpopup, nullptr);
+
+        boost::optional<bool> bookmark = webPageUI->isBookmark();
+        if (bookmark)
+            webPageUI->showBookmarkFlowUI(*bookmark);
+        else
+            BROWSER_LOGE("[%s:%d] Signal not found", __PRETTY_FUNCTION__, __LINE__);
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
+void WebPageUI::_cm_add_to_qa_clicked(void* data, Evas_Object*, void* )
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        WebPageUI* webPageUI = static_cast<WebPageUI*>(data);
+        _cm_dismissed(nullptr, webPageUI->m_ctxpopup, nullptr);
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
+void WebPageUI::_cm_desktop_view_page_clicked(void* data, Evas_Object*, void* )
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        WebPageUI* webPageUI = static_cast<WebPageUI*>(data);
+        _cm_dismissed(nullptr, webPageUI->m_ctxpopup, nullptr);
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
+void WebPageUI::_cm_settings_clicked(void* data, Evas_Object*, void* )
+{
+    BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
+    if (data != nullptr) {
+        WebPageUI* webPageUI = static_cast<WebPageUI*>(data);
+        _cm_dismissed(nullptr, webPageUI->m_ctxpopup, nullptr);
+        webPageUI->showSettingsUI();
+    } else
+        BROWSER_LOGW("[%s] data = nullptr", __PRETTY_FUNCTION__);
+}
+
 void WebPageUI::createLayout()
 {
     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
index a189f97c692a2da2f350254ac6e1112fc9a5e5b9..383399fe9d6cad2ed550c2b939d8c1bfe531dfac 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <Evas.h>
 #include <boost/signals2/signal.hpp>
+#include "AbstractContextMenu.h"
 #include "AbstractService.h"
 #include "AbstractUIComponent.h"
 #include "AbstractRotatable.h"
@@ -38,7 +39,8 @@ class UrlHistoryList;
 typedef std::shared_ptr<UrlHistoryList> UrlHistoryPtr;
 
 class BROWSER_EXPORT WebPageUI
-        : public tizen_browser::core::AbstractService
+        : public interfaces::AbstractContextMenu
+        , public tizen_browser::core::AbstractService
         , public tizen_browser::interfaces::AbstractUIComponent
 #if PROFILE_MOBILE
         , public tizen_browser::interfaces::AbstractRotatable
@@ -57,6 +59,9 @@ public:
 #if PROFILE_MOBILE
     virtual void orientationChanged() override;
 #endif
+    //AbstractContextMenu interface implementation
+    virtual void showContextMenu() override;
+
     void loadStarted();
     void progressChanged(double progress);
     void loadFinished();
@@ -116,6 +121,12 @@ public:
     boost::signals2::signal<void ()> focusWebView;
     boost::signals2::signal<void ()> unfocusWebView;
 
+    //AbstractContextMenu signals
+    boost::signals2::signal<bool ()> isBookmark;
+    boost::signals2::signal<void (bool)> showBookmarkFlowUI;
+    boost::signals2::signal<void ()> showFindOnPageUI;
+    boost::signals2::signal<void ()> showSettingsUI;
+
 private:
     static void faviconClicked(void* data, Evas_Object* obj, const char* emission, const char* source);
     static Eina_Bool _cb_down_pressed_on_urlbar(void *data, Evas_Object *obj, Evas_Object *src, Evas_Callback_Type type, void *event_info);
@@ -129,6 +140,13 @@ private:
 #if PROFILE_MOBILE && GESTURE
     static Evas_Event_Flags _gesture_move(void *data, void *event_info);
 #endif
+    static void _cm_edit_qa_clicked(void*, Evas_Object*, void*);
+    static void _cm_share_clicked(void*, Evas_Object*, void*);
+    static void _cm_find_on_page_clicked(void*, Evas_Object*, void*);
+    static void _cm_bookmark_flow_clicked(void*, Evas_Object*, void*);
+    static void _cm_add_to_qa_clicked(void*, Evas_Object*, void*);
+    static void _cm_desktop_view_page_clicked(void*, Evas_Object*, void*);
+    static void _cm_settings_clicked(void*, Evas_Object*, void*);
 
     void createLayout();
     void createErrorLayout();