Tizen 2.0 Release
[apps/home/settings.git] / setting-common / src / setting-common-view.c
1 /*
2  * setting
3  * Copyright (c) 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 #include <setting-common-view.h>
18
19 #include <Elementary.h>
20
21 #include <setting-common-data-error.h>
22 #include <setting-debug.h>
23
24 #define MAX_VIEWNODE_NUM        15
25 typedef struct _SettingViewNode {
26         setting_view *view;
27         setting_view *topview;
28 } SettingViewNode;
29 static setting_view *g_cur_view;;       /* use by 'End Key' process */
30 static SettingViewNode g_view_node_table[MAX_VIEWNODE_NUM];
31 static int g_view_node_table_cur_size = 0;
32
33 int setting_view_node_set_cur_view(setting_view *view)
34 {
35         g_cur_view = view;
36         return 0;
37 }
38
39 setting_view *setting_view_node_get_cur_view()
40 {
41         return g_cur_view;
42 }
43
44 int setting_view_node_table_intialize()
45 {
46         g_cur_view = NULL;
47         g_view_node_table_cur_size = 0;
48         return 0;
49 }
50
51 int
52 setting_view_node_table_register(setting_view *view, setting_view *topview)
53 {
54         //SETTING_TRACE_BEGIN;
55         if (g_view_node_table_cur_size >= MAX_VIEWNODE_NUM) {
56                 return SETTING_RETURN_FAIL;
57         }
58
59         g_view_node_table[g_view_node_table_cur_size].view = view;
60         g_view_node_table[g_view_node_table_cur_size].topview = topview;
61         g_view_node_table_cur_size++;
62         return 0;
63 }
64
65 int setting_view_cb_at_endKey(void *cb)
66 {
67         SETTING_TRACE_BEGIN;
68         int idx = 0;
69         SettingViewNode *viewnode = NULL;
70         for (; idx < g_view_node_table_cur_size; idx++) {
71                 if (g_cur_view == g_view_node_table[idx].view) {
72                         viewnode = &(g_view_node_table[idx]);
73                         break;
74                 }
75         }
76         if (viewnode && viewnode->view && viewnode->topview) {
77                 setting_view_change(viewnode->view, viewnode->topview, cb);
78         }
79         return 0;
80 }
81
82 setting_view *setting_view_get_topview(setting_view *view)
83 {
84         SETTING_TRACE_BEGIN;
85         retv_if(NULL == view, NULL);
86         int idx = 0;
87         SettingViewNode *viewnode = NULL;
88         for (; idx < g_view_node_table_cur_size; idx++) {
89                 if (view == g_view_node_table[idx].view) {
90                         viewnode = &(g_view_node_table[idx]);
91                         break;
92                 }
93         }
94         if (viewnode && viewnode->topview) {
95                 return viewnode->topview;
96         }
97         else
98         {
99                 return NULL;
100         }
101 }
102
103 void setting_view_update_topview(setting_view *view, setting_view *topview)
104 {
105         SETTING_TRACE_BEGIN;
106         ret_if(NULL == view);
107         int idx = 0;
108         SettingViewNode *viewnode = NULL;
109         for (; idx < g_view_node_table_cur_size; idx++) {
110                 if (view == g_view_node_table[idx].view) {
111                         viewnode = &(g_view_node_table[idx]);
112                         break;
113                 }
114         }
115         if (viewnode) {
116                 viewnode->topview = topview;
117         }
118         else
119         {
120         }
121 }
122
123
124 int setting_view_create(setting_view *view, void *cb)
125 {
126         /* error check */
127         setting_retvm_if(!view || !cb , SETTING_GENERAL_ERR_NULL_DATA_PARAMETER, "Invalid arguement");
128
129         int ret = SETTING_RETURN_FAIL;
130
131         if (!view->is_create && view->create) {//error handle:create only when the view doesn't exit
132                 ret = view->create(cb);
133         }
134
135         return ret;
136 }
137
138 int setting_view_destroy(setting_view *view, void *cb)
139 {
140         /* error check */
141         setting_retvm_if(!view || !cb , SETTING_GENERAL_ERR_NULL_DATA_PARAMETER, "Invalid arguement");
142
143         int ret = SETTING_RETURN_FAIL;
144
145         if (view->is_create && view->destroy) {//error handle:destroy only when the view exits
146                 ret = view->destroy(cb);
147         }
148
149         return ret;
150 }
151
152 int setting_view_update(setting_view *view, void *cb)
153 {
154         /* error check */
155         setting_retvm_if(!view || !cb , SETTING_GENERAL_ERR_NULL_DATA_PARAMETER, "Invalid arguement");
156
157         int ret = SETTING_RETURN_FAIL;
158
159         if (view->is_create && view->update) {//error handle:update only when the view exits
160                 ret = view->update(cb);
161         }
162
163         return ret;
164 }
165
166 int setting_view_cleanup(setting_view *view, void *cb)
167 {
168         /* error check */
169         setting_retvm_if(!view || !cb , SETTING_GENERAL_ERR_NULL_DATA_PARAMETER, "Invalid arguement");
170
171         int ret = SETTING_RETURN_FAIL;
172
173         if (view->is_create && view->cleanup) {//error handle:cleanup only when the view exits
174                 ret = view->cleanup(cb);
175         }
176
177         return ret;
178 }
179
180 int
181 setting_view_change(setting_view *from_view, setting_view *to_view, void *cb)
182 {
183         /* error check */
184         setting_retvm_if(!from_view || !to_view || !cb ,
185                          SETTING_GENERAL_ERR_NULL_DATA_PARAMETER,
186                          "Invalid arguement");
187
188         int ret = SETTING_RETURN_SUCCESS;
189         if (from_view == setting_view_get_topview(to_view)) {
190                 //from a parent view to his child view, don't need cleanup parent view
191         } else {
192                 //from a child view to his parent view, need cleanup child view
193                 ret = setting_view_cleanup(from_view, cb);
194         }
195
196         if (ret == SETTING_RETURN_FAIL) {
197                 return SETTING_RETURN_FAIL;
198         }
199
200         if (to_view->is_create == 1) {
201                 ret = setting_view_update(to_view, cb);
202         } else {
203                 ret = setting_view_create(to_view, cb);
204         }
205         g_cur_view = to_view;   /* compute new value of g_cur_view. */
206         return ret;
207 }