1 /* -*- c-basic-offset:2; tab-width:2; indent-tabs-mode:nil -*- */
2 
3 #ifndef __VT_EDIT_H__
4 #define __VT_EDIT_H__
5 
6 #include <pobl/bl_types.h>
7 
8 #include "vt_str.h"
9 #include "vt_line.h"
10 #include "vt_model.h"
11 #include "vt_cursor.h"
12 
13 typedef enum vt_resize_mode {
14   RZ_NONE,
15   RZ_SCROLL,
16   RZ_WRAP,
17   RZ_MODE_MAX,
18 
19 } vt_resize_mode_t;
20 
21 typedef struct vt_edit_scroll_event_listener {
22   void *self;
23 
24   void (*receive_scrolled_out_line)(void *, vt_line_t *);
25   void (*scrolled_out_lines_finished)(void *);
26 
27   int (*window_scroll_upward_region)(void *, int, int, u_int);
28   int (*window_scroll_downward_region)(void *, int, int, u_int);
29 
30   int (*top_line_is_wrapped)(void *);
31 
32 } vt_edit_scroll_event_listener_t;
33 
34 typedef struct vt_protect_store {
35   vt_char_t *chars;
36   int beg_row;
37   int end_row;
38 
39 } vt_protect_store_t;
40 
41 typedef struct vt_edit {
42   vt_model_t model;
43   vt_cursor_t cursor;
44 
45   u_int tab_size;
46   u_int8_t *tab_stops;
47 
48   vt_char_t bce_ch;
49 
50   /* used for line overlapping */
51   vt_line_t *wraparound_ready_line;
52 
53   int16_t vmargin_beg;
54   int16_t vmargin_end;
55 
56   vt_edit_scroll_event_listener_t *scroll_listener;
57 
58   int16_t hmargin_beg;
59   int16_t hmargin_end;
60   int8_t use_margin;
61 
62   int8_t is_logging;
63   int8_t is_relative_origin;
64   int8_t is_auto_wrap;
65   int8_t use_bce;
66   int8_t use_rect_attr_select;
67 
68 } vt_edit_t;
69 
70 void vt_set_resize_mode(vt_resize_mode_t mode);
71 
72 vt_resize_mode_t vt_get_resize_mode_by_name(const char *name);
73 
74 int vt_edit_init(vt_edit_t *edit, vt_edit_scroll_event_listener_t *scroll_listener,
75                  u_int num_cols, u_int num_rows, u_int tab_size, int is_logging, int use_bce);
76 
77 void vt_edit_final(vt_edit_t *edit);
78 
79 int vt_edit_clone(vt_edit_t *dst_edit, vt_edit_t *src_edit);
80 
81 int vt_edit_resize(vt_edit_t *edit, u_int num_cols, u_int num_rows);
82 
83 int vt_edit_insert_chars(vt_edit_t *edit, vt_char_t *chars, u_int num_chars);
84 
85 int vt_edit_insert_blank_chars(vt_edit_t *edit, u_int num_blank_chars);
86 
87 int vt_edit_overwrite_chars(vt_edit_t *edit, vt_char_t *chars, u_int num_chars);
88 
89 u_int vt_edit_replace(vt_edit_t *edit, int beg_row, vt_char_t *chars, u_int cols,
90                       u_int max_cols_per_line);
91 
92 int vt_edit_delete_cols(vt_edit_t *edit, u_int delete_cols);
93 
94 int vt_edit_clear_cols(vt_edit_t *edit, u_int cols);
95 
96 int vt_edit_insert_new_line(vt_edit_t *edit);
97 
98 int vt_edit_delete_line(vt_edit_t *edit);
99 
100 int vt_edit_clear_line_to_right(vt_edit_t *edit);
101 
102 int vt_edit_clear_line_to_left(vt_edit_t *edit);
103 
104 int vt_edit_clear_below(vt_edit_t *edit);
105 
106 int vt_edit_clear_above(vt_edit_t *edit);
107 
108 vt_protect_store_t *vt_edit_save_protected_chars(vt_edit_t *edit, int beg_row, int end_row,
109                                                  int relative);
110 
111 void vt_edit_restore_protected_chars(vt_edit_t *edit, vt_protect_store_t *save);
112 
113 int vt_edit_set_vmargin(vt_edit_t *edit, int beg, int end);
114 
115 int vt_edit_scroll_upward(vt_edit_t *edit, u_int size);
116 
117 int vt_edit_scroll_downward(vt_edit_t *edit, u_int size);
118 
119 void vt_edit_scroll_leftward(vt_edit_t *edit, u_int size);
120 
121 void vt_edit_scroll_rightward(vt_edit_t *edit, u_int size);
122 
123 int vt_edit_scroll_leftward_from_cursor(vt_edit_t *edit, u_int size);
124 
125 int vt_edit_scroll_rightward_from_cursor(vt_edit_t *edit, u_int size);
126 
127 void vt_edit_set_use_hmargin(vt_edit_t *edit, int use);
128 
129 int vt_edit_set_hmargin(vt_edit_t *edit, int beg, int end);
130 
131 int vt_edit_forward_tabs(vt_edit_t *edit, u_int num);
132 
133 int vt_edit_backward_tabs(vt_edit_t *edit, u_int num);
134 
135 #define vt_edit_get_tab_size(edit) ((edit)->tab_size)
136 
137 void vt_edit_set_tab_size(vt_edit_t *edit, u_int tab_size);
138 
139 void vt_edit_set_tab_stop(vt_edit_t *edit);
140 
141 #define vt_edit_is_tab_stop(edit, col) ((edit)->tab_stops[(col) / 8] & (1 << ((col) % 8)))
142 
143 void vt_edit_clear_tab_stop(vt_edit_t *edit);
144 
145 void vt_edit_clear_all_tab_stops(vt_edit_t *edit);
146 
147 #define vt_edit_get_num_filled_rows(edit) vt_model_get_num_filled_rows(&(edit)->model)
148 
149 #define vt_edit_get_line(edit, row) (vt_model_get_line(&(edit)->model, row))
150 
151 void vt_edit_set_modified_all(vt_edit_t *edit);
152 
153 #define vt_edit_get_cols(edit) ((edit)->model.num_cols)
154 
155 #define vt_edit_get_rows(edit) ((edit)->model.num_rows)
156 
157 int vt_edit_go_forward(vt_edit_t *edit, int flag);
158 
159 int vt_edit_go_back(vt_edit_t *edit, int flag);
160 
161 int vt_edit_go_upward(vt_edit_t *edit, int flag);
162 
163 int vt_edit_go_downward(vt_edit_t *edit, int flag);
164 
165 void vt_edit_goto_beg_of_line(vt_edit_t *edit);
166 
167 void vt_edit_goto_home(vt_edit_t *edit);
168 
169 int vt_edit_goto(vt_edit_t *edit, int col, int row);
170 
171 #define vt_edit_set_relative_origin(edit, flag) ((edit)->is_relative_origin = (flag))
172 
173 #define vt_edit_is_relative_origin(edit) ((edit)->is_relative_origin)
174 
175 #define vt_edit_set_auto_wrap(edit, flag) ((edit)->is_auto_wrap = (flag))
176 
177 #define vt_edit_is_auto_wrap(edit) ((edit)->is_auto_wrap)
178 
179 void vt_edit_set_last_column_flag(vt_edit_t *edit, int flag);
180 
181 #define vt_edit_get_last_column_flag(edit) ((edit)->wraparound_ready_line ? 1 : 0)
182 
183 #define vt_edit_set_use_bce(edit, use) ((edit)->use_bce = (use))
184 
185 #define vt_edit_is_using_bce(edit) ((edit)->use_bce)
186 
187 #define vt_edit_set_bce_fg_color(edit, fg_color) vt_char_set_fg_color(&(edit)->bce_ch, fg_color)
188 
189 #define vt_edit_set_bce_bg_color(edit, bg_color) vt_char_set_bg_color(&(edit)->bce_ch, bg_color)
190 
191 #define vt_edit_get_bce_ch(edit) (&(edit)->bce_ch)
192 
193 #define vt_edit_save_cursor(edit) vt_cursor_save(&(edit)->cursor)
194 
195 #define vt_edit_saved_cursor_to_home(edit) vt_saved_cursor_to_home(&(edit)->cursor)
196 
197 int vt_edit_restore_cursor(vt_edit_t *edit);
198 
199 void vt_edit_fill_area(vt_edit_t *edit, int code, int is_protected,
200                        int col, int row, u_int num_cols, u_int num_rows);
201 
202 void vt_edit_copy_area(vt_edit_t *src_edit, int src_col, int src_row, u_int num_copy_cols,
203                        u_int num_copy_rows, vt_edit_t *dst_edit, int dst_col, int dst_row);
204 
205 void vt_edit_erase_area(vt_edit_t *edit, int col, int row, u_int num_cols, u_int num_rows);
206 
207 void vt_edit_change_attr_area(vt_edit_t *edit, int col, int row, u_int num_cols, u_int num_rows,
208                               void (*func)(vt_char_t *, int, int, int, int, int, int, int),
209                               int attr);
210 
211 u_int16_t vt_edit_get_checksum(vt_edit_t *edit, int col, int row, u_int num_cols, u_int num_rows);
212 
213 void vt_edit_clear_size_attr(vt_edit_t *edit);
214 
215 #define vt_edit_set_use_rect_attr_select(edit, use) ((edit)->use_rect_attr_select = (use))
216 
217 #define vt_edit_is_using_rect_attr_select(edit) ((edit)->use_rect_attr_select)
218 
219 #define vt_cursor_char_index(edit) ((edit)->cursor.char_index)
220 
221 #define vt_cursor_col(edit) ((edit)->cursor.col)
222 
223 #define vt_cursor_row(edit) ((edit)->cursor.row)
224 
225 int vt_edit_cursor_logical_col(vt_edit_t *edit);
226 
227 int vt_edit_cursor_logical_row(vt_edit_t *edit);
228 
229 #define vt_edit_is_logging(edit) ((edit)->is_logging)
230 
231 #ifdef DEBUG
232 
233 void vt_edit_dump(vt_edit_t *edit);
234 
235 void vt_edit_dump_updated(vt_edit_t *edit);
236 
237 #endif
238 
239 #endif
240