summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2013-07-03 11:50:23 +0100
committerMichael Drake <tlsa@netsurf-browser.org>2013-07-03 11:50:23 +0100
commit26befde81c6d0c40ce5ebf9244b0f963587b7646 (patch)
tree6c11e0a17b38c9ee8f245ed87931a1cfb803db6c
parentc010535fbe85841f096c90128ea29016e770fc56 (diff)
downloadnetsurf-26befde81c6d0c40ce5ebf9244b0f963587b7646.tar.gz
netsurf-26befde81c6d0c40ce5ebf9244b0f963587b7646.tar.bz2
Make READ_ONLY flag a combinator for NO_MOVES and NO_DELETES. Implement NO_DELETES.
-rw-r--r--desktop/treeview.c31
-rw-r--r--desktop/treeview.h9
2 files changed, 31 insertions, 9 deletions
diff --git a/desktop/treeview.c b/desktop/treeview.c
index 5d8a72f31..062ef9bc7 100644
--- a/desktop/treeview.c
+++ b/desktop/treeview.c
@@ -469,16 +469,30 @@ nserror treeview_create_node_entry(struct treeview *tree,
}
-/* Exported interface, documented in treeview.h */
-nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
+/**
+ * Delete a treeview node
+ *
+ * \param tree Treeview object to delete node from
+ * \param n Node to delete
+ * \param interaction Delete is result of user interaction with treeview
+ * \return NSERROR_OK on success, appropriate error otherwise
+ *
+ * Will emit folder or entry deletion msg callback.
+ */
+static nserror treeview_delete_node_internal(struct treeview *tree,
+ struct treeview_node *n, bool interaction)
{
struct treeview_node_msg msg;
msg.msg = TREE_MSG_NODE_DELETE;
struct treeview_node *p;
+ if (interaction && (tree->flags & TREEVIEW_NO_DELETES)) {
+ return NSERROR_OK;
+ }
+
/* Destroy children first */
while (n->children != NULL) {
- treeview_delete_node(tree, n->children);
+ treeview_delete_node_internal(tree, n->children, interaction);
}
/* Unlink node from tree */
@@ -528,6 +542,13 @@ nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
/* Exported interface, documented in treeview.h */
+nserror treeview_delete_node(struct treeview *tree, struct treeview_node *n)
+{
+ return treeview_delete_node_internal(tree, n, false);
+}
+
+
+/* Exported interface, documented in treeview.h */
nserror treeview_create(struct treeview **tree,
const struct treeview_callback_table *callbacks,
int n_fields, struct treeview_field_desc fields[],
@@ -614,7 +635,7 @@ nserror treeview_destroy(struct treeview *tree)
assert(tree != NULL);
/* Destroy nodes */
- treeview_delete_node(tree, tree->root);
+ treeview_delete_node_internal(tree, tree->root, false);
/* Destroy feilds */
for (f = 0; f <= tree->n_fields; f++) {
@@ -1086,7 +1107,7 @@ static bool treeview_node_selection_walk_cb(struct treeview_node *node,
case TREEVIEW_WALK_DELETE_SELECTION:
if (node->flags & TREE_NODE_SELECTED) {
- treeview_delete_node(sw->tree, node);
+ treeview_delete_node_internal(sw->tree, node, true);
changed = true;
}
break;
diff --git a/desktop/treeview.h b/desktop/treeview.h
index 5704014c5..475b90e67 100644
--- a/desktop/treeview.h
+++ b/desktop/treeview.h
@@ -44,10 +44,11 @@ typedef enum {
} treeview_node_create_flags; /**< Relationship between nodes */
typedef enum {
- TREEVIEW_NO_FLAGS = (0), /* No flags set */
- TREEVIEW_READ_ONLY = (1 << 0), /* No edits */
- TREEVIEW_NO_MOVES = (1 << 1), /* No node drags */
- TREEVIEW_DELETE_EMPTY_DIRS = (1 << 2) /* Del. dirs on empty */
+ TREEVIEW_NO_FLAGS = (0), /**< No flags set */
+ TREEVIEW_NO_MOVES = (1 << 0), /**< No node drags */
+ TREEVIEW_NO_DELETES = (1 << 1), /**< No node deletes */
+ TREEVIEW_READ_ONLY = TREEVIEW_NO_MOVES | TREEVIEW_NO_DELETES,
+ TREEVIEW_DEL_EMPTY_DIRS = (1 << 2) /**< Delete dirs on empty */
} treeview_flags;
enum treeview_msg {