[project @ 2005-12-31 04:37:56 by rjw]
Read URL data from url_store. Scroll items into view when expanding. svn path=/import/netsurf/; revision=1914
This commit is contained in:
parent
442f0e2a2c
commit
39e41ea386
158
desktop/tree.c
158
desktop/tree.c
|
@ -14,6 +14,7 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "netsurf/content/url_store.h"
|
||||
#include "netsurf/desktop/tree.h"
|
||||
#include "netsurf/desktop/options.h"
|
||||
#include "netsurf/utils/log.h"
|
||||
|
@ -21,10 +22,9 @@
|
|||
|
||||
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);
|
||||
static struct node_element *tree_create_node_element(struct node *parent, node_element_data data);
|
||||
static int tree_get_node_width(struct node *node);
|
||||
static int tree_get_node_height(struct node *node);
|
||||
static void tree_reset_URL_node(struct tree *tree, struct node *node);
|
||||
static void tree_handle_selection_area_node(struct tree *tree, struct node *node, int x, int y,
|
||||
int width, int height, bool invert);
|
||||
static void tree_selected_to_processing(struct node *node);
|
||||
|
@ -448,10 +448,10 @@ struct node_element *tree_get_node_element_at(struct node *node, int x, int y,
|
|||
* \param user_type the user_type to check for
|
||||
* \return the corresponding element
|
||||
*/
|
||||
struct node_element *tree_find_element(struct node *node, int user_type) {
|
||||
struct node_element *tree_find_element(struct node *node, node_element_data data) {
|
||||
struct node_element *element;
|
||||
for (element = &node->data; element; element = element->next)
|
||||
if (element->user_type == user_type) return element;
|
||||
if (element->data == data) return element;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -891,8 +891,13 @@ void tree_delete_node(struct tree *tree, struct node *node, bool siblings) {
|
|||
tree_delink_node(node);
|
||||
if (!node->retain_in_memory) {
|
||||
for (element = &node->data; element; element = element->next) {
|
||||
if (element->text)
|
||||
free(element->text);
|
||||
if (element->text) {
|
||||
/* we don't free non-editable titles or URLs */
|
||||
if ((node->editable) ||
|
||||
((node->data.data != TREE_ELEMENT_TITLE) &&
|
||||
(node->data.data != TREE_ELEMENT_URL)))
|
||||
free(element->text);
|
||||
}
|
||||
if (element->sprite)
|
||||
free(element->sprite); /* \todo platform specific bits */
|
||||
}
|
||||
|
@ -961,6 +966,7 @@ struct node *tree_create_leaf_node(struct node *parent, const char *title) {
|
|||
node->data.parent = node;
|
||||
node->data.type = NODE_ELEMENT_TEXT;
|
||||
node->data.text = squash_whitespace(title);
|
||||
node->data.data = TREE_ELEMENT_TITLE;
|
||||
if (parent)
|
||||
tree_link_node(parent, node, false);
|
||||
return node;
|
||||
|
@ -970,50 +976,37 @@ struct node *tree_create_leaf_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 add_date the date added
|
||||
* \param last_date the last visited date
|
||||
* \param visits the number of visits
|
||||
* \param data the URL data to use
|
||||
* \param title the custom title to use
|
||||
* \return the node created, or NULL for failure
|
||||
*/
|
||||
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(struct node *parent, struct url_content *data,
|
||||
char *title) {
|
||||
struct node *node;
|
||||
struct node_element *element;
|
||||
|
||||
assert(url);
|
||||
if (!title)
|
||||
title = url;
|
||||
assert(data);
|
||||
|
||||
if (!title) {
|
||||
if (data->title)
|
||||
title = strdup(data->title);
|
||||
else
|
||||
title = strdup(data->url);
|
||||
if (!title)
|
||||
return NULL;
|
||||
}
|
||||
node = tree_create_leaf_node(parent, title);
|
||||
if (!node)
|
||||
return NULL;
|
||||
node->editable = true;
|
||||
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_URL);
|
||||
if (element) {
|
||||
element->user_data = filetype;
|
||||
element->type = NODE_ELEMENT_TEXT;
|
||||
element->text = strdup(url);
|
||||
}
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_ADDED);
|
||||
if (element) {
|
||||
element->type = NODE_ELEMENT_TEXT;
|
||||
element->user_data = add_date;
|
||||
}
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_LAST_VISIT);
|
||||
if (element) {
|
||||
element->type = NODE_ELEMENT_TEXT;
|
||||
element->user_data = last_date;
|
||||
}
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_VISITS);
|
||||
if (element) {
|
||||
element->type = NODE_ELEMENT_TEXT;
|
||||
element->user_data = visits;
|
||||
}
|
||||
if (element)
|
||||
element->text = strdup(data->url);
|
||||
tree_create_node_element(node, TREE_ELEMENT_LAST_VISIT);
|
||||
tree_create_node_element(node, TREE_ELEMENT_VISITS);
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_THUMBNAIL);
|
||||
if (element)
|
||||
element->type = NODE_ELEMENT_THUMBNAIL;
|
||||
|
@ -1028,42 +1021,39 @@ 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.
|
||||
*
|
||||
* All information is used directly from the url_content, and as such cannot be
|
||||
* edited and should never be freed.
|
||||
*
|
||||
* \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
|
||||
* \param data the URL data to use
|
||||
* \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 *tree_create_URL_node_shared(struct node *parent, struct url_content *data) {
|
||||
struct node *node;
|
||||
struct node_element *element;
|
||||
char *title;
|
||||
|
||||
assert(url);
|
||||
if (!title)
|
||||
title = url;
|
||||
assert(data);
|
||||
|
||||
if (data->title)
|
||||
title = data->title;
|
||||
else
|
||||
title = data->url;
|
||||
node = tree_create_leaf_node(parent, title);
|
||||
if (!node)
|
||||
return NULL;
|
||||
free(node->data.text);
|
||||
node->data.text = title;
|
||||
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;
|
||||
}
|
||||
if (element)
|
||||
element->text = data->url;
|
||||
tree_create_node_element(node, TREE_ELEMENT_LAST_VISIT);
|
||||
tree_create_node_element(node, TREE_ELEMENT_VISITS);
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_THUMBNAIL);
|
||||
if (element) {
|
||||
if (element)
|
||||
element->type = NODE_ELEMENT_THUMBNAIL;
|
||||
}
|
||||
|
||||
tree_update_URL_node(node);
|
||||
tree_recalculate_node(node, false);
|
||||
|
@ -1073,56 +1063,13 @@ struct node *tree_create_URL_node_brief(struct node *parent, const char *title,
|
|||
|
||||
|
||||
/**
|
||||
* Resets all selected URL nodes from the tree.
|
||||
*
|
||||
* \param tree the tree to reset from
|
||||
* \param node the node to reset
|
||||
* \param selected whether to only reset selected nodes
|
||||
*/
|
||||
void tree_reset_URL_nodes(struct tree *tree, struct node *node, bool selected) {
|
||||
for (; node; node = node->next) {
|
||||
if (((node->selected) || (!selected)) && (!node->folder))
|
||||
tree_reset_URL_node(tree, node);
|
||||
if (node->child)
|
||||
tree_reset_URL_nodes(tree, node->child,
|
||||
((!node->selected) && selected));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets a tree entry for a URL
|
||||
*/
|
||||
void tree_reset_URL_node(struct tree *tree, struct node *node) {
|
||||
struct node_element *element;
|
||||
|
||||
assert(tree);
|
||||
assert(node);
|
||||
|
||||
element = tree_find_element(node, TREE_ELEMENT_LAST_VISIT);
|
||||
if (element)
|
||||
element->user_data = -1;
|
||||
element = tree_find_element(node, TREE_ELEMENT_VISITS);
|
||||
if (element)
|
||||
element->user_data = 0;
|
||||
tree_update_URL_node(node);
|
||||
tree_recalculate_node(node, true);
|
||||
|
||||
if (node->expanded)
|
||||
tree_redraw_area(tree, node->box.x, node->box.y + node->data.box.height,
|
||||
node->box.width, node->box.height - node->data.box.height);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates an empty node element and links it to a node.
|
||||
* Creates an empty text node element and links it to a node.
|
||||
*
|
||||
* \param parent the parent node
|
||||
* \param user_type the required user_type
|
||||
* \return the newly created element.
|
||||
*/
|
||||
struct node_element *tree_create_node_element(struct node *parent, int user_type) {
|
||||
struct node_element *tree_create_node_element(struct node *parent, node_element_data data) {
|
||||
struct node_element *element;
|
||||
struct node_element *link;
|
||||
|
||||
|
@ -1131,9 +1078,10 @@ struct node_element *tree_create_node_element(struct node *parent, int user_type
|
|||
element = calloc(sizeof(struct node_element), 1);
|
||||
if (!element) return NULL;
|
||||
element->parent = parent;
|
||||
element->user_type = user_type;
|
||||
element->data = data;
|
||||
element->type = NODE_ELEMENT_TEXT;
|
||||
|
||||
for (link = parent->data.next; ((link) && (link->user_type < user_type));
|
||||
for (link = parent->data.next; ((link) && (link->data < data));
|
||||
link = link->next);
|
||||
if (link) {
|
||||
element->next = link->next;
|
||||
|
|
|
@ -13,13 +13,17 @@
|
|||
#define _NETSURF_DESKTOP_TREE_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "netsurf/content/url_store.h"
|
||||
|
||||
#define TREE_ELEMENT_URL 1
|
||||
#define TREE_ELEMENT_ADDED 2
|
||||
#define TREE_ELEMENT_LAST_VISIT 3
|
||||
#define TREE_ELEMENT_VISITS 4
|
||||
#define TREE_ELEMENT_VISITED 5
|
||||
#define TREE_ELEMENT_THUMBNAIL 6
|
||||
typedef enum {
|
||||
TREE_ELEMENT_URL,
|
||||
TREE_ELEMENT_ADDED,
|
||||
TREE_ELEMENT_LAST_VISIT,
|
||||
TREE_ELEMENT_VISITS,
|
||||
TREE_ELEMENT_VISITED,
|
||||
TREE_ELEMENT_THUMBNAIL,
|
||||
TREE_ELEMENT_TITLE
|
||||
} node_element_data;
|
||||
|
||||
#define NODE_INSTEP 40
|
||||
|
||||
|
@ -49,8 +53,7 @@ struct node_element {
|
|||
char *text; /* <-- Text for the element */
|
||||
struct node_sprite *sprite; /* <-- Sprite for the element */
|
||||
struct node_element *next; /* <-- Next node element */
|
||||
int user_data; /* <-- Private user data */
|
||||
int user_type; /* <-- Private user data */
|
||||
node_element_data data; /* <-- Data being represented */
|
||||
};
|
||||
|
||||
|
||||
|
@ -101,7 +104,7 @@ 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);
|
||||
struct node_element *tree_find_element(struct node *node, int user_type);
|
||||
struct node_element *tree_find_element(struct node *node, node_element_data data);
|
||||
void tree_move_selected_nodes(struct tree *tree, struct node *destination,
|
||||
bool before);
|
||||
bool tree_has_selection(struct node *node);
|
||||
|
@ -113,12 +116,9 @@ struct node *tree_create_folder_node(struct node *parent, const char *title);
|
|||
struct node *tree_create_leaf_node(struct node *parent, const char *title);
|
||||
void tree_set_node_sprite(struct node *node, const char *sprite,
|
||||
const char *expanded);
|
||||
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);
|
||||
struct node *tree_create_URL_node(struct node *parent, struct url_content *data,
|
||||
char *title);
|
||||
struct node *tree_create_URL_node_shared(struct node *parent, struct url_content *data);
|
||||
void tree_set_node_expanded(struct node *node, bool expanded);
|
||||
void tree_set_node_selected(struct tree *tree, struct node *node,
|
||||
bool selected);
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "netsurf/desktop/browser.h"
|
||||
#include "netsurf/desktop/tree.h"
|
||||
#include "netsurf/riscos/bitmap.h"
|
||||
#include "netsurf/riscos/dialog.h"
|
||||
#include "netsurf/riscos/gui.h"
|
||||
#include "netsurf/riscos/image.h"
|
||||
#include "netsurf/riscos/menus.h"
|
||||
|
@ -31,6 +32,7 @@
|
|||
#include "netsurf/riscos/tinct.h"
|
||||
#include "netsurf/riscos/treeview.h"
|
||||
#include "netsurf/riscos/wimp.h"
|
||||
#include "netsurf/riscos/wimp_event.h"
|
||||
#include "netsurf/utils/log.h"
|
||||
#include "netsurf/utils/messages.h"
|
||||
#include "netsurf/utils/utils.h"
|
||||
|
@ -458,8 +460,12 @@ void tree_recalculate_node_element(struct node_element *element) {
|
|||
if (url_element)
|
||||
bitmap = url_store_get_thumbnail(url_element->text);
|
||||
if (bitmap) {
|
||||
/* if ((bitmap->width == 0) && (bitmap->height == 0))
|
||||
frame = bitmap_get_buffer(bitmap);
|
||||
element->box.width = bitmap->width * 2 + 2;
|
||||
element->box.height = bitmap->height * 2 + 4;
|
||||
*/ element->box.width = THUMBNAIL_WIDTH * 2 + 2;
|
||||
element->box.height = THUMBNAIL_HEIGHT * 2 + 4;
|
||||
} else {
|
||||
element->box.width = 0;
|
||||
element->box.height = 0;
|
||||
|
@ -510,76 +516,52 @@ void tree_set_node_sprite_folder(struct node *node) {
|
|||
* \param node the node to update
|
||||
*/
|
||||
void tree_update_URL_node(struct node *node) {
|
||||
struct url_content *data;
|
||||
struct node_element *element;
|
||||
char buffer[256];
|
||||
|
||||
assert(node);
|
||||
|
||||
element = tree_find_element(node, TREE_ELEMENT_URL);
|
||||
if (!element)
|
||||
return;
|
||||
data = url_store_find(element->text);
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
/* data may have moved */
|
||||
if (!node->editable) {
|
||||
if (data->title)
|
||||
node->data.text = data->title;
|
||||
else
|
||||
node->data.text = data->url;
|
||||
}
|
||||
if (element) {
|
||||
sprintf(buffer, "small_%.3x", element->user_data);
|
||||
sprintf(buffer, "small_%.3x", ro_content_filetype_from_type(data->type));
|
||||
if (ro_gui_wimp_sprite_exists(buffer))
|
||||
tree_set_node_sprite(node, buffer, buffer);
|
||||
else
|
||||
tree_set_node_sprite(node, "small_xxx", "small_xxx");
|
||||
}
|
||||
|
||||
element = tree_find_element(node, TREE_ELEMENT_ADDED);
|
||||
if (element) {
|
||||
if (element->text) {
|
||||
free(element->text);
|
||||
element->text = NULL;
|
||||
}
|
||||
if (element->user_data > 0) {
|
||||
snprintf(buffer, 256, messages_get("TreeAdded"),
|
||||
ctime((time_t *)&element->user_data));
|
||||
} else {
|
||||
snprintf(buffer, 256, messages_get("TreeAdded"),
|
||||
messages_get("TreeUnknown"));
|
||||
}
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
|
||||
element = tree_find_element(node, TREE_ELEMENT_LAST_VISIT);
|
||||
if (element) {
|
||||
if (element->text) {
|
||||
free(element->text);
|
||||
element->text = NULL;
|
||||
}
|
||||
if (element->user_data > 0) {
|
||||
if (data->last_visit > 0) {
|
||||
snprintf(buffer, 256, messages_get("TreeLast"),
|
||||
ctime((time_t *)&element->user_data));
|
||||
ctime((time_t *)&data->last_visit));
|
||||
} else {
|
||||
snprintf(buffer, 256, messages_get("TreeLast"),
|
||||
messages_get("TreeUnknown"));
|
||||
}
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
|
||||
element = tree_find_element(node, TREE_ELEMENT_VISITED);
|
||||
if (element) {
|
||||
if (element->text) {
|
||||
free(element->text);
|
||||
element->text = NULL;
|
||||
}
|
||||
if (element->user_data > 0) {
|
||||
snprintf(buffer, 256, messages_get("TreeVisited"),
|
||||
ctime((time_t *)&element->user_data));
|
||||
} else {
|
||||
snprintf(buffer, 256, messages_get("TreeVisited"),
|
||||
messages_get("TreeUnknown"));
|
||||
}
|
||||
free(element->text);
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
|
||||
element = tree_find_element(node, TREE_ELEMENT_VISITS);
|
||||
if (element) {
|
||||
if (element->text) {
|
||||
free(element->text);
|
||||
element->text = NULL;
|
||||
}
|
||||
snprintf(buffer, 256, messages_get("TreeVisits"),
|
||||
element->user_data);
|
||||
data->visits);
|
||||
free(element->text);
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
}
|
||||
|
@ -606,7 +588,7 @@ void tree_resized(struct tree *tree) {
|
|||
return;
|
||||
}
|
||||
if (state.flags & wimp_WINDOW_OPEN)
|
||||
ro_gui_tree_open((wimp_open *)&state, tree);
|
||||
ro_gui_tree_open((wimp_open *)&state);
|
||||
}
|
||||
|
||||
|
||||
|
@ -616,10 +598,14 @@ void tree_resized(struct tree *tree) {
|
|||
* \param redraw the area to redraw
|
||||
* \param tree the tree to redraw
|
||||
*/
|
||||
void ro_gui_tree_redraw(wimp_draw *redraw, struct tree *tree) {
|
||||
void ro_gui_tree_redraw(wimp_draw *redraw) {
|
||||
struct tree *tree;
|
||||
osbool more;
|
||||
int clip_x0, clip_x1, clip_y0, clip_y1, origin_x, origin_y;
|
||||
|
||||
tree = (struct tree *)ro_gui_wimp_event_get_user_data(redraw->w);
|
||||
|
||||
assert(tree);
|
||||
|
||||
more = wimp_redraw_window(redraw);
|
||||
while (more) {
|
||||
|
@ -644,11 +630,12 @@ void ro_gui_tree_redraw(wimp_draw *redraw, struct tree *tree) {
|
|||
*
|
||||
* \param pointer the pointer state
|
||||
* \param tree the tree to handle a click for
|
||||
* \return whether the click was handled#
|
||||
* \return whether the click was handled
|
||||
*/
|
||||
bool ro_gui_tree_click(wimp_pointer *pointer, struct tree *tree) {
|
||||
bool furniture;
|
||||
struct node *node;
|
||||
struct node *last;
|
||||
struct node_element *element;
|
||||
int x, y;
|
||||
int alt_pressed = 0;
|
||||
|
@ -769,6 +756,24 @@ bool ro_gui_tree_click(wimp_pointer *pointer, struct tree *tree) {
|
|||
if (!furniture)
|
||||
node->selected = false;
|
||||
tree_handle_node_changed(tree, node, false, true);
|
||||
|
||||
/* find the last child node if expanded */
|
||||
last = node;
|
||||
if ((last->child) && (last->expanded)) {
|
||||
last = last->child;
|
||||
while ((last->next) || ((last->child) && (last->expanded))) {
|
||||
if (last->next)
|
||||
last = last->next;
|
||||
else
|
||||
last = last->child;
|
||||
}
|
||||
}
|
||||
/* scroll to the bottom element then back to the top */
|
||||
element = &last->data;
|
||||
if (last->expanded)
|
||||
for (; element->next; element = element->next);
|
||||
ro_gui_tree_scroll_visible(tree, element);
|
||||
ro_gui_tree_scroll_visible(tree, &node->data);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -777,8 +782,9 @@ bool ro_gui_tree_click(wimp_pointer *pointer, struct tree *tree) {
|
|||
return true;
|
||||
|
||||
/* single/double alt+click starts editing */
|
||||
if ((node->editable) && (!tree->editing) && ((element->user_type == 0) ||
|
||||
(element->user_type == TREE_ELEMENT_URL)) &&
|
||||
if ((node->editable) && (!tree->editing) &&
|
||||
((element->data == TREE_ELEMENT_URL) ||
|
||||
(element->data == TREE_ELEMENT_TITLE)) &&
|
||||
((pointer->buttons == wimp_CLICK_SELECT) ||
|
||||
(pointer->buttons == (wimp_CLICK_SELECT << 8)))) {
|
||||
xosbyte1(osbyte_SCAN_KEYBOARD, 2 ^ 0x80, 0, &alt_pressed);
|
||||
|
@ -795,7 +801,7 @@ bool ro_gui_tree_click(wimp_pointer *pointer, struct tree *tree) {
|
|||
if (!ro_gui_tree_launch_node(node))
|
||||
return false;
|
||||
if (pointer->buttons == wimp_CLICK_ADJUST)
|
||||
ro_gui_tree_keypress(wimp_KEY_CONTROL + wimp_KEY_F2, tree);
|
||||
ro_gui_dialog_close((wimp_w)tree->handle);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -849,13 +855,9 @@ bool ro_gui_tree_click(wimp_pointer *pointer, struct tree *tree) {
|
|||
else
|
||||
sprintf(ro_gui_tree_drag_name, "directory");
|
||||
} else {
|
||||
element = tree_find_element(node, TREE_ELEMENT_URL);
|
||||
if (element) {
|
||||
sprintf(ro_gui_tree_drag_name, "file_%.3x",
|
||||
element->user_data);
|
||||
} else {
|
||||
sprintf(ro_gui_tree_drag_name, "file_xxx");
|
||||
}
|
||||
/* small_xxx -> file_xxx */
|
||||
sprintf(ro_gui_tree_drag_name, "file_%s",
|
||||
node->data.sprite->name + 6);
|
||||
if (!ro_gui_wimp_sprite_exists(ro_gui_tree_drag_name))
|
||||
sprintf(ro_gui_tree_drag_name, "file_xxx");
|
||||
}
|
||||
|
@ -902,20 +904,27 @@ void ro_gui_tree_menu_closed(struct tree *tree) {
|
|||
*
|
||||
* \param pointer the pointer state
|
||||
*/
|
||||
void ro_gui_tree_toolbar_click(wimp_pointer* pointer, struct tree *tree) {
|
||||
bool ro_gui_tree_toolbar_click(wimp_pointer* pointer) {
|
||||
struct node *node;
|
||||
|
||||
struct toolbar *toolbar =
|
||||
(struct toolbar *)ro_gui_wimp_event_get_user_data(pointer->w);
|
||||
assert(toolbar);
|
||||
struct tree *tree =
|
||||
(struct tree *)ro_gui_wimp_event_get_user_data(toolbar->parent_handle);
|
||||
assert(tree);
|
||||
|
||||
ro_gui_tree_stop_edit(tree);
|
||||
|
||||
if (pointer->buttons == wimp_CLICK_MENU) {
|
||||
ro_gui_menu_create(tree_toolbar_menu, pointer->pos.x,
|
||||
pointer->pos.y, (wimp_w)tree->handle);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (tree->toolbar->editor) {
|
||||
ro_gui_theme_toolbar_editor_click(tree->toolbar, pointer);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (pointer->i) {
|
||||
|
@ -938,14 +947,15 @@ void ro_gui_tree_toolbar_click(wimp_pointer* pointer, struct tree *tree) {
|
|||
false, true);
|
||||
break;
|
||||
case ICON_TOOLBAR_DELETE:
|
||||
tree_delete_selected_nodes(tree,
|
||||
tree->root);
|
||||
ro_gui_menu_handle_action((wimp_w)tree->handle,
|
||||
TREE_SELECTION_DELETE, false);
|
||||
break;
|
||||
case ICON_TOOLBAR_LAUNCH:
|
||||
ro_gui_tree_launch_selected(tree);
|
||||
ro_gui_menu_handle_action((wimp_w)tree->handle,
|
||||
TREE_SELECTION_LAUNCH, false);
|
||||
break;
|
||||
}
|
||||
ro_gui_menu_prepare_action((wimp_w)tree->handle, TREE_SELECTION, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -962,6 +972,7 @@ void ro_gui_tree_start_edit(struct tree *tree, struct node_element *element,
|
|||
wimp_window_state state;
|
||||
struct node *parent;
|
||||
int toolbar_height = 0;
|
||||
int caret_x, caret_height, caret_index;
|
||||
|
||||
assert(tree);
|
||||
assert(element);
|
||||
|
@ -1006,15 +1017,17 @@ void ro_gui_tree_start_edit(struct tree *tree, struct node_element *element,
|
|||
if (error)
|
||||
LOG(("xwimp_get_window_state: 0x%x: %s",
|
||||
error->errnum, error->errmess));
|
||||
error = xwimp_set_caret_position((wimp_w)tree->handle,
|
||||
(wimp_i)tree->edit_handle,
|
||||
pointer->pos.x - state.visible.x0, 0,
|
||||
element->box.height, -1);
|
||||
caret_x = pointer->pos.x - state.visible.x0;
|
||||
caret_height = element->box.height;
|
||||
caret_index = -1;
|
||||
} else {
|
||||
error = xwimp_set_caret_position((wimp_w)tree->handle,
|
||||
(wimp_i)tree->edit_handle,
|
||||
0, 0, -1, strlen(tree->edit_buffer));
|
||||
caret_x = 0;
|
||||
caret_height = -1;
|
||||
caret_index = strlen(tree->edit_buffer);
|
||||
}
|
||||
error = xwimp_set_caret_position((wimp_w)tree->handle,
|
||||
(wimp_i)tree->edit_handle,
|
||||
caret_x, 0, caret_height, caret_index);
|
||||
if (error)
|
||||
LOG(("xwimp_set_caret_position: 0x%x: %s",
|
||||
error->errnum, error->errmess));
|
||||
|
@ -1090,7 +1103,7 @@ void ro_gui_tree_scroll_visible(struct tree *tree, struct node_element *element)
|
|||
state.yscroll = state.visible.y1 - state.visible.y0 -
|
||||
tree->offset_y - toolbar_height -
|
||||
(element->box.y + element->box.height);
|
||||
ro_gui_tree_open((wimp_open *)&state, tree);
|
||||
ro_gui_tree_open((wimp_open *)&state);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1098,73 +1111,24 @@ void ro_gui_tree_scroll_visible(struct tree *tree, struct node_element *element)
|
|||
* Shows the a tree window.
|
||||
*/
|
||||
void ro_gui_tree_show(struct tree *tree) {
|
||||
os_error *error;
|
||||
int screen_width, screen_height;
|
||||
wimp_window_state state;
|
||||
int dimension;
|
||||
int scroll_width;
|
||||
struct toolbar *toolbar;
|
||||
|
||||
/* We may have failed to initialise
|
||||
*/
|
||||
/* we may have failed to initialise */
|
||||
if (!tree) return;
|
||||
toolbar = tree->toolbar;
|
||||
|
||||
/* Get the window state
|
||||
*/
|
||||
state.w = (wimp_w)tree->handle;
|
||||
error = xwimp_get_window_state(&state);
|
||||
if (error) {
|
||||
warn_user("WimpError", error->errmess);
|
||||
return;
|
||||
}
|
||||
|
||||
/* If we're open we jump to the top of the stack, if not then we
|
||||
open in the centre of the screen.
|
||||
*/
|
||||
if (!(state.flags & wimp_WINDOW_OPEN)) {
|
||||
|
||||
/* Cancel any editing
|
||||
*/
|
||||
if ((tree->toolbar) && (tree->toolbar->editor))
|
||||
ro_gui_theme_toggle_edit(tree->toolbar);
|
||||
/* handle first time opening */
|
||||
if (!ro_gui_dialog_open_top((wimp_w)tree->handle, toolbar, 600, 800)) {
|
||||
ro_gui_tree_stop_edit(tree);
|
||||
|
||||
/* Set the default state
|
||||
*/
|
||||
if (tree->root->child) {
|
||||
tree_set_node_selected(tree, tree->root, false);
|
||||
tree_handle_node_changed(tree, tree->root,
|
||||
false, true);
|
||||
}
|
||||
|
||||
/* Get the current screen size
|
||||
*/
|
||||
ro_gui_screen_size(&screen_width, &screen_height);
|
||||
|
||||
/* Move to the centre
|
||||
*/
|
||||
dimension = 600; /*state.visible.x1 - state.visible.x0;*/
|
||||
scroll_width = ro_get_vscroll_width((wimp_w)tree->handle);
|
||||
state.visible.x0 = (screen_width - (dimension + scroll_width)) / 2;
|
||||
state.visible.x1 = state.visible.x0 + dimension;
|
||||
dimension = 800; /*state.visible.y1 - state.visible.y0;*/
|
||||
state.visible.y0 = (screen_height - dimension) / 2;
|
||||
state.visible.y1 = state.visible.y0 + dimension;
|
||||
state.xscroll = 0;
|
||||
state.yscroll = 0;
|
||||
if (toolbar)
|
||||
state.yscroll = ro_gui_theme_toolbar_height(toolbar);
|
||||
}
|
||||
|
||||
/* Open the window at the top of the stack
|
||||
*/
|
||||
state.next = wimp_TOP;
|
||||
ro_gui_tree_open((wimp_open*)&state, tree);
|
||||
|
||||
/* Set the caret position
|
||||
*/
|
||||
xwimp_set_caret_position(state.w, -1, -100, -100, 32, -1);
|
||||
/* set the caret position */
|
||||
xwimp_set_caret_position((wimp_w)tree->handle, -1, -100, -100, 32, -1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1172,14 +1136,16 @@ void ro_gui_tree_show(struct tree *tree) {
|
|||
* Handles a window open request
|
||||
*
|
||||
* \param open the window state
|
||||
* \param tree the tree to handle a request for
|
||||
*/
|
||||
void ro_gui_tree_open(wimp_open *open, struct tree *tree) {
|
||||
void ro_gui_tree_open(wimp_open *open) {
|
||||
struct tree *tree;
|
||||
os_error *error;
|
||||
int width;
|
||||
int height;
|
||||
int toolbar_height = 0;
|
||||
|
||||
tree = (struct tree *)ro_gui_wimp_event_get_user_data(open->w);
|
||||
|
||||
if (!tree)
|
||||
return;
|
||||
if (tree->toolbar)
|
||||
|
@ -1223,34 +1189,28 @@ void ro_gui_tree_open(wimp_open *open, struct tree *tree) {
|
|||
* \param tree the tree to handle a keypress for
|
||||
* \return whether the key was processed
|
||||
*/
|
||||
bool ro_gui_tree_keypress(int key, struct tree *tree) {
|
||||
os_error *error;
|
||||
bool ro_gui_tree_keypress(wimp_key *key) {
|
||||
char *new_string;
|
||||
struct tree *tree;
|
||||
|
||||
tree = (struct tree *)ro_gui_wimp_event_get_user_data(key->w);
|
||||
if (!tree)
|
||||
return false;
|
||||
|
||||
/* Handle basic keys
|
||||
*/
|
||||
switch (key) {
|
||||
switch (key->c) {
|
||||
case 1: /* CTRL+A */
|
||||
ro_gui_tree_stop_edit(tree);
|
||||
if (tree->root->child) {
|
||||
tree->temp_selection = NULL;
|
||||
tree_set_node_selected(tree, tree->root, true);
|
||||
}
|
||||
ro_gui_menu_prepare_action((wimp_w)tree->handle,
|
||||
TREE_SELECTION, true);
|
||||
ro_gui_menu_handle_action((wimp_w)tree->handle,
|
||||
TREE_SELECT_ALL, false);
|
||||
return true;
|
||||
case 24: /* CTRL+X */
|
||||
ro_gui_tree_stop_edit(tree);
|
||||
tree_delete_selected_nodes(tree, tree->root);
|
||||
ro_gui_menu_prepare_action((wimp_w)tree->handle,
|
||||
TREE_SELECTION, true);
|
||||
ro_gui_menu_handle_action((wimp_w)tree->handle,
|
||||
TREE_SELECTION_DELETE, false);
|
||||
return true;
|
||||
case 26: /* CTRL+Z */
|
||||
tree->temp_selection = NULL;
|
||||
ro_gui_tree_stop_edit(tree);
|
||||
tree_set_node_selected(tree, tree->root, false);
|
||||
ro_gui_menu_prepare_action((wimp_w)tree->handle,
|
||||
TREE_SELECTION, true);
|
||||
ro_gui_menu_handle_action((wimp_w)tree->handle,
|
||||
TREE_CLEAR_SELECTION, false);
|
||||
return true;
|
||||
case wimp_KEY_RETURN:
|
||||
if (tree->editing) {
|
||||
|
@ -1268,18 +1228,13 @@ bool ro_gui_tree_keypress(int key, struct tree *tree) {
|
|||
ro_gui_tree_launch_selected(tree);
|
||||
}
|
||||
return true;
|
||||
case wimp_KEY_CONTROL + wimp_KEY_F2:
|
||||
error = xwimp_close_window((wimp_w)tree->handle);
|
||||
if (error)
|
||||
LOG(("xwimp_close_window: 0x%x: %s",
|
||||
error->errnum, error->errmess));
|
||||
return true;
|
||||
case wimp_KEY_ESCAPE:
|
||||
if (tree->editing) {
|
||||
ro_gui_tree_stop_edit(tree);
|
||||
} else {
|
||||
/* \todo cancel drags etc. */
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -28,14 +28,14 @@ struct node_sprite {
|
|||
};
|
||||
|
||||
bool ro_gui_tree_initialise(void);
|
||||
void ro_gui_tree_redraw(wimp_draw *redraw, struct tree *tree);
|
||||
void ro_gui_tree_redraw(wimp_draw *redraw);
|
||||
bool ro_gui_tree_click(wimp_pointer *pointer, struct tree *tree);
|
||||
void ro_gui_tree_menu_closed(struct tree *tree);
|
||||
void ro_gui_tree_toolbar_click(wimp_pointer* pointer, struct tree *tree);
|
||||
bool ro_gui_tree_toolbar_click(wimp_pointer* pointer);
|
||||
void ro_gui_tree_stop_edit(struct tree *tree);
|
||||
void ro_gui_tree_open(wimp_open *open, struct tree *tree);
|
||||
void ro_gui_tree_open(wimp_open *open);
|
||||
void ro_gui_tree_show(struct tree *tree);
|
||||
bool ro_gui_tree_keypress(int key, struct tree *tree);
|
||||
bool ro_gui_tree_keypress(wimp_key *key);
|
||||
void ro_gui_tree_selection_drag_end(wimp_dragged *drag);
|
||||
void ro_gui_tree_move_drag_end(wimp_dragged *drag);
|
||||
void ro_gui_tree_launch_selected(struct tree *tree);
|
||||
|
|
Loading…
Reference in New Issue