sync with private git. updated the license and the boilerplates
[apps/home/quickpanel.git] / daemon / list_util.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.1 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *  http://floralicense.org/license/
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <Elementary.h>
18 #include <stdlib.h>
19
20 #include "common.h"
21 #include "list_util.h"
22
23 #define E_DATA_ITEM_LABEL_H "QP_ITEM_DATA"
24
25 struct _qp_item_data {
26         qp_item_type_e type;
27         void *data;
28 };
29
30 HAPI qp_item_data *quickpanel_list_util_item_new(qp_item_type_e type, void *data)
31 {
32         qp_item_data *qid = NULL;
33
34         qid = malloc(sizeof(struct _qp_item_data));
35         if (!qid) {
36                 ERR("fail to alloc qid");
37                 return NULL;
38         }
39
40         qid->type = type;
41         qid->data = data;
42
43         return qid;
44 }
45
46 HAPI void quickpanel_list_util_item_set_tag(Evas_Object *item, qp_item_data *qid)
47 {
48         retif(item == NULL, , "invalid parameter");
49         retif(qid == NULL, , "invalid parameter");
50
51         evas_object_data_set(item, E_DATA_ITEM_LABEL_H, qid);
52 }
53
54 HAPI void quickpanel_list_util_item_del_tag(Evas_Object *item)
55 {
56         retif(item == NULL, , "invalid parameter");
57
58         qp_item_data *qid = evas_object_data_get(item, E_DATA_ITEM_LABEL_H);
59
60         if (qid != NULL) {
61                 evas_object_data_del(item, E_DATA_ITEM_LABEL_H);
62                 free(qid);
63         }
64 }
65
66 HAPI void *quickpanel_list_util_item_get_data(qp_item_data *qid)
67 {
68         void *user_data = NULL;
69
70         if (!qid)
71                 return NULL;
72
73         user_data = qid->data;
74
75         return user_data;
76 }
77
78 HAPI void quickpanel_list_util_item_set_data(qp_item_data *qid, void *data)
79 {
80         if (!qid)
81                 return ;
82
83         qid->data = data;
84 }
85
86 HAPI int quickpanel_list_util_item_compare(const void *data1, const void *data2)
87 {
88         int diff = 0;
89         qp_item_data *qid1 = NULL;
90         qp_item_data *qid2 = NULL;
91         const Evas_Object *eo1 = data1;
92         const Evas_Object *eo2 = data2;
93
94         if (!eo1) {
95                 INFO("eo1 is NULL");
96                 return -1;
97         }
98
99         if (!eo2) {
100                 INFO("eo2 is NULL");
101                 return 1;
102         }
103
104         qid1 = evas_object_data_get(eo1, E_DATA_ITEM_LABEL_H);
105         qid2 = evas_object_data_get(eo2, E_DATA_ITEM_LABEL_H);
106
107         if (!qid1) {
108                 INFO("qid1 is NULL");
109                 return -1;
110         }
111
112         if (!qid2) {
113                 INFO("qid2 is NULL");
114                 return 1;
115         }
116
117         /* elm_genlist sort is not working as i expected */
118         if (qid1->type == qid2->type)
119                 return 1;
120
121         diff = qid1->type - qid2->type;
122         return diff;
123 }
124
125 HAPI void quickpanel_list_util_item_unpack_by_type(Evas_Object *list
126                 , qp_item_type_e type)
127 {
128         retif(list == NULL, , "invalid parameter");
129
130         Eina_List *l;
131         Eina_List *l_next;
132         Evas_Object *obj;
133         Eina_List *item_list = elm_box_children_get(list);
134
135         EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj)
136         {
137                 if (obj != NULL) {
138                         // call deleted callback
139                         qp_item_data *qid = evas_object_data_get(obj, E_DATA_ITEM_LABEL_H);
140                         if (qid != NULL) {
141                                 if (qid->type == type) {
142                                         elm_box_unpack(list, obj);
143                                 }
144                         }
145                 }
146         }
147 }
148
149 HAPI void quickpanel_list_util_item_unpack_by_object(Evas_Object *list
150                 , Evas_Object *item)
151 {
152         retif(list == NULL, , "invalid parameter");
153         retif(item == NULL, , "invalid parameter");
154
155         elm_box_unpack(list, item);
156 }
157
158 static int __item_compare(const void *data1, const void *data2)
159 {
160         int diff = 0;
161         const Evas_Object *eo1 = data1;
162         const qp_item_data *qid1 = NULL;
163         const qp_item_data *qid2 = data2;
164
165         if (!data1) {
166                 INFO("data1 is NULL");
167                 return -1;
168         }
169
170         if (!data2) {
171                 INFO("data2 is NULL");
172                 return 1;
173         }
174
175         qid1 = evas_object_data_get(eo1, E_DATA_ITEM_LABEL_H);
176
177         if (!qid1) {
178                 INFO("qid1 is NULL");
179                 return -1;
180         }
181
182         diff = qid1->type - qid2->type;
183
184         return diff;
185 }
186
187
188 HAPI void quickpanel_list_util_sort_insert(Evas_Object *list,
189                                         Evas_Object *new_obj)
190 {
191         retif(list == NULL, , "invalid parameter");
192         retif(new_obj == NULL, , "invalid parameter");
193
194         Eina_List *l;
195         Eina_List *l_next;
196         Evas_Object *obj = NULL;
197         Evas_Object *first = NULL;
198         Eina_List *item_list = elm_box_children_get(list);
199         qp_item_data *item_data = NULL;
200
201         item_data = evas_object_data_get(new_obj, E_DATA_ITEM_LABEL_H);
202         retif(item_data == NULL, , "invalid parameter");
203
204         INFO("current entry count in list:%d", eina_list_count(item_list));
205         EINA_LIST_FOREACH_SAFE(item_list, l, l_next, obj)
206         {
207                 if (obj != NULL) {
208                         if (__item_compare(obj, item_data) >= 0)
209                                 break;
210                 }
211
212                 first = obj;
213         }
214
215         if (first == NULL) {
216                 elm_box_pack_start(list, new_obj);
217         } else {
218                 elm_box_pack_after(list, new_obj, first);
219         }
220 }