From 1212f1d32149c12591384b9844b08c83e6b2ee36 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Thu, 22 Aug 2013 16:05:03 +0100 Subject: Expose leaving node callback in public treeview walker interface. --- desktop/cookie_manager.c | 8 ++++---- desktop/treeview.c | 31 +++++++++++++++++++++++-------- desktop/treeview.h | 14 +++++++++----- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/desktop/cookie_manager.c b/desktop/cookie_manager.c index 7c2b4a4de..f369eb068 100644 --- a/desktop/cookie_manager.c +++ b/desktop/cookie_manager.c @@ -137,8 +137,8 @@ static nserror cookie_manager_find_entry(treeview_node *root, .entry = NULL }; - err = treeview_walk(cm_ctx.tree, root, cookie_manager_walk_cb, &tw, - TREE_NODE_ENTRY); + err = treeview_walk(cm_ctx.tree, root, cookie_manager_walk_cb, NULL, + &tw, TREE_NODE_ENTRY); if (err != NSERROR_OK) return err; @@ -167,8 +167,8 @@ static nserror cookie_manager_find_folder(treeview_node *root, .entry = NULL }; - err = treeview_walk(cm_ctx.tree, root, cookie_manager_walk_cb, &tw, - TREE_NODE_FOLDER); + err = treeview_walk(cm_ctx.tree, root, cookie_manager_walk_cb, NULL, + &tw, TREE_NODE_FOLDER); if (err != NSERROR_OK) return err; diff --git a/desktop/treeview.c b/desktop/treeview.c index a63adef47..bf2d0ef37 100644 --- a/desktop/treeview.c +++ b/desktop/treeview.c @@ -713,29 +713,42 @@ static int treeview_node_y(treeview *tree, treeview_node *node) struct treeview_walk_ctx { - treeview_walk_callback walk_cb; + treeview_walk_cb enter_cb; + treeview_walk_cb leave_cb; void *ctx; enum treeview_node_type type; }; -/** Treewalk node callback. */ -static nserror treeview_walk_cb(treeview_node *n, void *ctx, +/** Treewalk node enter callback. */ +static nserror treeview_walk_fwd_cb(treeview_node *n, void *ctx, bool *skip_children, bool *end) { struct treeview_walk_ctx *tw = ctx; if (n->type & tw->type) { - return tw->walk_cb(tw->ctx, n->client_data, tw->type, end); + return tw->enter_cb(tw->ctx, n->client_data, n->type, end); + } + + return NSERROR_OK; +} +/** Treewalk node leave callback. */ +static nserror treeview_walk_bwd_cb(treeview_node *n, void *ctx, bool *end) +{ + struct treeview_walk_ctx *tw = ctx; + + if (n->type & tw->type) { + return tw->leave_cb(tw->ctx, n->client_data, n->type, end); } return NSERROR_OK; } /* Exported interface, documented in treeview.h */ nserror treeview_walk(treeview *tree, treeview_node *root, - treeview_walk_callback walk_cb, void *ctx, - enum treeview_node_type type) + treeview_walk_cb enter_cb, treeview_walk_cb leave_cb, + void *ctx, enum treeview_node_type type) { struct treeview_walk_ctx tw = { - .walk_cb = walk_cb, + .enter_cb = enter_cb, + .leave_cb = leave_cb, .ctx = ctx, .type = type }; @@ -746,7 +759,9 @@ nserror treeview_walk(treeview *tree, treeview_node *root, if (root == NULL) root = tree->root; - return treeview_walk_internal(root, true, NULL, treeview_walk_cb, &tw); + return treeview_walk_internal(root, true, + (leave_cb != NULL) ? treeview_walk_bwd_cb : NULL, + (enter_cb != NULL) ? treeview_walk_fwd_cb : NULL, &tw); } diff --git a/desktop/treeview.h b/desktop/treeview.h index f7432aef5..42dd4ca6b 100644 --- a/desktop/treeview.h +++ b/desktop/treeview.h @@ -240,7 +240,7 @@ nserror treeview_update_node_entry(treeview *tree, * \param abort Set to true to abort treeview walk prematurely * \return NSERROR_OK on success, or appropriate error otherwise */ -typedef nserror (*treeview_walk_callback)(void *ctx, void *node_data, +typedef nserror (*treeview_walk_cb)(void *ctx, void *node_data, enum treeview_node_type type, bool *abort); /** @@ -249,17 +249,21 @@ typedef nserror (*treeview_walk_callback)(void *ctx, void *node_data, * * \param tree Treeview object to walk * \param root Root node to walk tree from (or NULL for tree root) - * \param walk_cb Function to call on each node + * \param enter_cb Function to call on entering nodes, or NULL + * \param leave_cb Function to call on leaving nodes, or NULL * \param ctx Client context, passed back to callback function * \param type The node type(s) of interest * \return NSERROR_OK on success, or appropriate error otherwise * - * Note, if deleting returned node, walk_cb must terminate the treeview walk by + * Example usage: To export a treeview as XML, XML elements can be opened in + * enter_cb, and closed in leave_cb. + * + * Note, if deleting returned node in enter_cb, the walk must be terminated by * setting abort to true. */ nserror treeview_walk(treeview *tree, treeview_node *root, - treeview_walk_callback walk_cb, void *ctx, - enum treeview_node_type type); + treeview_walk_cb enter_cb, treeview_walk_cb leave_cb, + void *ctx, enum treeview_node_type type); /** * Delete a treeview node -- cgit v1.2.3