Implemented text markup for MultilineFieldItem in DetailsView. 60/90460/3
authorEugene Kurzberg <i.kurtsberg@samsung.com>
Tue, 4 Oct 2016 08:40:19 +0000 (11:40 +0300)
committerEugene Kurzberg <i.kurtsberg@samsung.com>
Tue, 4 Oct 2016 08:40:19 +0000 (11:40 +0300)
Refactored FieldItem and fixed several issues when used for Note field.

Change-Id: Ifae1419ce29d84de00728c77d7cc80f2fd059325
Signed-off-by: Eugene Kurzberg <i.kurtsberg@samsung.com>
lib-contacts/inc/Contacts/Details/FieldItem.h
lib-contacts/inc/Contacts/Details/MultilineFieldItem.h
lib-contacts/src/Contacts/Details/DetailsView.cpp
lib-contacts/src/Contacts/Details/FieldItem.cpp
lib-contacts/src/Contacts/Details/MultilineFieldItem.cpp

index 2d4c62c..f9c12e0 100644 (file)
@@ -67,6 +67,11 @@ namespace Contacts
                        virtual char *getText(Evas_Object *parent, const char *part) override;
 
                        /**
+                        * @see GenItem::onInserted()
+                        */
+                       virtual void onInserted() override;
+
+                       /**
                         * @see GenItem::onLongpressed()
                         */
                        virtual bool onLongpressed() override;
@@ -77,11 +82,15 @@ namespace Contacts
                        virtual void onFieldUpdated(Model::ContactField &field, contacts_changed_e change);
 
                private:
-                       void onMenuDismissed(Evas_Object *obj, void *eventInfo);
-                       void updateSelecting(bool isSelecting);
+                       Evas_Object *showCopyPopup(int x, int y);
+                       void setTextSelected(bool isSelected);
+
+                       static char *formatText(const char *text, bool isSelected);
+                       static char *formatDate(const tm &date);
+
                        Model::ContactObject &m_Object;
                        Model::ContactField &m_Field;
-                       bool m_IsSelecting;
+                       bool m_IsTextSelected;
                };
        }
 }
index a8e2e0d..257f544 100644 (file)
@@ -47,6 +47,9 @@ namespace Contacts
                         * @see FieldItem::onFieldUpdated()
                         */
                        virtual void onFieldUpdated(Model::ContactField &field, contacts_changed_e change) override;
+
+               private:
+                       static char *formatText(int textSize, const char *textColor, const char *text);
                };
        }
 }
index 4d58f7e..d5818b6 100644 (file)
@@ -181,8 +181,7 @@ FieldItem *DetailsView::createFieldItem(ContactObject &field)
        } else if (fieldId == FieldUrl) {
                item = new ActionFieldItem(field, Common::ActionUrl);
        } else if (fieldId == FieldNote) {
-               /* FIXME: Use MultilineFieldItem when style will be available */
-               item = new FieldItem(field);
+               item = new MultilineFieldItem(field);
        } else if (fieldId == FieldRingtone) {
                item = new RingtoneFieldItem(field);
        } else if (fieldId == FieldGroups) {
index 7f94dbb..76f2c8f 100644 (file)
 
 #include <app_i18n.h>
 
+#define DATE_BUFFER_SIZE 32
+#define SELECTED_TEXT_MARKUP "<backing=on><backing_color=#00ddff99>"
+
 using namespace Contacts;
 using namespace Contacts::Details;
 using namespace Contacts::Model;
 using namespace std::placeholders;
 
-#define DATE_BUFFER_SIZE 32
-#define TEXT_BUFFER_SIZE 128
-#define TAG_BACKING "<backing=on><backing_color=#00ddff99>"
+namespace
+{
+       const bool isFieldCopyable[] = {
+               /* [FieldFavorite]     = */ false,
+               /* [FieldDisplayName]  = */ false,
+               /* [FieldImage]        = */ false,
+               /* [FieldName]         = */ false,
+               /* [FieldPhoneticName] = */ false,
+               /* [FieldNickname]     = */ false,
+               /* [FieldCompany]      = */ false,
+               /* [FieldNumber]       = */ true,
+               /* [FieldEmail]        = */ true,
+               /* [FieldAddress]      = */ true,
+               /* [FieldUrl]          = */ true,
+               /* [FieldMessenger]    = */ true,
+               /* [FieldEvent]        = */ false,
+               /* [FieldNote]         = */ true,
+               /* [FieldRelationship] = */ false,
+               /* [FieldRingtone]     = */ false
+       };
+}
 
 FieldItem::FieldItem(ContactObject &object)
-       : m_Object(object), m_Field(*object.getField(0)), m_IsSelecting(false)
+       : m_Object(object), m_Field(*object.getField(0)), m_IsTextSelected(false)
 {
 }
 
@@ -62,21 +83,9 @@ char *FieldItem::getText(Evas_Object *parent, const char *part)
        if (strcmp(part, "elm.text") == 0) {
                switch (m_Field.getType()) {
                        case TypeText:
-                       {
-                               if (m_IsSelecting) {
-                                       char buffer[TEXT_BUFFER_SIZE];
-                                       snprintf(buffer, sizeof(buffer), TAG_BACKING "%s", m_Field.cast<ContactTextField>().getValue());
-                                       return strdup(buffer);
-                               }
-                               return Utils::safeDup(m_Field.cast<ContactTextField>().getValue());
-                       }
+                               return formatText(m_Field.cast<ContactTextField>().getValue(), m_IsTextSelected);
                        case TypeDate:
-                       {
-                               tm date = m_Field.cast<ContactDateField>().getValue();
-                               char buffer[DATE_BUFFER_SIZE];
-                               strftime(buffer, sizeof(buffer), "%x", &date);
-                               return strdup(buffer);
-                       }
+                               return formatDate(m_Field.cast<ContactDateField>().getValue());
                        default:
                                return nullptr;
                }
@@ -88,33 +97,42 @@ char *FieldItem::getText(Evas_Object *parent, const char *part)
        return nullptr;
 }
 
-bool FieldItem::onLongpressed()
+void FieldItem::onInserted()
 {
-       static bool isFieldCopyable[] = {
-               /* [FieldFavorite]     = */ false,
-               /* [FieldDisplayName]  = */ false,
-               /* [FieldImage]        = */ false,
-               /* [FieldName]         = */ false,
-               /* [FieldPhoneticName] = */ false,
-               /* [FieldNickname]     = */ false,
-               /* [FieldCompany]      = */ false,
-               /* [FieldNumber]       = */ true,
-               /* [FieldEmail]        = */ true,
-               /* [FieldAddress]      = */ true,
-               /* [FieldUrl]          = */ true,
-               /* [FieldMessenger]    = */ true,
-               /* [FieldEvent]        = */ false,
-               /* [FieldNote]         = */ true,
-               /* [FieldRelationship] = */ false,
-               /* [FieldRingtone]     = */ false
-       };
+       if (!isFieldCopyable[m_Object.getId()]) {
+               elm_genlist_item_select_mode_set(getObjectItem(), ELM_OBJECT_SELECT_MODE_NONE);
+       }
+}
 
+bool FieldItem::onLongpressed()
+{
        if (!isFieldCopyable[m_Object.getId()]) {
                return false;
        }
 
-       updateSelecting(true);
+       int x = 0, y = 0;
+       Evas_Object *rect = elm_object_item_track(getObjectItem());
+       evas_object_geometry_get(rect, &x, &y, nullptr, nullptr);
+       elm_object_item_untrack(getObjectItem());
+
+       Evas_Object *popup = showCopyPopup(x, y);
+       evas_object_smart_callback_add(popup, "dismissed", [](void *data, Evas_Object *, void *) {
+               ((FieldItem *) data)->setTextSelected(false);
+       }, this);
 
+       setTextSelected(true);
+       return true;
+}
+
+void FieldItem::onFieldUpdated(ContactField &field, contacts_changed_e change)
+{
+       if (&field == &m_Field) {
+               elm_genlist_item_fields_update(getObjectItem(), "elm.text", ELM_GENLIST_ITEM_FIELD_TEXT);
+       }
+}
+
+Evas_Object *FieldItem::showCopyPopup(int x, int y)
+{
        auto menu = new Ui::Menu();
        menu->create(getParent()->getEvasObject());
        menu->addItem("IDS_TPLATFORM_OPT_COPY", [this] {
@@ -125,39 +143,41 @@ bool FieldItem::onLongpressed()
                }
        });
 
-       static const int popupOffsetY = Ui::getScaledValue(74);
-       int x, y, w, h;
-       Evas_Object *rect = elm_object_item_track(getObjectItem());
-       evas_object_geometry_get(rect, &x, &y, &w, &h);
-       elm_object_item_untrack(getObjectItem());
-
        Evas_Object *obj = menu->getEvasObject();
-       evas_object_smart_callback_add(obj, "dismissed",
-                       makeCallback(&FieldItem::onMenuDismissed), this);
        elm_ctxpopup_horizontal_set(obj, EINA_TRUE);
        elm_object_style_set(obj, "default");
-       evas_object_move(obj, x, y + h / 2 - popupOffsetY);
+       evas_object_move(obj, x, y);
        evas_object_show(obj);
 
-       return true;
+       return obj;
 }
 
-void FieldItem::onFieldUpdated(ContactField &field, contacts_changed_e change)
+void FieldItem::setTextSelected(bool isSelecting)
 {
-       if (&field == &m_Field) {
-               elm_genlist_item_fields_update(getObjectItem(), "elm.text", ELM_GENLIST_ITEM_FIELD_TEXT);
+       if (m_IsTextSelected != isSelecting) {
+               m_IsTextSelected = isSelecting;
+               onFieldUpdated(m_Field, CONTACTS_CHANGE_UPDATED);
        }
 }
 
-void FieldItem::onMenuDismissed(Evas_Object *obj, void *eventInfo)
+char *FieldItem::formatText(const char *text, bool isSelected)
 {
-       updateSelecting(false);
+       if (!text) {
+               return nullptr;
+       }
+       if (!isSelected) {
+               return strdup(text);
+       }
+
+       size_t size = strlen(text) + sizeof(SELECTED_TEXT_MARKUP);
+       char *buffer = (char *) malloc(size);
+       snprintf(buffer, size, SELECTED_TEXT_MARKUP "%s", text);
+       return buffer;
 }
 
-void FieldItem::updateSelecting(bool isSelecting)
+char *FieldItem::formatDate(const tm &date)
 {
-       if (m_IsSelecting != isSelecting) {
-               m_IsSelecting = isSelecting;
-               elm_genlist_item_fields_update(getObjectItem(), "elm.text", ELM_GENLIST_ITEM_FIELD_TEXT);
-       }
+       char *buffer = (char *) malloc(DATE_BUFFER_SIZE);
+       strftime(buffer, DATE_BUFFER_SIZE, "%x", &date);
+       return buffer;
 }
index 64925ab..8507313 100644 (file)
 
 #include "Contacts/Details/MultilineFieldItem.h"
 
+#define TEXT_MARKUP "<font_size=%d><color=#%s>"
+#define TEXT_MARKUP_SIZE sizeof(TEXT_MARKUP)
+
+#define TEXT_SIZE 40
+#define TEXT_COLOR "000"
+
+#define SUBTEXT_SIZE 32
+#define SUBTEXT_COLOR "737373"
+
 using namespace Contacts::Details;
 using namespace Contacts::Model;
 
 Elm_Genlist_Item_Class *MultilineFieldItem::getItemClass() const
 {
-       static Elm_Genlist_Item_Class itc = createItemClass("multiline_main.sub");
+       static Elm_Genlist_Item_Class itc = createItemClass("multiline");
        return &itc;
 }
 
 char *MultilineFieldItem::getText(Evas_Object *parent, const char *part)
 {
+       int textSize = 0;
+       const char *textColor = nullptr;
+
        if (strcmp(part, "elm.text.multiline") == 0) {
-               return FieldItem::getText(parent, "elm.text");
+               part = "elm.text";
+               textSize = TEXT_SIZE;
+               textColor = TEXT_COLOR;
+       } else if (strcmp(part, "elm.text") == 0) {
+               part = "elm.text.sub";
+               textSize = SUBTEXT_SIZE;
+               textColor = SUBTEXT_COLOR;
        }
 
-       return FieldItem::getText(parent, part);
+       char *text = FieldItem::getText(parent, part);
+       if (text) {
+               char *formattedText = formatText(textSize, textColor, text);
+               free(text);
+               return formattedText;
+       }
+
+       return nullptr;
 }
 
 void MultilineFieldItem::onFieldUpdated(ContactField &field, contacts_changed_e change)
@@ -43,3 +68,11 @@ void MultilineFieldItem::onFieldUpdated(ContactField &field, contacts_changed_e
                FieldItem::onFieldUpdated(field, change);
        }
 }
+
+char *MultilineFieldItem::formatText(int textSize, const char *textColor, const char *text)
+{
+       size_t size = strlen(text) + strlen(textColor) + TEXT_MARKUP_SIZE;
+       char *buffer = (char *) malloc(size);
+       snprintf(buffer, size, TEXT_MARKUP "%s", textSize, textColor, text);
+       return buffer;
+}