From e72b89ac3d691acb5c306c1565eaa1e559495ec8 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Tue, 28 Feb 2017 23:41:48 +0000 Subject: Improve treeview documentation comments --- desktop/treeview.c | 1274 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 794 insertions(+), 480 deletions(-) (limited to 'desktop/treeview.c') diff --git a/desktop/treeview.c b/desktop/treeview.c index 9d4a1d67b..c0d685e97 100644 --- a/desktop/treeview.c +++ b/desktop/treeview.c @@ -42,9 +42,17 @@ #include "desktop/treeview.h" #include "desktop/gui_internal.h" -/** @todo get rid of REDRAW_MAX -- need to be able to know window size */ +/** + * The maximum horizontal size a treeview can possibly be. + * + * \todo get rid of REDRAW_MAX -- need to be able to know window size + */ #define REDRAW_MAX 8000 + +/** + * Treeview handling global context + */ struct treeview_globals { unsigned initialised; int line_height; @@ -56,32 +64,53 @@ struct treeview_globals { int move_offset; } tree_g; + +/** + * Section type of a treeview at a point + */ enum treeview_node_part { - TV_NODE_PART_TOGGLE, /**< Expansion toggle */ - TV_NODE_PART_ON_NODE, /**< Node content (text, icon) */ - TV_NODE_PART_NONE /**< Empty area */ -}; /**< Section type of a treeview at a point */ + TV_NODE_PART_TOGGLE, /**< Expansion toggle */ + TV_NODE_PART_ON_NODE, /**< Node content (text, icon) */ + TV_NODE_PART_NONE /**< Empty area */ +}; + +/** + * Text within a treeview field or node + */ struct treeview_text { const char *data; /**< Text string */ uint32_t len; /**< Length of string in bytes */ int width; /**< Width of text in px */ }; + +/** + * a treeview field + */ struct treeview_field { + /** flags controlling how field is interpreted */ enum treeview_field_flags flags; - lwc_string *field; - struct treeview_text value; + lwc_string *field; /**< field contents */ + struct treeview_text value; /**< field text */ }; + +/** + * flags indicating render state of node. + */ enum treeview_node_flags { - TV_NFLAGS_NONE = 0, /**< No node flags set */ - TV_NFLAGS_EXPANDED = (1 << 0), /**< Whether node is expanded */ - TV_NFLAGS_SELECTED = (1 << 1), /**< Whether node is selected */ - TV_NFLAGS_SPECIAL = (1 << 2) /**< Render as special node */ + TV_NFLAGS_NONE = 0, /**< No node flags set */ + TV_NFLAGS_EXPANDED = (1 << 0), /**< Whether node is expanded */ + TV_NFLAGS_SELECTED = (1 << 1), /**< Whether node is selected */ + TV_NFLAGS_SPECIAL = (1 << 2) /**< Render as special node */ }; + +/** + * Treeview target position + */ enum treeview_target_pos { TV_TARGET_ABOVE, TV_TARGET_INSIDE, @@ -89,6 +118,10 @@ enum treeview_target_pos { TV_TARGET_NONE }; + +/** + * Treeview node + */ struct treeview_node { enum treeview_node_flags flags; /**< Node flags */ enum treeview_node_type type; /**< Node type */ @@ -96,28 +129,43 @@ struct treeview_node { int height; /**< Includes height of any descendants (pixels) */ int inset; /**< Node's inset depending on tree depth (pixels) */ - treeview_node *parent; - treeview_node *prev_sib; - treeview_node *next_sib; - treeview_node *children; + treeview_node *parent; /**< parent node */ + treeview_node *prev_sib; /**< previous sibling node */ + treeview_node *next_sib; /**< next sibling node */ + treeview_node *children; /**< first child node */ void *client_data; /**< Passed to client on node event msg callback */ struct treeview_text text; /** Text to show for node (default field) */ -}; /**< Treeview node */ +}; + +/** + * Node entry + * + * node entry contains a base node at the beginning allowing for + * trivial containerof by cast and some number of fields. + */ struct treeview_node_entry { - treeview_node base; + treeview_node base; /**< Entry class inherits node base class */ struct treeview_field fields[FLEX_ARRAY_LEN_DECL]; -}; /**< Entry class inherits node base class */ +}; + +/** + * A mouse position wrt treeview + */ struct treeview_pos { int x; /**< Mouse X coordinate */ int y; /**< Mouse Y coordinate */ int node_y; /**< Top of node at y */ int node_h; /**< Height of node at y */ -}; /**< A mouse position wrt treeview */ +}; + +/** + * Treeview drag state + */ struct treeview_drag { enum { TV_DRAG_NONE, @@ -130,15 +178,23 @@ struct treeview_drag { enum treeview_node_part part; /**< Node part at start */ struct treeview_pos start; /**< Start pos */ struct treeview_pos prev; /**< Previous pos */ -}; /**< Drag state */ +}; + +/** + * Treeview node move details + */ struct treeview_move { treeview_node *root; /**< Head of yanked node list */ treeview_node *target; /**< Move target */ struct rect target_area; /**< Pos/size of target indicator */ enum treeview_target_pos target_pos; /**< Pos wrt render node */ -}; /**< Move details */ +}; + +/** + * Treeview node edit details + */ struct treeview_edit { treeview_node *node; /**< Node being edited, or NULL */ struct textarea *textarea; /**< Textarea for edit, or NULL */ @@ -147,22 +203,26 @@ struct treeview_edit { int y; /**< Textarea y position */ int w; /**< Textarea width */ int h; /**< Textarea height */ -}; /**< Edit details */ +}; + +/** + * The treeview context + */ struct treeview { - uint32_t view_width; /**< Viewport size */ + uint32_t view_width; /**< Viewport horizontal size */ - treeview_flags flags; /**< Treeview behaviour settings */ + treeview_flags flags; /**< Treeview behaviour settings */ - treeview_node *root; /**< Root node */ + treeview_node *root; /**< Root node */ struct treeview_field *fields; /**< Array of fields */ int n_fields; /**< fields[n_fields] is folder, lower are entry fields */ int field_width; /**< Max width of shown field names */ - struct treeview_drag drag; /**< Drag state */ - struct treeview_move move; /**< Move drag details */ - struct treeview_edit edit; /**< Edit details */ + struct treeview_drag drag; /**< Drag state */ + struct treeview_move move; /**< Move drag details */ + struct treeview_edit edit; /**< Edit details */ const struct treeview_callback_table *callbacks; /**< For node events */ @@ -171,38 +231,62 @@ struct treeview { }; +/** + * Treeview furniture states. + */ enum treeview_furniture_id { TREE_FURN_EXPAND = 0, TREE_FURN_CONTRACT, TREE_FURN_LAST }; -struct treeview_furniture { - int size; - struct bitmap *bmp; - struct bitmap *sel; -}; + +/** + * style for a node + */ struct treeview_node_style { - plot_style_t bg; /**< Background */ - plot_font_style_t text; /**< Text */ - plot_font_style_t itext; /**< Entry field text */ + plot_style_t bg; /**< Background */ + plot_font_style_t text; /**< Text */ + plot_font_style_t itext; /**< Entry field text */ + + plot_style_t sbg; /**< Selected background */ + plot_font_style_t stext; /**< Selected text */ + plot_font_style_t sitext; /**< Selected entry field text */ + + struct { + int size; + struct bitmap *bmp; + struct bitmap *sel; + } furn[TREE_FURN_LAST]; +}; - plot_style_t sbg; /**< Selected background */ - plot_font_style_t stext; /**< Selected text */ - plot_font_style_t sitext; /**< Selected entry field text */ - struct treeview_furniture furn[TREE_FURN_LAST]; -}; +/** + * Plot style for odd rows + */ +struct treeview_node_style plot_style_odd; + + +/** + * Plot style for even rows + */ +struct treeview_node_style plot_style_even; -struct treeview_node_style plot_style_odd; /**< Plot style for odd rows */ -struct treeview_node_style plot_style_even; /**< Plot style for even rows */ +/** + * Treeview content resource data + */ struct treeview_resource { const char *url; struct hlcache_handle *c; int height; bool ready; -}; /**< Treeview content resource data */ +}; + + +/** + * treeview resource indexes + */ enum treeview_resource_id { TREE_RES_ARROW = 0, TREE_RES_CONTENT, @@ -211,13 +295,18 @@ enum treeview_resource_id { TREE_RES_SEARCH, TREE_RES_LAST }; + + +/** + * Treeview content resources + */ static struct treeview_resource treeview_res[TREE_RES_LAST] = { { "resource:icons/arrow-l.png", NULL, 0, false }, { "resource:icons/content.png", NULL, 0, false }, { "resource:icons/directory.png", NULL, 0, false }, { "resource:icons/directory2.png", NULL, 0, false }, { "resource:icons/search.png", NULL, 0, false } -}; /**< Treeview content resources */ +}; /** @@ -227,8 +316,8 @@ static struct treeview_resource treeview_res[TREE_RES_LAST] = { * \param[in] r rectangle to redraw */ static inline void treeview__cw_redraw_request( - const struct treeview *tree, - const struct rect *r) + const struct treeview *tree, + const struct rect *r) { if (tree->cw_t != NULL) { tree->cw_t->redraw_request(tree->cw_h, r); @@ -244,8 +333,8 @@ static inline void treeview__cw_redraw_request( * \param[in] height the height in px, or negative if don't care */ static inline void treeview__cw_update_size( - const struct treeview *tree, - int width, int height) + const struct treeview *tree, + int width, int height) { if (tree->cw_t != NULL) { tree->cw_t->update_size(tree->cw_h, width, height); @@ -261,8 +350,8 @@ static inline void treeview__cw_update_size( * \param[out] height to be set to viewport height in px */ static inline void treeview__cw_get_window_dimensions( - const struct treeview *tree, - int *width, int *height) + const struct treeview *tree, + int *width, int *height) { if (tree->cw_t != NULL) { tree->cw_t->get_window_dimensions(tree->cw_h, width, height); @@ -277,8 +366,8 @@ static inline void treeview__cw_get_window_dimensions( * \param[in] ds the current drag status */ static inline void treeview__cw_drag_status( - const struct treeview *tree, - core_window_drag_status ds) + const struct treeview *tree, + core_window_drag_status ds) { if (tree->cw_t != NULL) { tree->cw_t->drag_status(tree->cw_h, ds); @@ -286,15 +375,16 @@ static inline void treeview__cw_drag_status( } -/* Helper function to access the given field of a node +/** + * Helper function to access the given field of a node * - * \param tree Treeview that node belongs to - * \param n Node to get field from - * \param i Index of field of interest + * \param tree Treeview that node belongs to + * \param n Node to get field from + * \param i Index of field of interest * \return text entry for field or NULL. */ -static inline struct treeview_text * treeview_get_text_for_field( - treeview *tree, treeview_node *n, int i) +static inline struct treeview_text * +treeview_get_text_for_field(treeview *tree, treeview_node *n, int i) { if (i == 0) { return &n->text; @@ -309,19 +399,19 @@ static inline struct treeview_text * treeview_get_text_for_field( } -/* Find the next node in depth first tree order +/** + * Find the next node in depth first tree order * - * \param node Start node - * \param full Iff true, visit children of collapsed nodes - * \param next Updated to next node, or NULL if 'node' is last node - * \return NSERROR_OK on success, or appropriate error otherwise + * \param node Start node + * \param full Iff true, visit children of collapsed nodes + * \return next node, or NULL if \a node is last node */ static inline treeview_node * treeview_node_next(treeview_node *node, bool full) { assert(node != NULL); if ((full || (node->flags & TV_NFLAGS_EXPANDED)) && - node->children != NULL) { + node->children != NULL) { /* Next node is child */ node = node->children; } else { @@ -345,10 +435,11 @@ static inline treeview_node * treeview_node_next(treeview_node *node, bool full) } -/* Find node at given y-position +/** + * Find node at given y-position * - * \param tree Treeview object to delete node from - * \param target_y Target y-position + * \param tree Treeview object to delete node from + * \param target_y Target y-position * \return node at y_target */ static treeview_node * treeview_y_node(treeview *tree, int target_y) @@ -364,7 +455,7 @@ static treeview_node * treeview_y_node(treeview *tree, int target_y) while (n != NULL) { h = (n->type == TREE_NODE_ENTRY) ? - n->height : tree_g.line_height; + n->height : tree_g.line_height; if (target_y >= y && target_y < y + h) return n; y += h; @@ -376,10 +467,11 @@ static treeview_node * treeview_y_node(treeview *tree, int target_y) } -/* Find y position of the top of a node +/** + * Find y position of the top of a node * - * \param tree Treeview object to delete node from - * \param node Node to get position of + * \param tree Treeview object to delete node from + * \param node Node to get position of * \return node's y position */ static int treeview_node_y(treeview *tree, treeview_node *node) @@ -394,7 +486,7 @@ static int treeview_node_y(treeview *tree, treeview_node *node) while (n != NULL && n != node) { y += (n->type == TREE_NODE_ENTRY) ? - n->height : tree_g.line_height; + n->height : tree_g.line_height; n = treeview_node_next(n, false); } @@ -403,7 +495,8 @@ static int treeview_node_y(treeview *tree, treeview_node *node) } -/* Walk a treeview subtree, calling a callback at each node (depth first) +/** + * Walk a treeview subtree, calling a callback at each node (depth first) * * \param root Root to walk tree from (doesn't get a callback call) * \param full Iff true, visit children of collapsed nodes @@ -412,13 +505,14 @@ static int treeview_node_y(treeview *tree, treeview_node *node) * \param ctx Context to pass to callback * \return NSERROR_OK on success, or appropriate error otherwise * - * Note: Any node deletion must happen in callback_bwd. + * \note Any node deletion must happen in callback_bwd. */ -static nserror treeview_walk_internal(treeview_node *root, bool full, - nserror (*callback_bwd)(treeview_node *n, void *ctx, bool *end), - nserror (*callback_fwd)(treeview_node *n, void *ctx, - bool *skip_children, bool *end), - void *ctx) +static nserror +treeview_walk_internal(treeview_node *root, + bool full, + nserror (*callback_bwd)(treeview_node *n, void *ctx, bool *end), + nserror (*callback_fwd)(treeview_node *n, void *ctx, bool *skip_children, bool *end), + void *ctx) { treeview_node *node, *child, *parent, *next_sibling; bool abort = false; @@ -431,8 +525,8 @@ static nserror treeview_walk_internal(treeview_node *root, bool full, parent = node->parent; next_sibling = node->next_sib; child = (!skip_children && - (full || (node->flags & TV_NFLAGS_EXPANDED))) ? - node->children : NULL; + (full || (node->flags & TV_NFLAGS_EXPANDED))) ? + node->children : NULL; while (node != NULL) { @@ -445,7 +539,7 @@ static nserror treeview_walk_internal(treeview_node *root, bool full, * with a next sibling. */ while (node != root && - next_sibling == NULL) { + next_sibling == NULL) { if (callback_bwd != NULL) { /* Backwards callback */ err = callback_bwd(node, ctx, &abort); @@ -489,7 +583,7 @@ static nserror treeview_walk_internal(treeview_node *root, bool full, parent = node->parent; next_sibling = node->next_sib; child = (full || (node->flags & TV_NFLAGS_EXPANDED)) ? - node->children : NULL; + node->children : NULL; if (callback_fwd != NULL) { /* Forwards callback */ @@ -512,7 +606,7 @@ static nserror treeview_walk_internal(treeview_node *root, bool full, /** * Create treeview's root node * - * \param root Returns root node + * \param[out] root Returns root node * \return NSERROR_OK on success, appropriate error otherwise */ static nserror treeview_create_node_root(treeview_node **root) @@ -548,10 +642,20 @@ static nserror treeview_create_node_root(treeview_node **root) /** - * Set a node's inset from its parent (can be used as treeview walk callback) + * Set a node's inset from its parent + * + * This may be used as treeview walk callback + * + * \param[in] n node to set inset on + * \param[in] ctx context unused + * \param[out] skip_children set to false so child nodes are not skipped. + * \param[out] end unused flag so treewalk in not terminated early. */ -static nserror treeview_set_inset_from_parent(treeview_node *n, void *ctx, - bool *skip_children, bool *end) +static nserror +treeview_set_inset_from_parent(treeview_node *n, + void *ctx, + bool *skip_children, + bool *end) { if (n->parent != NULL) n->inset = n->parent->inset + tree_g.step_width; @@ -559,16 +663,19 @@ static nserror treeview_set_inset_from_parent(treeview_node *n, void *ctx, *skip_children = false; return NSERROR_OK; } + + /** * Insert a treeview node into a treeview * - * \param a parentless node to insert - * \param b tree node to insert a as a relation of - * \param rel a's relationship to b + * \param a parentless node to insert + * \param b tree node to insert a as a relation of + * \param rel The relationship between \a a and \a b */ -static inline void treeview_insert_node(treeview_node *a, - treeview_node *b, - enum treeview_relationship rel) +static inline void +treeview_insert_node(treeview_node *a, + treeview_node *b, + enum treeview_relationship rel) { assert(a != NULL); assert(a->parent == NULL); @@ -604,7 +711,7 @@ static inline void treeview_insert_node(treeview_node *a, a->inset = a->parent->inset + tree_g.step_width; if (a->children != NULL) { treeview_walk_internal(a, true, NULL, - treeview_set_inset_from_parent, NULL); + treeview_set_inset_from_parent, NULL); } if (a->parent->flags & TV_NFLAGS_EXPANDED) { @@ -627,12 +734,14 @@ static inline void treeview_insert_node(treeview_node *a, /* Exported interface, documented in treeview.h */ -nserror treeview_create_node_folder(treeview *tree, - treeview_node **folder, - treeview_node *relation, - enum treeview_relationship rel, - const struct treeview_field_data *field, - void *data, treeview_node_options_flags flags) +nserror +treeview_create_node_folder(treeview *tree, + treeview_node **folder, + treeview_node *relation, + enum treeview_relationship rel, + const struct treeview_field_data *field, + void *data, + treeview_node_options_flags flags) { treeview_node *n; @@ -651,7 +760,7 @@ nserror treeview_create_node_folder(treeview *tree, } n->flags = (flags & TREE_OPTION_SPECIAL_DIR) ? - TV_NFLAGS_SPECIAL : TV_NFLAGS_NONE; + TV_NFLAGS_SPECIAL : TV_NFLAGS_NONE; n->type = TREE_NODE_FOLDER; n->height = tree_g.line_height; @@ -673,7 +782,7 @@ nserror treeview_create_node_folder(treeview *tree, /* Inform front end of change in dimensions */ if (!(flags & TREE_OPTION_SUPPRESS_RESIZE)) treeview__cw_update_size(tree, -1, - tree->root->height); + tree->root->height); /* Redraw */ if (!(flags & TREE_OPTION_SUPPRESS_REDRAW)) { @@ -693,10 +802,11 @@ nserror treeview_create_node_folder(treeview *tree, /* Exported interface, documented in treeview.h */ -nserror treeview_update_node_folder(treeview *tree, - treeview_node *folder, - const struct treeview_field_data *field, - void *data) +nserror +treeview_update_node_folder(treeview *tree, + treeview_node *folder, + const struct treeview_field_data *field, + void *data) { bool match; @@ -708,8 +818,8 @@ nserror treeview_update_node_folder(treeview *tree, assert(field != NULL); assert(lwc_string_isequal(tree->fields[tree->n_fields].field, - field->field, &match) == lwc_error_ok && - match == true); + field->field, &match) == lwc_error_ok && + match == true); folder->text.data = field->value; folder->text.len = field->value_len; folder->text.width = 0; @@ -717,9 +827,9 @@ nserror treeview_update_node_folder(treeview *tree, if (folder->parent->flags & TV_NFLAGS_EXPANDED) { /* Text will be seen, get its width */ guit->layout->width(&plot_style_odd.text, - folder->text.data, - folder->text.len, - &(folder->text.width)); + folder->text.data, + folder->text.len, + &(folder->text.width)); } else { /* Just invalidate the width, since it's not needed now */ folder->text.width = 0; @@ -740,10 +850,11 @@ nserror treeview_update_node_folder(treeview *tree, /* Exported interface, documented in treeview.h */ -nserror treeview_update_node_entry(treeview *tree, - treeview_node *entry, - const struct treeview_field_data fields[], - void *data) +nserror +treeview_update_node_entry(treeview *tree, + treeview_node *entry, + const struct treeview_field_data fields[], + void *data) { bool match; struct treeview_node_entry *e = (struct treeview_node_entry *)entry; @@ -758,8 +869,8 @@ nserror treeview_update_node_entry(treeview *tree, assert(fields != NULL); assert(fields[0].field != NULL); assert(lwc_string_isequal(tree->fields[0].field, - fields[0].field, &match) == lwc_error_ok && - match == true); + fields[0].field, &match) == lwc_error_ok && + match == true); entry->text.data = fields[0].value; entry->text.len = fields[0].value_len; entry->text.width = 0; @@ -767,9 +878,9 @@ nserror treeview_update_node_entry(treeview *tree, if (entry->parent->flags & TV_NFLAGS_EXPANDED) { /* Text will be seen, get its width */ guit->layout->width(&plot_style_odd.text, - entry->text.data, - entry->text.len, - &(entry->text.width)); + entry->text.data, + entry->text.len, + &(entry->text.width)); } else { /* Just invalidate the width, since it's not needed now */ entry->text.width = 0; @@ -778,8 +889,8 @@ nserror treeview_update_node_entry(treeview *tree, for (i = 1; i < tree->n_fields; i++) { assert(fields[i].field != NULL); assert(lwc_string_isequal(tree->fields[i].field, - fields[i].field, &match) == lwc_error_ok && - match == true); + fields[i].field, &match) == lwc_error_ok && + match == true); e->fields[i - 1].value.data = fields[i].value; e->fields[i - 1].value.len = fields[i].value_len; @@ -787,9 +898,9 @@ nserror treeview_update_node_entry(treeview *tree, if (entry->flags & TV_NFLAGS_EXPANDED) { /* Text will be seen, get its width */ guit->layout->width(&plot_style_odd.text, - e->fields[i - 1].value.data, - e->fields[i - 1].value.len, - &(e->fields[i - 1].value.width)); + e->fields[i - 1].value.data, + e->fields[i - 1].value.len, + &(e->fields[i - 1].value.width)); } else { /* Invalidate the width, since it's not needed yet */ e->fields[i - 1].value.width = 0; @@ -811,12 +922,14 @@ nserror treeview_update_node_entry(treeview *tree, /* Exported interface, documented in treeview.h */ -nserror treeview_create_node_entry(treeview *tree, - treeview_node **entry, - treeview_node *relation, - enum treeview_relationship rel, - const struct treeview_field_data fields[], - void *data, treeview_node_options_flags flags) +nserror +treeview_create_node_entry(treeview *tree, + treeview_node **entry, + treeview_node *relation, + enum treeview_relationship rel, + const struct treeview_field_data fields[], + void *data, + treeview_node_options_flags flags) { bool match; struct treeview_node_entry *e; @@ -833,7 +946,7 @@ nserror treeview_create_node_entry(treeview *tree, } e = malloc(sizeof(struct treeview_node_entry) + - (tree->n_fields - 1) * sizeof(struct treeview_field)); + (tree->n_fields - 1) * sizeof(struct treeview_field)); if (e == NULL) { return NSERROR_NOMEM; } @@ -849,8 +962,8 @@ nserror treeview_create_node_entry(treeview *tree, assert(fields != NULL); assert(fields[0].field != NULL); assert(lwc_string_isequal(tree->fields[0].field, - fields[0].field, &match) == lwc_error_ok && - match == true); + fields[0].field, &match) == lwc_error_ok && + match == true); n->text.data = fields[0].value; n->text.len = fields[0].value_len; n->text.width = 0; @@ -865,8 +978,8 @@ nserror treeview_create_node_entry(treeview *tree, for (i = 1; i < tree->n_fields; i++) { assert(fields[i].field != NULL); assert(lwc_string_isequal(tree->fields[i].field, - fields[i].field, &match) == lwc_error_ok && - match == true); + fields[i].field, &match) == lwc_error_ok && + match == true); e->fields[i - 1].value.data = fields[i].value; e->fields[i - 1].value.len = fields[i].value_len; @@ -879,7 +992,7 @@ nserror treeview_create_node_entry(treeview *tree, /* Inform front end of change in dimensions */ if (!(flags & TREE_OPTION_SUPPRESS_RESIZE)) treeview__cw_update_size(tree, -1, - tree->root->height); + tree->root->height); /* Redraw */ if (!(flags & TREE_OPTION_SUPPRESS_REDRAW)) { @@ -898,15 +1011,30 @@ nserror treeview_create_node_entry(treeview *tree, } +/** + * Treewalk iterator context + */ struct treeview_walk_ctx { treeview_walk_cb enter_cb; treeview_walk_cb leave_cb; void *ctx; enum treeview_node_type type; }; -/** Treewalk node enter callback. */ -static nserror treeview_walk_fwd_cb(treeview_node *n, void *ctx, - bool *skip_children, bool *end) + + +/** + * Treewalk node enter callback. + * + * \param n current node + * \param ctx treewalk context + * \param skip_children set if child nodes should be skipped + * \param end set if iteration should end early + */ +static nserror +treeview_walk_fwd_cb(treeview_node *n, + void *ctx, + bool *skip_children, + bool *end) { struct treeview_walk_ctx *tw = ctx; @@ -916,7 +1044,15 @@ static nserror treeview_walk_fwd_cb(treeview_node *n, void *ctx, return NSERROR_OK; } -/** Treewalk node leave callback. */ + + +/** + * Treewalk node leave callback. + * + * \param n current node + * \param ctx treewalk context + * \param end set if iteration should end early + */ static nserror treeview_walk_bwd_cb(treeview_node *n, void *ctx, bool *end) { struct treeview_walk_ctx *tw = ctx; @@ -927,10 +1063,16 @@ static nserror treeview_walk_bwd_cb(treeview_node *n, void *ctx, bool *end) return NSERROR_OK; } + + /* Exported interface, documented in treeview.h */ -nserror treeview_walk(treeview *tree, treeview_node *root, - treeview_walk_cb enter_cb, treeview_walk_cb leave_cb, - void *ctx, enum treeview_node_type type) +nserror +treeview_walk(treeview *tree, + treeview_node *root, + treeview_walk_cb enter_cb, + treeview_walk_cb leave_cb, + void *ctx, + enum treeview_node_type type) { struct treeview_walk_ctx tw = { .enter_cb = enter_cb, @@ -945,16 +1087,18 @@ nserror treeview_walk(treeview *tree, treeview_node *root, if (root == NULL) root = tree->root; - return treeview_walk_internal(root, true, - (leave_cb != NULL) ? treeview_walk_bwd_cb : NULL, - (enter_cb != NULL) ? treeview_walk_fwd_cb : NULL, &tw); + return treeview_walk_internal(root, + true, + (leave_cb != NULL) ? treeview_walk_bwd_cb : NULL, + (enter_cb != NULL) ? treeview_walk_fwd_cb : NULL, + &tw); } /** * Unlink a treeview node * - * \param n Node to unlink + * \param n Node to unlink * \return true iff ancestor heights need to be reduced */ static inline bool treeview_unlink_node(treeview_node *n) @@ -975,7 +1119,8 @@ static inline bool treeview_unlink_node(treeview_node *n) } /* Reduce ancestor heights */ - if (n->parent != NULL && n->parent->flags & TV_NFLAGS_EXPANDED) { + if ((n->parent != NULL) && + (n->parent->flags & TV_NFLAGS_EXPANDED)) { return true; } @@ -986,8 +1131,8 @@ static inline bool treeview_unlink_node(treeview_node *n) /** * Cancel the editing of a treeview node * - * \param tree Treeview object to cancel node editing in - * \param redraw Set true iff redraw of removed textarea area required + * \param tree Treeview object to cancel node editing in + * \param redraw Set true iff redraw of removed textarea area required */ static void treeview_edit_cancel(treeview *tree, bool redraw) { @@ -1015,9 +1160,11 @@ static void treeview_edit_cancel(treeview *tree, bool redraw) /** - * Complete a treeview edit, by informing the client with a change request msg + * Complete a treeview edit * - * \param tree Treeview object to complete edit in + * Complete edit by informing the client with a change request msg + * + * \param tree Treeview object to complete edit in */ static void treeview_edit_done(treeview *tree) { @@ -1027,8 +1174,9 @@ static void treeview_edit_done(treeview *tree) struct treeview_node_msg msg; msg.msg = TREE_MSG_NODE_EDIT; - if (tree->edit.textarea == NULL) + if (tree->edit.textarea == NULL) { return; + } assert(n != NULL); @@ -1066,7 +1214,6 @@ static void treeview_edit_done(treeview *tree) break; } - /* Finished with the new text */ free(new_text); @@ -1075,17 +1222,25 @@ static void treeview_edit_done(treeview *tree) } +/** + * context for treeview node deletion iterator + */ struct treeview_node_delete { treeview *tree; int h_reduction; bool user_interaction; }; -/** Treewalk node callback deleting nodes. */ -static nserror treeview_delete_node_walk_cb(treeview_node *n, - void *ctx, bool *end) + + +/** + * Treewalk node callback deleting nodes. + */ +static nserror +treeview_delete_node_walk_cb(treeview_node *n, void *ctx, bool *end) { struct treeview_node_delete *nd = (struct treeview_node_delete *)ctx; struct treeview_node_msg msg; + msg.msg = TREE_MSG_NODE_DELETE; msg.data.delete.user = nd->user_interaction; @@ -1093,51 +1248,60 @@ static nserror treeview_delete_node_walk_cb(treeview_node *n, if (treeview_unlink_node(n)) nd->h_reduction += (n->type == TREE_NODE_ENTRY) ? - n->height : tree_g.line_height; + n->height : tree_g.line_height; /* Handle any special treatment */ switch (n->type) { case TREE_NODE_ENTRY: nd->tree->callbacks->entry(msg, n->client_data); break; + case TREE_NODE_FOLDER: nd->tree->callbacks->folder(msg, n->client_data); break; + case TREE_NODE_ROOT: break; + default: return NSERROR_BAD_PARAMETER; } /* Cancel any edit of this node */ if (nd->tree->edit.textarea != NULL && - nd->tree->edit.node == n) + nd->tree->edit.node == n) { treeview_edit_cancel(nd->tree, false); + } /* Free the node */ free(n); return NSERROR_OK; } + + /** * 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 - * \param flags Treeview node options flags - * \return NSERROR_OK on success, appropriate error otherwise - * * Will emit folder or entry deletion msg callback. * - * Note this can be called from inside a treeview_walk fwd callback. + * \note this can be called from inside a treeview_walk fwd callback. * For example walking the tree and calling this for any node that's selected. * * This function does not delete empty nodes, so if TREEVIEW_DEL_EMPTY_DIRS is * set, caller must also call treeview_delete_empty. + * + * \param tree Treeview object to delete node from + * \param n Node to delete + * \param interaction Delete is result of user interaction with treeview + * \param flags Treeview node options flags + * \return NSERROR_OK on success, appropriate error otherwise */ -static nserror treeview_delete_node_internal(treeview *tree, treeview_node *n, - bool interaction, treeview_node_options_flags flags) +static nserror +treeview_delete_node_internal(treeview *tree, + treeview_node *n, + bool interaction, + treeview_node_options_flags flags) { nserror err; treeview_node *p = n->parent; @@ -1153,7 +1317,7 @@ static nserror treeview_delete_node_internal(treeview *tree, treeview_node *n, /* Delete any children first */ err = treeview_walk_internal(n, true, treeview_delete_node_walk_cb, - NULL, &nd); + NULL, &nd); if (err != NSERROR_OK) { return err; } @@ -1175,10 +1339,10 @@ static nserror treeview_delete_node_internal(treeview *tree, treeview_node *n, /* Inform front end of change in dimensions */ if (tree->root != NULL && p != NULL && p->flags & TV_NFLAGS_EXPANDED && - nd.h_reduction > 0 && - !(flags & TREE_OPTION_SUPPRESS_RESIZE)) { + nd.h_reduction > 0 && + !(flags & TREE_OPTION_SUPPRESS_RESIZE)) { treeview__cw_update_size(tree, -1, - tree->root->height); + tree->root->height); } return NSERROR_OK; @@ -1188,8 +1352,8 @@ static nserror treeview_delete_node_internal(treeview *tree, treeview_node *n, /** * Delete any empty treeview folder nodes * - * \param tree Treeview object to delete empty nodes from - * \param interaction Delete is result of user interaction with treeview + * \param tree Treeview object to delete empty nodes from + * \param interaction Delete is result of user interaction with treeview * \return NSERROR_OK on success, appropriate error otherwise * * Note this must not be called within a treeview_walk. It may delete the @@ -1226,21 +1390,21 @@ static nserror treeview_delete_empty_nodes(treeview *tree, bool interaction) * with a next sibling. */ while (node->parent != NULL && - next_sibling == NULL) { + next_sibling == NULL) { if (node->type == TREE_NODE_FOLDER && - node->children == NULL) { + node->children == NULL) { /* Delete node */ p = node->parent; err = treeview_delete_node_walk_cb( - node, &nd, &abort); + node, &nd, &abort); if (err != NSERROR_OK) { return err; } /* Reduce ancestor heights */ while (p != NULL && - p->flags & - TV_NFLAGS_EXPANDED) { + p->flags & + TV_NFLAGS_EXPANDED) { p->height -= nd.h_reduction; p = p->parent; } @@ -1255,18 +1419,18 @@ static nserror treeview_delete_empty_nodes(treeview *tree, bool interaction) break; if (node->type == TREE_NODE_FOLDER && - node->children == NULL) { + node->children == NULL) { /* Delete node */ p = node->parent; err = treeview_delete_node_walk_cb( - node, &nd, &abort); + node, &nd, &abort); if (err != NSERROR_OK) { return err; } /* Reduce ancestor heights */ while (p != NULL && - p->flags & TV_NFLAGS_EXPANDED) { + p->flags & TV_NFLAGS_EXPANDED) { p->height -= nd.h_reduction; p = p->parent; } @@ -1281,7 +1445,7 @@ static nserror treeview_delete_empty_nodes(treeview *tree, bool interaction) parent = node->parent; next_sibling = node->next_sib; child = (node->flags & TV_NFLAGS_EXPANDED) ? - node->children : NULL; + node->children : NULL; } return NSERROR_OK; @@ -1289,8 +1453,10 @@ static nserror treeview_delete_empty_nodes(treeview *tree, bool interaction) /* Exported interface, documented in treeview.h */ -nserror treeview_delete_node(treeview *tree, treeview_node *n, - treeview_node_options_flags flags) +nserror +treeview_delete_node(treeview *tree, + treeview_node *n, + treeview_node_options_flags flags) { nserror err; struct rect r; @@ -1321,7 +1487,7 @@ nserror treeview_delete_node(treeview *tree, treeview_node *n, r.y0 = 0; if (!(flags & TREE_OPTION_SUPPRESS_RESIZE)) { treeview__cw_update_size(tree, -1, - tree->root->height); + tree->root->height); } } } @@ -1338,11 +1504,14 @@ nserror treeview_delete_node(treeview *tree, treeview_node *n, /* Exported interface, documented in treeview.h */ -nserror treeview_create(treeview **tree, +nserror +treeview_create(treeview **tree, const struct treeview_callback_table *callbacks, - int n_fields, struct treeview_field_desc fields[], + int n_fields, + struct treeview_field_desc fields[], const struct core_window_callback_table *cw_t, - struct core_window *cw, treeview_flags flags) + struct core_window *cw, + treeview_flags flags) { nserror error; int i; @@ -1383,7 +1552,7 @@ nserror treeview_create(treeview **tree, f->value.len = lwc_string_length(fields[i].field); guit->layout->width(&plot_style_odd.text, f->value.data, - f->value.len, &(f->value.width)); + f->value.len, &(f->value.width)); if (f->flags & TREE_FLAG_SHOW_NAME) if ((*tree)->field_width < f->value.width) @@ -1423,9 +1592,10 @@ nserror treeview_create(treeview **tree, /* Exported interface, documented in treeview.h */ -nserror treeview_cw_attach(treeview *tree, - const struct core_window_callback_table *cw_t, - struct core_window *cw) +nserror +treeview_cw_attach(treeview *tree, + const struct core_window_callback_table *cw_t, + struct core_window *cw) { assert(cw_t != NULL); assert(cw != NULL); @@ -1460,8 +1630,8 @@ nserror treeview_destroy(treeview *tree) /* Destroy nodes */ treeview_delete_node_internal(tree, tree->root, false, - TREE_OPTION_SUPPRESS_RESIZE | - TREE_OPTION_SUPPRESS_REDRAW); + TREE_OPTION_SUPPRESS_RESIZE | + TREE_OPTION_SUPPRESS_REDRAW); /* Destroy feilds */ for (f = 0; f <= tree->n_fields; f++) { @@ -1483,8 +1653,8 @@ nserror treeview_destroy(treeview *tree) * \param node The node to expand. * \return NSERROR_OK on success, appropriate error otherwise. */ -static nserror treeview_node_expand_internal(treeview *tree, - treeview_node *node) +static nserror +treeview_node_expand_internal(treeview *tree, treeview_node *node) { treeview_node *child; struct treeview_node_entry *e; @@ -1512,9 +1682,9 @@ static nserror treeview_node_expand_internal(treeview *tree, assert((child->flags & TV_NFLAGS_EXPANDED) == false); if (child->text.width == 0) { guit->layout->width(&plot_style_odd.text, - child->text.data, - child->text.len, - &(child->text.width)); + child->text.data, + child->text.len, + &(child->text.width)); } additional_height += child->height; @@ -1533,9 +1703,9 @@ static nserror treeview_node_expand_internal(treeview *tree, if (e->fields[i].value.width == 0) { guit->layout->width(&plot_style_odd.text, - e->fields[i].value.data, - e->fields[i].value.len, - &(e->fields[i].value.width)); + e->fields[i].value.data, + e->fields[i].value.len, + &(e->fields[i].value.width)); } /* Add height for field */ @@ -1563,8 +1733,9 @@ static nserror treeview_node_expand_internal(treeview *tree, node->height += additional_height; /* Inform front end of change in dimensions */ - if (additional_height != 0) + if (additional_height != 0) { treeview__cw_update_size(tree, -1, tree->root->height); + } return NSERROR_OK; } @@ -1573,29 +1744,40 @@ static nserror treeview_node_expand_internal(treeview *tree, /* Exported interface, documented in treeview.h */ nserror treeview_node_expand(treeview *tree, treeview_node *node) { - nserror err; + nserror res; struct rect r; - err = treeview_node_expand_internal(tree, node); - if (err != NSERROR_OK) - return err; - - r.x0 = 0; - r.y0 = treeview_node_y(tree, node); - r.x1 = REDRAW_MAX; - r.y1 = tree->root->height; + res = treeview_node_expand_internal(tree, node); + if (res == NSERROR_OK) { + /* expansion was successful, attempt redraw */ + r.x0 = 0; + r.y0 = treeview_node_y(tree, node); + r.x1 = REDRAW_MAX; + r.y1 = tree->root->height; - /* Redraw */ - treeview__cw_redraw_request(tree, &r); + treeview__cw_redraw_request(tree, &r); + } - return NSERROR_OK; + return res; } +/** + * context for treeview contraction callback + */ struct treeview_contract_data { bool only_entries; }; -/** Treewalk node callback for handling node contraction. */ + + +/** + * Treewalk node callback for handling node contraction. + * + * \param n node + * \param ctx contract iterator context + * \param end flag to end iteration now + * \return NSERROR_OK on success else appropriate error code + */ static nserror treeview_node_contract_cb(treeview_node *n, void *ctx, bool *end) { struct treeview_contract_data *data = ctx; @@ -1607,7 +1789,7 @@ static nserror treeview_node_contract_cb(treeview_node *n, void *ctx, bool *end) n->flags &= ~TV_NFLAGS_SELECTED; if ((n->flags & TV_NFLAGS_EXPANDED) == false || - (n->type == TREE_NODE_FOLDER && data->only_entries)) { + (n->type == TREE_NODE_FOLDER && data->only_entries)) { /* Nothing to do. */ return NSERROR_OK; } @@ -1624,15 +1806,17 @@ static nserror treeview_node_contract_cb(treeview_node *n, void *ctx, bool *end) return NSERROR_OK; } + + /** * Contract a treeview node * - * \param tree Treeview object to contract node in - * \param node Node to contract + * \param tree Treeview object to contract node in + * \param node Node to contract * \return NSERROR_OK on success, appropriate error otherwise */ -static nserror treeview_node_contract_internal(treeview *tree, - treeview_node *node) +static nserror +treeview_node_contract_internal(treeview *tree, treeview_node *node) { struct treeview_contract_data data; bool selected; @@ -1649,7 +1833,7 @@ static nserror treeview_node_contract_internal(treeview *tree, /* Contract children. */ treeview_walk_internal(node, false, treeview_node_contract_cb, - NULL, &data); + NULL, &data); /* Contract node */ treeview_node_contract_cb(node, &data, false); @@ -1667,24 +1851,23 @@ static nserror treeview_node_contract_internal(treeview *tree, /* Exported interface, documented in treeview.h */ nserror treeview_node_contract(treeview *tree, treeview_node *node) { - nserror err; + nserror res; struct rect r; assert(tree != NULL); - r.x0 = 0; - r.y0 = treeview_node_y(tree, node); - r.x1 = REDRAW_MAX; - r.y1 = tree->root->height; - - err = treeview_node_contract_internal(tree, node); - if (err != NSERROR_OK) - return err; + res = treeview_node_contract_internal(tree, node); + if (res == NSERROR_OK) { + /* sucessful contraction, request redraw */ + r.x0 = 0; + r.y0 = treeview_node_y(tree, node); + r.x1 = REDRAW_MAX; + r.y1 = tree->root->height; - /* Redraw */ - treeview__cw_redraw_request(tree, &r); + treeview__cw_redraw_request(tree, &r); + } - return NSERROR_OK; + return res; } @@ -1715,7 +1898,7 @@ nserror treeview_contract(treeview *tree, bool all) /* Contract children. */ treeview_walk_internal(n, false, - treeview_node_contract_cb, NULL, &data); + treeview_node_contract_cb, NULL, &data); /* Contract node */ treeview_node_contract_cb(n, &data, false); @@ -1734,13 +1917,29 @@ nserror treeview_contract(treeview *tree, bool all) } +/** + * context data for treeview expansion + */ struct treeview_expand_data { treeview *tree; bool only_folders; }; -/** Treewalk node callback for handling recursive node expansion. */ -static nserror treeview_expand_cb(treeview_node *n, void *ctx, - bool *skip_children, bool *end) + + +/** + * Treewalk node callback for handling recursive node expansion. + * + * \param n current node + * \param ctx node expansion context + * \param skip_children flag to allow children to be skipped + * \param end flag to allow iteration to be finished early. + * \return NSERROR_OK on sucess else error code. + */ +static nserror +treeview_expand_cb(treeview_node *n, + void *ctx, + bool *skip_children, + bool *end) { struct treeview_expand_data *data = ctx; nserror err; @@ -1749,7 +1948,7 @@ static nserror treeview_expand_cb(treeview_node *n, void *ctx, assert(n->type != TREE_NODE_ROOT); if (n->flags & TV_NFLAGS_EXPANDED || - (data->only_folders && n->type != TREE_NODE_FOLDER)) { + (data->only_folders && n->type != TREE_NODE_FOLDER)) { /* Nothing to do. */ return NSERROR_OK; } @@ -1758,11 +1957,13 @@ static nserror treeview_expand_cb(treeview_node *n, void *ctx, return err; } + + /* Exported interface, documented in treeview.h */ nserror treeview_expand(treeview *tree, bool only_folders) { struct treeview_expand_data data; - nserror err; + nserror res; struct rect r; assert(tree != NULL); @@ -1771,26 +1972,32 @@ nserror treeview_expand(treeview *tree, bool only_folders) data.tree = tree; data.only_folders = only_folders; - err = treeview_walk_internal(tree->root, true, NULL, - treeview_expand_cb, &data); - if (err != NSERROR_OK) - return err; + res = treeview_walk_internal(tree->root, + true, + NULL, + treeview_expand_cb, + &data); + if (res == NSERROR_OK) { + /* expansion suceeded, schedule redraw */ - r.x0 = 0; - r.y0 = 0; - r.x1 = REDRAW_MAX; - r.y1 = tree->root->height; - - /* Redraw */ - treeview__cw_redraw_request(tree, &r); + r.x0 = 0; + r.y0 = 0; + r.x1 = REDRAW_MAX; + r.y1 = tree->root->height; - return NSERROR_OK; + treeview__cw_redraw_request(tree, &r); + } + return res; } /* Exported interface, documented in treeview.h */ -void treeview_redraw(treeview *tree, const int x, const int y, - struct rect *clip, const struct redraw_context *ctx) +void +treeview_redraw(treeview *tree, + const int x, + const int y, + struct rect *clip, + const struct redraw_context *ctx) { struct redraw_context new_ctx = *ctx; treeview_node *node, *root, *next; @@ -1826,8 +2033,9 @@ void treeview_redraw(treeview *tree, const int x, const int y, } /* Start knockout rendering if it's available for this plotter */ - if (ctx->plot->option_knockout) + if (ctx->plot->option_knockout) { knockout_plot_start(ctx, &new_ctx); + } /* Set up clip rectangle */ r.x0 = clip->x0 + x; @@ -1849,7 +2057,7 @@ void treeview_redraw(treeview *tree, const int x, const int y, while (node != NULL) { int i; next = (node->flags & TV_NFLAGS_EXPANDED) ? - node->children : NULL; + node->children : NULL; if (next != NULL) { /* down to children */ @@ -1860,7 +2068,7 @@ void treeview_redraw(treeview *tree, const int x, const int y, * with a next sibling. */ while (node != root && - node->next_sib == NULL) { + node->next_sib == NULL) { node = node->parent; } @@ -1873,12 +2081,12 @@ void treeview_redraw(treeview *tree, const int x, const int y, assert(node != NULL); assert(node != root); assert(node->type == TREE_NODE_FOLDER || - node->type == TREE_NODE_ENTRY); + node->type == TREE_NODE_ENTRY); count++; inset = x + node->inset; height = (node->type == TREE_NODE_ENTRY) ? node->height : - tree_g.line_height; + tree_g.line_height; if ((render_y + height) < r.y0) { /* This node's line is above clip region */ @@ -1888,28 +2096,28 @@ void treeview_redraw(treeview *tree, const int x, const int y, style = (count & 0x1) ? &plot_style_odd : &plot_style_even; if (tree->drag.type == TV_DRAG_SELECTION && - (render_y + height >= sel_min && - render_y < sel_max)) { + (render_y + height >= sel_min && + render_y < sel_max)) { invert_selection = true; } else { invert_selection = false; } if ((node->flags & TV_NFLAGS_SELECTED && !invert_selection) || - (!(node->flags & TV_NFLAGS_SELECTED) && - invert_selection)) { + (!(node->flags & TV_NFLAGS_SELECTED) && + invert_selection)) { bg_style = &style->sbg; text_style = &style->stext; infotext_style = &style->sitext; furniture = (node->flags & TV_NFLAGS_EXPANDED) ? - style->furn[TREE_FURN_CONTRACT].sel : - style->furn[TREE_FURN_EXPAND].sel; + style->furn[TREE_FURN_CONTRACT].sel : + style->furn[TREE_FURN_EXPAND].sel; } else { bg_style = &style->bg; text_style = &style->text; infotext_style = &style->itext; furniture = (node->flags & TV_NFLAGS_EXPANDED) ? - style->furn[TREE_FURN_CONTRACT].bmp : - style->furn[TREE_FURN_EXPAND].bmp; + style->furn[TREE_FURN_CONTRACT].bmp : + style->furn[TREE_FURN_EXPAND].bmp; } /* Render background */ @@ -1942,11 +2150,11 @@ void treeview_redraw(treeview *tree, const int x, const int y, /* Icon resource is available */ data.x = inset + tree_g.step_width; data.y = render_y + ((tree_g.line_height - - treeview_res[res].height + 1) / 2); + treeview_res[res].height + 1) / 2); data.background_colour = bg_style->fill_colour; content_redraw(treeview_res[res].c, - &data, &r, &new_ctx); + &data, &r, &new_ctx); } /* Render text */ @@ -1967,7 +2175,7 @@ void treeview_redraw(treeview *tree, const int x, const int y, if (node->type != TREE_NODE_ENTRY || - !(node->flags & TV_NFLAGS_EXPANDED)) + !(node->flags & TV_NFLAGS_EXPANDED)) /* Done everything for this node */ continue; @@ -2046,6 +2254,10 @@ void treeview_redraw(treeview *tree, const int x, const int y, } } + +/** + * context for treeview selection + */ struct treeview_selection_walk_data { enum { TREEVIEW_WALK_HAS_SELECTION, @@ -2082,9 +2294,22 @@ struct treeview_selection_walk_data { int current_y; treeview *tree; }; -/** Treewalk node callback for handling selection related actions. */ -static nserror treeview_node_selection_walk_cb(treeview_node *n, - void *ctx, bool *skip_children, bool *end) + + +/** + * Treewalk node callback for handling selection related actions. + * + * \param n current node + * \param ctx node selection context + * \param skip_children flag to allow children to be skipped + * \param end flag to allow iteration to be finished early. + * \return NSERROR_OK on sucess else error code. + */ +static nserror +treeview_node_selection_walk_cb(treeview_node *n, + void *ctx, + bool *skip_children, + bool *end) { struct treeview_selection_walk_data *sw = ctx; int height; @@ -2114,7 +2339,7 @@ static nserror treeview_node_selection_walk_cb(treeview_node *n, case TREEVIEW_WALK_DELETE_SELECTION: if (n->flags & TV_NFLAGS_SELECTED) { err = treeview_delete_node_internal(sw->tree, n, true, - TREE_OPTION_NONE); + TREE_OPTION_NONE); if (err != NSERROR_OK) { return err; } @@ -2125,8 +2350,8 @@ static nserror treeview_node_selection_walk_cb(treeview_node *n, case TREEVIEW_WALK_PROPAGATE_SELECTION: if (n->parent != NULL && - n->parent->flags & TV_NFLAGS_SELECTED && - !(n->flags & TV_NFLAGS_SELECTED)) { + n->parent->flags & TV_NFLAGS_SELECTED && + !(n->flags & TV_NFLAGS_SELECTED)) { n->flags ^= TV_NFLAGS_SELECTED; changed = true; } @@ -2148,8 +2373,8 @@ static nserror treeview_node_selection_walk_cb(treeview_node *n, case TREEVIEW_WALK_COMMIT_SELECT_DRAG: if (sw->current_y >= sw->data.drag.sel_min && - sw->current_y - height < - sw->data.drag.sel_max) { + sw->current_y - height < + sw->data.drag.sel_max) { n->flags ^= TV_NFLAGS_SELECTED; } return NSERROR_OK; @@ -2186,7 +2411,7 @@ static nserror treeview_node_selection_walk_cb(treeview_node *n, case TREEVIEW_WALK_COPY_SELECTION: if (n->flags & TV_NFLAGS_SELECTED && - n->type == TREE_NODE_ENTRY) { + n->type == TREE_NODE_ENTRY) { int i; char *temp; uint32_t len; @@ -2201,12 +2426,12 @@ static nserror treeview_node_selection_walk_cb(treeview_node *n, continue; } val = treeview_get_text_for_field(sw->tree, - n, i); + n, i); text = val->data; len = val->len; temp = realloc(sw->data.copy.text, - sw->data.copy.len + len + 1); + sw->data.copy.len + len + 1); if (temp == NULL) { free(sw->data.copy.text); sw->data.copy.text = NULL; @@ -2250,7 +2475,7 @@ bool treeview_has_selection(treeview *tree) sw.data.has_selection = false; treeview_walk_internal(tree->root, false, NULL, - treeview_node_selection_walk_cb, &sw); + treeview_node_selection_walk_cb, &sw); return sw.data.has_selection; } @@ -2259,7 +2484,7 @@ bool treeview_has_selection(treeview *tree) /** * Get first selected node (in any) * - * \param tree Treeview object in which to create folder + * \param tree Treeview object in which to create folder * \return the first selected treeview node, or NULL */ static treeview_node * treeview_get_first_selected(treeview *tree) @@ -2270,7 +2495,7 @@ static treeview_node * treeview_get_first_selected(treeview *tree) sw.data.first.n = NULL; treeview_walk_internal(tree->root, false, NULL, - treeview_node_selection_walk_cb, &sw); + treeview_node_selection_walk_cb, &sw); return sw.data.first.n; } @@ -2278,7 +2503,7 @@ static treeview_node * treeview_get_first_selected(treeview *tree) /* Exported interface, documented in treeview.h */ enum treeview_node_type treeview_get_selection(treeview *tree, - void **node_data) + void **node_data) { treeview_node *n; @@ -2299,8 +2524,8 @@ enum treeview_node_type treeview_get_selection(treeview *tree, /** * Clear any selection in a treeview * - * \param tree Treeview object to clear selection in - * \param rect Redraw rectangle (if redraw required) + * \param tree Treeview object to clear selection in + * \param rect Redraw rectangle (if redraw required) * \return true iff redraw required */ static bool treeview_clear_selection(treeview *tree, struct rect *rect) @@ -2318,7 +2543,7 @@ static bool treeview_clear_selection(treeview *tree, struct rect *rect) sw.current_y = 0; treeview_walk_internal(tree->root, false, NULL, - treeview_node_selection_walk_cb, &sw); + treeview_node_selection_walk_cb, &sw); return sw.data.redraw.required; } @@ -2327,8 +2552,8 @@ static bool treeview_clear_selection(treeview *tree, struct rect *rect) /** * Select all in a treeview * - * \param tree Treeview object to select all in - * \param rect Redraw rectangle (if redraw required) + * \param tree Treeview object to select all in + * \param rect Redraw rectangle (if redraw required) * \return true iff redraw required */ static bool treeview_select_all(treeview *tree, struct rect *rect) @@ -2346,7 +2571,7 @@ static bool treeview_select_all(treeview *tree, struct rect *rect) sw.current_y = 0; treeview_walk_internal(tree->root, false, NULL, - treeview_node_selection_walk_cb, &sw); + treeview_node_selection_walk_cb, &sw); return sw.data.redraw.required; } @@ -2355,7 +2580,7 @@ static bool treeview_select_all(treeview *tree, struct rect *rect) /** * Commit a current selection drag, modifying the node's selection state. * - * \param tree Treeview object to commit drag selection in + * \param tree Treeview object to commit drag selection in */ static void treeview_commit_selection_drag(treeview *tree) { @@ -2373,14 +2598,14 @@ static void treeview_commit_selection_drag(treeview *tree) } treeview_walk_internal(tree->root, false, NULL, - treeview_node_selection_walk_cb, &sw); + treeview_node_selection_walk_cb, &sw); } /** * Yank a selection to the node move list. * - * \param tree Treeview object to yank selection from + * \param tree Treeview object to yank selection from */ static void treeview_move_yank_selection(treeview *tree) { @@ -2391,14 +2616,14 @@ static void treeview_move_yank_selection(treeview *tree) sw.tree = tree; treeview_walk_internal(tree->root, false, NULL, - treeview_node_selection_walk_cb, &sw); + treeview_node_selection_walk_cb, &sw); } /** * Copy a selection to the clipboard. * - * \param tree Treeview object to yank selection from + * \param tree Treeview object to yank selection from */ static void treeview_copy_selection(treeview *tree) { @@ -2411,14 +2636,14 @@ static void treeview_copy_selection(treeview *tree) sw.tree = tree; err = treeview_walk_internal(tree->root, false, NULL, - treeview_node_selection_walk_cb, &sw); + treeview_node_selection_walk_cb, &sw); if (err != NSERROR_OK) { return; } if (sw.data.copy.text != NULL) { guit->clipboard->set(sw.data.copy.text, - sw.data.copy.len - 1, NULL, 0); + sw.data.copy.len - 1, NULL, 0); free(sw.data.copy.text); } } @@ -2427,8 +2652,8 @@ static void treeview_copy_selection(treeview *tree) /** * Delete a selection. * - * \param tree Treeview object to delete selected nodes from - * \param rect Updated to redraw rectangle + * \param tree Treeview object to delete selected nodes from + * \param rect Updated to redraw rectangle * \return true iff redraw required. */ static bool treeview_delete_selection(treeview *tree, struct rect *rect) @@ -2450,7 +2675,7 @@ static bool treeview_delete_selection(treeview *tree, struct rect *rect) sw.tree = tree; treeview_walk_internal(tree->root, false, NULL, - treeview_node_selection_walk_cb, &sw); + treeview_node_selection_walk_cb, &sw); return sw.data.redraw.required; } @@ -2459,8 +2684,8 @@ static bool treeview_delete_selection(treeview *tree, struct rect *rect) /** * Propagate selection to visible descendants of selected nodes. * - * \param tree Treeview object to propagate selection in - * \param rect Redraw rectangle (if redraw required) + * \param tree Treeview object to propagate selection in + * \param rect Redraw rectangle (if redraw required) * \return true iff redraw required */ static bool treeview_propagate_selection(treeview *tree, struct rect *rect) @@ -2482,7 +2707,7 @@ static bool treeview_propagate_selection(treeview *tree, struct rect *rect) sw.tree = tree; treeview_walk_internal(tree->root, false, NULL, - treeview_node_selection_walk_cb, &sw); + treeview_node_selection_walk_cb, &sw); return sw.data.redraw.required; } @@ -2491,8 +2716,9 @@ static bool treeview_propagate_selection(treeview *tree, struct rect *rect) /** * Move a selection according to the current move drag. * - * \param tree Treeview object to move selected nodes in - * \param rect Redraw rectangle + * \param tree Treeview object to move selected nodes in + * \param rect Redraw rectangle + * \return NSERROR_OK on sucess else appropriate error code */ static nserror treeview_move_selection(treeview *tree, struct rect *rect) { @@ -2592,13 +2818,20 @@ static nserror treeview_move_selection(treeview *tree, struct rect *rect) } +/** + * context for treeview launch action + */ struct treeview_launch_walk_data { int selected_depth; treeview *tree; }; -/** Treewalk node walk backward callback for tracking folder selection. */ -static nserror treeview_node_launch_walk_bwd_cb(treeview_node *n, void *ctx, - bool *end) + + +/** + * Treewalk node walk backward callback for tracking folder selection. + */ +static nserror +treeview_node_launch_walk_bwd_cb(treeview_node *n, void *ctx, bool *end) { struct treeview_launch_walk_data *lw = ctx; @@ -2608,9 +2841,22 @@ static nserror treeview_node_launch_walk_bwd_cb(treeview_node *n, void *ctx, return NSERROR_OK; } -/** Treewalk node walk forward callback for launching nodes. */ -static nserror treeview_node_launch_walk_fwd_cb(treeview_node *n, void *ctx, - bool *skip_children, bool *end) + + +/** + * Treewalk node walk forward callback for launching nodes. + * + * \param n current node + * \param ctx node launch context + * \param skip_children flag to allow children to be skipped + * \param end flag to allow iteration to be finished early. + * \return NSERROR_OK on sucess else error code. + */ +static nserror +treeview_node_launch_walk_fwd_cb(treeview_node *n, + void *ctx, + bool *skip_children, + bool *end) { struct treeview_launch_walk_data *lw = ctx; nserror ret = NSERROR_OK; @@ -2619,8 +2865,8 @@ static nserror treeview_node_launch_walk_fwd_cb(treeview_node *n, void *ctx, lw->selected_depth++; } else if (n->type == TREE_NODE_ENTRY && - (n->flags & TV_NFLAGS_SELECTED || - lw->selected_depth > 0)) { + (n->flags & TV_NFLAGS_SELECTED || + lw->selected_depth > 0)) { struct treeview_node_msg msg; msg.msg = TREE_MSG_NODE_LAUNCH; msg.data.node_launch.mouse = BROWSER_MOUSE_HOVER; @@ -2629,14 +2875,16 @@ static nserror treeview_node_launch_walk_fwd_cb(treeview_node *n, void *ctx, return ret; } + + /** * Launch a selection. * - * \param tree Treeview object to launch selected nodes in - * \return NSERROR_OK on success, appropriate error otherwise + * \note Selected entries are launched. Entries that are descendants + * of selected folders are also launched. * - * Note: Selected entries are launched. - * Entries that are descendants of selected folders are also launched. + * \param tree Treeview object to launch selected nodes in + * \return NSERROR_OK on success, appropriate error otherwise */ static nserror treeview_launch_selection(treeview *tree) { @@ -2649,14 +2897,18 @@ static nserror treeview_launch_selection(treeview *tree) lw.tree = tree; return treeview_walk_internal(tree->root, true, - treeview_node_launch_walk_bwd_cb, - treeview_node_launch_walk_fwd_cb, &lw); + treeview_node_launch_walk_bwd_cb, + treeview_node_launch_walk_fwd_cb, &lw); } /* Exported interface, documented in treeview.h */ -nserror treeview_get_relation(treeview *tree, treeview_node **relation, - enum treeview_relationship *rel, bool at_y, int y) +nserror +treeview_get_relation(treeview *tree, + treeview_node **relation, + enum treeview_relationship *rel, + bool at_y, + int y) { treeview_node *n; @@ -2698,6 +2950,9 @@ nserror treeview_get_relation(treeview *tree, treeview_node **relation, } +/** + * context for treeview keyboard action + */ struct treeview_nav_state { treeview *tree; treeview_node *prev; @@ -2707,9 +2962,22 @@ struct treeview_nav_state { int n_selected; int prev_n_selected; }; -/** Treewalk node callback for handling mouse action. */ -static nserror treeview_node_nav_cb(treeview_node *node, void *ctx, - bool *skip_children, bool *end) + + +/** + * Treewalk node callback for handling mouse action. + * + * \param n current node + * \param ctx node context + * \param skip_children flag to allow children to be skipped + * \param end flag to allow iteration to be finished early. + * \return NSERROR_OK on sucess else error code. + */ +static nserror +treeview_node_nav_cb(treeview_node *node, + void *ctx, + bool *skip_children, + bool *end) { struct treeview_nav_state *ns = ctx; @@ -2735,19 +3003,21 @@ static nserror treeview_node_nav_cb(treeview_node *node, void *ctx, return NSERROR_OK; } + + /** * Handle keyboard navigation. * - * \param tree Treeview object to launch selected nodes in - * \param key The ucs4 character codepoint - * \param rect Updated to redraw rectangle - * \return true if treeview needs redraw, false otherwise - * - * Note: Selected entries are launched. + * \note Selected entries are launched. * Entries that are descendants of selected folders are also launched. + * + * \param tree Treeview object to launch selected nodes in + * \param key The ucs4 character codepoint + * \param rect Updated to redraw rectangle + * \return true if treeview needs redraw, false otherwise */ -static bool treeview_keyboard_navigation(treeview *tree, uint32_t key, - struct rect *rect) +static bool +treeview_keyboard_navigation(treeview *tree, uint32_t key, struct rect *rect) { struct treeview_nav_state ns = { .tree = tree, @@ -2764,7 +3034,7 @@ static bool treeview_keyboard_navigation(treeview *tree, uint32_t key, /* Fill out the nav. state struct, by examining the current selection * state */ treeview_walk_internal(tree->root, false, NULL, - treeview_node_nav_cb, &ns); + treeview_node_nav_cb, &ns); if (ns.next == NULL) ns.next = tree->root->children; if (ns.prev == NULL) @@ -2776,8 +3046,8 @@ static bool treeview_keyboard_navigation(treeview *tree, uint32_t key, switch (key) { case NS_KEY_LEFT: if (ns.curr != NULL && - ns.curr->parent != NULL && - ns.curr->parent->type != TREE_NODE_ROOT) { + ns.curr->parent != NULL && + ns.curr->parent->type != TREE_NODE_ROOT) { /* Step to parent */ ns.curr->parent->flags |= TV_NFLAGS_SELECTED; @@ -2795,7 +3065,7 @@ static bool treeview_keyboard_navigation(treeview *tree, uint32_t key, if (ns.curr->children != NULL) { /* Step to first child */ ns.curr->children->flags |= - TV_NFLAGS_SELECTED; + TV_NFLAGS_SELECTED; } else { /* Retain current node selection */ ns.curr->flags |= TV_NFLAGS_SELECTED; @@ -2889,7 +3159,7 @@ bool treeview_keypress(treeview *tree, uint32_t key) if (tree->root->height != h) { r.y0 = 0; treeview__cw_update_size(tree, -1, - tree->root->height); + tree->root->height); } } break; @@ -2931,9 +3201,14 @@ bool treeview_keypress(treeview *tree, uint32_t key) * \param rect Redraw rectangle (if redraw required) * \return true iff redraw required */ -static bool treeview_set_move_indicator(treeview *tree, bool need_redraw, - treeview_node *target, int node_height, - int node_y, int mouse_y, struct rect *rect) +static bool +treeview_set_move_indicator(treeview *tree, + bool need_redraw, + treeview_node *target, + int node_height, + int node_y, + int mouse_y, + struct rect *rect) { treeview_node *orig = target; enum treeview_target_pos target_pos; @@ -2948,44 +3223,44 @@ static bool treeview_set_move_indicator(treeview *tree, bool need_redraw, if (target->flags & TV_NFLAGS_SELECTED) { /* Find top selected ancestor */ while (target->parent && - target->parent->flags & TV_NFLAGS_SELECTED) { + target->parent->flags & TV_NFLAGS_SELECTED) { target = target->parent; } /* Find top ajdacent selected sibling */ while (target->prev_sib && - target->prev_sib->flags & TV_NFLAGS_SELECTED) { + target->prev_sib->flags & TV_NFLAGS_SELECTED) { target = target->prev_sib; } target_pos = TV_TARGET_ABOVE; } else switch (target->type) { - case TREE_NODE_FOLDER: - if (mouse_pos <= node_height / 4) { - target_pos = TV_TARGET_ABOVE; - } else if (mouse_pos <= (3 * node_height) / 4 || - target->flags & TV_NFLAGS_EXPANDED) { - target_pos = TV_TARGET_INSIDE; - } else { - target_pos = TV_TARGET_BELOW; - } - break; + case TREE_NODE_FOLDER: + if (mouse_pos <= node_height / 4) { + target_pos = TV_TARGET_ABOVE; + } else if (mouse_pos <= (3 * node_height) / 4 || + target->flags & TV_NFLAGS_EXPANDED) { + target_pos = TV_TARGET_INSIDE; + } else { + target_pos = TV_TARGET_BELOW; + } + break; - case TREE_NODE_ENTRY: - if (mouse_pos <= node_height / 2) { - target_pos = TV_TARGET_ABOVE; - } else { - target_pos = TV_TARGET_BELOW; - } - break; + case TREE_NODE_ENTRY: + if (mouse_pos <= node_height / 2) { + target_pos = TV_TARGET_ABOVE; + } else { + target_pos = TV_TARGET_BELOW; + } + break; - default: - assert(target->type != TREE_NODE_ROOT); - return false; - } + default: + assert(target->type != TREE_NODE_ROOT); + return false; + } if (target_pos == tree->move.target_pos && - target == tree->move.target) { + target == tree->move.target) { /* No change */ return need_redraw; } @@ -3019,7 +3294,7 @@ static bool treeview_set_move_indicator(treeview *tree, bool need_redraw, /* Oftsets are all relative to centred (INSIDE) */ node_y += (tree_g.line_height - - treeview_res[TREE_RES_ARROW].height + 1) / 2; + treeview_res[TREE_RES_ARROW].height + 1) / 2; x = target->inset + tree_g.move_offset; @@ -3054,6 +3329,9 @@ static bool treeview_set_move_indicator(treeview *tree, bool need_redraw, /** * Callback for textarea_create, in desktop/treeview.h + * + * \param data treeview context + * \param msg textarea message */ static void treeview_textarea_callback(void *data, struct textarea_msg *msg) { @@ -3092,16 +3370,21 @@ static void treeview_textarea_callback(void *data, struct textarea_msg *msg) /** * Start edit of node field, at given y-coord, if editable * - * \param tree Treeview object to consider editing in - * \param n The treeview node to try editing - * \param node_y The Y coord of the top of n - * \param mouse_x X coord of mouse position - * \param mouse_y Y coord of mouse position - * \param rect Redraw rectangle (if redraw required) + * \param tree Treeview object to consider editing in + * \param n The treeview node to try editing + * \param node_y The Y coord of the top of n + * \param mouse_x X coord of mouse position + * \param mouse_y Y coord of mouse position + * \param rect Redraw rectangle (if redraw required) * \return true iff redraw required */ -static bool treeview_edit_node_at_point(treeview *tree, treeview_node *n, - int node_y, int mouse_x, int mouse_y, struct rect *rect) +static bool +treeview_edit_node_at_point(treeview *tree, + treeview_node *n, + int node_y, + int mouse_x, + int mouse_y, + struct rect *rect) { struct treeview_text *field_data = NULL; struct treeview_field *ef, *field_desc = NULL; @@ -3136,7 +3419,7 @@ static bool treeview_edit_node_at_point(treeview *tree, treeview_node *n, ef = &(tree->fields[i + 1]); pos += tree_g.line_height; if (mouse_y <= pos && (ef->flags & - TREE_FLAG_ALLOW_EDIT)) { + TREE_FLAG_ALLOW_EDIT)) { field_data = &e->fields[i].value; field_desc = ef; field_y = pos - tree_g.line_height; @@ -3176,7 +3459,7 @@ static bool treeview_edit_node_at_point(treeview *tree, treeview_node *n, /* Create text area */ tree->edit.textarea = textarea_create(ta_flags, &ta_setup, - treeview_textarea_callback, tree); + treeview_textarea_callback, tree); if (tree->edit.textarea == NULL) { return false; } @@ -3198,8 +3481,8 @@ static bool treeview_edit_node_at_point(treeview *tree, treeview_node *n, mouse_x = width - 1; textarea_mouse_action(tree->edit.textarea, - BROWSER_MOUSE_PRESS_1 | BROWSER_MOUSE_CLICK_1, - mouse_x, tree_g.line_height / 2); + BROWSER_MOUSE_PRESS_1 | BROWSER_MOUSE_CLICK_1, + mouse_x, tree_g.line_height / 2); /* Position the textarea */ tree->edit.x = field_x; @@ -3243,7 +3526,7 @@ void treeview_edit_selection(treeview *tree) /* Edit node at y */ redraw = treeview_edit_node_at_point(tree, n, y, - 0, y + tree_g.line_height / 2, &rect); + 0, y + tree_g.line_height / 2, &rect); if (redraw == false) return; @@ -3257,6 +3540,9 @@ void treeview_edit_selection(treeview *tree) } +/** + * context for treeview mouse handling + */ struct treeview_mouse_action { treeview *tree; browser_mouse_state mouse; @@ -3264,9 +3550,22 @@ struct treeview_mouse_action { int y; int current_y; /* Y coordinate value of top of current node */ }; -/** Treewalk node callback for handling mouse action. */ -static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx, - bool *skip_children, bool *end) + + +/** + * Treewalk node callback for handling mouse action. + * + * \param n current node + * \param ctx node context + * \param skip_children flag to allow children to be skipped + * \param end flag to allow iteration to be finished early. + * \return NSERROR_OK on sucess else error code. + */ +static nserror +treeview_node_mouse_action_cb(treeview_node *node, + void *ctx, + bool *skip_children, + bool *end) { struct treeview_mouse_action *ma = ctx; struct rect r; @@ -3284,7 +3583,7 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx, r.x1 = REDRAW_MAX; height = (node->type == TREE_NODE_ENTRY) ? node->height : - tree_g.line_height; + tree_g.line_height; /* Skip line if we've not reached mouse y */ if (ma->y > ma->current_y + height) { @@ -3295,24 +3594,24 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx, /* Find where the mouse is */ if (ma->y <= ma->current_y + tree_g.line_height) { if (ma->x >= node->inset - 1 && - ma->x < node->inset + tree_g.step_width) { + ma->x < node->inset + tree_g.step_width) { /* Over expansion toggle */ part = TV_NODE_PART_TOGGLE; } else if (ma->x >= node->inset + tree_g.step_width && - ma->x < node->inset + tree_g.step_width + - tree_g.icon_step + node->text.width) { + ma->x < node->inset + tree_g.step_width + + tree_g.icon_step + node->text.width) { /* On node */ part = TV_NODE_PART_ON_NODE; } } else if (node->type == TREE_NODE_ENTRY && - height > tree_g.line_height) { + height > tree_g.line_height) { /* Expanded entries */ int x = node->inset + tree_g.step_width + tree_g.icon_step; int y = ma->current_y + tree_g.line_height; int i; struct treeview_node_entry *entry = - (struct treeview_node_entry *)node; + (struct treeview_node_entry *)node; for (i = 0; i < ma->tree->n_fields - 1; i++) { struct treeview_field *ef = &(ma->tree->fields[i + 1]); @@ -3325,21 +3624,21 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx, int max_width = ma->tree->field_width; if (ma->x >= x + max_width - ef->value.width - - tree_g.step_width && - ma->x < x + max_width - - tree_g.step_width) { + tree_g.step_width && + ma->x < x + max_width - + tree_g.step_width) { /* On a field name */ part = TV_NODE_PART_ON_NODE; } else if (ma->x >= x + max_width && - ma->x < x + max_width + - entry->fields[i].value.width) { + ma->x < x + max_width + + entry->fields[i].value.width) { /* On a field value */ part = TV_NODE_PART_ON_NODE; } } else { if (ma->x >= x && ma->x < x + - entry->fields[i].value.width) { + entry->fields[i].value.width) { /* On a field value */ part = TV_NODE_PART_ON_NODE; } @@ -3351,7 +3650,7 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx, /* Record what position / part a drag started on */ if (ma->mouse & (BROWSER_MOUSE_PRESS_1 | BROWSER_MOUSE_PRESS_2) && - ma->tree->drag.type == TV_DRAG_NONE) { + ma->tree->drag.type == TV_DRAG_NONE) { ma->tree->drag.selected = node->flags & TV_NFLAGS_SELECTED; ma->tree->drag.start_node = node; ma->tree->drag.part = part; @@ -3369,29 +3668,29 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx, /* Handle drag start */ if (ma->tree->drag.type == TV_DRAG_NONE) { if (ma->mouse & BROWSER_MOUSE_DRAG_1 && - ma->tree->drag.selected == false && - ma->tree->drag.part == TV_NODE_PART_NONE) { + ma->tree->drag.selected == false && + ma->tree->drag.part == TV_NODE_PART_NONE) { ma->tree->drag.type = TV_DRAG_SELECTION; treeview__cw_drag_status(ma->tree, - CORE_WINDOW_DRAG_SELECTION); + CORE_WINDOW_DRAG_SELECTION); } else if (!(ma->tree->flags & TREEVIEW_NO_MOVES) && - ma->mouse & BROWSER_MOUSE_DRAG_1 && - (ma->tree->drag.selected == true || - ma->tree->drag.part == TV_NODE_PART_ON_NODE)) { + ma->mouse & BROWSER_MOUSE_DRAG_1 && + (ma->tree->drag.selected == true || + ma->tree->drag.part == TV_NODE_PART_ON_NODE)) { ma->tree->drag.type = TV_DRAG_MOVE; treeview__cw_drag_status(ma->tree, - CORE_WINDOW_DRAG_MOVE); + CORE_WINDOW_DRAG_MOVE); redraw |= treeview_propagate_selection(ma->tree, &r); } else if (ma->mouse & BROWSER_MOUSE_DRAG_2) { ma->tree->drag.type = TV_DRAG_SELECTION; treeview__cw_drag_status(ma->tree, - CORE_WINDOW_DRAG_SELECTION); + CORE_WINDOW_DRAG_SELECTION); } if (ma->tree->drag.start_node != NULL && - ma->tree->drag.type == TV_DRAG_SELECTION) { + ma->tree->drag.type == TV_DRAG_SELECTION) { ma->tree->drag.start_node->flags ^= TV_NFLAGS_SELECTED; } } @@ -3402,10 +3701,10 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx, { int curr_y1 = ma->current_y + height; int prev_y1 = ma->tree->drag.prev.node_y + - ma->tree->drag.prev.node_h; + ma->tree->drag.prev.node_h; r.y0 = (ma->current_y < ma->tree->drag.prev.node_y) ? - ma->current_y : ma->tree->drag.prev.node_y; + ma->current_y : ma->tree->drag.prev.node_y; r.y1 = (curr_y1 > prev_y1) ? curr_y1 : prev_y1; redraw = true; @@ -3415,11 +3714,12 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx, ma->tree->drag.prev.node_y = ma->current_y; ma->tree->drag.prev.node_h = height; } - break; + break; case TV_DRAG_MOVE: redraw |= treeview_set_move_indicator(ma->tree, redraw, - node, height, ma->current_y, ma->y, &r); + node, height, + ma->current_y, ma->y, &r); break; default: @@ -3429,8 +3729,8 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx, click = ma->mouse & (BROWSER_MOUSE_CLICK_1 | BROWSER_MOUSE_CLICK_2); if (((node->type == TREE_NODE_FOLDER) && - (ma->mouse & BROWSER_MOUSE_DOUBLE_CLICK) && click) || - (part == TV_NODE_PART_TOGGLE && click)) { + (ma->mouse & BROWSER_MOUSE_DOUBLE_CLICK) && click) || + (part == TV_NODE_PART_TOGGLE && click)) { int h = ma->tree->root->height; /* Clear any existing selection */ @@ -3453,7 +3753,7 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx, redraw = true; } else if ((node->type == TREE_NODE_ENTRY) && - (ma->mouse & BROWSER_MOUSE_DOUBLE_CLICK) && click) { + (ma->mouse & BROWSER_MOUSE_DOUBLE_CLICK) && click) { struct treeview_node_msg msg; msg.msg = TREE_MSG_NODE_LAUNCH; msg.data.node_launch.mouse = ma->mouse; @@ -3465,28 +3765,29 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx, ma->tree->callbacks->entry(msg, node->client_data); } else if (ma->mouse & BROWSER_MOUSE_PRESS_2 || - (ma->mouse & BROWSER_MOUSE_PRESS_1 && - ma->mouse & BROWSER_MOUSE_MOD_2)) { + (ma->mouse & BROWSER_MOUSE_PRESS_1 && + ma->mouse & BROWSER_MOUSE_MOD_2)) { /* Toggle selection of node */ action |= TV_NODE_ACTION_SELECTION; } else if (ma->mouse & BROWSER_MOUSE_CLICK_1 && - ma->mouse & - (BROWSER_MOUSE_MOD_1 | BROWSER_MOUSE_MOD_3) && - part != TV_NODE_PART_TOGGLE) { + ma->mouse & + (BROWSER_MOUSE_MOD_1 | BROWSER_MOUSE_MOD_3) && + part != TV_NODE_PART_TOGGLE) { /* Clear any existing selection */ redraw |= treeview_clear_selection(ma->tree, &r); /* Edit node */ redraw |= treeview_edit_node_at_point(ma->tree, node, - ma->current_y, ma->x, ma->y, &r); + ma->current_y, ma->x, + ma->y, &r); } else if (ma->mouse & BROWSER_MOUSE_PRESS_1 && - !(ma->mouse & - (BROWSER_MOUSE_MOD_1 | BROWSER_MOUSE_MOD_3)) && - !(node->flags & TV_NFLAGS_SELECTED) && - part != TV_NODE_PART_TOGGLE) { + !(ma->mouse & + (BROWSER_MOUSE_MOD_1 | BROWSER_MOUSE_MOD_3)) && + !(node->flags & TV_NFLAGS_SELECTED) && + part != TV_NODE_PART_TOGGLE) { /* Clear any existing selection */ redraw |= treeview_clear_selection(ma->tree, &r); @@ -3505,10 +3806,12 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx, r.y1 = ma->current_y + height; redraw = true; } else { - if (r.y0 > ma->current_y) + if (r.y0 > ma->current_y) { r.y0 = ma->current_y; - if (r.y1 < ma->current_y + height) + } + if (r.y1 < ma->current_y + height) { r.y1 = ma->current_y + height; + } } } @@ -3519,9 +3822,11 @@ static nserror treeview_node_mouse_action_cb(treeview_node *node, void *ctx, *end = true; /* Reached line with click; stop walking tree */ return NSERROR_OK; } + + /* Exported interface, documented in treeview.h */ -void treeview_mouse_action(treeview *tree, - browser_mouse_state mouse, int x, int y) +void +treeview_mouse_action(treeview *tree, browser_mouse_state mouse, int x, int y) { struct rect r; bool redraw = false; @@ -3532,7 +3837,7 @@ void treeview_mouse_action(treeview *tree, /* Handle mouse drag captured by textarea */ if (tree->drag.type == TV_DRAG_TEXTAREA) { textarea_mouse_action(tree->edit.textarea, mouse, - x - tree->edit.x, y - tree->edit.y); + x - tree->edit.x, y - tree->edit.y); return; } @@ -3542,10 +3847,10 @@ void treeview_mouse_action(treeview *tree, int ta_y = y - tree->edit.y; if (ta_x > 0 && ta_x < tree->edit.w && - ta_y > 0 && ta_y < tree->edit.h) { + ta_y > 0 && ta_y < tree->edit.h) { /* Inside textarea */ textarea_mouse_action(tree->edit.textarea, mouse, - ta_x, ta_y); + ta_x, ta_y); return; } else if (mouse != BROWSER_MOUSE_HOVER) { @@ -3589,7 +3894,7 @@ void treeview_mouse_action(treeview *tree, /* Record what position / part a drag started on */ if (mouse & (BROWSER_MOUSE_PRESS_1 | BROWSER_MOUSE_PRESS_2) && - tree->drag.type == TV_DRAG_NONE) { + tree->drag.type == TV_DRAG_NONE) { tree->drag.selected = false; tree->drag.start_node = NULL; tree->drag.part = TV_NODE_PART_NONE; @@ -3607,8 +3912,8 @@ void treeview_mouse_action(treeview *tree, /* Handle drag start */ if (tree->drag.type == TV_DRAG_NONE) { if (mouse & BROWSER_MOUSE_DRAG_1 && - tree->drag.selected == false && - tree->drag.part == TV_NODE_PART_NONE) { + tree->drag.selected == false && + tree->drag.part == TV_NODE_PART_NONE) { tree->drag.type = TV_DRAG_SELECTION; treeview__cw_drag_status(tree, CORE_WINDOW_DRAG_SELECTION); @@ -3619,9 +3924,9 @@ void treeview_mouse_action(treeview *tree, } if (tree->drag.start_node != NULL && - tree->drag.type == TV_DRAG_SELECTION) { + tree->drag.type == TV_DRAG_SELECTION) { tree->drag.start_node->flags ^= - TV_NFLAGS_SELECTED; + TV_NFLAGS_SELECTED; } } @@ -3629,7 +3934,7 @@ void treeview_mouse_action(treeview *tree, if (tree->drag.type == TV_DRAG_SELECTION) { int curr_y1 = tree->root->height; int prev_y1 = tree->drag.prev.node_y + - tree->drag.prev.node_h; + tree->drag.prev.node_h; r.y0 = tree->drag.prev.node_y; r.y1 = (curr_y1 > prev_y1) ? curr_y1 : prev_y1; @@ -3662,7 +3967,7 @@ void treeview_mouse_action(treeview *tree, ma.current_y = 0; treeview_walk_internal(tree->root, false, NULL, - treeview_node_mouse_action_cb, &ma); + treeview_node_mouse_action_cb, &ma); } } @@ -3681,6 +3986,8 @@ int treeview_get_height(treeview *tree) /** * Initialise the plot styles from CSS system colour values. + * + * \param font_pt_size font size to use */ static void treeview_init_plot_styles(int font_pt_size) { @@ -3702,8 +4009,8 @@ static void treeview_init_plot_styles(int font_pt_size) /* Entry field text colour */ plot_style_even.itext = plot_style_even.text; plot_style_even.itext.foreground = mix_colour( - plot_style_even.text.foreground, - plot_style_even.text.background, 255 * 10 / 16); + plot_style_even.text.foreground, + plot_style_even.text.background, 255 * 10 / 16); /* Selected background colour */ plot_style_even.sbg = plot_style_even.bg; @@ -3712,27 +4019,27 @@ static void treeview_init_plot_styles(int font_pt_size) /* Selected text colour */ plot_style_even.stext = plot_style_even.text; plot_style_even.stext.foreground = - ns_system_colour_char("HighlightText"); + ns_system_colour_char("HighlightText"); plot_style_even.stext.background = ns_system_colour_char("Highlight"); /* Selected entry field text colour */ plot_style_even.sitext = plot_style_even.stext; plot_style_even.sitext.foreground = mix_colour( - plot_style_even.stext.foreground, - plot_style_even.stext.background, 255 * 25 / 32); + plot_style_even.stext.foreground, + plot_style_even.stext.background, 255 * 25 / 32); /* Odd numbered node styles */ plot_style_odd.bg = plot_style_even.bg; plot_style_odd.bg.fill_colour = mix_colour( - plot_style_even.bg.fill_colour, - plot_style_even.text.foreground, 255 * 15 / 16); + plot_style_even.bg.fill_colour, + plot_style_even.text.foreground, 255 * 15 / 16); plot_style_odd.text = plot_style_even.text; plot_style_odd.text.background = plot_style_odd.bg.fill_colour; plot_style_odd.itext = plot_style_odd.text; plot_style_odd.itext.foreground = mix_colour( - plot_style_odd.text.foreground, - plot_style_odd.text.background, 255 * 10 / 16); + plot_style_odd.text.foreground, + plot_style_odd.text.background, 255 * 10 / 16); plot_style_odd.sbg = plot_style_even.sbg; plot_style_odd.stext = plot_style_even.stext; @@ -3741,7 +4048,11 @@ static void treeview_init_plot_styles(int font_pt_size) /** - * Callback for hlcache. + * Callback for hlcache retreving resources. + * + * \param handle content hlcache handle + * \param event The event that occoured on the content + * \param pw treeview resource context */ static nserror treeview_res_cb(struct hlcache_handle *handle, @@ -3778,9 +4089,10 @@ static void treeview_init_resources(void) treeview_res[i].height = 0; if (nsurl_create(treeview_res[i].url, &url) == NSERROR_OK) { hlcache_handle_retrieve(url, 0, NULL, NULL, - treeview_res_cb, - &(treeview_res[i]), NULL, - CONTENT_IMAGE, &(treeview_res[i].c)); + treeview_res_cb, + &(treeview_res[i]), NULL, + CONTENT_IMAGE, + &(treeview_res[i].c)); nsurl_unref(url); } } @@ -3790,12 +4102,12 @@ static void treeview_init_resources(void) /** * Create a right-pointing anti-aliased triangle bitmap * - * bg background colour - * fg foreground colour - * size required bitmap size + * \param bg background colour + * \param fg foreground colour + * \param size required bitmap size */ -static struct bitmap * treeview_generate_triangle_bitmap( - colour bg, colour fg, int size) +static struct bitmap * +treeview_generate_triangle_bitmap(colour bg, colour fg, int size) { struct bitmap *b = NULL; int x, y; @@ -3892,11 +4204,11 @@ static struct bitmap * treeview_generate_triangle_bitmap( /** * Create bitmap copy of another bitmap * - * orig bitmap to copy - * size required bitmap size + * \param orig bitmap to copy + * \param size required bitmap size */ -static struct bitmap * treeview_generate_copy_bitmap( - struct bitmap *orig, int size) +static struct bitmap * +treeview_generate_copy_bitmap(struct bitmap *orig, int size) { struct bitmap *b = NULL; unsigned char *data; @@ -3937,11 +4249,11 @@ static struct bitmap * treeview_generate_copy_bitmap( /** * Create bitmap from rotation of another bitmap * - * orig bitmap to create rotation of - * size required bitmap size + * \param orig bitmap to create rotation of + * \param size required bitmap size */ -static struct bitmap * treeview_generate_rotate_bitmap( - struct bitmap *orig, int size) +static struct bitmap * +treeview_generate_rotate_bitmap(struct bitmap *orig, int size) { struct bitmap *b = NULL; int x, y; @@ -3978,7 +4290,7 @@ static struct bitmap * treeview_generate_rotate_bitmap( *(pos++) = *(orig_pos++); *(pos++) = *(orig_pos); *(pos++) = 0xff; - + } rpos += stride; @@ -3998,6 +4310,8 @@ static struct bitmap * treeview_generate_rotate_bitmap( /** * Measures width of characters used to represent treeview furniture. + * + * \return NSERROR_OK on success else error code */ static nserror treeview_init_furniture(void) { @@ -4005,47 +4319,47 @@ static nserror treeview_init_furniture(void) plot_style_odd.furn[TREE_FURN_EXPAND].size = size; plot_style_odd.furn[TREE_FURN_EXPAND].bmp = - treeview_generate_triangle_bitmap( + treeview_generate_triangle_bitmap( plot_style_odd.bg.fill_colour, plot_style_odd.itext.foreground, size); plot_style_odd.furn[TREE_FURN_EXPAND].sel = - treeview_generate_triangle_bitmap( + treeview_generate_triangle_bitmap( plot_style_odd.sbg.fill_colour, plot_style_odd.sitext.foreground, size); plot_style_even.furn[TREE_FURN_EXPAND].size = size; plot_style_even.furn[TREE_FURN_EXPAND].bmp = - treeview_generate_triangle_bitmap( + treeview_generate_triangle_bitmap( plot_style_even.bg.fill_colour, plot_style_even.itext.foreground, size); plot_style_even.furn[TREE_FURN_EXPAND].sel = - treeview_generate_copy_bitmap( + treeview_generate_copy_bitmap( plot_style_odd.furn[TREE_FURN_EXPAND].sel, size); plot_style_odd.furn[TREE_FURN_CONTRACT].size = size; plot_style_odd.furn[TREE_FURN_CONTRACT].bmp = - treeview_generate_rotate_bitmap( + treeview_generate_rotate_bitmap( plot_style_odd.furn[TREE_FURN_EXPAND].bmp, size); plot_style_odd.furn[TREE_FURN_CONTRACT].sel = - treeview_generate_rotate_bitmap( + treeview_generate_rotate_bitmap( plot_style_odd.furn[TREE_FURN_EXPAND].sel, size); plot_style_even.furn[TREE_FURN_CONTRACT].size = size; plot_style_even.furn[TREE_FURN_CONTRACT].bmp = - treeview_generate_rotate_bitmap( + treeview_generate_rotate_bitmap( plot_style_even.furn[TREE_FURN_EXPAND].bmp, size); plot_style_even.furn[TREE_FURN_CONTRACT].sel = - treeview_generate_rotate_bitmap( + treeview_generate_rotate_bitmap( plot_style_even.furn[TREE_FURN_EXPAND].sel, size); if (plot_style_odd.furn[TREE_FURN_EXPAND].bmp == NULL || - plot_style_odd.furn[TREE_FURN_EXPAND].sel == NULL || - plot_style_even.furn[TREE_FURN_EXPAND].bmp == NULL || - plot_style_even.furn[TREE_FURN_EXPAND].sel == NULL || - plot_style_odd.furn[TREE_FURN_CONTRACT].bmp == NULL || - plot_style_odd.furn[TREE_FURN_CONTRACT].sel == NULL || - plot_style_even.furn[TREE_FURN_CONTRACT].bmp == NULL || - plot_style_even.furn[TREE_FURN_CONTRACT].sel == NULL) + plot_style_odd.furn[TREE_FURN_EXPAND].sel == NULL || + plot_style_even.furn[TREE_FURN_EXPAND].bmp == NULL || + plot_style_even.furn[TREE_FURN_EXPAND].sel == NULL || + plot_style_odd.furn[TREE_FURN_CONTRACT].bmp == NULL || + plot_style_odd.furn[TREE_FURN_CONTRACT].sel == NULL || + plot_style_even.furn[TREE_FURN_CONTRACT].bmp == NULL || + plot_style_even.furn[TREE_FURN_CONTRACT].sel == NULL) return NSERROR_NOMEM; tree_g.furniture_width = size + tree_g.line_height / 4; -- cgit v1.2.3