#ifndef EL__DOCUMENT_DOCUMENT_H #define EL__DOCUMENT_DOCUMENT_H #include "document/options.h" #include "intl/charsets.h" /* unicode_val_T */ #include "main/object.h" #include "main/timer.h" #include "protocol/uri.h" #include "util/color.h" #include "util/lists.h" #include "util/box.h" #ifdef __cplusplus extern "C" { #endif struct cache_entry; struct document_refresh; struct ecmascript_timeout; struct el_form_control; struct frame_desc; struct frameset_desc; struct module; struct screen_char; /** Nodes are used for marking areas of text on the document canvas as * searchable. */ struct node { LIST_HEAD(struct node); struct el_box box; }; /** The document line consisting of the chars ready to be copied to * the terminal screen. */ struct line { struct screen_char *chars; int length; }; /** Codepage status */ enum cp_status { CP_STATUS_NONE, CP_STATUS_SERVER, CP_STATUS_ASSUMED, CP_STATUS_IGNORED }; /** Clipboard state */ enum clipboard_status { CLIPBOARD_NONE, CLIPBOARD_FIRST_POINT, CLIPBOARD_SECOND_POINT }; struct point { int x, y; }; /* Tags are used for ``id''s or anchors in the document referenced by the * fragment part of the URI. */ struct tag { LIST_HEAD(struct tag); int x, y; char name[1]; /* must be last of struct. --Zas */ }; enum link_type { LINK_HYPERTEXT, LINK_MAP, LINK_BUTTON, LINK_CHECKBOX, LINK_SELECT, LINK_FIELD, LINK_AREA, }; enum script_event_hook_type { SEVHOOK_ONCLICK, SEVHOOK_ONDBLCLICK, SEVHOOK_ONMOUSEOVER, SEVHOOK_ONHOVER, SEVHOOK_ONFOCUS, SEVHOOK_ONMOUSEOUT, SEVHOOK_ONBLUR, }; struct script_event_hook { LIST_HEAD(struct script_event_hook); enum script_event_hook_type type; char *src; }; struct link { unicode_val_T accesskey; enum link_type type; char *where; char *target; char *where_img; /** The title of the link. This is in the document charset, * and entities have already been decoded. */ char *title; /** The set of characters belonging to this link (their coordinates * in the document) - each character has own struct point. */ struct point *points; int npoints; int number; /** This is supposed to be the colour-pair of the link, but the actual * colours on the canvas can differ--e.g., with image links. */ struct color_pair color; /*! XXX: They don't neccessary need to be link-specific, but we just * don't support them for any other elements for now. Well, we don't * even have a good place where to store them in that case. */ LIST_OF(struct script_event_hook) *event_hooks; union { char *name; struct el_form_control *form_control; } data; }; #define get_link_index(document, link) (link - document->links) #define link_is_textinput(link) \ ((link)->type == LINK_FIELD || (link)->type == LINK_AREA) #define link_is_form(link) \ ((link)->type != LINK_HYPERTEXT && (link)->type != LINK_MAP) #define get_link_form_control(link) \ (link_is_form(link) ? (link)->data.form_control : NULL) #define get_link_name(link) \ (!link_is_form(link) ? (link)->data.name : NULL) #ifdef CONFIG_UTF8 /** A searchable character on the document canvas. * * struct document.search is an array of struct search, initialised by * get_src, q.v. The elements of the array roughly correspond to the document * canvas, document.data; each element corresponds to a regular character, a * run of one or more control characters, or the end of a line on the canvas. * * If an instance of struct search corresponds to a regular character, then that * character is stored in @a c and @a n is equal to 1. If an instance of struct * search corresponds to a run of control characters, then a space character ' ' * is stored in @a c and @a n is equal to to the length of the run. If an instance * of struct search corresponds to the end of a line, then a space is stored in * @a c and @a n is equal to 0. */ struct search { int x, y; /* Co-ordinates on the document canvas, * document.data. */ signed int n; /* The number of characters on the * document canvas to which this object * corresponds. If the value is 0, then this * object marks the end of a line. If the value * is 1, then this object corresponds to a * single character. If the value is greater * than 1, then this object corresponds to a run * of control characters. */ unicode_val_T c; /* The character on the document canvas to which * this object corresponds or ' ' if that * character is a control character or if this * object marks the end of a line. */ /* RAM is cheap nowadays */ }; #else struct search { int x, y; signed int n:24; /* This structure is size-critical */ unsigned char c; }; #endif struct document { OBJECT_HEAD(struct document); struct document_options options; LIST_OF(struct form) forms; LIST_OF(struct tag) tags; LIST_OF(struct node) nodes; #ifdef CONFIG_ECMASCRIPT /** ECMAScript snippets to be executed during loading the document into * a window. This currently involves @