summaryrefslogtreecommitdiff
path: root/desktop
diff options
context:
space:
mode:
authorRichard Wilson <rjw@netsurf-browser.org>2005-02-08 23:34:56 +0000
committerRichard Wilson <rjw@netsurf-browser.org>2005-02-08 23:34:56 +0000
commitacb914b90af6f937c73c153a818c97baa13eb8c4 (patch)
tree8881e969a8bed65dabd1e5a44342f1c4725cc185 /desktop
parent91ec410b7cf03e301caf140a719adf1dd985ad92 (diff)
downloadnetsurf-acb914b90af6f937c73c153a818c97baa13eb8c4.tar.gz
netsurf-acb914b90af6f937c73c153a818c97baa13eb8c4.tar.bz2
[project @ 2005-02-08 23:34:56 by rjw]
Implement nodes being retained in memory after deletion, stop nodes being able to be moved within themselves. svn path=/import/netsurf/; revision=1507
Diffstat (limited to 'desktop')
-rw-r--r--desktop/tree.c87
-rw-r--r--desktop/tree.h7
2 files changed, 78 insertions, 16 deletions
diff --git a/desktop/tree.c b/desktop/tree.c
index fe9e8e50d..0fb71084a 100644
--- a/desktop/tree.c
+++ b/desktop/tree.c
@@ -19,8 +19,6 @@
#include "netsurf/utils/log.h"
#include "netsurf/utils/utils.h"
-static void tree_recalculate_node(struct node *node, bool recalculate_sizes);
-static void tree_recalculate_node_positions(struct node *root);
static void tree_draw_node(struct tree *tree, struct node *node, int clip_x, int clip_y,
int clip_width, int clip_height);
static struct node_element *tree_create_node_element(struct node *parent, int user_type);
@@ -463,10 +461,17 @@ struct node_element *tree_find_element(struct node *node, int user_type) {
*/
void tree_move_selected_nodes(struct tree *tree, struct node *destination, bool before) {
struct node *link;
+ struct node *test;
+ bool error;
tree_clear_processing(tree->root);
tree_selected_to_processing(tree->root);
- if (destination->processing) {
+
+ /* the destination node cannot be a child of any node with the processing flag set */
+ error = destination->processing;
+ for (test = destination; test; test = test->parent)
+ error |= test->processing;
+ if (error) {
tree_clear_processing(tree->root);
return;
}
@@ -778,7 +783,7 @@ void tree_link_node(struct node *link, struct node *node, bool before) {
assert(link);
assert(node);
-
+
if ((!link->folder) || (before)) {
node->parent = link->parent;
if (before) {
@@ -808,6 +813,7 @@ void tree_link_node(struct node *link, struct node *node, bool before) {
node->parent = link;
node->next = NULL;
}
+ node->deleted = false;
}
@@ -876,21 +882,25 @@ void tree_delete_node(struct tree *tree, struct node *node, bool siblings) {
next = node->next;
if (node->child)
tree_delete_node(tree, node->child, true);
+ node->child = NULL;
parent = node->parent;
tree_delink_node(node);
- for (element = &node->data; element; element = element->next) {
- if (element->text)
- free(element->text);
- if (element->sprite)
- free(element->sprite); /* \todo platform specific bits */
- }
- while (node->data.next) {
- element = node->data.next->next;
- free(node->data.next);
- node->data.next = element;
+ if (!node->retain_in_memory) {
+ for (element = &node->data; element; element = element->next) {
+ if (element->text)
+ free(element->text);
+ if (element->sprite)
+ free(element->sprite); /* \todo platform specific bits */
+ }
+ while (node->data.next) {
+ element = node->data.next->next;
+ free(node->data.next);
+ node->data.next = element;
+ }
+ free(node);
+ } else {
+ node->deleted = true;
}
- free(node);
-
if (!siblings)
node = NULL;
else
@@ -1011,6 +1021,51 @@ struct node *tree_create_URL_node(struct node *parent, const char *title,
/**
+ * Creates a tree entry for a URL, and links it into the tree.
+ *
+ * \param parent the node to link to
+ * \param title the node title
+ * \param url the node URL
+ * \param filetype the node filetype
+ * \param visit_date the date visited
+ * \return the node created, or NULL for failure
+ */
+struct node *tree_create_URL_node_brief(struct node *parent, const char *title,
+ const char *url, int filetype, int visit_date) {
+ struct node *node;
+ struct node_element *element;
+
+ assert(title);
+ assert(url);
+
+ node = tree_create_leaf_node(parent, title);
+ if (!node)
+ return NULL;
+ node->editable = false;
+
+ element = tree_create_node_element(node, TREE_ELEMENT_URL);
+ if (element) {
+ element->user_data = filetype;
+ element->type = NODE_ELEMENT_TEXT;
+ element->text = squash_whitespace(url);
+ }
+ element = tree_create_node_element(node, TREE_ELEMENT_VISITED);
+ if (element) {
+ element->type = NODE_ELEMENT_TEXT;
+ element->user_data = visit_date;
+ }
+
+ tree_update_URL_node(node);
+
+ node->expanded = true;
+ tree_recalculate_node(node, true);
+ node->expanded = false;
+
+ return node;
+}
+
+
+/**
* Resets all selected URL nodes from the tree.
*
* \param tree the tree to reset from
diff --git a/desktop/tree.h b/desktop/tree.h
index 670eb55f4..d2e1e5cfd 100644
--- a/desktop/tree.h
+++ b/desktop/tree.h
@@ -18,6 +18,7 @@
#define TREE_ELEMENT_ADDED 2
#define TREE_ELEMENT_LAST_VISIT 3
#define TREE_ELEMENT_VISITS 4
+#define TREE_ELEMENT_VISITED 5
#define NODE_INSTEP 40
@@ -55,6 +56,8 @@ struct node {
bool expanded; /* <-- Whether the node is expanded */
bool folder; /* <-- Whether the node is a folder */
bool editable; /* <-- Whether the node is editable */
+ bool retain_in_memory; /* <-- Whether the node remains in memory after deletion */
+ bool deleted; /* <-- Whether the node is currently deleted */
bool processing; /* <-- Internal flag used when moving */
struct node_element_box box; /* <-- Bounding box of all elements */
struct node_element data; /* <-- Data to display */
@@ -89,6 +92,8 @@ void tree_handle_node_changed(struct tree *tree, struct node *node,
bool recalculate_sizes, bool expansion);
void tree_handle_node_element_changed(struct tree *tree,
struct node_element *element);
+void tree_recalculate_node(struct node *node, bool recalculate_sizes);
+void tree_recalculate_node_positions(struct node *root);
struct node *tree_get_node_at(struct node *root, int x, int y, bool *furniture);
struct node_element *tree_get_node_element_at(struct node *node, int x, int y,
bool *furniture);
@@ -107,6 +112,8 @@ void tree_set_node_sprite(struct node *node, const char *sprite,
struct node *tree_create_URL_node(struct node *parent, const char *title,
const char *url, int filetype, int add_date, int last_date,
int visits);
+struct node *tree_create_URL_node_brief(struct node *parent, const char *title,
+ const char *url, int filetype, int visit_date);
void tree_reset_URL_nodes(struct tree *tree, struct node *node, bool selected);
void tree_set_node_expanded(struct node *node, bool expanded);
void tree_set_node_selected(struct tree *tree, struct node *node,