diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2013-07-03 11:50:23 +0100 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2013-07-03 11:50:23 +0100 |
commit | 26befde81c6d0c40ce5ebf9244b0f963587b7646 (patch) | |
tree | 6c11e0a17b38c9ee8f245ed87931a1cfb803db6c /desktop/treeview.c | |
parent | c010535fbe85841f096c90128ea29016e770fc56 (diff) | |
download | netsurf-26befde81c6d0c40ce5ebf9244b0f963587b7646.tar.gz netsurf-26befde81c6d0c40ce5ebf9244b0f963587b7646.tar.bz2 |
Make READ_ONLY flag a combinator for NO_MOVES and NO_DELETES. Implement NO_DELETES.
Diffstat (limited to 'desktop/treeview.c')
-rw-r--r-- | desktop/treeview.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/desktop/treeview.c b/desktop/treeview.c index 5d8a72f31..062ef9bc7 100644 --- a/desktop/treeview.c +++ b/desktop/treeview.c @@ -469,16 +469,30 @@ nserror treeview_create_node_entry(struct treeview *tree, } -/* Exported interface, documented in treeview.h */ -nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n) +/** + * Delete a treeview node + * + * \param tree Treeview object to delete node from + * \param n Node to delete + * \param interaction Delete is result of user interaction with treeview + * \return NSERROR_OK on success, appropriate error otherwise + * + * Will emit folder or entry deletion msg callback. + */ +static nserror treeview_delete_node_internal(struct treeview *tree, + struct treeview_node *n, bool interaction) { struct treeview_node_msg msg; msg.msg = TREE_MSG_NODE_DELETE; struct treeview_node *p; + if (interaction && (tree->flags & TREEVIEW_NO_DELETES)) { + return NSERROR_OK; + } + /* Destroy children first */ while (n->children != NULL) { - treeview_delete_node(tree, n->children); + treeview_delete_node_internal(tree, n->children, interaction); } /* Unlink node from tree */ @@ -528,6 +542,13 @@ nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n) /* Exported interface, documented in treeview.h */ +nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n) +{ + return treeview_delete_node_internal(tree, n, false); +} + + +/* Exported interface, documented in treeview.h */ nserror treeview_create(struct treeview **tree, const struct treeview_callback_table *callbacks, int n_fields, struct treeview_field_desc fields[], @@ -614,7 +635,7 @@ nserror treeview_destroy(struct treeview *tree) assert(tree != NULL); /* Destroy nodes */ - treeview_delete_node(tree, tree->root); + treeview_delete_node_internal(tree, tree->root, false); /* Destroy feilds */ for (f = 0; f <= tree->n_fields; f++) { @@ -1086,7 +1107,7 @@ static bool treeview_node_selection_walk_cb(struct treeview_node *node, case TREEVIEW_WALK_DELETE_SELECTION: if (node->flags & TREE_NODE_SELECTED) { - treeview_delete_node(sw->tree, node); + treeview_delete_node_internal(sw->tree, node, true); changed = true; } break; |