#ifndef _GTCACA_EDITOR_H_
#define _GTCACA_EDITOR_H_
#include <gtcaca/main.h>
#include <gtcaca/widget.h>
typedef struct _gtcaca_editor_widget_t gtcaca_editor_widget_t;
typedef int (*gtcaca_editor_key_cb_t)(gtcaca_editor_widget_t *w, int key, void *userdata);
typedef void (*gtcaca_editor_update_cb_t)(gtcaca_editor_widget_t *w, void *userdata);
typedef void (*gtcaca_editor_autoc_cb_t)(gtcaca_editor_widget_t *w, const char *text, void *userdata);
typedef struct {
int is_insert;
int pos;
char *text;
int len;
int group;
} gtcaca_editor_action_t;
enum {
GTCACA_EDITOR_STYLE_DEFAULT = 0,
GTCACA_EDITOR_STYLE_COMMENT,
GTCACA_EDITOR_STYLE_STRING,
GTCACA_EDITOR_STYLE_NUMBER,
GTCACA_EDITOR_STYLE_KEYWORD,
GTCACA_EDITOR_STYLE_BRACKET,
GTCACA_EDITOR_STYLE_OPERATOR,
GTCACA_EDITOR_STYLE_COUNT
};
typedef struct {
uint8_t fore;
uint8_t back;
int back_set;
int fore12_set;
uint16_t fore12;
int bold;
int italic;
int underline;
int visible;
} gtcaca_editor_style_t;
enum {
GTCACA_EDITOR_ANNOTATION_HIDDEN = 0,
GTCACA_EDITOR_ANNOTATION_STANDARD,
GTCACA_EDITOR_ANNOTATION_BOXED
};
#define GTCACA_EDITOR_FOLDLEVELBASE 0x400
#define GTCACA_EDITOR_FOLDLEVELNUMBERMASK 0x0FFF
#define GTCACA_EDITOR_FOLDLEVELHEADERFLAG 0x2000
typedef struct {
int fold_level;
int fold_expanded;
int visible;
char *annotation;
int annotation_style;
} gtcaca_editor_line_t;
typedef struct _gtcaca_editor_langcfg_t gtcaca_editor_langcfg_t;
typedef struct _gtcaca_editor_grammar_t gtcaca_editor_grammar_t;
typedef struct {
int active;
int pos_start;
char **items;
int n_items;
int *filtered;
int n_filtered;
int sel;
int top;
char separator;
int ignore_case;
int auto_hide;
int cancel_at_start;
int max_height;
char *fillups;
char *stops;
} gtcaca_editor_autoc_t;
struct _gtcaca_editor_widget_t {
gtcaca_widget_type_t type;
unsigned int id;
int has_focus;
int is_visible;
int x;
int y;
int width;
int height;
uint8_t color_focus_fg;
uint8_t color_focus_bg;
uint8_t color_nonfocus_fg;
uint8_t color_nonfocus_bg;
gtcaca_widget_t *parent;
gtcaca_widget_t *children;
struct _gtcaca_editor_widget_t *prev;
struct _gtcaca_editor_widget_t *next;
gtcaca_editor_key_cb_t private_key_cb;
gtcaca_editor_key_cb_t key_cb;
void *key_cb_userdata;
gtcaca_editor_update_cb_t update_cb;
void *update_cb_userdata;
char *text;
int length;
int cap;
int current_pos;
int anchor;
int goal_col;
int rect_select;
int first_visible_line;
int x_offset;
int view_lines;
int view_cols;
int tab_width;
int show_line_numbers;
int wrap;
int modified;
gtcaca_editor_action_t *undo;
int undo_count, undo_cap;
gtcaca_editor_action_t *redo;
int redo_count, redo_cap;
int undo_group_depth;
int undo_group_id;
int undo_seq;
gtcaca_editor_langcfg_t *langcfg;
gtcaca_editor_grammar_t *grammar;
int colorize_enabled;
int json_mode;
int colorize_dirty;
unsigned char *styles;
int styles_cap;
gtcaca_editor_style_t style_table[GTCACA_EDITOR_STYLE_COUNT];
int sel_set;
uint8_t sel_fore, sel_back;
gtcaca_editor_autoc_t autoc;
gtcaca_editor_autoc_cb_t autoc_cb;
void *autoc_cb_userdata;
int target_start;
int target_end;
int search_flags;
int read_only;
int overtype;
int view_ws;
int caret_line_visible;
int caret_line_back_set;
uint8_t caret_line_back;
int bg12_set; uint16_t bg12;
int fg12_set; uint16_t fg12;
int edge_column;
uint8_t edge_colour;
int brace_hl1, brace_hl2, brace_bad;
int show_fold_margin;
int annotation_visible;
gtcaca_editor_line_t *lines_meta;
int lines_meta_cap;
int lines_meta_len;
int fold_dirty;
int line_count_cache;
int line_count_valid;
};
gtcaca_editor_widget_t *gtcaca_editor_new(gtcaca_widget_t *parent, int x, int y, int width, int height);
void gtcaca_editor_free(gtcaca_editor_widget_t *w);
void gtcaca_editor_draw(gtcaca_editor_widget_t *w);
int gtcaca_editor_key_cb_register(gtcaca_editor_widget_t *w, gtcaca_editor_key_cb_t cb, void *userdata);
void gtcaca_editor_set_update_cb(gtcaca_editor_widget_t *w, gtcaca_editor_update_cb_t cb, void *userdata);
void gtcaca_editor_set_text(gtcaca_editor_widget_t *w, const char *text);
int gtcaca_editor_get_text(gtcaca_editor_widget_t *w, char *buf, int len);
int gtcaca_editor_get_length(gtcaca_editor_widget_t *w);
void gtcaca_editor_append_text(gtcaca_editor_widget_t *w, const char *s, int len);
void gtcaca_editor_insert_text(gtcaca_editor_widget_t *w, int pos, const char *s);
void gtcaca_editor_delete_range(gtcaca_editor_widget_t *w, int pos, int len);
void gtcaca_editor_clear_all(gtcaca_editor_widget_t *w);
char gtcaca_editor_get_char_at(gtcaca_editor_widget_t *w, int pos);
int gtcaca_editor_get_text_range(gtcaca_editor_widget_t *w, int start, int end, char *buf, int len);
int gtcaca_editor_get_current_pos(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_current_pos(gtcaca_editor_widget_t *w, int pos);
int gtcaca_editor_get_anchor(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_anchor(gtcaca_editor_widget_t *w, int pos);
void gtcaca_editor_set_selection(gtcaca_editor_widget_t *w, int caret, int anchor);
void gtcaca_editor_set_empty_selection(gtcaca_editor_widget_t *w, int pos);
int gtcaca_editor_get_selection_start(gtcaca_editor_widget_t *w);
int gtcaca_editor_get_selection_end(gtcaca_editor_widget_t *w);
int gtcaca_editor_get_selected_text(gtcaca_editor_widget_t *w, char *buf, int len);
void gtcaca_editor_goto_pos(gtcaca_editor_widget_t *w, int pos);
void gtcaca_editor_goto_line(gtcaca_editor_widget_t *w, int line);
int gtcaca_editor_get_line_count(gtcaca_editor_widget_t *w);
int gtcaca_editor_line_from_position(gtcaca_editor_widget_t *w, int pos);
int gtcaca_editor_position_from_line(gtcaca_editor_widget_t *w, int line);
int gtcaca_editor_get_line_end_position(gtcaca_editor_widget_t *w, int line);
int gtcaca_editor_get_column(gtcaca_editor_widget_t *w, int pos);
int gtcaca_editor_get_current_line(gtcaca_editor_widget_t *w);
int gtcaca_editor_find_column(gtcaca_editor_widget_t *w, int line, int column);
int gtcaca_editor_position_from_point(gtcaca_editor_widget_t *w, int sx, int sy);
void gtcaca_editor_set_rectangular_selection(gtcaca_editor_widget_t *w, int on);
int gtcaca_editor_get_rectangular_selection(gtcaca_editor_widget_t *w);
void gtcaca_editor_rect_string_insert(gtcaca_editor_widget_t *w, const char *s);
void gtcaca_editor_rect_kill(gtcaca_editor_widget_t *w);
void gtcaca_editor_rect_delete(gtcaca_editor_widget_t *w);
void gtcaca_editor_rect_clear(gtcaca_editor_widget_t *w);
void gtcaca_editor_rect_copy(gtcaca_editor_widget_t *w);
void gtcaca_editor_rect_yank(gtcaca_editor_widget_t *w);
void gtcaca_editor_char_left(gtcaca_editor_widget_t *w);
void gtcaca_editor_char_left_extend(gtcaca_editor_widget_t *w);
void gtcaca_editor_char_right(gtcaca_editor_widget_t *w);
void gtcaca_editor_char_right_extend(gtcaca_editor_widget_t *w);
void gtcaca_editor_line_up(gtcaca_editor_widget_t *w);
void gtcaca_editor_line_up_extend(gtcaca_editor_widget_t *w);
void gtcaca_editor_line_down(gtcaca_editor_widget_t *w);
void gtcaca_editor_line_down_extend(gtcaca_editor_widget_t *w);
void gtcaca_editor_home(gtcaca_editor_widget_t *w);
void gtcaca_editor_home_extend(gtcaca_editor_widget_t *w);
void gtcaca_editor_line_end(gtcaca_editor_widget_t *w);
void gtcaca_editor_line_end_extend(gtcaca_editor_widget_t *w);
void gtcaca_editor_document_start(gtcaca_editor_widget_t *w);
void gtcaca_editor_document_start_extend(gtcaca_editor_widget_t *w);
void gtcaca_editor_document_end(gtcaca_editor_widget_t *w);
void gtcaca_editor_document_end_extend(gtcaca_editor_widget_t *w);
void gtcaca_editor_page_up(gtcaca_editor_widget_t *w);
void gtcaca_editor_page_up_extend(gtcaca_editor_widget_t *w);
void gtcaca_editor_page_down(gtcaca_editor_widget_t *w);
void gtcaca_editor_page_down_extend(gtcaca_editor_widget_t *w);
void gtcaca_editor_add_char(gtcaca_editor_widget_t *w, char c);
void gtcaca_editor_add_char_utf32(gtcaca_editor_widget_t *w, uint32_t cp);
void gtcaca_editor_new_line(gtcaca_editor_widget_t *w);
void gtcaca_editor_delete_back(gtcaca_editor_widget_t *w);
void gtcaca_editor_clear(gtcaca_editor_widget_t *w);
void gtcaca_editor_undo(gtcaca_editor_widget_t *w);
void gtcaca_editor_redo(gtcaca_editor_widget_t *w);
int gtcaca_editor_can_undo(gtcaca_editor_widget_t *w);
int gtcaca_editor_can_redo(gtcaca_editor_widget_t *w);
void gtcaca_editor_empty_undo_buffer(gtcaca_editor_widget_t *w);
void gtcaca_editor_begin_undo_action(gtcaca_editor_widget_t *w);
void gtcaca_editor_end_undo_action(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_save_point(gtcaca_editor_widget_t *w);
int gtcaca_editor_get_modify(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_line_numbers(gtcaca_editor_widget_t *w, int on);
void gtcaca_editor_set_tab_width(gtcaca_editor_widget_t *w, int n);
int gtcaca_editor_get_tab_width(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_wrap(gtcaca_editor_widget_t *w, int on);
int gtcaca_editor_get_wrap(gtcaca_editor_widget_t *w);
void gtcaca_editor_style_set_fore(gtcaca_editor_widget_t *w, int style, uint8_t color);
void gtcaca_editor_style_set_back(gtcaca_editor_widget_t *w, int style, uint8_t color);
void gtcaca_editor_style_clear_back(gtcaca_editor_widget_t *w, int style);
void gtcaca_editor_set_selection_colors(gtcaca_editor_widget_t *w, uint8_t fore, uint8_t back);
void gtcaca_editor_set_bg_rgb12(gtcaca_editor_widget_t *w, uint16_t rgb12);
void gtcaca_editor_set_fg_rgb12(gtcaca_editor_widget_t *w, uint16_t rgb12);
void gtcaca_editor_style_set_fore_rgb12(gtcaca_editor_widget_t *w, int style, uint16_t rgb12);
void gtcaca_editor_colourize(gtcaca_editor_widget_t *w);
void gtcaca_editor_style_set_bold(gtcaca_editor_widget_t *w, int style, int on);
void gtcaca_editor_style_set_italic(gtcaca_editor_widget_t *w, int style, int on);
void gtcaca_editor_style_set_underline(gtcaca_editor_widget_t *w, int style, int on);
void gtcaca_editor_style_set_visible(gtcaca_editor_widget_t *w, int style, int on);
void gtcaca_editor_style_reset_default(gtcaca_editor_widget_t *w);
void gtcaca_editor_style_clear_all(gtcaca_editor_widget_t *w);
int gtcaca_editor_get_line_numbers(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_fold_margin(gtcaca_editor_widget_t *w, int on);
int gtcaca_editor_get_fold_margin(gtcaca_editor_widget_t *w);
gtcaca_editor_langcfg_t *gtcaca_editor_langcfg_new(void);
void gtcaca_editor_langcfg_free(gtcaca_editor_langcfg_t *cfg);
void gtcaca_editor_langcfg_set_line_comment(gtcaca_editor_langcfg_t *cfg, const char *prefix);
void gtcaca_editor_langcfg_set_block_comment(gtcaca_editor_langcfg_t *cfg, const char *open, const char *close);
void gtcaca_editor_langcfg_add_bracket(gtcaca_editor_langcfg_t *cfg, const char *open, const char *close);
void gtcaca_editor_langcfg_add_string_delimiter(gtcaca_editor_langcfg_t *cfg, const char *delim);
void gtcaca_editor_langcfg_set_keywords(gtcaca_editor_langcfg_t *cfg, const char *const *words, int count);
const char *gtcaca_editor_langcfg_get_line_comment(gtcaca_editor_langcfg_t *cfg);
const char *gtcaca_editor_langcfg_get_block_comment_open(gtcaca_editor_langcfg_t *cfg);
const char *gtcaca_editor_langcfg_get_block_comment_close(gtcaca_editor_langcfg_t *cfg);
int gtcaca_editor_langcfg_load_json(gtcaca_editor_langcfg_t *cfg, const char *path);
void gtcaca_editor_set_langcfg(gtcaca_editor_widget_t *w, gtcaca_editor_langcfg_t *cfg);
void _gtcaca_editor_colorize(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_fold_level(gtcaca_editor_widget_t *w, int line, int level);
int gtcaca_editor_get_fold_level(gtcaca_editor_widget_t *w, int line);
void gtcaca_editor_set_fold_expanded(gtcaca_editor_widget_t *w, int line, int expanded);
int gtcaca_editor_get_fold_expanded(gtcaca_editor_widget_t *w, int line);
void gtcaca_editor_toggle_fold(gtcaca_editor_widget_t *w, int line);
int gtcaca_editor_get_line_visible(gtcaca_editor_widget_t *w, int line);
void gtcaca_editor_fold_by_indentation(gtcaca_editor_widget_t *w);
void gtcaca_editor_fold_all(gtcaca_editor_widget_t *w, int expanded);
void gtcaca_editor_annotation_set_text(gtcaca_editor_widget_t *w, int line, const char *text);
int gtcaca_editor_annotation_get_text(gtcaca_editor_widget_t *w, int line, char *buf, int len);
void gtcaca_editor_annotation_set_style(gtcaca_editor_widget_t *w, int line, int style);
int gtcaca_editor_annotation_get_style(gtcaca_editor_widget_t *w, int line);
void gtcaca_editor_annotation_clear_all(gtcaca_editor_widget_t *w);
void gtcaca_editor_annotation_set_visible(gtcaca_editor_widget_t *w, int mode);
int gtcaca_editor_annotation_get_visible(gtcaca_editor_widget_t *w);
int gtcaca_editor_annotation_get_lines(gtcaca_editor_widget_t *w, int line);
void _gtcaca_editor_ensure_meta(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_json_mode(gtcaca_editor_widget_t *w, int on);
int gtcaca_editor_get_json_mode(gtcaca_editor_widget_t *w);
void gtcaca_editor_fold_json(gtcaca_editor_widget_t *w);
void _gtcaca_editor_colorize_json(gtcaca_editor_widget_t *w);
#define GTCACA_EDITOR_FIND_MATCHCASE 0x00000004
#define GTCACA_EDITOR_FIND_WHOLEWORD 0x00000002
#define GTCACA_EDITOR_FIND_WORDSTART 0x00100000
#define GTCACA_EDITOR_FIND_REGEXP 0x00200000
void gtcaca_editor_set_search_flags(gtcaca_editor_widget_t *w, int flags);
int gtcaca_editor_get_search_flags(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_target_start(gtcaca_editor_widget_t *w, int pos);
int gtcaca_editor_get_target_start(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_target_end(gtcaca_editor_widget_t *w, int pos);
int gtcaca_editor_get_target_end(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_target_range(gtcaca_editor_widget_t *w, int start, int end);
void gtcaca_editor_target_whole_document(gtcaca_editor_widget_t *w);
void gtcaca_editor_target_from_selection(gtcaca_editor_widget_t *w);
int gtcaca_editor_search_in_target(gtcaca_editor_widget_t *w, const char *text);
int gtcaca_editor_replace_target(gtcaca_editor_widget_t *w, const char *text);
int gtcaca_editor_find_text(gtcaca_editor_widget_t *w, int flags, const char *text,
int min_pos, int max_pos, int *match_end);
void gtcaca_editor_search_anchor(gtcaca_editor_widget_t *w);
int gtcaca_editor_search_next(gtcaca_editor_widget_t *w, int flags, const char *text);
int gtcaca_editor_search_prev(gtcaca_editor_widget_t *w, int flags, const char *text);
int gtcaca_editor_word_left_position(gtcaca_editor_widget_t *w, int pos);
int gtcaca_editor_word_right_position(gtcaca_editor_widget_t *w, int pos);
void gtcaca_editor_word_left(gtcaca_editor_widget_t *w);
void gtcaca_editor_word_left_extend(gtcaca_editor_widget_t *w);
void gtcaca_editor_word_right(gtcaca_editor_widget_t *w);
void gtcaca_editor_word_right_extend(gtcaca_editor_widget_t *w);
void gtcaca_editor_del_word_left(gtcaca_editor_widget_t *w);
void gtcaca_editor_del_word_right(gtcaca_editor_widget_t *w);
int gtcaca_editor_brace_match(gtcaca_editor_widget_t *w, int pos);
void gtcaca_editor_brace_highlight(gtcaca_editor_widget_t *w, int pos1, int pos2);
void gtcaca_editor_brace_badlight(gtcaca_editor_widget_t *w, int pos);
void gtcaca_editor_line_duplicate(gtcaca_editor_widget_t *w);
void gtcaca_editor_line_transpose(gtcaca_editor_widget_t *w);
void gtcaca_editor_line_delete(gtcaca_editor_widget_t *w);
void gtcaca_editor_selection_duplicate(gtcaca_editor_widget_t *w);
void gtcaca_editor_upper_case(gtcaca_editor_widget_t *w);
void gtcaca_editor_lower_case(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_read_only(gtcaca_editor_widget_t *w, int on);
int gtcaca_editor_get_read_only(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_overtype(gtcaca_editor_widget_t *w, int on);
int gtcaca_editor_get_overtype(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_view_whitespace(gtcaca_editor_widget_t *w, int on);
int gtcaca_editor_get_view_whitespace(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_caret_line_visible(gtcaca_editor_widget_t *w, int on);
void gtcaca_editor_set_caret_line_back(gtcaca_editor_widget_t *w, uint8_t colour);
void gtcaca_editor_set_edge_column(gtcaca_editor_widget_t *w, int column);
int gtcaca_editor_get_edge_column(gtcaca_editor_widget_t *w);
void gtcaca_editor_set_edge_colour(gtcaca_editor_widget_t *w, uint8_t colour);
gtcaca_editor_grammar_t *gtcaca_editor_grammar_load(const char *path);
void gtcaca_editor_grammar_free(gtcaca_editor_grammar_t *g);
void gtcaca_editor_set_grammar(gtcaca_editor_widget_t *w, gtcaca_editor_grammar_t *g);
void _gtcaca_editor_colorize_tm(gtcaca_editor_widget_t *w);
void gtcaca_editor_autoc_show(gtcaca_editor_widget_t *w, int len_entered, const char *item_list);
void gtcaca_editor_autoc_cancel(gtcaca_editor_widget_t *w);
int gtcaca_editor_autoc_active(gtcaca_editor_widget_t *w);
int gtcaca_editor_autoc_pos_start(gtcaca_editor_widget_t *w);
void gtcaca_editor_autoc_complete(gtcaca_editor_widget_t *w);
void gtcaca_editor_autoc_select(gtcaca_editor_widget_t *w, const char *prefix);
int gtcaca_editor_autoc_get_current(gtcaca_editor_widget_t *w);
int gtcaca_editor_autoc_get_current_text(gtcaca_editor_widget_t *w, char *buf, int len);
void gtcaca_editor_autoc_set_separator(gtcaca_editor_widget_t *w, char sep);
char gtcaca_editor_autoc_get_separator(gtcaca_editor_widget_t *w);
void gtcaca_editor_autoc_set_ignore_case(gtcaca_editor_widget_t *w, int on);
void gtcaca_editor_autoc_set_auto_hide(gtcaca_editor_widget_t *w, int on);
void gtcaca_editor_autoc_set_cancel_at_start(gtcaca_editor_widget_t *w, int on);
void gtcaca_editor_autoc_set_max_height(gtcaca_editor_widget_t *w, int rows);
void gtcaca_editor_autoc_set_fillups(gtcaca_editor_widget_t *w, const char *chars);
void gtcaca_editor_autoc_stops(gtcaca_editor_widget_t *w, const char *chars);
void gtcaca_editor_set_autoc_cb(gtcaca_editor_widget_t *w, gtcaca_editor_autoc_cb_t cb, void *userdata);
int _gtcaca_editor_autoc_key(gtcaca_editor_widget_t *w, int key);
void _gtcaca_editor_draw_autoc(gtcaca_editor_widget_t *w);
#endif