Refactored ListView and related classes to support common select mode types. 84/59784/4
authorEugene Kurzberg <i.kurtsberg@samsung.com>
Thu, 18 Feb 2016 11:16:46 +0000 (13:16 +0200)
committerEugene Kurzberg <i.kurtsberg@samsung.com>
Mon, 22 Feb 2016 15:47:17 +0000 (17:47 +0200)
Change-Id: Ia9c1090344dcf2f7d56ca34a777e0e987806b54a
Signed-off-by: Eugene Kurzberg <i.kurtsberg@samsung.com>
lib-contact/inc/Contacts/List/ListView.h
lib-contact/inc/Contacts/List/Model/PersonProvider.h
lib-contact/inc/Contacts/List/PersonItem.h
lib-contact/src/Contacts/List/ListView.cpp
lib-contact/src/Contacts/List/Model/PersonProvider.cpp
lib-contact/src/Contacts/List/PersonItem.cpp

index 59c1ef5959f28ab50246092431d644643c2df777..8a57cfd1525d5138ef7b79be4452547c3447d0ba 100644 (file)
 
 #include "Contacts/List/Model/PersonProvider.h"
 #include "Contacts/List/PersonItem.h"
+
 #include "Ui/View.h"
 #include "Utils/UniString.h"
+
 #include <map>
 
 namespace Ui
@@ -45,44 +47,18 @@ namespace Contacts
                class EXPORT_API ListView : public Ui::View
                {
                public:
-                       /**
-                        * @brief Represents view mode
-                        */
-                       enum Mode
-                       {
-                               ModeDefault,
-                               ModeSingleSelect,
-                               ModeMultiSelect,
-                               ModeMultiSelectWithLimit,
-                               ModeMax
-                       };
-
-                       /**
-                        * @brief Person ID list
-                        */
-                       typedef std::vector<int> PersonIds;
-
-                       /**
-                        * @brief Callback, that invoked when all results are prepared
-                        * @details Invoked on view close
-                        * @return True if view should be closed, otherwise false
-                        */
-                       typedef std::function<bool(PersonIds)> ResultCallback;
-
                        /**
                         * @brief Create new person list view
-                        * @param]in]   personFilter    Defines how to filter person list
+                        * @param]in]   filterType  Defines how to filter person list
                         */
-                       ListView(Model::PersonProvider::FilterType personFilter =
-                                       Model::PersonProvider::FilterNone);
+                       ListView(int filterType = FilterNone);
                        virtual ~ListView() override;
 
                        /**
-                        * @brief Set view mode
-                        * @details View can be in Default, SinglePick or Multipick mode
-                        * @param[in]   mode    View mode
+                        * @brief Set selection mode.
+                        * @param[in]   selectMode  Item selection mode
                         */
-                       void setMode(Mode mode);
+                       void setSelectMode(SelectMode selectMode);
 
                        /**
                         * @brief Set item selection limit
@@ -96,12 +72,7 @@ namespace Contacts
                         * @remark Used in Singlepick/Multipick view modes
                         * @param[in]   callback    Done pressed callback
                         */
-                       void setResultCallback(ResultCallback callback);
-
-                       /**
-                        * @brief Unset view result callback
-                        */
-                       void unsetResultCallback();
+                       void setSelectCallback(SelectCallback callback);
 
                private:
                        enum SectionId
@@ -121,7 +92,6 @@ namespace Contacts
                        virtual void onCreated() override;
                        virtual void onMenuPressed() override;
 
-                       void fillList();
                        void fillSearchItem();
                        void fillSelectAllItem();
                        void fillMyProfile();
@@ -129,27 +99,23 @@ namespace Contacts
                        void fillMfc();
                        void fillPersonList();
 
-                       void setFavouriteItemsMode(PersonItem::Mode mode);
-                       void setPersonItemsMode(PersonItem::Mode mode);
+                       void setFavouriteItemsMode(SelectMode selectMode);
+                       void setPersonItemsMode(SelectMode selectMode);
 
                        void addSection(SectionId sectionId);
                        void removeSection(SectionId sectionId);
                        Ui::GenlistItem *getNextSectionItem(SectionId currentSection);
-                       bool getSectionVisibility(Mode mode, SectionId sectionId);
-
-                       PersonItem::Mode getItemMode();
+                       bool getSectionVisibility(SelectMode selectMode, SectionId sectionId);
 
                        void updateTitle();
                        void updateSelectAllState();
                        void updatePageMode();
                        void updateSectionsMode();
 
-                       void createNewContactButton();
-                       void deleteNewContactButton();
-                       void createCancelButton();
-                       void deleteCancelButton();
-                       void createDoneButton();
-                       void deleteDoneButton();
+                       void createAddButton();
+                       void deleteAddButton();
+                       void createPageButtons();
+                       void deletePageButtons();
 
                        void insertMyProfileGroupItem();
                        void updateMyProfileItem(const char *view_uri);
@@ -169,15 +135,14 @@ namespace Contacts
                        void deletePersonItem(PersonItem *item);
                        PersonItem *getNextPersonItem(PersonGroupItem *group, const Model::Person &person);
 
-                       PersonIds getCheckedPersonIds();
-
                        void launchPersonDetail(PersonItem *item);
 
                        void onIndexChanged(Evas_Object *index, Elm_Object_Item *indexItem);
                        void onIndexSelected(Evas_Object *index, Elm_Object_Item *indexItem);
 
-                       void onCreatePressed();
+                       void onAddPressed(Evas_Object *button, void *eventInfo);
                        void onDonePressed(Evas_Object *button, void *eventInfo);
+                       void onCancelPressed(Evas_Object *button, void *eventInfo);
 
                        void onPersonItemInserted(PersonItem *item);
                        void onPersonItemDelete(PersonItem *item);
@@ -192,21 +157,22 @@ namespace Contacts
 
                        Ui::Genlist *m_Genlist;
                        Evas_Object *m_Index;
-                       Evas_Object *m_CancelButton;
+
+                       Evas_Object *m_AddButton;
                        Evas_Object *m_DoneButton;
+                       Evas_Object *m_CancelButton;
 
                        Ui::GenlistItem *m_Sections[SectionMax];
                        std::map<Utils::UniString, PersonGroupItem *> m_PersonGroups;
 
                        Model::PersonProvider m_Provider;
 
-                       Mode m_Mode;
-
                        size_t m_PersonCount;
                        size_t m_SelectCount;
                        size_t m_SelectLimit;
 
-                       ResultCallback m_OnResult;
+                       SelectMode m_SelectMode;
+                       SelectCallback m_OnSelected;
                };
        }
 }
index 417235a9404f60130b65af5ea02191d021f04b6d..297abc81604164d05565f86c78ed1b6077812254 100644 (file)
 #ifndef CONTACTS_LIST_MODEL_PERSON_PROVIDER_H
 #define CONTACTS_LIST_MODEL_PERSON_PROVIDER_H
 
+#include "Contacts/Common/SelectMode.h"
 #include "Contacts/List/Model/DbChangeObserver.h"
 #include "Contacts/List/Model/Person.h"
+
 #include <contacts.h>
 #include <functional>
 #include <unordered_map>
@@ -36,7 +38,6 @@ namespace Contacts
                        class PersonProvider
                        {
                        public:
-
                                /**
                                 * @brief Determines what persons to provide
                                 */
@@ -47,16 +48,6 @@ namespace Contacts
                                        ModeMFC
                                };
 
-                               /**
-                                * @brief Determines how to filter person list
-                                */
-                               enum FilterType
-                               {
-                                       FilterNone      = 0,
-                                       FilterNumber    = 1 << 0,
-                                       FilterEmail     = 1 << 1
-                               };
-
                                /**
                                 * @brief Person insert callback
                                 * @param[in]    person        Person object
@@ -75,7 +66,7 @@ namespace Contacts
                                 * @param[in]    filterType    Contact filter
                                 */
                                explicit PersonProvider(Mode modeType = ModeAll,
-                                               FilterType filterType = FilterNone);
+                                               int filterType = FilterNone);
 
                                ~PersonProvider();
 
@@ -115,7 +106,7 @@ namespace Contacts
                                void onPersonChanged(int id, contacts_changed_e changeType);
 
                                Mode m_Mode;
-                               FilterType m_FilterType;
+                               int m_FilterType;
 
                                std::pair<InsertCallback, Model::DbChangeObserver::CallbackHandle> m_InsertCallback;
                                std::unordered_map<int, std::pair<ChangeCallback, Model::DbChangeObserver::CallbackHandle>> m_ChangeCallbacks;
index adee1fc08e6f3aba0dfca4380e3b42d463b8d784..c10905727983928ac28169acb6e03391dd73359f 100644 (file)
@@ -18,6 +18,7 @@
 #ifndef CONTACTS_LIST_PERSON_ITEM_H
 #define CONTACTS_LIST_PERSON_ITEM_H
 
+#include "Contacts/Common/SelectMode.h"
 #include "Contacts/List/Model/Person.h"
 #include "Ui/GenlistCheckItem.h"
 #include <functional>
@@ -36,27 +37,17 @@ namespace Contacts
                class PersonItem : public Ui::GenlistCheckItem
                {
                public:
-                       /**
-                        * @brief Represents item mode
-                        */
-                       enum Mode
-                       {
-                               ModeDefault,    /*< Usual mode */
-                               ModePick        /*< Mode with ability to select item */
-                       };
-
                        /**
                         * @brief Create person item
                         * @param[in]   person      Person object
-                        * @param[in]   mode        Item mode
                         */
-                       explicit PersonItem(Model::PersonPtr person, Mode mode = ModeDefault);
+                       explicit PersonItem(Model::PersonPtr person);
 
                        /**
-                        * @brief Set item mode
-                        * @param[in]   mode    Item mode
+                        * @brief Set item selection mode
+                        * @param[in]   selectMode  Item selection mode
                         */
-                       void setMode(Mode mode);
+                       void setSelectMode(SelectMode selectMode);
 
                        /**
                         * @return Person object
@@ -74,7 +65,7 @@ namespace Contacts
                        virtual Evas_Object *getContent(Evas_Object *parent, const char *part) override;
 
                        Model::PersonPtr m_Person;
-                       Mode m_Mode;
+                       SelectMode m_SelectMode;
                };
        }
 }
index 84650ea697ec0e5efd08d3caeb9c392f6f6aaf28..8522c5a7a999303b09cbe84b0f56a834bf77a6e1 100644 (file)
@@ -43,13 +43,13 @@ using namespace Contacts::List::Model;
 using namespace Utils;
 using namespace std::placeholders;
 
-ListView::ListView(PersonProvider::FilterType personFilter)
+ListView::ListView(int filterType)
        : m_Genlist(nullptr), m_Index(nullptr),
-         m_CancelButton(nullptr), m_DoneButton(nullptr),
+         m_AddButton(nullptr), m_DoneButton(nullptr), m_CancelButton(nullptr),
          m_Sections{ nullptr },
-         m_Provider(PersonProvider(PersonProvider::ModeAll, personFilter)),
-         m_Mode(ModeDefault),
-         m_PersonCount(0), m_SelectCount(0), m_SelectLimit(0)
+         m_Provider(PersonProvider::ModeAll, filterType),
+         m_PersonCount(0), m_SelectCount(0), m_SelectLimit(0),
+         m_SelectMode(SelectNone)
 {
 }
 
@@ -60,10 +60,10 @@ ListView::~ListView()
                        makeCallbackWithLastParam(&ListView::updateMyProfileItem), this);
 }
 
-void ListView::setMode(Mode mode)
+void ListView::setSelectMode(SelectMode selectMode)
 {
-       if (m_Mode != mode) {
-               m_Mode = mode;
+       if (m_SelectMode != selectMode) {
+               m_SelectMode = selectMode;
 
                updatePageMode();
                updateSectionsMode();
@@ -72,17 +72,17 @@ void ListView::setMode(Mode mode)
 
 void ListView::setSelectLimit(size_t count)
 {
-       m_SelectLimit = count;
-}
+       if (m_SelectLimit != count) {
+               m_SelectLimit = count;
 
-void ListView::setResultCallback(ResultCallback callback)
-{
-       m_OnResult = std::move(callback);
+               updateTitle();
+               updateSectionsMode();
+       }
 }
 
-void ListView::unsetResultCallback()
+void ListView::setSelectCallback(SelectCallback callback)
 {
-       m_OnResult = nullptr;
+       m_OnSelected = std::move(callback);
 }
 
 Evas_Object *ListView::onCreate(Evas_Object *parent)
@@ -91,7 +91,10 @@ Evas_Object *ListView::onCreate(Evas_Object *parent)
        elm_layout_theme_set(layout, "layout", "application", "fastscroll");
 
        m_Genlist = new Ui::Genlist();
-       elm_object_part_content_set(layout, "elm.swallow.content", m_Genlist->create(layout));
+       m_Genlist->create(layout);
+       elm_genlist_homogeneous_set(m_Genlist->getEvasObject(), EINA_TRUE);
+
+       elm_object_part_content_set(layout, "elm.swallow.content", m_Genlist->getEvasObject());
        elm_object_part_content_set(layout, "elm.swallow.fastscroll", createIndex(layout));
 
        return layout;
@@ -104,7 +107,7 @@ void ListView::onPageAttached()
 
 void ListView::onCreated()
 {
-       fillList();
+       updateSectionsMode();
 
        m_Provider.setInsertCallback(std::bind(&ListView::onPersonInserted, this, _1));
        contacts_db_add_changed_cb(_contacts_my_profile._uri,
@@ -113,33 +116,32 @@ void ListView::onCreated()
 
 void ListView::onMenuPressed()
 {
-       if (m_Mode == ModeDefault) {
-               Ui::Menu *menu = new Ui::Menu();
-               menu->create(getEvasObject());
+       if (m_SelectMode != SelectNone) {
+               return;
+       }
 
-               menu->addItem("IDS_LOGS_OPT_DELETE", [this] {
-                       ListView *deleteView = new ListView();
-                       getNavigator()->navigateTo(deleteView);
-                       deleteView->setMode(ModeMultiSelect);
-                       deleteView->setResultCallback([](PersonIds ids) {
-                               contacts_db_delete_records(_contacts_person._uri, ids.data(), ids.size());
+       Ui::Menu *menu = new Ui::Menu();
+       menu->create(getEvasObject());
 
-                               return true;
-                       });
-               });
+       menu->addItem("IDS_LOGS_OPT_DELETE", [this] {
+               ListView *deleteView = new ListView();
+               getNavigator()->navigateTo(deleteView);
+               deleteView->setSelectMode(SelectMulti);
+               deleteView->setSelectCallback([](SelectResults results) {
+                       std::vector<int> ids;
+                       for (auto &&result : results) {
+                               ids.push_back(result.itemId);
+                       }
 
-               menu->addItem("IDS_PB_OPT_SETTINGS", [this] {
-                       getNavigator()->navigateTo(new Settings::MainView());
+                       contacts_db_delete_records(_contacts_person._uri, ids.data(), ids.size());
+                       return true;
                });
-               menu->show();
-       }
-}
+       });
 
-void ListView::fillList()
-{
-       for (size_t i = SectionMyProfile; i < SectionMax; ++i) {
-               addSection(static_cast<SectionId>(i));
-       }
+       menu->addItem("IDS_PB_OPT_SETTINGS", [this] {
+               getNavigator()->navigateTo(new Settings::MainView());
+       });
+       menu->show();
 }
 
 void ListView::fillSearchItem()
@@ -171,7 +173,7 @@ void ListView::fillFavorites()
        if (!m_Sections[SectionFavorites]) {
                //Todo Create here Favorite group
        } else {
-               setFavouriteItemsMode(getItemMode());
+               setFavouriteItemsMode(m_SelectMode);
        }
 }
 
@@ -198,25 +200,25 @@ void ListView::fillPersonList()
                        ++m_PersonCount;
                }
        } else {
-               setPersonItemsMode(getItemMode());
+               setPersonItemsMode(m_SelectMode);
        }
 }
 
-void ListView::setFavouriteItemsMode(PersonItem::Mode mode)
+void ListView::setFavouriteItemsMode(SelectMode selectMode)
 {
-       auto group = dynamic_cast<Ui::GenlistGroupItem *>(m_Sections[SectionFavorites]);
        if (m_Sections[SectionFavorites]) {
+               auto group = dynamic_cast<Ui::GenlistGroupItem *>(m_Sections[SectionFavorites]);
                for (auto &&favoriteItem : *group) {
-                       static_cast<PersonItem*>(favoriteItem)->setMode(mode);
+                       static_cast<PersonItem *>(favoriteItem)->setSelectMode(selectMode);
                }
        }
 }
 
-void ListView::setPersonItemsMode(PersonItem::Mode mode)
+void ListView::setPersonItemsMode(SelectMode selectMode)
 {
        for (auto &&group : m_PersonGroups) {
                for (auto &&personItem : *group.second) {
-                       static_cast<PersonItem*>(personItem)->setMode(mode);
+                       static_cast<PersonItem *>(personItem)->setSelectMode(selectMode);
                }
        }
 }
@@ -251,10 +253,10 @@ Ui::GenlistItem *ListView::getNextSectionItem(SectionId currentSection)
        return nullptr;
 }
 
-bool ListView::getSectionVisibility(Mode mode, SectionId sectionId)
+bool ListView::getSectionVisibility(SelectMode selectMode, SectionId sectionId)
 {
-       static bool sectionVisibility[ListView::ModeMax][ListView::SectionMax] = {
-               /* ModeDefault    = */ {
+       static bool sectionVisibility[][ListView::SectionMax] = {
+               /* SelectNone   = */ {
                        /* SectionSearch    = */ true,
                        /* SectionSelectAll = */ false,
                        /* SectionMyProfile = */ true,
@@ -262,7 +264,7 @@ bool ListView::getSectionVisibility(Mode mode, SectionId sectionId)
                        /* SectionMfc       = */ true,
                        /* SectionPerson    = */ true
                },
-               /* ModeSingleSelect = */ {
+               /* SelectSingle = */ {
                        /* SectionSearch    = */ true,
                        /* SectionSelectAll = */ false,
                        /* SectionMyProfile = */ true,
@@ -270,62 +272,49 @@ bool ListView::getSectionVisibility(Mode mode, SectionId sectionId)
                        /* SectionMfc       = */ false,
                        /* SectionPerson    = */ true
                },
-               /* ModeMultiSelect  = */ {
+               /* SelectMulti  = */ {
                        /* SectionSearch    = */ true,
                        /* SectionSelectAll = */ true,
                        /* SectionMyProfile = */ false,
                        /* SectionFavorites = */ true,
                        /* SectionMfc       = */ false,
                        /* SectionPerson    = */ true
-               },
-               /* ModeMultiSelectWithLimit  = */ {
-                       /* SectionSearch    = */ true,
-                       /* SectionSelectAll = */ false,
-                       /* SectionMyProfile = */ false,
-                       /* SectionFavorites = */ true,
-                       /* SectionMfc       = */ false,
-                       /* SectionPerson    = */ true
                }
        };
 
-       return sectionVisibility[mode][sectionId];
-}
-
-PersonItem::Mode ListView::getItemMode()
-{
-       switch (m_Mode) {
-               case ModeMultiSelect:
-               case ModeMultiSelectWithLimit:
-                       return PersonItem::ModePick;
-               default:
-                       return PersonItem::ModeDefault;
+       if (m_SelectLimit && selectMode == SelectMulti && sectionId == SectionSelectAll) {
+               return false;
        }
+
+       return sectionVisibility[selectMode][sectionId];
 }
 
 void ListView::updateTitle()
 {
-       switch (m_Mode) {
-               case ModeDefault:
-                       getPage()->setTitle("IDS_PB_TAB_CONTACTS");
-                       break;
-               case ModeSingleSelect:
-                       getPage()->setTitle("IDS_PB_HEADER_SELECT_CONTACT_ABB2");
+       Ui::NavigatorPage *page = getPage();
+       if (!page) {
+               return;
+       }
+
+       switch (m_SelectMode) {
+               case SelectNone:
+                       page->setTitle("IDS_PB_TAB_CONTACTS");
                        break;
-               case ModeMultiSelect:
-               {
-                       char title[TITLE_SIZE];
-                       snprintf(title, TITLE_SIZE, _("IDS_PB_HEADER_PD_SELECTED_ABB"), m_SelectCount);
-                       getPage()->setTitle(title);
+
+               case SelectSingle:
+                       page->setTitle("IDS_PB_HEADER_SELECT_CONTACT_ABB2");
                        break;
-               }
-               case ModeMultiSelectWithLimit:
+
+               case SelectMulti:
                {
                        char title[TITLE_SIZE];
-                       snprintf(title, TITLE_SIZE, "%zu/%zu", m_SelectCount, m_SelectLimit);
-                       getPage()->setTitle(title);
-                       break;
+                       if (m_SelectLimit) {
+                               snprintf(title, TITLE_SIZE, "%zu/%zu", m_SelectCount, m_SelectLimit);
+                       } else {
+                               snprintf(title, TITLE_SIZE, _("IDS_PB_HEADER_PD_SELECTED_ABB"), m_SelectCount);
+                       }
+                       page->setTitle(title);
                }
-               default:
                        break;
        }
 }
@@ -340,39 +329,43 @@ void ListView::updateSelectAllState()
 
 void ListView::updatePageMode()
 {
-       if (!getPage()) {
+       Ui::NavigatorPage *page = getPage();
+       if (!page) {
                return;
        }
 
        updateTitle();
 
-       switch (m_Mode) {
-               case ModeDefault:
-                       deleteCancelButton();
-                       deleteDoneButton();
-                       createNewContactButton();
-                       break;
-               case ModeSingleSelect:
-                       deleteCancelButton();
-                       deleteDoneButton();
-                       deleteNewContactButton();
+       switch (m_SelectMode) {
+               case SelectNone:
+                       deletePageButtons();
+                       createAddButton();
+                       page->setContent("toolbar", m_AddButton);
                        break;
-               case ModeMultiSelect:
-               case ModeMultiSelectWithLimit:
-                       createCancelButton();
-                       createDoneButton();
-                       deleteNewContactButton();
+
+               case SelectSingle:
+                       deletePageButtons();
+                       deleteAddButton();
                        break;
-               default:
+
+               case SelectMulti:
+                       createPageButtons();
+                       deleteAddButton();
+                       page->setContent(PART_TITLE_RIGHT, m_DoneButton);
+                       page->setContent(PART_TITLE_LEFT, m_CancelButton);
                        break;
        }
 }
 
 void ListView::updateSectionsMode()
 {
+       if (!m_Genlist) {
+               return;
+       }
+
        for (size_t i = SectionFirst; i < SectionMax; ++i) {
                SectionId sectionId = static_cast<SectionId>(i);
-               if (getSectionVisibility(m_Mode, sectionId)) {
+               if (getSectionVisibility(m_SelectMode, sectionId)) {
                        addSection(sectionId);
                } else {
                        removeSection(sectionId);
@@ -380,57 +373,43 @@ void ListView::updateSectionsMode()
        }
 }
 
-void ListView::createNewContactButton()
+void ListView::createAddButton()
 {
-       Evas_Object *button = elm_button_add(getEvasObject());
-       elm_object_style_set(button, "bottom");
-       elm_object_translatable_text_set(button, "IDS_PB_OPT_CREATE");
-       evas_object_smart_callback_add(button, "clicked",
-                       (Evas_Smart_Cb) makeCallback(&ListView::onCreatePressed), this);
-
-       getPage()->setContent("toolbar", button);
+       m_AddButton = elm_button_add(getEvasObject());
+       elm_object_style_set(m_AddButton, "bottom");
+       elm_object_translatable_text_set(m_AddButton, "IDS_PB_OPT_CREATE");
+       evas_object_smart_callback_add(m_AddButton, "clicked",
+                       makeCallback(&ListView::onAddPressed), this);
 }
 
-void ListView::deleteNewContactButton()
+void ListView::deleteAddButton()
 {
-       //Todo
-}
-
-void ListView::createCancelButton()
-{
-       m_CancelButton = elm_button_add(getEvasObject());
-       elm_object_style_set(m_CancelButton, "naviframe/title_left");
-       elm_object_translatable_text_set(m_CancelButton, "IDS_PB_BUTTON_CANCEL");
-       evas_object_smart_callback_add(m_CancelButton, "clicked",
-                       [](void *self, Evas_Object *obj, void *eventInfo) {
-                               delete static_cast<ListView *>(self);
-                       },
-                       this);
-
-       getPage()->setContent(PART_TITLE_LEFT, m_CancelButton);
-}
-
-void ListView::deleteCancelButton()
-{
-       evas_object_del(m_CancelButton);
-       m_CancelButton = nullptr;
+       evas_object_del(m_AddButton);
+       m_AddButton = nullptr;
 }
 
-void ListView::createDoneButton()
+void ListView::createPageButtons()
 {
-       Evas_Object *m_DoneButton = elm_button_add(getEvasObject());
+       m_DoneButton = elm_button_add(getEvasObject());
        elm_object_style_set(m_DoneButton, "naviframe/title_right");
        elm_object_translatable_text_set(m_DoneButton, "IDS_PB_BUTTON_DONE_ABB3");
        evas_object_smart_callback_add(m_DoneButton, "clicked",
                        makeCallback(&ListView::onDonePressed), this);
 
-       getPage()->setContent(PART_TITLE_RIGHT, m_DoneButton);
+       m_CancelButton = elm_button_add(getEvasObject());
+       elm_object_style_set(m_CancelButton, "naviframe/title_left");
+       elm_object_translatable_text_set(m_CancelButton, "IDS_PB_BUTTON_CANCEL");
+       evas_object_smart_callback_add(m_CancelButton, "clicked",
+                       makeCallback(&ListView::onCancelPressed), this);
 }
 
-void ListView::deleteDoneButton()
+void ListView::deletePageButtons()
 {
        evas_object_del(m_DoneButton);
+       evas_object_del(m_CancelButton);
+
        m_DoneButton = nullptr;
+       m_CancelButton = nullptr;
 }
 
 void ListView::insertMyProfileGroupItem()
@@ -525,7 +504,8 @@ PersonGroupItem *ListView::getNextPersonGroupItem(const Utils::UniString &indexL
 
 PersonItem *ListView::createPersonItem(PersonPtr person)
 {
-       PersonItem *item = new PersonItem(std::move(person), getItemMode());
+       PersonItem *item = new PersonItem(std::move(person));
+       item->setSelectMode(m_SelectMode);
 
        m_Provider.setChangeCallback(item->getPerson(),
                        std::bind(&ListView::onPersonChanged, this, _1, _2, item));
@@ -605,21 +585,6 @@ PersonItem *ListView::getNextPersonItem(PersonGroupItem *group, const Person &pe
        return nullptr;
 }
 
-ListView::PersonIds ListView::getCheckedPersonIds()
-{
-       PersonIds ids;
-       for (auto &&group : m_PersonGroups) {
-               for (auto &&item : *group.second) {
-                       PersonItem *personItem = static_cast<PersonItem *>(item);
-                       if (personItem->isChecked()) {
-                               ids.push_back(personItem->getPerson().getId());
-                       }
-               }
-       }
-
-       return ids;
-}
-
 void ListView::launchPersonDetail(PersonItem *item)
 {
        int id = item->getPerson().getDisplayContactId();
@@ -638,18 +603,33 @@ void ListView::onIndexSelected(Evas_Object *index, Elm_Object_Item *indexItem)
        elm_index_item_selected_set(indexItem, EINA_FALSE);
 }
 
-void ListView::onCreatePressed()
+void ListView::onAddPressed(Evas_Object *button, void *eventInfo)
 {
        getNavigator()->navigateTo(new Input::InputView());
 }
 
 void ListView::onDonePressed(Evas_Object *button, void *eventInfo)
 {
-       if (m_OnResult && m_OnResult(getCheckedPersonIds())) {
+       std::vector<SelectResult> results;
+       for (auto &&group : m_PersonGroups) {
+               for (auto &&item : *group.second) {
+                       PersonItem *personItem = static_cast<PersonItem *>(item);
+                       if (personItem->isChecked()) {
+                               results.push_back({ ItemPerson, personItem->getPerson().getId() });
+                       }
+               }
+       }
+
+       if (m_OnSelected && m_OnSelected({ results.data(), results.size() })) {
                delete this;
        }
 }
 
+void ListView::onCancelPressed(Evas_Object *button, void *eventInfo)
+{
+       delete this;
+}
+
 void ListView::onPersonItemInserted(PersonItem *item)
 {
        ++m_PersonCount;
@@ -688,7 +668,8 @@ void ListView::onPersonChanged(PersonPtr person, contacts_changed_e changeType,
 
 void ListView::onPersonSelected(const Model::Person &person)
 {
-       if (m_OnResult && m_OnResult({ person.getId() })) {
+       SelectResult result = { ItemPerson, person.getId() };
+       if (m_OnSelected && m_OnSelected({ &result, 1 })) {
                delete this;
        }
 }
@@ -707,7 +688,7 @@ void ListView::onSelectAllChecked(bool isChecked)
 
 void ListView::onItemChecked(PersonItem *item, bool isChecked)
 {
-       if (m_Mode == ModeMultiSelectWithLimit && m_SelectCount == m_SelectLimit && isChecked) {
+       if (m_SelectLimit && m_SelectCount == m_SelectLimit && isChecked) {
                item->setChecked(false);
                return;
        }
@@ -722,9 +703,9 @@ void ListView::onItemChecked(PersonItem *item, bool isChecked)
 
 void ListView::onItemSelected(PersonItem *item)
 {
-       switch (m_Mode) {
-               case ModeDefault:      launchPersonDetail(item); break;
-               case ModeSingleSelect: onPersonSelected(item->getPerson()); break;
+       switch (m_SelectMode) {
+               case SelectNone:    launchPersonDetail(item); break;
+               case SelectSingle:  onPersonSelected(item->getPerson()); break;
                default: break;
        }
 }
index b2ff0e7d2a1486e0d9eedbf42dd4df812f518173..a26ac8766b1b39bd39bc13448782cab15e5fc7ef 100644 (file)
@@ -21,6 +21,7 @@
 #include "Utils/Range.h"
 #include "Utils/Logger.h"
 
+using namespace Contacts;
 using namespace Contacts::List::Model;
 using namespace std::placeholders;
 
@@ -54,20 +55,20 @@ namespace
                return filter;
        }
 
-       contacts_filter_h prepareFilterTypeFilter(PersonProvider::FilterType filterType)
+       contacts_filter_h prepareFilterTypeFilter(int filterType)
        {
                contacts_filter_h filter = nullptr;
 
-               if (filterType != PersonProvider::FilterNone) {
+               if (filterType != FilterNone) {
                        contacts_filter_create(_contacts_person._uri, &filter);
                        bool emptyFilter = true;
 
-                       if (filterType & PersonProvider::FilterNumber) {
+                       if (filterType & FilterNumber) {
                                contacts_filter_add_bool(filter, _contacts_person.has_phonenumber, true);
                                emptyFilter = false;
                        }
 
-                       if (filterType & PersonProvider::FilterEmail) {
+                       if (filterType & FilterEmail) {
                                if (!emptyFilter) {
                                        contacts_filter_add_operator(filter, CONTACTS_FILTER_OPERATOR_AND);
                                }
@@ -78,7 +79,7 @@ namespace
                return filter;
        }
 
-       contacts_filter_h getProviderFilter(PersonProvider::Mode modeType, PersonProvider::FilterType filterType)
+       contacts_filter_h getProviderFilter(PersonProvider::Mode modeType, int filterType)
        {
                contacts_filter_h result = nullptr;
                contacts_filter_h modeTypeFilter = prepareModeTypeFilter(modeType);
@@ -97,7 +98,7 @@ namespace
                return result;
        }
 
-       contacts_list_h getPersonList(PersonProvider::Mode modeType, PersonProvider::FilterType filterType)
+       contacts_list_h getPersonList(PersonProvider::Mode modeType, int filterType)
        {
                contacts_query_h query = nullptr;
                contacts_query_create(_contacts_person._uri, &query);
@@ -121,7 +122,7 @@ namespace
                return list;
        }
 
-       contacts_record_h getPersonRecord(int contactId, PersonProvider::Mode modeType, PersonProvider::FilterType filterType)
+       contacts_record_h getPersonRecord(int contactId, PersonProvider::Mode modeType, int filterType)
        {
                contacts_query_h query = nullptr;
                contacts_query_create(_contacts_person._uri, &query);
@@ -151,7 +152,7 @@ namespace
        }
 }
 
-PersonProvider::PersonProvider(Mode modeType, FilterType filterType)
+PersonProvider::PersonProvider(Mode modeType, int filterType)
        : m_Mode(modeType), m_FilterType(filterType)
 {
        if (m_Mode == ModeMFC) {
index 3100eb6c232b5dd543873cacd50b0c5de853eff4..2ebea753fd07be583609bd88c4c0b0c63ae8acbe 100644 (file)
 using namespace Contacts::List;
 using namespace Contacts::List::Model;
 
-PersonItem::PersonItem(PersonPtr person, Mode mode)
-       : m_Person(std::move(person)), m_Mode(mode)
+PersonItem::PersonItem(PersonPtr person)
+       : m_Person(std::move(person)), m_SelectMode(SelectNone)
 { }
 
-void PersonItem::setMode(Mode mode)
+void PersonItem::setSelectMode(SelectMode selectMode)
 {
-       m_Mode = mode;
+       m_SelectMode = selectMode;
        elm_genlist_item_fields_update(getObjectItem(), PART_CHECK, ELM_GENLIST_ITEM_FIELD_CONTENT);
 }
 
@@ -61,7 +61,7 @@ Evas_Object *PersonItem::getContent(Evas_Object *parent, const char *part)
                                m_Person->getImagePath());
                thumbnail->setSizeHint(true);
                return thumbnail->getEvasObject();
-       } else if (m_Mode == ModePick && strcmp(part, PART_CHECK) == 0) {
+       } else if (m_SelectMode == SelectMulti && strcmp(part, PART_CHECK) == 0) {
                return GenlistCheckItem::getContent(parent, part);
        }