static gboolean delete_parent(GtkTreeModel *model, GtkTreePath* path, GtkTreeIter* iter, gpointer user_data) { DmaVariableData *data; DebugTree* tree = (DebugTree *)user_data; g_return_val_if_fail (model,TRUE); g_return_val_if_fail (iter,TRUE); gtk_tree_model_get(model, iter, DTREE_ENTRY_COLUMN, &data, -1); /* Dummy node (data == NULL) are used as a place holder in watch box */ if (data != NULL) { if (tree->debugger) { if (data->name) { /* Object has been created in debugger and is not a child * (destroyed with their parent) */ dma_queue_delete_variable (tree->debugger, data->name); } } dma_variable_data_free(data); my_gtk_tree_model_foreach_child (model, iter, delete_child, tree); } return FALSE; }
static gboolean delete_child(GtkTreeModel *model, GtkTreePath* path, GtkTreeIter* iter, gpointer user_data) { DmaVariableData *data; DebugTree* tree = (DebugTree *)user_data; g_return_val_if_fail (model,TRUE); g_return_val_if_fail (iter,TRUE); gtk_tree_model_get(model, iter, DTREE_ENTRY_COLUMN, &data, -1); /* Dummy node (data == NULL) are used when child are not known */ if (data != NULL) { dma_variable_data_free(data); my_gtk_tree_model_foreach_child (model, iter, delete_child, tree); } return FALSE; }
static void debug_tree_add_children (GtkTreeModel *model, DmaDebuggerQueue *debugger, GtkTreeIter* parent, guint from, const GList *children) { GList *child; GtkTreeIter iter; gboolean valid; valid = gtk_tree_model_iter_nth_child (model, &iter, parent, from); /* Add new children */ for (child = g_list_first ((GList *)children); child != NULL; child = g_list_next (child)) { IAnjutaDebuggerVariableObject *var = (IAnjutaDebuggerVariableObject *)child->data; DmaVariableData *data; if (!valid) { /* Add new tree node */ gtk_tree_store_append(GTK_TREE_STORE(model), &iter, parent); gtk_tree_store_set(GTK_TREE_STORE(model), &iter, TYPE_COLUMN, var->type == NULL ? UNKNOWN_TYPE : var->type, VALUE_COLUMN, var->value == NULL ? UNKNOWN_VALUE : var->value, VARIABLE_COLUMN, var->expression, ROOT_COLUMN, FALSE, DTREE_ENTRY_COLUMN, NULL,-1); data = NULL; } else { /* Update tree node */ if (var->type != NULL) gtk_tree_store_set(GTK_TREE_STORE(model), &iter, TYPE_COLUMN, var->type, -1); if (var->value != NULL) gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VALUE_COLUMN, var->value, -1); if (var->expression != NULL) gtk_tree_store_set(GTK_TREE_STORE(model), &iter, VARIABLE_COLUMN, var->expression, -1); gtk_tree_model_get(model, &iter, DTREE_ENTRY_COLUMN, &data, -1); if (var->name == NULL) { /* Dummy node representing additional children */ if (data != NULL) { dma_variable_data_free (data); gtk_tree_store_set(GTK_TREE_STORE (model), &iter, DTREE_ENTRY_COLUMN, NULL, -1); data = NULL; } } } if ((var->name != NULL) && (data == NULL)) { /* Create new data */ data = dma_variable_data_new(var->name, TRUE); gtk_tree_store_set(GTK_TREE_STORE(model), &iter, DTREE_ENTRY_COLUMN, data, -1); } /* Clear all children if they exist */ debug_tree_remove_children (model, debugger, &iter, NULL); if ((var->children != 0) || var->has_more || (var->name == NULL)) { /* Add dummy children */ debug_tree_model_add_dummy_children (model, &iter); } valid = gtk_tree_model_iter_next (model, &iter); } /* Clear remaining old children */ if (valid) debug_tree_remove_children (model, debugger, parent, &iter); }