3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Flora License, Version 1.1 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://floralicense.org/license/
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an AS IS BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 #include <setting-common-plugin.h>
21 #include <eina_list.h>
25 //#include <libxml/xmlmemory.h>
26 //#include <libxml/parser.h>
28 #include <setting-debug.h>
29 #include <setting-common-general-func.h>
30 #include <setting-common-draw-widget.h>
32 //extern setting_main_appdata *g_main_ad;
34 static Setting_GenGroupItem_Data *g_list_item; /*TEST*/
37 * UI draw handler table : _g_draw_list
38 * - contains Object_Drawer typed object.
40 static Eina_List *_g_drawer_list = NULL;
44 * @return Evas_Object * obj
46 static void* navigationbar_func(void *data, xmlNode *xmlObj);
52 static void* group_func(void *data, xmlNode *xmlObj);
55 * @return Setting_GenGroupItem_Data* ptr
57 static void* link_func(void *data, xmlNode *xmlObj);
60 * @return Setting_GenGroupItem_Data* ptr
62 static void* slider_func(void *data, xmlNode *xmlObj);
65 * @return Setting_GenGroupItem_Data* ptr
67 static void* label_func(void *data, xmlNode *xmlObj);
70 * @return Setting_GenGroupItem_Data* ptr
72 static void* checkbox_func(void *data, xmlNode *xmlObj);
75 * @return Setting_GenGroupItem_Data* ptr
77 static void* editbox_func(void *data, xmlNode *xmlObj);
80 * @return Setting_GenGroupItem_Data* ptr
82 static void* expandlist_func(void *data, xmlNode *xmlObj);
87 static void* expanditem_func(void *data, xmlNode *xmlObj);
92 static void* settings_func(void *data, xmlNode *xmlObj);
95 static void* launch_func(void *data, xmlNode *xmlObj);
100 static void* setting_func(void *data, xmlNode *xmlObj);
102 static int __node_walker(PluginNode* context, xmlNode* cur);
104 static int __node_finder(PluginNode* context, xmlNode* cur, char* id_str, char* value, bool* is_end);
107 static void __drawer_add(const char *type, drawer_fp draw)
109 Object_Drawer *node = calloc(1, sizeof(Object_Drawer));
110 if (node && type && draw)
115 _g_drawer_list = eina_list_append(_g_drawer_list, node);
121 static drawer_fp __drawer_find(char* type)
124 SETTING_TRACE("node type:%s", type);
125 Eina_List *check_list = _g_drawer_list;
126 Object_Drawer *list_item = NULL;
129 list_item = (Object_Drawer *) eina_list_data_get(check_list);
130 if (NULL == list_item)
133 if (0 == safeStrCmp(list_item->type, type))
135 //SETTING_TRACE("list_item->type:%s", list_item->type);
138 //if not matched,to check next node.
139 check_list = eina_list_next(check_list);
142 //SETTING_TRACE("list_item:%p", list_item);
143 return list_item ? list_item->draw : NULL;
146 void setting_drawer_list_init()
150 /* <navigationbar> */__drawer_add("navigationbar", navigationbar_func);
152 /* <bool> */__drawer_add("bool", checkbox_func);
153 /* <string> */__drawer_add("string", editbox_func);
154 /* <group> */__drawer_add("group", group_func);
155 /* <integer> */__drawer_add("integer", slider_func);
156 /* <label> */__drawer_add("label", label_func);
157 /* <link> */__drawer_add("link", link_func);
158 /* <launch> */__drawer_add("launch", launch_func);
159 /* <extendlist> */__drawer_add("expandlist", expandlist_func);
160 /* <extenditem> */__drawer_add("expanditem", expanditem_func);
161 /* <settings> */__drawer_add("settings", settings_func);
162 /* <setting> */__drawer_add("setting", setting_func);
165 void setting_drawer_list_fini()
169 Object_Drawer *node = NULL;
170 Eina_List *li = _g_drawer_list;
172 node = (Object_Drawer *) eina_list_data_get(li);
175 //SETTING_TRACE("Deregister %s", node->type);
178 li = eina_list_next(li);
180 _g_drawer_list = eina_list_free(_g_drawer_list);
181 _g_drawer_list = NULL;
185 /////////////////////////
186 /////////////////////////
187 /////////////////////////
189 #define MAX_CONTENT_LEN 512
190 #define MAX_LOCAL_BUFSIZE 128
191 #define DBUS_PATH "/setting/dbus_handler"
192 #define DBUS_SIGNAL_INTERFACE "org.tizen.setting.signal"
194 #define APPID_LENGTH 10
195 #define APPID_POS_FROM_PATH 10
197 static char* s_pkg_name;
198 static char* s_plugin_path;
203 * ncbyusjryr.AppSetting --> package ID is ncbyusjryr
204 * "Update_" "ncbyusjryr"
206 static char* get_app_string(char* path)
209 //SETTING_TRACE("package path : >>> %s ",path );
210 char* temp = substring(path, APPID_POS_FROM_PATH, APPID_LENGTH/*string size*/);
211 SETTING_TRACE("package ID : >>> %s ",temp );
215 //------------------------------------------------------
217 static DBusConnection *bus;
218 //------------------------------------------------------
219 static DBusHandlerResult __signal_filter(DBusConnection* conn, DBusMessage* message, void* user_data)
221 int my_pid = getpid();
227 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
230 dbus_error_init(&error);
232 PluginNode* ad = (PluginNode*)user_data;
234 char* plugin_path = ad->plugin_path;
235 char* pkg_name = get_app_string(plugin_path);
237 if (pkg_name == NULL)
239 SETTING_TRACE("pkg_name is NULL - it's abnormal operation");
240 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
243 char str_buf[MAX_COMMON_BUFFER_LEN];
244 snprintf(str_buf, MAX_COMMON_BUFFER_LEN, "Update_%s", pkg_name);
245 s_pkg_name = strdup(str_buf);
253 if (s_pkg_name == NULL)
255 SETTING_TRACE("s_pkg_name is NULL - it's abnormal operation");
256 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
258 SETTING_TRACE("s_pkg_name : %s ", s_pkg_name);
259 if (dbus_message_is_signal(message, DBUS_SIGNAL_INTERFACE, s_pkg_name))
261 if (dbus_message_get_args(message, &error,
262 DBUS_TYPE_UINT32, &sender_pid,
263 DBUS_TYPE_STRING, &key,
264 DBUS_TYPE_STRING, &value,
265 DBUS_TYPE_INVALID) == FALSE)
267 SETTING_TRACE_ERROR("Fail to get data : %s", error.message);
268 dbus_error_free(&error);
269 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
273 if (sender_pid != 0 && my_pid != sender_pid)
275 SETTING_TRACE("received key : %s , value : %s", key, value);
276 //-------------------------------------------------------------
277 // received key : checkbox1|N/A , value : INT|1
278 //-------------------------------------------------------------
279 //char* key = "checkbox1|N/A";
283 ptr = strchr(key, '|');
286 xmlDocPtr doc = NULL;
289 //parsing for : checkbox1|N/A -> checkbox1
290 char* key_name = substring(key, 0, strlen(key)-strlen(ptr));
291 char* val_name = strchr(value, '|');
294 if (key_name == NULL)
298 doc = xmlParseFile(plugin_path);
301 SETTING_TRACE("unable to parse file : %s", plugin_path);
303 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; /* xml parsing error */
306 xmlNode *root = xmlDocGetRootElement(doc);
310 // TODO : message queing
311 // get key/value from d-bus and parse xml and search xml data with key
312 static int count = 0;
313 SETTING_TRACE(" BEGIN ---------------------------- dbus--> before __node_finder : %d", count);
314 __node_finder((PluginNode*)ad, root, key_name ,val_name, &is_end);
315 SETTING_TRACE(" END ----------------------------- dbus--> after __node_finder : %d", count);
319 GError *error = NULL;
323 xmlSaveFormatFile(ad->plugin_path, doc, 1);
324 // TODO: make sure this is right
327 SETTING_TRACE("__cfg_file_write successful");
334 return DBUS_HANDLER_RESULT_HANDLED;
337 static int __send_msg(char* key, char* value)
339 DBusMessage* message;
341 int sender_pid = getpid();
346 // ex) in gdb --> $15 = 0x43b6eb78 "Update_(null)" -> error codintion
347 if (s_pkg_name == NULL)
349 SETTING_TRACE("s_pkg_name is NULL - it's abnormal operation");
353 message = dbus_message_new_signal(DBUS_PATH, DBUS_SIGNAL_INTERFACE, s_pkg_name);
355 SETTING_TRACE("Sending message[%s:%s] via dbus", key ,value);
356 if (dbus_message_append_args(message,
357 DBUS_TYPE_UINT32, &sender_pid,
358 DBUS_TYPE_STRING, &key,
359 DBUS_TYPE_STRING, &value,
360 DBUS_TYPE_INVALID) == FALSE)
362 SETTING_TRACE("Fail to load data error");
366 if (dbus_connection_send(bus, message, NULL) == FALSE)
368 SETTING_TRACE("Fail to send message");
372 dbus_connection_flush(bus);
373 dbus_message_unref(message);
375 SETTING_TRACE("[CLIENT] send data signal done");
381 static void __send_int_msg(xmlNode* xmlObj, int val)
384 const char *id = (char*)xmlGetProp(xmlObj, "id");
385 const char *title = (char*)xmlGetProp(xmlObj, "title");
386 char key[MAX_CONTENT_LEN] = {0,};
387 snprintf(key, sizeof(key), "%s|%s", id, title);
389 char value[MAX_CONTENT_LEN] = {0,};
390 snprintf(value, sizeof(value), "INT|%d", val);
391 __send_msg(key, value);
396 static void __send_string_msg(xmlNode* xmlObj, char *string)
398 const char *id = (char*)xmlGetProp(xmlObj, "id");
399 const char *title = (char*)xmlGetProp(xmlObj, "title");
400 char key[MAX_CONTENT_LEN] = {0,};
401 snprintf(key, sizeof(key), "%s|%s", id, title);
403 char value[MAX_CONTENT_LEN] = {0,};
404 snprintf(value, sizeof(value), "STRING|%s", string);
405 __send_msg(key, value);
409 int setting_dbus_handler_init(void* user_data)
414 SETTING_TRACE("already get a bus, need release first.");
415 setting_dbus_handler_fini();
419 memset(&error, 0, sizeof(DBusError));
420 char rule[MAX_LOCAL_BUFSIZE + 1] = {0,};
421 dbus_error_init(&error);
422 bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
425 SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
426 dbus_error_free(&error);
430 dbus_connection_setup_with_g_main(bus, NULL);
431 snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
433 dbus_bus_add_match(bus, rule, &error);
434 if (dbus_error_is_set(&error))
436 SETTING_TRACE("Fail to rule set; %s", error.message);
437 dbus_bus_remove_match(bus, rule, &error);
438 dbus_error_free(&error);
439 dbus_connection_close(bus);
443 PluginNode* temp = (PluginNode*)user_data;
444 s_plugin_path = temp->plugin_path;
445 //SETTING_TRACE(" >>>>> setting - s_plugin_path :: %s", s_plugin_path);
447 if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
449 dbus_bus_remove_match(bus, rule, &error);
450 dbus_error_free(&error);
451 dbus_connection_close(bus);
456 SETTING_TRACE("app signal initialized");
460 int setting_dbus_handler_fini(void)
463 //do safty checking first.
464 setting_retvm_if(!bus, 0, "!bus");
466 memset(&error, 0, sizeof(DBusError));
467 char rule[MAX_LOCAL_BUFSIZE + 1] = {0, };
469 dbus_error_init(&error);
472 bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
474 //dbus_connection_remove_filter(bus, __signal_filter, NULL);
477 snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
478 dbus_bus_remove_match(bus, rule, &error);
480 if (dbus_error_is_set(&error))
482 SETTING_TRACE("Fail to rule unset: %s", error.message);
483 dbus_error_free(&error);
487 dbus_connection_close(bus);
489 SETTING_TRACE("app signal finalized");
493 /////////////////////////////
494 /////////////////////////////
495 /////////////////////////////
497 Elm_Genlist_Item_Class itc_layout;
500 static int __cfg_file_write(Draw_Data *pd)
504 GError *error = NULL;
507 xmlSaveFormatFile(pd->cfg_file, pd->doc, 1);
508 //xmlFreeDoc(pd->doc);
510 SETTING_TRACE("__cfg_file_write successful");
519 Setting_GenGroupItem_Data* obj;
523 * @brief eina list callback that check if there's a focused node
524 * @return false on Focused, true on Not focused
526 static Eina_Bool _plugin_foreach_cb_check_editfield(const Eina_Hash *hash, const void*key, void* data, void* fdata)
529 HashArgs* pret = (HashArgs*)fdata;
530 //int* pret = (int*)fdata;
532 Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) data;
533 SETTING_TRACE("%s --- %s ", (char*)key, node->keyStr);
535 xmlNode* xmlObj = NULL;
536 if (node->userdata) {
537 xmlObj = node->userdata;
538 //SETTING_TRACE("xml node type name ---> %s ", xmlObj->name);
541 //if (node->keyStr && !strcmp(node->keyStr, "string"))
542 if (xmlObj && xmlObj->name && !strcmp(xmlObj->name, "string"))
544 //SETTING_TRACE(" Size Check code !!! ");
545 //SETTING_TRACE(" >>> entry _ string : %s ", node->sub_desc);
546 //SETTING_TRACE(" >>> entry _ length : %d ", safeStrLen(node->sub_desc));
547 int min_length = node->minlength;
548 int entry_len = safeStrLen(node->sub_desc);
551 //NOT PROPERLY if (elm_object_focus_get(node->eo_check))
552 // elm_object_focus_get may have a timing issue.
553 // node string check here
554 if (entry_len < min_length)
556 SETTING_TRACE(" Size NO !!! ");
561 SETTING_TRACE(" Size OK !!! ");
570 static void __error_popup_inside_cb(void *data, Evas_Object *obj,
575 retm_if(data == NULL, "Data parameter is NULL");
576 retm_if(obj == NULL, "Data parameter is NULL");
579 Setting_GenGroupItem_Data *list_item = data;
580 if (list_item->notify) {
583 // __popup_del_cb(data, evas_object_evas_get(obj), obj, event_info);
586 __popup_del_cb(data, evas_object_evas_get(obj), obj, event_info);
588 evas_object_del(list_item->notify);
589 list_item->notify = NULL;
595 static void __error_popup_cb(void *data, Evas_Object *obj,
600 retm_if(data == NULL, "Data parameter is NULL");
601 retm_if(obj == NULL, "Data parameter is NULL");
604 Setting_GenGroupItem_Data *list_item = data;
605 if (list_item->notify) {
608 __popup_del_cb(data, evas_object_evas_get(obj), obj, event_info);
609 evas_object_del(list_item->notify);
610 list_item->notify = NULL;
620 int setting_plugin_is_editfield_exist(PluginNode* context)
627 if (context->ui_list) {
628 eina_hash_foreach(context->ui_list,_plugin_foreach_cb_check_editfield, &arg);
630 SETTING_TRACE("%d -- (%x)", arg.state, arg.obj);
632 // in some cases, arg.state is zero even if the entry has empty string.
637 Setting_GenGroupItem_Data* list_item = arg.obj;
638 int min_length = list_item->minlength;
639 int entry_len = safeStrLen(list_item->sub_desc);
641 //SETTING_TRACE(" >>> entry _ len : %d ", entry_len);
642 //SETTING_TRACE(" >>> minlength _ len : %d ", min_length);
644 if ( entry_len < min_length)
646 if (!list_item->notify) {
648 list_item->notify = setting_create_popup_without_btn(list_item, list_item->win_main,
649 NULL, _(EXCEED_MINLENGTH_LIMITATION_STR),
651 POPUP_INTERVAL, FALSE, TRUE); // FALSE, TRUE --> key grabbing
652 // elm_object_focus_set(list_item->eo_check, EINA_FALSE);
654 //postpone 2 seconds again
655 evas_object_show(list_item->notify);
656 elm_popup_timeout_set(list_item->notify, POPUP_INTERVAL);
658 //elm_object_focus_set(obj, EINA_TRUE);
668 * @brief 'back' button of plugin setting UG
670 * @param data PluginNode object
671 * @param obj NOT USED
672 * @param event_info NOT USED
674 * @return TRUE on success
676 static Eina_Bool ___click_softkey_back_cb(void *data, Evas_Object *obj, void *event_info)
680 PluginNode* node = (PluginNode*)data;
681 Draw_Data *pd = node->pd;
689 * get a list of genlist nodes, and see if there's text entries
691 int is_stop = setting_plugin_is_editfield_exist(node);
698 ui_gadget_h ug = node->ug;
703 SETTING_TRACE(" before ug_destory me ----<<<<<< ");
705 SETTING_TRACE(" after ug_destory me ----<<<<<< ");
707 setting_plugin_destroy(node);
710 elm_naviframe_item_pop(node->navi_bar);
712 SETTING_TRACE(" UG is NULL now ----<<<<<< ");
721 static void* group_func(void *data, xmlNode *xmlObj)
724 retv_if(!data || !xmlObj, NULL);
726 PluginNode* node = (PluginNode*)data;
727 Draw_Data *pd = node->pd;
729 // new code is recursive
730 const char *title = (char*)xmlGetProp(xmlObj, "title");
731 SETTING_TRACE (" >>> GROUP NAME : %s \n", title);
732 (void)setting_create_Gendial_field_titleItem(pd->scroller, &(itc_group_item), title, NULL);
737 static void* __link_list_cb(void *data, Evas_Object *obj, void *event_info)
740 retv_if(data == NULL, NULL);
741 retvm_if(event_info == NULL, NULL, "Invalid argument: event info is NULL");
742 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
743 elm_genlist_item_selected_set(item, 0);
744 Setting_GenGroupItem_Data *list_item =
745 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
747 xmlNode* xmlObj = data;
748 retv_if(!xmlObj, NULL);
749 const char *link_file = (char*)xmlGetProp(xmlObj, "value");
753 SETTING_TRACE_ERROR("Invalidate liked file");
756 char file[1024] = {0,};
757 snprintf(file, sizeof(file), "%s/%s", PLUGIN_CFG_DIR, link_file);
758 SETTING_TRACE("file:%s", file);
760 // Evas_Object* navi_bar, Evas_Object* win_main
761 PluginNode* plugin_node = setting_plugin_create( NULL, NULL );
762 setting_plugin_load(plugin_node, (const char *)file);
766 static void* __launch_list_cb(void *data, Evas_Object *obj, void *event_info)
769 retv_if(data == NULL, NULL);
770 retvm_if(event_info == NULL, NULL, "Invalid argument: event info is NULL");
771 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
772 elm_genlist_item_selected_set(item, 0);
773 Setting_GenGroupItem_Data *list_item =
774 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
776 xmlNode* xmlObj = data;
777 retv_if(!xmlObj, NULL);
778 const char *key_str = (char*)xmlGetProp(xmlObj, "id");
779 const char *title_str = (char*)xmlGetProp(xmlObj, "title");
780 const char *appid_str = (char*)xmlGetProp(xmlObj, "appid");
781 const char *operation_str = (char*)xmlGetProp(xmlObj, "operation");
784 service_h svc = NULL;
785 service_create(&svc);
786 if (!appid_str) appid_str = "";
787 if (!operation_str) operation_str = "";
789 service_set_app_id(svc, appid_str); // xml property – appid
790 service_set_operation(svc, operation_str); // property : operation
791 service_send_launch_request(svc, NULL, NULL);
792 service_destroy(svc);
797 static void* label_func(void *data, xmlNode *xmlObj)
800 retv_if(!data || !xmlObj, NULL);
801 PluginNode* node = (PluginNode*)data;
802 Draw_Data *pd = node->pd;
804 const char *title = (char*)xmlGetProp(xmlObj, "title");
806 Setting_GenGroupItem_Data *obj =
807 setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
809 xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
810 0, title, NULL, NULL);
815 static void* link_func(void *data, xmlNode *xmlObj)
818 retv_if(!data || !xmlObj, NULL);
819 PluginNode* node = (PluginNode*)data;
820 Draw_Data *pd = node->pd;
822 const char *key_str = (char*)xmlGetProp(xmlObj, "id");
823 Setting_GenGroupItem_Data * obj =
824 setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
826 xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
827 0, key_str, NULL, NULL);
832 static void* launch_func(void *data, xmlNode *xmlObj)
835 retv_if(!data || !xmlObj, NULL);
836 PluginNode* node = (PluginNode*)data;
837 Draw_Data *pd = node->pd;
839 const char *title_str = (char*)xmlGetProp(xmlObj, "title");
841 Setting_GenGroupItem_Data * obj =
842 setting_create_Gendial_field_def(pd->scroller, &(itc_1text),
844 xmlObj, SWALLOW_Type_INVALID, NULL, NULL,
845 0, title_str, NULL, NULL);
850 static char* __slider_format_cb(double val)
855 snprintf(buf, sizeof(buf), "%d", ival);
859 static void __slider_format_cb_free(char* str)
865 static void __slider_changed_cb(void *data, Evas_Object *obj, void *event_info)
867 ret_if(data == NULL || obj == NULL);
868 double val = elm_slider_value_get(obj);
869 SETTING_TRACE("val = %f", val);
871 Setting_GenGroupItem_Data *list_item = data;
873 xmlNode* xmlObj = list_item->userdata;
876 elm_slider_indicator_format_function_set(obj, __slider_format_cb, __slider_format_cb_free);
879 static void __slider_stop_cb(void *data, Evas_Object *obj, void *event_info)
881 ret_if(data == NULL || obj == NULL);
883 double val = elm_slider_value_get(obj);
884 Setting_GenGroupItem_Data *list_item = data;
886 elm_slider_indicator_format_function_set(obj, __slider_format_cb, __slider_format_cb_free);
888 ret_if(list_item->userdata == NULL);
890 xmlNode* xmlObj = list_item->userdata;
893 //apply the vconf changes after stopping moving slider..
896 list_item->chk_status = (int)(val + 0.5);
901 val = (double)val - (double)0.5;
903 list_item->chk_status = (int)val;
905 elm_slider_value_set(obj, list_item->chk_status);
906 //SETTING_TRACE(" slider after ---> val = %d", (int) list_item->chk_status);
909 sprintf(buf, "%d", (int) list_item->chk_status);
910 newattr = xmlSetProp(xmlObj, "value", buf);
912 __cfg_file_write((Draw_Data *)list_item->belongs_to);
913 SETTING_TRACE(" slider - send dbus message");
914 __send_int_msg(xmlObj, list_item->chk_status);
918 static void* slider_func(void *data, xmlNode *xmlObj)
921 retv_if(!data || !xmlObj, NULL);
922 PluginNode* node = (PluginNode*)data;
923 Draw_Data *pd = node->pd;
926 const char *title = (char*)xmlGetProp(xmlObj, "title");
928 SETTING_TRACE (" >>> [slider input] min=%s max=%s value=%s ",(char*)xmlGetProp(xmlObj, "min"), (char*)xmlGetProp(xmlObj, "max"), (char*)xmlGetProp(xmlObj, "value"));
930 int value = atoi((char*)xmlGetProp(xmlObj, "value"));
931 int min = atoi((char*)xmlGetProp(xmlObj, "min"));
932 int max = atoi((char*)xmlGetProp(xmlObj, "max"));
934 SETTING_TRACE ("[slider input] min=%d max=%d value=%d ", min, max, value);
936 setting_create_Gendial_itc("dialogue/1text.1icon.5", &(itc_layout));
937 Setting_GenGroupItem_Data *list_item =
938 setting_create_Gendial_field_def(pd->scroller, &(itc_layout), NULL,
940 SWALLOW_Type_LAYOUT_SLIDER,
941 IMG_SENSITIVITY_ICON_01,
942 IMG_SENSITIVITY_ICON_02, value,
945 list_item->win_main = NULL;
946 list_item->evas = NULL;
947 list_item->isIndicatorVisible = true;
948 list_item->slider_min = min;
949 list_item->slider_max = max;
950 list_item->userdata = xmlObj;
951 list_item->chk_change_cb = __slider_changed_cb;
952 list_item->stop_change_cb = __slider_stop_cb;
953 list_item->belongs_to = (int)pd;
956 g_list_item = list_item;
958 return (void*)list_item;
962 static void __checkbox_logic_helper(void *data, int toggle_state)
964 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
966 xmlNode* xmlObj = list_item->userdata;
970 if (list_item->chk_status == 1) {
971 newattr = xmlSetProp(xmlObj, "value", "true");
972 } else if (list_item->chk_status == 0) {
973 newattr = xmlSetProp(xmlObj, "value", "false");
975 newattr = xmlSetProp(xmlObj, "value", "false");
978 const char *id = (char*)xmlGetProp(xmlObj, "id");
979 const char *title = (char*)xmlGetProp(xmlObj, "title");
980 //SETTING_TRACE(" >>>> id:%s , title:%s", id, title);
982 __cfg_file_write((Draw_Data *)list_item->belongs_to);
983 __send_int_msg(xmlObj, list_item->chk_status);
986 * @brief handler for 'toggle button'
988 * @see also __check_mouse_up_cb
990 static void __chk_btn_cb(void *data, Evas_Object *obj, void *event_info)
994 retm_if(data == NULL, "Data parameter is NULL");
995 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
997 list_item->chk_status = elm_check_state_get(obj); /* for genlist update status */
999 __checkbox_logic_helper(list_item, list_item->chk_status);
1005 * @brief handler for 'touching' line of genlist item
1007 static void __check_mouse_up_cb(void *data, Evas_Object *obj,
1011 SETTING_TRACE_BEGIN;
1012 setting_retm_if(data == NULL, "Data parameter is NULL");
1014 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
1015 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
1016 elm_genlist_item_selected_set(item, 0);
1017 Setting_GenGroupItem_Data *list_item =
1018 (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
1020 SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
1022 int old_status = elm_check_state_get(list_item->eo_check);
1023 list_item->chk_status = !old_status;
1024 elm_check_state_set(list_item->eo_check, list_item->chk_status);
1026 __checkbox_logic_helper(list_item, list_item->chk_status);
1030 static void* checkbox_func(void *data, xmlNode *xmlObj)
1032 SETTING_TRACE_BEGIN;
1033 retv_if(!data || !xmlObj, NULL);
1035 PluginNode* node = (PluginNode*)data;
1036 Draw_Data *pd = node->pd;
1038 // [DATA] title, value
1039 const char *title = (char*)xmlGetProp(xmlObj, "title");
1042 char* value = (char*)xmlGetProp(xmlObj, "value");
1046 if ( 0 == safeStrCmp(value, "true")) {
1048 } else if ( 0 == safeStrCmp(value, "false")) {
1051 ival = 0; // default : false (0)
1054 // title, value, xmlObj
1055 Setting_GenGroupItem_Data *list_item =
1056 setting_create_Gendial_field_def(pd->scroller,
1058 __check_mouse_up_cb,
1060 SWALLOW_Type_1TOGGLE,
1067 list_item->userdata = xmlObj;
1068 list_item->belongs_to = (int) pd;
1069 SETTING_TRACE("pd:%p,list_item->belongs_to:%d", pd, list_item->belongs_to);
1076 static void __entry_unfocus_cb(void *data, Evas_Object *obj, void *event_info)
1078 SETTING_TRACE_BEGIN;
1079 retm_if(!data || !obj, "Data parameter is NULL");
1081 //-------------------------------------------------------------------------------------------
1082 Evas_Object *entry_container = data;
1083 //whe entry unfocused, its guidetext will becomes "Input here"
1084 elm_object_part_text_set(entry_container, "elm.guidetext", _("IDS_ST_BODY_TAP_TO_INSERT"));
1085 if (elm_entry_is_empty(obj))
1086 elm_object_signal_emit(entry_container, "elm,state,guidetext,show", "elm");
1087 elm_object_signal_emit(entry_container, "elm,state,eraser,hide", "elm");
1088 //-------------------------------------------------------------------------------------------
1091 //setting_hide_input_pannel_cb(obj);
1093 const char *entry_str = elm_entry_entry_get(obj);
1094 char *entry_str_utf8 = NULL;
1095 entry_str_utf8 = elm_entry_markup_to_utf8(entry_str);
1097 Setting_GenGroupItem_Data *list_item = data;
1099 // check minlentgh of the string
1100 int min_length = list_item->minlength;
1101 int entry_len = safeStrLen(entry_str_utf8);
1103 SETTING_TRACE(" >>> minlength _ len : %d ", min_length);
1104 SETTING_TRACE(" >>> entry _ len : %d ", entry_len);
1106 if (entry_len < min_length) {
1108 if (!list_item->notify) {
1109 list_item->notify = setting_create_popup_without_btn(list_item, list_item->win_main,
1110 NULL, _(EXCEED_MINLENGTH_LIMITATION_STR),
1111 //__error_popup_inside_cb,
1113 POPUP_INTERVAL, FALSE, TRUE);
1114 elm_object_focus_set(list_item->eo_check, EINA_FALSE);
1116 //postpone 2 seconds again
1117 elm_popup_timeout_set(list_item->notify, POPUP_INTERVAL);
1119 // elm_object_focus_set(obj, EINA_TRUE);
1124 xmlNode* xmlObj = list_item->userdata;
1126 FREE(entry_str_utf8);
1131 const char *title = (char*)xmlSetProp(xmlObj, "value",entry_str_utf8);
1133 __cfg_file_write((Draw_Data *)list_item->belongs_to);
1134 __send_string_msg(xmlObj, entry_str_utf8);
1136 FREE(entry_str_utf8);
1141 static void __editbox_list_cb(void *data, Evas_Object *obj,
1144 SETTING_TRACE_BEGIN;
1147 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
1148 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
1149 elm_genlist_item_selected_set(item, 0);
1150 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) elm_object_item_data_get(item);
1152 SETTING_TRACE("clicking item[%s]", _(list_item->keyStr));
1153 if (!elm_object_focus_get(list_item->eo_check)) {
1154 elm_object_focus_set(list_item->eo_check, EINA_TRUE);
1156 Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(list_item->eo_check);
1157 setting_retm_if(imf_context == NULL, "imf_context is NULL");
1158 ecore_imf_context_input_panel_show(imf_context);
1163 static void __editbox_changed_cb(void *data, Evas_Object *obj,
1166 SETTING_TRACE_BEGIN;
1167 retm_if(!data || !obj, "Data parameter is NULL");
1168 retm_if(!elm_object_focus_get(obj), "Entry is not focused");
1170 Setting_GenGroupItem_Data *list_item = (Setting_GenGroupItem_Data *) data;
1172 const char *entry_str = elm_entry_entry_get(obj);
1173 int entry_len = safeStrLen(entry_str);
1174 SETTING_TRACE("entry_str:[%s], length:%d", entry_str, entry_len);
1176 G_FREE(list_item->sub_desc);//release first
1177 list_item->sub_desc = (char *)g_strdup(entry_str);
1184 * @see also __editbox_changed_cb
1185 * @see also __entry_unfocus_cb
1187 static void* editbox_func(void *data, xmlNode *xmlObj)
1189 SETTING_TRACE_BEGIN;
1190 retv_if(!data || !xmlObj, NULL);
1192 PluginNode* node = (PluginNode*)data;
1193 Draw_Data *pd = node->pd;
1195 const char *title = (char*)xmlGetProp(xmlObj, "title");
1196 const char *key_str= (char*)xmlGetProp(xmlObj, "value");
1198 const char *minlength= (char*)xmlGetProp(xmlObj, "minlength");
1199 const char *maxlength= (char*)xmlGetProp(xmlObj, "maxlength");
1201 // MAXLENGTH HANDLER
1205 max_len = atoi(maxlength);
1206 SETTING_TRACE(" >> MAXLENGTH FILTER IS AVAILABLE !!!! maxlength = %d", max_len);
1212 min_len = atoi(minlength);
1213 SETTING_TRACE(" >> MINLENGTH FILTER IS AVAILABLE !!!! minlength = %d", min_len);
1216 Setting_GenGroupItem_Data *list_item = NULL;
1218 if (max_len == -1 && min_len == -1 )
1220 // without maxlength filter
1221 list_item = setting_create_Gendial_field_def(pd->scroller, &(itc_dialogue_editfield_title),
1223 pd, SWALLOW_Type_LAYOUT_ENTRY,
1224 NULL, NULL, 0, title, key_str,
1225 __editbox_changed_cb);
1228 // add max length filter
1229 list_item = setting_create_Gendial_field_entry_fo(
1231 &(itc_dialogue_editfield_title),
1234 SWALLOW_Type_LAYOUT_ENTRY,
1235 NULL, NULL, 0, title, key_str,
1236 __editbox_changed_cb,
1238 ELM_INPUT_PANEL_LAYOUT_NORMAL,
1248 list_item->userdata = xmlObj;
1249 list_item->stop_change_cb = __entry_unfocus_cb;
1250 list_item->belongs_to = (int)pd;
1253 list_item->win_main = node->win_main;
1260 static void __expanditem_func_sel_cb(void *data, Evas_Object *obj, void *event_info)
1262 SETTING_TRACE_BEGIN;
1264 retm_if(event_info == NULL, "Invalid argument: event info is NULL");
1265 Elm_Object_Item *subitem = (Elm_Object_Item *) event_info;
1266 Elm_Object_Item *parentItem = elm_genlist_item_parent_get(subitem);
1267 elm_genlist_item_selected_set(subitem, 0);
1268 Setting_GenGroupItem_Data *data_subItem = elm_object_item_data_get(subitem);
1269 Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem); /* parent data */
1270 ret_if(NULL == data_subItem || NULL == data_parentItem);
1272 elm_radio_value_set(data_subItem->rgd, data_subItem->chk_status);
1274 data_parentItem->sub_desc = (char *)g_strdup(_(data_subItem->keyStr));
1275 elm_object_item_data_set(data_parentItem->item, data_parentItem);
1276 elm_genlist_item_update(data_parentItem->item);
1278 xmlNode* xmlObj = data_parentItem->userdata;
1282 //newattr = xmlSetProp(xmlObj, "string", data_parentItem->sub_desc);
1283 newattr = xmlSetProp(xmlObj, "value", data_parentItem->sub_desc);
1285 __cfg_file_write((Draw_Data *)data_parentItem->belongs_to);
1286 __send_string_msg(xmlObj, data_parentItem->sub_desc);
1290 static void __expanditem_func_exp_cb(void *data, Evas_Object *obj, void *event_info)
1292 ret_if(NULL == data || NULL == event_info);
1293 SETTING_TRACE_BEGIN;
1295 PluginNode* node = (PluginNode*)data;
1296 Draw_Data *pd = node->pd;
1298 Elm_Object_Item *parentItem = event_info; /* parent item */
1299 Setting_GenGroupItem_Data *data_parentItem = elm_object_item_data_get(parentItem); /* parent data */
1300 Evas_Object *scroller = elm_object_item_widget_get(parentItem);
1303 xmlNode *xmlObj = data_parentItem->userdata;
1304 char *value = (char*)xmlGetProp(xmlObj, "value");
1305 SETTING_TRACE(">>> value = %s", value);
1306 Evas_Object *rgd = NULL;
1308 if (xmlObj->children && !data_parentItem->rgd) {//to protect from entering repeatly
1309 xmlNode* cur = xmlObj->children;
1311 rgd = elm_radio_add(scroller);
1312 elm_radio_value_set(rgd, -1);
1315 char *subitem_title = NULL;
1316 int subitem_index = 0;
1320 // print out debug message
1321 if (data_parentItem->childs)
1324 Eina_List *li = data_parentItem->childs;
1327 Setting_GenGroupItem_Data* node = eina_list_data_get(li);
1329 //SETTING_TRACE(" <<< node->keyStr : %s >>> ", node->keyStr);
1332 li = eina_list_next(li);
1334 //SETTING_TRACE(" <<<how many : %d>>> ", howmany);
1337 if (data_parentItem->childs)
1339 eina_list_free(data_parentItem->childs);
1340 data_parentItem->childs = NULL;
1343 while (cur != NULL) {
1344 if (!xmlStrcmp(cur->name, (const xmlChar*)"expanditem")) {
1345 type = (char*)xmlGetProp(cur, "type");
1346 if (0 == safeStrCmp(type, "radio")) {
1347 subitem_title = (char*)xmlGetProp(cur, "title");
1348 Setting_GenGroupItem_Data *list_item =
1349 setting_create_Gendial_exp_sub_field(scroller,
1350 &(itc_1icon_1text_sub),
1351 __expanditem_func_sel_cb, NULL, parentItem,
1352 SWALLOW_Type_1RADIO, rgd,
1354 subitem_title, NULL);
1357 if (0 == safeStrCmp(value, subitem_title)) {
1358 sel_idx = subitem_index;
1359 SETTING_TRACE("%d is selected in Radio Group", sel_idx);
1361 SETTING_TRACE(" eina list add >>> value = %s, subitem_title = %s ", value, subitem_title);
1362 data_parentItem->childs = eina_list_append(data_parentItem->childs, list_item);
1366 SETTING_TRACE("invalid type[:%s]", type);
1373 elm_radio_value_set(rgd, sel_idx);
1374 data_parentItem->rgd = rgd;//protecting condition
1379 static void __expanditem_func_smart_cb(void *data, Evas_Object *obj, void *event_info)
1381 ret_if(data == NULL || event_info == NULL);
1382 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
1383 Setting_GenGroupItem_Data *data_item = elm_object_item_data_get(item);
1384 char *cb_type = data;
1386 if (0 == safeStrCmp(cb_type, "contracted")) {
1387 data_item->rgd = NULL;
1388 elm_genlist_item_subitems_clear(item);
1393 static void* settings_func(void *data, xmlNode *xmlObj)
1395 SETTING_TRACE_BEGIN;
1396 retv_if(!data || !xmlObj, NULL);
1397 PluginNode* node = (PluginNode*)data;
1400 count = node->nitems;
1402 if (count == 1) // if there's <settings> only
1404 SETTING_TRACE("there's only <settings>");
1405 setting_func(data, xmlObj);
1411 static void __plugin_genlist_unrealized_cb(void* data,Evas_Object* obj, void* event_info)
1413 SETTING_TRACE_BEGIN;
1414 ret_if(data == NULL);
1416 Elm_Object_Item *item = (Elm_Object_Item*)event_info;
1417 Setting_GenGroupItem_Data *node = (Setting_GenGroupItem_Data *)elm_object_item_data_get(item);
1418 ret_if(node== NULL);
1422 eina_list_free(node->childs);
1423 node->childs = NULL;
1428 // 1st create a window
1429 // 2nd push a window
1430 //--------------------------------------------------------
1431 static void* setting_func(void *data, xmlNode *xmlObj)
1433 SETTING_TRACE_BEGIN;
1434 retv_if(!data || !xmlObj, NULL);
1436 PluginNode* node = (PluginNode*)data;
1437 Draw_Data *pd = node->pd;
1440 const char *title = (char*)xmlGetProp(xmlObj, "title");
1443 SETTING_TRACE("before setting_create_layout_navi_bar_genlist");
1446 pd->scroller = elm_genlist_add(node->win_main);
1447 retvm_if(pd->scroller == NULL, NULL,
1448 "Cannot set scroller object as contento of layout");
1449 elm_object_style_set(pd->scroller, "dialogue");
1450 elm_genlist_clear(pd->scroller); /* first to clear list */
1452 evas_object_smart_callback_add(pd->scroller, "unrealized", __plugin_genlist_unrealized_cb, node);
1454 SETTING_TRACE("_(title):%s", _(title));
1456 if (node->ug == NULL)
1458 setting_push_layout_navi_bar(
1460 _("IDS_COM_BODY_BACK"), NULL, NULL,
1461 ___click_softkey_back_cb,
1464 node->navi_bar, NULL);
1466 node->ly_main = setting_create_layout_navi_bar(node->win_main_layout, node->win_main,
1468 _("IDS_COM_BODY_BACK"), NULL, NULL,
1469 ___click_softkey_back_cb,
1472 &node->navi_bar, NULL);
1474 SETTING_TRACE("after setting_create_layout_navi_bar_genlist");
1479 static void* expanditem_func(void *data, xmlNode *xmlObj)
1481 // DO NOTHING - expandlist draws this area
1485 static void* expandlist_func(void *data, xmlNode *xmlObj)
1487 SETTING_TRACE_BEGIN;
1488 retv_if(!data || !xmlObj, NULL);
1490 PluginNode* node = (PluginNode*)data;
1491 Draw_Data *pd = node->pd;
1493 const char *key_str = (char*)xmlGetProp(xmlObj, "title");
1494 const char *value = (char*)xmlGetProp(xmlObj, "value"); // string -> value
1496 setting_enable_expandable_genlist(pd->scroller, data, __expanditem_func_exp_cb, __expanditem_func_smart_cb);
1497 Setting_GenGroupItem_Data *list_item =
1498 setting_create_Gendial_exp_parent_field(pd->scroller,
1499 &(itc_2text_3_parent),
1501 SWALLOW_Type_INVALID,
1505 list_item->userdata = xmlObj;
1506 list_item->belongs_to = (int)pd;
1507 list_item->childs = NULL; /* init */
1513 static int __node_walk_check(PluginNode* context, xmlNode* cur, int* pcount)
1515 //SETTING_TRACE_BEGIN;
1516 Draw_Data *pd = context->pd;
1518 retv_if(!context->ui_list, -1);
1520 xmlNode *cur_node = NULL;
1521 for (cur_node = cur; cur_node;cur_node = cur_node->next) {
1522 if (cur_node->type == XML_ELEMENT_NODE) {
1523 //SETTING_TRACE("node type : %s id= %s", cur_node->name,xmlGetProp(cur_node, "id"));
1526 __node_walk_check(context, cur_node->children, pcount); /* RECURSIVE */
1531 static int __node_walker(PluginNode* context, xmlNode* cur)
1533 //SETTING_TRACE_BEGIN;
1534 Draw_Data *pd = context->pd;
1537 retv_if(!context->ui_list, -1);
1539 xmlNode *cur_node = NULL;
1540 for (cur_node = cur; cur_node;cur_node = cur_node->next) {
1541 if (cur_node->type == XML_ELEMENT_NODE) {
1542 // SETTING_TRACE("node type : %s id= %s", cur_node->name,xmlGetProp(cur_node, "id"));
1543 drawer_fp fp = __drawer_find(cur_node->name);
1547 void* vret = fp(context, cur_node); // draw it
1551 Setting_GenGroupItem_Data* genlist_node = (Setting_GenGroupItem_Data* )vret;
1552 //SETTING_TRACE("add node to Eina List name : %s, id : ", cur_node->name, xmlGetProp(cur_node, "id"));
1553 // add it to the hash table create before.
1556 char* key_name = xmlGetProp(cur_node, "id");
1557 eina_hash_add(context->ui_list, strdup(key_name),(void*)genlist_node);
1560 SETTING_TRACE(" >>>> fp is NULL ");
1563 __node_walker(context, cur_node->children); /* RECURSIVE */
1569 * @param id_str [in] "id"
1570 * @param value [in] value to be udpated
1571 * @see __expanditem_func_sel_cb
1573 static int __node_finder(PluginNode* context, xmlNode* cur, char* id_str, char* value, bool* is_end)
1575 SETTING_TRACE_BEGIN;
1576 xmlNode *cur_node = NULL;
1580 SETTING_TRACE("context is NULL - it's error CONDITION ");
1584 retv_if(!context->ui_list, -1);
1585 if (*is_end == true) return 0;
1587 for (cur_node = cur; cur_node;cur_node = cur_node->next) {
1588 if (cur_node->type == XML_ELEMENT_NODE) {
1590 char* id_name = (char*)xmlGetProp(cur_node, "id");
1591 if ( id_name && 0 == strcmp(id_str, id_name))
1593 SETTING_TRACE("FOUND >>>> %s", id_name);
1594 // cur_node - update xml code
1595 xmlAttrPtr newattr = xmlSetProp(cur_node, "value", value);
1597 //-----------------------------------------------------------
1600 if ( 0 == strcmp (cur_node->name, "integer"))
1602 SETTING_TRACE(">>>>> UPDATE SLIDER CONTROL %x --- %s ",context->ui_list, id_name);
1603 Setting_GenGroupItem_Data* item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
1606 item_to_update->chk_status = atoi(value);
1607 SETTING_TRACE(">>> o-------------0 SLIDER VALUE = %d ", item_to_update->chk_status);
1609 elm_object_item_data_set(item_to_update->item, item_to_update);
1610 elm_genlist_item_update(item_to_update->item);
1612 SETTING_TRACE("item_to_update is NULL");
1616 if ( 0 == strcmp (cur_node->name, "bool"))
1618 SETTING_TRACE(">>>>> UPDATE TOGGLE CONTROL pluginpath:%s, ---- %x --- %s ", context->plugin_path, context->ui_list, id_name);
1619 Setting_GenGroupItem_Data* item_to_update = NULL;
1620 item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
1623 item_to_update->chk_status = atoi(value);
1624 SETTING_TRACE(">>> o-------------0 TOGGLE VALUE = %d ", item_to_update->chk_status);
1626 elm_object_item_data_set(item_to_update->item, item_to_update);
1627 elm_genlist_item_update(item_to_update->item);
1629 SETTING_TRACE("item_to_update is NULL");
1632 // case : edit control
1633 if ( 0 == strcmp (cur_node->name, "string"))
1635 SETTING_TRACE(">>>>> UPDATE EDIT CONTROL CONTROL %x --- %s ",context->ui_list, id_name);
1636 Setting_GenGroupItem_Data* item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
1639 char* old_string = item_to_update->sub_desc;
1640 item_to_update->sub_desc = strdup(value);
1641 SETTING_TRACE(">>> o-------------0 STRING VALUE = %s ", value);
1645 elm_object_item_data_set(item_to_update->item, item_to_update);
1646 elm_genlist_item_update(item_to_update->item);
1649 SETTING_TRACE("item_to_update is NULL");
1652 // case : expand list
1658 //-----------------------------------------------------------
1659 if ( 0 == strcmp (cur_node->name, "expandlist"))
1662 SETTING_TRACE(">>>>> UPDATE EXPAND LIST CONTROL %x --- %s ",context->ui_list, id_name);
1663 Setting_GenGroupItem_Data* item_to_update = NULL;
1664 item_to_update = (Setting_GenGroupItem_Data*)eina_hash_find(context->ui_list, id_name);
1667 char* old_string = item_to_update->sub_desc;
1668 item_to_update->sub_desc = strdup(value);
1669 SETTING_TRACE(">>> o-------------0 EXPAND LIST VALUE = %s ", value);
1673 elm_object_item_data_set(item_to_update->item, item_to_update);
1674 elm_genlist_item_update(item_to_update->item);
1676 // TODO: need to update child elements
1677 // item_to_update->childs ---> expanded list
1680 // there should have 4 sub items.
1681 //-----------------------------------------------------
1682 // has it already freed by someone?
1683 //-----------------------------------------------------
1684 if (item_to_update->childs)
1687 Eina_List *li = item_to_update->childs;
1690 Setting_GenGroupItem_Data* node = eina_list_data_get(li);
1692 li = eina_list_next(li);
1694 SETTING_TRACE(" expandlist -- how many items are there? : %d ", howmany2);
1697 if (item_to_update->childs)
1699 Eina_List *li = item_to_update->childs;
1700 int radio_index = 0;
1703 Setting_GenGroupItem_Data* node = eina_list_data_get(li);
1705 if (node->item && node->keyStr)
1707 // do something more
1708 // SETTING_TRACE(">>> RADIO LIST STRING VALUE = %s ", node->keyStr);
1709 // set position of radio button
1710 if (value && strcmp(node->keyStr, value) == 0) // << CRAAH !!!!
1712 elm_radio_value_set(node->rgd, radio_index);
1715 SETTING_TRACE(">>> node has unproper values - Setting_GenGroupItem_Data");
1717 elm_object_item_data_set(item_to_update->item, item_to_update);
1718 elm_genlist_item_update(item_to_update->item);
1721 li = eina_list_next(li);
1727 SETTING_TRACE("item_to_update is NULL");
1735 __node_finder(context, cur_node->children, id_str, value, is_end); /* RECURSIVE */
1740 static unsigned int _plugin_string_key_length(const char*key)
1745 return (int)strlen(key) + 1;
1748 static int _plugin_string_key_cmp(const char* key1, int key1_length,
1749 const char* key2, int key2_length)
1751 return strcmp(key1, key2);
1754 static void _plugin_entry_free_cb(void* data)
1757 // this code already have done in genlist_unrealized
1758 Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) data;
1761 eina_list_free(node->childs);
1762 node->childs = NULL;
1767 PluginNode* setting_plugin_create(Evas_Object* navi, Evas_Object* win)
1769 PluginNode *plugin = calloc(1, sizeof(PluginNode));
1770 setting_retvm_if(!plugin, -1, "Create PluginNode obj failed");
1771 Draw_Data *pd = calloc(1, sizeof(Draw_Data));
1777 setting_retvm_if(!pd, -1, "Create Draw_Data obj failed");
1779 plugin->ly_main = NULL;
1781 plugin->navi_bar = navi;
1782 plugin->win_main = win;
1784 plugin->ui_list = eina_hash_new(EINA_KEY_LENGTH(_plugin_string_key_length),
1785 EINA_KEY_CMP(_plugin_string_key_cmp),
1786 EINA_KEY_HASH(eina_hash_superfast),
1787 _plugin_entry_free_cb,
1793 void setting_plugin_destroy(PluginNode* node)
1795 SETTING_TRACE_BEGIN;
1797 SETTING_TRACE("node is NOT NULL")
1799 SETTING_TRACE("node->pd is NOT NULL")
1800 if(node->pd->doc != NULL) {
1801 xmlSaveFormatFile(node->plugin_path, node->pd->doc, 1);
1802 xmlFreeDoc(node->pd->doc);
1803 node->pd->doc = NULL;
1804 SETTING_TRACE("__cfg_file_write successful");
1811 if (node->ui_list) {
1812 eina_hash_free(node->ui_list);
1813 node->ui_list = NULL;
1822 static Eina_Bool _plugin_foreach_cb(const Eina_Hash *hash, const void*key, void* data, void* fdata)
1824 Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) data;
1825 SETTING_TRACE("%s --- %s ", (char*)key, node->keyStr);
1830 void setting_plugin_debug(PluginNode* context)
1832 // SETTING_TRACE("HASH TABLE -------------------------------------");
1833 if (context->ui_list) {
1834 eina_hash_foreach(context->ui_list,_plugin_foreach_cb, NULL);
1836 // SETTING_TRACE("HASH TABLE -------------------------------------");
1840 void setting_plugin_update(PluginNode* context)
1842 Eina_List *li = context->ui_list;
1845 Setting_GenGroupItem_Data* node = (Setting_GenGroupItem_Data*) eina_list_data_get(li);
1847 // SETTING_TRACE(" ---> keyStr : %s , swallow type : %d ", node->keyStr, node->swallow_type);
1848 Setting_GenGroupItem_Data* item_to_update = NULL;
1849 item_to_update = node;
1850 elm_object_item_data_set(item_to_update->item, item_to_update);
1851 elm_genlist_item_update(item_to_update->item);
1853 li = eina_list_next(li);
1861 int setting_plugin_load(PluginNode* node, const char *cfg_file)
1863 SETTING_TRACE("cfg_file:%s", cfg_file)
1864 if (isEmptyStr(cfg_file) || 0 != access(cfg_file, R_OK|W_OK|F_OK ))
1866 SETTING_TRACE_ERROR(" error occured : access = %d ", errno);
1869 node->pd->cfg_file = cfg_file;
1871 node->pd->doc = xmlParseFile(cfg_file);
1872 node->pd->root = xmlDocGetRootElement(node->pd->doc);
1874 // signal filter change
1875 //void* user_data = (void*)g_main_ad;
1876 void* user_data = (void*)node;
1879 dbus_error_init(&error);
1880 char rule[MAX_LOCAL_BUFSIZE + 1] = {0,};
1881 bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
1884 SETTING_TRACE("Fail to connect to the D-BUS daemon: %s", error.message);
1885 dbus_error_free(&error);
1890 snprintf(rule, MAX_LOCAL_BUFSIZE, "path='%s',type='signal',interface='%s'", DBUS_PATH, DBUS_SIGNAL_INTERFACE);
1891 dbus_bus_add_match(bus, rule, &error);
1892 if (dbus_error_is_set(&error))
1894 SETTING_TRACE("Fail to rule set; %s", error.message);
1895 dbus_bus_remove_match(bus, rule, &error);
1896 dbus_error_free(&error);
1897 dbus_connection_close(bus);
1903 if (dbus_connection_add_filter(bus, __signal_filter, user_data, NULL) == FALSE)
1905 SETTING_TRACE("Fail to add filter ----- ");
1906 dbus_bus_remove_match(bus, rule, &error);
1907 dbus_error_free(&error);
1908 dbus_connection_close(bus);
1914 __node_walk_check(node, node->pd->root, &count);
1915 SETTING_TRACE(" node count : %d ", count);
1916 node->nitems = count;
1917 __node_walker(node, node->pd->root);
1920 //setting_plugin_debug(node);