1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-06-20 00:15:31 +00:00
elinks/src/bfu/listbox.h
Witold Filipczyk a67188413c [lists] LIST_HEAD -> LIST_HEAD_EL to not clash with libevent's LIST_HEAD. Also added curl implementation of ftpes and sftp
Implementation of ftpes and sftp is based on curl's hiperfifo example. It requires libevent.
ftpes only encrypts control channel. There were problems when both control and data were encrypted. It stucked on SIZE.
Only successful connections work, errors are not handled properly.
2023-06-19 18:43:53 +02:00

156 lines
4.6 KiB
C

#ifndef EL__BFU_LISTBOX_H
#define EL__BFU_LISTBOX_H
#include "util/align.h"
#include "util/lists.h"
#ifdef __cplusplus
extern "C" {
#endif
struct dialog;
struct listbox_data;
struct listbox_item;
struct terminal;
struct uri;
struct widget_data;
void add_dlg_listbox(struct dialog *dlg, void *box_data);
enum listbox_match {
LISTBOX_MATCH_OK,
LISTBOX_MATCH_NO,
LISTBOX_MATCH_IMPOSSIBLE,
};
/* Structure that can be used for storing all relevant info when traversing
* listboxes. */
struct listbox_context {
/* The terminal we are running on */
struct terminal *term;
/* Used for saving a specific item that should be used later when
* traversing listboxes has ended. */
struct listbox_item *item;
/* The current listbox widgets data */
struct listbox_data *box;
/* The current (hierbox browser) dialog stuff */
struct dialog_data *dlg_data;
struct widget_data *widget_data;
/* Used when distributing? the current selected to another position */
int dist;
/* The offset of the current box from the top */
int offset;
};
struct listbox_ops_messages {
char *cant_delete_item; /* %s = text of item */
char *cant_delete_used_item; /* %s = text of item */
char *cant_delete_folder; /* %s = text of item */
char *cant_delete_used_folder; /* %s = text of item */
char *delete_marked_items_title; /* not a format string */
char *delete_marked_items; /* not a format string */
char *delete_folder_title; /* not a format string */
char *delete_folder; /* %s = text of item */
char *delete_item_title; /* not a format string */
char *delete_item; /* %s = text of item */
char *clear_all_items_title; /* not a format string */
char *clear_all_items; /* not a format string */
};
/* TODO: We can maybe find a better way of figuring out whether a user of a
* generic button handler has implemented all the required functions. --jonas
* */
struct listbox_ops {
/* Some basic util/object.h wrappers */
void (*lock)(struct listbox_item *);
void (*unlock)(struct listbox_item *);
int (*is_used)(struct listbox_item *);
char *(*get_text)(struct listbox_item *, struct terminal *);
char *(*get_info)(struct listbox_item *, struct terminal *);
struct uri *(*get_uri)(struct listbox_item *);
struct listbox_item *(*get_root)(struct listbox_item *);
/* Do a search on the item. */
enum listbox_match (*match)(struct listbox_item *, struct terminal *,
char *text);
/* Before calling delete() thou shall call can_delete(). */
int (*can_delete)(struct listbox_item *);
/* Delete the listbox item object, its data and all nested listboxes.
* @last is non zero when either deleting only one item or when
* deleting the last item. */
void (*delete_)(struct listbox_item *, int last);
/* If defined it means that the it will control all drawing of the
* listbox item text and what might else be possible on the screen on
* line @y from @x and @width chars onwards. */
void (*draw)(struct listbox_item *, struct listbox_context *,
int x, int y, int width);
struct listbox_ops_messages *messages;
};
/* Stores display information about a box. Kept in cdata. */
struct listbox_data {
LIST_HEAD_EL(struct listbox_data);
const struct listbox_ops *ops; /* Backend-provided operations */
struct listbox_item *sel; /* Item currently selected */
struct listbox_item *top; /* Item which is on the top line of the box */
int sel_offset; /* Offset of selected item against the box top */
LIST_OF(struct listbox_item) *items; /* The list being displayed */
};
enum listbox_item_type {
BI_LEAF,
BI_FOLDER,
BI_SEPARATOR
};
/* An item in a box */
struct listbox_item {
LIST_HEAD_EL(struct listbox_item);
/* The list may be empty for leaf nodes or non-hiearchic listboxes */
LIST_OF(struct listbox_item) child;
enum listbox_item_type type;
int depth;
unsigned int expanded:1; /* Only valid if this is a BI_FOLDER */
unsigned int visible:1; /* Is this item visible? */
unsigned int marked:1;
void *udata;
};
extern const struct widget_ops listbox_ops;
void dlg_format_listbox(struct dialog_data *, struct widget_data *, int, int *, int, int, int *, format_align_T, int format_only);
struct listbox_item *traverse_listbox_items_list(struct listbox_item *, struct listbox_data *, int, int, int (*)(struct listbox_item *, void *, int *), void *);
void listbox_sel_move(struct widget_data *, int);
void listbox_sel(struct widget_data *widget_data, struct listbox_item *item);
struct listbox_data *get_listbox_widget_data(struct widget_data *widget_data);
#define get_dlg_listbox_data(dlg_data) \
get_listbox_widget_data(dlg_data->widgets_data)
#ifdef __cplusplus
}
#endif
#endif