summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2017-02-28 23:41:48 +0000
committerVincent Sanders <vince@kyllikki.org>2017-02-28 23:41:48 +0000
commite72b89ac3d691acb5c306c1565eaa1e559495ec8 (patch)
tree415d1e550678c8f49b8f1c61b5a5e8e8946890ed /desktop
parent1f19fe05cf51ee96982772bdccf707070d0eeb5f (diff)
downloadnetsurf-e72b89ac3d691acb5c306c1565eaa1e559495ec8.tar.gz
netsurf-e72b89ac3d691acb5c306c1565eaa1e559495ec8.tar.bz2
Improve treeview documentation comments
Diffstat (limited to 'desktop')
-rw-r--r--desktop/treeview.c1274
-rw-r--r--desktop/treeview.h194
2 files changed, 924 insertions, 544 deletions
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;
diff --git a/desktop/treeview.h b/desktop/treeview.h
index 518f045aa..0dbde1119 100644
--- a/desktop/treeview.h
+++ b/desktop/treeview.h
@@ -37,6 +37,10 @@ struct core_window_callback_table;
typedef struct treeview treeview;
typedef struct treeview_node treeview_node;
+
+/**
+ * treeview node type
+ */
enum treeview_node_type {
TREE_NODE_NONE = 0, /**< No node */
TREE_NODE_ROOT = (1 << 0), /**< Node is treeview's root */
@@ -44,18 +48,29 @@ enum treeview_node_type {
TREE_NODE_ENTRY = (1 << 2) /**< Node is an entry */
};
+
+/**
+ * Relationship between nodes
+ */
enum treeview_relationship {
TREE_REL_FIRST_CHILD,
TREE_REL_NEXT_SIBLING
-}; /**< Relationship between nodes */
+};
+
+/**
+ * Node change handling options
+ */
typedef enum {
TREE_OPTION_NONE = (0), /* No flags set */
TREE_OPTION_SPECIAL_DIR = (1 << 0), /* Special folder */
TREE_OPTION_SUPPRESS_RESIZE = (1 << 1), /* Suppress callback */
TREE_OPTION_SUPPRESS_REDRAW = (1 << 2) /* Suppress callback */
-} treeview_node_options_flags; /**< Node change handling options */
+} treeview_node_options_flags;
+/**
+ * treeview control flags
+ */
typedef enum {
TREEVIEW_NO_FLAGS = (0), /**< No flags set */
TREEVIEW_NO_MOVES = (1 << 0), /**< No node drags */
@@ -64,20 +79,28 @@ typedef enum {
TREEVIEW_DEL_EMPTY_DIRS = (1 << 2) /**< Delete dirs on empty */
} treeview_flags;
+/**
+ * treeview message types
+ */
enum treeview_msg {
TREE_MSG_NODE_DELETE, /**< Node to be deleted */
TREE_MSG_NODE_EDIT, /**< Node to be edited */
TREE_MSG_NODE_LAUNCH /**< Node to be launched */
};
+
+
+/**
+ * treeview message
+ */
struct treeview_node_msg {
enum treeview_msg msg; /**< The message type */
union {
struct {
- bool user; /* True iff delete by user interaction */
+ bool user; /**< True iff delete by user interaction */
} delete;
struct {
- lwc_string *field; /* The field being edited */
- const char *text; /* The proposed new value */
+ lwc_string *field; /**< The field being edited */
+ const char *text; /**< The proposed new value */
} node_edit; /* Client may call treeview_update_node_* */
struct {
browser_mouse_state mouse; /* Button / modifier used */
@@ -85,6 +108,10 @@ struct treeview_node_msg {
} data; /**< The message data. */
};
+
+/**
+ * treeview field flags
+ */
enum treeview_field_flags {
TREE_FLAG_NONE = 0, /**< No flags set */
TREE_FLAG_ALLOW_EDIT = (1 << 0), /**< Whether allow edit field */
@@ -92,11 +119,20 @@ enum treeview_field_flags {
TREE_FLAG_SHOW_NAME = (1 << 2), /**< Whether field name shown */
TREE_FLAG_COPY_TEXT = (1 << 3) /**< Whether to copy to clipb */
};
+
+
+/**
+ * Treeview field description
+ */
struct treeview_field_desc {
lwc_string *field; /**< A treeview field name */
enum treeview_field_flags flags; /**< Flags for field */
-}; /**< Treeview field description */
+};
+
+/**
+ * Treeview field data
+ */
struct treeview_field_data {
lwc_string *field; /**< Field name */
const char *value; /**< Field value */
@@ -104,10 +140,14 @@ struct treeview_field_data {
};
+/**
+ * Client callbacks for events concerning nodes
+ */
struct treeview_callback_table {
nserror (*folder)(struct treeview_node_msg msg, void *data);
nserror (*entry)(struct treeview_node_msg msg, void *data);
-}; /**< Client callbacks for events concerning nodes */
+};
+
/**
* Prepare treeview module for treeview usage
@@ -116,6 +156,7 @@ struct treeview_callback_table {
*/
nserror treeview_init(void);
+
/**
* Finalise the treeview module (all treeviews must have been destroyed first)
*
@@ -123,9 +164,18 @@ nserror treeview_init(void);
*/
nserror treeview_fini(void);
+
/**
* Create a treeview
*
+ * The fields array order is as follows (N = n_fields):
+ *
+ * fields[0] Main field for entries (shown when not expanded)
+ * fields[1]...fields[N-2] Additional fields for entries
+ * fields[N-1] Field for folder nodes
+ *
+ * So fields[0] and fields[N-1] have TREE_FLAG_DEFAULT set.
+ *
* \param tree Returns created treeview object
* \param callbacks Treeview client node event callbacks
* \param n_fields Number of treeview fields (see description)
@@ -134,20 +184,13 @@ nserror treeview_fini(void);
* \param cw The core_window in which the treeview is shown
* \param flags Treeview behaviour flags
* \return NSERROR_OK on success, appropriate error otherwise
- *
- * The fields array order is as follows (N = n_fields):
- *
- * fields[0] Main field for entries (shown when not expanded)
- * fields[1]...fields[N-2] Additional fields for entries
- * fields[N-1] Field for folder nodes
- *
- * So fields[0] and fields[N-1] have TREE_FLAG_DEFAULT set.
*/
nserror treeview_create(treeview **tree,
- const struct treeview_callback_table *callbacks,
- int n_fields, struct treeview_field_desc fields[],
- const struct core_window_callback_table *cw_t,
- struct core_window *cw, treeview_flags flags);
+ const struct treeview_callback_table *callbacks,
+ int n_fields, struct treeview_field_desc fields[],
+ const struct core_window_callback_table *cw_t,
+ struct core_window *cw, treeview_flags flags);
+
/**
* Attach a treeview to a corewindow.
@@ -160,45 +203,50 @@ nserror treeview_create(treeview **tree,
* \return NSERROR_OK on success, appropriate error otherwise
*/
nserror treeview_cw_attach(treeview *tree,
- const struct core_window_callback_table *cw_t,
- struct core_window *cw);
+ const struct core_window_callback_table *cw_t,
+ struct core_window *cw);
+
/**
* Detach a treeview from a corewindow
*
- * \param tree Treeview object
+ * \param tree Treeview object
* \return NSERROR_OK on success, appropriate error otherwise
*/
nserror treeview_cw_detach(treeview *tree);
+
/**
* Destroy a treeview object
*
- * \param tree Treeview object to destroy
- * \return NSERROR_OK on success, appropriate error otherwise
- *
* Will emit folder and entry deletion msg callbacks for all nodes in treeview.
+ *
+ * \param tree Treeview object to destroy
+ * \return NSERROR_OK on success, appropriate error otherwise
*/
nserror treeview_destroy(treeview *tree);
+
/**
* Find a releation for node creation.
*
+ * If at_y is set, we find a relation that will put the created node at that
+ * position.
+ *
+ * If at_y is unset, we find a relation that would put the node below the first
+ * selected node, or at the end of the treeview if no nodes selected.
+ *
* \param tree Treeview object in which to create folder
* \param relation Existing node to insert as relation of, or NULL
* \param rel Folder's relationship to relation
* \param at_y Iff true, insert at y-offest
* \param y Y-offset in px from top of hotlist. Ignored if (!at_y).
* \return NSERROR_OK on success, appropriate error otherwise
- *
- * If at_y is set, we find a relation that will put the created node at that
- * position.
- *
- * If at_y is unset, we find a relation that would put the node below the first
- * selected node, or at the end of the treeview if no nodes selected.
*/
nserror treeview_get_relation(treeview *tree, treeview_node **relation,
- enum treeview_relationship *rel, bool at_y, int y);
+ enum treeview_relationship *rel,
+ bool at_y, int y);
+
/**
* Create a folder node in given treeview
@@ -217,11 +265,13 @@ nserror treeview_get_relation(treeview *tree, treeview_node **relation,
* If relation is NULL, will insert as child of root node.
*/
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 **folder,
+ treeview_node *relation,
+ enum treeview_relationship rel,
+ const struct treeview_field_data *field,
+ void *data,
+ treeview_node_options_flags flags);
+
/**
* Create an entry node in given treeview
@@ -240,11 +290,13 @@ nserror treeview_create_node_folder(treeview *tree,
* If relation is NULL, will insert as child of root node.
*/
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);
+ treeview_node **entry,
+ treeview_node *relation,
+ enum treeview_relationship rel,
+ const struct treeview_field_data fields[],
+ void *data,
+ treeview_node_options_flags flags);
+
/**
* Update an folder node in given treeview
@@ -258,9 +310,10 @@ nserror treeview_create_node_entry(treeview *tree,
* Field name must match name past in treeview_create fields[N-1].
*/
nserror treeview_update_node_folder(treeview *tree,
- treeview_node *folder,
- const struct treeview_field_data *field,
- void *data);
+ treeview_node *folder,
+ const struct treeview_field_data *field,
+ void *data);
+
/**
* Update an entry node in given treeview
@@ -274,9 +327,9 @@ nserror treeview_update_node_folder(treeview *tree,
* Fields array names must match names past in treeview_create fields[0...N-2].
*/
nserror treeview_update_node_entry(treeview *tree,
- treeview_node *entry,
- const struct treeview_field_data fields[],
- void *data);
+ treeview_node *entry,
+ const struct treeview_field_data fields[],
+ void *data);
/**
@@ -289,12 +342,19 @@ nserror treeview_update_node_entry(treeview *tree,
* \return NSERROR_OK on success, or appropriate error otherwise
*/
typedef nserror (*treeview_walk_cb)(void *ctx, void *node_data,
- enum treeview_node_type type, bool *abort);
+ enum treeview_node_type type, bool *abort);
+
/**
* Walk (depth first) a treeview subtree, calling a callback at each node of
* required type.
*
+ * 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.
+ *
* \param tree Treeview object to walk
* \param root Root node to walk tree from (or NULL for tree root)
* \param enter_cb Function to call on entering nodes, or NULL
@@ -302,16 +362,11 @@ typedef nserror (*treeview_walk_cb)(void *ctx, void *node_data,
* \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
- *
- * 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_cb enter_cb, treeview_walk_cb leave_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
@@ -324,7 +379,8 @@ nserror treeview_walk(treeview *tree, treeview_node *root,
* Will emit folder or entry deletion msg callback.
*/
nserror treeview_delete_node(treeview *tree, treeview_node *n,
- treeview_node_options_flags flags);
+ treeview_node_options_flags flags);
+
/**
* Expand a treeview node
@@ -335,6 +391,7 @@ nserror treeview_delete_node(treeview *tree, treeview_node *n,
*/
nserror treeview_node_expand(treeview *tree, treeview_node *node);
+
/**
* Contract a treeview node
*
@@ -344,6 +401,7 @@ nserror treeview_node_expand(treeview *tree, treeview_node *node);
*/
nserror treeview_node_contract(treeview *tree, treeview_node *node);
+
/**
* Expand a treeview's nodes
*
@@ -353,6 +411,7 @@ nserror treeview_node_contract(treeview *tree, treeview_node *node);
*/
nserror treeview_expand(treeview *tree, bool only_folders);
+
/**
* Contract a treeview's nodes
*
@@ -362,6 +421,7 @@ nserror treeview_expand(treeview *tree, bool only_folders);
*/
nserror treeview_contract(treeview *tree, bool all);
+
/**
* Redraw a treeview object
*
@@ -372,7 +432,8 @@ nserror treeview_contract(treeview *tree, bool all);
* \param ctx Current redraw context
*/
void treeview_redraw(treeview *tree, int x, int y, struct rect *clip,
- const struct redraw_context *ctx);
+ const struct redraw_context *ctx);
+
/**
* Key press handling for treeviews.
@@ -383,6 +444,7 @@ void treeview_redraw(treeview *tree, int x, int y, struct rect *clip,
*/
bool treeview_keypress(treeview *tree, uint32_t key);
+
/**
* Handles all kinds of mouse action
*
@@ -392,16 +454,18 @@ bool treeview_keypress(treeview *tree, uint32_t key);
* \param y Y coordinate
*/
void treeview_mouse_action(treeview *tree,
- browser_mouse_state mouse, int x, int y);
+ browser_mouse_state mouse, int x, int y);
+
/**
* Determine whether treeview has a selection
*
- * \param tree Treeview object to delete node from
+ * \param tree Treeview object to delete node from
* \return true iff treeview has a selection
*/
bool treeview_has_selection(treeview *tree);
+
/**
* Get the first selected node
*
@@ -410,19 +474,21 @@ bool treeview_has_selection(treeview *tree);
* \return node type of first selected node.
*/
enum treeview_node_type treeview_get_selection(treeview *tree,
- void **node_data);
+ void **node_data);
+
/**
* Edit the first selected node
*
- * \param tree Treeview object to edit selected node in
+ * \param tree Treeview object to edit selected node in
*/
void treeview_edit_selection(treeview *tree);
+
/**
* Find current height of a treeview
*
- * \param tree Treeview object to find height of
+ * \param tree Treeview object to find height of
* \return height of treeview in px
*/
int treeview_get_height(treeview *tree);