NetSurf
|
implementation of box tree manipulation. More...
#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <dom/dom.h>
#include "utils/nsoption.h"
#include "utils/log.h"
#include "utils/talloc.h"
#include "utils/nsurl.h"
#include "netsurf/misc.h"
#include "netsurf/content.h"
#include "netsurf/mouse.h"
#include "css/utils.h"
#include "css/dump.h"
#include "desktop/scrollbar.h"
#include "desktop/gui_internal.h"
#include "desktop/search.h"
#include "html/box.h"
#include "html/form_internal.h"
#include "html/html_internal.h"
#include "html/interaction.h"
Go to the source code of this file.
Macros | |
#define | box_is_float(box) |
Enumerations | |
enum | box_walk_dir { BOX_WALK_CHILDREN, BOX_WALK_PARENT, BOX_WALK_NEXT_SIBLING, BOX_WALK_FLOAT_CHILDREN, BOX_WALK_NEXT_FLOAT_SIBLING, BOX_WALK_FLOAT_CONTAINER } |
Direction to move in a box-tree walk. More... | |
Functions | |
static int | box_talloc_destructor (struct box *b) |
Destructor for box nodes which own styles. More... | |
struct box * | box_create (css_select_results *styles, css_computed_style *style, bool style_owned, nsurl *href, const char *target, const char *title, lwc_string *id, void *context) |
Create a box tree node. More... | |
void | box_add_child (struct box *parent, struct box *child) |
Add a child to a box tree node. More... | |
void | box_insert_sibling (struct box *box, struct box *new_box) |
Insert a new box as a sibling to a box in a tree. More... | |
void | box_unlink_and_free (struct box *box) |
Unlink a box from the box tree and then free it recursively. More... | |
void | box_free (struct box *box) |
Free a box tree recursively. More... | |
void | box_free_box (struct box *box) |
Free the data in a single box structure. More... | |
void | box_coords (struct box *box, int *x, int *y) |
Find the absolute coordinates of a box. More... | |
void | box_bounds (struct box *box, struct rect *r) |
Find the bounds of a box. More... | |
static bool | box_contains_point (const nscss_len_ctx *len_ctx, const struct box *box, int x, int y, bool *physically) |
Determine if a point lies within a box. More... | |
static struct box * | box_move_xy (struct box *b, enum box_walk_dir dir, int *x, int *y) |
Move from box to next box in given direction, adjusting for box coord change. More... | |
static struct box * | box_next_xy (struct box *b, int *x, int *y, bool skip_children) |
Itterator for walking to next box in interaction order. More... | |
struct box * | box_at_point (const nscss_len_ctx *len_ctx, struct box *box, const int x, const int y, int *box_x, int *box_y) |
Find the boxes at a point. More... | |
static bool | box_nearer_text_box (struct box *box, int bx, int by, int x, int y, int dir, struct box **nearest, int *tx, int *ty, int *nr_xd, int *nr_yd) |
Check whether box is nearer mouse coordinates than current nearest box. More... | |
static bool | box_nearest_text_box (struct box *box, int bx, int by, int fx, int fy, int x, int y, int dir, struct box **nearest, int *tx, int *ty, int *nr_xd, int *nr_yd) |
Pick the text box child of 'box' that is closest to and above-left (dir -ve) or below-right (dir +ve) of the point 'x,y'. More... | |
struct box * | box_pick_text_box (struct html_content *html, int x, int y, int dir, int *dx, int *dy) |
Peform pick text on browser window contents to locate the box under the mouse pointer, or nearest in the given direction if the pointer is not over a text box. More... | |
struct box * | box_find_by_id (struct box *box, lwc_string *id) |
Find a box based upon its id attribute. More... | |
bool | box_visible (struct box *box) |
Determine if a box is visible when the tree is rendered. More... | |
void | box_dump (FILE *stream, struct box *box, unsigned int depth, bool style) |
Print a box tree to a file. More... | |
nserror | box_handle_scrollbars (struct content *c, struct box *box, bool bottom, bool right) |
Applies the given scroll setup to a box. More... | |
bool | box_vscrollbar_present (const struct box *const box) |
Determine if a box has a vertical scrollbar. More... | |
bool | box_hscrollbar_present (const struct box *const box) |
Determine if a box has a horizontal scrollbar. More... | |
implementation of box tree manipulation.
Definition in file box.c.
#define box_is_float | ( | box | ) |
Definition at line 51 of file box.c.
Referenced by box_coords(), box_move_xy(), and box_next_xy().
enum box_walk_dir |
Add a child to a box tree node.
parent | box giving birth |
child | box to link as last child of parent |
Definition at line 173 of file box.c.
References box::children, box::last, box::next, parent, box::parent, and box::prev.
Referenced by box_construct_element(), box_construct_element_after(), box_construct_generate(), box_construct_text(), box_input(), box_input_text(), box_normalise_block(), box_normalise_table(), box_normalise_table_row(), box_normalise_table_row_group(), and box_select().
struct box* box_at_point | ( | const nscss_len_ctx * | len_ctx, |
struct box * | box, | ||
const int | x, | ||
const int | y, | ||
int * | box_x, | ||
int * | box_y | ||
) |
Find the boxes at a point.
len_ctx | CSS length conversion context for document. |
box | box to search children of |
x | point to find, in global document coordinates |
y | point to find, in global document coordinates |
box_x | position of box, in global document coordinates, updated to position of returned box, if any |
box_y | position of box, in global document coordinates, updated to position of returned box, if any |
To find all the boxes in the hierarchy at a certain point, use code like this:
Definition at line 621 of file box.c.
References box_contains_point(), box_next_xy(), box::scroll_x, box::scroll_y, and scrollbar_get_offset().
Referenced by get_mouse_action_node(), html_drop_file_at_point(), html_get_contextual_content(), and html_scroll_at_point().
Find the bounds of a box.
box | the box to calculate bounds of |
r | receives bounds |
Definition at line 281 of file box.c.
References BOTTOM, box_coords(), height, box::height, LEFT, box::padding, RIGHT, TOP, width, box::width, rect::x0, rect::x1, rect::y0, and rect::y1.
Referenced by browser_window_create_iframes(), and form_control_bounding_rect().
|
static |
Determine if a point lies within a box.
[in] | len_ctx | CSS length conversion context to use. |
[in] | box | Box to consider |
[in] | x | Coordinate relative to box |
[in] | y | Coordinate relative to box |
[out] | physically | If function returning true, physically is set true iff point is within the box's physical dimensions and false if the point is not within the box's physical dimensions but is in the area defined by the box's descendants. If function returns false, physically is undefined. |
This is a helper function for box_at_point().
Definition at line 312 of file box.c.
References box::border, BOTTOM, box::descendant_x0, box::descendant_y0, box::height, LEFT, box::list_marker, nscss_len2px(), box::padding, RIGHT, box::style, TOP, box_border::width, box::width, box::x, rect::x0, rect::x1, box::y, rect::y0, and rect::y1.
Referenced by box_at_point().
void box_coords | ( | struct box * | box, |
int * | x, | ||
int * | y | ||
) |
Find the absolute coordinates of a box.
box | the box to calculate coordinates of |
x | updated to x coordinate |
y | updated to y coordinate |
Definition at line 263 of file box.c.
References box_is_float, box::float_container, box::parent, box::scroll_x, box::scroll_y, scrollbar_get_offset(), box::x, and box::y.
Referenced by box_bounds(), box_textarea_callback(), form_select_menu_callback(), form_select_mouse_drag_end(), html__redraw_a_box(), html_box_drag_start(), html_drop_file_at_point(), html_get_id_offset(), html_object_callback(), html_overflow_scroll_drag_end(), html_redraw(), html_redraw_a_box(), html_set_focus(), layout_calculate_descendant_bboxes(), mouse_action_drag_content(), mouse_action_drag_scrollbar(), mouse_action_drag_textarea(), mouse_action_select_menu(), redraw_handler(), and search_text().
struct box* box_create | ( | css_select_results * | styles, |
css_computed_style * | style, | ||
bool | style_owned, | ||
struct nsurl * | href, | ||
const char * | target, | ||
const char * | title, | ||
lwc_string * | id, | ||
void * | context | ||
) |
Create a box tree node.
styles | selection results for the box, or NULL |
style | computed style for the box (not copied), or 0 |
style_owned | whether style is owned by this box |
href | href for the box (copied), or 0 |
target | target for the box (not copied), or 0 |
title | title for the box (not copied), or 0 |
id | id for the box (not copied), or 0 |
context | context for allocations |
styles is always owned by the box, if it is set. style is only owned by the box in the case of implied boxes.
Definition at line 103 of file box.c.
References box::background, box::border, BOX_INLINE, box_talloc_destructor(), box::byte_offset, box::cached_place_below_level, box::children, box::col, box::columns, box::descendant_x0, box::descendant_x1, box::descendant_y0, box::descendant_y1, box::flags, box::float_children, box::float_container, box::gadget, box::height, box::href, box::id, box::iframe, box::inline_end, box::last, box::length, box::list_marker, box::margin, box::max_width, box::min_width, box::next, box::next_float, box::node, nsurl_ref(), box::object, box::object_params, box::padding, box::parent, box::prev, box::rows, box::scroll_x, box::scroll_y, box::space, box::start_column, box::style, STYLE_OWNED, box::styles, talloc, talloc_set_destructor, box::target, box::text, box::title, box::type, UNKNOWN_MAX_WIDTH, UNKNOWN_WIDTH, box::usemap, box_border::width, box::width, box::x, and box::y.
Referenced by box_construct_element(), box_construct_element_after(), box_construct_generate(), box_construct_marker(), box_construct_text(), box_input(), box_input_text(), box_normalise_block(), box_normalise_table(), box_normalise_table_row(), box_normalise_table_row_group(), box_normalise_table_spans(), and box_select().
void box_dump | ( | FILE * | stream, |
struct box * | box, | ||
unsigned int | depth, | ||
bool | style | ||
) |
Print a box tree to a file.
Definition at line 905 of file box.c.
References BOTTOM, BOX_BLOCK, BOX_BR, box_dump(), BOX_FLOAT_LEFT, BOX_FLOAT_RIGHT, BOX_INLINE, BOX_INLINE_BLOCK, BOX_INLINE_CONTAINER, BOX_INLINE_END, BOX_TABLE, BOX_TABLE_CELL, BOX_TABLE_ROW, BOX_TABLE_ROW_GROUP, BOX_TEXT, box::byte_offset, box::children, box::col, box::columns, box::descendant_x0, box::descendant_x1, box::descendant_y0, box::descendant_y1, box::float_children, box::float_container, box::gadget, box::height, hlcache_handle_get_url(), box::href, box::id, box::iframe, box::inline_end, box::last, LEFT, box::length, box::list_marker, box::margin, column::max, box::max_width, column::min, box::min_width, box::next, box::next_float, box::node, nscss_dump_computed_style(), nsurl_access(), box::object, box::parent, column::positioned, box::prev, RIGHT, box::rows, box::space, box::start_column, box::style, box::target, box::text, box::title, TOP, column::type, box::type, UNKNOWN_MAX_WIDTH, column::width, box::width, box::x, and box::y.
Referenced by box_dump(), html_box_convert_done(), html_debug_dump(), layout_minmax_block(), and layout_minmax_table().
Find a box based upon its id attribute.
box | box tree to search |
id | id to look for |
Definition at line 873 of file box.c.
References box_find_by_id(), box::children, box::id, and box::next.
Referenced by box_find_by_id(), and html_get_id_offset().
void box_free | ( | struct box * | box | ) |
Free a box tree recursively.
box | box to free recursively |
The box and all its children is freed.
Definition at line 229 of file box.c.
References box_free(), box_free_box(), box::children, and box::next.
Referenced by box_free(), box_normalise_inline_container(), box_normalise_table(), and box_unlink_and_free().
void box_free_box | ( | struct box * | box | ) |
Free the data in a single box structure.
box | box to free |
Definition at line 245 of file box.c.
References CLONE, box::flags, form_free_control(), box::gadget, box::scroll_x, box::scroll_y, scrollbar_destroy(), box::styles, and talloc_free().
Referenced by box_free().
Applies the given scroll setup to a box.
This includes scroll creation/deletion as well as scroll dimension updates.
c | content in which the box is located |
box | the box to handle the scrolls for |
bottom | whether the horizontal scrollbar should be present |
right | whether the vertical scrollbar should be present |
Definition at line 1029 of file box.c.
References box::border, BOTTOM, html_scrollbar_data::box, html_scrollbar_data::c, box::descendant_x1, box::descendant_y1, box::height, html_overflow_scroll_callback(), LEFT, NSERROR_NOMEM, NSERROR_OK, box::padding, RIGHT, box::scroll_x, box::scroll_y, scrollbar_create(), scrollbar_destroy(), scrollbar_get_data(), scrollbar_make_pair(), scrollbar_set_extents(), SCROLLBAR_WIDTH, TOP, box_border::width, and box::width.
Referenced by html_redraw_box().
bool box_hscrollbar_present | ( | const struct box * | box | ) |
Determine if a box has a horizontal scrollbar.
box | scrolling box |
Definition at line 1137 of file box.c.
References box::border, box::descendant_x1, LEFT, box::padding, RIGHT, box_border::width, and box::width.
Referenced by html_redraw_box(), and layout_block_add_scrollbar().
|
static |
Move from box to next box in given direction, adjusting for box coord change.
b | box to move from from |
dir | direction to move in |
x | box's global x-coord, updated to position of next box |
y | box's global y-coord, updated to position of next box |
If no box can be found in given direction, NULL is returned.
Definition at line 447 of file box.c.
References box_is_float, BOX_WALK_CHILDREN, BOX_WALK_FLOAT_CHILDREN, BOX_WALK_FLOAT_CONTAINER, BOX_WALK_NEXT_FLOAT_SIBLING, BOX_WALK_NEXT_SIBLING, BOX_WALK_PARENT, box::children, box::float_children, box::float_container, box::next, box::next_float, box::parent, box::x, and box::y.
Referenced by box_next_xy().
|
static |
Check whether box is nearer mouse coordinates than current nearest box.
box | box to test |
bx | position of box, in global document coordinates |
by | position of box, in global document coordinates |
x | mouse point, in global document coordinates |
y | mouse point, in global document coordinates |
dir | direction in which to search (-1 = above-left, +1 = below-right) |
nearest | nearest text box found, or NULL if none updated if box is nearer than existing nearest |
tx | position of text_box, in global document coordinates updated if box is nearer than existing nearest |
ty | position of text_box, in global document coordinates updated if box is nearer than existing nearest |
nr_xd | distance to nearest text box found updated if box is nearer than existing nearest |
nr_yd | distance to nearest text box found updated if box is nearer than existing nearest |
Definition at line 674 of file box.c.
References BOTTOM, box::height, LEFT, box::list_marker, box::padding, box::parent, RIGHT, TOP, box::width, box::x, and box::y.
Referenced by box_nearest_text_box().
|
static |
Pick the text box child of 'box' that is closest to and above-left (dir -ve) or below-right (dir +ve) of the point 'x,y'.
box | parent box |
bx | position of box, in global document coordinates |
by | position of box, in global document coordinates |
fx | position of float parent, in global document coordinates |
fy | position of float parent, in global document coordinates |
x | mouse point, in global document coordinates |
y | mouse point, in global document coordinates |
dir | direction in which to search (-1 = above-left, +1 = below-right) |
nearest | nearest text box found, or NULL if none updated if a descendant of box is nearer than old nearest |
tx | position of nearest, in global document coordinates updated if a descendant of box is nearer than old nearest |
ty | position of nearest, in global document coordinates updated if a descendant of box is nearer than old nearest |
nr_xd | distance to nearest text box found updated if a descendant of box is nearer than old nearest |
nr_yd | distance to nearest text box found updated if a descendant of box is nearer than old nearest |
Definition at line 749 of file box.c.
References BOTTOM, BOX_FLOAT_LEFT, BOX_FLOAT_RIGHT, BOX_INLINE_CONTAINER, box_nearer_text_box(), box::children, box::float_children, box::height, LEFT, box::list_marker, box::next, box::object, box::padding, RIGHT, box::scroll_x, box::scroll_y, scrollbar_get_offset(), box::text, TOP, box::type, box::width, box::x, and box::y.
Referenced by box_pick_text_box().
Itterator for walking to next box in interaction order.
b | box to find next box from |
x | box's global x-coord, updated to position of next box |
y | box's global y-coord, updated to position of next box |
skip_children | whether to skip box's children |
This walks to a boxes float children before its children. When walking children, floating boxes are skipped.
Definition at line 528 of file box.c.
References box_is_float, box_move_xy(), BOX_WALK_CHILDREN, BOX_WALK_FLOAT_CHILDREN, BOX_WALK_FLOAT_CONTAINER, BOX_WALK_NEXT_FLOAT_SIBLING, BOX_WALK_NEXT_SIBLING, BOX_WALK_PARENT, box::next, box::parent, box::x, and box::y.
Referenced by box_at_point().
struct box* box_pick_text_box | ( | struct html_content * | html, |
int | x, | ||
int | y, | ||
int | dir, | ||
int * | dx, | ||
int * | dy | ||
) |
Peform pick text on browser window contents to locate the box under the mouse pointer, or nearest in the given direction if the pointer is not over a text box.
html | an HTML content |
x | coordinate of mouse |
y | coordinate of mouse |
dir | direction to search (-1 = above-left, +1 = below-right) |
dx | receives x ordinate of mouse relative to text box |
dy | receives y ordinate of mouse relative to text box |
Definition at line 821 of file box.c.
References BOTTOM, box_nearest_text_box(), box::height, html_content::layout, LEFT, box::margin, box::object, box::padding, RIGHT, box::text, TOP, and box::width.
Referenced by html_selection_drag_end(), and mouse_action_drag_selection().
|
static |
Destructor for box nodes which own styles.
b | The box being destroyed. |
Definition at line 60 of file box.c.
References box::flags, box::href, box::id, box::node, nsurl_unref(), box::scroll_x, box::scroll_y, scrollbar_destroy(), scrollbar_get_data(), box::style, STYLE_OWNED, and box::styles.
Referenced by box_create().
void box_unlink_and_free | ( | struct box * | box | ) |
Unlink a box from the box tree and then free it recursively.
box | box to unlink and free recursively. |
Definition at line 206 of file box.c.
References box_free(), box::children, box::last, box::next, parent, box::parent, and box::prev.
bool box_visible | ( | struct box * | box | ) |
Determine if a box is visible when the tree is rendered.
box | box to check |
Definition at line 893 of file box.c.
References box::style.
Referenced by html_object_callback().
bool box_vscrollbar_present | ( | const struct box * | box | ) |
Determine if a box has a vertical scrollbar.
box | scrolling box |
Definition at line 1129 of file box.c.
References box::border, BOTTOM, box::descendant_y1, box::height, box::padding, TOP, and box_border::width.
Referenced by html_redraw_box(), and layout_block_add_scrollbar().