c57b910e0b0cf41dfa7e3519db38694a226895b1
[apps/core/preloaded/calendar.git] / common / radio-group.c
1 /*
2   *
3   *  Copyright 2012  Samsung Electronics Co., Ltd
4   *
5   *  Licensed under the Flora License, Version 1.0 (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
8   *
9   *       http://floralicense.org/license/
10   *
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.
16   */
17
18 #include "cld.h"
19 #include "radio-group.h"
20
21 typedef struct {
22         unsigned int count;
23         unsigned int selected;
24         Evas_Object* head;
25         Evas_Object** objects;
26         cal_radio_group_changed_callback* changed_cb;
27         void** changed_cb_data;
28 } cal_radio_group_s;
29
30 cal_radio_group_h cal_radio_group_create(unsigned int count, Evas_Object* parent)
31 {
32         c_retv_if(count == 0, NULL);
33
34         cal_radio_group_s* p = (cal_radio_group_s*)calloc(1, sizeof(cal_radio_group_s));
35         c_retv_if(!p, NULL);
36
37         p->count = count;
38         p->head = elm_radio_add(parent);
39         c_retv_if(!p->head, p);
40
41         p->objects = (Evas_Object**)calloc(count, sizeof(Evas_Object*));
42         c_retv_if(!p->objects, p);
43
44         p->changed_cb = (cal_radio_group_changed_callback*)calloc(count, sizeof(cal_radio_group_changed_callback));
45         c_retv_if(!p->changed_cb, p);
46
47         p->changed_cb_data = (void**)calloc(count, sizeof(void*));
48         c_retv_if(!p->changed_cb_data, p);
49
50         return p;
51 }
52
53 void cal_radio_group_destroy(cal_radio_group_h rg)
54 {
55         cal_radio_group_s* p = (cal_radio_group_s*)rg;
56         c_ret_if(p == NULL);
57
58         evas_object_del(p->head);
59         free(p->objects);
60         free(p->changed_cb);
61         free(p->changed_cb_data);
62         free(p);
63 }
64
65 void cal_radio_group_set_radio_object(cal_radio_group_h rg, unsigned int index, Evas_Object* obj)
66 {
67         cal_radio_group_s* p = (cal_radio_group_s*)rg;
68         c_ret_if(p == NULL);
69         c_ret_if(index >= p->count);
70         c_ret_if(obj == NULL);
71
72         p->objects[index] = obj;
73
74         DBG("%d %d", index, p->head);
75
76         elm_radio_state_value_set(obj, index);
77
78         elm_radio_group_add(obj, p->head);
79
80         if (index == p->selected) {
81                 elm_radio_value_set(p->head, index);
82                 DBG("recovered selection %d", index);
83         }
84 }
85
86 void cal_radio_group_set_changed_callback(cal_radio_group_h rg, unsigned int index,
87                 cal_radio_group_changed_callback func, void* data)
88 {
89         CAL_FN_START;
90
91         cal_radio_group_s* p = (cal_radio_group_s*)rg;
92         c_ret_if(rg == NULL);
93         c_ret_if(index >= p->count);
94
95         p->changed_cb[index] = func;
96         p->changed_cb_data[index] = data;
97 }
98
99 void cal_radio_group_remove_radio_object(cal_radio_group_h rg, unsigned int index)
100 {
101         cal_radio_group_s* p = (cal_radio_group_s*)rg;
102         c_ret_if(p == NULL);
103         c_ret_if(index >= p->count);
104
105         p->objects[index] = NULL;
106 }
107
108 void cal_radio_group_select_radio(cal_radio_group_h rg, unsigned int index)
109 {
110         cal_radio_group_s* p = (cal_radio_group_s*)rg;
111         c_ret_if(p == NULL);
112         c_ret_if(index >= p->count);
113
114         DBG("%d %d", index, p->head);
115
116         int old = p->selected;
117
118         if (p->changed_cb[old] != NULL)
119                 p->changed_cb[old](old, false, p->changed_cb_data[old]);
120
121         p->selected = index;
122
123         elm_radio_value_set(p->head, index);
124
125         if (p->changed_cb[index] != NULL)
126                 p->changed_cb[index](index, true, p->changed_cb_data[index]);
127 }
128
129 int cal_radio_group_get_selected_radio(cal_radio_group_h rg)
130 {
131         cal_radio_group_s* p = (cal_radio_group_s*)rg;
132         c_retv_if(p == NULL, -1);
133
134         return p->selected;
135 }
136