summaryrefslogtreecommitdiff
path: root/lib/details
diff options
context:
space:
mode:
Diffstat (limited to 'lib/details')
-rwxr-xr-xlib/details/CMakeLists.txt24
-rw-r--r--lib/details/contacts-details-efl.xml29
-rwxr-xr-xlib/details/ct-detail-history.c665
-rwxr-xr-xlib/details/ct-detail-history.h32
-rwxr-xr-xlib/details/ct-detail-main.c420
-rwxr-xr-xlib/details/ct-detail-utils.c1261
-rwxr-xr-xlib/details/ct-detail-utils.h69
-rwxr-xr-xlib/details/ct-detail-view.c1833
-rwxr-xr-xlib/details/ct-detail-view.h32
-rwxr-xr-xlib/details/ct-input-change-name.c147
-rwxr-xr-xlib/details/ct-input-change-name.h24
-rwxr-xr-xlib/details/ct-input-num-email.c1125
-rwxr-xr-xlib/details/ct-input-num-email.h24
-rwxr-xr-xlib/details/ct-input-utils.c997
-rwxr-xr-xlib/details/ct-input-utils.h53
-rwxr-xr-xlib/details/ct-input-view.c2634
-rwxr-xr-xlib/details/ct-input-view.h24
17 files changed, 9393 insertions, 0 deletions
diff --git a/lib/details/CMakeLists.txt b/lib/details/CMakeLists.txt
new file mode 100755
index 0000000..26cc19f
--- /dev/null
+++ b/lib/details/CMakeLists.txt
@@ -0,0 +1,24 @@
+LINK_DIRECTORIES(${CMAKE_BINARY_DIR})
+
+SET(TARGET ${CT_DETAILS})
+
+FILE(GLOB SRCS *.c)
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(details_pkgs REQUIRED icu-i18n)
+
+FOREACH(flag ${details_pkgs_CFLAGS})
+ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+ADD_LIBRARY(${TARGET} SHARED ${SRCS})
+SET_TARGET_PROPERTIES(${TARGET} PROPERTIES SOVERSION ${VERSION_MAJOR})
+SET_TARGET_PROPERTIES(${TARGET} PROPERTIES VERSION ${VERSION})
+SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_FLAGS ${EXTRA_CFLAGS})
+TARGET_LINK_LIBRARIES(${TARGET} ${COMMON_LIB} ${ug_pkgs_LDFLAGS} ${details_pkgs_LDFLAGS})
+
+ADD_DEPENDENCIES(${TARGET} contacts_edj_build detail_theme_edj_build)
+
+INSTALL(TARGETS ${TARGET} DESTINATION ${UGLIBDIR})
+
+INSTALL(FILES ${CMAKE_BINARY_DIR}/lib/details/contacts-details-efl.xml DESTINATION "/usr/share/packages")
diff --git a/lib/details/contacts-details-efl.xml b/lib/details/contacts-details-efl.xml
new file mode 100644
index 0000000..eb768ce
--- /dev/null
+++ b/lib/details/contacts-details-efl.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns="http://tizen.org/ns/packages" package="contacts-details-efl" version="0.1.0-0" install-location="internal-only">
+ <label>contacts-details-efl</label>
+ <author email="ensung.park@samsung.com" href="www.samsung.com">ensung park</author>
+ <description>contacts-details-efl Application</description>
+ <ui-application appid="contacts-details-efl" exec="/opt/ug/bin/contacts-details-efl" nodisplay="true" multiple="true" type="capp" taskmanage="false">
+ <icon>org.tizen.contacts.png</icon>
+ <label>Contacts</label>
+ <label xml:lang="en-us">Contacts</label>
+ <label xml:lang="nl-nl">Contacten</label>
+ <label xml:lang="de-de">Kontakte</label>
+ <label xml:lang="en-gb">Contacts</label>
+ <label xml:lang="zh-hk">聯絡人</label>
+ <label xml:lang="zh-cn">联系人</label>
+ <label xml:lang="ru-ru">Контакты</label>
+ <label xml:lang="zh-tw">聯絡人</label>
+ <label xml:lang="ja-jp">電話帳</label>
+ <label xml:lang="es-es">Contacts</label>
+ <label xml:lang="el-gr">Επαφές</label>
+ <label xml:lang="it-it">Rubrica</label>
+ <label xml:lang="tr-tr">Rehber</label>
+ <label xml:lang="pt-pt">Contactos</label>
+ <label xml:lang="fr-fr">Contacts</label>
+ <label xml:lang="ko-kr">전화번호부</label>
+ <application-service>
+ <operation name="http://tizen.org/ns/packages"/>
+ </application-service>
+ </ui-application>
+</manifest>
diff --git a/lib/details/ct-detail-history.c b/lib/details/ct-detail-history.c
new file mode 100755
index 0000000..9bac296
--- /dev/null
+++ b/lib/details/ct-detail-history.c
@@ -0,0 +1,665 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include "phone.h"
+#include "ct-detail-history.h"
+#include "ct-detail-utils.h"
+#include "ct-detail-view.h"
+
+typedef struct
+{
+ int plog_id;
+ int plog_type;
+ int plog_time;
+ int plog_duration;
+ int plog_msgid;
+ int group_index;
+ char *plog_number;
+ char *plog_shortmsg;
+ Eina_Bool checked;
+}ct_detail_history_info;
+
+enum HISTORY_ITC_TYPE {
+ HISTORY_ITC_NUM_UTIL_BTN = 0,
+ HISTORY_ITC_RCS_NUM_UTIL_BTN = 1,
+ HISTORY_ITC_HISTORY = 2,
+ HISTORY_ITC_DATE = 3,
+ HISTORY_ITC_SELECT_ALL = 4,
+ HISTORY_ITC_MAX,
+};
+
+static Elm_Genlist_Item_Class history_itcs[] = {
+ {.item_style="detail.3icon"},
+ {.item_style="detail.5icon"},
+ {.item_style="history_list"},
+ {.item_style="grouptitle"},
+ {.item_style="dialogue/bg/1icon"},
+};
+
+static PTHREAD_FN detail_history_check_del(void *data)
+{
+ ct_detail_data *cdetail_d = data;
+ ph_progress_info *p_info = cdetail_d->p_info;
+ Eina_List *l;
+ ct_detail_history_info *l_info;
+
+ EINA_LIST_FOREACH(cdetail_d->list, l, l_info) {
+ if (!p_info->alive) {
+ p_info->completed = true;
+ break;
+ }
+ if (!l_info) continue;
+
+ if (TRUE == l_info->checked) {
+ if (CTS_SUCCESS != contacts_svc_delete_phonelog(CTS_PLOG_DEL_BY_ID, l_info->plog_id)) {
+ p_info->completed = true;
+ break;
+ }
+ p_info->cnt++;
+ }
+ if (p_info->cnt == p_info->cnt_checked_total)
+ break;
+ }
+
+ pthread_exit(NULL);
+}
+
+static Eina_Bool detail_history_check_del_timer(void *data)
+{
+ ct_detail_data *cdetail_d = data;
+ ph_progress_info *p_info = cdetail_d->p_info;
+
+ p_retvm_if(NULL == p_info, ECORE_CALLBACK_CANCEL, "parameter(ph_progress_info) is NULL");
+
+ if (!p_info->completed) {
+ char count[PH_TEXT_SHORT_LEN];
+ char percent[5];
+ double value = (double)p_info->cnt / (double)p_info->cnt_checked_total;
+
+ elm_progressbar_value_set(p_info->progressbar, value);
+ snprintf(percent, sizeof(percent), "%d%%", (int)(100.0 * (double)p_info->cnt/(double)p_info->cnt_checked_total));
+ snprintf(count, sizeof(count), "%d/%d", p_info->cnt, p_info->cnt_checked_total);
+ edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext1", percent);
+ edje_object_part_text_set(elm_layout_edje_get(p_info->layout), "elm.text.subtext2", count);
+
+ if (p_info->cnt == p_info->cnt_checked_total)
+ p_info->completed = true;
+
+ return ECORE_CALLBACK_RENEW;
+ }
+ else {
+ int ret;
+ const char *message;
+
+ pthread_join(p_info->thread, NULL);
+
+ if (p_info->cnt == p_info->cnt_checked_total) {
+ message = S_(PH_SYS_POP_DELETED);
+ ret = contacts_svc_end_trans(true);
+ }
+ else {
+ message = S_(PH_SYS_POP_FAILED);
+ ret = contacts_svc_end_trans(false);
+ }
+
+ if (ret < CTS_SUCCESS) {
+ ERR("contacts_svc_end_trans() Failed(%d)", ret);
+ message = S_(PH_SYS_POP_FAILED);
+ }
+
+ evas_object_del(cdetail_d->popup);
+ cdetail_d->popup = NULL;
+
+ if (NULL != p_info) {
+ free(p_info);
+ cdetail_d->p_info = NULL;
+ }
+
+ elm_genlist_decorate_mode_set(cdetail_d->history_genlist, EINA_FALSE);
+ cdetail_d->view_mode = DETAIL_VIEW_MODE_HISTORY;
+ phone_show_tickernoti(message);
+
+ return ECORE_CALLBACK_CANCEL;
+ }
+}
+
+void ct_detail_history_del_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ ct_detail_data *cdetail_d = data;
+ ph_progress_info *p_info;
+
+ p_info = calloc(1, sizeof(ph_progress_info));
+ p_retm_if(NULL == p_info, "calloc return NULL");
+
+ cdetail_d->p_info = p_info;
+ p_info->cnt_checked_total = cdetail_d->cnt_checked;
+ p_info->alive = true;
+
+ ret = contacts_svc_begin_trans();
+ if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_begin_trans() Failed(%d)", ret);
+ free(p_info);
+ cdetail_d->p_info = NULL;
+ return;
+ }
+
+ ret = pthread_create(&p_info->thread, NULL, detail_history_check_del, cdetail_d);
+ if (0 != ret) {
+ ERR("Thread creation failed(%d)", ret);
+ free(p_info);
+ cdetail_d->p_info = NULL;
+
+ ret = contacts_svc_end_trans(false);
+ p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans(%d) Failed", ret);
+ return;
+ }
+
+ p_info->timer = ecore_timer_add(0.2, detail_history_check_del_timer, cdetail_d);
+ if (NULL == p_info->timer) {
+ ERR("ecore_timer_add() return NULL");
+
+ p_info->alive = false;
+ pthread_join(p_info->thread, NULL);
+ free(p_info);
+ cdetail_d->p_info = NULL;
+
+ ret = contacts_svc_end_trans(false);
+ p_warn_if(ret < CTS_SUCCESS, "contacts_svc_end_trans(%d) Failed", ret);
+ return;
+ }
+
+ cdetail_d->popup = phone_progressbar_popup(cdetail_d->win, p_info, T_(PH_GET_TEXT_BASIC, PHTEXT_DELETING_LOGS));
+}
+
+static void detail_history_all_items_checked_set(Eina_List *list,
+ Eina_Bool checked)
+{
+ Eina_List *l;
+ ct_detail_history_info *info;
+
+ EINA_LIST_FOREACH(list, l, info) {
+ if (NULL == info) {
+ ERR("elm_object_item_data_get() return NULL");
+ continue;
+ }
+ info->checked = checked;
+ }
+}
+
+static void detail_history_check_update_selection_info(ct_detail_data *cdetail_d)
+{
+ if (cdetail_d->cnt_checked == 0)
+ phone_hide_notify(cdetail_d->navi);
+ else {
+ char info_text[PH_TEXT_SHORT_LEN]={0};
+ snprintf(info_text, sizeof(info_text), "%s (%d)", S_(PH_SYS_POP_SELECTED),
+ cdetail_d->cnt_checked);
+ phone_show_notify(cdetail_d->navi, info_text);
+ }
+}
+
+static void detail_history_check_update_button_status(ct_detail_data *cdetail_d)
+{
+ Eina_Bool disabled;
+ p_retm_if(NULL == cdetail_d, "parameter is NULL");
+ p_retm_if(NULL == cdetail_d->ctrl_item, "ctrl_item is NULL");
+
+ if (0 == cdetail_d->list_count)
+ disabled = EINA_TRUE;
+ else if (cdetail_d->history_genlist && elm_genlist_decorate_mode_get(cdetail_d->history_genlist)) {
+ if (0 < cdetail_d->cnt_checked)
+ disabled = EINA_FALSE;
+ else
+ disabled = EINA_TRUE;
+ }
+ else
+ disabled = EINA_FALSE;
+
+ elm_object_item_disabled_set(cdetail_d->ctrl_item, disabled);
+}
+
+static void detail_history_check_select_all(void *data, Eina_Bool checked)
+{
+ Eina_List *l;
+ Elm_Object_Item *item;
+ ct_detail_history_info *l_info;
+ ct_detail_data *cdetail_d = data;
+
+ if (checked)
+ cdetail_d->cnt_checked = cdetail_d->list_count;
+ else
+ cdetail_d->cnt_checked = 0;
+
+ EINA_LIST_FOREACH(cdetail_d->list, l, l_info) {
+ if (!l_info) continue;
+ l_info->checked = checked;
+ }
+
+ item = elm_genlist_item_next_get(cdetail_d->select_all_item);
+ while (item) {
+ elm_genlist_item_update(item);
+ item = elm_genlist_item_next_get(item);
+ }
+
+ detail_history_check_update_selection_info(cdetail_d);
+ detail_history_check_update_button_status(cdetail_d);
+}
+
+void ct_detail_history_edit_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_detail_data *cdetail_d = data;
+ elm_genlist_decorate_mode_set(cdetail_d->history_genlist, EINA_TRUE);
+ if (cdetail_d->util_item) {
+ elm_object_item_del(cdetail_d->util_item);
+ cdetail_d->util_item = NULL;
+ }
+
+ cdetail_d->select_all_item = elm_genlist_item_insert_after(cdetail_d->history_genlist, &history_itcs[HISTORY_ITC_SELECT_ALL],
+ cdetail_d, NULL, cdetail_d->base_item, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_CHECK);
+}
+
+static void detail_history_insert_util_btn(Evas_Object *genlist, ct_detail_data *cdetail_d)
+{
+ CTSvalue *value;
+ GSList *list;
+ CTSstruct *contact = cdetail_d->contact;
+ list = NULL;
+
+ contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list);
+
+ value = ct_detail_get_default_number(list);
+ if (value) {
+ cdetail_d->util_item = elm_genlist_item_insert_after(genlist, &history_itcs[HISTORY_ITC_NUM_UTIL_BTN], value,
+ NULL, cdetail_d->base_item, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+#ifdef _CT_RCS
+ cdetail_d->util_item = elm_genlist_item_insert_after(genlist, &history_itcs[HISTORY_ITC_RCS_NUM_UTIL_BTN], value,
+ NULL, cdetail_d->base_item, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+#endif
+ }
+}
+
+void ct_detail_history_cancel_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_detail_data *cdetail_d = data;
+ phone_hide_notify(cdetail_d->navi);
+ if (!cdetail_d->util_item)
+ detail_history_insert_util_btn(cdetail_d->history_genlist, cdetail_d);
+ if (cdetail_d->select_all_item) {
+ elm_object_item_del(cdetail_d->select_all_item);
+ cdetail_d->select_all_item = NULL;
+ }
+ detail_history_all_items_checked_set(cdetail_d->list, EINA_FALSE);
+ elm_genlist_decorate_mode_set(cdetail_d->history_genlist, EINA_FALSE);
+ ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_HISTORY);
+}
+
+static void detail_history_append_separate_date_index(ct_detail_data *cdetail_d, void *data, int index)
+{
+ ct_detail_history_info *l_info = data;
+ int type = phone_detail_log_get_date_type(l_info->plog_time, l_info->plog_duration);
+
+ if (0 == index || cdetail_d->pre_date_type != type) {
+ cdetail_d->pre_date_type = type;
+ l_info->group_index = type;
+ elm_genlist_item_append(cdetail_d->history_genlist, &history_itcs[HISTORY_ITC_DATE], data, NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL);
+ }
+}
+
+static void detail_history_gl_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ Elm_Object_Item *item = event_info;
+ ct_detail_history_info *l_info = data;
+ ct_detail_data *cdetail_d = evas_object_data_get(obj, "cdetail_d");
+
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+
+ if (elm_genlist_decorate_mode_get(cdetail_d->history_genlist)) {
+ l_info->checked = !l_info->checked;
+ if (l_info->checked)
+ cdetail_d->cnt_checked++;
+ else
+ cdetail_d->cnt_checked--;
+
+ elm_genlist_item_fields_update(event_info, "elm.edit.icon.1", ELM_GENLIST_ITEM_FIELD_CONTENT);
+
+ if (cdetail_d->select_all_layout) {
+ Evas_Object *check;
+ check = elm_object_part_content_get(cdetail_d->select_all_layout, "elm.icon");
+ if (cdetail_d->cnt_checked == cdetail_d->list_count)
+ elm_check_state_set(check, EINA_TRUE);
+ else
+ elm_check_state_set(check, EINA_FALSE);
+ }
+ detail_history_check_update_selection_info(cdetail_d);
+ detail_history_check_update_button_status(cdetail_d);
+ }
+}
+
+static void detail_history_fill_genlist(ct_detail_data *cdetail_d)
+{
+ Evas_Object *genlist;
+ Eina_List *l;
+ int count;
+ ct_detail_history_info *l_info;
+
+ if (NULL == cdetail_d->history_genlist) {
+ genlist = elm_genlist_add(cdetail_d->layout);
+ elm_object_style_set(genlist, "dialogue");
+ elm_object_theme_set(genlist, cdetail_d->th);
+ cdetail_d->history_genlist = genlist;
+ evas_object_data_set(genlist, "cdetail_d", cdetail_d);
+ }
+ else {
+ genlist = cdetail_d->history_genlist;
+ elm_genlist_clear(genlist);
+ }
+
+ cdetail_d->base_item = elm_genlist_item_append(genlist, ct_detail_get_baseinfo_item_class(cdetail_d->contact), cdetail_d, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ detail_history_insert_util_btn(genlist, cdetail_d);
+ count = 0;
+ EINA_LIST_FOREACH(cdetail_d->list, l, l_info) {
+ detail_history_append_separate_date_index(cdetail_d, l_info, count);
+ elm_genlist_item_append(genlist, &history_itcs[HISTORY_ITC_HISTORY], l_info, NULL,
+ ELM_GENLIST_ITEM_NONE, detail_history_gl_sel, l_info);
+ count++;
+ }
+}
+
+static void detail_history_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_detail_data *cdetail_d = data;
+
+ if (elm_check_state_get(obj))
+ cdetail_d->cnt_checked++;
+ else
+ cdetail_d->cnt_checked--;
+
+ if (cdetail_d->select_all_layout) {
+ Evas_Object *check;
+ check = elm_object_part_content_get(cdetail_d->select_all_layout, "elm.icon");
+ if (cdetail_d->cnt_checked == cdetail_d->list_count)
+ elm_check_state_set(check, EINA_TRUE);
+ else
+ elm_check_state_set(check, EINA_FALSE);
+ }
+ detail_history_check_update_selection_info(cdetail_d);
+ detail_history_check_update_button_status(cdetail_d);
+}
+
+static char* detail_history_gl_sep_date_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ ct_detail_history_info * history_info = data;
+ const char *when;
+ int index = history_info->group_index;
+
+ if (0 == strcmp(part, "elm.text")) {
+ char *date_temp;
+ ct_detail_data *cdetail_d;
+
+ if (0 == index)
+ when = S_(PH_SYS_BODY_TODAY);
+ else if (1 == index)
+ when = S_(PH_SYS_BODY_YESTERDAY);
+ else
+ when = S_(PH_SYS_BODY_PREVIOUS);
+
+ cdetail_d = evas_object_data_get(obj, "cdetail_d");
+ date_temp = phone_detail_log_get_date(cdetail_d->hformatter, history_info->plog_time);
+ if (date_temp) {
+ char buf[PATH_MAX]={0};
+ snprintf(buf, sizeof(buf), " %s (%s)", when, date_temp);
+ free(date_temp);
+ return strdup(buf);
+ }
+ else
+ return strdup(when);
+ }
+ else
+ return NULL;
+}
+
+static Evas_Object *detail_history_gl_select_all_icon_get(void *data, Evas_Object *obj,
+ const char *part)
+{
+ Evas_Object *check;
+ ct_detail_data *cdetail_d = data;
+
+ p_retvm_if(NULL == cdetail_d, NULL, "evas_object_data_get() return NULL");
+ if (0 == strcmp(part, "elm.icon")) {
+ cdetail_d->select_all_layout = phone_create_select_all(cdetail_d->history_genlist, S_(PH_SYS_BODY_SELECT_ALL), detail_history_check_select_all, cdetail_d);
+ check = elm_object_part_content_get(cdetail_d->select_all_layout, "elm.icon");
+ if (cdetail_d->cnt_checked == cdetail_d->list_count)
+ elm_check_state_set(check, EINA_TRUE);
+ return cdetail_d->select_all_layout;
+ }
+ return NULL;
+}
+
+static void detail_history_gl_select_all_del(void *data, Evas_Object *obj)
+{
+ ct_detail_data *cdetail_d = data;
+ cdetail_d->select_all_layout = NULL;
+}
+
+
+static Evas_Object *detail_history_gl_icon_get(void *data, Evas_Object *obj, const char *part)
+{
+ ct_detail_history_info * l_detail_info = data;
+ char buf[PATH_MAX]={0};
+ Evas_Object *ic;
+
+ if (0 == strcmp(part, "elm.icon.2")) {
+ char *made_data = phone_detail_log_get_icon_type(l_detail_info->plog_type);
+ snprintf(buf, sizeof(buf), "%s", made_data);
+ free(made_data);
+ }
+ else if (0 == strcmp(part, "elm.icon.1")) {
+ char *made_data = phone_detail_log_get_icon_path_with_action(l_detail_info->plog_type);
+ snprintf(buf, sizeof(buf), "%s", made_data);
+ free(made_data);
+ }
+ else if (0 == strcmp(part, "elm.edit.icon.1")) {
+ ct_detail_data *cdetail_d = evas_object_data_get(obj, "cdetail_d");
+ Evas_Object *check;
+ check = elm_check_add(obj);
+ p_retvm_if(NULL == check, NULL, "elm_check_add() return NULL");
+ elm_check_state_pointer_set(check, &l_detail_info->checked);
+ evas_object_propagate_events_set(check, EINA_FALSE);
+ evas_object_smart_callback_add(check, "changed", detail_history_check_changed_cb, cdetail_d);
+ return check;
+ }
+ else
+ return NULL;
+ ic = elm_icon_add(obj);
+ p_retvm_if(NULL == ic, NULL, "elm_icon_add() return NULL");
+ elm_icon_file_set(ic, buf, NULL);
+ evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ return ic;
+}
+
+static char* detail_history_gl_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ ct_detail_history_info * history_info = data;
+ ct_detail_data *cdetail_d;
+ char *time;
+ char *duration;
+ char buf[PATH_MAX] = {0};
+ cdetail_d = evas_object_data_get(obj, "cdetail_d");
+
+ if (0 == strcmp(part, "elm.text.1")) {
+ return strdup(history_info->plog_number);
+ }
+ else if (0 == strcmp(part, "elm.text.2")) {
+ if (TRUE == phone_detail_log_is_call_ing_type(history_info->plog_type)) {
+ duration = phone_detail_log_get_duration_from_number(history_info->plog_duration);
+ snprintf(buf, sizeof(buf), "%s", duration);
+ free(duration);
+ return strdup(buf);
+ }
+ else if (TRUE == phone_detail_log_is_sms_type(history_info->plog_type)
+ || TRUE == phone_detail_log_is_mms_type(history_info->plog_type)) {
+ if (history_info->plog_shortmsg && *history_info->plog_shortmsg) {
+ snprintf(buf, sizeof(buf), "%s", history_info->plog_shortmsg);
+ return strdup(buf);
+ }
+ }
+ else if (TRUE == phone_detail_log_is_email_type(history_info->plog_type)) {
+ if (history_info->plog_shortmsg && *history_info->plog_shortmsg) {
+ snprintf(buf, sizeof(buf), "%s", history_info->plog_shortmsg);
+ return strdup(buf);
+ }
+ }
+ }
+ else if (0 == strcmp(part, "elm.text.3")) {
+ time = phone_detail_log_get_time(cdetail_d->hformatter, history_info->plog_time);
+ snprintf(buf, sizeof(buf), "%s", time);
+ free(time);
+ return strdup(buf);
+ }
+ return NULL;
+}
+
+void ct_detail_history_create_itcs()
+{
+ history_itcs[HISTORY_ITC_SELECT_ALL].func.content_get = detail_history_gl_select_all_icon_get;
+ history_itcs[HISTORY_ITC_SELECT_ALL].func.del = detail_history_gl_select_all_del;
+ history_itcs[HISTORY_ITC_SELECT_ALL].decorate_all_item_style = NULL;
+
+ history_itcs[HISTORY_ITC_NUM_UTIL_BTN].func.content_get = ct_detail_gl_number_util_icon_get;
+
+ history_itcs[HISTORY_ITC_RCS_NUM_UTIL_BTN].func.content_get = ct_detail_gl_number_util_icon_get;
+
+ history_itcs[HISTORY_ITC_DATE].func.text_get = detail_history_gl_sep_date_label_get;
+
+ history_itcs[HISTORY_ITC_HISTORY].func.text_get = detail_history_gl_label_get;
+ history_itcs[HISTORY_ITC_HISTORY].func.content_get = detail_history_gl_icon_get;
+ history_itcs[HISTORY_ITC_HISTORY].decorate_all_item_style = "edit_default";
+}
+
+void ct_detail_history_load_data(ct_detail_data *cdetail_d)
+{
+ int ret;
+ CTSiter *iter;
+ int count = 0;
+ Eina_List *list = NULL;
+
+ ret = contacts_svc_get_list_with_int(CTS_LIST_PLOG_OF_PERSON_ID, cdetail_d->person_id, &iter);
+ p_retm_if(CTS_SUCCESS != ret, "contacts_svc_get_list_with_int() Failed(%d)", ret);
+
+ while (CTS_SUCCESS == contacts_svc_iter_next(iter)) {
+ CTSvalue *plog = NULL;
+ char *msg = NULL;
+ char *number;
+ ct_detail_history_info *history_info = calloc(1, sizeof(ct_detail_history_info));
+ plog = contacts_svc_iter_get_info(iter);
+ number = (char*)contacts_svc_value_get_str(plog, CTS_LIST_PLOG_NUMBER_STR);
+ history_info->plog_id = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_ID_INT);
+ history_info->plog_type = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_LOG_TYPE_INT);
+ history_info->plog_time = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_LOG_TIME_INT);
+ history_info->plog_duration = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_DURATION_INT);
+ history_info->plog_msgid = contacts_svc_value_get_int(plog, CTS_LIST_PLOG_MSGID_INT);
+ history_info->plog_number = SAFE_STRDUP(number);
+ msg = (char *)contacts_svc_value_get_str(plog, CTS_LIST_PLOG_SHORTMSG_STR);
+ if (msg) {
+ int i;
+ char temp[PH_TEXT_MAX_LEN];
+ for (i=0;i<strlen(msg);i++) {
+ if (msg[i] =='\n')
+ temp[i] = ' ';
+ else
+ temp[i] = msg[i];
+ }
+ temp[i] = '\0';
+ history_info->plog_shortmsg = strdup(temp);
+ }
+ list = eina_list_append(list, (void*)history_info);
+ count++;
+ contacts_svc_value_free(plog);
+ }
+ contacts_svc_iter_remove(iter);
+ cdetail_d->list = list;
+ cdetail_d->list_count = count;
+
+ detail_history_fill_genlist(cdetail_d);
+}
+
+static Eina_Bool detail_history_refresh_view(void *data)
+{
+ ct_detail_data *cdetail_d = data;
+ phone_hide_notify(cdetail_d->navi);
+ if (cdetail_d->select_all_item && DETAIL_VIEW_MODE_CHECK != cdetail_d->view_mode) {
+ elm_object_item_del(cdetail_d->select_all_item);
+ cdetail_d->select_all_item = NULL;
+ }
+ elm_genlist_clear(cdetail_d->history_genlist);
+ ct_detail_history_load_data(cdetail_d);
+ if (DETAIL_VIEW_MODE_HISTORY == cdetail_d->view_mode || DETAIL_VIEW_MODE_CHECK == cdetail_d->view_mode)
+ ct_detail_history_fill_layout(cdetail_d);
+ cdetail_d->idler = NULL;
+ return ECORE_CALLBACK_CANCEL;
+}
+
+void ct_detail_history_changed_cb(void *data)
+{
+ ct_detail_data *cdetail_d = data;
+ if (cdetail_d->idler) {
+ ecore_idler_del(cdetail_d->idler);
+ cdetail_d->idler = NULL;
+ }
+ cdetail_d->idler = ecore_idler_add(detail_history_refresh_view, cdetail_d);
+}
+
+void ct_detail_history_free_list(ct_detail_data *cdetail_d)
+{
+ ct_detail_history_info *l_info;
+
+ EINA_LIST_FREE(cdetail_d->list, l_info) {
+ if (NULL == l_info) continue;
+ free(l_info->plog_number);
+ free(l_info->plog_shortmsg);
+ free(l_info);
+ }
+ cdetail_d->list = NULL;
+}
+
+void ct_detail_history_fill_layout(ct_detail_data *cdetail_d)
+{
+ Evas_Object *content;
+ content = elm_object_part_content_unset(cdetail_d->layout, "elm.swallow.content");
+ evas_object_hide(content);
+ if (0 < cdetail_d->list_count)
+ elm_object_part_content_set(cdetail_d->layout, "elm.swallow.content", cdetail_d->history_genlist);
+ else {
+ if (!cdetail_d->noc) {
+ Evas_Object *noc;
+ noc = phone_create_nocontents(cdetail_d->layout, T_(CT_GET_TEXT_BASIC, CTTEXT_NO_HISTORIES));
+ p_retm_if(NULL == noc, "phone_create_nocontents() return NULL");
+ cdetail_d->noc = noc;
+ evas_object_size_hint_weight_set(cdetail_d->noc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(cdetail_d->noc, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ }
+ else
+ elm_object_part_text_set(cdetail_d->noc, "elm.text", T_(CT_GET_TEXT_BASIC, CTTEXT_NO_HISTORIES));
+ evas_object_show(cdetail_d->noc);
+ elm_object_part_content_set(cdetail_d->layout, "elm.swallow.content", cdetail_d->noc);
+ }
+ ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_HISTORY);
+}
+
diff --git a/lib/details/ct-detail-history.h b/lib/details/ct-detail-history.h
new file mode 100755
index 0000000..7836b4b
--- /dev/null
+++ b/lib/details/ct-detail-history.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CONTACTS_DETAIL_HISTORY_H__
+#define __CONTACTS_DETAIL_HISTORY_H__
+
+#include "phone-common.h"
+
+void ct_detail_history_create_itcs();
+void ct_detail_history_load_data(ct_detail_data *cdetail_d);
+void ct_detail_history_del_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info);
+void ct_detail_history_edit_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info);
+void ct_detail_history_cancel_btn_cb(void *data, Evas_Object *obj, void *event_info);
+void ct_detail_history_changed_cb(void *data);
+void ct_detail_history_free_list(ct_detail_data *cdetail_d);
+void ct_detail_history_fill_layout(ct_detail_data *cdetail_d);
+
+#endif //__CONTACTS_DETAIL_HISTORY_H__
+
diff --git a/lib/details/ct-detail-main.c b/lib/details/ct-detail-main.c
new file mode 100755
index 0000000..1df1621
--- /dev/null
+++ b/lib/details/ct-detail-main.c
@@ -0,0 +1,420 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ui-gadget-module.h>
+
+#include "phone.h"
+#include "ct-detail.h"
+#include "ct-detail-utils.h"
+#include "ct-detail-view.h"
+#include "ct-input-view.h"
+#include "ct-input-utils.h"
+
+static int create_ug_detail_view(Evas_Object *base, int request, ct_detail_data *cdetail_d)
+{
+ p_retvm_if(NULL == base, FALSE, "base is NULL");
+
+ cdetail_d->navi = elm_naviframe_add(base);
+ p_retvm_if (NULL == cdetail_d->navi, FALSE, "elm_naviframe_add() return NULL");
+ elm_naviframe_prev_btn_auto_pushed_set(cdetail_d->navi, EINA_FALSE);
+ evas_object_show(cdetail_d->navi);
+ elm_object_part_content_set(base, "elm.swallow.content", cdetail_d->navi);
+
+ cdetail_d->ug_detail = true;
+ if (CT_UG_REQUEST_DETAIL == request) {
+ Evas_Object *content;
+
+ content = ct_detail_create_content(cdetail_d);
+ if (NULL == content)
+ return FALSE;
+
+ cdetail_d->navi_item = elm_naviframe_item_push(cdetail_d->navi,
+ T_(CT_GET_TEXT_BASIC, CTTEXT_DETAILS), NULL, NULL, content, NULL);
+ ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_INFO);
+ }
+ else {
+ CTSstruct *contact_dup = NULL;
+ if (cdetail_d->contact)
+ contact_dup = contacts_svc_struct_duplicate(cdetail_d->contact);
+ ct_input_push_navi_content(cdetail_d, contact_dup, cdetail_d->contact_id);
+ }
+
+ return TRUE;
+}
+
+static void *detail_on_create(ui_gadget_h ug, enum ug_mode mode,
+ service_h service, void *priv)
+{
+ int ret, request;
+ Evas_Object *bg;
+ Evas_Object *base;
+ Evas_Object *parent;
+ ct_detail_data *cdetail_d = priv;
+
+ p_retvm_if(NULL == ug || NULL == priv, NULL,
+ "The parameter is invalid(ug=%p, priv=%p)", ug, priv);
+
+ cdetail_d->win = ug_get_window();
+ parent = ug_get_parent_layout(ug);
+ p_retvm_if(NULL == parent, NULL, "ug_get_parent_layout() return NULL");
+ cdetail_d->ug = ug;
+
+ bindtextdomain(PACKAGE, LOCALEDIR);
+
+ ret = contacts_svc_connect();
+ p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_connect() Failed(%d)", ret);
+
+ if (UG_MODE_FULLVIEW == mode)
+ base = phone_create_base_layout(parent, true);
+ else
+ base = phone_create_base_layout(parent, false);
+
+ request = ct_detail_parse_bundle(service, cdetail_d);
+ if (-2 == request) {
+ Evas_Object *popup;
+ popup = elm_popup_add(base);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_text_set(popup, S_(PH_SYS_BODY_SELECTED_DATA_NOT_FOUND));
+ elm_popup_timeout_set(popup, 1.5);
+ evas_object_show(popup);
+ evas_object_smart_callback_add(popup, "timeout", ctui_list_ug_hide_cb, cdetail_d->ug);
+ return base;
+ }
+ p_retvm_if(request < 0, NULL, "ct_detail_parse_bundle() Failed(%d)", request);
+
+ bg = phone_create_bg(base);
+ if (NULL == bg) {
+ ERR("phone_create_bg() return NULL");
+ evas_object_del(base);
+ ret = contacts_svc_disconnect();
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret);
+ return NULL;
+ }
+
+ if (!create_ug_detail_view(base, request, cdetail_d)) {
+ evas_object_del(base);
+ ret = contacts_svc_disconnect();
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret);
+ }
+ return base;
+}
+
+static void detail_on_destroy(ui_gadget_h ug, service_h service, void *priv)
+{
+ int ret;
+ ct_detail_data *cdetail_d = priv;
+ p_retm_if(NULL == ug, "The parameter is invalid(ug=%p)", ug);
+
+ if (cdetail_d && !cdetail_d->navi)
+ free(cdetail_d);
+
+ evas_object_del(ug_get_layout(ug));
+ ret = contacts_svc_disconnect();
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_disconnect() Failed(%d)", ret);
+}
+
+static void detail_on_key_event(ui_gadget_h ug, enum ug_key_event event, service_h service, void *priv)
+{
+ PH_FN_CALL;
+ ct_detail_data *cdetail_d = priv;
+
+ if (!ug)
+ return;
+
+ switch (event) {
+ case UG_KEY_EVENT_END:
+ if (cdetail_d->popup) {
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+ }
+ else {
+ if (elm_naviframe_top_item_get(cdetail_d->navi)
+ == cdetail_d->navi_item) {
+ ug_destroy_me(ug);
+ }
+ else
+ elm_naviframe_item_pop(cdetail_d->navi);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void detail_on_message(ui_gadget_h ug, service_h msg, service_h service, void *priv)
+{
+ char* val = NULL;
+ ct_detail_data *cdetail_d = priv;
+
+ if (UG_MODE_FRAMEVIEW == ug_get_mode(ug)) {
+ if (msg) {
+ service_get_extra_data(service, "key_event", &val);
+ if (val && CTUG_MSG_KEY_END == atoi(val)) {
+ if (cdetail_d->popup) {
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+ }
+ else {
+ if (elm_naviframe_top_item_get(cdetail_d->navi)
+ == cdetail_d->navi_item) {
+ ug_destroy_me(ug);
+ }
+ else
+ elm_naviframe_item_pop(cdetail_d->navi);
+ }
+ }
+ free(val);
+ }
+ }
+}
+
+static void detail_on_pause(ui_gadget_h ug, service_h service, void *priv)
+{
+ ct_detail_data *cdetail_d = priv;
+ cdetail_d->order_display = contacts_svc_get_order(CTS_ORDER_OF_DISPLAY);
+}
+
+static void detail_on_resume(ui_gadget_h ug, service_h service, void *priv)
+{
+ ct_detail_data *cdetail_d = priv;
+ if (cdetail_d->order_display != contacts_svc_get_order(CTS_ORDER_OF_DISPLAY))
+ ctui_detail_genlist_update(cdetail_d);
+}
+
+static void detail_on_event(ui_gadget_h ug, enum ug_event event, service_h service, void *priv)
+{
+ Evas_Object *notify;
+ ct_detail_data *cdetail_d = priv;
+
+ switch (event) {
+ case UG_EVENT_ROTATE_PORTRAIT:
+ case UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN:
+ phone_resize_notify(cdetail_d->navi, 0);
+ evas_object_data_set(cdetail_d->navi, "phone_rotate", (void *)0);
+ notify = phone_get_notify(cdetail_d->navi);
+ elm_layout_theme_set(elm_object_content_get(notify), "standard", "selectioninfo", "vertical/bottom_64");
+ break;
+ case UG_EVENT_ROTATE_LANDSCAPE:
+ case UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN:
+ phone_resize_notify(cdetail_d->navi, 90);
+ evas_object_data_set(cdetail_d->navi, "phone_rotate", (void *)90);
+ notify = phone_get_notify(cdetail_d->navi);
+ elm_layout_theme_set(elm_object_content_get(notify), "standard", "selectioninfo", "horizontal/bottom_64");
+ break;
+ default:
+ break;
+ }
+}
+
+
+API int UG_MODULE_INIT(struct ug_module_ops *ops)
+{
+ ct_detail_data *cdetail_d;
+
+ p_retvm_if(!ops, -1, "ops is NULL");
+
+ cdetail_d = calloc(1, sizeof(ct_detail_data));
+ p_retvm_if(!cdetail_d, -1, "UG data is NULL, Not enough memory");
+
+ ops->create = detail_on_create;
+ ops->start = NULL;
+ ops->pause = detail_on_pause;
+ ops->resume = detail_on_resume;
+ ops->destroy = detail_on_destroy;
+ ops->message = detail_on_message;
+ ops->event = detail_on_event;
+ ops->key_event = detail_on_key_event;
+ ops->priv = cdetail_d;
+ ops->opt = UG_OPT_INDICATOR_ENABLE;
+
+ return 0;
+}
+
+API void UG_MODULE_EXIT(struct ug_module_ops *ops)
+{
+ p_retm_if(!ops, "ops is NULL");
+
+ ops->priv = NULL;
+}
+
+API int ctui_create_detail_view(ct_list_data *clist_d, ct_contact_list *info)
+{
+ PH_FN_CALL;
+ PH_START_TIME_CHECK;
+ ct_detail_data *cdetail_d;
+ Evas_Object *content;
+
+ cdetail_d = calloc(1, sizeof(ct_detail_data));
+ p_retvm_if(!cdetail_d, -1, "cdetail_d is NULL, Not enough memory");
+
+ ctui_ld_to_dd(clist_d, cdetail_d);
+ cdetail_d->contact_id = info->id;
+ cdetail_d->person_id = info->id_person;
+ cdetail_d->titem = NULL;
+ cdetail_d->ctrl_item = NULL;
+ cdetail_d->contact = contacts_svc_struct_duplicate(info->contact);
+
+ content = ct_detail_create_content(cdetail_d);
+ if (NULL == content) {
+ ERR("ct_detail_create_content() Failed");
+ free(cdetail_d);
+ return -1;
+ }
+
+ cdetail_d->navi_item = elm_naviframe_item_push(cdetail_d->navi,
+ T_(CT_GET_TEXT_BASIC, CTTEXT_DETAILS), NULL, NULL, content, NULL);
+
+ ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_INFO);
+
+ PH_END_TIME_CHECK();
+ return 0;
+}
+
+API int ctui_create_input_view(ct_detail_data *cdetail_d)
+{
+ CTSstruct *contact_dup = NULL;
+ PH_FN_CALL;
+ PH_START_TIME_CHECK;
+
+ p_retvm_if(!cdetail_d, -1, "cdetail_d is NULL");
+
+ if (cdetail_d->contact) {
+ contact_dup = contacts_svc_struct_duplicate(cdetail_d->contact);
+ p_retvm_if(NULL == contact_dup, -1, "contacts_svc_struct_duplicate() return NULL");
+ }
+ ct_input_push_navi_content(cdetail_d, contact_dup, cdetail_d->contact_id);
+
+ PH_END_TIME_CHECK("ct_input_push_navi_content");
+ return 0;
+}
+
+API Evas_Object* ctui_contacts_viewer(Evas_Object *win, Evas_Object *navi, int ct_id, const char *vcard_stream)
+{
+ int ret;
+ ct_detail_data *cdetail_d;
+ Evas_Object *bg;
+ Evas_Object *base = NULL;
+ Evas_Object *content;
+
+ cdetail_d = calloc(1, sizeof(ct_detail_data));
+ p_retvm_if(!cdetail_d, NULL, "cdetail_d is NULL, Not enough memory");
+
+ cdetail_d->win = win;
+ if (navi)
+ cdetail_d->navi = navi;
+ else {
+ base = phone_create_base_layout(win, true);
+ cdetail_d->navi = elm_naviframe_add(base);
+ evas_object_show(cdetail_d->navi);
+
+ bg = phone_create_bg(base);
+ if (NULL == bg) {
+ ERR("phone_create_bg() return NULL");
+ evas_object_del(base);
+ free(cdetail_d);
+ return NULL;
+ }
+ elm_object_style_set(bg, "group_list");
+ }
+
+ if (ct_id) {
+ cdetail_d->is_shortcut = true;
+ cdetail_d->contact_id = ct_id;
+ cdetail_d->person_id = ctui_get_person_id(ct_id);
+ ret = contacts_svc_get_contact(ct_id, &(cdetail_d->contact));
+ if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_get_contact() Failed(%d)", ret);
+ if (base)
+ evas_object_del(base);
+ free(cdetail_d);
+ return NULL;
+ }
+ }
+ else {
+ cdetail_d->vcard = (char *)vcard_stream;
+ ret = contacts_svc_get_contact_from_vcard(vcard_stream, &(cdetail_d->contact));
+ if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_get_contact_from_vcard() Failed(%d)", ret);
+ if (base)
+ evas_object_del(base);
+ free(cdetail_d);
+ return NULL;
+ }
+ }
+
+ if (cdetail_d->contact_id <= 0)
+ cdetail_d->base_ab = -1;
+
+ content = ct_detail_create_content(cdetail_d);
+ if (NULL == content) {
+ ERR("ct_detail_create_content() Failed");
+ if (base)
+ evas_object_del(base);
+ ret = contacts_svc_struct_free(cdetail_d->contact);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_struct_free() Failed(%d)", ret);
+ free(cdetail_d);
+ return NULL;
+ }
+
+ cdetail_d->navi_item = elm_naviframe_item_push(cdetail_d->navi,
+ T_(CT_GET_TEXT_BASIC, CTTEXT_DETAILS), NULL, NULL, content, NULL);
+
+ if (ct_id)
+ ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_INFO);
+ else
+ ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_VCARD);
+
+ if (navi)
+ return navi;
+ else {
+ elm_object_part_content_set(base, "elm.swallow.content", cdetail_d->navi);
+ evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_win_resize_object_add(win, base);
+ evas_object_show(base);
+ return base;
+ }
+}
+
+API int ctui_create_detail_view_from_phone(Evas_Object *win, Evas_Object *navi, ui_gadget_h ug, int id)
+{
+ PH_FN_CALL;
+ PH_START_TIME_CHECK;
+ ct_detail_data *cdetail_d;
+ Evas_Object *content;
+
+ cdetail_d = calloc(1, sizeof(ct_detail_data));
+ p_retvm_if(!cdetail_d, -1, "cdetail_d is NULL, Not enough memory");
+
+ cdetail_d->win = win;
+ cdetail_d->navi = navi;
+ cdetail_d->ug = ug;
+ cdetail_d->prev_navi_item = elm_naviframe_top_item_get(navi);
+ cdetail_d->contact_id = id;
+ cdetail_d->person_id = ctui_get_person_id(id);
+
+ content = ct_detail_create_content(cdetail_d);
+ if (NULL == content) {
+ ERR("ct_detail_create_content() Failed");
+ free(cdetail_d);
+ return -1;
+ }
+
+ cdetail_d->navi_item = elm_naviframe_item_push(cdetail_d->navi,
+ T_(CT_GET_TEXT_BASIC, CTTEXT_DETAILS), NULL, NULL, content, NULL);
+
+ ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_INFO);
+
+ PH_END_TIME_CHECK();
+ return 0;
+}
diff --git a/lib/details/ct-detail-utils.c b/lib/details/ct-detail-utils.c
new file mode 100755
index 0000000..648a463
--- /dev/null
+++ b/lib/details/ct-detail-utils.c
@@ -0,0 +1,1261 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <fcntl.h>
+#include <vconf.h>
+#include <Ecore_X.h>
+#include <ui-gadget-module.h>
+
+#include "phone.h"
+#include "ct-list.h"
+#include "ct-detail.h"
+#include "ct-detail-view.h"
+#include "ct-detail-utils.h"
+
+int ct_detail_parse_bundle(service_h service, ct_detail_data* cdetail_d)
+{
+ int type = CT_UG_REQUEST_DETAIL;
+ char* val = NULL;
+
+ if (service) {
+ service_get_extra_data(service, CT_UG_BUNDLE_TYPE, &val);
+ if (val) type = atoi(val);
+ PH_DBG("type = %d", type);
+ free(val);
+
+ switch (type) {
+ case CT_UG_REQUEST_DETAIL:
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_ID, &val);
+ if (val) {
+ cdetail_d->contact_id = atoi(val);
+ cdetail_d->person_id = ctui_get_person_id(cdetail_d->contact_id);
+ free(val);
+ break;
+ }
+
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_VCARD, &val);
+ if (val) {
+ if(ct_detail_load_vcard_contact(cdetail_d, val) < 0)
+ PH_DBG("ct_detail_load_vcard_contact fail");
+ free(val);
+ break;
+ }
+ break;
+ case CT_UG_REQUEST_EDIT:
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_ID, &val);
+ if (val) {
+ cdetail_d->contact_id = atoi(val);
+ cdetail_d->person_id = ctui_get_person_id(cdetail_d->contact_id);
+ free(val);
+ }
+ //number
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_NUM, &val);
+ if (val) {
+ if (NULL == cdetail_d->contact) {
+ int ret;
+ ret = contacts_svc_get_contact(cdetail_d->contact_id, &(cdetail_d->contact));
+ if(ret != CTS_SUCCESS)
+ ERR("contacts_svc_get_contact %d", cdetail_d->contact_id);
+ }
+ GSList *nums = NULL;
+ CTSvalue *num = contacts_svc_value_new(CTS_VALUE_NUMBER);
+ //contacts_svc_value_set_int(num, CTS_NUM_VAL_TYPE_INT, CTS_NUM_TYPE_CELL);
+ contacts_svc_value_set_str(num, CTS_NUM_VAL_NUMBER_STR, val);
+ nums = g_slist_append(nums, num);
+ contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_NUMBER_LIST, nums);
+ g_slist_free(nums);
+ free(val);
+ }
+
+ //email
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_EMAIL, &val);
+ if (val) {
+ if (NULL == cdetail_d->contact) {
+ int ret;
+ ret = contacts_svc_get_contact(cdetail_d->contact_id, &(cdetail_d->contact));
+ if(ret != CTS_SUCCESS)
+ ERR("contacts_svc_get_contact %d", cdetail_d->contact_id);
+ }
+ GSList *emails = NULL;
+ CTSvalue *email = contacts_svc_value_new(CTS_VALUE_EMAIL);
+ contacts_svc_value_set_int(email, CTS_EMAIL_VAL_TYPE_INT, CTS_EMAIL_TYPE_HOME);
+ contacts_svc_value_set_str(email, CTS_EMAIL_VAL_ADDR_STR, val);
+ emails = g_slist_append(emails, email);
+ contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_EMAIL_LIST, emails);
+ g_slist_free(emails);
+ free(val);
+ }
+ //url
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_WEB, &val);
+ if (val) {
+ if (NULL == cdetail_d->contact) {
+ int ret;
+ ret = contacts_svc_get_contact(cdetail_d->contact_id, &(cdetail_d->contact));
+ if(ret != CTS_SUCCESS)
+ ERR("contacts_svc_get_contact %d", cdetail_d->contact_id);
+ }
+ GSList *webs = NULL;
+ CTSvalue *web = contacts_svc_value_new(CTS_VALUE_WEB);
+ contacts_svc_value_set_int(web, CTS_WEB_VAL_TYPE_INT, CTS_WEB_TYPE_HOME);
+ contacts_svc_value_set_str(web, CTS_WEB_VAL_ADDR_STR, val);
+ webs = g_slist_append(webs, web);
+ contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_WEB_ADDR_LIST, webs);
+ g_slist_free(webs);
+ free(val);
+ }
+ break;
+ case CT_UG_REQUEST_ADD:
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_VCARD, &val);
+ if (val) {
+ contacts_svc_get_contact_from_vcard(val, &(cdetail_d->contact));
+ free(val);
+ break;
+ }
+
+ //number
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_NUM, &val);
+ if (val) {
+ if (NULL == cdetail_d->contact) {
+ cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT);
+ }
+ GSList *nums = NULL;
+ CTSvalue *num = contacts_svc_value_new(CTS_VALUE_NUMBER);
+ //contacts_svc_value_set_int(num, CTS_NUM_VAL_TYPE_INT, CTS_NUM_TYPE_CELL);
+ contacts_svc_value_set_str(num, CTS_NUM_VAL_NUMBER_STR, val);
+ nums = g_slist_append(nums, num);
+ contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_NUMBER_LIST, nums);
+ g_slist_free(nums);
+ free(val);
+ }
+
+ //email
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_EMAIL, &val);
+ if (val) {
+ if (NULL == cdetail_d->contact) {
+ cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT);
+ }
+ GSList *emails = NULL;
+ CTSvalue *email = contacts_svc_value_new(CTS_VALUE_EMAIL);
+ contacts_svc_value_set_int(email, CTS_EMAIL_VAL_TYPE_INT, CTS_EMAIL_TYPE_HOME);
+ contacts_svc_value_set_str(email, CTS_EMAIL_VAL_ADDR_STR, val);
+ emails = g_slist_append(emails, email);
+ contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_EMAIL_LIST, emails);
+ g_slist_free(emails);
+ free(val);
+ }
+
+ //url
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_WEB, &val);
+ if (val) {
+ if (NULL == cdetail_d->contact) {
+ cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT);
+ }
+ GSList *webs = NULL;
+ CTSvalue *web = contacts_svc_value_new(CTS_VALUE_WEB);
+ contacts_svc_value_set_int(web, CTS_WEB_VAL_TYPE_INT, CTS_WEB_TYPE_HOME);
+ contacts_svc_value_set_str(web, CTS_WEB_VAL_ADDR_STR, val);
+ webs = g_slist_append(webs, web);
+ contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_WEB_ADDR_LIST, webs);
+ g_slist_free(webs);
+ free(val);
+ }
+ break;
+ case CT_UG_REQUEST_ADD_WITH_NUM:
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_NUM, &val);
+ if (val) {
+ if (NULL == cdetail_d->contact)
+ cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT);
+ GSList *nums = NULL;
+ CTSvalue *num = contacts_svc_value_new(CTS_VALUE_NUMBER);
+ contacts_svc_value_set_int(num, CTS_NUM_VAL_TYPE_INT, CTS_NUM_TYPE_CELL);
+ contacts_svc_value_set_str(num, CTS_NUM_VAL_NUMBER_STR, val);
+ nums = g_slist_append(nums, num);
+ contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_NUMBER_LIST, nums);
+ g_slist_free(nums);
+ }
+ free(val);
+ break;
+ case CT_UG_REQUEST_ADD_WITH_EMAIL:
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_EMAIL, &val);
+ if (val) {
+ if (NULL == cdetail_d->contact)
+ cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT);
+ GSList *emails = NULL;
+ CTSvalue *email = contacts_svc_value_new(CTS_VALUE_EMAIL);
+ contacts_svc_value_set_int(email, CTS_EMAIL_VAL_TYPE_INT, CTS_EMAIL_TYPE_HOME);
+ contacts_svc_value_set_str(email, CTS_EMAIL_VAL_ADDR_STR, val);
+ emails = g_slist_append(emails, email);
+ contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_EMAIL_LIST, emails);
+ g_slist_free(emails);
+ }
+ free(val);
+ break;
+ case CT_UG_REQUEST_ADD_WITH_WEB:
+ val = NULL;
+ service_get_extra_data(service, CT_UG_BUNDLE_WEB, &val);
+ if (val) {
+ if (NULL == cdetail_d->contact)
+ cdetail_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT);
+ GSList *webs = NULL;
+ CTSvalue *web = contacts_svc_value_new(CTS_VALUE_WEB);
+ contacts_svc_value_set_int(web, CTS_WEB_VAL_TYPE_INT, CTS_WEB_TYPE_HOME);
+ contacts_svc_value_set_str(web, CTS_WEB_VAL_ADDR_STR, val);
+ webs = g_slist_append(webs, web);
+ contacts_svc_struct_store_list(cdetail_d->contact, CTS_CF_WEB_ADDR_LIST, webs);
+ g_slist_free(webs);
+ }
+ free(val);
+ break;
+ }
+ }
+
+ // FIXME : improve performance
+ if (cdetail_d->contact_id) {
+ int ret;
+ CTSstruct *contact;
+ ret = contacts_svc_get_contact(cdetail_d->contact_id, &contact);
+ p_retvm_if(ret != CTS_SUCCESS, -2, "contact id is not valid");
+ contacts_svc_struct_free(contact);
+ }
+ return type;
+}
+
+static inline bool detail_is_usable_char(char c)
+{
+ switch (c) {
+ case '\\':
+ case '/':
+ case ':':
+ case '*':
+ case '?':
+ case '\"':
+ case '<':
+ case '>':
+ case '|':
+ case ';':
+ return false;
+ default:
+ return true;
+ }
+}
+
+static inline bool detail_is_blank_str(char *display)
+{
+ int i;
+ for (i = 0 ; i < strlen(display); i++)
+ if (' ' != display[i]) return false;
+ return true;
+}
+
+static void detail_get_vcard_filepath(ct_detail_data *cdetail_d, char* path_buf, int buf_size)
+{
+ int ret;
+ char display[PH_TEXT_MAX_LEN];
+ char temp[PH_TEXT_MAX_LEN];
+ CTSvalue *name;
+
+ temp[0] = '\0';
+ ret = contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_NAME_VALUE, &name);
+ if (CTS_SUCCESS == ret)
+ ctui_get_display_name(name, temp, sizeof(temp));
+
+ display[0] = '\0';
+ if (*temp) {
+ int i;
+ int idx = 0;
+ for (i = 0 ; i < strlen(temp); i++) {
+ if (detail_is_usable_char(temp[i]))
+ display[idx++] = temp[i];
+ }
+ display[idx] = '\0';
+ }
+
+ if ('\0' == display[0] || detail_is_blank_str(display)) {
+ snprintf(display, sizeof(display), "%s", T_(CT_GET_TEXT_ERR, CTTEXT_NONAME));
+ }
+ snprintf(path_buf, buf_size, "%s/%s.vcf", UGDATAIDR, display);
+}
+
+static int detail_make_vcard(ct_detail_data *cdetail_d, char *path_buf, int buf_size)
+{
+ int ret, fd;
+ char* vcard;
+
+ detail_get_vcard_filepath(cdetail_d, path_buf, buf_size);
+ p_retvm_if(NULL == path_buf, FALSE, "detail_get_vcard_filepath() return NULL");
+
+ ret = contacts_svc_get_vcard_from_contact(cdetail_d->contact, &vcard);
+ p_retvm_if(NULL == vcard, FALSE,
+ "contacts_svc_get_vcard_from_contact() Failed(%d)", ret);
+
+ fd = open(path_buf, O_WRONLY|O_CREAT|O_TRUNC, 0644);
+ if (fd < 0) {
+ ERR("Open(%s) Failed", path_buf);
+ free(vcard);
+ return FALSE;
+ }
+
+ if (-1 == write(fd, vcard, strlen(vcard)))
+ ERR("write()... Failed(%s)", strerror(errno));
+ close(fd);
+
+ free(vcard);
+ return TRUE;
+}
+
+void ct_detail_delete_namecards(ct_detail_data *cdetail_d)
+{
+ int ret;
+ int fd;
+ char file_path[FILENAME_MAX];
+
+ detail_get_vcard_filepath(cdetail_d, file_path, sizeof(file_path));
+
+ fd = open(file_path, O_RDONLY);
+ if (fd < 0) return;
+
+ close(fd);
+
+ ret = unlink(file_path);
+ p_warn_if(ret < 0, "unlink(%s) failed(%d)", file_path, ret);
+}
+
+static void __detail_destroy_child_ug(ui_gadget_h ug, void *priv)
+{
+ ct_detail_data *cdetail_d = priv;
+ p_retm_if(NULL == priv, "priv is NULL");
+ p_retm_if(NULL == cdetail_d->child_ug, "ug is NULL");
+
+ ug_destroy(cdetail_d->child_ug);
+ cdetail_d->child_ug = NULL;
+}
+
+static void detail_destroy_child_ug(void *priv)
+{
+ ct_detail_data *cdetail_d = priv;
+ p_retm_if(NULL == priv, "priv is NULL");
+ p_retm_if(NULL == cdetail_d->child_ug, "ug is NULL");
+
+ ug_destroy(cdetail_d->child_ug);
+ cdetail_d->child_ug = NULL;
+}
+
+void* ct_detail_email_ug(ui_gadget_h parent, const char *to, const char *attach,
+ void(*destroy_cb)(void *), void *cb_param)
+{
+ struct ug_cbs cbs = {0};
+ ui_gadget_h ug;
+ service_h service;
+
+ service_create(&service);
+ service_add_extra_data(service, "RUN_TYPE", "5");
+
+ if (to)
+ service_add_extra_data(service, "TO", to);
+
+ if (attach) {
+ service_add_extra_data(service, "ATTACHMENT", attach);
+ service_add_extra_data(service, "SUBJECT", "Contacts name card");
+ }
+
+ cbs.layout_cb = ug_common_layout_cb;
+ cbs.result_cb = NULL;
+ cbs.destroy_cb = __detail_destroy_child_ug;
+ cbs.priv = NULL;
+
+ ug = ug_create(parent, EMAIL_COMPOSER_UG, UG_MODE_FULLVIEW, service, &cbs);
+ p_warn_if(NULL == ug, "ug_create() Failed");
+
+ service_destroy(service);
+ return ug;
+}
+
+void ct_detail_make_vcard(ct_detail_data *cdetail_d)
+{
+ int ret;
+ char file_path[FILENAME_MAX] = {0,};
+
+ ret = detail_make_vcard(cdetail_d, file_path, sizeof(file_path));
+ if(TRUE != ret)
+ cdetail_d->vcard = NULL;
+ else
+ cdetail_d->vcard = strdup(file_path);
+ PH_DBG("vcf path %s", file_path);
+}
+
+void ct_detail_send_via_msg(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ char file_path[FILENAME_MAX];
+ ct_detail_data *cdetail_d = data;
+
+ ret = detail_make_vcard(cdetail_d, file_path, sizeof(file_path));
+ p_retm_if(TRUE != ret, "detail_make_vcard() Failed");
+
+ cdetail_d->child_ug = ctui_msg_ug(cdetail_d->ug, NULL, 0, file_path, detail_destroy_child_ug, cdetail_d);
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+}
+
+void ct_detail_send_via_email(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ char file_path[FILENAME_MAX];
+ ct_detail_data *cdetail_d = data;
+
+ ret = detail_make_vcard(cdetail_d, file_path, sizeof(file_path));
+ p_retm_if(TRUE != ret, "detail_make_vcard() Failed");
+
+ cdetail_d->child_ug = ct_detail_email_ug(cdetail_d->ug, NULL, file_path,
+ detail_destroy_child_ug, cdetail_d);
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+}
+
+void ct_detail_send_via_bluetooth(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ service_h service;
+ ct_detail_data *cdetail_d = data;
+ char file_path[FILENAME_MAX];
+ struct ug_cbs cbs = {0};
+
+ ret = detail_make_vcard(cdetail_d, file_path, sizeof(file_path));
+ p_retm_if(TRUE != ret, "detail_make_vcard() Failed");
+
+ service_create(&service);
+ service_add_extra_data(service, "launch-type", "send");
+ service_add_extra_data(service, "filecount", "1");
+ service_add_extra_data(service, "files", file_path);
+
+ cbs.layout_cb = ug_common_layout_cb;
+ cbs.result_cb = NULL;
+ cbs.destroy_cb = __detail_destroy_child_ug;
+ cbs.priv = NULL;
+
+ cdetail_d->child_ug = ug_create(cdetail_d->ug, BLUETOOTH_UG, UG_MODE_FULLVIEW, service, &cbs);
+
+ service_destroy(service);
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+}
+
+void ct_detail_get_nicknames(CTSvalue *value, char *dest, int dest_len)
+{
+ int ret;
+ char temp[dest_len];
+ const char* nickname = NULL;
+
+ p_ret_if(NULL == dest);
+
+ nickname = contacts_svc_value_get_str(value, CTS_NICKNAME_VAL_NAME_STR);
+ if (NULL == nickname) return;
+
+ if (*dest) {
+ ret = snprintf(temp, dest_len, "%s, %s", dest, nickname);
+ if (0 < ret)
+ memcpy(dest, temp, ret+1);
+ }
+ else {
+ snprintf(dest, dest_len, "%s", nickname);
+ }
+}
+
+void ct_detail_get_company_str(CTSvalue *value, char *dest, int dest_len)
+{
+ int ret;
+ const char *company, *job, *department;
+ char temp[dest_len];
+
+ p_ret_if(NULL == dest);
+
+ company = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_NAME_STR);
+ department = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR);
+ job = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_JOB_TITLE_STR);
+
+ if (company)
+ snprintf(dest, dest_len, "%s", company);
+
+ if (department) {
+ if (*dest) {
+ ret = snprintf(temp, dest_len, "%s, %s", dest, department);
+ if (0 < ret)
+ memcpy(dest, temp, ret+1);
+ }
+ else {
+ snprintf(dest, dest_len, "%s", department);
+ }
+ }
+
+ if (job) {
+ if (*dest) {
+ ret = snprintf(temp, dest_len, "%s, %s", dest, job);
+ if (0 < ret)
+ memcpy(dest, temp, ret+1);
+ }
+ else {
+ snprintf(dest, dest_len, "%s", job);
+ }
+ }
+}
+
+CTSvalue* ct_detail_get_default_number(GSList *list)
+{
+ GSList *cursor;
+ CTSvalue* ret_val;
+
+ p_retvm_if(NULL == list, NULL, "parameter(GSList) is NULL");
+
+ ret_val = list->data;
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ if (contacts_svc_value_get_bool(cursor->data, CTS_NUM_VAL_DEFAULT_BOOL)) {
+ ret_val = cursor->data;
+ break;
+ }
+ }
+
+ return ret_val;
+}
+
+void ct_detail_get_first_mid_last_name(CTSvalue *value, char *dest, int dest_len)
+{
+ const char *first, *last, *mid;
+
+ first = contacts_svc_value_get_str(value, CTS_NAME_VAL_FIRST_STR);
+ last = contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR);
+ mid = contacts_svc_value_get_str(value, CTS_NAME_VAL_ADDITION_STR);
+
+ if (CTS_ORDER_NAME_FIRSTLAST == contacts_svc_get_order(CTS_ORDER_OF_DISPLAY))
+ snprintf(dest, dest_len, "%s%s%s%s%s", SAFE_STR(first), STR_BLANK(first, mid), STR_BLANK(mid, last));
+ else
+ snprintf(dest, dest_len, "%s%s%s%s%s", SAFE_STR(last), STR_BLANK(first, mid), STR_BLANK(mid, first));
+}
+
+void ct_detail_get_extra_name(CTSstruct *contact, char *dest, int dest_len)
+{
+ CTSvalue *value;
+ GSList *list;
+ const char *suffix;
+
+ contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value);
+ if (value) {
+ suffix = contacts_svc_value_get_str(value, CTS_NAME_VAL_SUFFIX_STR);
+ if (suffix)
+ snprintf(dest, dest_len, "%s", suffix);
+ }
+ contacts_svc_struct_get_list(contact, CTS_CF_NICKNAME_LIST, &list);
+ if (list)
+ ct_detail_get_nicknames(list->data, dest, dest_len);
+}
+
+char *ct_detail_gl_base_info_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ char display[PH_TEXT_MAX_LEN];
+ CTSvalue *value;
+ const char *display_name = NULL;
+ ct_detail_data *cdetail_d = data;
+ p_retvm_if(NULL == cdetail_d, NULL, "parameter(cdetail_d) is NULL");
+
+ display[0] = '\0';
+ value = NULL;
+
+ if (0 == strcmp(part, "elm.text.name")) {
+ contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_NAME_VALUE, &value);
+ if (value) {
+ ct_detail_get_first_mid_last_name(value, display, sizeof(display));
+ if (*display)
+ return strdup(display);
+
+ display_name = contacts_svc_value_get_str(value, CTS_NAME_VAL_DISPLAY_STR);
+ if (display_name)
+ return strdup(display_name);
+ }
+ }
+ else if (0 == strcmp(part, "elm.text.subname")) {
+ ct_detail_get_extra_name(cdetail_d->contact, display, sizeof(display));
+ if (*display)
+ return strdup(display);
+
+ contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_COMPANY_VALUE, &value);
+ if (value)
+ ct_detail_get_company_str(value, display, sizeof(display));
+ return strdup(display);
+ }
+ else if (0 == strcmp(part, "elm.text.subname2")) {
+ contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_COMPANY_VALUE, &value);
+ if (value)
+ ct_detail_get_company_str(value, display, sizeof(display));
+ return strdup(display);
+ }
+ return NULL;
+}
+
+
+static bool detail_set_favorite(CTSstruct *contact, int contact_id, bool is_set)
+{
+ int ret;
+ CTSvalue *baseinfo;
+
+ if (is_set)
+ ret = contacts_svc_set_favorite(CTS_FAVOR_CONTACT, contact_id);
+ else
+ ret = contacts_svc_unset_favorite(CTS_FAVOR_CONTACT, contact_id);
+ p_retvm_if(CTS_SUCCESS != ret, false, "contacts_svc_set(unset)_favorite() failed(%d)", ret);
+
+ ret = contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &baseinfo);
+ p_retvm_if(CTS_SUCCESS != ret, false, "contacts_svc_struct_get_value() Failed(%d)", ret);
+
+ ret = contacts_svc_value_set_bool(baseinfo, CTS_BASE_VAL_FAVORITE_BOOL, is_set);
+ p_retvm_if(CTS_SUCCESS != ret, false, "contacts_svc_value_set_bool() Failed(%d)", ret);
+
+ return true;
+}
+
+static void detail_favorite_mouseup_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ bool is_favorite;
+ bool success;
+ int x,y,w,h;
+ CTSvalue *baseinfo;
+ const char* result_msg;
+ ct_detail_data *cdetail_d = data;
+ Elm_Object_Item *item_baseinfo;
+ Evas_Event_Mouse_Up *ev = event_info;
+
+ p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL");
+
+ if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
+ return;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+ if (ev->output.y < y || y + h < ev->output.y || ev->output.x < x || x + w < ev->output.x)
+ return;
+
+ ret = contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, &baseinfo);
+ p_retm_if(CTS_SUCCESS != ret, "contacts_svc_struct_get_value() Failed(%d)", ret);
+
+ is_favorite = !contacts_svc_value_get_bool(baseinfo, CTS_BASE_VAL_FAVORITE_BOOL);
+ success = detail_set_favorite(cdetail_d->contact, cdetail_d->person_id, is_favorite);
+
+ if (is_favorite && success)
+ result_msg = S_(CT_SYS_POP_ADDED);
+ else if (!is_favorite && success)
+ result_msg = S_(PH_SYS_POP_REMOVED);
+ else
+ result_msg = S_(PH_SYS_POP_FAILED);
+
+ phone_show_tickernoti(result_msg);
+
+ item_baseinfo = evas_object_data_get(cdetail_d->genlist, "base_info");
+ p_retm_if(NULL == item_baseinfo, "evas_object_data_get() return NULL");
+
+ elm_genlist_item_update(item_baseinfo);
+}
+
+Evas_Object *ct_detail_gl_base_info_icon_get(void *data, Evas_Object *obj,
+ const char *part)
+{
+ int ret;
+ CTSvalue *base_info;
+ ct_detail_data *cdetail_d = data;
+
+ ret = contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, &base_info);
+ p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_struct_get_value() Failed(%d)", ret);
+
+ if (0 == strcmp(part, "elm.icon.image")) {
+ const char *value_data;
+ Evas_Object *img;
+
+ value_data = contacts_svc_value_get_str(base_info, CTS_BASE_VAL_IMG_PATH_STR);
+ if (NULL == value_data)
+ value_data = ctui_get_default_contact_img(CT_VIEW_DETAIL);
+ img = elm_image_add(obj);
+ p_retvm_if(NULL == img, NULL, "elm_image_add() return NULL");
+ evas_object_size_hint_aspect_set(img, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
+ elm_image_file_set(img, value_data, NULL);
+
+ return img;
+ }
+ else if (0 == strcmp(part, "elm.icon.favorite")) {
+ Evas_Object *icon;
+
+ icon = elm_icon_add(obj);
+ p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL");
+
+ evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_UP, detail_favorite_mouseup_cb, cdetail_d);
+ elm_icon_resizable_set(icon, EINA_FALSE, EINA_FALSE);
+
+ if (!contacts_svc_value_get_bool(base_info, CTS_BASE_VAL_FAVORITE_BOOL))
+ elm_icon_file_set(icon, CTUI_IMG_ICON_FAVORITE, NULL);
+ else
+ elm_icon_file_set(icon, CTUI_IMG_ICON_FAVORITE_ON, NULL);
+
+ return icon;
+ }
+ return NULL;
+}
+
+Evas_Object *ct_detail_gl_number_util_icon_get(void *data, Evas_Object *obj,
+ const char *part)
+{
+ char *fullpath;
+ const char *number;
+ CTSvalue *value = data;
+ ct_detail_data *cdetail_d;
+ Evas_Object *btn;
+ Evas_Object *icon;
+ Evas_Smart_Cb clicked_fn;
+
+ p_retv_if(NULL == data, NULL);
+
+ if (0 == strcmp(part, "elm.icon.1")) {
+ fullpath = PH_IMG_ICON_CALL;
+ clicked_fn = ct_detail_voice_call_cb;
+ }
+ else if (0 == strcmp(part, "elm.icon.2")) {
+ fullpath = PH_IMG_ICON_MESSAGE;
+ clicked_fn = ct_detail_msg_ug_cb;
+ }
+ else if (0 == strcmp(part, "elm.icon.3")) {
+ return NULL;
+ }
+#ifdef _CT_RCS
+ else if (0 == strcmp(part, "elm.icon.4")) {
+ fullpath = PH_IMG_ICON_CHAT_ON;
+ clicked_fn = ct_detail_chat_on_cb;
+ }
+ else if (0 == strcmp(part, "elm.icon.5")) {
+ fullpath = PH_IMG_ICON_FILETRANSFER;
+ clicked_fn = ct_detail_filetransfer_cb;
+ }
+#endif
+ else {
+ return NULL;
+ }
+
+ cdetail_d = evas_object_data_get(obj, "cdetail_d");
+ p_retvm_if(NULL == cdetail_d, NULL, "evas_object_data_get() return NULL");
+
+
+ if(cdetail_d->ug)
+ clicked_fn = NULL;
+
+ number = contacts_svc_value_get_str(value, CTS_NUM_VAL_NUMBER_STR);
+
+ btn = elm_button_add(obj);
+ p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL");
+
+ icon = elm_icon_add(btn);
+ p_retvm_if(NULL == icon, NULL, "phone_create_icon_with_img() return NULL");
+ elm_icon_resizable_set(icon, EINA_FALSE, EINA_FALSE);
+ elm_icon_file_set(icon, fullpath, NULL);
+ elm_object_part_content_set(btn, "icon", icon);
+
+ evas_object_data_set(btn, "cdetail_d", cdetail_d);
+ evas_object_smart_callback_add(btn, "clicked", clicked_fn, number);
+
+ return btn;
+}
+
+void ct_detail_msg_ug_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_detail_data *cdetail_d;
+
+ cdetail_d = evas_object_data_get(obj, "cdetail_d");
+ p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL");
+
+ if (cdetail_d->popup)
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+ cdetail_d->child_ug = ctui_msg_ug(cdetail_d->ug, data, cdetail_d->contact_id, NULL,
+ detail_destroy_child_ug, cdetail_d);
+}
+
+void ct_detail_voice_call_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_detail_data *cdetail_d;
+
+ cdetail_d = evas_object_data_get(obj, "cdetail_d");
+ p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL");
+
+ if (cdetail_d->popup)
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+
+ phone_launch_voice_call(cdetail_d->contact_id, data);
+}
+
+#ifdef _CT_RCS
+void ct_detail_chat_on_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ // FIXME : need to fill
+}
+
+void ct_detail_filetransfer_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ // FIXME : need to fill
+}
+#endif
+
+void ct_detail_popup_hide_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_detail_data *cdetail_d = data;
+ evas_object_del(cdetail_d->popup);
+ cdetail_d->popup = NULL;
+}
+
+const char* ct_detail_get_ringtone_display_name(const char *real_data)
+{
+ const char *data;
+
+ if (NULL == real_data)
+ data = T_(CT_GET_TEXT_BASIC, CTTEXT_DEFAULT);
+ else {
+ data = strrchr(real_data, '/');
+ if (NULL == data)
+ data = real_data;
+ else
+ data = data + 1;
+ }
+ return data;
+}
+
+static void detail_refresh_view(ct_detail_data *cdetail_d)
+{
+ PH_FN_CALL;
+ int ret;
+
+ contacts_svc_struct_free(cdetail_d->contact);
+ cdetail_d->contact = NULL;
+
+ if (cdetail_d->contact_id) {
+ g_slist_free(cdetail_d->person_list);
+ cdetail_d->person_list = ct_detail_get_person_list(cdetail_d->person_id);
+
+ contacts_svc_begin_trans();
+ cdetail_d->view_creat_ver = contacts_svc_end_trans(true);
+
+ ret = contacts_svc_get_person(cdetail_d->person_id, &(cdetail_d->contact));
+ if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_get_person() Failed(%d)", ret);
+ elm_naviframe_item_pop(cdetail_d->navi);
+ return;
+ }
+ }
+ else {
+ ret = contacts_svc_get_contact_from_vcard(cdetail_d->vcard, &(cdetail_d->contact));
+ if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_get_contact_from_vcard() Failed(%d)", ret);
+ elm_exit();
+ }
+ }
+ ctui_detail_genlist_update(cdetail_d);
+}
+
+void ct_detail_contacts_changed(void *user_data)
+{
+ PH_FN_CALL;
+ int changed_id;
+ int id_ab, ret, type = 0;
+ bool changed = false;
+ CTSiter *iter;
+ CTSvalue *value;
+ ct_detail_data *cdetail_d = user_data;
+
+ contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, &value);
+ id_ab = contacts_svc_value_get_int(value, CTS_BASE_VAL_ADDRESSBOOK_ID_INT);
+
+ if (!cdetail_d->person_list || g_slist_length(cdetail_d->person_list) <= 1) {
+ ret = contacts_svc_get_updated_contacts(id_ab, cdetail_d->view_creat_ver, &iter);
+ p_retm_if(CTS_SUCCESS != ret, "contacts_svc_get_updated_contacts() Failed(%d)", ret);
+
+ while (CTS_SUCCESS == contacts_svc_iter_next(iter)) {
+ value = contacts_svc_iter_get_info(iter);
+ changed_id = contacts_svc_value_get_int(value, CTS_LIST_CHANGE_ID_INT);
+
+ if (changed_id == cdetail_d->contact_id) {
+ changed = true;
+ type = contacts_svc_value_get_int(value, CTS_LIST_CHANGE_TYPE_INT);
+ contacts_svc_value_free(value);
+ break;
+ }
+ contacts_svc_value_free(value);
+ }
+ contacts_svc_iter_remove(iter);
+ }
+ else {
+ GSList *cursor;
+
+ contacts_svc_get_updated_contacts(0, cdetail_d->view_creat_ver, &iter);
+ while (CTS_SUCCESS == contacts_svc_iter_next(iter)) {
+ value = contacts_svc_iter_get_info(iter);
+ changed_id = contacts_svc_value_get_int(value, CTS_LIST_CHANGE_ID_INT);
+ for (cursor=cdetail_d->person_list;cursor;cursor=cursor->next) {
+ if (changed_id == (int)cursor->data) {
+ changed = true;
+ type = contacts_svc_value_get_int(value, CTS_LIST_CHANGE_TYPE_INT);
+ contacts_svc_value_free(value);
+ break;
+ }
+ }
+ if (changed)
+ break;
+ contacts_svc_value_free(value);
+ }
+ contacts_svc_iter_remove(iter);
+ }
+
+ p_ret_if(!changed);
+
+ if (cdetail_d->updated)
+ cdetail_d->updated = false;
+
+ if (CTS_OPERATION_DELETED == type) {
+ if (cdetail_d->is_shortcut)
+ elm_exit();
+ else if (NULL == cdetail_d->prev_view_data && cdetail_d->ug)
+ ug_destroy_me(cdetail_d->ug);
+ else
+ elm_naviframe_item_pop_to(cdetail_d->prev_navi_item);
+ }
+ else {
+ detail_refresh_view(cdetail_d);
+ }
+}
+
+void ct_detail_link_changed(void *user_data)
+{
+ int exist = false;
+ GSList *person_list, *cur1, *cur2;
+ ct_detail_data *cdetail_d = user_data;
+
+ p_retm_if(NULL == cdetail_d, "parameter(cdetail_d) is NULL");
+
+ person_list = ct_detail_get_person_list(cdetail_d->person_id);
+
+ if (NULL == person_list || g_slist_length(person_list) != g_slist_length(cdetail_d->person_list))
+ detail_refresh_view(cdetail_d);
+
+ /* compare person list and old person list */
+ for (cur1=person_list;cur1;cur1=cur1->next) {
+ exist = false;
+ for (cur2=cdetail_d->person_list;cur2;cur2=cur2->next) {
+ if ((int)cur1->data == (int)cur2->data) {
+ exist = true;
+ break;
+ }
+ }
+ if (!exist)
+ break;
+ }
+
+ if (!exist)
+ detail_refresh_view(cdetail_d);
+}
+
+static inline void detail_append_str_with_linebreak(const char *src, char *dest, int dest_len)
+{
+ char temp[PH_TEXT_MAX_LEN];
+ if (src && '\0' != src[0]) {
+ if ('\0' == dest[0])
+ snprintf(dest, dest_len, "%s", src);
+ else {
+ snprintf(temp, sizeof(temp), "%s\n%s", src, dest);
+ snprintf(dest, dest_len, "%s", temp);
+ }
+ }
+}
+
+int ct_detail_get_full_addr(CTSvalue *postal, char *buf, int buf_len)
+{
+ const char *code;
+ const char *region;
+ const char *locality;
+ const char *street;
+ const char *extended;
+ const char *country;
+ const char *pobox;
+
+ code = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_POSTALCODE_STR);
+ extended = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_EXTENDED_STR);
+ pobox = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_POBOX_STR);
+ street = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_STREET_STR);
+ locality = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_LOCALITY_STR);
+ region = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_REGION_STR);
+ country = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_COUNTRY_STR);
+
+ detail_append_str_with_linebreak(country, buf, buf_len);
+ detail_append_str_with_linebreak(region, buf, buf_len);
+ detail_append_str_with_linebreak(locality, buf, buf_len);
+ detail_append_str_with_linebreak(street, buf, buf_len);
+ detail_append_str_with_linebreak(pobox, buf, buf_len);
+ detail_append_str_with_linebreak(extended, buf, buf_len);
+ detail_append_str_with_linebreak(code, buf, buf_len);
+
+ return 0;
+}
+
+void ct_detail_mouseup(void *data, Evas *evas, Evas_Object *obj,
+ void *event_info)
+{
+ Evas_Event_Mouse_Up *ev = event_info;
+ ct_detail_data *cdetail_d = data;
+ cdetail_d->touch_x = ev->canvas.x;
+ cdetail_d->touch_y = ev->canvas.y;
+}
+
+
+CTSvalue* ct_detail_get_baseinfo_value(CTSstruct* contact)
+{
+ int ret;
+ CTSvalue *baseinfo;
+
+ baseinfo = NULL;
+ ret = contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &baseinfo);
+ p_retvm_if(CTS_SUCCESS != ret && CTS_ERR_NO_DATA != ret, NULL, "contacts_svc_struct_get_value() failed(%d)", ret);
+
+ if (NULL == baseinfo) {
+ baseinfo = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO);
+ ret = contacts_svc_struct_store_value(contact, CTS_CF_BASE_INFO_VALUE, baseinfo);
+ p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_struct_store_value() failed(%d)", ret);
+ }
+
+ return baseinfo;
+}
+
+GSList* ct_detail_get_person_list(int person_id)
+{
+ GSList *person_list = NULL;
+ CTSiter *iter;
+ if (person_id) {
+ contacts_svc_get_list_with_int(CTS_LIST_MEMBERS_OF_PERSON_ID, person_id, &iter);
+
+ while (CTS_SUCCESS == contacts_svc_iter_next(iter)) {
+ int ct_id;
+ CTSvalue *val_temp;
+
+ val_temp = contacts_svc_iter_get_info(iter);
+ ct_id = contacts_svc_value_get_int(val_temp, CTS_LIST_CONTACT_ID_INT);
+
+ if (-1 < ct_id)
+ person_list = g_slist_append(person_list, (void *)ct_id);
+ }
+ contacts_svc_iter_remove(iter);
+ }
+ return person_list;
+}
+
+static void detail_myfile_ringtone_result(ui_gadget_h ug, service_h service, void *data)
+{
+ ct_detail_data *cdetail_d = data;
+
+ p_retm_if(NULL == ug || NULL == data, "ug or data is NULL");
+
+ if (service) {
+ const char* display;
+ CTSvalue *base_info = NULL;
+ CTSstruct *contact = cdetail_d->contact;
+
+ char *val = NULL;
+ service_get_extra_data(service, "result", &val);
+ p_retm_if(!val, "return value is NULL");
+
+ contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &base_info);
+ if (NULL == base_info) {
+ base_info = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO);
+ contacts_svc_struct_store_value(contact, CTS_CF_BASE_INFO_VALUE, base_info);
+ }
+ contacts_svc_value_set_str(base_info, CTS_BASE_VAL_RINGTONE_PATH_STR, val);
+ cdetail_d->updated = true;
+
+ display = ct_detail_get_ringtone_display_name(val);
+ elm_genlist_item_update(cdetail_d->ringtone_item);
+ free(val);
+ }
+
+ ug_destroy(ug);
+ cdetail_d->child_ug = NULL;
+}
+
+
+void ct_detail_myfile_ringtone(ct_detail_data *cdetail_d)
+{
+ if(cdetail_d->ug)
+ return;
+
+ struct ug_cbs cbs = {0};
+
+ service_h service;
+
+ service_create(&service);
+ service_add_extra_data(service, "path", "/opt/share/settings/Ringtones");
+ service_add_extra_data(service, "select_type", "SINGLE_FILE");
+ service_add_extra_data(service, "file_type", "SOUND");
+
+ cbs.result_cb = detail_myfile_ringtone_result;
+ cbs.destroy_cb = __detail_destroy_child_ug;
+ cbs.layout_cb = ug_common_layout_cb;
+ cbs.priv = cdetail_d;
+
+ cdetail_d->child_ug = ug_create(cdetail_d->ug, MYFILES_UG, UG_MODE_FULLVIEW, service, &cbs);
+ p_warn_if(NULL == cdetail_d->child_ug, "ug_create() Failed");
+
+ service_destroy(service);
+}
+
+
+CTSvalue* ct_detail_get_relationship(CTSstruct *contact)
+{
+ int ret;
+ CTSvalue *value;
+
+ ret = contacts_svc_find_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, "Relationship");
+ if (ret <= 0) return NULL;
+
+ contacts_svc_struct_get_value(contact, ret, &value);
+ return value;
+}
+
+static Evas_Object* detail_list_gl_icon_get(void *data, Evas_Object *obj,
+ const char *part)
+{
+ ct_contact_list* ct_info = data;
+ p_retvm_if(NULL == ct_info, NULL, "ct_info is NULL");
+
+ if (0 == strcmp(part, "elm.icon.1")) {
+ const char *path;
+ Evas_Object *icon;
+
+ if (!ct_info->img_loaded) {
+ contacts_svc_get_image(CTS_IMG_NORMAL, ct_info->id, &ct_info->img_path);
+ ct_info->img_loaded = true;
+ }
+
+ path = ct_info->img_path;
+ if (NULL == path) return NULL;
+
+ icon = elm_icon_add(obj);
+ if (icon) {
+ elm_icon_prescale_set(icon, CT_LIST_ICON_SIZE);
+ elm_icon_file_set(icon, path, NULL);
+ evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ evas_object_show(icon);
+ }
+ return icon;
+ }
+ return NULL;
+}
+
+static void detial_list_create_itcs(ct_list_data *clist_d)
+{
+ clist_d->itcs[0].item_style = "link_list";
+ clist_d->itcs[0].func.text_get = ct_list_gl_label_get;
+ clist_d->itcs[0].func.content_get = detail_list_gl_icon_get;
+
+ clist_d->itcs[1].item_style = "link_list";
+ clist_d->itcs[1].func.text_get = ct_list_gl_label_get;
+ clist_d->itcs[1].func.content_get = detail_list_gl_icon_get;
+
+ clist_d->itcs[2].item_style = "link_list.tb";
+ clist_d->itcs[2].func.text_get = ct_list_gl_label_get;
+ clist_d->itcs[2].func.content_get = detail_list_gl_icon_get;
+
+ clist_d->itcs[3].item_style = "link_list.tb";
+ clist_d->itcs[3].func.text_get = ct_list_gl_label_get;
+ clist_d->itcs[3].func.content_get = detail_list_gl_icon_get;
+
+ clist_d->itcs[4].item_style="1text_center";
+ clist_d->itcs[4].func.text_get = ct_list_count_gl_label_get;
+}
+
+void ct_detail_create_list_view(ct_detail_data *cdetail_d, Evas_Smart_Cb sel_cb, void *cb_data, int id_caller)
+{
+ ct_list_data *clist_d;
+ char buf[PH_TEXT_SHORT_LEN];
+ Evas_Object *btn;
+
+ clist_d = calloc(1, sizeof(ct_list_data));
+ clist_d->list_op = CT_GET_LIST_ALL_CONTACTS;
+ clist_d->ct_id_caller = id_caller;
+ clist_d->navi = cdetail_d->navi;
+ clist_d->win = cdetail_d->win;
+ clist_d->ug = cdetail_d->ug;
+ clist_d->gl_sel = sel_cb;
+ clist_d->gl_sel_data = cb_data;
+
+ ct_list_get_contacts(clist_d, &clist_d->list);
+ detial_list_create_itcs(clist_d);
+ clist_d->content = ct_list_create_contact_layout(clist_d);
+
+ FREEandSTRDUP(clist_d->title, T_(CT_GET_TEXT_BASIC, CTTEXT_ALL_CONTACTS));
+ snprintf(buf, sizeof(buf), "%s (%d)", clist_d->title, clist_d->cnt_list);
+ clist_d->navi_item = elm_naviframe_item_push(clist_d->navi, buf, NULL, NULL, clist_d->content, NULL);
+
+ elm_toolbar_add(clist_d->navi);
+ elm_toolbar_shrink_mode_set(clist_d->cbar, ELM_TOOLBAR_SHRINK_EXPAND);
+ elm_object_item_part_content_set(clist_d->navi_item, "controlbar", clist_d->cbar);
+
+ btn = elm_button_add(clist_d->navi);
+ elm_object_style_set(btn, "naviframe/back_btn/default");
+ evas_object_smart_callback_add(btn, "clicked", phone_view_back_btn_cb, clist_d->navi);
+ elm_object_item_part_content_set(clist_d->navi_item, "prev_btn", btn);
+}
+
+
+
+int ct_detail_load_vcard_contact(ct_detail_data *cdetail_d, char *path)
+{
+ int ret;
+ FILE *fp;
+ char vcard_stream[1024*100];
+ PH_DBG("path = %s", path);
+
+ fp = fopen(path, "r");
+ if (NULL == fp) {
+ ERR("fopen() return NULL");
+ elm_exit();
+ return -1;
+ }
+ ret = fread(vcard_stream, 1, sizeof(vcard_stream), fp);
+ if (0 < ret && ret < sizeof(vcard_stream)) {
+ vcard_stream[ret] = '\0';
+
+ cdetail_d->vcard = strdup(vcard_stream);
+ ret = contacts_svc_get_contact_from_vcard(vcard_stream, &(cdetail_d->contact));
+ if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_get_contact_from_vcard() Failed(%d)", ret);
+ fclose(fp);
+ return -1;
+ }
+ }
+ else {
+ Evas_Object *popup;
+ ERR("vcard is invalid(%d)", ret);
+ cdetail_d->popup = phone_show_popup(cdetail_d->win, S_(CT_SYS_POP_ERROR), 1.5);
+ evas_object_smart_callback_add(cdetail_d->popup, "timeout", ct_detail_popup_hide_cb, NULL);
+ }
+ fclose(fp);
+ return 0;
+}
diff --git a/lib/details/ct-detail-utils.h b/lib/details/ct-detail-utils.h
new file mode 100755
index 0000000..c13db79
--- /dev/null
+++ b/lib/details/ct-detail-utils.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CONTACTS_DETAIL_UTILS_H__
+#define __CONTACTS_DETAIL_UTILS_H__
+
+enum {
+ RELATIONSHIP_TYPE_ASSISTANT = 0,
+ RELATIONSHIP_TYPE_BROTHER,
+ RELATIONSHIP_TYPE_CHILD,
+ RELATIONSHIP_TYPE_DOMESTIC_PARTNER,
+ RELATIONSHIP_TYPE_FATHER,
+ RELATIONSHIP_TYPE_FRIEND,
+ RELATIONSHIP_TYPE_MANAGER,
+ RELATIONSHIP_TYPE_MOTHER,
+ RELATIONSHIP_TYPE_PARENT,
+ RELATIONSHIP_TYPE_PARTNER,
+ RELATIONSHIP_TYPE_REFERRED_BY,
+ RELATIONSHIP_TYPE_RELATIVE,
+ RELATIONSHIP_TYPE_SISTER,
+ RELATIONSHIP_TYPE_SPOUSE,
+ RELATIONSHIP_TYPE_CUSTOM,
+ RELATIONSHIP_TYPE_MAX,
+};
+
+void ct_detail_make_vcard(ct_detail_data *cdetail_d);
+void ct_detail_send_via_msg(void *data, Evas_Object *obj, void *event_info);
+void ct_detail_send_via_email(void *data, Evas_Object *obj, void *event_info);
+void ct_detail_send_via_bluetooth(void *data, Evas_Object *obj, void *event_info);
+void* ct_detail_email_ug(ui_gadget_h parent, const char *to, const char *attach, void(*destroy_cb)(void*), void *cb_param);
+void ct_detail_delete_namecards(ct_detail_data *cdetail_d);
+void ct_detail_popup_hide_cb(void *data, Evas_Object *obj, void *event_info);
+void ct_detail_contacts_changed(void *user_data);
+void ct_detail_mouseup(void *data, Evas *evas, Evas_Object *obj, void *event_info);
+const char* ct_detail_get_ringtone_display_name(const char *real_data);
+void ct_detail_get_nicknames(CTSvalue *value, char *dest, int dest_len);
+void ct_detail_get_company_str(CTSvalue *value, char *dest, int dest_len);
+int ct_detail_get_full_addr(CTSvalue *postal, char *buf, int buf_len);
+int ct_detail_parse_bundle(service_h service, ct_detail_data* cdetail_d);
+CTSvalue* ct_detail_get_baseinfo_value(CTSstruct* contact);
+GSList* ct_detail_get_person_list(int person_id);
+void ct_detail_link_changed(void *user_data);
+void ct_detail_myfile_ringtone(ct_detail_data *cdetail_d);
+CTSvalue* ct_detail_get_relationship(CTSstruct *contact);
+void ct_detail_get_first_mid_last_name(CTSvalue *value, char *dest, int dest_len);
+void ct_detail_get_extra_name(CTSstruct *contact, char *dest, int dest_len);
+char *ct_detail_gl_base_info_label_get(void *data, Evas_Object *obj, const char *part);
+Evas_Object *ct_detail_gl_base_info_icon_get(void *data, Evas_Object *obj, const char *part);
+Evas_Object *ct_detail_gl_number_util_icon_get(void *data, Evas_Object *obj, const char *part);
+CTSvalue* ct_detail_get_default_number(GSList *list);
+void ct_detail_voice_call_cb(void *data, Evas_Object *obj, void *event_info);
+void ct_detail_msg_ug_cb(void *data, Evas_Object *obj, void *event_info);
+void ct_detail_create_list_view(ct_detail_data *cdetail_d, Evas_Smart_Cb sel_cb, void *cb_data, int id_caller);
+int ct_detail_load_vcard_contact(ct_detail_data *cdetail_d, char *path);
+
+#endif //__CONTACTS_DETAIL_UTILS_H__
diff --git a/lib/details/ct-detail-view.c b/lib/details/ct-detail-view.c
new file mode 100755
index 0000000..9f89e00
--- /dev/null
+++ b/lib/details/ct-detail-view.c
@@ -0,0 +1,1833 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ui-gadget-module.h>
+
+#include <errno.h>
+#include <string.h>
+#include <vconf.h>
+#include <vconf-keys.h>
+#include <app.h>
+#include <unicode/udatpg.h>
+#include <unicode/ucal.h>
+#include <unicode/ustring.h>
+#include "phone.h"
+#include "ct-detail.h"
+#include "ct-detail-utils.h"
+#include "ct-detail-view.h"
+#include "ct-detail-history.h"
+#include "ct-input-view.h"
+
+enum DETAIL_ITC_TYPE {
+ DETAIL_ITC_NOTE = 0,
+ DETAIL_ITC_NUM_UTIL_BTN = 1,
+ DETAIL_ITC_RCS_NUM_UTIL_BTN = 2,
+ DETAIL_ITC_UTIL_BTN = 3,
+ DETAIL_ITC_ADDRBOOK = 4,
+ DETAIL_ITC_TYPED_DATA = 5,
+ DETAIL_ITC_NUMBER = DETAIL_ITC_TYPED_DATA,
+ DETAIL_ITC_EMAIL = DETAIL_ITC_TYPED_DATA,
+ DETAIL_ITC_URL = DETAIL_ITC_TYPED_DATA,
+ DETAIL_ITC_TITLE_BIG_TEXT = 6,
+ DETAIL_ITC_MESSENGER = DETAIL_ITC_TITLE_BIG_TEXT,
+ DETAIL_ITC_BIRTH = DETAIL_ITC_TITLE_BIG_TEXT,
+ DETAIL_ITC_RINGTONE = 7,
+ DETAIL_ITC_RELATIONSHIP,
+ DETAIL_ITC_NUMBER_DEF,
+ DETAIL_ITC_ADDRESS,
+ DETAIL_ITC_LINK_UNLINK,
+ DETAIL_ITC_UNLINK_POPUP,
+ DETAIL_ITC_EDIT_POPUP,
+ DETAIL_ITC_LINK_LIST,
+ DETAIL_ITC_LINK_LIST_SUB,
+ DETAIL_ITC_TITLE,
+ DETAIL_ITC_UTIL_1BTN,
+ DETAIL_ITC_BASEINFO_1TEXT_1ICON,
+ DETAIL_ITC_BASEINFO_1TEXT_2ICON,
+ DETAIL_ITC_BASEINFO_2TEXT_1ICON,
+ DETAIL_ITC_BASEINFO_2TEXT_2ICON,
+ DETAIL_ITC_BASEINFO_3TEXT_1ICON,
+ DETAIL_ITC_BASEINFO_3TEXT_2ICON,
+ DETAIL_ITC_MAX,
+};
+
+static Elm_Genlist_Item_Class detail_itcs[] = {
+ {.item_style="multiline/dialogue/2text"},
+ {.item_style="detail.3icon"},
+ {.item_style="detail.5icon"},
+ {.item_style="dialogue/bg/2icon"},
+ {.item_style="detail.title"},
+ {.item_style="dialogue.1title.1text"},
+ {.item_style="dialogue/2text.2"},
+ {.item_style="dialogue/2text.1icon.6"},
+ {.item_style="dialogue/2text.2"},
+ {.item_style="dialogue/1title.1text.1icon"},
+ {.item_style="dialogue/1title.1text.2"},
+ {.item_style="dialogue/bg/2icon"},
+ {.item_style="1text.2icon.2"},
+ {.item_style="1text.1icon.2"},
+ {.item_style="dialogue/1text/expandable"},
+ {.item_style="dialogue/1text.1icon.2/expandable2"},
+ {.item_style="dialogue/title"},
+ {.item_style="dialogue/bg/1icon"},
+ {.item_style="baseinfo.1text.1icon"},
+ {.item_style="baseinfo.1text.2icon"},
+ {.item_style="baseinfo.2text.1icon"},
+ {.item_style="baseinfo.2text.2icon"},
+ {.item_style="baseinfo.3text.1icon"},
+ {.item_style="baseinfo.3text.2icon"},
+};
+
+
+static char* detail_gl_2text_multiline_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ int type;
+ CTSvalue *value = data;
+
+ p_retv_if(NULL == value, NULL);
+
+ type = contacts_svc_value_get_type(value);
+ p_retvm_if(CTS_VALUE_COMPANY != type && CTS_VALUE_CONTACT_BASE_INFO != type, NULL, "Invalid type(%d)", type);
+
+ if (0 == strcmp(part, "elm.text.1")) {
+ if (CTS_VALUE_COMPANY == type)
+ return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_COMPANY));
+ else
+ return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_NOTE));
+ }
+ else if (0 == strcmp(part, "elm.text.2")) {
+ if (CTS_VALUE_COMPANY == type)
+ return SAFE_STRDUP(contacts_svc_value_get_str(value, CTS_COMPANY_VAL_NAME_STR));
+ else
+ return elm_entry_utf8_to_markup(contacts_svc_value_get_str(value, CTS_BASE_VAL_NOTE_STR));
+ }
+
+ return NULL;
+}
+
+static char* detail_gl_ringtone_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ const char *str;
+ CTSvalue *value = data;
+ p_retv_if(NULL == value, NULL);
+
+ if (0 == strcmp(part, "elm.text.1"))
+ return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_RINGTONE));
+ else if (0 == strcmp(part, "elm.text.2")) {
+ str = contacts_svc_value_get_str(value , CTS_BASE_VAL_RINGTONE_PATH_STR);
+ if (str && *str && 0 == access(str, F_OK))
+ return SAFE_STRDUP(ct_detail_get_ringtone_display_name(str));
+ else
+ return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_DEFAULT));
+ }
+ return NULL;
+}
+
+static void detail_ringtone_gl_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_detail_data *cdetail_d = data;
+ elm_genlist_item_selected_set(event_info, EINA_FALSE);
+ ct_detail_myfile_ringtone(cdetail_d);
+}
+
+static void detail_ringtone_cancel_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ ct_detail_data *cdetail_d = data;
+ CTSvalue *value;
+ p_retm_if(NULL == cdetail_d, "parameter(cdetail_d) is NULL");
+
+ ret = contacts_svc_struct_get_value(cdetail_d->contact, CTS_CF_BASE_INFO_VALUE, &value);
+ p_retm_if(CTS_SUCCESS != ret && CTS_ERR_NO_DATA != ret, "contacts_svc_struct_get_value() Failed(%d)", ret);
+
+ ret = contacts_svc_value_set_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR, NULL);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() Failed(%d)", ret);
+
+ cdetail_d->updated = true;
+ elm_genlist_item_update(cdetail_d->ringtone_item);
+}
+
+static Evas_Object* detail_gl_ringtone_icon_get(void *data, Evas_Object *obj, const char *part)
+{
+ const char *temp;
+ Evas_Object *icon;
+ Evas_Object *btn;
+ CTSvalue *value = data;
+ ct_detail_data *cdetail_d;
+ double scale;
+
+ cdetail_d = evas_object_data_get(obj, "cdetail_d");
+ p_retvm_if(NULL == cdetail_d, NULL, "evas_object_data_get() return NULL");
+
+ if (0 == cdetail_d->contact_id)
+ return NULL;
+
+ if (0 == strcmp(part, "elm.icon")) {
+ btn = elm_button_add(obj);
+ p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL");
+ evas_object_propagate_events_set(btn, EINA_FALSE);
+
+ scale = elm_scale_get();
+ evas_object_size_hint_min_set(btn, CT_DETAIL_RESET_BUTTON_SIZE * scale, CT_DETAIL_RESET_BUTTON_SIZE * scale);
+ evas_object_size_hint_max_set(btn, CT_DETAIL_RESET_BUTTON_SIZE * scale, CT_DETAIL_RESET_BUTTON_SIZE * scale);
+
+ icon = elm_icon_add(btn);
+ p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL");
+ elm_icon_resizable_set(icon, EINA_FALSE, EINA_FALSE);
+ elm_icon_file_set(icon, CTUI_IMG_ICON_RESET, NULL);
+ elm_object_part_content_set(btn, "icon", icon);
+
+ if(!cdetail_d->ug)
+ evas_object_smart_callback_add(btn, "clicked", detail_ringtone_cancel_cb, cdetail_d);
+
+ temp = contacts_svc_value_get_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR);
+ if (NULL == temp || '\0' == *temp)
+ elm_object_disabled_set(btn, EINA_TRUE);
+
+ return btn;
+ }
+ return NULL;
+}
+
+static char* detail_gl_relationship_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ CTSvalue *value = data;
+ if (0 == strcmp(part, "elm.text.1")) {
+ int type;
+ char *str_type = NULL;
+ const char *str_name = NULL;
+ char buf[PH_TEXT_SHORT_LEN];
+
+ type = contacts_svc_value_get_int(value, CTS_EXTEND_VAL_DATA1_INT);
+ if (RELATIONSHIP_TYPE_CUSTOM == type)
+ str_type = (char *)contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA3_STR);
+ if (NULL == str_type || '\0' == str_type)
+ str_type = (char *)T_(CT_GET_TEXT_RELATIONSHIP_TYPE, type);
+
+ str_name = contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA2_STR);
+ if (str_name && *str_name)
+ snprintf(buf, sizeof(buf), "%s %s", str_type, str_name);
+ else
+ snprintf(buf, sizeof(buf), "%s", str_type);
+ return strdup(buf);
+ }
+ else if (0 == strcmp(part, "elm.text.2")) {
+ return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_RELATIONSHIP));
+ }
+ return NULL;
+}
+
+static char *detail_gl_address_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ int val_type;
+ char buf[PH_TEXT_MAX_LEN];
+ const char *ret_str;
+ CTSvalue *value = data;
+
+ p_retv_if(NULL == data, NULL);
+
+ ret_str = NULL;
+ if (0 == strcmp(part, "elm.title")) {
+ val_type = contacts_svc_value_get_int(value, CTS_POSTAL_VAL_TYPE_INT);
+ return strdup(T_(CT_GET_TEXT_POSTAL_TYPE, val_type));
+ }
+ else if (0 == strcmp(part, "elm.text")) {
+ buf[0] = '\0';
+ ct_detail_get_full_addr(value, buf, sizeof(buf));
+ return elm_entry_utf8_to_markup(buf);
+ }
+ return NULL;
+}
+
+static char* detail_get_datetime_str(UDateFormat* formatter, int year, int mon, int day)
+{
+ time_t timer;
+ struct tm stime;
+ char *ret_str = NULL;
+ char formatted_str[PH_TEXT_SHORT_LEN];
+ int32_t formattedCapacity;
+ UChar formatted[PH_TEXT_SHORT_LEN];
+ UErrorCode status = U_ZERO_ERROR;
+
+ memset(&stime, 0, sizeof(struct tm));
+ stime.tm_year = year-1900;
+ stime.tm_mon = mon-1;
+ stime.tm_mday = day;
+ timer = mktime(&stime);
+
+ formattedCapacity = (int32_t)(sizeof(formatted)/sizeof((formatted)[0]));
+ udat_format(formatter, (UDate)timer*1000, formatted, formattedCapacity, NULL, &status);
+ p_retvm_if(U_FAILURE(status), NULL, "udat_format() Failed()");
+
+ u_austrcpy(formatted_str, formatted);
+ ret_str = g_strdup(formatted_str);
+
+ return ret_str;
+}
+
+static char* detail_gl_title_big_text_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ int type;
+ const char *ret_str;
+ CTSvalue *value = data;
+ ct_detail_data *cdetail_d = evas_object_data_get(obj, "cdetail_d");
+
+ p_retv_if(NULL == data, NULL);
+
+ type = contacts_svc_value_get_type(value);
+ p_retvm_if(CTS_ERR_ARG_NULL == type, NULL,
+ "contacts_svc_value_get_type() return CTS_ERR_ARG_NULL");
+
+ ret_str = NULL;
+ if (0 == strcmp(part, "elm.text.1")) {
+ int date, day, mon, year;
+
+ switch (type) {
+ case CTS_VALUE_EVENT:
+ date = contacts_svc_value_get_int(value, CTS_EVENT_VAL_DATE_INT);
+
+ day = date%100;
+ mon = (date%10000)/100;
+ year = date/10000;
+
+ p_retvm_if(mon < 1 || 12 < mon || day < 1 || 31 < day, NULL, "Invalid date(mon=%d,day=%d)",mon,day);
+ return detail_get_datetime_str(cdetail_d->formatter, year, mon, day);
+
+ case CTS_VALUE_MESSENGER:
+ ret_str = contacts_svc_value_get_str(value, CTS_MESSENGER_VAL_IM_ID_STR);
+ break;
+
+ default:
+ ERR("unknown type(%d)", type);
+ ret_str = NULL;
+ break;
+
+ }
+ }
+ else if (0 == strcmp(part, "elm.text.2")) {
+ int val_type;
+
+ switch (type) {
+ case CTS_VALUE_EVENT:
+ val_type = contacts_svc_value_get_int(value, CTS_EVENT_VAL_TYPE_INT);
+ ret_str = T_(CT_GET_TEXT_EVENT_TYPE, val_type);
+ break;
+
+ case CTS_VALUE_MESSENGER:
+ val_type = contacts_svc_value_get_int(value, CTS_MESSENGER_VAL_TYPE_INT);
+ ret_str = T_(CT_GET_TEXT_IM_TYPE, val_type);
+ break;
+
+ default:
+ ERR("unknown type(%d)", type);
+ ret_str = NULL;
+ break;
+
+ }
+ }
+ return SAFE_STRDUP(ret_str);
+}
+
+static Evas_Object *detail_gl_number_default_icon_get(void *data, Evas_Object *obj, const char *part)
+{
+ Evas_Object *ret_obj;
+
+ ret_obj = NULL;
+ if (0 == strcmp(part, "elm.icon")) {
+ Evas_Object *ico;
+
+ ico = elm_icon_add(obj);
+ p_retvm_if(NULL == ico, NULL, "elm_icon_add() return NULL");
+
+ elm_icon_file_set(ico, CTUI_IMG_CHECK, NULL);
+ evas_object_size_hint_aspect_set(ico, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+
+ ret_obj = ico;
+ }
+ return ret_obj;
+}
+
+static char *detail_gl_typed_data_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ int type;
+ int val_type;
+ char buf[PH_TEXT_MAX_LEN];
+ const char *ret_str;
+ CTSvalue *value = data;
+
+ p_retv_if(NULL == data, NULL);
+
+ type = contacts_svc_value_get_type(value);
+ p_retvm_if(CTS_ERR_ARG_NULL == type, NULL,
+ "contacts_svc_value_get_type() return CTS_ERR_ARG_NULL");
+
+ ret_str = NULL;
+ if (0 == strcmp(part, "elm.title")) {
+ int num_type_int;
+ switch (type) {
+ case CTS_VALUE_NUMBER:
+ num_type_int = contacts_svc_value_get_int(value, CTS_NUM_VAL_TYPE_INT);
+ ctui_get_number_type_str(num_type_int, buf, sizeof(buf));
+ ret_str = buf;
+ break;
+
+ case CTS_VALUE_EMAIL:
+ val_type = contacts_svc_value_get_int(value, CTS_EMAIL_VAL_TYPE_INT);
+ ret_str = T_(CT_GET_TEXT_EMAIL_TYPE, val_type);
+ break;
+
+ case CTS_VALUE_WEB:
+ val_type = contacts_svc_value_get_int(value, CTS_WEB_VAL_TYPE_INT);
+ ret_str = T_(CT_GET_TEXT_WEBSITE_TYPE, val_type);
+ break;
+
+ default:
+ ERR("unknown type(%d)", type);
+ ret_str = NULL;
+ break;
+
+ }
+ }
+ else if (0 == strcmp(part, "elm.text")) {
+ switch (type) {
+ case CTS_VALUE_NUMBER:
+ ret_str = contacts_svc_value_get_str(value, CTS_NUM_VAL_NUMBER_STR);
+ break;
+ case CTS_VALUE_EMAIL:
+ ret_str = contacts_svc_value_get_str(value, CTS_EMAIL_VAL_ADDR_STR);
+ break;
+ case CTS_VALUE_WEB:
+ ret_str = contacts_svc_value_get_str(value, CTS_WEB_VAL_ADDR_STR);
+ break;
+ default:
+ ERR("unknown type(%d)", type);
+ ret_str = NULL;
+ break;
+ }
+ }
+
+ return SAFE_STRDUP(ret_str);
+}
+
+static void detail_number_cb(CTSvalue *value, ct_detail_data *cdetail_d)
+{
+ const char *num_str;
+
+ if (cdetail_d->popup)
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+
+ num_str = contacts_svc_value_get_str(value, CTS_NUM_VAL_NUMBER_STR);
+ if (num_str && *num_str) {
+ int rotate;
+ cdetail_d->popup = elm_ctxpopup_add(cdetail_d->navi);
+ p_retm_if(NULL == cdetail_d->popup, "elm_ctxpopup_add() return NULL");
+
+ rotate = (int)evas_object_data_get(cdetail_d->navi, "phone_rotate");
+ if (0 == rotate || 180 == rotate)
+ elm_ctxpopup_direction_priority_set(cdetail_d->popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT);
+
+ evas_object_smart_callback_add(cdetail_d->popup, "dismissed", ct_detail_popup_hide_cb, cdetail_d);
+ evas_object_data_set(cdetail_d->popup, "cdetail_d", cdetail_d);
+
+ elm_ctxpopup_item_append(cdetail_d->popup, S_(PH_SYS_BODY_CALL), NULL,
+ ct_detail_voice_call_cb, num_str);
+ elm_ctxpopup_item_append(cdetail_d->popup, S_(PH_SYS_BODY_MESSAGE), NULL,
+ ct_detail_msg_ug_cb, num_str);
+ evas_object_move(cdetail_d->popup, cdetail_d->touch_x, cdetail_d->touch_y);
+ evas_object_show(cdetail_d->popup);
+ }
+}
+
+static void detail_gl_email_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ const char *email;
+ ct_detail_data *cdetail_d;
+ CTSvalue *value = data;
+ Elm_Object_Item *item = event_info;
+
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+
+ p_retm_if(NULL == value, "parameter(CTSstruct) is NULL");
+
+ cdetail_d = evas_object_data_get(obj, "cdetail_d");
+ p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL");
+
+ if(cdetail_d->ug)
+ return;
+
+ email = contacts_svc_value_get_str(value, CTS_EMAIL_VAL_ADDR_STR);
+ cdetail_d->child_ug = ct_detail_email_ug(cdetail_d->ug, email, NULL,
+ ctui_destroy_child_ug, &cdetail_d->child_ug);
+}
+
+static void detail_gl_messenger_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ CTSvalue *value;
+ Elm_Object_Item *item = event_info;
+
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+
+ value = data;
+ p_retm_if(NULL == value, "parameter(CTSstruct) is NULL");
+
+ ERR("detail_gl_messenger_sel() not implemented");
+}
+
+static char* detail_gl_ab_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ ct_detail_data *cdetail_d = data;
+ char display[PH_TEXT_MAX_LEN];
+
+ if (0 == strcmp(part, "elm.text")) {
+ display[0] = '\0';
+ if (cdetail_d->base_ab_name)
+ snprintf(display, sizeof(display), T_(CT_GET_TEXT_BASIC, CTTEXT_SAVED_IN), cdetail_d->base_ab_name);
+ return strdup(display);
+ }
+ return NULL;
+}
+
+
+static char* detail_gl_title_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ char *display = data;
+ if (0 == strcmp(part, "elm.text") && display && *display)
+ return strdup(display);
+ return NULL;
+}
+
+static void detail_gl_number_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ CTSvalue *value;
+ ct_detail_data *cdetail_d;
+ Elm_Object_Item *item = event_info;
+
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+
+ value = data;
+ p_retm_if(NULL == value, "parameter(CTSstruct) is NULL");
+
+ cdetail_d = evas_object_data_get(obj, "cdetail_d");
+ p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL");
+
+ if(cdetail_d->ug)
+ return;
+
+ detail_number_cb(value, cdetail_d);
+}
+
+static void detail_send_name_card_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int rotate;
+ ct_detail_data *cdetail_d = data;
+ p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL");
+
+ if (cdetail_d->popup)
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+
+ cdetail_d->popup = elm_ctxpopup_add(cdetail_d->navi);
+ p_retm_if(NULL == cdetail_d->popup, "elm_ctxpopup_add() return NULL");
+
+ rotate = (int)evas_object_data_get(cdetail_d->navi, "phone_rotate");
+ if (0 == rotate || 180 == rotate)
+ elm_ctxpopup_direction_priority_set(cdetail_d->popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT);
+
+ evas_object_smart_callback_add(cdetail_d->popup, "dismissed", ct_detail_popup_hide_cb, cdetail_d);
+ elm_ctxpopup_item_append(cdetail_d->popup, S_(PH_SYS_BODY_MESSAGE), NULL,
+ ct_detail_send_via_msg, cdetail_d);
+ elm_ctxpopup_item_append(cdetail_d->popup, S_(CT_SYS_BODY_EMAIL), NULL,
+ ct_detail_send_via_email, cdetail_d);
+ elm_ctxpopup_item_append(cdetail_d->popup, S_(CT_SYS_BODY_BLUETOOTH), NULL,
+ ct_detail_send_via_bluetooth, cdetail_d);
+
+ phone_move_ctxpopup(cdetail_d->popup, obj);
+ evas_object_show(cdetail_d->popup);
+}
+
+static void detail_list_gl_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ ct_detail_data *cdetail_d = data;
+ ct_contact_list *contact;
+ Elm_Object_Item *item = event_info;
+
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+
+ if (cdetail_d->person_id) {
+ contact = elm_object_item_data_get(item);
+ p_retm_if(NULL == contact, "elm_object_item_data_get() returns NULL");
+
+ ret = contacts_svc_link_person(cdetail_d->person_id, contact->id);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_link_person() Failed(%d)", ret);
+
+ if (CTS_SUCCESS == ret)
+ phone_show_tickernoti(S_(CT_SYS_POP_SUCCESS));
+ else
+ phone_show_tickernoti(S_(PH_SYS_POP_FAILED));
+
+ elm_naviframe_item_pop(cdetail_d->navi);
+ }
+}
+
+static void detail_link_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_detail_data *cdetail_d = data;
+ ct_detail_create_list_view(cdetail_d, detail_list_gl_sel, cdetail_d, cdetail_d->person_id);
+}
+
+typedef struct {
+ int ct_id;
+ Eina_Bool checked;
+ Elm_Object_Item *item;
+} ct_detail_person_data;
+
+static void detail_unlink_popup_cancel_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_detail_data *cdetail_d = data;
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+}
+
+static void detail_unlink_popup_ok_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret = CTS_SUCCESS;
+ Evas_Object *genlist;
+ Elm_Object_Item *item;
+ ct_detail_data *cdetail_d = data;
+ ct_detail_person_data *person_info;
+
+ genlist = cdetail_d->genlist_unlink;
+ item = elm_genlist_first_item_get(genlist);
+ while (item) {
+ person_info = elm_object_item_data_get(item);
+ if (person_info && EINA_TRUE == person_info->checked) {
+ ret = contacts_svc_unlink_person(cdetail_d->person_id, person_info->ct_id);
+ if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_unlink_person() Failed(%d)", ret);
+ break;
+ }
+ }
+ item = elm_genlist_item_next_get(item);
+ }
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+
+ if (CTS_SUCCESS == ret)
+ phone_show_tickernoti(S_(CT_SYS_POP_SUCCESS));
+ else
+ phone_show_tickernoti(S_(PH_SYS_POP_FAILED));
+}
+
+static void detail_unlink_select_all_update(Evas_Object *genlist)
+{
+ Eina_Bool checked;
+ Eina_Bool all_check;
+ Elm_Object_Item *item;
+ Evas_Object *select_all_check;
+ ct_detail_person_data *person_info;
+
+ select_all_check = evas_object_data_get(genlist, "check");
+ p_retm_if(NULL == select_all_check, "evas_object_data_get() return NULL");
+
+ all_check = elm_check_state_get(select_all_check);
+
+ checked = EINA_TRUE;
+ item = elm_genlist_first_item_get(genlist);
+ while (item) {
+ person_info = elm_object_item_data_get(item);
+ p_retm_if(NULL == person_info, "elm_object_item_data_get() return NULL");
+ if (EINA_FALSE == person_info->checked) {
+ checked = EINA_FALSE;
+ break;
+ }
+ item = elm_genlist_item_next_get(item);
+ }
+
+ if (all_check != checked)
+ elm_check_state_set(select_all_check, checked);
+}
+
+void detail_unlink_select_all(void *data, Eina_Bool checked)
+{
+ Elm_Object_Item *item;
+ ct_detail_person_data *person_info;
+ ct_detail_data *cdetail_d = data;
+
+ item = elm_genlist_first_item_get(cdetail_d->genlist_unlink);
+ while (item) {
+ person_info = elm_object_item_data_get(item);
+ person_info->checked = checked;
+ item = elm_genlist_item_next_get(item);
+ }
+ elm_genlist_realized_items_update(cdetail_d->genlist_unlink);
+}
+
+static void detail_gl_unlink_item_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_detail_person_data *person_info = data;
+ elm_genlist_item_selected_set(event_info, EINA_FALSE);
+
+ person_info->checked = !person_info->checked;
+ if (person_info->item)
+ elm_genlist_item_update(person_info->item);
+
+ detail_unlink_select_all_update(obj);
+}
+
+static void detail_unlink_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GSList *cursor;
+ Evas_Object *box;
+ Evas_Object *check;
+ Evas_Object *genlist;
+ Evas_Object *popup;
+ Evas_Object *layout;
+ Elm_Object_Item *item;
+ ct_detail_data *cdetail_d = data;
+ ct_detail_person_data *person_info;
+ Evas_Object *btn1, *btn2;
+
+ popup = elm_popup_add(cdetail_d->navi);
+ p_retm_if(NULL == popup, "elm_popup_add() return NULL");
+ elm_object_style_set(popup, "liststyle");
+ btn1 = elm_button_add(popup);
+ elm_object_text_set(btn1, S_(PH_SYS_SK_YES));
+ elm_object_part_content_set(popup, "button1", btn1);
+ elm_object_style_set(btn1, "popup_button/default");
+ evas_object_smart_callback_add(btn1, "clicked", detail_unlink_popup_ok_btn_cb, cdetail_d);
+
+ btn2 = elm_button_add(popup);
+ elm_object_text_set(btn2, S_(PH_SYS_SK_NO));
+ elm_object_part_content_set(popup, "button2", btn2);
+ elm_object_style_set(btn2, "popup_button/default");
+ evas_object_smart_callback_add(btn2, "clicked", detail_unlink_popup_cancel_btn_cb, cdetail_d);
+ elm_object_part_text_set(popup, "title,text", T_(CT_GET_TEXT_BASE_OP, CTTEXT_UNLINK));
+ evas_object_show(popup);
+ cdetail_d->popup = popup;
+
+ box = elm_box_add(popup);
+ p_retm_if(NULL == box, "elm_box_add() return NULL");
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
+ evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+
+ layout = phone_create_select_all(box, S_(PH_SYS_BODY_SELECT_ALL), detail_unlink_select_all, cdetail_d);
+ elm_box_pack_start(box, layout);
+
+ check = elm_object_part_content_get(layout, "elm.icon");
+
+ genlist = elm_genlist_add(box);
+ p_retm_if(NULL == genlist, "elm_genlist_add() return NULL");
+ evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ cdetail_d->genlist_unlink = genlist;
+ evas_object_data_set(genlist, "check", check);
+
+ for (cursor=cdetail_d->person_list;cursor;cursor=cursor->next) {
+ int ct_id = (int)cursor->data;
+
+ person_info = calloc(1, sizeof(ct_detail_person_data));
+ person_info->ct_id = ct_id;
+
+ item = elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_UNLINK_POPUP], person_info,
+ NULL, ELM_GENLIST_ITEM_NONE, detail_gl_unlink_item_sel, person_info);
+
+ person_info->item = item;
+ }
+
+ evas_object_show(genlist);
+ elm_box_pack_end(box, genlist);
+ elm_object_content_set(popup, box);
+}
+
+static char* detail_gl_unlink_popup_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ int ret;
+ CTSvalue *value;
+
+ ct_detail_person_data *person_info = data;
+ p_retvm_if(NULL == person_info, NULL, "person_info is NULL");
+
+ if (0 == strcmp(part, "elm.text") || 0 == strcmp(part, "elm.text.1"))
+ {
+ char display[PH_TEXT_MAX_LEN];
+ CTSstruct *contact;
+
+ ret = contacts_svc_get_contact(person_info->ct_id, &contact);
+ p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_struct_get() Failed(%d)", ret);
+
+ ret = contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value);
+ if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_struct_get_value() Failed(%d)", ret);
+ contacts_svc_struct_free(contact);
+ return NULL;
+ }
+
+ ctui_get_display_name(value, display, sizeof(display));
+ contacts_svc_struct_free(contact);
+
+ if (*display)
+ return strdup(display);
+ }
+ else if (0 == strcmp(part, "elm.text.2"))
+ {
+ return SAFE_STRDUP(T_(CT_GET_TEXT_ACC_TYPE, 0));
+ }
+ return NULL;
+}
+
+static void detail_unlink_check_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ detail_unlink_select_all_update(data);
+}
+
+static Evas_Object* detail_gl_unlink_popup_icon_get(void *data, Evas_Object *obj, const char *part)
+{
+ ct_detail_person_data *person_info = data;
+ p_retvm_if(NULL == person_info, NULL, "person_info is NULL");
+
+ if (0 == strcmp(part, "elm.icon.1")) {
+ Evas_Object *check;
+ check = elm_check_add(obj);
+ p_retvm_if(NULL == check, NULL, "elm_check_add() return NULL");
+
+ elm_check_state_pointer_set(check, &person_info->checked);
+ evas_object_propagate_events_set(check, EINA_FALSE);
+ evas_object_smart_callback_add(check, "changed", detail_unlink_check_changed_cb, obj);
+
+ return check;
+ }
+
+ else if (0 == strcmp(part, "elm.icon.2") || 0 == strcmp(part, "elm.icon")) {
+ int type;
+ char *icon_path;
+ Evas_Object *icon;
+
+ type = CTS_ADDRESSBOOK_TYPE_INTERNAL;
+ icon_path = ctui_get_addrbook_icon_path(type);
+ if (icon_path && *icon_path) {
+ icon = elm_icon_add(obj);
+ p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL");
+
+ elm_icon_file_set(icon, icon_path, NULL);
+ evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ return icon;
+ }
+ }
+ return NULL;
+}
+static void detail_gl_unlink_popup_del(void *data, Evas_Object *obj)
+{
+ ct_detail_person_data *person_info = data;
+ p_retm_if(NULL == person_info, "person_info is NULL");
+
+ free(person_info);
+}
+
+static Evas_Object *detail_gl_link_unlink_icon_get(void *data, Evas_Object *obj,
+ const char *part)
+{
+ ct_detail_data *cdetail_d = data;
+ p_retvm_if(NULL == cdetail_d, NULL, "parameter(ct_detail_data) is NULL");
+
+ if (0 == strcmp(part, "elm.icon.1")) {
+ Evas_Object *btn;
+
+ btn = ctui_create_btn(obj, T_(CT_GET_TEXT_BASE_OP, CTTEXT_LINK_CONTACTS));
+ p_retvm_if(NULL == btn, NULL, "ctui_create_btn() return NULL");
+
+ if(!cdetail_d->ug)
+ evas_object_smart_callback_add(btn, "clicked", detail_link_cb, cdetail_d);
+
+ return btn;
+ }
+ else if (0 == strcmp(part, "elm.icon.2")) {
+ Evas_Object *btn;
+
+ btn = ctui_create_btn(obj, T_(CT_GET_TEXT_BASE_OP, CTTEXT_UNLINK));
+ p_retvm_if(NULL == btn, NULL, "ctui_create_btn() return NULL");
+
+ if (cdetail_d->person_list && 1 < g_slist_length(cdetail_d->person_list)) {
+
+ if(!cdetail_d->ug)
+ evas_object_smart_callback_add(btn, "clicked", detail_unlink_cb, cdetail_d);
+
+ }
+ else
+ elm_object_disabled_set(btn, EINA_TRUE);
+ return btn;
+ }
+ return NULL;
+}
+
+
+static Evas_Object *detail_gl_util_btn_icon_get(void *data, Evas_Object *obj,
+ const char *part)
+{
+ Evas_Object *ret_obj;
+ ct_detail_data *cdetail_d = data;
+ p_retvm_if(NULL == cdetail_d, NULL, "parameter(ct_detail_data) is NULL");
+
+ ret_obj = NULL;
+ if (0 == strcmp(part, "elm.icon.1") || 0 == strcmp(part, "elm.icon")) {
+ return NULL;
+ }
+ else if (0 == strcmp(part, "elm.icon.2")) {
+ Evas_Object *btn;
+ btn = ctui_create_btn(obj, T_(CT_GET_TEXT_BASE_OP, CTTEXT_SEND_NAME_CARD));
+ p_retvm_if(NULL == btn, NULL, "ctui_create_btn() return NULL");
+
+ if(!cdetail_d->ug)
+ evas_object_smart_callback_add(btn, "clicked", detail_send_name_card_cb, cdetail_d);
+
+ ret_obj = btn;
+ }
+ return ret_obj;
+}
+
+static void detail_gl_website_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ const char *website;
+ CTSvalue *value = data;
+ Elm_Object_Item *item = event_info;
+ int ret;
+ service_h service;
+
+ p_retm_if(NULL == value, "parameter(value) is NULL");
+
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+ website = contacts_svc_value_get_str(value, CTS_WEB_VAL_ADDR_STR);
+ if (website && *website) {
+ ret = service_create(&service);
+ p_retm_if(SERVICE_ERROR_NONE != ret, "service_create() Failed(%d)", ret);
+ service_set_operation(service, SERVICE_OPERATION_VIEW );
+ service_set_mime(service, "text/html");
+ service_set_uri(service, website);
+ service_send_launch_request(service, NULL, NULL);
+ service_destroy(service);
+ }
+}
+
+static char* detail_gl_link_list_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ return strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_ALL_LINKED_CONTACTS));
+}
+
+static char* detail_gl_link_list_sub_label_get(void *data, Evas_Object *obj, const char *part)
+{
+ int contact_id = (int)data;
+ if (0 == strcmp(part, "elm.text")) {
+ int ret;
+ char buf[PH_TEXT_SHORT_LEN];
+ CTSstruct *contact;
+ CTSvalue *value;
+
+ ret = contacts_svc_get_contact(contact_id, &contact);
+ p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_get_contact() Failed(%d)", ret);
+
+ ret = contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value);
+ if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_struct_get_value() Failed(%d)", ret);
+ contacts_svc_struct_free(contact);
+ return NULL;
+ }
+
+ buf[0] = '\0';
+ ctui_get_display_name(value, buf, sizeof(buf));
+ contacts_svc_struct_free(contact);
+
+ if (*buf)
+ return strdup(buf);
+ }
+
+ return NULL;
+}
+
+static Evas_Object* detail_gl_link_list_sub_icon_get(void *data, Evas_Object *obj, const char *part)
+{
+ if (0 == strcmp(part, "elm.icon")) {
+ int type;
+ char *icon_path;
+ Evas_Object *icon;
+
+ type = CTS_ADDRESSBOOK_TYPE_INTERNAL;
+ icon_path = ctui_get_addrbook_icon_path(type);
+ if (icon_path && *icon_path) {
+ icon = elm_icon_add(obj);
+ p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL");
+
+ elm_icon_file_set(icon, icon_path, NULL);
+ evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ return icon;
+ }
+ }
+ return NULL;
+}
+
+static void detail_filemanager_status_changed_cb(keynode_t *key, void *data)
+{
+ Elm_Object_Item *item_ringtone = data;
+ p_retm_if(NULL == item_ringtone, "parameter(item_ringtone) is NULL");
+ elm_genlist_item_update(item_ringtone);
+}
+
+static void detail_view_delete_cb(void *data, Evas *e, Evas_Object *obj,
+ void *event_info)
+{
+ PH_FN_CALL;
+ int ret;
+ ct_detail_data *cdetail_d = data;
+
+ if (cdetail_d->popup)
+ evas_object_del(cdetail_d->popup);
+
+ if (cdetail_d->noc)
+ evas_object_del(cdetail_d->noc);
+
+ if (cdetail_d->genlist)
+ evas_object_del(cdetail_d->genlist);
+
+ if (cdetail_d->history_genlist)
+ evas_object_del(cdetail_d->history_genlist);
+
+ if (cdetail_d->th) {
+ elm_theme_extension_del(cdetail_d->th, DETAIL_THEME_EDJ);
+ elm_theme_free(cdetail_d->th);
+ }
+
+ ct_detail_history_free_list(cdetail_d);
+
+ ct_detail_delete_namecards(cdetail_d);
+
+ ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE,
+ ct_detail_contacts_changed, cdetail_d);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret);
+ ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_LINK_CHANGE,
+ ct_detail_link_changed, cdetail_d);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret);
+ ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_PLOG_CHANGE,
+ ct_detail_history_changed_cb, cdetail_d);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret);
+
+ ret = vconf_ignore_key_changed(VCONFKEY_FILEMANAGER_DB_STATUS, detail_filemanager_status_changed_cb);
+ p_warn_if(-1 == ret, "vconf_ignore_key_changed() Failed");
+
+ if (cdetail_d->updated)
+ contacts_svc_update_contact(cdetail_d->contact);
+
+ contacts_svc_struct_free(cdetail_d->contact);
+ cdetail_d->contact = NULL;
+
+ free(cdetail_d->vcard);
+ cdetail_d->vcard = NULL;
+ free(cdetail_d->base_ab_name);
+ cdetail_d->base_ab_name = NULL;
+
+ evas_object_data_del(cdetail_d->navi, "cdetail_d");
+
+ g_slist_free(cdetail_d->person_list);
+ cdetail_d->person_list = NULL;
+
+ if (cdetail_d->formatter)
+ udat_close(cdetail_d->formatter);
+ cdetail_d->formatter = NULL;
+
+ if (cdetail_d->child_ug)
+ ug_destroy(cdetail_d->child_ug);
+
+ if (cdetail_d->has_input)
+ cdetail_d->has_detail = false;
+ else
+ free(cdetail_d);
+
+ PH_FN_END;
+}
+
+static inline void detail_create_itcs()
+{
+ detail_itcs[DETAIL_ITC_TYPED_DATA].func.text_get = detail_gl_typed_data_label_get;
+
+ detail_itcs[DETAIL_ITC_NUMBER_DEF].func.text_get = detail_gl_typed_data_label_get;
+ detail_itcs[DETAIL_ITC_NUMBER_DEF].func.content_get = detail_gl_number_default_icon_get;
+
+ detail_itcs[DETAIL_ITC_TITLE_BIG_TEXT].func.text_get = detail_gl_title_big_text_label_get;
+
+ detail_itcs[DETAIL_ITC_ADDRESS].func.text_get = detail_gl_address_label_get;
+
+ detail_itcs[DETAIL_ITC_NOTE].func.text_get = detail_gl_2text_multiline_label_get;
+
+ detail_itcs[DETAIL_ITC_RINGTONE].func.text_get = detail_gl_ringtone_label_get;
+ detail_itcs[DETAIL_ITC_RINGTONE].func.content_get = detail_gl_ringtone_icon_get;
+
+ detail_itcs[DETAIL_ITC_RELATIONSHIP].func.text_get = detail_gl_relationship_label_get;
+
+ detail_itcs[DETAIL_ITC_NUM_UTIL_BTN].func.content_get = ct_detail_gl_number_util_icon_get;
+
+ detail_itcs[DETAIL_ITC_RCS_NUM_UTIL_BTN].func.content_get = ct_detail_gl_number_util_icon_get;
+
+ detail_itcs[DETAIL_ITC_UTIL_BTN].func.content_get = detail_gl_util_btn_icon_get;
+
+ detail_itcs[DETAIL_ITC_UTIL_1BTN].func.content_get = detail_gl_util_btn_icon_get;
+
+ detail_itcs[DETAIL_ITC_ADDRBOOK].func.text_get = detail_gl_ab_label_get;
+
+ detail_itcs[DETAIL_ITC_LINK_UNLINK].func.content_get = detail_gl_link_unlink_icon_get;
+
+ detail_itcs[DETAIL_ITC_UNLINK_POPUP].func.text_get = detail_gl_unlink_popup_label_get;
+ detail_itcs[DETAIL_ITC_UNLINK_POPUP].func.content_get = detail_gl_unlink_popup_icon_get;
+ detail_itcs[DETAIL_ITC_UNLINK_POPUP].func.del = detail_gl_unlink_popup_del;
+
+ detail_itcs[DETAIL_ITC_EDIT_POPUP].func.text_get = detail_gl_unlink_popup_label_get;
+ detail_itcs[DETAIL_ITC_EDIT_POPUP].func.content_get = detail_gl_unlink_popup_icon_get;
+ detail_itcs[DETAIL_ITC_EDIT_POPUP].func.del = detail_gl_unlink_popup_del;
+
+ detail_itcs[DETAIL_ITC_LINK_LIST].func.text_get = detail_gl_link_list_label_get;
+
+ detail_itcs[DETAIL_ITC_LINK_LIST_SUB].func.text_get = detail_gl_link_list_sub_label_get;
+ detail_itcs[DETAIL_ITC_LINK_LIST_SUB].func.content_get = detail_gl_link_list_sub_icon_get;
+
+ detail_itcs[DETAIL_ITC_TITLE].func.text_get = detail_gl_title_label_get;
+
+ detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_1ICON].func.text_get = ct_detail_gl_base_info_label_get;
+ detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_1ICON].func.content_get = ct_detail_gl_base_info_icon_get;
+
+ detail_itcs[DETAIL_ITC_BASEINFO_2TEXT_1ICON].func.text_get = ct_detail_gl_base_info_label_get;
+ detail_itcs[DETAIL_ITC_BASEINFO_2TEXT_1ICON].func.content_get = ct_detail_gl_base_info_icon_get;
+
+ detail_itcs[DETAIL_ITC_BASEINFO_3TEXT_1ICON].func.text_get = ct_detail_gl_base_info_label_get;
+ detail_itcs[DETAIL_ITC_BASEINFO_3TEXT_1ICON].func.content_get = ct_detail_gl_base_info_icon_get;
+
+ detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_2ICON].func.text_get = ct_detail_gl_base_info_label_get;
+ detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_2ICON].func.content_get = ct_detail_gl_base_info_icon_get;
+
+ detail_itcs[DETAIL_ITC_BASEINFO_2TEXT_2ICON].func.text_get = ct_detail_gl_base_info_label_get;
+ detail_itcs[DETAIL_ITC_BASEINFO_2TEXT_2ICON].func.content_get = ct_detail_gl_base_info_icon_get;
+
+ detail_itcs[DETAIL_ITC_BASEINFO_3TEXT_2ICON].func.text_get = ct_detail_gl_base_info_label_get;
+ detail_itcs[DETAIL_ITC_BASEINFO_3TEXT_2ICON].func.content_get = ct_detail_gl_base_info_icon_get;
+}
+
+#ifdef _CT_LINK
+static void detail_genlist_append_separator_line_10px(Evas_Object *genlist)
+{
+ static Elm_Genlist_Item_Class itc = { .item_style="dialogue/separator/11/with_line" };
+
+ Elm_Object_Item *item;
+ item = elm_genlist_item_append(genlist, &itc, NULL, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+}
+#endif
+
+static void detail_genlist_append_separator_line(Evas_Object *genlist)
+{
+ static Elm_Genlist_Item_Class itc_separator_1px = { .item_style="dialogue/separator/1/with_line" };
+
+ Elm_Object_Item *item;
+ item = elm_genlist_item_append(genlist, &itc_separator_1px, NULL, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+}
+
+static void detail_fill_list(Evas_Object *genlist, Elm_Genlist_Item_Class *itc, GSList *list, Evas_Smart_Cb func)
+{
+ GSList *cursor;
+ Elm_Object_Item *item;
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ item = elm_genlist_item_append(genlist, itc, cursor->data, NULL,
+ ELM_GENLIST_ITEM_NONE, func, cursor->data);
+ if (NULL == func)
+ elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ }
+}
+
+static void detail_fill_number_list(Evas_Object *genlist, GSList *list, int default_num_id)
+{
+ GSList *cursor;
+
+ if (g_slist_length(list) < 2)
+ return;
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ if (default_num_id != 0 && default_num_id == contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_ID_INT))
+ continue;
+
+ elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_NUMBER], cursor->data, NULL,
+ ELM_GENLIST_ITEM_NONE, detail_gl_number_sel, cursor->data);
+ }
+}
+
+#ifdef _CT_LINK
+static void detail_gl_link_list_item_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ Elm_Object_Item *item = event_info;
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+
+ if (EINA_TRUE == elm_genlist_item_expanded_get(item))
+ elm_genlist_item_expanded_set(item, EINA_FALSE);
+ else
+ elm_genlist_item_expanded_set(item, EINA_TRUE);
+}
+#endif
+
+static void detail_gl_link_list_exp(void *data, Evas_Object *obj, void *event_info)
+{
+ GSList *cursor;
+ Evas_Object *genlist = obj;
+ Elm_Object_Item *it_parent = event_info;
+ Elm_Object_Item *item;
+ ct_detail_data *cdetail_d = data;
+
+ for (cursor=cdetail_d->person_list;cursor;cursor=cursor->next) {
+ item = elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_LINK_LIST_SUB],
+ cursor->data, it_parent, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_NONE);
+ }
+}
+
+static void detail_gl_link_list_con(void *data, Evas_Object *obj, void *event_info)
+{
+ Elm_Object_Item *item = event_info;
+ elm_genlist_item_subitems_clear(item);
+}
+
+Elm_Genlist_Item_Class* ct_detail_get_baseinfo_item_class(CTSstruct *contact)
+{
+ int cnt = 0;
+ const char *img = NULL;
+ char str_main[PH_TEXT_SHORT_LEN];
+ char str_sub1[PH_TEXT_SHORT_LEN];
+ char str_sub2[PH_TEXT_SHORT_LEN];
+ CTSvalue *value;
+
+ str_main[0] = '\0';
+ value = NULL;
+ contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &value);
+ if (value)
+ ct_detail_get_first_mid_last_name(value, str_main, sizeof(str_main));
+
+ str_sub1[0] = '\0';
+ ct_detail_get_extra_name(contact, str_sub1, sizeof(str_sub1));
+
+ str_sub2[0] = '\0';
+ value = NULL;
+ contacts_svc_struct_get_value(contact, CTS_CF_COMPANY_VALUE, &value);
+ if (value)
+ ct_detail_get_company_str(value, str_sub2, sizeof(str_sub2));
+
+ value = NULL;
+ contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &value);
+ if (value)
+ img = contacts_svc_value_get_str(value, CTS_BASE_VAL_IMG_PATH_STR);
+
+ if (*str_main)
+ cnt++;
+ if (*str_sub1)
+ cnt++;
+ if (*str_sub2)
+ cnt++;
+ if (img && *img) cnt += 10;
+
+ switch (cnt) {
+ case 1: return &detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_1ICON];
+ case 2: return &detail_itcs[DETAIL_ITC_BASEINFO_2TEXT_1ICON];
+ case 3: return &detail_itcs[DETAIL_ITC_BASEINFO_3TEXT_1ICON];
+ case 11: return &detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_2ICON];
+ case 12: return &detail_itcs[DETAIL_ITC_BASEINFO_2TEXT_2ICON];
+ case 13: return &detail_itcs[DETAIL_ITC_BASEINFO_3TEXT_2ICON];
+ default:
+ if (10 <= cnt)
+ return &detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_2ICON];
+ else
+ return &detail_itcs[DETAIL_ITC_BASEINFO_1TEXT_1ICON];
+ }
+}
+
+API Evas_Object* ctui_detail_genlist_update(ct_detail_data *cdetail_d)
+{
+ PH_FN_CALL;
+ int ret;
+ GSList *list;
+ Evas_Object *genlist;
+ const char *value_data;
+ CTSvalue *baseinfo = NULL;
+ CTSstruct *contact = cdetail_d->contact;
+ Elm_Object_Item *item;
+ CTSvalue *value;
+ int default_num_id;
+ bool need_separator;
+
+ // Create genlist
+ if (NULL == cdetail_d->genlist) {
+ genlist = elm_genlist_add(cdetail_d->layout);
+ elm_object_style_set(genlist, "dialogue");
+ cdetail_d->genlist = genlist;
+ evas_object_event_callback_add(genlist, EVAS_CALLBACK_MOUSE_UP, ct_detail_mouseup, cdetail_d);
+ evas_object_data_set(genlist, "cdetail_d", cdetail_d);
+ elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
+
+ evas_object_smart_callback_add(genlist, "expanded", detail_gl_link_list_exp, cdetail_d);
+ evas_object_smart_callback_add(genlist, "contracted", detail_gl_link_list_con, NULL);
+ elm_object_theme_set(genlist, cdetail_d->th);
+ }
+ else {
+ genlist = cdetail_d->genlist;
+ elm_genlist_clear(genlist);
+
+ ret = vconf_ignore_key_changed(VCONFKEY_FILEMANAGER_DB_STATUS, detail_filemanager_status_changed_cb);
+ p_warn_if(-1 == ret, "vconf_ignore_key_changed() Failed");
+ }
+
+ item = elm_genlist_item_append(genlist, ct_detail_get_baseinfo_item_class(cdetail_d->contact), cdetail_d, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ evas_object_data_set(genlist, "base_info", item);
+
+ contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &baseinfo);
+
+ // number list
+ list = NULL;
+ contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list);
+ value = ct_detail_get_default_number(list);
+ default_num_id = 0;
+ if (value) {
+ default_num_id = contacts_svc_value_get_int(value, CTS_NUM_VAL_ID_INT);
+
+ elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_NUM_UTIL_BTN], value, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ detail_genlist_append_separator_line(genlist);
+#ifdef _CT_RCS
+ elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_RCS_NUM_UTIL_BTN], value, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+#endif
+ elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_NUMBER_DEF], value, NULL,
+ ELM_GENLIST_ITEM_NONE, detail_gl_number_sel, value);
+ }
+ detail_fill_number_list(genlist, list, default_num_id);
+ if (default_num_id)
+ cdetail_d->has_number = true;
+
+ // email list
+ list=NULL;
+ contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list);
+
+ if(!cdetail_d->ug)
+ detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_EMAIL], list, detail_gl_email_sel);
+ else
+ detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_EMAIL], list, NULL);
+
+ // POSTAL list
+ list=NULL;
+ contacts_svc_struct_get_list(contact, CTS_CF_POSTAL_ADDR_LIST, &list);
+ detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_ADDRESS], list, NULL);
+
+ // instant messenger list
+ list=NULL;
+ contacts_svc_struct_get_list(contact, CTS_CF_MESSENGER_LIST, &list);
+ if (list)
+ elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_TITLE], T_(CT_GET_TEXT_BASIC ,CTTEXT_INSTANT_MESSENGER),
+ NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_MESSENGER], list, detail_gl_messenger_sel);
+
+ need_separator = true;
+
+ // website
+ list=NULL;
+ contacts_svc_struct_get_list(contact, CTS_CF_WEB_ADDR_LIST, &list);
+ if (list) {
+ need_separator = false;
+ ctui_genlist_append_separator_20px_with_line(genlist);
+
+ if(!cdetail_d->ug)
+ detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_URL], list, detail_gl_website_sel);
+ else
+ detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_URL], list, NULL);
+
+ }
+
+ value = ct_detail_get_relationship(contact);
+ if (value) {
+ if (need_separator) {
+ need_separator = false;
+ ctui_genlist_append_separator_20px_with_line(genlist);
+ }
+ elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_RELATIONSHIP], value, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ }
+
+ // TODO: Fixme - Relationship
+
+ // event list
+ list=NULL;
+ contacts_svc_struct_get_list(contact, CTS_CF_EVENT_LIST, &list);
+ if (list && need_separator) {
+ need_separator = false;
+ ctui_genlist_append_separator_20px_with_line(genlist);
+ }
+ detail_fill_list(genlist, &detail_itcs[DETAIL_ITC_BIRTH], list, NULL);
+
+ // note
+ if (baseinfo) {
+ value_data = contacts_svc_value_get_str(baseinfo, CTS_BASE_VAL_NOTE_STR);
+ if (value_data && *value_data) {
+ if (need_separator) {
+ need_separator = false;
+ ctui_genlist_append_separator_20px_with_line(genlist);
+ }
+ item = elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_NOTE], baseinfo, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+ }
+ }
+
+ if (cdetail_d->contact_id) {
+ ctui_genlist_append_separator_20px_with_line(genlist);
+
+ // Ringtone
+ cdetail_d->ringtone_item = elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_RINGTONE], baseinfo, NULL,
+ ELM_GENLIST_ITEM_NONE, detail_ringtone_gl_sel, cdetail_d);
+ if (0 == cdetail_d->contact_id)
+ elm_genlist_item_select_mode_set(cdetail_d->ringtone_item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
+
+ ret = vconf_notify_key_changed(VCONFKEY_FILEMANAGER_DB_STATUS, detail_filemanager_status_changed_cb, item);
+ p_warn_if(-1 == ret, "vconf_notify_key_changed() Failed");
+
+ // Addressbook
+ if (-1 != cdetail_d->base_ab)
+ elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_ADDRBOOK], cdetail_d, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_UTIL_BTN], cdetail_d, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ ctui_genlist_append_separator_10px(genlist);
+
+#ifdef _CT_LINK
+ elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_LINK_UNLINK], cdetail_d, NULL,
+ ELM_GENLIST_ITEM_NONE, NULL, NULL);
+
+ if (cdetail_d->person_list && 1 < g_slist_length(cdetail_d->person_list)) {
+ detail_genlist_append_separator_line_10px(genlist);
+ item = elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_LINK_LIST],
+ NULL, NULL, ELM_GENLIST_ITEM_TREE, detail_gl_link_list_item_sel, NULL);
+ }
+#endif
+ }
+
+ return genlist;
+}
+
+static UDateFormat* detail_init_time_formatter()
+{
+ const char *locale;
+ int32_t pattern_capacity;
+ UChar pattern[PH_TEXT_SHORT_LEN];
+ UChar customSkeleton[PH_TEXT_SHORT_LEN];
+ UDateFormat *formatter = NULL;
+ UDateTimePatternGenerator generator;
+ UErrorCode status = U_ZERO_ERROR;
+
+ u_uastrncpy(customSkeleton, UDAT_YEAR_MONTH_DAY, strlen(UDAT_YEAR_MONTH_DAY));
+
+ locale = uloc_getDefault();
+ p_retvm_if(NULL == locale, NULL, "uloc_getDefault() return NULL");
+
+ generator = udatpg_open(locale, &status);
+ p_retvm_if(U_FAILURE(status), NULL, "udatpg_open() Failed()");
+
+ pattern_capacity = (int32_t) (sizeof(pattern) / sizeof((pattern)[0]));
+ udatpg_getBestPattern(generator, customSkeleton, 6, pattern, pattern_capacity, &status);
+
+ if (!U_FAILURE(status))
+ formatter = udat_open(UDAT_IGNORE, UDAT_IGNORE, locale, NULL, -1, pattern, -1, &status);
+
+ udatpg_close(generator);
+ return formatter;
+}
+
+static void detail_back_btn_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *nf = (Evas_Object *)data;
+ elm_naviframe_item_pop(nf);
+}
+
+static void detail_make_back_btn(ct_detail_data *cdetail_d)
+{
+ Evas_Object *back_btn;
+ Elm_Object_Item *item;
+ back_btn = elm_button_add(cdetail_d->navi);
+ p_retm_if(NULL == back_btn, "elm_button_add() return NULL");
+ elm_object_style_set(back_btn, "naviframe/back_btn/default");
+ elm_object_item_part_content_set(cdetail_d->navi_item, "prev_btn", back_btn);
+ item = elm_naviframe_bottom_item_get(cdetail_d->navi);
+ if (true == cdetail_d->ug_detail)
+ evas_object_smart_callback_add(back_btn, "clicked", phone_ug_destroy_me_cb, cdetail_d->ug);
+ else if (elm_naviframe_top_item_get(cdetail_d->navi) == item)
+ evas_object_smart_callback_add(back_btn, "clicked", phone_back_btn_clicked_cb, cdetail_d->win);
+ else
+ evas_object_smart_callback_add(back_btn, "clicked", detail_back_btn_cb, cdetail_d->navi);
+}
+
+static void detail_delete_contact_response_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ PH_FN_CALL;
+ int ret = CTS_ERR_FAIL;
+ ct_detail_data *cdetail_d = data;
+
+ p_retm_if(NULL == cdetail_d, "parameter(cdetail_d) is NULL");
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+
+ evas_object_data_set(cdetail_d->navi, "ct_list_update_ui", (void *)1);
+ ret = contacts_svc_delete_person(cdetail_d->person_id);
+ if (CTS_SUCCESS == ret) {
+ // FIXME : Improve the logic
+ ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE,
+ ct_detail_contacts_changed, cdetail_d);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret);
+ if (cdetail_d->is_shortcut)
+ elm_exit();
+ else if (NULL == cdetail_d->prev_view_data && cdetail_d->ug)
+ ug_destroy_me(cdetail_d->ug);
+ else
+ elm_naviframe_item_pop_to(cdetail_d->prev_navi_item);
+ phone_show_tickernoti(S_(PH_SYS_POP_DELETED));
+ }
+ else {
+ phone_show_tickernoti(S_(PH_SYS_POP_FAILED));
+ ERR("contacts_svc_delete_person() Failed(%d)", ret);
+ }
+
+ PH_FN_END;
+}
+
+static void detail_gl_edit_item_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ CTSstruct *contact;
+ ct_detail_data *cdetail_d;
+ ct_detail_person_data *person_info = data;
+
+ cdetail_d = evas_object_data_get(obj, "cdetail_d");
+ p_retm_if(NULL == cdetail_d, "evas_object_data_get() return NULL");
+
+ if (cdetail_d->popup)
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+
+ ret = contacts_svc_get_contact(person_info->ct_id, &contact);
+ p_retm_if(NULL == contact, "contatcs_svc_get_contact() Failed(%d)", ret);
+
+ ct_input_push_navi_content(cdetail_d, contact, person_info->ct_id);
+}
+
+static void detail_edit_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ GSList *cursor;
+ Evas_Object *genlist;
+ Evas_Object *popup;
+ Evas_Object *btn;
+ Elm_Object_Item *item;
+ ct_detail_person_data *person_info;
+ ct_detail_data *cdetail_d = data;
+
+ p_ret_if(NULL == cdetail_d);
+
+ if (cdetail_d->popup)
+ evas_object_del(cdetail_d->popup);
+
+ if (NULL == cdetail_d->person_list ||
+ (cdetail_d->person_list && 1 == g_slist_length(cdetail_d->person_list))) {
+ CTSstruct *contact_dup;
+ contact_dup = contacts_svc_struct_duplicate(cdetail_d->contact);
+ p_retm_if(NULL == contact_dup, "contacts_svc_struct_duplicate() return NULL");
+ ct_input_push_navi_content(cdetail_d, contact_dup, cdetail_d->contact_id);
+ return;
+ }
+
+ popup = elm_popup_add(cdetail_d->navi);
+ p_retm_if(NULL == popup, "elm_popup_add() return NULL");
+ elm_object_style_set(popup, "liststyle");
+ elm_object_part_text_set(popup, "title,text", T_(CT_GET_TEXT_BASIC, CTTEXT_LINKED_CONTACTS));
+ cdetail_d->popup = popup;
+
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, S_(PH_SYS_SK_CANCEL));
+ elm_object_part_content_set(popup, "button1", btn);
+ elm_object_style_set(btn, "popup_button/default");
+ evas_object_smart_callback_add(btn, "clicked", ct_detail_popup_hide_cb, cdetail_d);
+ evas_object_show(popup);
+
+ genlist = elm_genlist_add(popup);
+ p_retm_if(NULL == genlist, "elm_genlist_add() return NULL");
+ evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_data_set(genlist, "cdetail_d", cdetail_d);
+
+ for (cursor=cdetail_d->person_list;cursor;cursor=cursor->next) {
+ int ct_id = (int)cursor->data;
+
+ person_info = calloc(1, sizeof(ct_detail_person_data));
+ if (NULL == person_info) {
+ ERR("calloc() return NULL");
+ break;
+ }
+ person_info->ct_id = ct_id;
+
+ item = elm_genlist_item_append(genlist, &detail_itcs[DETAIL_ITC_EDIT_POPUP], person_info,
+ NULL, ELM_GENLIST_ITEM_NONE, detail_gl_edit_item_sel, person_info);
+
+ person_info->item = item;
+ }
+
+ evas_object_show(genlist);
+ elm_object_content_set(popup, genlist);
+}
+
+static void detail_delete_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_detail_data *cdetail_d = data;
+ if (cdetail_d->popup)
+ evas_object_del(cdetail_d->popup);
+
+ if (cdetail_d->person_list && 1 < g_slist_length(cdetail_d->person_list))
+ phone_create_confirm_popup(&cdetail_d->popup, cdetail_d->win,
+ T_(CT_GET_TEXT_BASE_OP, CTTEXT_ALL_LINKED_CONTACTS_WILL_BE_DELETED),
+ detail_delete_contact_response_cb, cdetail_d);
+ else
+ phone_create_confirm_popup(&cdetail_d->popup, cdetail_d->win,
+ T_(CT_GET_TEXT_BASE_OP, CTTEXT_CONFIRM_DELETE_CONTACT),
+ detail_delete_contact_response_cb, cdetail_d);
+}
+
+static void detail_more_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int rotate;
+ ct_detail_data *cdetail_d = data;
+
+ if(cdetail_d->ug)
+ return;
+
+
+ if (cdetail_d->popup)
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+
+ cdetail_d->popup = elm_ctxpopup_add(cdetail_d->navi);
+ p_retm_if(NULL == cdetail_d->popup, "elm_ctxpopup_add() return NULL");
+
+ rotate = (int)evas_object_data_get(cdetail_d->navi, "phone_rotate");
+ if (0 == rotate || 180 == rotate)
+ elm_ctxpopup_direction_priority_set(cdetail_d->popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT);
+
+ evas_object_smart_callback_add(cdetail_d->popup, "dismissed", ct_detail_popup_hide_cb, cdetail_d);
+ elm_ctxpopup_item_append(cdetail_d->popup, S_(PH_SYS_SK_DELETE), NULL,
+ detail_delete_cb, cdetail_d);
+ elm_ctxpopup_item_append(cdetail_d->popup, S_(PH_SYS_SK_EDIT), NULL,
+ detail_edit_cb, cdetail_d);
+
+ evas_object_move(cdetail_d->popup, cdetail_d->touch_x, cdetail_d->touch_y);
+ evas_object_show(cdetail_d->popup);
+}
+
+static void detail_seg_sel(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_detail_data *cdetail_d = data;
+ Elm_Object_Item *sitem = event_info;
+ Evas_Object *content;
+ int index;
+
+ index = elm_segment_control_item_index_get(sitem);
+
+ if (0 == index) {
+ content = elm_object_part_content_unset(cdetail_d->layout, "elm.swallow.content");
+ evas_object_hide(content);
+ elm_object_part_content_set(cdetail_d->layout, "elm.swallow.content", cdetail_d->genlist);
+ ct_detail_set_navi(cdetail_d, DETAIL_VIEW_MODE_INFO);
+ }
+ else if (1 == index) {
+ cdetail_d->view_mode = DETAIL_VIEW_MODE_HISTORY;
+ if (!cdetail_d->list)
+ ct_detail_history_load_data(cdetail_d);
+ ct_detail_history_fill_layout(cdetail_d);
+ }
+}
+
+static void detail_make_segment_control(Evas_Object *toolbar, ct_detail_data *cdetail_d, int mode)
+{
+ Evas_Object *segment;
+ Evas_Object *box;
+ Elm_Object_Item *titem;
+ Elm_Object_Item *info;
+ Elm_Object_Item *history;
+ double scale = elm_scale_get();
+
+ box = elm_box_add(toolbar);
+ elm_box_horizontal_set(box, EINA_FALSE);
+ evas_object_size_hint_min_set(box, 350 * scale, 80 * scale);
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+ evas_object_show(box);
+
+ segment = elm_segment_control_add(box);
+ evas_object_size_hint_weight_set(segment, EVAS_HINT_EXPAND, 0.5);
+ evas_object_size_hint_align_set(segment, EVAS_HINT_FILL, 0.5);
+
+ info = elm_segment_control_item_add(segment, NULL, "Info");
+ history = elm_segment_control_item_add(segment, NULL, "History");
+ evas_object_show(segment);
+ elm_box_pack_end(box, segment);
+
+ titem = elm_toolbar_item_append(toolbar, NULL, NULL, NULL, NULL);
+ elm_object_item_part_content_set(titem, "object", box);
+
+ if (DETAIL_VIEW_MODE_INFO == mode)
+ elm_segment_control_item_selected_set(info, EINA_TRUE);
+ else if (DETAIL_VIEW_MODE_HISTORY== mode)
+ elm_segment_control_item_selected_set(history, EINA_TRUE);
+ evas_object_smart_callback_add(segment, "changed", detail_seg_sel, cdetail_d);
+ cdetail_d->titem = titem;
+}
+
+void ct_detail_set_navi(ct_detail_data *cdetail_d, int mode)
+{
+ Evas_Object *back_btn;
+ Evas_Object *toolbar;
+ cdetail_d->cnt_checked = 0;
+ cdetail_d->view_mode = mode;
+ p_retm_if(NULL == cdetail_d->navi_item, "navi item is NULL");
+
+ toolbar = elm_object_item_part_content_get(cdetail_d->navi_item, "controlbar");
+ if (toolbar) {
+ if (cdetail_d->ctrl_item) {
+ elm_object_item_del(cdetail_d->ctrl_item);
+ cdetail_d->ctrl_item = NULL;
+ }
+ }
+ else {
+ toolbar = elm_toolbar_add(cdetail_d->navi);
+ if (NULL == toolbar) {
+ ERR("elm_toolbar_add() Failed");
+ free(cdetail_d);
+ evas_object_del(cdetail_d->layout);
+ return;
+ }
+ evas_object_event_callback_add(toolbar, EVAS_CALLBACK_MOUSE_UP, ct_detail_mouseup, cdetail_d);
+ elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
+ elm_toolbar_homogeneous_set(toolbar, EINA_FALSE);
+ elm_object_item_part_content_set(cdetail_d->navi_item, "controlbar", toolbar);
+ }
+
+ switch (mode) {
+ case DETAIL_VIEW_MODE_INFO:
+ detail_make_back_btn(cdetail_d);
+ if (!cdetail_d->titem)
+ detail_make_segment_control(toolbar, cdetail_d, mode);
+ cdetail_d->ctrl_item = elm_toolbar_item_insert_before(toolbar, cdetail_d->titem, PH_IMG_ICON_MORE, NULL,
+ detail_more_btn_clicked_cb, cdetail_d);
+ break;
+ case DETAIL_VIEW_MODE_HISTORY:
+ detail_make_back_btn(cdetail_d);
+ if (!cdetail_d->titem) {
+ phone_cbar_item_clear(toolbar);
+ detail_make_segment_control(toolbar, cdetail_d, mode);
+ }
+ cdetail_d->ctrl_item = elm_toolbar_item_insert_before(toolbar, cdetail_d->titem, PH_IMG_ICON_DELETE, NULL,
+ ct_detail_history_edit_btn_clicked_cb, cdetail_d);
+ if (0 >= cdetail_d->list_count)
+ elm_object_item_disabled_set(cdetail_d->ctrl_item, EINA_TRUE);
+ break;
+ case DETAIL_VIEW_MODE_CHECK:
+ if (cdetail_d->titem) {
+ elm_object_item_del(cdetail_d->titem);
+ cdetail_d->titem = NULL;
+ }
+ back_btn = phone_create_navi_btn(cdetail_d->navi, S_(PH_SYS_SK_CANCEL));
+ evas_object_smart_callback_add(back_btn, "clicked", ct_detail_history_cancel_btn_cb, cdetail_d);
+ elm_object_item_part_content_set(cdetail_d->navi_item, "prev_btn", back_btn);
+ cdetail_d->ctrl_item = elm_toolbar_item_append(toolbar, PH_IMG_ICON_DELETE, NULL, ct_detail_history_del_btn_clicked_cb, cdetail_d);
+ phone_toolbar_disabled_item_append(toolbar, 3);
+ elm_object_item_disabled_set(cdetail_d->ctrl_item, EINA_TRUE);
+ break;
+ case DETAIL_VIEW_MODE_VCARD:
+ detail_make_back_btn(cdetail_d);
+ elm_toolbar_item_append(toolbar, CTUI_IMG_ICON_ADD_TO_CONTACTS, NULL, detail_edit_cb, cdetail_d);
+ phone_toolbar_disabled_item_append(toolbar, 3);
+ break;
+ default:
+ break;
+ }
+}
+
+Evas_Object* ct_detail_create_content(ct_detail_data *cdetail_d)
+{
+ Elm_Theme *th;
+ Evas_Object *bg;
+ Evas_Object *genlist;
+ cdetail_d->vcard = SAFE_STRDUP(cdetail_d->vcard);
+
+ th = elm_theme_new();
+ elm_theme_ref_set(th, NULL);
+ elm_theme_extension_add(th, DETAIL_THEME_EDJ);
+ cdetail_d->th = th;
+
+ if (!cdetail_d->contact && cdetail_d->contact_id) {
+ int ret;
+
+ contacts_svc_begin_trans();
+ cdetail_d->view_creat_ver = contacts_svc_end_trans(true);
+
+ if (cdetail_d->person_id) {
+ cdetail_d->person_list = ct_detail_get_person_list(cdetail_d->person_id);
+ ret = contacts_svc_get_person(cdetail_d->person_id, &(cdetail_d->contact));
+ p_retvm_if(ret<CTS_SUCCESS, NULL, "contacts_svc_get_person() Failed(%d)", ret);
+ }
+ else {
+ ret = contacts_svc_get_contact(cdetail_d->contact_id, &(cdetail_d->contact));
+ p_retvm_if(ret<CTS_SUCCESS, NULL, "contacts_svc_get_contact() Failed(%d)", ret);
+ }
+
+ cdetail_d->base_ab_mode = CTS_ADDRESSBOOK_MODE_NONE;
+ cdetail_d->base_ab_name = strdup(T_(CT_GET_TEXT_BASIC, CTTEXT_PHONE));
+
+ ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE,
+ ct_detail_contacts_changed, cdetail_d);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret);
+ ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_LINK_CHANGE,
+ ct_detail_link_changed, cdetail_d);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret);
+ ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_PLOG_CHANGE,
+ ct_detail_history_changed_cb, cdetail_d);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret);
+ }
+
+ detail_create_itcs();
+ ct_detail_history_create_itcs();
+ cdetail_d->formatter = detail_init_time_formatter();
+
+ cdetail_d->layout = phone_create_base_layout(cdetail_d->navi, false);
+ bg = phone_create_bg(cdetail_d->layout);
+ if (NULL == bg) {
+ ERR("phone_create_bg() return NULL");
+ evas_object_del(cdetail_d->layout);
+ return NULL;
+ }
+ elm_object_style_set(bg, "group_list");
+ phone_detail_log_init_time_format();
+ phone_detail_log_generate_date_format(cdetail_d->hformatter);
+ genlist = ctui_detail_genlist_update(cdetail_d);
+ elm_object_part_content_set(cdetail_d->layout, "elm.swallow.content", genlist);
+
+ evas_object_data_set(cdetail_d->navi, "cdetail_d", cdetail_d);
+ evas_object_event_callback_add(cdetail_d->layout, EVAS_CALLBACK_DEL, detail_view_delete_cb, cdetail_d);
+ cdetail_d->has_detail = true;
+
+ return cdetail_d->layout;
+}
+
diff --git a/lib/details/ct-detail-view.h b/lib/details/ct-detail-view.h
new file mode 100755
index 0000000..1aaef71
--- /dev/null
+++ b/lib/details/ct-detail-view.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CONTACTS_DETAIL_VIEW_H__
+#define __CONTACTS_DETAIL_VIEW_H__
+
+enum {
+ DETAIL_VIEW_MODE_INFO = 0,
+ DETAIL_VIEW_MODE_HISTORY,
+ DETAIL_VIEW_MODE_CHECK,
+ DETAIL_VIEW_MODE_VCARD,
+};
+
+void ct_detail_set_navi(ct_detail_data *cdetail_d, int mode);
+Evas_Object* ct_detail_create_content(ct_detail_data *cdetail_d);
+Elm_Genlist_Item_Class* ct_detail_get_baseinfo_item_class(CTSstruct *contact);
+
+#endif //__CONTACTS_DETAIL_VIEW_H__
+
diff --git a/lib/details/ct-input-change-name.c b/lib/details/ct-input-change-name.c
new file mode 100755
index 0000000..d5080d0
--- /dev/null
+++ b/lib/details/ct-input-change-name.c
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "phone.h"
+#include "ct-input-change-name.h"
+
+typedef struct {
+ Evas_Object *navi;
+ Elm_Object_Item *navi_it;
+ Evas_Object *entry;
+ ct_change_name_cb change_name_cb;
+ void *cb_data;
+} ct_input_change_name_data;
+
+static void input_change_name_cancel_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_input_change_name_data *changename_d = data;
+ elm_naviframe_item_pop(changename_d->navi);
+}
+
+static void input_change_name_save_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_input_change_name_data *changename_d = data;
+ if (changename_d->change_name_cb) {
+ char *name = ctui_entry_markup_to_utf8(elm_entry_entry_get(changename_d->entry));
+ changename_d->change_name_cb(changename_d->cb_data, name);
+ free(name);
+ }
+ elm_naviframe_item_pop(changename_d->navi);
+}
+
+static void input_change_name_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ char *text;
+ ct_input_change_name_data *changename_d = data;
+
+ text = ctui_entry_markup_to_utf8(elm_entry_entry_get(obj));
+ p_retm_if(NULL == text, "ctui_entry_markup_to_utf8() return NULL");
+
+ if (*text)
+ ctui_navi_left_btn_disabled_set(changename_d->navi_it, EINA_FALSE);
+ else
+ ctui_navi_left_btn_disabled_set(changename_d->navi_it, EINA_TRUE);
+ free(text);
+}
+
+static Evas_Object* input_change_name_gl_content_get(void *data, Evas_Object *obj, const char *part)
+{
+ static Elm_Entry_Filter_Limit_Size limit_filter_data;
+ Evas_Object *edit_field;
+ Evas_Object *entry;
+ ct_input_change_name_data *changename_d = data;
+
+ edit_field = ctui_create_editfield(obj, NULL, NULL, false);
+
+ entry = elm_object_part_content_get(edit_field, "elm.swallow.content");
+ elm_object_signal_emit(edit_field, "elm,state,guidetext,hide", "elm");
+ changename_d->entry = entry;
+
+ limit_filter_data.max_byte_count = CT_EDITFIELD_MAX_BYTE;
+ elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
+ evas_object_smart_callback_add(entry, "changed", input_change_name_entry_changed_cb, changename_d);
+ evas_object_smart_callback_add(entry, "preedit,changed", input_change_name_entry_changed_cb, changename_d);
+
+ evas_object_show(entry);
+ elm_object_focus_set(entry, EINA_TRUE);
+ elm_entry_cursor_end_set(entry);
+
+ return edit_field;
+}
+
+static Elm_Genlist_Item_Class itc_change_name = { .item_style="1icon", .func.content_get=input_change_name_gl_content_get };
+
+static Evas_Object* input_change_name_create_view(ct_input_change_name_data *changename_d)
+{
+ Evas_Object *base, *bg;
+ Evas_Object *genlist;
+
+ base = phone_create_base_layout(changename_d->navi, false);
+ bg = phone_create_bg(base);
+ if (NULL == bg) {
+ ERR("phone_create_bg() return NULL");
+ evas_object_del(base);
+ return NULL;
+ }
+ elm_object_style_set(bg, "group_list");
+
+ genlist = elm_genlist_add(base);
+ elm_genlist_item_append(genlist, &itc_change_name, changename_d, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
+ elm_object_part_content_set(base, "elm.swallow.content", genlist);
+
+ return base;
+}
+
+static void input_change_name_del(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ ct_input_change_name_data *changename_d = data;
+ free(changename_d);
+}
+
+void ct_input_change_name_view(Evas_Object *navi, ct_change_name_cb cb, void *cb_data)
+{
+ Evas_Object *layout;
+ Evas_Object *l_btn;
+ Evas_Object *r_btn;
+ ct_input_change_name_data *changename_d;
+
+ changename_d = calloc(1, sizeof(ct_input_change_name_data));
+ p_retm_if(NULL == changename_d, "calloc() return NULL");
+ changename_d->navi = navi;
+ changename_d->change_name_cb = cb;
+ changename_d->cb_data = cb_data;
+
+ layout = input_change_name_create_view(changename_d);
+ if (NULL == layout) {
+ ERR("input_change_name_create_view() return NULL");
+ free(changename_d);
+ return;
+ }
+ evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, input_change_name_del, changename_d);
+
+ changename_d->navi_it = elm_naviframe_item_push(navi, T_(CT_GET_TEXT_BASIC, CTTEXT_RENAME), NULL, NULL, layout, NULL);
+
+ l_btn = phone_create_navi_btn(navi, S_(CT_SYS_SK_DONE));
+ evas_object_smart_callback_add(l_btn, "clicked", input_change_name_save_cb, changename_d);
+ elm_object_item_part_content_set(changename_d->navi_it, "title_left_btn", l_btn);
+ ctui_navi_left_btn_disabled_set(changename_d->navi_it, EINA_TRUE);
+
+ r_btn = phone_create_navi_btn(navi, S_(PH_SYS_SK_CANCEL));
+ evas_object_smart_callback_add(r_btn, "clicked", input_change_name_cancel_cb, changename_d);
+ elm_object_item_part_content_set(changename_d->navi_it, "title_right_btn", r_btn);
+
+}
+
diff --git a/lib/details/ct-input-change-name.h b/lib/details/ct-input-change-name.h
new file mode 100755
index 0000000..4350ac7
--- /dev/null
+++ b/lib/details/ct-input-change-name.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CT_INPUT_CHANGE_NAME_H__
+#define __CT_INPUT_CHANGE_NAME_H__
+
+#include "phone-common.h"
+void ct_input_change_name_view(Evas_Object *navi, ct_change_name_cb cb, void *cb_data);
+
+#endif /* __CT_INPUT_CHANGE_NAME_H__ */
+
diff --git a/lib/details/ct-input-num-email.c b/lib/details/ct-input-num-email.c
new file mode 100755
index 0000000..780b343
--- /dev/null
+++ b/lib/details/ct-input-num-email.c
@@ -0,0 +1,1125 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "phone.h"
+#include "ct-detail.h"
+#include "ct-detail-utils.h"
+#include "ct-input-utils.h"
+#include "ct-input-view.h"
+#include "ct-input-num-email.h"
+#include "ct-input-change-name.h"
+
+static Evas_Object* input_fill_layout_number(ct_input_data *cinput_d, CTSvalue *value);
+static Evas_Object* input_fill_layout_email(ct_input_data *cinput_d, CTSvalue *value);
+static Evas_Object* input_add_new_number(ct_input_data *cinput_d);
+static Evas_Object* input_add_new_email(ct_input_data *cinput_d);
+
+static CTSvalue *input_new_number(ct_input_data *cinput_d)
+{
+ int ret;
+ int type;
+ int next_number_type;
+ GSList *list;
+ CTSvalue *value;
+
+ value = contacts_svc_value_new(CTS_VALUE_NUMBER);
+ p_retvm_if(NULL == value, NULL, "contacts_svc_value_new() return NULL");
+
+ next_number_type = ct_input_next_number_type(cinput_d->contact);
+
+ type = ct_input_get_number_type(next_number_type);
+ contacts_svc_value_set_int(value, CTS_NUM_VAL_TYPE_INT, type);
+
+ list = NULL;
+ list = g_slist_append(list, value);
+ ret = contacts_svc_struct_store_list(cinput_d->contact, CTS_CF_NUMBER_LIST, list);
+ g_slist_free(list);
+ p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret);
+
+ ret = contacts_svc_value_set_bool(value, CTS_NUM_VAL_DELETE_BOOL, true);
+ p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ return value;
+}
+
+static inline CTSvalue* input_new_email(CTSstruct *contact)
+{
+ int ret;
+ int type;
+ GSList *list;
+ CTSvalue *value;
+
+ value = contacts_svc_value_new(CTS_VALUE_EMAIL);
+ p_retvm_if(NULL == value, NULL, "contacts_svc_value_new() return NULL");
+
+ type = ct_input_next_email_type(contact);
+ contacts_svc_value_set_int(value, CTS_EMAIL_VAL_TYPE_INT, type);
+
+ list = NULL;
+ list = g_slist_append(list, value);
+ ret = contacts_svc_struct_store_list(contact, CTS_CF_EMAIL_LIST, list);
+ g_slist_free(list);
+ p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret);
+
+ ret = contacts_svc_value_set_bool(value, CTS_EMAIL_VAL_DELETE_BOOL, true);
+ p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ return value;
+
+}
+
+static void input_email_del(ct_input_data *cinput_d, ct_input_typed_data *typed_data)
+{
+ int ret;
+ int idx;
+ Eina_List *list = NULL;
+
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+ p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL");
+
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_EMAIL_VAL_DELETE_BOOL, true);
+ p_retm_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ if (typed_data->ly_main == cinput_d->ly_email_first) {
+ idx = ct_input_box_idx_get(cinput_d->box, typed_data->ly_main);
+ list = elm_box_children_get(cinput_d->box);
+ cinput_d->ly_email_first = eina_list_nth(list, idx + 1);
+ eina_list_free(list);
+ }
+
+ elm_box_unpack(cinput_d->box, typed_data->ly_main);
+ evas_object_del(typed_data->ly_main);
+}
+
+static void input_email_del_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_input_data *cinput_d = data;
+ ct_input_typed_data *typed_data;
+
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ input_email_del(cinput_d, typed_data);
+}
+
+static void input_number_default_reset(ct_input_data *cinput_d)
+{
+ int cnt = 0;
+ int idx;
+ int ret;
+ Evas_Object *ly;
+ Eina_List *list;
+ ct_input_typed_data *typed_data;
+
+ idx = ct_input_box_idx_get(cinput_d->box, cinput_d->ly_number_first);
+ list = elm_box_children_get(cinput_d->box);
+ ly = cinput_d->ly_number_first;
+
+ cinput_d->ly_number_default = NULL;
+
+ while (ly != cinput_d->ly_number_last) {
+ typed_data = evas_object_data_get(ly, "typed_data");
+
+ if (NULL == typed_data) {
+ ERR("elm_object_item_data_get return NULL");
+ ly = eina_list_nth(list, ++cnt);
+ continue;
+ }
+
+ if (!contacts_svc_value_get_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL)) {
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DEFAULT_BOOL, true);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() Failed(%d)", ret);
+
+ cinput_d->ly_number_default = typed_data->ly_main;
+ edje_object_signal_emit(_EDJ(typed_data->ly_content), "elm,state,contact,default_number,enabled", "elm");
+ break;
+ }
+ ly = eina_list_nth(list, ++cnt);
+ }
+ eina_list_free(list);
+}
+
+static void input_set_default_num_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ ct_input_data *cinput_d;
+ ct_input_typed_data *typed_data = data;
+
+ cinput_d = evas_object_data_get(obj, "cinput_d");
+ p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL");
+
+ evas_object_del(obj);
+ cinput_d->cdetail_d->popup = NULL;
+
+ if (cinput_d->ly_number_default) {
+ ct_input_typed_data *typed_data_temp;
+ typed_data_temp = evas_object_data_get(cinput_d->ly_number_default, "typed_data");
+ p_retm_if(NULL == typed_data_temp, "evas_object_data_get() return NULL");
+
+ ret = contacts_svc_value_set_bool(typed_data_temp->value, CTS_NUM_VAL_DEFAULT_BOOL, false);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ edje_object_signal_emit(_EDJ(typed_data_temp->ly_content), "elm,state,contact,default_number,disabled", "elm");
+ }
+
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DEFAULT_BOOL, true);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ cinput_d->ly_number_default = typed_data->ly_main;
+ edje_object_signal_emit(_EDJ(typed_data->ly_content), "elm,state,contact,default_number,enabled", "elm");
+}
+
+static void input_set_default_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int rotate;
+ unsigned int idx;
+ int num_type;
+ const char *num;
+ char buf[PH_TEXT_SHORT_LEN];
+ char number_type[PH_TEXT_SHORT_LEN/2];
+ Eina_List *list, *cursor;
+ Evas_Object *ly_main;
+ Evas_Object *popup;
+ ct_input_data *cinput_d = data;
+ ct_input_typed_data *typed_data;
+
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ popup = elm_ctxpopup_add(cinput_d->cdetail_d->win);
+ p_retm_if(NULL == popup, "elm_ctxpopup_add() return NULL");
+
+ rotate = (int)evas_object_data_get(cinput_d->cdetail_d->navi, "phone_rotate");
+ if (0 == rotate || 180 == rotate)
+ elm_ctxpopup_direction_priority_set(popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT);
+
+ evas_object_smart_callback_add(popup, "dismissed", ct_detail_popup_hide_cb, cinput_d->cdetail_d);
+ evas_object_data_set(popup, "cinput_d", cinput_d);
+
+ idx = ct_input_box_idx_get(cinput_d->box, cinput_d->ly_number_first);
+ list = elm_box_children_get(cinput_d->box);
+
+ EINA_LIST_FOREACH(eina_list_nth_list(list, idx), cursor, ly_main) {
+ if (NULL == ly_main) continue;
+
+ if (ly_main == cinput_d->ly_number_last)
+ break;
+
+ typed_data = evas_object_data_get(ly_main, "typed_data");
+ if (NULL == typed_data) {
+ ERR("evas_object_data_get() return NULL");
+ break;
+ }
+
+ if (contacts_svc_value_get_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL))
+ continue;
+
+ if (contacts_svc_value_get_bool(typed_data->value, CTS_NUM_VAL_DEFAULT_BOOL))
+ continue;
+
+ num_type = contacts_svc_value_get_int(typed_data->value, CTS_NUM_VAL_TYPE_INT);
+ num = contacts_svc_value_get_str(typed_data->value, CTS_NUM_VAL_NUMBER_STR);
+
+ ctui_get_number_type_str(num_type, number_type, sizeof(number_type));
+ snprintf(buf, sizeof(buf), "%s %s", number_type, num);
+ elm_ctxpopup_item_append(popup, buf, NULL, input_set_default_num_cb, typed_data);
+ }
+ eina_list_free(list);
+
+ if (cinput_d->cdetail_d->popup)
+ ct_detail_popup_hide_cb(cinput_d->cdetail_d, NULL, NULL);
+
+ cinput_d->cdetail_d->popup = popup;
+ phone_move_ctxpopup(popup, obj);
+ evas_object_show(popup);
+}
+
+
+static Evas_Object* input_fill_layout_set_default(ct_input_data *cinput_d)
+{
+ Evas_Object *btn;
+ Evas_Object *ly_content, *ly_main;
+ Evas_Object *box = cinput_d->box;
+
+ ly_content = ct_input_create_dg_layout(box, "bg/1icon");
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+
+ ly_main = ct_input_create_dg_layout(box, "edit/contact.3");
+ p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm");
+ elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content);
+
+ btn = ctui_create_btn(ly_content, T_(CT_GET_TEXT_BASE_OP, CTTEXT_SET_DEFAULT_NUM));
+ p_retvm_if(NULL == btn, NULL, "ctui_create_btn() return NULL");
+
+ evas_object_smart_callback_add(btn, "clicked", input_set_default_cb, cinput_d);
+ p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL");
+ elm_object_part_content_set(ly_content, "elm.icon", btn);
+
+ return ly_main;
+}
+
+static void input_number_set_default_button_reset(ct_input_data *cinput_d)
+{
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ if (cinput_d->cnt_num < 2 && cinput_d->ly_number_set_default) {
+ elm_box_unpack(cinput_d->box, cinput_d->ly_number_set_default_separator_before);
+ evas_object_del(cinput_d->ly_number_set_default_separator_before);
+
+ elm_box_unpack(cinput_d->box, cinput_d->ly_number_set_default);
+ evas_object_del(cinput_d->ly_number_set_default);
+
+ elm_box_unpack(cinput_d->box, cinput_d->ly_number_set_default_separator_after);
+ evas_object_del(cinput_d->ly_number_set_default_separator_after);
+ cinput_d->ly_number_set_default = NULL;
+ }
+ else if (NULL == cinput_d->ly_number_set_default && 1 < cinput_d->cnt_num) {
+ /* 'Mark as default number' button */
+ cinput_d->ly_number_set_default_separator_before = ct_input_fill_layout_separator(cinput_d, "separator/hd16");
+ p_retm_if(NULL == cinput_d->ly_number_set_default_separator_before, "ct_input_fill_layout_separator() return NULL");
+ elm_box_pack_after(cinput_d->box, cinput_d->ly_number_set_default_separator_before, cinput_d->ly_number_last);
+
+ cinput_d->ly_number_set_default = input_fill_layout_set_default(cinput_d);
+ p_retm_if(NULL == cinput_d->ly_number_set_default, "input_fill_layout_set_default() return NULL");
+ elm_box_pack_after(cinput_d->box, cinput_d->ly_number_set_default, cinput_d->ly_number_set_default_separator_before);
+
+ cinput_d->ly_number_set_default_separator_after = ct_input_fill_layout_separator(cinput_d, "separator/hd18/with_line");
+ p_retm_if(NULL == cinput_d->ly_number_set_default_separator_after, "ct_input_fill_layout_separator() return NULL");
+ elm_box_pack_after(cinput_d->box, cinput_d->ly_number_set_default_separator_after, cinput_d->ly_number_set_default);
+ }
+}
+
+
+static void input_number_del(ct_input_data *cinput_d, ct_input_typed_data *typed_data)
+{
+ int ret;
+ int idx;
+ Eina_List *list = NULL;
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+ p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL");
+
+ if (!contacts_svc_value_get_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL)) {
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL, true);
+ p_retm_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ cinput_d->cnt_num--;
+ input_number_set_default_button_reset(cinput_d);
+ }
+
+ if (typed_data->ly_main == cinput_d->ly_number_first) {
+ idx = ct_input_box_idx_get(cinput_d->box, typed_data->ly_main);
+ list = elm_box_children_get(cinput_d->box);
+ cinput_d->ly_number_first = eina_list_nth(list, idx + 1);
+ eina_list_free(list);
+ }
+
+ if (typed_data->ly_main == cinput_d->ly_number_default)
+ input_number_default_reset(cinput_d);
+
+ elm_box_unpack(cinput_d->box, typed_data->ly_main);
+ evas_object_del(typed_data->ly_main);
+}
+
+static void input_number_del_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_input_typed_data *typed_data;
+ ct_input_data *cinput_d = data;
+
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ input_number_del(cinput_d, typed_data);
+}
+
+
+static Evas_Object* input_add_new_email(ct_input_data *cinput_d)
+{
+ CTSvalue *value;
+ Evas_Object *layout;
+
+ value = input_new_email(cinput_d->contact);
+ p_retvm_if(NULL == value, NULL, "input_new_email() return NULL");
+
+ layout = input_fill_layout_email(cinput_d, value);
+ p_retvm_if(NULL == layout, NULL, "input_fill_layout_email() return NULL");
+
+ if (NULL == cinput_d->ly_email_first)
+ cinput_d->ly_email_first = layout;
+ cinput_d->ly_email_last = layout;
+
+ return layout;
+}
+
+static void input_number_type_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int type = (int)data;
+ char buf[PH_TEXT_SHORT_LEN];
+ ct_input_typed_data *typed_data;
+ Evas_Object *ly_type;
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ contacts_svc_value_set_int(typed_data->value, CTS_NUM_VAL_TYPE_INT, ct_input_get_number_type(type));
+ ctui_get_number_type_str(ct_input_get_number_type(type), buf, sizeof(buf));
+
+ ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title");
+ p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL");
+
+ elm_object_part_text_set(ly_type, "title.text", buf);
+ evas_object_del(obj);
+}
+
+static void input_email_type_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int type = (int)data;
+ ct_input_typed_data *typed_data;
+ Evas_Object *ly_type;
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ contacts_svc_value_set_int(typed_data->value, CTS_EMAIL_VAL_TYPE_INT, type);
+
+ ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title");
+ p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL");
+
+ elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_EMAIL_TYPE, type));
+ evas_object_del(obj);
+}
+
+static void input_website_type_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int type = (int)data;
+ ct_input_typed_data *typed_data;
+ Evas_Object *ly_type;
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ contacts_svc_value_set_int(typed_data->value, CTS_WEB_VAL_TYPE_INT, type);
+
+ ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title");
+ p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL");
+
+ elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_WEBSITE_TYPE, type));
+ evas_object_del(obj);
+}
+
+static void input_messenger_type_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int type = (int)data;
+ ct_input_typed_data *typed_data;
+ Evas_Object *ly_type;
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ contacts_svc_value_set_int(typed_data->value, CTS_MESSENGER_VAL_TYPE_INT, type);
+
+ ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title");
+ p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL");
+
+ elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_IM_TYPE, type));
+ evas_object_del(obj);
+}
+
+static void input_relationship_type_rename_cb(void *data, char *str)
+{
+ Evas_Object *ly_type;
+ ct_input_typed_data *typed_data = data;
+ p_retm_if(NULL == typed_data, "parameter(typed_data)");
+
+ contacts_svc_value_set_str(typed_data->value, CTS_EXTEND_VAL_DATA3_STR, str);
+
+ ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title");
+ p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL");
+
+ if (str && *str)
+ elm_object_part_text_set(ly_type, "title.text", str);
+}
+
+static void input_relationship_type_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int type = (int)data;
+ ct_input_typed_data *typed_data;
+ Evas_Object *ly_type;
+ ct_input_data *cinput_d;
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ cinput_d = evas_object_data_get(obj, "cinput_d");
+ p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL");
+
+ if (RELATIONSHIP_TYPE_CUSTOM == type)
+ ct_input_change_name_view(cinput_d->cdetail_d->navi, input_relationship_type_rename_cb, typed_data);
+
+ contacts_svc_value_set_int(typed_data->value, CTS_EXTEND_VAL_DATA1_INT, type);
+ ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title");
+ p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL");
+
+ elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_RELATIONSHIP_TYPE, type));
+ evas_object_del(obj);
+}
+
+void ct_input_data_type_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ int i;
+ int type;
+ int type_int;
+ int rotate;
+ int x, y, w, h;
+ Evas_Object *popup;
+ ct_input_data *cinput_d;
+ ct_input_typed_data *typed_data = data;
+ Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info;
+
+ if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
+ return;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+ if (ev->output.y < y || y + h < ev->output.y)
+ return;
+
+ p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL");
+
+ cinput_d = evas_object_data_get(obj, "cinput_d");
+ p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL");
+
+ popup = elm_ctxpopup_add(cinput_d->cdetail_d->navi);
+ p_retm_if(NULL == popup, "elm_ctxpopup_add() return NULL");
+ cinput_d->cdetail_d->popup = popup;
+
+ rotate = (int)evas_object_data_get(cinput_d->cdetail_d->navi, "phone_rotate");
+ if (0 == rotate || 180 == rotate)
+ elm_ctxpopup_direction_priority_set(popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT);
+
+ evas_object_smart_callback_add(popup, "dismissed", ct_detail_popup_hide_cb, cinput_d->cdetail_d);
+ evas_object_data_set(popup, "typed_data", typed_data);
+ evas_object_data_set(popup, "cinput_d", cinput_d);
+
+ type = contacts_svc_value_get_type(typed_data->value);
+ switch (type) {
+ case CTS_VALUE_NUMBER:
+ type_int = contacts_svc_value_get_int(typed_data->value, CTS_NUM_VAL_TYPE_INT);
+ for (i=CTTEXT_TYPE_MOBILE;i<=CTTEXT_TYPE_OTHER;i++) {
+ if (type_int == ct_input_get_number_type(i)) continue;
+ elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_NUM_TYPE, i), NULL,
+ input_number_type_changed_cb, (void *)i);
+ }
+ break;
+
+ case CTS_VALUE_EMAIL:
+ type_int = contacts_svc_value_get_int(typed_data->value, CTS_EMAIL_VAL_TYPE_INT);
+
+ for (i=CTS_EMAIL_TYPE_HOME;i<=CTS_EMAIL_TYPE_WORK;i++) {
+ if (type_int == i) continue;
+ elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_EMAIL_TYPE, i), NULL,
+ input_email_type_changed_cb, (void *)i);
+ }
+ if (type_int != CTS_EMAIL_TYPE_NONE) {
+ elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_EMAIL_TYPE, CTS_EMAIL_TYPE_NONE), NULL,
+ input_email_type_changed_cb, (void *)CTS_EMAIL_TYPE_NONE);
+ }
+ break;
+
+ case CTS_VALUE_WEB:
+ type_int = contacts_svc_value_get_int(typed_data->value, CTS_WEB_VAL_TYPE_INT);
+ for (i=CTS_WEB_TYPE_HOME;i<=CTS_WEB_TYPE_WORK;i++) {
+ if (type_int == i) continue;
+ elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_WEBSITE_TYPE, i), NULL,
+ input_website_type_changed_cb, (void *)i);
+ }
+ if (type_int != CTS_WEB_TYPE_NONE) {
+ elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_WEBSITE_TYPE, CTS_WEB_TYPE_NONE), NULL,
+ input_website_type_changed_cb, (void *)CTS_WEB_TYPE_NONE);
+ }
+ break;
+ case CTS_VALUE_MESSENGER:
+ type_int = contacts_svc_value_get_int(typed_data->value, CTS_MESSENGER_VAL_TYPE_INT);
+
+ for (i=CTS_IM_TYPE_GOOGLE;i<=CTS_IM_TYPE_SKYPE;i++) {
+ if (type_int == i) continue;
+ elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_IM_TYPE, i), NULL,
+ input_messenger_type_changed_cb, (void *)i);
+ }
+ if (type_int != CTS_IM_TYPE_NONE) {
+ elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_IM_TYPE, CTS_IM_TYPE_NONE), NULL,
+ input_messenger_type_changed_cb, (void *)CTS_IM_TYPE_NONE);
+ }
+ break;
+ case CTS_VALUE_EXTEND:
+ type_int = contacts_svc_value_get_int(typed_data->value, CTS_EXTEND_VAL_DATA1_INT);
+ for (i=RELATIONSHIP_TYPE_ASSISTANT;i<RELATIONSHIP_TYPE_MAX;i++) {
+ if (type_int == i) continue;
+ elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_RELATIONSHIP_TYPE, i), NULL,
+ input_relationship_type_changed_cb, (void *)i);
+ }
+ break;
+ default:
+ ERR("Unknown type");
+ return;
+ }
+
+ phone_move_ctxpopup(popup, obj);
+ evas_object_show(popup);
+}
+
+static Evas_Object* input_add_new_number(ct_input_data *cinput_d)
+{
+ CTSvalue *value;
+ Evas_Object *layout;
+
+ value = input_new_number(cinput_d);
+ p_retvm_if(NULL == value, NULL, "input_new_number() return NULL");
+
+ layout = input_fill_layout_number(cinput_d, value);
+ p_retvm_if(NULL == layout, NULL, "input_fill_layout_number() return NULL");
+
+ if (NULL == cinput_d->ly_number_first)
+ cinput_d->ly_number_first = layout;
+ cinput_d->ly_number_last = layout;
+
+ input_number_set_default_button_reset(cinput_d);
+
+ return layout;
+}
+
+static inline bool input_num_email_check_dirty_number(char digit)
+{
+ switch (digit)
+ {
+ case '0' ... '9':
+ case 'p':
+ case 'w':
+ case 'P':
+ case 'W':
+ case '#':
+ case '*':
+ return false;
+ case '+': //only first position
+ default:
+ return true;
+ }
+}
+
+static inline int input_check_utf8(char c)
+{
+ if (c < 128)
+ return 1;
+ else if ((c & (char)0xe0) == (char)0xc0)
+ return 2;
+ else if ((c & (char)0xf0) == (char)0xe0)
+ return 3;
+ else if ((c & (char)0xf8) == (char)0xf0)
+ return 4;
+ else if ((c & (char)0xfc) == (char)0xf8)
+ return 5;
+ else if ((c & (char)0xfe) == (char)0xfc)
+ return 6;
+ else
+ return CTS_ERR_FAIL;
+}
+
+static int input_num_email_clean_number(const char *src, char *dest, int dest_size)
+{
+ int s_pos=0, d_pos=0, char_type;
+
+ if (NULL == src)
+ ERR("The parameter(src) is NULL");
+ else
+ {
+ if ('+' == src[s_pos])
+ dest[d_pos++] = src[s_pos++];
+
+ while (src[s_pos] != 0)
+ {
+ if (d_pos >= dest_size-2) break;
+ char_type = input_check_utf8(src[s_pos]);
+ if (char_type <= 1) {
+ if (input_num_email_check_dirty_number(src[s_pos])) {
+ s_pos++;
+ continue;
+ }
+ dest[d_pos++] = src[s_pos++];
+ }
+ else
+ s_pos += char_type;
+ }
+ }
+
+ dest[d_pos] = 0;
+ return d_pos;
+}
+
+static void input_number_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int len;
+ int ret;
+ char *tmp;
+ char buf[PH_TEXT_MAX_LEN];
+ Evas_Object *btn_minus;
+ ct_input_data *cinput_d = data;
+ ct_input_typed_data *typed_data;
+
+ p_retm_if(NULL == cinput_d, "parameter(ct_input_data) is NULL");
+
+ tmp = ctui_entry_markup_to_utf8(elm_entry_entry_get(obj));
+ p_retm_if(NULL == tmp, "ctui_entry_markup_to_utf8() return NULL");
+ len = input_num_email_clean_number(tmp, buf, sizeof(buf));
+
+ if (strlen(tmp) != len) {
+ ctui_entry_entry_set(obj, buf);
+ elm_entry_cursor_end_set(obj);
+ phone_show_popup(cinput_d->cdetail_d->win, T_(CT_GET_TEXT_ERR, CTTEXT_INVALID_NUMBER), 2.0);
+ free(tmp);
+ return;
+ }
+ free(tmp);
+ if (0 == len)
+ return;
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ if (!contacts_svc_value_get_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL))
+ return;
+
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL, false);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+ cinput_d->cnt_num++;
+
+ if (typed_data->ly_main == cinput_d->ly_number_last) {
+ btn_minus = elm_button_add(typed_data->ly_main);
+ p_retm_if(NULL == btn_minus, "elm_button_add() return NULL");
+
+ elm_object_style_set(btn_minus, "icon_minus");
+ evas_object_data_set(btn_minus, "typed_data", typed_data);
+ elm_object_part_content_set(typed_data->ly_main, "elm.edit.icon", btn_minus);
+ evas_object_smart_callback_add(btn_minus, "clicked", input_number_del_clicked_cb, cinput_d);
+ p_retm_if(NULL == input_add_new_number(cinput_d), "input_add_new_number() return NULL");
+ return;
+ }
+
+ input_number_set_default_button_reset(cinput_d);
+}
+
+
+static void input_email_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ ct_input_data *cinput_d = data;
+ Evas_Object *btn_minus;
+ ct_input_typed_data *typed_data;
+ const char *tmp;
+
+ tmp = elm_entry_entry_get(obj);
+ p_retm_if(NULL == tmp || '\0' == tmp[0], "elm_entry_entry_get() return NULL");
+
+ evas_object_smart_callback_del(obj, "changed", input_email_changed_cb);
+ p_retm_if(NULL == cinput_d, "parameter(ct_input_data) is NULL");
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_EMAIL_VAL_DELETE_BOOL, false);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ if (typed_data->ly_main == cinput_d->ly_email_last) {
+ btn_minus = elm_button_add(typed_data->ly_main);
+ p_retm_if(NULL == btn_minus, "elm_button_add() return NULL");
+
+ elm_object_style_set(btn_minus, "icon_minus");
+ evas_object_data_set(btn_minus, "typed_data", typed_data);
+ elm_object_part_content_set(typed_data->ly_main, "elm.edit.icon", btn_minus);
+ evas_object_smart_callback_add(btn_minus, "clicked", input_email_del_clicked_cb, cinput_d);
+
+ p_retm_if(NULL == input_add_new_email(cinput_d), "input_add_new_email() return NULL");
+ }
+}
+
+static void input_number_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ char *input;
+ Evas_Object *entry = obj;
+ ct_input_data *cinput_d = data;
+ ct_input_typed_data *typed_data;
+
+ typed_data = evas_object_data_get(entry, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ input = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry));
+ p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL");
+
+ if (*input) {
+ ret = contacts_svc_value_set_str(typed_data->value, CTS_NUM_VAL_NUMBER_STR, input);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret);
+
+ if (NULL == cinput_d->ly_number_default) {
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL, false);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() Failed(%d)", ret);
+
+ cinput_d->ly_number_default = typed_data->ly_main;
+ edje_object_signal_emit(_EDJ(typed_data->ly_content), "elm,state,contact,default_number,enabled", "elm");
+
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DEFAULT_BOOL, true);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() Failed(%d)", ret);
+ }
+ }
+ else if (!contacts_svc_value_get_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL)) {
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_NUM_VAL_DELETE_BOOL, true);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() Failed(%d)", ret);
+ cinput_d->cnt_num--;
+
+ if (typed_data->ly_main == cinput_d->ly_number_default) {
+ edje_object_signal_emit(_EDJ(typed_data->ly_content), "elm,state,contact,default_number,disabled", "elm");
+ input_number_default_reset(cinput_d);
+ }
+
+ if (cinput_d->ly_number_set_default)
+ input_number_set_default_button_reset(cinput_d);
+ }
+
+ free(input);
+}
+
+static void input_email_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ char *input;
+ Evas_Object *entry = obj;
+ ct_input_data *cinput_d = data;
+ ct_input_typed_data *typed_data;
+
+ typed_data = evas_object_data_get(entry, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ input = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry));
+ p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL");
+
+ if (*input) {
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_EMAIL_VAL_DELETE_BOOL, false);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ ret = contacts_svc_value_set_str(typed_data->value, CTS_EMAIL_VAL_ADDR_STR, input);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret);
+ }
+ else if (!contacts_svc_value_get_bool(typed_data->value, CTS_EMAIL_VAL_DELETE_BOOL)) {
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_EMAIL_VAL_DELETE_BOOL, true);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ if (typed_data->data)
+ evas_object_smart_callback_add(typed_data->data, "changed", input_email_changed_cb, cinput_d);
+ }
+
+ free(input);
+}
+
+
+static Evas_Object *input_number_get_edit_rename(ct_input_data *cinput_d,
+ ct_input_typed_data *typed_data)
+{
+ const char *val_str;
+ Evas_Object *entry;
+ Evas_Object *editfield;
+ Evas_Object *ly_content = typed_data->ly_content;
+
+ editfield = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_NUMBER),
+ input_number_unfocused_cb, cinput_d);
+ p_retvm_if(NULL == editfield, NULL, "ct_input_add_editfield() return NULL");
+
+ entry = elm_object_part_content_get(editfield, "elm.swallow.content");
+ typed_data->data = entry;
+
+ evas_object_data_set(entry, "typed_data", typed_data);
+ elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_PHONENUMBER);
+ val_str = contacts_svc_value_get_str(typed_data->value, CTS_NUM_VAL_NUMBER_STR);
+
+ if (val_str && *val_str) {
+ ctui_entry_entry_set(entry, val_str);
+ }
+ else
+ evas_object_smart_callback_add(entry, "changed", input_number_changed_cb, cinput_d);
+
+ return editfield;
+
+}
+
+
+static Evas_Object *input_email_get_edit_rename(ct_input_data *cinput_d,
+ ct_input_typed_data *typed_data)
+{
+ const char *val_str;
+ Evas_Object *entry;
+ Evas_Object *editfield;
+ Evas_Object *ly_content = typed_data->ly_content;
+
+ editfield = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_EMAIL),
+ input_email_unfocused_cb, cinput_d);
+ p_retvm_if(NULL == editfield, NULL, "ct_input_add_editfield() return NULL");
+
+ entry = elm_object_part_content_get(editfield, "elm.swallow.content");
+ typed_data->data = entry;
+
+ evas_object_data_set(entry, "typed_data", typed_data);
+ elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_EMAIL);
+ val_str = contacts_svc_value_get_str(typed_data->value, CTS_EMAIL_VAL_ADDR_STR);
+
+ if (val_str && *val_str) {
+ ctui_entry_entry_set(entry, val_str);
+ }
+ else
+ evas_object_smart_callback_add(entry, "changed", input_email_changed_cb, cinput_d);
+
+ return editfield;
+
+}
+
+static Evas_Object* input_fill_layout_number(ct_input_data *cinput_d, CTSvalue *value)
+{
+ const char *val_str;
+ int type_int;
+ char buf[PH_TEXT_SHORT_LEN];
+ Evas_Object *ly_content, *ly_main, *ly_type;
+ Evas_Object *ef;
+ Evas_Object *btn_minus;
+ Evas_Object *ico_check;
+ Evas_Object *box = cinput_d->box;
+ ct_input_typed_data *typed_data;
+
+ ly_content = ct_input_create_dg_layout(box, "1title.1text.1icon.2");
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_object_signal_emit(ly_content, "elm,state,flip,enabled", "elm");
+
+ ly_main = ct_input_create_dg_layout(box, "edit/contact");
+ p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm");
+ elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content);
+
+ if (contacts_svc_value_get_bool(value, CTS_NUM_VAL_DEFAULT_BOOL)) {
+ edje_object_signal_emit(_EDJ(ly_content), "elm,state,contact,default_number,enabled", "elm");
+ cinput_d->ly_number_default = ly_main;
+ }
+
+ type_int = contacts_svc_value_get_int(value, CTS_NUM_VAL_TYPE_INT);
+ ctui_get_number_type_str(type_int, buf, sizeof(buf));
+
+ ly_type = elm_layout_add(ly_content);
+ if (NULL == ly_type) {
+ ERR("elm_layout_add() return NULL");
+ evas_object_del(ly_main);
+ return NULL;
+ }
+ elm_layout_file_set(ly_type, CONTACTS_EDJ, "gl_title");
+ elm_object_part_text_set(ly_type, "title.text", buf);
+
+ evas_object_data_set(ly_type, "cinput_d", cinput_d);
+ elm_object_part_content_set(ly_content, "elm.flip.content.title", ly_type);
+
+ ico_check = elm_icon_add(ly_content);
+ if (NULL == ico_check) {
+ ERR("elm_icon_add() return NULL");
+ evas_object_del(ly_main);
+ return NULL;
+ }
+ elm_icon_file_set(ico_check, CTUI_IMG_CHECK, NULL);
+ evas_object_size_hint_aspect_set(ico_check, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
+ elm_object_part_content_set(ly_content, "elm.icon", ico_check);
+
+ typed_data = calloc(1, sizeof(ct_input_typed_data));
+ p_retvm_if(NULL == typed_data, NULL, "calloc() return NULL");
+ typed_data->value = value;
+ typed_data->ly_main = ly_main;
+ typed_data->ly_content = ly_content;
+ evas_object_data_set(ly_main, "typed_data", typed_data);
+
+ val_str = contacts_svc_value_get_str(value, CTS_NUM_VAL_NUMBER_STR);
+ if (val_str && *val_str) {
+ btn_minus = elm_button_add(ly_main);
+ if (NULL == btn_minus) {
+ ERR("elm_button_add() return NULL");
+ evas_object_del(ly_main);
+ free(typed_data);
+ return NULL;
+ }
+ elm_object_style_set(btn_minus, "icon_minus");
+ evas_object_data_set(btn_minus, "typed_data", typed_data);
+ elm_object_part_content_set(ly_main, "elm.edit.icon", btn_minus);
+ evas_object_smart_callback_add(btn_minus, "clicked", input_number_del_clicked_cb, cinput_d);
+ }
+
+ ef = input_number_get_edit_rename(cinput_d, typed_data);
+ if (NULL == ef) {
+ ERR("input_number_get_edit_rename() return NULL");
+ evas_object_del(ly_main);
+ free(typed_data);
+ return NULL;
+ }
+ elm_object_part_content_set(ly_content, "elm.flip.content", ef);
+ ct_input_name_field_add(ef, cinput_d);
+
+ evas_object_event_callback_add(ly_type, EVAS_CALLBACK_MOUSE_UP, ct_input_data_type_mouse_up_cb, typed_data);
+ evas_object_event_callback_add(ly_main, EVAS_CALLBACK_DEL, ct_input_typed_layout_del_cb, typed_data);
+
+ if (cinput_d->ly_number_last)
+ elm_box_pack_after(box, ly_main, cinput_d->ly_number_last);
+ else
+ elm_box_pack_end(box, ly_main);
+
+ return ly_main;
+}
+
+
+void ct_input_fill_layout_numbers(ct_input_data *cinput_d)
+{
+ GSList *list, *cursor;
+ Evas_Object *ly;
+ CTSstruct *contact = cinput_d->contact;
+
+ ly = NULL;
+ list = NULL;
+ contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list);
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ if (NULL == cursor->data)
+ continue;
+ if (contacts_svc_value_get_bool(cursor->data, CTS_NUM_VAL_DELETE_BOOL))
+ continue;
+ ly = input_fill_layout_number(cinput_d, cursor->data);
+ p_retm_if(NULL == ly, "input_fill_layout_number() return NULL");
+
+ cinput_d->cnt_num++;
+ if (NULL == cinput_d->ly_number_first)
+ cinput_d->ly_number_first = ly;
+ }
+ if (NULL != ly)
+ cinput_d->ly_number_last = ly;
+
+ p_retm_if(NULL == input_add_new_number(cinput_d), "input_add_new_number() return NULL");
+}
+
+static Evas_Object* input_fill_layout_email(ct_input_data *cinput_d, CTSvalue *value)
+{
+ const char *val_str;
+ int type_int;
+ Evas_Object *ly_content, *ly_main, *ly_type;
+ Evas_Object *ef;
+ Evas_Object *btn_minus;
+ Evas_Object *box = cinput_d->box;
+ ct_input_typed_data *typed_data;
+
+ ly_content = ct_input_create_dg_layout(box, "1title.1text.1icon.2");
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_object_signal_emit(ly_content, "elm,state,flip,enabled", "elm");
+
+ ly_main = ct_input_create_dg_layout(box, "edit/contact");
+ p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm");
+ elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content);
+
+ type_int = contacts_svc_value_get_int(value, CTS_EMAIL_VAL_TYPE_INT);
+ ly_type = elm_layout_add(ly_content);
+ if (NULL == ly_type) {
+ ERR("elm_layout_add() return NULL");
+ evas_object_del(ly_main);
+ return NULL;
+ }
+ elm_layout_file_set(ly_type, CONTACTS_EDJ, "gl_title");
+ elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_EMAIL_TYPE, type_int));
+ evas_object_data_set(ly_type, "cinput_d", cinput_d);
+ elm_object_part_content_set(ly_content, "elm.flip.content.title", ly_type);
+
+ typed_data = calloc(1, sizeof(ct_input_typed_data));
+ p_retvm_if(NULL == typed_data, NULL, "calloc() return NULL");
+ typed_data->value = value;
+ typed_data->ly_main = ly_main;
+ typed_data->ly_content = ly_content;
+ evas_object_data_set(ly_main, "typed_data", typed_data);
+
+ val_str = contacts_svc_value_get_str(value, CTS_EMAIL_VAL_ADDR_STR);
+ if (val_str && *val_str) {
+ btn_minus = elm_button_add(ly_main);
+ if (NULL == btn_minus) {
+ ERR("elm_button_add() return NULL");
+ evas_object_del(ly_main);
+ free(typed_data);
+ return NULL;
+ }
+ elm_object_style_set(btn_minus, "icon_minus");
+ evas_object_data_set(btn_minus, "typed_data", typed_data);
+ elm_object_part_content_set(ly_main, "elm.edit.icon", btn_minus);
+ evas_object_smart_callback_add(btn_minus, "clicked", input_email_del_clicked_cb, cinput_d);
+ }
+
+ ef = input_email_get_edit_rename(cinput_d, typed_data);
+ if (NULL == ef) {
+ ERR("input_email_get_edit_rename() return NULL");
+ evas_object_del(ly_main);
+ free(typed_data);
+ return NULL;
+ }
+ elm_object_part_content_set(ly_content, "elm.flip.content", ef);
+
+ evas_object_event_callback_add(ly_main, EVAS_CALLBACK_DEL, ct_input_typed_layout_del_cb, typed_data);
+ evas_object_event_callback_add(ly_type, EVAS_CALLBACK_MOUSE_UP, ct_input_data_type_mouse_up_cb, typed_data);
+
+ if (cinput_d->ly_email_last)
+ elm_box_pack_after(box, ly_main, cinput_d->ly_email_last);
+ else
+ elm_box_pack_end(box, ly_main);
+
+ ct_input_name_field_add(ef, cinput_d);
+
+ return ly_main;
+}
+
+int ct_input_fill_layout_emails(ct_input_data *cinput_d)
+{
+ int cnt = 0;
+ GSList *list, *cursor;
+ Evas_Object *ly;
+ CTSstruct *contact = cinput_d->contact;
+
+ ly = NULL;
+ list = NULL;
+ contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list);
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ if (NULL == cursor->data)
+ continue;
+ if (contacts_svc_value_get_bool(cursor->data, CTS_EMAIL_VAL_DELETE_BOOL))
+ continue;
+ ly = input_fill_layout_email(cinput_d, cursor->data);
+ p_retvm_if(NULL == ly, cnt, "input_fill_layout_email() return NULL");
+
+ if (NULL == cinput_d->ly_email_first)
+ cinput_d->ly_email_first = ly;
+
+ cnt++;
+ }
+ if (NULL != ly)
+ cinput_d->ly_email_last = ly;
+
+ p_retvm_if(NULL == input_add_new_email(cinput_d), cnt, "input_add_new_email() return NULL");
+ return cnt;
+}
+
diff --git a/lib/details/ct-input-num-email.h b/lib/details/ct-input-num-email.h
new file mode 100755
index 0000000..64e30a3
--- /dev/null
+++ b/lib/details/ct-input-num-email.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CONTACTS_INPUT_VIEW_EXT_H__
+#define __CONTACTS_INPUT_VIEW_EXT_H__
+
+void ct_input_fill_layout_numbers(ct_input_data *i_data);
+int ct_input_fill_layout_emails(ct_input_data *i_data);
+void ct_input_data_type_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+#endif //__CONTACTS_INPUT_VIEW_EXT_H__
diff --git a/lib/details/ct-input-utils.c b/lib/details/ct-input-utils.c
new file mode 100755
index 0000000..ca07c49
--- /dev/null
+++ b/lib/details/ct-input-utils.c
@@ -0,0 +1,997 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <regex.h>
+#include <errno.h>
+#include <aul.h>
+#include <ui-gadget-module.h>
+#include <vconf.h>
+#include <vconf-keys.h>
+#include <fcntl.h>
+#include <app_service.h>
+
+#include "phone.h"
+#include "ct-list.h"
+#include "ct-detail.h"
+#include "ct-detail-utils.h"
+#include "ct-input-utils.h"
+#include "ct-input-view.h"
+
+static void input_change_photo(ct_input_data *cinput_d, const char *normal,
+ const char *full)
+{
+ int ret;
+ CTSvalue* base_info = NULL;
+
+ base_info = ct_detail_get_baseinfo_value(cinput_d->contact);
+
+ ret = contacts_svc_value_set_str(base_info, CTS_BASE_VAL_IMG_PATH_STR, normal);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret);
+
+ ret = contacts_svc_value_set_str(base_info, CTS_BASE_VAL_FULL_IMG_PATH_STR, full);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret);
+
+ ct_input_update_image(cinput_d);
+}
+
+static void input_img_crop_result(ui_gadget_h ug, service_h service, void *data)
+{
+ char *normal = NULL;
+ char *full = NULL;
+ ct_input_data *cinput_d = data;
+
+ p_retm_if(NULL == ug || NULL == data, "ug or data is NULL");
+
+ if (service) {
+ service_get_extra_data(service, "crop_image_path", &normal);
+ p_retm_if(!normal, "return value is NULL.\n");
+
+ service_get_extra_data(service, "image_path", &full);
+ input_change_photo(cinput_d, normal, full);
+ free(normal);
+ }
+ ug_destroy(ug);
+ cinput_d->crop_ug = NULL;
+
+ if (cinput_d->src_ug) {
+ ug_destroy(cinput_d->src_ug);
+ cinput_d->src_ug = NULL;
+ }
+}
+
+static void input_src_ug_destroy(ui_gadget_h ug, void *priv)
+{
+ ct_input_data *cinput_d = priv;
+ p_retm_if(NULL == ug, "ug is NULL");
+
+ if (NULL == cinput_d->crop_ug) {
+ ug_destroy(ug);
+ cinput_d->src_ug = NULL;
+ }
+}
+
+static void input_crop_ug_destroy(ui_gadget_h ug, void *priv)
+{
+ ct_input_data *cinput_d = priv;
+ p_retm_if(NULL == ug, "ug is NULL");
+
+ if (cinput_d->crop_ug) {
+ ug_destroy(ug);
+ cinput_d->crop_ug = NULL;
+ }
+}
+
+static void input_gallery_result(ui_gadget_h ug, service_h service, void *data)
+{
+ char *val = NULL;
+ ct_input_data *cinput_d = data;
+
+ p_retm_if(NULL == ug || NULL == data, "ug or data is NULL");
+
+ if (service) {
+ struct ug_cbs cbs = {0};
+
+ service_get_extra_data(service, "path", &val);
+ p_retm_if(!val, "return value is NULL.\n");
+
+ cbs.result_cb = input_img_crop_result;
+ cbs.destroy_cb = input_crop_ug_destroy;
+ cbs.priv = cinput_d;
+ cinput_d->crop_ug = phone_image_crop_ug(cinput_d->cdetail_d->ug, val, &cbs);
+ free(val);
+ }
+}
+
+void ct_input_gallery(void *data, Evas_Object *obj, void *event_info)
+{
+ struct ug_cbs cbs = {0};
+ ct_input_data *cinput_d = data;
+
+ service_h service;
+
+ service_create(&service);
+ service_add_extra_data(service, "launch-type", "select-one");
+ service_add_extra_data(service, "file-type", "image");
+
+ cbs.result_cb = input_gallery_result;
+ cbs.destroy_cb = input_src_ug_destroy;
+ cbs.layout_cb = ug_common_layout_cb;
+ cbs.priv = cinput_d;
+
+ cinput_d->src_ug = ug_create(cinput_d->cdetail_d->ug, GALLERY_UG, UG_MODE_FULLVIEW, service, &cbs);
+ p_warn_if(NULL == cinput_d->src_ug, "ug_create() Failed");
+
+ service_destroy(service);
+ evas_object_del(cinput_d->cdetail_d->popup);
+ cinput_d->cdetail_d->popup = NULL;
+}
+
+static void input_camera_result(service_h service, service_h reply, service_result_e result, void* user_data)
+{
+ char *normal = NULL;
+ char *full = NULL;
+ ct_input_data *cinput_d = user_data;
+
+ service_get_extra_data(reply, "crop_image_path", &normal);
+ p_retm_if(!normal, "return value is NULL.\n");
+
+ service_get_extra_data(reply, "image_path", &full);
+ input_change_photo(cinput_d, normal, full);
+
+ free(normal);
+ free(full);
+}
+
+void ct_input_camera(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ ct_input_data *cinput_d = data;
+ service_h service;
+
+ p_retm_if(NULL == cinput_d, "paramter(ct_input_data) is NULL");
+
+ if (cinput_d->cdetail_d && cinput_d->cdetail_d->popup)
+ ct_detail_popup_hide_cb(cinput_d->cdetail_d, NULL, NULL);
+
+ service = NULL;
+ ret = service_create(&service);
+ p_retm_if(SERVICE_ERROR_NONE != ret, "service_create() Failed(%d)", ret);
+
+ ret = service_set_operation(service, SERVICE_OPERATION_CREATE_CONTENT);
+ if (SERVICE_ERROR_NONE != ret) {
+ ERR("service_set_operation() Failed(%d)", ret);
+ ret = service_destroy(service);
+ p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", ret);
+ return;
+ }
+
+ ret = service_set_mime(service, "image/jpg");
+ if (SERVICE_ERROR_NONE != ret) {
+ ERR("service_set_mime() Failed(%d)", ret);
+ ret = service_destroy(service);
+ p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", ret);
+ return;
+ }
+
+ ret = service_set_package(service, CAMERA_PKG);
+ if (SERVICE_ERROR_NONE != ret) {
+ ERR("service_set_package() Failed(%d)", ret);
+ ret = service_destroy(service);
+ p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", ret);
+ return;
+ }
+
+ ret = service_add_extra_data(service, "CALLER", "contacts");
+ if (SERVICE_ERROR_NONE != ret) {
+ ERR("service_add_extra_data() Failed(%d)", ret);
+ ret = service_destroy(service);
+ p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", ret);
+ return;
+ }
+
+ ret = service_send_launch_request(service, input_camera_result, data);
+ if (SERVICE_ERROR_NONE != ret) {
+ ERR("service_send_launch_request() Failed(%d)", ret);
+ ret = service_destroy(service);
+ p_warn_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", ret);
+ return;
+ }
+
+ ret = service_destroy(service);
+ p_retm_if(SERVICE_ERROR_NONE != ret, "service_destroy() Failed(%d)", ret);
+}
+
+static void input_myfile_ringtone_result(ui_gadget_h ug, service_h service, void *data)
+{
+ ct_input_data *cinput_d = data;
+
+ p_retm_if(NULL == ug || NULL == data, "ug or data is NULL");
+
+ if (service) {
+ const char* display;
+ CTSvalue *base_info = NULL;
+ CTSstruct *contact = cinput_d->contact;
+
+ char *val = NULL;
+ service_get_extra_data(service, "result", &val);
+ p_retm_if(!val, "return value is NULL.\n");
+
+ contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &base_info);
+ if (NULL == base_info) {
+ base_info = contacts_svc_value_new(CTS_VALUE_CONTACT_BASE_INFO);
+ contacts_svc_struct_store_value(contact, CTS_CF_BASE_INFO_VALUE, base_info);
+ }
+ contacts_svc_value_set_str(base_info, CTS_BASE_VAL_RINGTONE_PATH_STR, val);
+ display = ct_detail_get_ringtone_display_name(val);
+ free(val);
+
+ ct_input_update_ringtone(contact, cinput_d->ly_ringtone);
+ }
+
+ ug_destroy(ug);
+ cinput_d->src_ug = NULL;
+}
+
+static inline ui_gadget_h input_myfile_ug(struct ug_cbs cbs,
+ service_h service, ct_input_data *cinput_d)
+{
+ ui_gadget_h ug;
+
+ cbs.layout_cb = ug_common_layout_cb;
+ cbs.priv = cinput_d;
+
+ ug = ug_create(cinput_d->cdetail_d->ug, MYFILES_UG, UG_MODE_FULLVIEW, service, &cbs);
+ p_warn_if(NULL == ug, "ug_create() Failed");
+
+ return ug;
+}
+
+void ct_input_myfile_ringtone(ct_input_data *cinput_d)
+{
+ struct ug_cbs cbs = {0};
+
+ service_h service;
+
+ service_create(&service);
+
+ service_add_extra_data(service, "path", "/opt/share/settings/Ringtones");
+ service_add_extra_data(service, "select_type", "SINGLE_FILE");
+ service_add_extra_data(service, "file_type", "SOUND");
+
+ cbs.result_cb = input_myfile_ringtone_result;
+ cbs.destroy_cb = input_src_ug_destroy;
+ cinput_d->src_ug = input_myfile_ug(cbs, service, cinput_d);
+
+ service_destroy(service);
+}
+
+#define ACCOUNT_RGEX "([a-z0-9!#$%&'*+/=?^_`{|}~-]+[.])*[a-z0-9!#$%&'*+/=?^_`{|}~-]+"
+#define DOMAIN_RGEX "([a-z0-9!#$%&'*+/=?^_`{|}~-]+[.])+[a-z0-9!#$%&'*+/=?^_`{|}~-]+"
+#define EMAIL_RGEX ACCOUNT_RGEX"@"DOMAIN_RGEX
+
+int ct_input_valid_email(CTSstruct *contact)
+{
+ int result = TRUE;
+ GSList *list = NULL;
+ GSList *cursor;
+
+ contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list);
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ const char *email = NULL;
+
+ if (contacts_svc_value_get_bool(cursor->data, CTS_EMAIL_VAL_DELETE_BOOL))
+ continue;
+
+ email = contacts_svc_value_get_str(cursor->data, CTS_EMAIL_VAL_ADDR_STR);
+ if (email && *email) {
+ int len = strlen(email) + 1;
+ regex_t compiled;
+ regmatch_t str[len];
+
+ if (regcomp(&compiled, EMAIL_RGEX, REG_ICASE | REG_EXTENDED))
+ result = FALSE;
+ if (regexec(&compiled, email, len, str, 0) == REG_NOMATCH)
+ result = FALSE;
+
+ regfree(&compiled);
+ }
+ if (!result)
+ break;
+ }
+ return result;
+}
+
+static int input_is_name_empty(CTSstruct *contact)
+{
+ int ret;
+ CTSvalue *name_val;
+ const char *name = NULL;
+
+ ret = contacts_svc_struct_get_value(contact, CTS_CF_NAME_VALUE, &name_val);
+
+ p_retv_if(CTS_ERR_NO_DATA == ret, TRUE);
+ p_retvm_if(CTS_SUCCESS != ret, TRUE, "contacts_svc_struct_get_value() Failed(%d)", ret);
+
+ name = contacts_svc_value_get_str(name_val, CTS_NAME_VAL_FIRST_STR);
+ if (NULL == name || '\0' == *name) {
+ name = contacts_svc_value_get_str(name_val, CTS_NAME_VAL_LAST_STR);
+ if (NULL == name || '\0' == *name)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static int input_is_num_empty(CTSstruct *contact)
+{
+ GSList *list = NULL;
+ GSList *cursor;
+
+ contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list);
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ const char *number = NULL;
+
+ if (contacts_svc_value_get_bool(cursor->data, CTS_NUM_VAL_DELETE_BOOL))
+ continue;
+
+ number = contacts_svc_value_get_str(cursor->data, CTS_NUM_VAL_NUMBER_STR);
+ if (number && *number)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static int input_is_email_empty(CTSstruct *contact)
+{
+ GSList *list = NULL;
+ GSList *cursor;
+
+ contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list);
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ bool is_del;
+ const char *email = NULL;
+
+ is_del = contacts_svc_value_get_bool(cursor->data, CTS_EMAIL_VAL_DELETE_BOOL);
+ if (is_del) continue;
+
+ email = contacts_svc_value_get_str(cursor->data, CTS_EMAIL_VAL_ADDR_STR);
+ if (email && *email)
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void input_btn_popup(ct_detail_data *cdetail_d, const char *desc)
+{
+ Evas_Object *popup;
+ Evas_Object *btn;
+
+ popup = elm_popup_add(cdetail_d->navi);
+ evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ elm_object_text_set(popup, desc);
+
+ btn = elm_button_add(popup);
+ elm_object_text_set(btn, S_(PH_SYS_SK_OK));
+ elm_object_part_content_set(popup, "button1", btn);
+ elm_object_style_set(btn, "popup_button/default");
+ evas_object_smart_callback_add(btn, "clicked", ct_detail_popup_hide_cb, cdetail_d);
+
+ cdetail_d->popup = popup;
+ evas_object_show(popup);
+}
+
+void ct_input_save_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ ct_detail_data *cdetail_d;
+ ct_input_data *cinput_d = data;
+
+ p_retm_if(NULL == cinput_d, "cinput_d is NULL");
+
+ cdetail_d = cinput_d->cdetail_d;
+
+ if (TRUE != (ret = ct_input_valid_email(cinput_d->contact))) {
+ input_btn_popup(cdetail_d, T_(CT_GET_TEXT_ERR, CTTEXT_INVALID_EMAIL));
+ return;
+ }
+
+ if (input_is_name_empty(cinput_d->contact)
+ && input_is_num_empty(cinput_d->contact)
+ && input_is_email_empty(cinput_d->contact)) {
+ input_btn_popup(cdetail_d, T_(CT_GET_TEXT_ERR, CTTEXT_SAVE_FAIL));
+ return;
+ }
+
+ if (cinput_d->contact_id) {
+ ret = contacts_svc_update_contact(cinput_d->contact);
+ if (ret < CTS_SUCCESS) {
+ switch (ret) {
+ case CTS_ERR_DB_LOCK:
+ ERR("contacts_svc_update_contact() Failed(%d)", ret);
+ phone_show_popup(cdetail_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_ERR_DB_LOCKED), 1.5);
+ break;
+ case CTS_ERR_NO_SPACE:
+ ERR("contacts_svc_update_contact() Failed(%d)", ret);
+ phone_show_popup(cdetail_d->navi, S_(CT_SYS_POP_NOT_ENOUGH_MEMORY), 1.5);
+ break;
+ default:
+ ERR("contacts_svc_update_contact() Failed(%d)", ret);
+ phone_show_popup(cdetail_d->navi, S_(PH_SYS_POP_FAILED), 1.5);
+ break;
+ }
+ return;
+ }
+ else {
+ cinput_d->saved = true;
+ }
+ }
+ else {
+ ret = contacts_svc_insert_contact(cinput_d->base_ab, cinput_d->contact);
+ if (ret < CTS_SUCCESS) {
+ switch (ret) {
+ case CTS_ERR_DB_LOCK:
+ ERR("contacts_svc_insert_contact() Failed(%d)", ret);
+ phone_show_popup(cdetail_d->navi, T_(CT_GET_TEXT_ERR, CTTEXT_ERR_DB_LOCKED), 1.5);
+ break;
+ case CTS_ERR_NO_SPACE:
+ ERR("contacts_svc_update_contact() Failed(%d)", ret);
+ phone_show_popup(cdetail_d->navi, S_(CT_SYS_POP_NOT_ENOUGH_MEMORY), 1.5);
+ break;
+ default:
+ ERR("contacts_svc_insert_contact() Failed(%d)", ret);
+ phone_show_popup(cdetail_d->navi, S_(PH_SYS_POP_FAILED), 1.5);
+ break;
+ }
+ return;
+ }
+ else {
+ cdetail_d->contact_id = ret;
+ }
+ if (NULL == cdetail_d->prev_view_data && cdetail_d->ug)
+ phone_ug_return_id(cdetail_d->ug, ret, 0, 0);
+ }
+
+ /* evas_object_smart_callback_del() func will be deleted */
+ evas_object_smart_callback_del(obj, "clicked", ct_input_save_cb);
+
+ if (cdetail_d->prev_view_data && ((CT_UG_REQUEST_UPDATE_CONTACT <= cdetail_d->ug_request &&
+ cdetail_d->ug_request <= CT_UG_REQUEST_SAVE_RINGTONE) ||
+ (PH_UG_REQUEST_SET_WITH_NUM <= cdetail_d->ug_request &&
+ cdetail_d->ug_request <= PH_UG_REQUEST_SET_WITH_RINGTONE))){
+ ug_destroy_me(cdetail_d->ug);
+ }
+ else if (cdetail_d->ug && !cdetail_d->has_detail && NULL == cdetail_d->prev_view_data) {
+ ug_destroy_me(cdetail_d->ug);
+ }
+ else if (cdetail_d->vcard)
+ elm_exit();
+ else
+ elm_naviframe_item_pop(cdetail_d->navi);
+}
+
+CTSvalue* ct_input_get_event(CTSstruct *contact, int event_type)
+{
+ GSList *list=NULL, *cursor;
+
+ contacts_svc_struct_get_list(contact, CTS_CF_EVENT_LIST, &list);
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ int type = contacts_svc_value_get_int(cursor->data, CTS_EVENT_VAL_TYPE_INT);
+ if (event_type == type)
+ return cursor->data;
+ }
+ return NULL;
+}
+
+CTSvalue* ct_input_get_nickname(CTSstruct *contact)
+{
+ GSList *list=NULL;
+ contacts_svc_struct_get_list(contact, CTS_CF_NICKNAME_LIST, &list);
+
+ if (NULL == list) return NULL;
+ return list->data;
+}
+
+CTSvalue* ct_input_get_website_value(CTSstruct* contact)
+{
+ GSList *list = NULL;
+ contacts_svc_struct_get_list(contact, CTS_CF_WEB_ADDR_LIST, &list);
+
+ if (0 < g_slist_length(list))
+ return list->data;
+ return NULL;
+}
+
+int ct_input_get_number_type(int ct_num_type)
+{
+ int ret_type;
+
+ switch (ct_num_type) {
+ case CTTEXT_TYPE_MOBILE:
+ ret_type = CTS_NUM_TYPE_CELL;
+ break;
+ case CTTEXT_TYPE_HOME:
+ ret_type = CTS_NUM_TYPE_VOICE | CTS_NUM_TYPE_HOME;
+ break;
+ case CTTEXT_TYPE_HOME2:
+ ret_type = CTS_NUM_TYPE_CELL | CTS_NUM_TYPE_HOME;
+ break;
+ case CTTEXT_TYPE_WORK:
+ ret_type = CTS_NUM_TYPE_VOICE | CTS_NUM_TYPE_WORK;
+ break;
+ case CTTEXT_TYPE_WORK2:
+ ret_type = CTS_NUM_TYPE_CELL | CTS_NUM_TYPE_WORK;
+ break;
+ case CTTEXT_TYPE_FAX_HOME:
+ ret_type = CTS_NUM_TYPE_FAX | CTS_NUM_TYPE_HOME;
+ break;
+ case CTTEXT_TYPE_FAX_WORK:
+ ret_type = CTS_NUM_TYPE_FAX | CTS_NUM_TYPE_WORK;
+ break;
+ case CTTEXT_TYPE_ASSISTANT:
+ ret_type = CTS_NUM_TYPE_ASSISTANT;
+ break;
+ case CTTEXT_TYPE_PAGER:
+ ret_type = CTS_NUM_TYPE_PAGER;
+ break;
+ case CTTEXT_TYPE_CAR:
+ ret_type = CTS_NUM_TYPE_CAR;
+ break;
+ case CTTEXT_TYPE_OTHER:
+ default:
+ ret_type = CTS_NUM_TYPE_NONE;
+ break;
+ }
+
+ return ret_type;
+}
+
+static void input_img_del_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ CTSvalue *value;
+ ct_input_data *cinput_d = data;
+
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ value = ct_detail_get_baseinfo_value(cinput_d->contact);
+
+ ret = contacts_svc_value_set_str(value, CTS_BASE_VAL_IMG_PATH_STR, NULL);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret);
+
+ ret = contacts_svc_value_set_str(value, CTS_BASE_VAL_FULL_IMG_PATH_STR, NULL);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret);
+
+ ct_input_update_image(cinput_d);
+
+ evas_object_del(cinput_d->cdetail_d->popup);
+ cinput_d->cdetail_d->popup = NULL;
+}
+
+void ct_input_contact_image_change_popup(ct_input_data *cinput_d, bool has_photo)
+{
+ int rotate;
+ Evas_Object *popup;
+ int battery_status = -1;
+
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ popup = elm_ctxpopup_add(cinput_d->cdetail_d->navi);
+ p_retm_if(NULL == popup, "elm_ctxpopup_add() return NULL");
+
+ rotate = (int)evas_object_data_get(cinput_d->cdetail_d->navi, "phone_rotate");
+ if (0 == rotate || 180 == rotate)
+ elm_ctxpopup_direction_priority_set(popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT);
+
+ evas_object_smart_callback_add(popup, "dismissed", ct_detail_popup_hide_cb, cinput_d->cdetail_d);
+ evas_object_data_set(popup, "cinput_d", cinput_d);
+
+ if (has_photo) {
+ elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_BASE_OP, CTTEXT_DELETE_PHOTO), NULL,
+ input_img_del_cb, cinput_d);
+ }
+
+ elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_BASE_OP, CTTEXT_IMAGE), NULL,
+ ct_input_gallery, cinput_d);
+
+ vconf_get_int(VCONFKEY_SYSMAN_BATTERY_STATUS_LOW, &battery_status);
+ if (VCONFKEY_SYSMAN_BAT_POWER_OFF != battery_status)
+ elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_BASE_OP, CTTEXT_TAKE_A_PHOTO), NULL,
+ ct_input_camera, cinput_d);
+
+ cinput_d->cdetail_d->popup = popup;
+
+ phone_move_ctxpopup(popup, elm_object_part_content_get(cinput_d->ly_baseinfo, "elm.icon.image"));
+ evas_object_show(popup);
+}
+
+void ct_input_entry_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ if (elm_object_focus_get(obj)) return;
+ evas_object_smart_callback_call(obj, "unfocused", NULL);
+}
+
+Evas_Object* ct_input_add_editfield(Evas_Object *parent, const char* guide_txt,
+ Evas_Smart_Cb unfocused_cb, void *unfocused_cb_data)
+{
+ Evas_Object *editfield;
+ Evas_Object *entry;
+
+ editfield = ctui_create_editfield(parent, NULL, guide_txt, false);
+ p_retvm_if(NULL == editfield, NULL, "ctui_create_editfield() return NULL");
+
+ entry = elm_object_part_content_get(editfield, "elm.swallow.content");
+ evas_object_smart_callback_add(entry, "changed", ct_input_entry_changed_cb, editfield);
+
+ if (unfocused_cb)
+ evas_object_smart_callback_add(entry, "unfocused", unfocused_cb, unfocused_cb_data);
+
+ return editfield;
+}
+
+static int input_get_ct_number_type(int cts_num_type)
+{
+ if (cts_num_type & CTS_NUM_TYPE_CUSTOM)
+ return CTTEXT_TYPE_OTHER;
+ else if (cts_num_type & CTS_NUM_TYPE_CELL)
+ return CTTEXT_TYPE_MOBILE;
+ else if (cts_num_type & CTS_NUM_TYPE_VOICE) {
+ if (cts_num_type & CTS_NUM_TYPE_HOME)
+ return CTTEXT_TYPE_HOME2;
+ else if (cts_num_type & CTS_NUM_TYPE_WORK)
+ return CTTEXT_TYPE_WORK2;
+ else
+ return CTTEXT_TYPE_TELEPHONE;
+ }
+ else if (cts_num_type & CTS_NUM_TYPE_FAX) {
+ if (cts_num_type & CTS_NUM_TYPE_HOME)
+ return CTTEXT_TYPE_FAX_HOME;
+ else if (cts_num_type & CTS_NUM_TYPE_WORK)
+ return CTTEXT_TYPE_FAX_WORK;
+ else
+ return CTTEXT_TYPE_FAX;
+ }
+ else if (cts_num_type & CTS_NUM_TYPE_PAGER)
+ return CTTEXT_TYPE_PAGER;
+ else if (cts_num_type & CTS_NUM_TYPE_CAR)
+ return CTTEXT_TYPE_CAR;
+ else if (cts_num_type & CTS_NUM_TYPE_ASSISTANT)
+ return CTTEXT_TYPE_ASSISTANT;
+ else
+ return CTTEXT_TYPE_OTHER;
+
+}
+
+int ct_input_next_number_type(CTSstruct *contact)
+{
+ int i;
+ int used = 0;
+ int cts_type;
+ GSList *list = NULL, *cursor;
+ contacts_svc_struct_get_list(contact, CTS_CF_NUMBER_LIST, &list);
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ if (contacts_svc_value_get_bool(cursor->data, CTS_NUM_VAL_DELETE_BOOL))
+ continue;
+
+ cts_type = contacts_svc_value_get_int(cursor->data, CTS_NUM_VAL_TYPE_INT);
+ used |= 1<<input_get_ct_number_type(cts_type);
+ }
+
+ for (i=CTTEXT_TYPE_MOBILE;i<CTTEXT_TYPE_OTHER;i++) {
+ if (!(used & 1<<i))
+ return i;
+ }
+ return CTTEXT_TYPE_OTHER;
+}
+
+int ct_input_next_email_type(CTSstruct *contact)
+{
+ int i;
+ int used = 0;
+ GSList *list = NULL, *cursor;
+ contacts_svc_struct_get_list(contact, CTS_CF_EMAIL_LIST, &list);
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ if (contacts_svc_value_get_bool(cursor->data, CTS_EMAIL_VAL_DELETE_BOOL))
+ continue;
+
+ used |= 1<<contacts_svc_value_get_int(cursor->data, CTS_EMAIL_VAL_TYPE_INT);
+ }
+
+ for (i=CTS_EMAIL_TYPE_HOME;i<=CTS_EMAIL_TYPE_WORK;i++) {
+ if (!(used & 1<<i))
+ return i;
+ }
+
+ return CTS_EMAIL_TYPE_NONE;
+}
+
+int ct_input_next_addr_type(CTSstruct *contact)
+{
+ int i;
+ int type = CTS_ADDR_TYPE_NONE;
+ GSList *list = NULL, *cursor;
+ contacts_svc_struct_get_list(contact, CTS_CF_POSTAL_ADDR_LIST, &list);
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ if (contacts_svc_value_get_bool(cursor->data, CTS_POSTAL_VAL_DELETE_BOOL))
+ continue;
+
+ type |= contacts_svc_value_get_int(cursor->data, CTS_POSTAL_VAL_TYPE_INT);
+ }
+
+ for (i=CTS_ADDR_TYPE_HOME;i<=CTS_ADDR_TYPE_WORK;i++) {
+ if (!(type & i))
+ return i;
+ }
+
+ return CTS_ADDR_TYPE_NONE;
+}
+
+int ct_input_next_web_type(CTSstruct *contact)
+{
+ int i;
+ int used = 0;
+ GSList *list = NULL, *cursor;
+ contacts_svc_struct_get_list(contact, CTS_CF_WEB_ADDR_LIST, &list);
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ if (contacts_svc_value_get_bool(cursor->data, CTS_WEB_VAL_DELETE_BOOL))
+ continue;
+
+ used |= 1<<contacts_svc_value_get_int(cursor->data, CTS_WEB_VAL_TYPE_INT);
+ }
+
+ for (i=CTS_WEB_TYPE_HOME;i<=CTS_WEB_TYPE_WORK;i++) {
+ if (!(used & 1<<i))
+ return i;
+ }
+
+ return CTS_WEB_TYPE_NONE;
+}
+
+int ct_input_next_messenger_type(CTSstruct *contact)
+{
+ int i;
+ int used = 0;
+ GSList *list = NULL, *cursor;
+ contacts_svc_struct_get_list(contact, CTS_CF_MESSENGER_LIST, &list);
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ if (contacts_svc_value_get_bool(cursor->data, CTS_MESSENGER_VAL_DELETE_BOOL))
+ continue;
+
+ used |= 1<<contacts_svc_value_get_int(cursor->data, CTS_MESSENGER_VAL_TYPE_INT);
+ }
+
+ for (i=CTS_IM_TYPE_GOOGLE;i<=CTS_IM_TYPE_IRC;i++) {
+ if (!(used & 1<<i))
+ return i;
+ }
+
+ return CTS_IM_TYPE_NONE;
+}
+
+
+Evas_Object* ct_input_create_dg_layout(Evas_Object *parent, const char *theme)
+{
+ Evas_Object *layout = elm_layout_add(parent);
+ p_retvm_if(NULL == layout, NULL, "elm_layout_add() return NULL");
+
+ elm_layout_theme_set(layout, "layout", "dialogue", theme);
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, 0.0);
+
+ evas_object_show(layout);
+ return layout;
+}
+
+void ct_input_typed_layout_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ ct_input_typed_data *typed_data = data;
+ free(typed_data);
+}
+
+void ct_input_update_ringtone(CTSstruct *contact, Evas_Object *layout)
+{
+ int ret;
+ CTSvalue *value;
+ const char *display;
+ const char *temp;
+ Evas_Object *btn;
+
+ ret = contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &value);
+ p_retm_if(CTS_SUCCESS != ret && CTS_ERR_NO_DATA != ret, "contacts_svc_struct_get_value() Failed(%d)", ret);
+
+ temp = contacts_svc_value_get_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR);
+ display = ct_detail_get_ringtone_display_name(temp);
+ elm_object_part_text_set(layout, "elm.text.2", display);
+
+ btn = elm_object_part_content_get(layout, "elm.icon");
+ p_retm_if(NULL == btn, "elm_object_part_content_get() return NULL");
+
+ if (NULL == temp || '\0' == *temp) {
+ elm_object_focus_set(btn, EINA_FALSE);
+ elm_object_disabled_set(btn, EINA_TRUE);
+ }
+ else
+ elm_object_disabled_set(btn, EINA_FALSE);
+}
+
+unsigned int ct_input_box_idx_get(Evas_Object *box, Evas_Object *obj)
+{
+ int count = 0;
+ Eina_List *list, *cursor;
+ Evas_Object *data;
+ list = elm_box_children_get(box);
+
+ EINA_LIST_FOREACH(list, cursor, data) {
+ if (data == obj)
+ break;
+ count++;
+ }
+ eina_list_free(list);
+ return count;
+}
+
+void ct_input_save_button_update(ct_input_data *cinput_d)
+{
+ Evas_Object *save_btn;
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ save_btn = elm_object_item_part_content_get(cinput_d->navi_item, "title_left_btn");
+ if (save_btn)
+ elm_object_disabled_set(save_btn, cinput_d->save_disable);
+
+ if (cinput_d->save_btn)
+ elm_object_item_disabled_set(cinput_d->save_btn, cinput_d->save_disable);
+}
+
+static inline Eina_Bool input_is_editfield_empty(Evas_Object *editfield)
+{
+ const char *val;
+ Evas_Object *entry;
+
+ entry = elm_object_part_content_get(editfield, "elm.swallow.content");
+ p_retvm_if(NULL == entry, EINA_FALSE, "elm_object_part_content_get() return NULL");
+
+ val = elm_entry_entry_get(entry);
+ if (val && *val)
+ return EINA_FALSE;
+
+ return EINA_TRUE;
+}
+
+static void input_name_field_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int idx;
+ Evas_Object *ly;
+ Evas_Object *ly_content;
+ Evas_Object *ef;
+ Eina_List *list;
+ ct_input_data *cinput_d = data;
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ ef = elm_object_part_content_get(cinput_d->ly_baseinfo, "elm.icon.name1");
+ if (EINA_FALSE == input_is_editfield_empty(ef)) {
+ if (EINA_FALSE == cinput_d->save_disable)
+ return;
+ cinput_d->save_disable = EINA_FALSE;
+ ct_input_save_button_update(cinput_d);
+ return;
+ }
+
+ ef = elm_object_part_content_get(cinput_d->ly_baseinfo, "elm.icon.name2");
+ if (EINA_FALSE == input_is_editfield_empty(ef)) {
+ if (EINA_FALSE == cinput_d->save_disable)
+ return;
+ cinput_d->save_disable = EINA_FALSE;
+ ct_input_save_button_update(cinput_d);
+ return;
+ }
+
+ list = elm_box_children_get(cinput_d->box);
+
+ ly = cinput_d->ly_number_first;
+ idx = ct_input_box_idx_get(cinput_d->box, ly);
+ while (ly) {
+ ly_content = elm_object_part_content_get(ly, "elm.swallow.decorate.content");
+ ef = elm_object_part_content_get(ly_content, "elm.flip.content");
+ if (EINA_FALSE == input_is_editfield_empty(ef)) {
+ if (EINA_FALSE == cinput_d->save_disable) {
+ eina_list_free(list);
+ return;
+ }
+ cinput_d->save_disable = EINA_FALSE;
+ ct_input_save_button_update(cinput_d);
+ eina_list_free(list);
+ return;
+ }
+ if (ly == cinput_d->ly_number_last)
+ break;
+ ly = eina_list_nth(list, ++idx);
+ }
+
+ ly = cinput_d->ly_email_first;
+ idx = ct_input_box_idx_get(cinput_d->box, ly);
+ while (ly) {
+ ly_content = elm_object_part_content_get(ly, "elm.swallow.decorate.content");
+ ef = elm_object_part_content_get(ly_content, "elm.flip.content");
+ if (EINA_FALSE == input_is_editfield_empty(ef)) {
+ if (EINA_FALSE == cinput_d->save_disable) {
+ eina_list_free(list);
+ return;
+ }
+ cinput_d->save_disable = EINA_FALSE;
+ ct_input_save_button_update(cinput_d);
+ eina_list_free(list);
+ return;
+ }
+ if (ly == cinput_d->ly_email_last)
+ break;
+ ly = eina_list_nth(list, ++idx);
+ }
+
+ eina_list_free(list);
+
+ if (EINA_TRUE == cinput_d->save_disable)
+ return;
+ cinput_d->save_disable = EINA_TRUE;
+ ct_input_save_button_update(cinput_d);
+}
+
+void ct_input_name_field_add(Evas_Object *editfield, ct_input_data *cinput_d)
+{
+ Evas_Object *entry;
+
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+ p_retm_if(NULL == editfield, "parameter(editfield) is NULL");
+
+ entry = elm_object_part_content_get(editfield, "elm.swallow.content");
+ p_retm_if(NULL == cinput_d, "elm_object_part_content_get() return NULL");
+
+ evas_object_smart_callback_add(entry, "changed", input_name_field_changed_cb, cinput_d);
+ evas_object_smart_callback_add(entry, "preedit,changed", input_name_field_changed_cb, cinput_d);
+}
+
+int ct_input_get_full_address(CTSvalue *postal, char *buf, int buf_len)
+{
+ const char *code;
+ const char *region;
+ const char *locality;
+ const char *street;
+ const char *extended;
+ const char *country;
+ const char *pobox;
+
+ code = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_POSTALCODE_STR);
+ extended = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_EXTENDED_STR);
+ pobox = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_POBOX_STR);
+ street = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_STREET_STR);
+ locality = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_LOCALITY_STR);
+ region = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_REGION_STR);
+ country = contacts_svc_value_get_str(postal, CTS_POSTAL_VAL_COUNTRY_STR);
+
+ snprintf(buf, buf_len, "%s%s%s%s%s%s%s%s%s%s%s%s%s", SAFE_STR(code), STR_BLANK(code, extended), STR_BLANK(extended, pobox),
+ STR_BLANK(pobox, street), STR_BLANK(street, locality), STR_BLANK(locality, region), STR_BLANK(region, country));
+
+ return 0;
+}
+
diff --git a/lib/details/ct-input-utils.h b/lib/details/ct-input-utils.h
new file mode 100755
index 0000000..cece9a2
--- /dev/null
+++ b/lib/details/ct-input-utils.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CONTACTS_INPUT_UTILS_H__
+#define __CONTACTS_INPUT_UTILS_H__
+
+CTSvalue* ct_input_get_event(CTSstruct *contact, int event_type);
+int ct_input_get_base_ab(void);
+void ct_input_camera(void *data, Evas_Object *obj, void *event_info);
+void ct_input_gallery(void *data, Evas_Object *obj, void *event_info);
+void ct_input_myfile_ringtone(ct_input_data *cinput_d);
+void ct_input_save_cb(void *data, Evas_Object *obj, void *event_info);
+void ct_input_set_default_num(ct_input_data *cinput_d, CTSvalue *val);
+CTSvalue* ct_input_get_nickname(CTSstruct *contact);
+CTSvalue* ct_input_get_website_value(CTSstruct* contact);
+int ct_input_get_number_type(int ct_num_type);
+void ct_input_contact_image_change_popup(ct_input_data *cinput_d, bool has_photo);
+void ct_input_entry_changed_cb(void *data, Evas_Object *obj, void *event_info);
+Evas_Object* ct_input_add_editfield(Evas_Object *parent, const char* guide_txt,
+ Evas_Smart_Cb unfocused_cb, void *unfocused_cb_data);
+int ct_input_next_number_type(CTSstruct *contact);
+int ct_input_next_email_type(CTSstruct *contact);
+int ct_input_next_addr_type(CTSstruct *contact);
+int ct_input_next_web_type(CTSstruct *contact);
+int ct_input_next_messenger_type(CTSstruct *contact);
+
+enum {
+ INPUT_LAYOUT_NONE,
+ INPUT_LAYOUT_RENAME,
+ INPUT_LAYOUT_EDIT,
+};
+Evas_Object* ct_input_create_dg_layout(Evas_Object *parent, const char *theme);
+void ct_input_typed_layout_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+void ct_input_update_ringtone(CTSstruct *contact, Evas_Object *layout);
+unsigned int ct_input_box_idx_get(Evas_Object *box, Evas_Object *obj);
+void ct_input_save_button_update(ct_input_data *cinput_d);
+void ct_input_name_field_add(Evas_Object *editfield, ct_input_data *cinput_d);
+int ct_input_get_full_address(CTSvalue *postal, char *buf, int buf_len);
+
+#endif //__CONTACTS_INPUT_UTILS_H__
diff --git a/lib/details/ct-input-view.c b/lib/details/ct-input-view.c
new file mode 100755
index 0000000..9d0eccd
--- /dev/null
+++ b/lib/details/ct-input-view.c
@@ -0,0 +1,2634 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <errno.h>
+#include <Ecore_X.h>
+#include "phone.h"
+#include "ct-detail.h"
+#include "ct-detail-utils.h"
+#include "ct-detail-view.h"
+#include "ct-input-utils.h"
+#include "ct-input-view.h"
+#include "ct-input-num-email.h"
+
+static Eina_Bool input_fill_layout(void *data);
+static void input_update_address(ct_input_data *cinput_d);
+static Evas_Object* input_add_new_address(ct_input_data *cinput_d);
+static Evas_Object* input_add_new_website(ct_input_data *cinput_d);
+static Evas_Object* input_add_new_messenger(ct_input_data *cinput_d);
+static void input_update_event(Evas_Object *layout, CTSvalue *value);
+static void input_baseinfo_expand_clicked_cb(void *data, Evas_Object *obj, void *event_info);
+
+enum input_items {
+ INPUT_BASEINFO = 0,
+ INPUT_NUMBER,
+ INPUT_EMAIL,
+ INPUT_ADDRESS,
+ INPUT_MESSENGER,
+ INPUT_URL,
+ INPUT_RELATIONSHIP,
+ INPUT_BIRTHDAY,
+ INPUT_ANNIVERSARY,
+ INPUT_NOTE,
+ INPUT_RINGTONE,
+ INPUT_MORE_INFO,
+ INPUT_ITEMS_MAX,
+};
+
+enum input_more_fiels {
+ INPUT_MORE_JOB_TITLE,
+ INPUT_MORE_DEPARTMENT,
+ INPUT_MORE_MESSENGER,
+ INPUT_MORE_URL,
+ INPUT_MORE_RELATIONSHIP,
+ INPUT_MORE_BIRTHDAY,
+ INPUT_MORE_ANNIVERSARY,
+ INPUT_MORE_NOTE,
+};
+
+#define CT_INPUT_ADDRESS_MAX_CHAR 1000
+
+static void input_layout_mouse_up_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *layout = (Evas_Object *) data;
+ elm_object_signal_emit(layout, "elm,state,unselected", "elm");
+}
+
+static void input_layout_mouse_move_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
+{
+ Evas_Event_Mouse_Move *ev = (Evas_Event_Mouse_Move *)event_info;
+ Evas_Object *layout = (Evas_Object *) data;
+ if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
+ elm_object_signal_emit(layout, "elm,state,unselected", "elm");
+}
+
+static void input_layout_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *layout = (Evas_Object *) data;
+ elm_object_signal_emit(layout, "elm,state,selected", "elm");
+}
+
+static void input_layout_selectable_set(Evas_Object *layout)
+{
+ p_retm_if(NULL == layout, "parameter(layout) is NULL");
+ evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_UP, input_layout_mouse_up_cb, layout);
+ evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_DOWN, input_layout_mouse_down_cb, layout);
+ evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_MOVE, input_layout_mouse_move_cb, layout);
+}
+
+static inline CTSvalue* input_new_address(CTSstruct *contact)
+{
+ int ret;
+ int type;
+ GSList *list;
+ CTSvalue *value;
+
+ value = contacts_svc_value_new(CTS_VALUE_POSTAL);
+ p_retvm_if(NULL == value, NULL, "contacts_svc_value_new() return NULL");
+
+ type = ct_input_next_addr_type(contact);
+ contacts_svc_value_set_int(value, CTS_POSTAL_VAL_TYPE_INT, type);
+
+ list = NULL;
+ list = g_slist_append(list, value);
+
+ ret = contacts_svc_struct_store_list(contact, CTS_CF_POSTAL_ADDR_LIST, list);
+ g_slist_free(list);
+ p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret);
+
+ return value;
+}
+
+static inline CTSvalue* input_new_event(CTSstruct *contact, int event_type)
+{
+ int ret;
+ GSList *list;
+ CTSvalue *value;
+
+ value = contacts_svc_value_new(CTS_VALUE_EVENT);
+
+ ret = contacts_svc_value_set_int(value, CTS_EVENT_VAL_TYPE_INT, event_type);
+ p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_value_set_int() failed(%d)", ret);
+
+ list = NULL;
+ list = g_slist_append(list, value);
+ ret = contacts_svc_struct_store_list(contact, CTS_CF_EVENT_LIST, list);
+ g_slist_free(list);
+ p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret);
+
+ ret = contacts_svc_value_set_bool(value, CTS_EVENT_VAL_DELETE_BOOL, true);
+ p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ return value;
+}
+
+static inline CTSvalue* input_new_name(CTSstruct *contact)
+{
+ int ret;
+ CTSvalue *name;
+
+ name = contacts_svc_value_new(CTS_VALUE_NAME);
+ ret = contacts_svc_struct_store_value(contact, CTS_CF_NAME_VALUE, name);
+ p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_value() failed(%d)", ret);
+
+ return name;
+}
+
+
+static inline CTSvalue* input_new_nickname(CTSstruct *contact)
+{
+ int ret;
+ GSList *list;
+ CTSvalue *value;
+
+ value = contacts_svc_value_new(CTS_VALUE_NICKNAME);
+
+ list = NULL;
+ list = g_slist_append(list, value);
+ ret = contacts_svc_struct_store_list(contact, CTS_CF_NICKNAME_LIST, list);
+ g_slist_free(list);
+ p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret);
+
+ return value;
+}
+
+static inline CTSvalue* input_new_web(CTSstruct *contact)
+{
+ int ret;
+ int type;
+ GSList *list;
+ CTSvalue *value;
+
+ value = contacts_svc_value_new(CTS_VALUE_WEB);
+ p_retvm_if(NULL == value, NULL, "contacts_svc_value_new() return NULL");
+
+ type = ct_input_next_web_type(contact);
+ contacts_svc_value_set_int(value, CTS_WEB_VAL_TYPE_INT, type);
+
+ list = NULL;
+ list = g_slist_append(list, value);
+ ret = contacts_svc_struct_store_list(contact, CTS_CF_WEB_ADDR_LIST, list);
+ g_slist_free(list);
+ p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret);
+
+ return value;
+}
+
+static inline CTSvalue* input_new_messenger(CTSstruct *contact)
+{
+ int ret;
+ int type;
+ GSList *list;
+ CTSvalue *value;
+
+ value = contacts_svc_value_new(CTS_VALUE_MESSENGER);
+ p_retvm_if(NULL == value, NULL, "contacts_svc_value_new() return NULL");
+
+ type = ct_input_next_messenger_type(contact);
+ contacts_svc_value_set_int(value, CTS_MESSENGER_VAL_TYPE_INT, type);
+
+ list = NULL;
+ list = g_slist_append(list, value);
+ ret = contacts_svc_struct_store_list(contact, CTS_CF_MESSENGER_LIST, list);
+ g_slist_free(list);
+ p_retvm_if(ret < CTS_SUCCESS, NULL, "contacts_svc_struct_store_list() failed(%d)", ret);
+
+ ret = contacts_svc_value_set_bool(value, CTS_MESSENGER_VAL_DELETE_BOOL, true);
+ p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ return value;
+}
+
+static inline CTSvalue* input_new_company(CTSstruct *contact)
+{
+ int ret;
+ CTSvalue *value;
+
+ value = contacts_svc_value_new(CTS_VALUE_COMPANY);
+ p_retvm_if(NULL == value, NULL, "contacts_svc_value_new() return NULL");
+
+ ret = contacts_svc_struct_store_value(contact, CTS_CF_COMPANY_VALUE, value);
+ p_retvm_if(CTS_SUCCESS != ret, NULL, "contacts_svc_struct_store_value() failed(%d)", ret);
+
+ return value;
+}
+
+static void input_contacts_changed(void *user_data)
+{
+ int id_ab, type, ret;
+ bool changed = false;
+ CTSiter *iter;
+ CTSvalue *value;
+ ct_input_data *cinput_d = user_data;
+ ct_detail_data *cdetail_d = cinput_d->cdetail_d;
+
+ p_retm_if(NULL == cdetail_d, "ct_detail_data is NULL");
+ p_retm_if(NULL == cinput_d->contact, "Contact is NULL");
+
+ if (cinput_d->saved)
+ return;
+
+ contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_BASE_INFO_VALUE, &value);
+ id_ab = contacts_svc_value_get_int(value, CTS_BASE_VAL_ADDRESSBOOK_ID_INT);
+
+ ret = contacts_svc_get_updated_contacts(id_ab, cinput_d->view_create_ver, &iter);
+ p_retm_if(CTS_SUCCESS != ret, "contacts_svc_get_updated_contacts() Failed(%d)", ret);
+
+ while (CTS_SUCCESS == contacts_svc_iter_next(iter)) {
+ value = contacts_svc_iter_get_info(iter);
+ if (contacts_svc_value_get_int(value, CTS_LIST_CHANGE_ID_INT) == cinput_d->contact_id) {
+ changed = true;
+ type = contacts_svc_value_get_int(value, CTS_LIST_CHANGE_TYPE_INT);
+ contacts_svc_value_free(value);
+ break;
+ }
+ contacts_svc_value_free(value);
+ }
+ contacts_svc_iter_remove(iter);
+ p_ret_if(!changed);
+ if (CTS_OPERATION_UPDATED == type || (CTS_OPERATION_DELETED == type && !cdetail_d->has_detail))
+ elm_naviframe_item_pop(cdetail_d->navi);
+}
+
+
+static void input_view_delete_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ ct_input_data *cinput_d = data;
+ ct_detail_data *cdetail_d = cinput_d->cdetail_d;
+
+ if (cinput_d->contact_id) {
+ ret = contacts_svc_unsubscribe_change_with_data(CTS_SUBSCRIBE_CONTACT_CHANGE,
+ input_contacts_changed, cinput_d);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_unsubscribe_change_with_data() Failed(%d)", ret);
+ }
+ if (cinput_d->win_prop_change)
+ ecore_event_handler_del(cinput_d->win_prop_change);
+ contacts_svc_struct_free(cinput_d->contact);
+
+ if (cdetail_d->has_detail) {
+ cdetail_d->has_input = false;
+ }
+ else {
+ if (cdetail_d && cdetail_d->child_ug)
+ ug_destroy(cdetail_d->child_ug);
+
+ if (cdetail_d && cdetail_d->popup)
+ evas_object_del(cdetail_d->popup);
+
+ free(cdetail_d->base_ab_name);
+ contacts_svc_struct_free(cdetail_d->contact);
+ free(cdetail_d);
+ }
+
+ if (cinput_d->crop_ug)
+ ug_destroy(cinput_d->crop_ug);
+
+ if (cinput_d->src_ug)
+ ug_destroy(cinput_d->src_ug);
+
+ free(cinput_d->base_ab_name);
+ free(cinput_d);
+}
+
+
+static void input_nick_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ char *input;
+ CTSvalue *value;
+ ct_input_data *cinput_d = data;
+
+ value = ct_input_get_nickname(cinput_d->contact);
+ if (NULL == value)
+ value = input_new_nickname(cinput_d->contact);
+
+ input = ctui_entry_markup_to_utf8(elm_entry_entry_get(obj));
+ p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL");
+
+ contacts_svc_value_set_str(value, CTS_NICKNAME_VAL_NAME_STR, input);
+ free(input);
+}
+
+static void input_website_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ char *input;
+ Evas_Object *entry = obj;
+ CTSvalue *value = data;
+
+ p_retm_if(NULL == value, "parameter(value) is NULL");
+
+ input = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry));
+ p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL");
+
+ if (*input) {
+ ret = contacts_svc_value_set_str(value, CTS_WEB_VAL_ADDR_STR, input);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret);
+
+ ret = contacts_svc_value_set_bool(value, CTS_WEB_VAL_DELETE_BOOL, false);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+ }
+ else {
+ ret = contacts_svc_value_set_bool(value, CTS_WEB_VAL_DELETE_BOOL, true);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+ }
+
+ free(input);
+}
+
+static void input_note_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ char *input;
+ Evas_Object *entry = obj;
+ CTSvalue *value = data;
+
+ input = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry));
+ p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL");
+
+ ret = contacts_svc_value_set_str(value, CTS_BASE_VAL_NOTE_STR, input);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret);
+ free(input);
+}
+
+static inline const char* input_get_contact_image_path(CTSstruct *contact)
+{
+ CTSvalue *base_info;
+ const char *img_path;
+
+ contacts_svc_struct_get_value(contact, CTS_CF_BASE_INFO_VALUE, &base_info);
+ img_path = contacts_svc_value_get_str(base_info, CTS_BASE_VAL_IMG_PATH_STR);
+
+ return img_path;
+}
+
+static void input_img_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ const char *value_data;
+
+ ct_input_data *cinput_d = data;
+ p_retm_if(NULL == cinput_d, "parameter(ct_input_data) is NULL");
+
+ if(cinput_d->cdetail_d->ug)
+ return;
+
+
+ value_data = input_get_contact_image_path(cinput_d->contact);
+
+ if (NULL == value_data)
+ ct_input_contact_image_change_popup(cinput_d, false);
+ else
+ ct_input_contact_image_change_popup(cinput_d, true);
+}
+
+static void input_set_name_value(Evas_Object *entry, int field, ct_input_data *cinput_d)
+{
+ int ret;
+ char *name;
+ CTSvalue *value;
+
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_NAME_VALUE, &value);
+ if (CTS_ERR_NO_DATA == ret) {
+ value = input_new_name(cinput_d->contact);
+ }
+ else if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_struct_get_value() failed(%d)", ret);
+ return;
+ }
+
+ name = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry));
+ p_retm_if(NULL == name, "ctui_entry_markup_to_utf8() return NULL");
+
+ ret = contacts_svc_value_set_str(value, CTS_NAME_VAL_DISPLAY_STR, NULL);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret);
+
+ ret = contacts_svc_value_set_str(value, field, name);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret);
+
+ free(name);
+
+}
+
+static void input_firstname_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ input_set_name_value(obj, CTS_NAME_VAL_FIRST_STR, data);
+}
+
+static void input_lastname_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ input_set_name_value(obj, CTS_NAME_VAL_LAST_STR, data);
+}
+
+static void input_middle_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ input_set_name_value(obj, CTS_NAME_VAL_ADDITION_STR, data);
+}
+
+static void input_suffix_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ input_set_name_value(obj, CTS_NAME_VAL_SUFFIX_STR, data);
+}
+
+static void input_set_company_value(Evas_Object *entry, int field, ct_input_data *cinput_d)
+{
+ int ret;
+ char *str;
+ CTSvalue *value;
+
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_COMPANY_VALUE, &value);
+ if (CTS_ERR_NO_DATA == ret)
+ value = input_new_company(cinput_d->contact);
+ else if (CTS_SUCCESS != ret) {
+ ERR("contacts_svc_struct_get_value() failed(%d)", ret);
+ return;
+ }
+
+ str = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry));
+ p_retm_if(NULL == str, "ctui_entry_markup_to_utf8() return NULL");
+
+ ret = contacts_svc_value_set_str(value, field, str);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret);
+
+ free(str);
+}
+
+static void input_job_title_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ input_set_company_value(obj, CTS_COMPANY_VAL_JOB_TITLE_STR, data);
+}
+
+static void input_department_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ input_set_company_value(obj, CTS_COMPANY_VAL_DEPARTMENT_STR, data);
+}
+
+static void input_company_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ input_set_company_value(obj, CTS_COMPANY_VAL_NAME_STR, data);
+}
+
+
+static inline Evas_Object* input_editfield_entry_set(Evas_Object *ef, const char *text)
+{
+ Evas_Object *en = elm_object_part_content_get(ef, "elm.swallow.content");
+ p_retvm_if(NULL == en, NULL, "elm_object_part_content_get() return NULL");
+
+ if (text && *text) {
+ elm_entry_entry_set(en, text);
+ }
+ return en;
+}
+
+static Evas_Object* input_fill_layout_baseinfo_expand(ct_input_data *cinput_d, const char* guide_text,
+ Evas_Smart_Cb unfocused_cb, int type_struct, int type_value)
+{
+ int ret;
+ const char *display;
+ CTSvalue *value;
+ Evas_Object *ly_content;
+ Evas_Object *ef;
+ Evas_Object *box = cinput_d->box;
+ Evas_Object *bt_expand;
+
+ ly_content = elm_layout_add(box);
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_layout_file_set(ly_content, CONTACTS_EDJ, "dialogue/baseinfo.expand.2icon");
+ evas_object_size_hint_align_set(ly_content, EVAS_HINT_FILL, 0.0);
+ evas_object_show(ly_content);
+
+ if (CTS_NAME_VAL_LAST_STR == type_value && CTS_CF_NAME_VALUE == type_struct) {
+ bt_expand = elm_button_add(ly_content);
+ p_retvm_if(NULL == bt_expand, NULL, "elm_button_add() return NULL");
+ elm_object_part_content_set(ly_content, "elm.icon.expand", bt_expand);
+
+ elm_object_style_set(bt_expand, "icon_expand_closed");
+ evas_object_smart_callback_add(bt_expand, "clicked", input_baseinfo_expand_clicked_cb, cinput_d);
+ }
+
+ ef = ct_input_add_editfield(ly_content, guide_text, unfocused_cb, cinput_d);
+ p_retvm_if(NULL == ef, NULL, "ct_input_add_editfield() return NULL");
+ elm_object_part_content_set(ly_content, "elm.icon.name", ef);
+
+ if (-1 == type_struct) {
+ value = ct_input_get_nickname(cinput_d->contact);
+ p_warn_if(NULL == value, "ct_input_get_nickname() return NULL");
+ }
+ else {
+ ret = contacts_svc_struct_get_value(cinput_d->contact, type_struct, &value);
+ p_warn_if(CTS_SUCCESS != ret && CTS_ERR_NO_DATA != ret, "contacts_svc_struct_get_value() Failed(%d)", ret);
+ }
+
+ display = contacts_svc_value_get_str(value, type_value);
+ input_editfield_entry_set(ef, display);
+
+ return ly_content;
+}
+
+static void input_expand_baseinfo(ct_input_data *cinput_d)
+{
+ Evas_Object *layout;
+
+ elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_expand);
+ evas_object_del(cinput_d->ly_baseinfo_expand);
+ cinput_d->ly_baseinfo_expand = NULL;
+
+ layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_LASTNAME),
+ input_lastname_unfocused_cb, CTS_CF_NAME_VALUE, CTS_NAME_VAL_LAST_STR);
+ p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL");
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo);
+ cinput_d->ly_baseinfo_last = layout;
+
+ layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_SUFFIX),
+ input_suffix_unfocused_cb, CTS_CF_NAME_VALUE, CTS_NAME_VAL_SUFFIX_STR);
+ p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL");
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_last);
+ cinput_d->ly_baseinfo_suffix = layout;
+
+ layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_NICKNAME),
+ input_nick_unfocused_cb, -1, CTS_NICKNAME_VAL_NAME_STR);
+ p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL");
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_suffix);
+ cinput_d->ly_baseinfo_nick = layout;
+
+ if (cinput_d->add_job_title) {
+ layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_JOB_TITLE),
+ input_job_title_unfocused_cb, CTS_CF_COMPANY_VALUE, CTS_COMPANY_VAL_JOB_TITLE_STR);
+ p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL");
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_nick);
+ cinput_d->ly_baseinfo_job_title = layout;
+ }
+
+ if (cinput_d->add_department) {
+ layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_DEPARTMENT),
+ input_department_unfocused_cb, CTS_CF_COMPANY_VALUE, CTS_COMPANY_VAL_DEPARTMENT_STR);
+ p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL");
+ if (cinput_d->ly_baseinfo_job_title)
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_job_title);
+ else
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_nick);
+ cinput_d->ly_baseinfo_department = layout;
+ }
+ layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_COMPANY),
+ input_company_unfocused_cb, CTS_CF_COMPANY_VALUE, CTS_COMPANY_VAL_NAME_STR);
+ p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL");
+
+ if (cinput_d->ly_baseinfo_job_title)
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_job_title);
+ else if (cinput_d->ly_baseinfo_department)
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_department);
+ else
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_nick);
+ cinput_d->ly_baseinfo_company = layout;
+
+ if (!cinput_d->ly_seperator_baseinfo) {
+ cinput_d->ly_seperator_baseinfo = ct_input_fill_layout_separator(cinput_d, "separator/hd16");
+ p_retm_if(NULL == layout, "ct_input_fill_layout_separator() return NULL");
+ elm_box_pack_after(cinput_d->box, cinput_d->ly_seperator_baseinfo, cinput_d->ly_baseinfo_company);
+ }
+}
+
+static Evas_Object* input_fill_layout_baseinfo_expand_button(ct_input_data *cinput_d)
+{
+ Evas_Object *ly_content;
+ Evas_Object *box = cinput_d->box;
+ Evas_Object *bt_expand;
+
+ ly_content = elm_layout_add(box);
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_layout_file_set(ly_content, CONTACTS_EDJ, "dialogue/baseinfo.1text.1icon");
+ evas_object_size_hint_align_set(ly_content, EVAS_HINT_FILL, 0.0);
+ evas_object_show(ly_content);
+
+ bt_expand = elm_button_add(ly_content);
+ p_retvm_if(NULL == bt_expand, NULL, "elm_button_add() return NULL");
+ elm_object_part_content_set(ly_content, "elm.icon", bt_expand);
+
+ elm_object_style_set(bt_expand, "icon_expand_opened");
+ evas_object_smart_callback_add(bt_expand, "clicked", input_baseinfo_expand_clicked_cb, cinput_d);
+
+ cinput_d->ly_baseinfo_expand = ly_content;
+
+ return ly_content;
+}
+
+static inline void input_close_baseinfo(ct_input_data *cinput_d)
+{
+ Evas_Object *layout;
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ layout = input_fill_layout_baseinfo_expand_button(cinput_d);
+ p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand_button() return NULL");
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo);
+
+ elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_last);
+ elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_suffix);
+ elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_nick);
+ elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_company);
+
+ evas_object_del(cinput_d->ly_baseinfo_last);
+ evas_object_del(cinput_d->ly_baseinfo_suffix);
+ evas_object_del(cinput_d->ly_baseinfo_nick);
+ evas_object_del(cinput_d->ly_baseinfo_company);
+
+ cinput_d->ly_baseinfo_last = NULL;
+ cinput_d->ly_baseinfo_suffix = NULL;
+ cinput_d->ly_baseinfo_nick = NULL;
+ cinput_d->ly_baseinfo_company = NULL;
+
+ if (cinput_d->ly_baseinfo_job_title) {
+ elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_job_title);
+ evas_object_del(cinput_d->ly_baseinfo_job_title);
+ cinput_d->ly_baseinfo_job_title = NULL;
+ }
+
+ if (cinput_d->ly_baseinfo_department) {
+ elm_box_unpack(cinput_d->box, cinput_d->ly_baseinfo_department);
+ evas_object_del(cinput_d->ly_baseinfo_department);
+ cinput_d->ly_baseinfo_department = NULL;
+ }
+}
+
+static void input_update_baseinfo_field(ct_input_data *cinput_d)
+{
+ int ret;
+ const char *name;
+ CTSvalue *value;
+ Evas_Object *ef;
+ Evas_Object *ly_content;
+
+ ly_content = cinput_d->ly_baseinfo;
+
+ // closed
+ if (!cinput_d->ly_baseinfo_last) {
+ /* middle name */
+ ef = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_LASTNAME),
+ input_lastname_unfocused_cb, cinput_d);
+ p_retm_if(NULL == ef, "ct_input_add_editfield() return NULL");
+ elm_object_part_content_set(ly_content, "elm.icon.name2", ef);
+
+ ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_NAME_VALUE, &value);
+ if (CTS_SUCCESS == ret) {
+ name = contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR);
+ input_editfield_entry_set(ef, name);
+ }
+ }
+ else {
+ /* last name */
+ ef = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_MIDDLE),
+ input_middle_unfocused_cb, cinput_d);
+ p_retm_if(NULL == ef, "ct_input_add_editfield() return NULL");
+ elm_object_part_content_set(ly_content, "elm.icon.name2", ef);
+
+ ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_NAME_VALUE, &value);
+ if (CTS_SUCCESS == ret) {
+ name = contacts_svc_value_get_str(value, CTS_NAME_VAL_ADDITION_STR);
+ input_editfield_entry_set(ef, name);
+ }
+ }
+}
+
+static void input_baseinfo_expand_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_input_data *cinput_d = data;
+ if (cinput_d->ly_baseinfo_last)
+ input_close_baseinfo(cinput_d);
+ else
+ input_expand_baseinfo(cinput_d);
+ input_update_baseinfo_field(cinput_d);
+}
+
+static void input_event_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int year;
+ int month;
+ int day;
+ int ret;
+ CTSvalue *value = data;
+ ct_input_data *cinput_d;
+ struct tm currtime;
+
+ p_retm_if(NULL == value, "parameter(value) is NULL");
+
+ cinput_d = evas_object_data_get(obj, "cinput_d");
+ p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL");
+
+ elm_datetime_value_get(obj, &currtime);
+
+ year = currtime.tm_year + 1900;
+ month = currtime.tm_mon + 1;
+ day = currtime.tm_mday;
+
+ ret = contacts_svc_value_set_int(value, CTS_EVENT_VAL_DATE_INT,
+ year * 10000 + month * 100 + day);
+ p_retm_if(CTS_SUCCESS != ret, "contacts_svc_value_set_int() Failed(%d)", ret);
+
+ if (contacts_svc_value_get_bool(value, CTS_EVENT_VAL_DELETE_BOOL)) {
+ int event_type;
+ Evas_Object *layout;
+
+ ret = contacts_svc_value_set_bool(value, CTS_EVENT_VAL_DELETE_BOOL, false);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() Failed(%d)", ret);
+
+ event_type = contacts_svc_value_get_int(value, CTS_EVENT_VAL_TYPE_INT);
+ if (CTS_EVENT_TYPE_BIRTH == event_type)
+ layout = cinput_d->ly_birthday;
+ else
+ layout = cinput_d->ly_anniversary;
+ input_update_event(layout, value);
+ }
+}
+
+static void input_update_event(Evas_Object *layout, CTSvalue *value)
+{
+ time_t timer;
+ struct tm *stime;
+ Evas_Object *btn;
+ Evas_Object *datetime;
+ bool deleted = false;
+
+ datetime = elm_object_part_content_get(layout, "elm.icon.1");
+ p_retm_if(NULL == datetime, "elm_object_part_content_get() return NULL");
+
+ deleted = contacts_svc_value_get_bool(value, CTS_EVENT_VAL_DELETE_BOOL);
+
+ if (deleted) {
+ timer = time(NULL);
+ stime = localtime(&timer);
+ p_retm_if(NULL == stime, "localtime() Failed(%d)", errno);
+
+ evas_object_smart_callback_del(datetime, "changed", input_event_changed_cb);
+ elm_datetime_value_set(datetime, stime);
+ evas_object_smart_callback_add(datetime, "changed", input_event_changed_cb, value);
+ }
+
+ btn = elm_object_part_content_get(layout, "elm.icon.2");
+ p_retm_if(NULL == btn, "elm_object_part_content_get() return NULL");
+
+ if (deleted) {
+ elm_object_focus_set(btn, EINA_FALSE);
+ elm_object_disabled_set(btn, EINA_TRUE);
+ }
+ else
+ elm_object_disabled_set(btn, EINA_FALSE);
+}
+
+
+static void input_event_cancel_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int event_type;
+ ct_input_data *cinput_d;
+ CTSvalue *value = data;
+ Evas_Object *layout;
+
+ cinput_d = evas_object_data_get(obj, "cinput_d");
+ p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL");
+
+ contacts_svc_value_set_bool(value, CTS_EVENT_VAL_DELETE_BOOL, true);
+
+ event_type = contacts_svc_value_get_int(value, CTS_EVENT_VAL_TYPE_INT);
+ if (CTS_EVENT_TYPE_BIRTH == event_type)
+ layout = cinput_d->ly_birthday;
+ else
+ layout = cinput_d->ly_anniversary;
+ input_update_event(layout, value);
+}
+
+static void input_ringtone_cancel_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ CTSvalue *value;
+ ct_input_data *cinput_d = data;
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_BASE_INFO_VALUE, &value);
+ p_retm_if(CTS_SUCCESS != ret && CTS_ERR_NO_DATA != ret, "contacts_svc_struct_get_value() Failed(%d)", ret);
+
+ ret = contacts_svc_value_set_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR, NULL);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() Failed(%d)", ret);
+
+ ct_input_update_ringtone(cinput_d->contact, cinput_d->ly_ringtone);
+}
+
+static void input_addr_editfield_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ char *display;
+ Evas_Object *entry = obj;
+ CTSvalue *value = data;
+
+ display = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry));
+ p_retm_if(NULL == display, "ctui_entry_markup_to_utf8() return NULL");
+
+ ret = contacts_svc_value_set_str(value, CTS_POSTAL_VAL_STREET_STR, display);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() Failed(%d)", ret);
+
+ if (*display) {
+ ret = contacts_svc_value_set_bool(value, CTS_POSTAL_VAL_DELETE_BOOL, false);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() Failed(%d)", ret);
+ }
+
+ free(display);
+}
+
+static void input_addr_type_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int type = (int)data;
+ Evas_Object *ly_type;
+ ct_input_typed_data *typed_data;
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ contacts_svc_value_set_int(typed_data->value, CTS_POSTAL_VAL_TYPE_INT, type);
+
+ ly_type = elm_object_part_content_get(typed_data->ly_content, "elm.flip.content.title");
+ p_retm_if(NULL == ly_type, "elm_object_part_content_get() return NULL");
+
+ elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_POSTAL_TYPE, type));
+ evas_object_del(obj);
+}
+
+static void input_addr_type_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ int i;
+ int type;
+ int rotate;
+ int x, y, w, h;
+ Evas_Object *popup;
+ ct_input_data *cinput_d;
+ ct_input_typed_data *typed_data = data;
+ Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info;
+
+ if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
+ return;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+ if (ev->output.y < y || y + h < ev->output.y)
+ return;
+
+ p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL");
+
+ cinput_d = evas_object_data_get(obj, "cinput_d");
+ p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL");
+
+ popup = elm_ctxpopup_add(cinput_d->cdetail_d->win);
+ p_retm_if(NULL == popup, "elm_ctxpopup_add() return NULL");
+ cinput_d->cdetail_d->popup = popup;
+
+ rotate = (int)evas_object_data_get(cinput_d->cdetail_d->navi, "phone_rotate");
+ if (0 == rotate || 180 == rotate)
+ elm_ctxpopup_direction_priority_set(popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT);
+
+ evas_object_smart_callback_add(popup, "dismissed", ct_detail_popup_hide_cb, cinput_d->cdetail_d);
+ type = contacts_svc_value_get_int(typed_data->value, CTS_POSTAL_VAL_TYPE_INT);
+ evas_object_data_set(popup, "typed_data", typed_data);
+
+ for (i=CTS_ADDR_TYPE_HOME;i<=CTS_ADDR_TYPE_WORK;i++)
+ {
+ if (type == i) continue;
+ elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_POSTAL_TYPE, i), NULL,
+ input_addr_type_changed_cb, (void *)i);
+ }
+ if (type != CTS_ADDR_TYPE_NONE) {
+ elm_ctxpopup_item_append(popup, T_(CT_GET_TEXT_POSTAL_TYPE, CTS_ADDR_TYPE_NONE), NULL,
+ input_addr_type_changed_cb, (void *)CTS_ADDR_TYPE_NONE);
+ }
+ phone_move_ctxpopup(popup, obj);
+ evas_object_show(popup);
+}
+
+
+static void input_addr_del_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int idx;
+ Evas_Object *layout;
+ ct_input_data *cinput_d;
+ ct_input_typed_data *typed_data = data;
+ p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL");
+
+ cinput_d = evas_object_data_get(obj, "cinput_d");
+ p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL");
+
+ if (typed_data->ly_main == cinput_d->ly_addr_first) {
+ Eina_List *list;
+ idx = ct_input_box_idx_get(cinput_d->box, cinput_d->ly_addr_first);
+ list = elm_box_children_get(cinput_d->box);
+ layout = eina_list_nth(list, idx + 1);
+ eina_list_free(list);
+ cinput_d->ly_addr_first = layout;
+ }
+
+ contacts_svc_value_set_bool(typed_data->value, CTS_POSTAL_VAL_DELETE_BOOL, true);
+ elm_box_unpack(cinput_d->box, typed_data->ly_main);
+ evas_object_del(typed_data->ly_main);
+ input_update_address(cinput_d);
+}
+
+static void input_addr_add_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ Evas_Object *layout;
+ ct_input_data *cinput_d = data;
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ layout = input_add_new_address(data);
+ p_retm_if(NULL == layout, "input_add_new_address() return");
+ if (NULL == cinput_d->ly_addr_first)
+ cinput_d->ly_addr_first = layout;
+ cinput_d->ly_addr_last = layout;
+ input_update_address(data);
+}
+
+static void input_update_address(ct_input_data *cinput_d)
+{
+ int idx;
+ Eina_List *list, *cursor;
+ Evas_Object *btn;
+ Evas_Object *layout;
+ ct_input_typed_data *typed_data;
+
+ idx = ct_input_box_idx_get(cinput_d->box, cinput_d->ly_addr_first);
+ list = elm_box_children_get(cinput_d->box);
+ EINA_LIST_FOREACH(eina_list_nth_list(list, idx), cursor, layout) {
+ if (NULL == layout) continue;
+
+ btn = elm_object_part_content_get(layout, "elm.edit.icon");
+ if (NULL == btn) {
+ ERR("elm_object_part_content_get() return NULL");
+ break;
+ }
+
+ evas_object_smart_callback_del(btn, "clicked", input_addr_add_clicked_cb);
+ evas_object_smart_callback_del(btn, "clicked", input_addr_del_clicked_cb);
+
+ if (layout == cinput_d->ly_addr_last) {
+ elm_object_style_set(btn, "icon_plus");
+ evas_object_smart_callback_add(btn, "clicked", input_addr_add_clicked_cb, cinput_d);
+ break;
+ }
+ else {
+ typed_data = evas_object_data_get(layout, "typed_data");
+ if (NULL == typed_data) {
+ ERR("evas_object_data_get() return NULL");
+ break;
+ }
+ elm_object_style_set(btn, "icon_minus");
+ if (EINA_TRUE == elm_object_disabled_get(btn))
+ elm_object_disabled_set(btn, EINA_FALSE);
+ evas_object_smart_callback_add(btn, "clicked", input_addr_del_clicked_cb, typed_data);
+ }
+ }
+ eina_list_free(list);
+}
+
+void ct_input_update_image(ct_input_data *cinput_d)
+{
+ Evas_Object *layout = cinput_d->ly_baseinfo;
+ Evas_Object *ico;
+ Evas_Object *btn;
+ const char *img_path;
+ static int idx_ico;
+
+ btn = elm_object_part_content_get(layout, "elm.icon.image");
+ if (NULL == btn) {
+ btn = elm_button_add(layout);
+ p_retm_if(NULL == btn, "elm_button_add() return NULL");
+ elm_object_part_content_set(layout, "elm.icon.image", btn);
+ evas_object_smart_callback_add(btn, "clicked", input_img_clicked_cb, cinput_d);
+ evas_object_size_hint_aspect_set(btn, EVAS_ASPECT_CONTROL_HORIZONTAL, 1, 1);
+ }
+
+ ico = elm_object_part_content_get(btn, "icon");
+ if (!ico) {
+ ico = elm_icon_add(btn);
+ elm_icon_prescale_set(ico, CT_DETAIL_IMAGE_SIZE);
+ elm_object_part_content_set(btn, "icon", ico);
+ }
+
+ img_path = input_get_contact_image_path(cinput_d->contact);
+ if (NULL == img_path)
+ img_path = ctui_get_default_contact_img(CT_VIEW_INPUT);
+
+ if (idx_ico++%2)
+ elm_icon_file_set(ico, img_path, NULL);
+ else
+ elm_icon_file_set(ico, img_path, "/");
+}
+
+static Evas_Object* input_fill_layout_baseinfo(ct_input_data *cinput_d)
+{
+ int ret;
+ const char *name;
+ CTSvalue *value;
+ Evas_Object *ly_content;
+ Evas_Object *ef_first, *ef_last;
+ Evas_Object *box = cinput_d->box;
+
+ ly_content = elm_layout_add(box);
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_layout_file_set(ly_content, CONTACTS_EDJ, "dialogue/baseinfo.3icon");
+ evas_object_size_hint_align_set(ly_content, EVAS_HINT_FILL, 0.0);
+ cinput_d->ly_baseinfo = ly_content;
+ evas_object_show(ly_content);
+
+ ef_first = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_FIRSTNAME),
+ input_firstname_unfocused_cb, cinput_d);
+ p_retvm_if(NULL == ef_first, NULL, "ct_input_add_editfield() return NULL");
+ elm_object_part_content_set(ly_content, "elm.icon.name1", ef_first);
+ ct_input_name_field_add(ef_first, cinput_d);
+
+ ef_last = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_LASTNAME),
+ input_lastname_unfocused_cb, cinput_d);
+ p_retvm_if(NULL == ef_last, NULL, "ct_input_add_editfield() return NULL");
+ elm_object_part_content_set(ly_content, "elm.icon.name2", ef_last);
+ ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_NAME_VALUE, &value);
+ ct_input_name_field_add(ef_last, cinput_d);
+
+ if (CTS_SUCCESS == ret) {
+ name = contacts_svc_value_get_str(value, CTS_NAME_VAL_FIRST_STR);
+ input_editfield_entry_set(ef_first, name);
+
+ name = contacts_svc_value_get_str(value, CTS_NAME_VAL_LAST_STR);
+ input_editfield_entry_set(ef_last, name);
+ }
+
+ ct_input_update_image(cinput_d);
+
+ return ly_content;
+}
+
+Evas_Object* ct_input_fill_layout_separator(ct_input_data *cinput_d, const char *theme)
+{
+ Evas_Object *box = cinput_d->box;
+ Evas_Object *layout;
+
+ /*Create a separator layout*/
+ layout = elm_layout_add(box);
+ p_retvm_if(NULL == layout, NULL, "elm_layout_add() return NULL");
+
+ elm_layout_theme_set(layout, "layout", "dialogue", theme);
+ evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, 0.0);
+ evas_object_show(layout);
+
+ return layout;
+}
+
+static void input_messenger_del(ct_input_data *cinput_d, ct_input_typed_data *typed_data)
+{
+ int ret;
+ int idx;
+ Eina_List *list = NULL;
+
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+ p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL");
+
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_MESSENGER_VAL_DELETE_BOOL, true);
+ p_retm_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ if (typed_data->ly_main == cinput_d->ly_messenger_first) {
+ idx = ct_input_box_idx_get(cinput_d->box, typed_data->ly_main);
+ list = elm_box_children_get(cinput_d->box);
+ cinput_d->ly_messenger_first = eina_list_nth(list, idx + 1);
+ eina_list_free(list);
+ }
+
+ elm_box_unpack(cinput_d->box, typed_data->ly_main);
+ evas_object_del(typed_data->ly_main);
+}
+
+static void input_messenger_del_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_input_data *cinput_d = data;
+ ct_input_typed_data *typed_data;
+
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ input_messenger_del(data, typed_data);
+}
+
+static void input_messenger_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ ct_input_data *cinput_d = data;
+ Evas_Object *btn_minus;
+ ct_input_typed_data *typed_data;
+ const char *tmp;
+
+ tmp = elm_entry_entry_get(obj);
+ p_retm_if(NULL == tmp || '\0' == tmp[0], "elm_entry_entry_get() return NULL");
+
+ evas_object_smart_callback_del(obj, "changed", input_messenger_changed_cb);
+ evas_object_smart_callback_del(obj, "preedit,changed", input_messenger_changed_cb);
+ p_retm_if(NULL == cinput_d, "parameter(ct_input_data) is NULL");
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_MESSENGER_VAL_DELETE_BOOL, false);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ if (typed_data->ly_main == cinput_d->ly_messenger_last) {
+ btn_minus = elm_button_add(typed_data->ly_main);
+ p_retm_if(NULL == btn_minus, "elm_button_add() return NULL");
+
+ elm_object_style_set(btn_minus, "icon_minus");
+ evas_object_data_set(btn_minus, "typed_data", typed_data);
+ elm_object_part_content_set(typed_data->ly_main, "elm.edit.icon", btn_minus);
+ evas_object_smart_callback_add(btn_minus, "clicked", input_messenger_del_clicked_cb, cinput_d);
+
+ p_retm_if(NULL == input_add_new_messenger(cinput_d), "input_add_new_messenger() return NULL");
+ }
+}
+
+static void input_messenger_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ char *input;
+ Evas_Object *entry = obj;
+ ct_input_data *cinput_d = data;
+ ct_input_typed_data *typed_data;
+
+ typed_data = evas_object_data_get(entry, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ input = ctui_entry_markup_to_utf8(elm_entry_entry_get(entry));
+ p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL");
+
+ if (*input) {
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_MESSENGER_VAL_DELETE_BOOL, false);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ ret = contacts_svc_value_set_str(typed_data->value, CTS_MESSENGER_VAL_IM_ID_STR, input);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_str() failed(%d)", ret);
+ }
+ else if (!contacts_svc_value_get_bool(typed_data->value, CTS_MESSENGER_VAL_DELETE_BOOL)) {
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_MESSENGER_VAL_DELETE_BOOL, true);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ if (typed_data->data) {
+ evas_object_smart_callback_add(typed_data->data, "changed", input_messenger_changed_cb, cinput_d);
+ evas_object_smart_callback_add(typed_data->data, "preedit,changed", input_messenger_changed_cb, cinput_d);
+ }
+ }
+
+ free(input);
+}
+
+
+static Evas_Object *input_messenger_get_edit_rename(ct_input_data *cinput_d, ct_input_typed_data *typed_data)
+{
+ const char *val_str;
+ Evas_Object *entry;
+ Evas_Object *editfield;
+ Evas_Object *ly_content = typed_data->ly_content;
+
+ editfield = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_INSTANT_MESSENGER),
+ input_messenger_unfocused_cb, cinput_d);
+ p_retvm_if(NULL == editfield, NULL, "ct_input_add_editfield() return NULL");
+
+ entry = elm_object_part_content_get(editfield, "elm.swallow.content");
+ typed_data->data = entry;
+
+ evas_object_data_set(entry, "typed_data", typed_data);
+ elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
+ val_str = contacts_svc_value_get_str(typed_data->value, CTS_MESSENGER_VAL_IM_ID_STR);
+
+ if (val_str && *val_str)
+ ctui_entry_entry_set(entry, val_str);
+ else {
+ evas_object_smart_callback_add(entry, "changed", input_messenger_changed_cb, cinput_d);
+ evas_object_smart_callback_add(entry, "preedit,changed", input_messenger_changed_cb, cinput_d);
+ }
+ return editfield;
+
+}
+
+static Evas_Object* input_fill_layout_messenger(ct_input_data *cinput_d, CTSvalue *value)
+{
+ const char *val_str;
+ int type_int;
+ Evas_Object *ly_content, *ly_main, *ly_type;
+ Evas_Object *ef;
+ Evas_Object *btn_minus;
+ Evas_Object *box = cinput_d->box;
+ ct_input_typed_data *typed_data;
+
+ if (!cinput_d->ly_seperator_more) {
+ cinput_d->ly_seperator_more = ct_input_fill_layout_separator(cinput_d, "separator/hd33/with_line");
+ p_retvm_if(NULL == cinput_d->ly_seperator_more, EINA_FALSE, "ct_input_fill_layout_separator() return NULL");
+ elm_box_pack_after(cinput_d->box, cinput_d->ly_seperator_more, cinput_d->ly_addr_last);
+ }
+
+ ly_content = ct_input_create_dg_layout(box, "1title.1text.1icon.2");
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_object_signal_emit(ly_content, "elm,state,flip,enabled", "elm");
+
+ ly_main = ct_input_create_dg_layout(box, "edit/contact");
+ p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm");
+ elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content);
+
+ type_int = contacts_svc_value_get_int(value, CTS_MESSENGER_VAL_TYPE_INT);
+ ly_type = elm_layout_add(ly_content);
+ if (NULL == ly_type) {
+ ERR("elm_layout_add() return NULL");
+ evas_object_del(ly_main);
+ return NULL;
+ }
+
+ elm_layout_file_set(ly_type, CONTACTS_EDJ, "gl_title");
+
+ elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_IM_TYPE, type_int));
+ evas_object_data_set(ly_type, "cinput_d", cinput_d);
+ elm_object_part_content_set(ly_content, "elm.flip.content.title", ly_type);
+
+ typed_data = calloc(1, sizeof(ct_input_typed_data));
+ p_retvm_if(NULL == typed_data, NULL, "calloc() return NULL");
+ typed_data->value = value;
+ typed_data->ly_main = ly_main;
+ typed_data->ly_content = ly_content;
+ evas_object_data_set(ly_main, "typed_data", typed_data);
+
+ val_str = contacts_svc_value_get_str(value, CTS_MESSENGER_VAL_IM_ID_STR);
+ if (val_str && *val_str) {
+ btn_minus = elm_button_add(ly_main);
+ if (NULL == btn_minus) {
+ ERR("elm_button_add() return NULL");
+ evas_object_del(ly_main);
+ free(typed_data);
+ return NULL;
+ }
+ elm_object_style_set(btn_minus, "icon_minus");
+ evas_object_data_set(btn_minus, "typed_data", typed_data);
+ elm_object_part_content_set(ly_main, "elm.edit.icon", btn_minus);
+ evas_object_smart_callback_add(btn_minus, "clicked", input_messenger_del_clicked_cb, cinput_d);
+ }
+
+ ef = input_messenger_get_edit_rename(cinput_d, typed_data);
+ if (NULL == ef) {
+ ERR("input_messenger_get_edit_rename() return NULL");
+ evas_object_del(ly_main);
+ free(typed_data);
+ return NULL;
+ }
+ elm_object_part_content_set(ly_content, "elm.flip.content", ef);
+
+ evas_object_event_callback_add(ly_main, EVAS_CALLBACK_DEL, ct_input_typed_layout_del_cb, typed_data);
+ if (CTS_ADDRESSBOOK_TYPE_EXCHANGE != cinput_d->base_ab_type)
+ evas_object_event_callback_add(ly_type, EVAS_CALLBACK_MOUSE_UP, ct_input_data_type_mouse_up_cb, typed_data);
+
+ if (cinput_d->ly_messenger_last)
+ elm_box_pack_after(box, ly_main, cinput_d->ly_messenger_last);
+ else
+ elm_box_pack_after(box, ly_main, cinput_d->ly_seperator_more);
+
+ return ly_main;
+}
+
+static int input_fill_layout_messengers(ct_input_data *cinput_d)
+{
+ int ret;
+ int cnt = 0;
+ GSList *list, *cursor;
+ Evas_Object *layout;
+ CTSstruct *contact = cinput_d->contact;
+
+ list = NULL;
+ layout = NULL;
+ ret = contacts_svc_struct_get_list(contact, CTS_CF_MESSENGER_LIST, &list);
+ if (CTS_SUCCESS == ret) {
+ for (cursor=list;cursor;cursor=cursor->next) {
+ if (NULL == cursor->data) continue;
+
+ layout = input_fill_layout_messenger(cinput_d, cursor->data);
+ p_retvm_if(NULL == layout, cnt, "input_fill_layout_messenger() return NULL");
+
+ if (NULL == cinput_d->ly_messenger_first)
+ cinput_d->ly_messenger_first = layout;
+ cinput_d->ly_messenger_last = layout;
+
+ cnt++;
+ }
+ }
+
+ return cnt;
+}
+
+static Evas_Object* input_add_new_messenger(ct_input_data *cinput_d)
+{
+ CTSvalue *value;
+ Evas_Object *layout;
+
+ value = input_new_messenger(cinput_d->contact);
+ p_retvm_if(NULL == value, NULL, "input_new_messenger() return NULL");
+
+ layout = input_fill_layout_messenger(cinput_d, value);
+ p_retvm_if(NULL == layout, NULL, "input_fill_layout_messenger() return NULL");
+
+ if (NULL == cinput_d->ly_messenger_first)
+ cinput_d->ly_messenger_first = layout;
+ cinput_d->ly_messenger_last = layout;
+
+ return layout;
+}
+
+static Evas_Object* input_fill_layout_address(ct_input_data *cinput_d, CTSvalue *value)
+{
+ int type_int;
+ Evas_Object *ly_main, *ly_content, *ly_type;
+ Evas_Object *ef, *en;
+ Evas_Object *btn;
+ Evas_Object *box = cinput_d->box;
+ ct_input_typed_data *typed_data;
+ Elm_Entry_Filter_Limit_Size filter;
+
+ ly_content = ct_input_create_dg_layout(box, "1title.1text.1icon.2");
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_object_signal_emit(ly_content, "elm,state,flip,enabled", "elm");
+
+ ly_main = ct_input_create_dg_layout(box, "edit/contact");
+ p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm");
+ elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content);
+
+
+ char display[PH_TEXT_MAX_LEN];
+
+ ef = ctui_create_editfield(ly_content, NULL, S_(CT_SYS_POP_ADDRESS), false);
+ p_retvm_if(NULL == ef, NULL, "ctui_create_editfield() return NULL");
+
+ en = elm_object_part_content_get(ef, "elm.swallow.content");
+ filter.max_char_count = CT_INPUT_ADDRESS_MAX_CHAR;
+ elm_entry_markup_filter_append(en, elm_entry_filter_limit_size, &filter);
+ evas_object_smart_callback_add(en, "changed", ct_input_entry_changed_cb, ef);
+ evas_object_smart_callback_add(en, "unfocused", input_addr_editfield_unfocused_cb, value);
+ elm_object_part_content_set(ly_content, "elm.flip.content", ef);
+
+ display[0] = '\0';
+ ct_input_get_full_address(value, display, sizeof(display));
+ en = input_editfield_entry_set(ef, display);
+
+ /* type */
+ type_int = contacts_svc_value_get_int(value, CTS_POSTAL_VAL_TYPE_INT);
+
+ ly_type = elm_layout_add(ly_content);
+ if (NULL == ly_type) {
+ ERR("elm_layout_add() return NULL");
+ evas_object_del(ly_main);
+ return NULL;
+ }
+ elm_layout_file_set(ly_type, CONTACTS_EDJ, "gl_title");
+ elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_POSTAL_TYPE, type_int));
+
+ evas_object_data_set(ly_type, "cinput_d", cinput_d);
+ elm_object_part_content_set(ly_content, "elm.flip.content.title", ly_type);
+
+ /* edit button */
+ btn = elm_button_add(ly_main);
+ if (NULL == btn) {
+ ERR("elm_button_add() return NULL");
+ evas_object_del(ly_main);
+ return NULL;
+ }
+ elm_object_part_content_set(ly_main, "elm.edit.icon", btn);
+ evas_object_data_set(btn, "cinput_d", cinput_d);
+
+ typed_data = calloc(1, sizeof(ct_input_typed_data));
+ p_retvm_if(NULL == typed_data, NULL, "calloc() return NULL");
+ typed_data->ly_main = ly_main;
+ typed_data->ly_content = ly_content;
+ typed_data->value = value;
+ evas_object_data_set(ly_main, "typed_data", typed_data);
+
+ evas_object_event_callback_add(ly_type, EVAS_CALLBACK_MOUSE_UP, input_addr_type_mouse_up_cb, typed_data);
+ evas_object_event_callback_add(ly_main, EVAS_CALLBACK_DEL, ct_input_typed_layout_del_cb, typed_data);
+ return ly_main;
+}
+
+static Evas_Object* input_add_new_address(ct_input_data *cinput_d)
+{
+ CTSvalue *value;
+ Evas_Object *layout;
+
+ value = input_new_address(cinput_d->contact);
+ p_retvm_if(NULL == value, NULL, "input_new_address() return NULL");
+
+ layout = input_fill_layout_address(cinput_d, value);
+ p_retvm_if(NULL == layout, NULL, "input_fill_layout_address() return NULL");
+
+ if (cinput_d->ly_addr_last)
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_addr_last);
+ else
+ elm_box_pack_end(cinput_d->box, layout);
+
+ return layout;
+}
+
+static void input_ringtone_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ int x, y, w, h;
+ Evas_Event_Mouse_Up *ev = (Evas_Event_Mouse_Up *)event_info;
+ ct_input_data *cinput_d = data;
+
+ if (ev && ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
+ return;
+
+ evas_object_geometry_get(obj, &x, &y, &w, &h);
+ if (ev->output.y < y || y + h < ev->output.y)
+ return;
+ elm_object_focus_set(cinput_d->cdetail_d->navi, EINA_FALSE);
+
+ if(cinput_d->cdetail_d->ug)
+ return;
+
+ ct_input_myfile_ringtone(data);
+}
+
+static Evas_Object* input_fill_layout_ringtone(ct_input_data *cinput_d)
+{
+ int ret;
+ const char *temp;
+ const char *display;
+ CTSvalue *value;
+ Evas_Object *box = cinput_d->box;
+ Evas_Object *ly_content;
+ Evas_Object *btn;
+ Evas_Object *icon;
+ double scale;
+
+ ly_content = ct_input_create_dg_layout(box, "2text.1icon.6");
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+
+ cinput_d->ly_ringtone = ly_content;
+ input_layout_selectable_set(ly_content);
+ evas_object_event_callback_add(ly_content, EVAS_CALLBACK_MOUSE_UP, input_ringtone_mouse_up_cb, cinput_d);
+
+ /* title */
+ elm_object_part_text_set(ly_content, "elm.text.1", T_(CT_GET_TEXT_BASIC, CTTEXT_RINGTONE));
+
+ /* file name */
+ ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_BASE_INFO_VALUE, &value);
+ p_retvm_if(CTS_SUCCESS != ret && CTS_ERR_NO_DATA != ret, NULL, "contacts_svc_struct_get_value() Failed(%d)", ret);
+
+ temp = contacts_svc_value_get_str(value, CTS_BASE_VAL_RINGTONE_PATH_STR);
+ display = ct_detail_get_ringtone_display_name(temp);
+ elm_object_part_text_set(ly_content, "elm.text.2", display);
+
+ /* remove button */
+ btn = elm_button_add(ly_content);
+ p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL");
+ elm_object_part_content_set(ly_content, "elm.icon", btn);
+ evas_object_propagate_events_set(btn, EINA_FALSE);
+
+ scale = elm_scale_get();
+ evas_object_size_hint_min_set(btn, CT_DETAIL_RESET_BUTTON_SIZE * scale, CT_DETAIL_RESET_BUTTON_SIZE * scale);
+ evas_object_size_hint_max_set(btn, CT_DETAIL_RESET_BUTTON_SIZE * scale, CT_DETAIL_RESET_BUTTON_SIZE * scale);
+
+ icon = elm_icon_add(btn);
+ p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL");
+ elm_icon_resizable_set(icon, EINA_FALSE, EINA_FALSE);
+ elm_icon_file_set(icon, CTUI_IMG_ICON_RESET, NULL);
+ elm_object_part_content_set(btn, "icon", icon);
+
+ evas_object_smart_callback_add(btn, "clicked", input_ringtone_cancel_cb, cinput_d);
+
+ if (NULL == temp || '\0' == *temp) {
+ elm_object_focus_set(btn, EINA_FALSE);
+ elm_object_disabled_set(btn, EINA_TRUE);
+ }
+ else
+ elm_object_disabled_set(btn, EINA_FALSE);
+
+ return ly_content;
+
+}
+
+static inline void input_refresh_layout(ct_input_data *cinput_d)
+{
+ cinput_d->idx_append = 0;
+ elm_box_clear(cinput_d->box);
+
+ cinput_d->ly_baseinfo = NULL;
+ cinput_d->ly_baseinfo_last = NULL;
+ cinput_d->ly_baseinfo_suffix = NULL;
+ cinput_d->ly_baseinfo_nick = NULL;
+ cinput_d->ly_baseinfo_job_title = NULL;
+ cinput_d->ly_baseinfo_department = NULL;
+ cinput_d->ly_baseinfo_company = NULL;
+ cinput_d->ly_baseinfo_expand = NULL;
+ cinput_d->ly_number_first = NULL;
+ cinput_d->ly_number_last = NULL;
+ cinput_d->ly_number_default = NULL;
+ cinput_d->ly_number_set_default_separator_before = NULL;
+ cinput_d->ly_number_set_default = NULL;
+ cinput_d->ly_number_set_default_separator_after = NULL;
+ cinput_d->ly_email_first = NULL;
+ cinput_d->ly_email_last = NULL;
+ cinput_d->ly_addr_first = NULL;
+ cinput_d->ly_addr_last = NULL;
+ cinput_d->ly_seperator_more = NULL;
+ cinput_d->ly_messenger_first = NULL;
+ cinput_d->ly_messenger_last = NULL;
+ cinput_d->ly_url_first = NULL;
+ cinput_d->ly_url_last = NULL;
+ cinput_d->ly_relationship = NULL;
+ cinput_d->ly_birthday = NULL;
+ cinput_d->ly_anniversary = NULL;
+ cinput_d->ly_note = NULL;
+ cinput_d->ly_ringtone = NULL;
+ cinput_d->ly_moreinfo = NULL;
+
+ input_fill_layout(cinput_d);
+}
+
+static void input_relationship_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ CTSvalue *value = data;
+ char *input;
+
+ input = ctui_entry_markup_to_utf8(elm_entry_entry_get(obj));
+ p_retm_if(NULL == input, "ctui_entry_markup_to_utf8() return NULL");
+
+ contacts_svc_value_set_str(value, CTS_EXTEND_VAL_DATA2_STR, input);
+ free(input);
+}
+
+static Evas_Object* input_relationship_get_edit_rename(ct_input_data *cinput_d, ct_input_typed_data *typed_data)
+{
+ const char *val_str;
+ Evas_Object *entry;
+ Evas_Object *editfield;
+ Evas_Object *ly_content = typed_data->ly_content;
+
+ editfield = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_RELATIONSHIP), input_relationship_unfocused_cb, typed_data->value);
+ p_retvm_if(NULL == editfield, NULL, "ct_input_add_editfield() return NULL");
+
+ entry = elm_object_part_content_get(editfield, "elm.swallow.content");
+ typed_data->data = entry;
+
+ evas_object_data_set(entry, "typed_data", typed_data);
+ elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
+
+ val_str = contacts_svc_value_get_str(typed_data->value, CTS_EXTEND_VAL_DATA2_STR);
+
+ if (val_str && *val_str)
+ ctui_entry_entry_set(entry, val_str);
+
+ return editfield;
+}
+
+static void input_relationship_select_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_input_data *cinput_d = data;
+ ct_contact_list *contact;
+ Elm_Object_Item *item = event_info;
+ Evas_Object *ly_relationship;
+ Evas_Object *editfield;
+ Evas_Object *entry;
+
+ elm_genlist_item_selected_set(item, EINA_FALSE);
+
+ p_retm_if(!cinput_d, "parameter(cinput_d) is NULL");
+ p_retm_if(!cinput_d->ly_relationship, "parameter(ly_relationship) is NULL");
+
+ contact = elm_object_item_data_get(item);
+ p_retm_if(NULL == contact, "elm_object_item_data_get() returns NULL");
+
+ ly_relationship = elm_object_part_content_get(cinput_d->ly_relationship, "elm.swallow.decorate.content");
+ editfield = elm_object_part_content_get(ly_relationship, "elm.flip.content");
+ entry = elm_object_part_content_get(editfield, "elm.swallow.content");
+
+ if (entry && contact->display && *contact->display)
+ ctui_entry_entry_set(entry, contact->display);
+
+ elm_naviframe_item_pop(cinput_d->cdetail_d->navi);
+}
+
+static void input_relationship_select_contact(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_input_data *cinput_d = data;
+ ct_detail_create_list_view(cinput_d->cdetail_d, input_relationship_select_cb, cinput_d, 0);
+}
+
+static Evas_Object* input_fill_layout_relationship(ct_input_data *cinput_d)
+{
+ int type;
+ int type_int = 0;
+ char *type_str = NULL;
+ Evas_Object *ly_content, *ly_type;
+ Evas_Object *ly_main;
+ Evas_Object *box = cinput_d->box;
+ Evas_Object *ef;
+ Evas_Object *btn;
+ ct_input_typed_data *typed_data;
+ CTSvalue *value;
+
+ if (!cinput_d->ly_seperator_more) {
+ cinput_d->ly_seperator_more = ct_input_fill_layout_separator(cinput_d, "separator/hd33/with_line");
+ p_retvm_if(NULL == cinput_d->ly_seperator_more, EINA_FALSE, "ct_input_fill_layout_separator() return NULL");
+ elm_box_pack_after(cinput_d->box, cinput_d->ly_seperator_more, cinput_d->ly_addr_last);
+ }
+ ly_main = ct_input_create_dg_layout(box, "edit/contact.5");
+ p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm");
+
+ ly_content = ct_input_create_dg_layout(ly_main, "1title.1text.1icon.2");
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_object_signal_emit(ly_content, "elm,state,flip,enabled", "elm");
+ elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content);
+
+ type = contacts_svc_find_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, "Relationship");
+ if (type <= 0) {
+ type = contacts_svc_insert_custom_type(CTS_TYPE_CLASS_EXTEND_DATA, "Relationship");
+ p_retvm_if(type <= 0, NULL, "contacts_svc_insert_custom_type() Failed(%d)", type);
+ }
+
+ value = ct_detail_get_relationship(cinput_d->contact);
+ if (value)
+ type_int = contacts_svc_value_get_int(value, CTS_EXTEND_VAL_DATA1_INT);
+ else {
+ value = contacts_svc_value_new(CTS_VALUE_EXTEND);
+ p_retvm_if(NULL == value, NULL, "contacts_svc_struct_get_value() return NULL");
+ contacts_svc_struct_store_value(cinput_d->contact, type, value);
+ }
+
+ ly_type = elm_layout_add(ly_content);
+ if (NULL == ly_type) {
+ ERR("elm_layout_add() return NULL");
+ evas_object_del(ly_main);
+ return NULL;
+ }
+
+ elm_layout_file_set(ly_type, CONTACTS_EDJ, "gl_title");
+
+ if (RELATIONSHIP_TYPE_CUSTOM == type_int)
+ type_str = (char *)contacts_svc_value_get_str(value, CTS_EXTEND_VAL_DATA3_STR);
+ if (NULL == type_str || '\0' == type_str)
+ type_str = (char *)T_(CT_GET_TEXT_RELATIONSHIP_TYPE, type_int);
+
+ elm_object_part_text_set(ly_type, "title.text", type_str);
+ evas_object_data_set(ly_type, "cinput_d", cinput_d);
+ elm_object_part_content_set(ly_content, "elm.flip.content.title", ly_type);
+
+ typed_data = calloc(1, sizeof(ct_input_typed_data));
+ p_retvm_if(NULL == typed_data, NULL, "calloc() return NULL");
+ typed_data->value = value;
+ typed_data->ly_content = ly_content;
+ evas_object_data_set(ly_content, "typed_data", typed_data);
+
+ ef = input_relationship_get_edit_rename(cinput_d, typed_data);
+ if (NULL == ef) {
+ ERR("input_website_get_edit_rename() return NULL");
+ evas_object_del(ly_main);
+ free(typed_data);
+ return NULL;
+ }
+
+ elm_object_part_content_set(ly_content, "elm.flip.content", ef);
+ evas_object_event_callback_add(ly_content, EVAS_CALLBACK_DEL, ct_input_typed_layout_del_cb, typed_data);
+ evas_object_event_callback_add(ly_type, EVAS_CALLBACK_MOUSE_UP, ct_input_data_type_mouse_up_cb, typed_data);
+
+ btn = elm_button_add(ly_main);
+ if (NULL == btn) {
+ ERR("elm_button_add() return NULL");
+ evas_object_del(ly_main);
+ return NULL;
+ }
+ elm_object_part_content_set(ly_main, "elm.edit.icon", btn);
+ evas_object_data_set(btn, "cinput_d", cinput_d);
+
+ // TODO: Fixme - button style
+ elm_object_style_set(btn, "icon_plus");
+ evas_object_smart_callback_add(btn, "clicked", input_relationship_select_contact, cinput_d);
+
+ if (cinput_d->ly_url_last)
+ elm_box_pack_after(box, ly_main, cinput_d->ly_url_last);
+ else if (cinput_d->ly_messenger_last)
+ elm_box_pack_after(box, ly_main, cinput_d->ly_messenger_last);
+ else
+ elm_box_pack_after(box, ly_main, cinput_d->ly_seperator_more);
+
+ cinput_d->ly_relationship = ly_main;
+
+ return ly_main;
+}
+
+static Evas_Object* input_fill_layout_event(ct_input_data *cinput_d, int event_type)
+{
+ int event_date;
+ CTSvalue *value;
+ Evas_Object *ly_content;
+ Evas_Object *icon;
+ Evas_Object *btn;
+ Evas_Object *datetime;
+ double scale;
+
+ if (!cinput_d->ly_seperator_more) {
+ cinput_d->ly_seperator_more = ct_input_fill_layout_separator(cinput_d, "separator/hd33/with_line");
+ p_retvm_if(NULL == cinput_d->ly_seperator_more, EINA_FALSE, "ct_input_fill_layout_separator() return NULL");
+ elm_box_pack_after(cinput_d->box, cinput_d->ly_seperator_more, cinput_d->ly_addr_last);
+ }
+
+ ly_content = elm_layout_add(cinput_d->box);
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_layout_file_set(ly_content, CONTACTS_EDJ, "dialogue/1text.2icon");
+ evas_object_size_hint_align_set(ly_content, EVAS_HINT_FILL, 0.0);
+
+ elm_object_part_text_set(ly_content, "elm.text", T_(CT_GET_TEXT_EVENT_TYPE, event_type));
+
+ /* datetime */
+ datetime = elm_datetime_add(ly_content);
+ p_retvm_if(NULL == datetime, NULL, "elm_datetime_add() return NULL");
+
+ elm_datetime_field_visible_set(datetime, ELM_DATETIME_HOUR, EINA_FALSE);
+ elm_datetime_field_visible_set(datetime, ELM_DATETIME_MINUTE, EINA_FALSE);
+ elm_datetime_field_visible_set(datetime, ELM_DATETIME_AMPM, EINA_FALSE);
+
+ elm_object_part_content_set(ly_content, "elm.icon.1", datetime);
+ evas_object_data_set(datetime, "cinput_d", cinput_d);
+
+ value = ct_input_get_event(cinput_d->contact, event_type);
+ if (NULL == value)
+ value = input_new_event(cinput_d->contact, event_type);
+
+ if (contacts_svc_value_get_bool(value, CTS_EVENT_VAL_DELETE_BOOL)) {
+ time_t timer;
+ struct tm *stime = NULL;
+ timer = time(NULL);
+ stime = localtime(&timer);
+ p_retvm_if(NULL == stime, NULL, "localtime() Failed(%d)", errno);
+ elm_datetime_value_set(datetime, stime);
+ }
+ else {
+ struct tm stime;
+ event_date = contacts_svc_value_get_int(value, CTS_EVENT_VAL_DATE_INT);
+ stime.tm_year = event_date/10000 - 1900;
+ stime.tm_mon = (event_date%10000)/100 - 1;
+ stime.tm_mday = event_date%100;
+ elm_datetime_value_set(datetime, &stime);
+ }
+ evas_object_smart_callback_add(datetime, "changed", input_event_changed_cb, value);
+
+ /* reset button */
+ btn = elm_button_add(ly_content);
+ p_retvm_if(NULL == btn, NULL, "elm_button_add() return NULL");
+ elm_object_part_content_set(ly_content, "elm.icon.2", btn);
+ evas_object_propagate_events_set(btn, EINA_FALSE);
+ evas_object_data_set(btn, "cinput_d", cinput_d);
+
+ scale = elm_scale_get();
+ evas_object_size_hint_min_set(btn, CT_DETAIL_RESET_BUTTON_SIZE * scale, CT_DETAIL_RESET_BUTTON_SIZE * scale);
+ evas_object_size_hint_max_set(btn, CT_DETAIL_RESET_BUTTON_SIZE * scale, CT_DETAIL_RESET_BUTTON_SIZE * scale);
+
+ icon = elm_icon_add(btn);
+ p_retvm_if(NULL == icon, NULL, "elm_icon_add() return NULL");
+ elm_icon_file_set(icon, CTUI_IMG_ICON_RESET, NULL);
+ elm_icon_resizable_set(icon, EINA_FALSE, EINA_FALSE);
+ elm_object_part_content_set(btn, "icon", icon);
+ evas_object_smart_callback_add(btn, "clicked", input_event_cancel_clicked_cb, value);
+
+ if (contacts_svc_value_get_bool(value, CTS_EVENT_VAL_DELETE_BOOL))
+ elm_object_disabled_set(btn, EINA_TRUE);
+ else
+ elm_object_disabled_set(btn, EINA_FALSE);
+
+ evas_object_show(ly_content);
+
+ if (cinput_d->ly_birthday)
+ elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_birthday);
+ else if (cinput_d->ly_relationship)
+ elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_relationship);
+ else if (cinput_d->ly_url_last)
+ elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_url_last);
+ else if (cinput_d->ly_messenger_last)
+ elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_messenger_last);
+ else
+ elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_seperator_more);
+
+ if (CTS_EVENT_TYPE_BIRTH == event_type)
+ cinput_d->ly_birthday = ly_content;
+ else
+ cinput_d->ly_anniversary = ly_content;
+
+ return ly_content;
+}
+
+
+static void input_website_del(ct_input_data *cinput_d, ct_input_typed_data *typed_data)
+{
+ int ret;
+ int idx;
+ Eina_List *list = NULL;
+
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+ p_retm_if(NULL == typed_data, "parameter(typed_data) is NULL");
+
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_WEB_VAL_DELETE_BOOL, true);
+ p_retm_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ if (typed_data->ly_main == cinput_d->ly_url_first) {
+ idx = ct_input_box_idx_get(cinput_d->box, typed_data->ly_main);
+ list = elm_box_children_get(cinput_d->box);
+ cinput_d->ly_url_first = eina_list_nth(list, idx + 1);
+ eina_list_free(list);
+ }
+
+ elm_box_unpack(cinput_d->box, typed_data->ly_main);
+ evas_object_del(typed_data->ly_main);
+}
+
+
+static void input_website_del_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_input_data *cinput_d = data;
+ ct_input_typed_data *typed_data;
+
+ p_retm_if(NULL == cinput_d, "parameter(cinput_d) is NULL");
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ input_website_del(cinput_d, typed_data);
+
+}
+
+static void input_website_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int ret;
+ ct_input_data *cinput_d = data;
+ Evas_Object *btn_minus;
+ ct_input_typed_data *typed_data;
+ const char *tmp;
+
+ tmp = elm_entry_entry_get(obj);
+ p_retm_if(NULL == tmp || '\0' == tmp[0], "elm_entry_entry_get() return NULL");
+
+ evas_object_smart_callback_del(obj, "changed", input_website_changed_cb);
+ p_retm_if(NULL == cinput_d, "parameter(ct_input_data) is NULL");
+
+ typed_data = evas_object_data_get(obj, "typed_data");
+ p_retm_if(NULL == typed_data, "evas_object_data_get() return NULL");
+
+ ret = contacts_svc_value_set_bool(typed_data->value, CTS_WEB_VAL_DELETE_BOOL, false);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_value_set_bool() failed(%d)", ret);
+
+ if (typed_data->ly_main == cinput_d->ly_url_last) {
+ btn_minus = elm_button_add(typed_data->ly_main);
+ p_retm_if(NULL == btn_minus, "elm_button_add() return NULL");
+
+ elm_object_style_set(btn_minus, "icon_minus");
+ evas_object_data_set(btn_minus, "typed_data", typed_data);
+ elm_object_part_content_set(typed_data->ly_main, "elm.edit.icon", btn_minus);
+ evas_object_smart_callback_add(btn_minus, "clicked", input_website_del_clicked_cb, cinput_d);
+
+ p_retm_if(NULL == input_add_new_website(cinput_d), "input_add_new_website() return NULL");
+ }
+
+}
+
+static Evas_Object *input_website_get_edit_rename(ct_input_data *cinput_d, ct_input_typed_data *typed_data)
+{
+ const char *val_str;
+ Evas_Object *entry;
+ Evas_Object *editfield;
+ Evas_Object *ly_content = typed_data->ly_content;
+
+ editfield = ct_input_add_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_URL), input_website_unfocused_cb, typed_data->value);
+ p_retvm_if(NULL == editfield, NULL, "ct_input_add_editfield() return NULL");
+
+ entry = elm_object_part_content_get(editfield, "elm.swallow.content");
+ typed_data->data = entry;
+
+ evas_object_data_set(entry, "typed_data", typed_data);
+ elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_URL);
+ val_str = contacts_svc_value_get_str(typed_data->value, CTS_WEB_VAL_ADDR_STR);
+
+ if (val_str && *val_str)
+ ctui_entry_entry_set(entry, val_str);
+ else
+ evas_object_smart_callback_add(entry, "changed", input_website_changed_cb, cinput_d);
+ return editfield;
+
+}
+
+static Evas_Object *input_fill_layout_url(ct_input_data *cinput_d, CTSvalue *value)
+{
+ const char *val_str;
+ int type_int;
+ Evas_Object *ly_content, *ly_main, *ly_type;
+ Evas_Object *box = cinput_d->box;
+ Evas_Object *ef;
+ Evas_Object *btn_minus;
+ ct_input_typed_data *typed_data;
+
+ if (!cinput_d->ly_seperator_more) {
+ cinput_d->ly_seperator_more = ct_input_fill_layout_separator(cinput_d, "separator/hd33/with_line");
+ p_retvm_if(NULL == cinput_d->ly_seperator_more, EINA_FALSE, "ct_input_fill_layout_separator() return NULL");
+ elm_box_pack_after(cinput_d->box, cinput_d->ly_seperator_more, cinput_d->ly_addr_last);
+ }
+
+ ly_content = ct_input_create_dg_layout(box, "1title.1text.1icon.2");
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_object_signal_emit(ly_content, "elm,state,flip,enabled", "elm");
+
+ ly_main = ct_input_create_dg_layout(box, "edit/contact");
+ p_retvm_if(NULL == ly_main, NULL, "ct_input_create_dg_layout() return NULL");
+ elm_object_signal_emit(ly_main, "elm,state,decorate,enabled", "elm");
+ elm_object_part_content_set(ly_main, "elm.swallow.decorate.content", ly_content);
+
+ type_int = contacts_svc_value_get_int(value, CTS_WEB_VAL_TYPE_INT);
+ ly_type = elm_layout_add(ly_content);
+ if (NULL == ly_type) {
+ ERR("elm_layout_add() return NULL");
+ evas_object_del(ly_main);
+ return NULL;
+ }
+
+ elm_layout_file_set(ly_type, CONTACTS_EDJ, "gl_title");
+
+ elm_object_part_text_set(ly_type, "title.text", T_(CT_GET_TEXT_WEBSITE_TYPE, type_int));
+
+ evas_object_data_set(ly_type, "cinput_d", cinput_d);
+ elm_object_part_content_set(ly_content, "elm.flip.content.title", ly_type);
+
+ typed_data = calloc(1, sizeof(ct_input_typed_data));
+ p_retvm_if(NULL == typed_data, NULL, "calloc() return NULL");
+ typed_data->value = value;
+ typed_data->ly_main = ly_main;
+ typed_data->ly_content = ly_content;
+ evas_object_data_set(ly_main, "typed_data", typed_data);
+
+ val_str = contacts_svc_value_get_str(value, CTS_WEB_VAL_ADDR_STR);
+ if (val_str && *val_str) {
+ btn_minus = elm_button_add(ly_main);
+ if (NULL == btn_minus) {
+ ERR("elm_button_add() return NULL");
+ evas_object_del(ly_main);
+ free(typed_data);
+ return NULL;
+ }
+ elm_object_style_set(btn_minus, "icon_minus");
+ evas_object_data_set(btn_minus, "typed_data", typed_data);
+ elm_object_part_content_set(ly_main, "elm.edit.icon", btn_minus);
+ evas_object_smart_callback_add(btn_minus, "clicked", input_website_del_clicked_cb, cinput_d);
+ }
+
+ ef = input_website_get_edit_rename(cinput_d, typed_data);
+ if (NULL == ef) {
+ ERR("input_website_get_edit_rename() return NULL");
+ evas_object_del(ly_main);
+ free(typed_data);
+ return NULL;
+ }
+
+ elm_object_part_content_set(ly_content, "elm.flip.content", ef);
+ evas_object_event_callback_add(ly_main, EVAS_CALLBACK_DEL, ct_input_typed_layout_del_cb, typed_data);
+ evas_object_event_callback_add(ly_type, EVAS_CALLBACK_MOUSE_UP, ct_input_data_type_mouse_up_cb, typed_data);
+
+ if (cinput_d->ly_url_last)
+ elm_box_pack_after(box, ly_main, cinput_d->ly_url_last);
+ else {
+ if (cinput_d->ly_messenger_last)
+ elm_box_pack_after(box, ly_main, cinput_d->ly_messenger_last);
+ else
+ elm_box_pack_after(box, ly_main, cinput_d->ly_seperator_more);
+ }
+
+ return ly_main;
+
+}
+
+static Evas_Object* input_add_new_website(ct_input_data *cinput_d)
+{
+ CTSvalue *value;
+ Evas_Object *layout;
+
+ value = input_new_web(cinput_d->contact);
+ p_retvm_if(NULL == value, NULL, "input_new_web() return NULL");
+
+ layout = input_fill_layout_url(cinput_d, value);
+ p_retvm_if(NULL == layout, NULL, "input_fill_layout_url() return NULL");
+
+ if (NULL == cinput_d->ly_url_first)
+ cinput_d->ly_url_first = layout;
+ cinput_d->ly_url_last = layout;
+
+ return layout;
+}
+
+
+static int input_fill_layout_websites(ct_input_data *cinput_d)
+{
+ int cnt = 0;
+ GSList *list, *cursor;
+ Evas_Object *ly;
+ CTSstruct *contact = cinput_d->contact;
+
+ ly = NULL;
+ list = NULL;
+ contacts_svc_struct_get_list(contact, CTS_CF_WEB_ADDR_LIST, &list);
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ if (NULL == cursor->data) continue;
+ ly = input_fill_layout_url(cinput_d, cursor->data);
+ p_retvm_if(NULL == ly, cnt, "input_fill_layout_url() return NULL");
+
+ if (NULL == cinput_d->ly_url_first)
+ cinput_d->ly_url_first = ly;
+ cinput_d->ly_url_last = ly;
+ cnt++;
+ }
+ return cnt;
+}
+
+
+static Evas_Object* input_fill_layout_note(ct_input_data *cinput_d)
+{
+ CTSvalue *value;
+ char *val_str;
+ Evas_Object *box = cinput_d->box;
+ Evas_Object *ly_content;
+ Evas_Object *ef, *en;
+
+ if (!cinput_d->ly_seperator_more) {
+ cinput_d->ly_seperator_more = ct_input_fill_layout_separator(cinput_d, "separator/hd33/with_line");
+ p_retvm_if(NULL == cinput_d->ly_seperator_more, EINA_FALSE, "ct_input_fill_layout_separator() return NULL");
+ elm_box_pack_after(cinput_d->box, cinput_d->ly_seperator_more, cinput_d->ly_addr_last);
+ }
+
+ ly_content = ct_input_create_dg_layout(box, "1icon");
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+
+ value = ct_detail_get_baseinfo_value(cinput_d->contact);
+
+ ef = ctui_create_editfield(ly_content, T_(CT_GET_TEXT_BASIC, CTTEXT_NOTE), NULL, true);
+ p_retvm_if(NULL == ef, NULL, "ctui_create_editfield() return NULL");
+
+ en = elm_object_part_content_get(ef, "elm.swallow.content");
+ evas_object_smart_callback_add(en, "unfocused", input_note_unfocused_cb, value);
+ evas_object_smart_callback_add(en, "changed", ct_input_entry_changed_cb, ef);
+ elm_object_part_content_set(ly_content, "elm.icon", ef);
+
+ val_str = elm_entry_utf8_to_markup(contacts_svc_value_get_str(value, CTS_BASE_VAL_NOTE_STR));
+ input_editfield_entry_set(ef, val_str);
+ free(val_str);
+
+ if (cinput_d->ly_anniversary)
+ elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_anniversary);
+ else if (cinput_d->ly_birthday)
+ elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_birthday);
+ else if (cinput_d->ly_relationship)
+ elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_relationship);
+ else if (cinput_d->ly_url_last)
+ elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_url_last);
+ else if (cinput_d->ly_messenger_last)
+ elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_messenger_last);
+ else
+ elm_box_pack_after(cinput_d->box, ly_content, cinput_d->ly_seperator_more);
+
+ cinput_d->ly_note = ly_content;
+
+ return ly_content;
+}
+
+
+static Evas_Object* input_fill_layout_addresses(ct_input_data *cinput_d)
+{
+ GSList *list, *cursor;
+ CTSstruct *contact = cinput_d->contact;
+ Evas_Object *layout;
+
+ list = NULL;
+ layout = NULL;
+
+ contacts_svc_struct_get_list(contact, CTS_CF_POSTAL_ADDR_LIST, &list);
+
+ for (cursor=list;cursor;cursor=cursor->next) {
+ if (NULL == cursor->data) continue;
+ layout = input_fill_layout_address(cinput_d, cursor->data);
+ p_retvm_if(NULL == layout, NULL, "input_fill_layout_address() return NULL");
+ elm_box_pack_end(cinput_d->box, layout);
+ if (NULL == cinput_d->ly_addr_first)
+ cinput_d->ly_addr_first = layout;
+ cinput_d->ly_addr_last = layout;
+ }
+
+ if (NULL == cinput_d->ly_addr_last) {
+ layout = input_add_new_address(cinput_d);
+ p_retvm_if(NULL == layout, NULL, "input_add_new_address() return");
+ if (NULL == cinput_d->ly_addr_first)
+ cinput_d->ly_addr_first = layout;
+ cinput_d->ly_addr_last = layout;
+ }
+
+ input_update_address(cinput_d);
+
+ return layout;
+}
+
+
+static void input_render_flush_post_cb(void *data, Evas *e, void *even_info)
+{
+ ecore_idler_add(input_fill_layout, data);
+ evas_event_callback_del(e, EVAS_CALLBACK_RENDER_FLUSH_POST, input_render_flush_post_cb);
+}
+
+static void input_genlist_render_flush_post_cb(void *data, Evas *e, void *event_info)
+{
+ int field;
+ Evas_Coord w,h;
+ ct_input_data *cinput_d = data;
+
+ evas_event_callback_del(e, EVAS_CALLBACK_RENDER_FLUSH_POST, input_genlist_render_flush_post_cb);
+ field = (int)evas_object_data_get(cinput_d->scroller, "field");
+ evas_object_data_del(cinput_d->scroller, "field");
+
+ switch (field) {
+ case INPUT_MORE_JOB_TITLE:
+ case INPUT_MORE_DEPARTMENT:
+ elm_scroller_region_bring_in(cinput_d->scroller, 0, 0, 0, 0);
+ break;
+ default:
+ elm_scroller_child_size_get(cinput_d->scroller, &w, &h);
+ elm_scroller_region_bring_in(cinput_d->scroller, 0, h, 0, h);
+ break;
+ }
+
+}
+
+
+static void input_update_moreinfo(ct_input_data *cinput_d)
+{
+ PH_FN_CALL;
+ Evas_Object *button;
+ p_ret_if(!cinput_d->ly_moreinfo);
+
+ if (cinput_d->ly_anniversary && cinput_d->ly_birthday && cinput_d->add_department &&
+ cinput_d->add_job_title && cinput_d->ly_messenger_last && cinput_d->ly_note &&
+ cinput_d->ly_url_last) {
+
+ button = elm_object_part_content_get(cinput_d->ly_moreinfo, "elm.icon");
+ p_retm_if(NULL == button, "elm_object_part_content_get() return NULL");
+
+ elm_object_disabled_set(button, EINA_TRUE);
+ }
+}
+
+static void input_moreinfo_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ int field = (int)data;
+ ct_input_data *cinput_d;
+ Evas_Object *layout;
+ Evas_Object *btn_expand;
+
+ cinput_d = evas_object_data_get(obj, "cinput_d");
+ p_retm_if(NULL == cinput_d, "evas_object_data_get() return NULL");
+
+ ct_detail_popup_hide_cb(cinput_d->cdetail_d, NULL, NULL);
+
+ switch(field) {
+ case INPUT_MORE_JOB_TITLE:
+ cinput_d->add_job_title = true;
+ if (cinput_d->ly_baseinfo_last) {
+ layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_JOB_TITLE),
+ input_job_title_unfocused_cb, CTS_CF_COMPANY_VALUE, CTS_COMPANY_VAL_JOB_TITLE_STR);
+ p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL");
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_nick);
+ cinput_d->ly_baseinfo_job_title = layout;
+ }
+ else {
+ btn_expand = elm_object_part_content_get(cinput_d->ly_baseinfo, "elm.edit.icon");
+ input_baseinfo_expand_clicked_cb(cinput_d, btn_expand, NULL);
+ }
+ break;
+ case INPUT_MORE_DEPARTMENT:
+ cinput_d->add_department = true;
+ if (cinput_d->ly_baseinfo_last) {
+ layout = input_fill_layout_baseinfo_expand(cinput_d, T_(CT_GET_TEXT_BASIC, CTTEXT_DEPARTMENT),
+ input_department_unfocused_cb, CTS_CF_COMPANY_VALUE, CTS_COMPANY_VAL_DEPARTMENT_STR);
+ p_retm_if(NULL == layout, "input_fill_layout_baseinfo_expand() return NULL");
+ if (cinput_d->ly_baseinfo_job_title)
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_job_title);
+ else
+ elm_box_pack_after(cinput_d->box, layout, cinput_d->ly_baseinfo_nick);
+ cinput_d->ly_baseinfo_department = layout;
+ }
+ else {
+ btn_expand = elm_object_part_content_get(cinput_d->ly_baseinfo, "elm.edit.icon");
+ input_baseinfo_expand_clicked_cb(cinput_d, btn_expand, NULL);
+ }
+ break;
+ case INPUT_MORE_MESSENGER:
+ input_add_new_messenger(cinput_d);
+ break;
+ case INPUT_MORE_URL:
+ input_add_new_website(cinput_d);
+ break;
+ case INPUT_MORE_RELATIONSHIP:
+ input_fill_layout_relationship(cinput_d);
+ break;
+ case INPUT_MORE_BIRTHDAY:
+ input_fill_layout_event(cinput_d, CTS_EVENT_TYPE_BIRTH);
+ break;
+ case INPUT_MORE_ANNIVERSARY:
+ input_fill_layout_event(cinput_d, CTS_EVENT_TYPE_ANNIVERSARY);
+ break;
+ case INPUT_MORE_NOTE:
+ input_fill_layout_note(cinput_d);
+ break;
+ }
+
+ evas_object_data_set(cinput_d->scroller, "field", (void *)field);
+ evas_event_callback_add(evas_object_evas_get(cinput_d->scroller),
+ EVAS_CALLBACK_RENDER_FLUSH_POST, input_genlist_render_flush_post_cb, cinput_d);
+
+ input_update_moreinfo(cinput_d);
+}
+
+static void input_moreinfo_button_cb(void *data, Evas_Object *obj, void *even_info)
+{
+ int rotate;
+ ct_input_data *cinput_d = data;
+ ct_detail_data *cdetail_d = cinput_d->cdetail_d;
+
+ if (cdetail_d->popup)
+ ct_detail_popup_hide_cb(cdetail_d, NULL, NULL);
+
+ cdetail_d->popup = elm_ctxpopup_add(cdetail_d->navi);
+ p_retm_if(NULL == cdetail_d->popup, "elm_ctxpopup_add() return NULL");
+
+ rotate = (int)evas_object_data_get(cinput_d->cdetail_d->navi, "phone_rotate");
+ if (0 == rotate || 180 == rotate)
+ elm_ctxpopup_direction_priority_set(cdetail_d->popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT);
+
+ evas_object_smart_callback_add(cdetail_d->popup, "dismissed", ct_detail_popup_hide_cb, cdetail_d);
+ evas_object_data_set(cdetail_d->popup, "cinput_d", cinput_d);
+
+ if (!cinput_d->add_job_title)
+ elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_BASIC, CTTEXT_JOB_TITLE), NULL,
+ input_moreinfo_cb, (void *)INPUT_MORE_JOB_TITLE);
+ if (!cinput_d->add_department)
+ elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_BASIC, CTTEXT_DEPARTMENT), NULL,
+ input_moreinfo_cb, (void *)INPUT_MORE_DEPARTMENT);
+ if (!cinput_d->ly_messenger_last)
+ elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_BASIC, CTTEXT_INSTANT_MESSENGER), NULL,
+ input_moreinfo_cb, (void *)INPUT_MORE_MESSENGER);
+ if (!cinput_d->ly_url_last)
+ elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_BASIC, CTTEXT_URL), NULL,
+ input_moreinfo_cb, (void *)INPUT_MORE_URL);
+ if (!cinput_d->ly_relationship)
+ elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_BASIC, CTTEXT_RELATIONSHIP), NULL,
+ input_moreinfo_cb, (void *)INPUT_MORE_RELATIONSHIP);
+ if (!cinput_d->ly_birthday)
+ elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_EVENT_TYPE, CTS_EVENT_TYPE_BIRTH), NULL,
+ input_moreinfo_cb, (void *)INPUT_MORE_BIRTHDAY);
+ if (!cinput_d->ly_anniversary)
+ elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_EVENT_TYPE, CTS_EVENT_TYPE_ANNIVERSARY), NULL,
+ input_moreinfo_cb, (void *)INPUT_MORE_ANNIVERSARY);
+ if (!cinput_d->ly_note)
+ elm_ctxpopup_item_append(cdetail_d->popup, T_(CT_GET_TEXT_BASIC, CTTEXT_NOTE), NULL,
+ input_moreinfo_cb, (void *)INPUT_MORE_NOTE);
+
+ phone_move_ctxpopup(cdetail_d->popup, obj);
+ evas_object_show(cdetail_d->popup);
+}
+
+static Evas_Object* input_fill_layout_moreinfo(ct_input_data *cinput_d)
+{
+ Evas_Object *button;
+ Evas_Object *box = cinput_d->box;
+ Evas_Object *ly_content;
+
+ ly_content = ct_input_create_dg_layout(box, "bg/1icon");
+ p_retvm_if(NULL == ly_content, NULL, "ct_input_create_dg_layout() return NULL");
+
+ button = elm_button_add(ly_content);
+ p_retvm_if(NULL == button, NULL, "elm_button_add() return NULL");
+ elm_object_text_set(button, T_(CT_GET_TEXT_BASIC, CTTEXT_MORE_INFORMATION));
+ elm_object_part_content_set(ly_content, "elm.icon", button);
+ evas_object_smart_callback_add(button, "clicked", input_moreinfo_button_cb, cinput_d);
+
+ cinput_d->ly_moreinfo = ly_content;
+ return ly_content;
+}
+static Eina_Bool input_fill_layout(void *data)
+{
+ const char *str;
+ const int ITEMS_MAX_CNT = 9;
+ int i, ret;
+ int cnt, cnt_append = 0;
+ Evas_Object *layout;
+ CTSvalue *value;
+ ct_input_data *cinput_d = data;
+
+ for (i = cinput_d->idx_append; i < INPUT_ITEMS_MAX; i++) {
+ switch(i) {
+ case INPUT_BASEINFO:
+ ret = contacts_svc_struct_get_value(cinput_d->contact, CTS_CF_COMPANY_VALUE, &value);
+ str = NULL;
+ if (CTS_SUCCESS == ret && !cinput_d->add_department) {
+ str = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_DEPARTMENT_STR);
+ if (str && *str)
+ cinput_d->add_department = true;
+ }
+ str = NULL;
+ if (CTS_SUCCESS == ret && !cinput_d->add_job_title) {
+ str = contacts_svc_value_get_str(value, CTS_COMPANY_VAL_JOB_TITLE_STR);
+ if (str && *str)
+ cinput_d->add_job_title = true;
+ }
+
+ /* base info */
+ layout = input_fill_layout_baseinfo(cinput_d);
+ p_retvm_if(NULL == layout, EINA_FALSE, "input_fill_layout_baseinfo() return NULL");
+ elm_box_pack_end(cinput_d->box, layout);
+
+ layout = input_fill_layout_baseinfo_expand_button(cinput_d);
+ p_retvm_if(NULL == layout, EINA_FALSE, "input_fill_layout_baseinfo_expand_button() return NULL");
+ elm_box_pack_end(cinput_d->box, layout);
+
+ /* separator */
+ layout = ct_input_fill_layout_separator(cinput_d, "separator/hd1");
+ p_retvm_if(NULL == layout, EINA_FALSE, "ct_input_fill_layout_separator() return NULL");
+ elm_box_pack_end(cinput_d->box, layout);
+
+ cnt_append += 2;
+ break;
+
+ case INPUT_NUMBER:
+ /* number */
+ ct_input_fill_layout_numbers(cinput_d);
+ cnt_append += cinput_d->cnt_num + 1;
+ break;
+
+ case INPUT_EMAIL:
+ /* email */
+ cnt = 0;
+ cnt = ct_input_fill_layout_emails(cinput_d);
+ cnt_append += cnt + 1;
+ break;
+
+ case INPUT_ADDRESS:
+ /* address */
+ input_fill_layout_addresses(cinput_d);
+ cnt_append += cinput_d->cnt_addr * 5;
+ break;
+
+ case INPUT_MESSENGER:
+ /* messenger */
+ cnt = input_fill_layout_messengers(cinput_d);
+ if (cnt) {
+ input_add_new_messenger(cinput_d);
+ cnt++;
+ }
+ cnt_append += cnt;
+ break;
+
+ case INPUT_URL:
+ cnt = input_fill_layout_websites(cinput_d);
+ if (cnt) {
+ input_add_new_website(cinput_d);
+ cnt++;
+ }
+ cnt_append += cnt;
+ break;
+ case INPUT_RELATIONSHIP:
+ value = ct_detail_get_relationship(cinput_d->contact);
+ if (value)
+ input_fill_layout_relationship(cinput_d);
+ break;
+ case INPUT_BIRTHDAY:
+ value = ct_input_get_event(cinput_d->contact, CTS_EVENT_TYPE_BIRTH);
+ if (value && !contacts_svc_value_get_bool(value, CTS_EVENT_VAL_DELETE_BOOL)) {
+ input_fill_layout_event(cinput_d, CTS_EVENT_TYPE_BIRTH);
+ cnt_append++;
+ }
+ break;
+
+ case INPUT_ANNIVERSARY:
+ value = ct_input_get_event(cinput_d->contact, CTS_EVENT_TYPE_ANNIVERSARY);
+ if (value && !contacts_svc_value_get_bool(value, CTS_EVENT_VAL_DELETE_BOOL)) {
+ input_fill_layout_event(cinput_d, CTS_EVENT_TYPE_ANNIVERSARY);
+ cnt_append++;
+ }
+ break;
+
+ case INPUT_NOTE:
+ value = ct_detail_get_baseinfo_value(cinput_d->contact);
+ str = contacts_svc_value_get_str(value, CTS_BASE_VAL_NOTE_STR);
+ if (str && *str) {
+ input_fill_layout_note(cinput_d);
+ cnt_append += 1;
+ }
+ break;
+
+ case INPUT_RINGTONE:
+ /* ringtone */
+ layout = input_fill_layout_ringtone(cinput_d);
+ p_retvm_if(NULL == layout, EINA_FALSE, "input_fill_layout_ringtone() return NULL");
+ elm_box_pack_end(cinput_d->box, layout);
+
+ cnt_append += 1;
+ break;
+
+ case INPUT_MORE_INFO:
+ layout = ct_input_fill_layout_separator(cinput_d, "separator/hd16");
+ p_retvm_if(NULL == layout, EINA_FALSE, "ct_input_fill_layout_separator() return NULL");
+ elm_box_pack_end(cinput_d->box, layout);
+
+ layout = input_fill_layout_moreinfo(cinput_d);
+ p_retvm_if(NULL == layout, EINA_FALSE, "input_fill_layout_moreinfo() return NULL");
+ elm_box_pack_end(cinput_d->box, layout);
+
+ layout = ct_input_fill_layout_separator(cinput_d, "separator/hd16");
+ p_retvm_if(NULL == layout, EINA_FALSE, "ct_input_fill_layout_separator() return NULL");
+ elm_box_pack_end(cinput_d->box, layout);
+
+ input_update_moreinfo(cinput_d);
+
+ cnt_append += 1;
+ break;
+
+ default:
+ ERR("Unknown item(%d)", i);
+ return EINA_FALSE;
+ }
+
+ if (0 == cinput_d->idx_append && ITEMS_MAX_CNT <= cnt_append) {
+ cinput_d->idx_append = i + 1;
+ evas_event_callback_add(evas_object_evas_get(cinput_d->box),
+ EVAS_CALLBACK_RENDER_FLUSH_POST, input_render_flush_post_cb, cinput_d);
+ break;
+ }
+ }
+ return EINA_FALSE;
+}
+
+static void input_cancel_cb(void *data, Evas_Object *obj, void *event_info)
+{
+ ct_input_data *cinput_d = data;
+ ct_detail_data *cdetail_d = cinput_d->cdetail_d;
+
+ /* evas_object_smart_callback_del() func will be deleted */
+ evas_object_smart_callback_del(obj, "clicked", input_cancel_cb);
+
+ elm_naviframe_item_pop(cdetail_d->navi);
+}
+
+static Eina_Bool input_win_prop_change(void *data, int type, void *event)
+{
+ ct_input_data *cinput_d;
+ Evas_Object *l_btn, *r_btn;
+ Evas_Object *obj = data;
+ Ecore_X_Event_Window_Property *ev = event;
+ Ecore_X_Virtual_Keyboard_State state = ecore_x_e_virtual_keyboard_state_get(ev->win);
+
+ cinput_d = evas_object_data_get(obj, "cinput_d");
+ p_retvm_if(NULL == cinput_d, ECORE_CALLBACK_PASS_ON, "evas_object_data_get() return NULL");
+
+ if (ECORE_X_VIRTUAL_KEYBOARD_STATE_ON == state &&
+ NULL == elm_object_item_part_content_get(cinput_d->navi_item, "title_left_btn")) {
+ r_btn = phone_create_navi_btn(cinput_d->cdetail_d->navi, S_(PH_SYS_SK_CANCEL));
+ if (cinput_d->cdetail_d->ug && NULL == cinput_d->pre_item)
+ evas_object_smart_callback_add(r_btn, "clicked", phone_ug_destroy_me_cb, cinput_d->cdetail_d->ug);
+ else
+ evas_object_smart_callback_add(r_btn, "clicked", input_cancel_cb, cinput_d);
+ elm_object_item_part_content_set(cinput_d->navi_item, "title_right_btn",r_btn);
+
+ l_btn = phone_create_navi_btn(cinput_d->cdetail_d->navi, S_(CT_SYS_SK_SAVE));
+ evas_object_smart_callback_add(l_btn, "clicked", ct_input_save_cb, cinput_d);
+ elm_object_item_part_content_set(cinput_d->navi_item, "title_left_btn", l_btn);
+
+ ct_input_save_button_update(cinput_d);
+ }
+ else if (ECORE_X_VIRTUAL_KEYBOARD_STATE_OFF == state &&
+ NULL != elm_object_item_part_content_get(cinput_d->navi_item, "title_left_btn")) {
+ cinput_d = evas_object_data_get(obj, "cinput_d");
+ p_retvm_if(NULL == cinput_d, ECORE_CALLBACK_PASS_ON, "evas_object_data_get() return NULL");
+
+ elm_object_item_part_content_set(cinput_d->navi_item, "title_left_btn", NULL);
+ elm_object_item_part_content_set(cinput_d->navi_item, "title_right_btn", NULL);
+ }
+ return ECORE_CALLBACK_PASS_ON;
+}
+
+
+static Evas_Object* input_create_layout(ct_input_data *cinput_d)
+{
+ Evas_Object *box;
+ Evas_Object *scroller;
+ Evas_Object *conform;
+ ct_detail_data *cdetail_d = cinput_d->cdetail_d;
+
+ elm_win_conformant_set(cdetail_d->win, EINA_TRUE);
+ conform = elm_conformant_add(cdetail_d->navi);
+ p_retvm_if(NULL == conform, NULL, "elm_conformant_add() return NULL");
+
+ cinput_d->win_prop_change = ecore_event_handler_add(ECORE_X_EVENT_WINDOW_PROPERTY, input_win_prop_change, conform);
+ evas_object_data_set(conform, "cinput_d", cinput_d);
+
+ evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+ evas_object_show(conform);
+
+ scroller = elm_scroller_add(cdetail_d->navi);
+ p_retvm_if(NULL == scroller, NULL, "elm_scroller_add() return NULL");
+ elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_TRUE);
+ elm_scroller_policy_set(scroller,ELM_SCROLLER_POLICY_OFF,ELM_SCROLLER_POLICY_AUTO);
+ evas_object_show(scroller);
+ elm_object_content_set(conform, scroller);
+ cinput_d->scroller = scroller;
+
+ box = elm_box_add(scroller);
+ p_retvm_if(NULL == box, NULL, "elm_box_add() return NULL");
+ evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, 0.0);
+ evas_object_size_hint_align_set(box, EVAS_HINT_FILL, 0.0);
+ elm_object_content_set(scroller, box);
+ evas_object_show(box);
+ cinput_d->box = box;
+
+ cdetail_d->has_input = true;
+ if (!cinput_d->contact)
+ cinput_d->contact = contacts_svc_struct_new(CTS_STRUCT_CONTACT);
+ input_fill_layout(cinput_d);
+ evas_object_event_callback_add(conform, EVAS_CALLBACK_DEL, input_view_delete_cb, cinput_d);
+ return conform;
+}
+
+void ct_input_push_navi_content(ct_detail_data *cdetail_d, CTSstruct *contact, int contact_id)
+{
+ int ret;
+ Evas_Object *toolbar;
+ Evas_Object *content;
+ Elm_Object_Item *navi_item;
+ const char *navi_title;
+ ct_input_data *cinput_d;
+
+ cinput_d = calloc(1, sizeof(ct_input_data));
+ p_retm_if(NULL == cinput_d, "calloc() return NULL");
+ cinput_d->cdetail_d = cdetail_d;
+ cinput_d->contact = contact;
+ cinput_d->contact_id = contact_id;
+ cinput_d->base_ab = cdetail_d->base_ab;
+ cinput_d->base_ab_mode = cdetail_d->base_ab_mode;
+ cinput_d->base_ab_name = SAFE_STRDUP(cdetail_d->base_ab_name);
+
+ cinput_d->pre_item = elm_naviframe_top_item_get(cdetail_d->navi);
+ cinput_d->save_disable = EINA_TRUE;
+
+ if (cdetail_d->has_detail) {
+ ct_detail_delete_namecards(cdetail_d);
+ }
+
+ content = input_create_layout(cinput_d);
+ p_retm_if(NULL == content, "input_create_layout() Failed");
+
+ if (cinput_d->contact_id) {
+ navi_title = S_(PH_SYS_SK_EDIT);
+
+ contacts_svc_begin_trans();
+ cinput_d->view_create_ver = contacts_svc_end_trans(true);
+ ret = contacts_svc_subscribe_change(CTS_SUBSCRIBE_CONTACT_CHANGE,
+ input_contacts_changed, cinput_d);
+ p_warn_if(CTS_SUCCESS != ret, "contacts_svc_subscribe_change() Failed(%d)", ret);
+ }
+ else
+ navi_title = S_(CT_SYS_BODY_CREATE);
+
+ navi_item = elm_naviframe_item_push(cdetail_d->navi,
+ navi_title, NULL, NULL, content, NULL);
+ cinput_d->navi_item = navi_item;
+
+ toolbar = elm_toolbar_add(cdetail_d->navi);
+ p_retm_if(NULL == toolbar, "elm_toolbar_add() return NULL");
+ elm_toolbar_shrink_mode_set(toolbar, ELM_TOOLBAR_SHRINK_EXPAND);
+ elm_object_item_part_content_set(cinput_d->navi_item, "controlbar", toolbar);
+
+ cinput_d->save_btn = elm_toolbar_item_append(toolbar, PH_IMG_ICON_DONE, NULL, ct_input_save_cb, cinput_d);
+ ct_input_save_button_update(cinput_d);
+ phone_toolbar_disabled_item_append(toolbar, 3);
+
+ if (cinput_d->cdetail_d->ug && NULL == cinput_d->pre_item)
+ elm_toolbar_item_append(toolbar, CTUI_IMG_ICON_CLOSE, NULL, phone_ug_destroy_me_cb, cinput_d->cdetail_d->ug);
+ else
+ elm_toolbar_item_append(toolbar, CTUI_IMG_ICON_CLOSE, NULL, input_cancel_cb, cinput_d);
+}
diff --git a/lib/details/ct-input-view.h b/lib/details/ct-input-view.h
new file mode 100755
index 0000000..32c04e2
--- /dev/null
+++ b/lib/details/ct-input-view.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2012 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.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.tizenopensource.org/license
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __CONTACTS_INPUT_VIEW_H__
+#define __CONTACTS_INPUT_VIEW_H__
+
+void ct_input_push_navi_content(ct_detail_data *cdetail_d, CTSstruct *contact, int contact_id);
+void ct_input_update_image(ct_input_data *i_data);
+Evas_Object* ct_input_fill_layout_separator(ct_input_data *i_data, const char *theme);
+
+#endif //__CONTACTS_INPUT_VIEW_H__