2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://floralicense.org/license/
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.
24 const db_item_t __tree_node_convert(Tree_node_t *node);
26 HAPI bool tree_node_new(Tree_node_t **node)
28 *node = (Tree_node_t *)calloc(1, sizeof(Tree_node_t));
30 return (*node) != NULL;
36 HAPI bool tree_node_detatch(Tree_node_t *node)
42 node->prev->next = node->next;
43 db_update_apps(__tree_node_convert(node->prev), true);
45 node->parent->first = node->next;
46 db_update_apps(__tree_node_convert(node->parent), true);
50 node->next->prev = node->prev;
52 node->parent->last = node->prev;
56 node->parent->count--;
62 db_update_apps(__tree_node_convert(node), true);
67 HAPI bool tree_node_append(Tree_node_t *parent, Tree_node_t *node)
75 db_update_apps(__tree_node_convert(parent), true);
77 parent->last->next = node;
78 node->prev = parent->last;
79 db_update_apps(__tree_node_convert(parent->last), true);
83 node->parent = parent;
84 node->parent->count++;
87 db_update_apps(__tree_node_convert(node), true);
92 HAPI bool tree_node_append_relative(Tree_node_t *node, Tree_node_t *relative)
95 return tree_node_append(relative->parent, node);
97 node->parent = relative->parent;
98 node->parent->count++;
99 relative->next->prev = node;
100 node->next = relative->next;
101 relative->next = node;
102 node->prev = relative;
104 db_update_apps(__tree_node_convert(node), true);
105 db_update_apps(__tree_node_convert(relative), true);
110 HAPI bool tree_node_prepend(Tree_node_t *parent, Tree_node_t *node)
112 if (!node || !parent)
115 if (!parent->first) {
116 /*No elements in parent*/
120 parent->first->prev = node;
121 node->next = parent->first;
122 db_update_apps(__tree_node_convert(parent), true);
125 parent->first = node;
126 node->parent = parent;
127 node->parent->count++;
130 db_update_apps(__tree_node_convert(node), true);
135 HAPI bool tree_node_prepend_relative(Tree_node_t *node, Tree_node_t *relative)
138 return tree_node_prepend(relative->parent, node);
140 node->parent = relative->parent;
141 node->parent->count++;
142 relative->prev->next = node;
143 node->prev = relative->prev;
144 relative->prev = node;
145 node->next = relative;
147 db_update_apps(__tree_node_convert(node), true);
148 db_update_apps(__tree_node_convert(node->prev), true);
153 HAPI bool tree_in_depth_browse(Tree_node_t *node, tree_browse_cb_t func_cb, void *data)
159 if (!func_cb(NULL, node, data))
164 TREE_NODE_FOREACH(node, it) {
165 if (!tree_in_depth_browse(it, func_cb, data))
172 void tree_node_update(Tree_node_t *node)
175 LOGE("node == NULL");
179 db_update_apps(__tree_node_convert(node), true);
182 HAPI void tree_node_free(Tree_node_t *node, Tree_node_t **first_child, Tree_node_t **last_child, int *child_count)
184 Tree_node_t *it = NULL;
189 db_update_apps(__tree_node_convert(node), false);
192 *first_child = node->first;
195 *last_child = node->last;
198 *child_count = node->count;
201 node->parent->count--;
203 if (node->parent->first == node)
204 node->parent->first = node->next;
206 if (node->parent->last == node)
207 node->parent->last = node->prev;
211 node->prev->next = node->next;
214 node->next->prev = node->prev;
216 for (it = node->first; it; it = it->next)
219 app_item_free(node->data);
223 HAPI const db_item_t __tree_node_convert(Tree_node_t *node)
226 id : node->data->unique_id,
227 type : node->data->type,
228 appid : node->data->appid ? (char *)node->data->appid : (char *)"",
229 first_id : node->first ? node->first->data->unique_id : -1,
230 next_id : node->next ? node->next->data->unique_id : -1,
233 w : node->data->col_span,
234 h : node->data->row_span,
235 content_info : node->data->content_info,