Rev 6601 | Rev 6615 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
6589 | siemargl | 1 | #ifndef KOLIBRI_EDITOR_H |
2 | #define KOLIBRI_EDITOR_H |
||
3 | |||
4 | // (количество символов в новом документе + 2) |
||
5 | #define TE_MAXCHARS 100002 |
||
6 | // максимальный размер файла синтаксиса |
||
7 | #define TE_MAX_SYNTAX_FILESIZE 410000 |
||
8 | // buffer for copy|paste |
||
9 | #define TE_BUF_SIZE 4096 |
||
10 | typedef void (*editor_callback)(void); |
||
11 | |||
12 | struct __attribute__ ((__packed__)) editor_symbol { |
||
13 | uint8_t c; // +0 символ |
||
14 | uint8_t col; // +1 цвет |
||
15 | struct editor_symbol *prev; // +2 |
||
16 | struct editor_symbol *next; // +6 указатели |
||
17 | uint32_t tc; // +10 врем. создания |
||
18 | uint32_t td; // +14 врем. удаления |
||
19 | }; |
||
20 | |||
21 | /// структура текстового редактора |
||
22 | typedef struct __attribute__ ((__packed__)) { |
||
23 | uint32_t x_pos; //0 |
||
24 | uint32_t y_pos; //50 |
||
25 | uint32_t width; //440 |
||
26 | uint32_t hight; //150 |
||
6612 | siemargl | 27 | uint32_t w_pane; //30 ширина панели в окне, width of left pane with line numbers |
28 | uint32_t h_pane; //25 высота панели в окне, hight of top pane with Rows, Cols Undo info |
||
6589 | siemargl | 29 | uint32_t width_sym; //9 ширина символа (знакоместа) в окне |
30 | uint32_t hight_sym; //16 высота символа (знакоместа) в окне |
||
31 | uint8_t drag_m; // выделение от мыши |
||
32 | uint8_t drag_k; // выделение от клавиатуры |
||
33 | uint32_t sel_x0; // структура выделения |
||
34 | uint32_t sel_y0; |
||
35 | uint32_t sel_x1; |
||
36 | uint32_t sel_y1; |
||
37 | uint32_t seln_x0; //дополнительная структура выделения |
||
38 | uint32_t seln_y0; |
||
39 | uint32_t seln_x1; |
||
40 | uint32_t seln_y1; |
||
41 | struct editor_symbol *tex; // text memory pointer |
||
42 | struct editor_symbol *tex_1; // text first symbol pointer |
||
43 | struct editor_symbol *tex_end;// text end memory pointer |
||
44 | uint32_t cur_x; //координата x курсора |
||
45 | uint32_t cur_y; //координата y курсора |
||
46 | uint32_t max_chars; // TE_MAXCHARS ;+86 максимальное число символов в одном документе |
||
47 | uint32_t count_colors_text; // 1 ;+90 количество цветов текста |
||
48 | uint32_t count_key_words; //+94 колличество ключевых слов |
||
49 | color_t color_cursor; // 0x808080 ;+98 цвет курсора |
||
50 | color_t color_wnd_capt; // 0x80 ;+102 цвет полей вокруг окна |
||
51 | color_t color_wnd_work; // 0x0 ;+106 цвет фона окна |
||
52 | color_t color_wnd_bord; //0xd0d0d0 ;+110 цвет текста на полях |
||
53 | color_t color_select; // 0x208080 ;+114 цвет выделения |
||
54 | color_t color_cur_text; // 0xff0000 ;+118 цвет символа под курсором |
||
55 | color_t color_wnd_text; // 0xffff00 ;+122 цвет текста в окне |
||
56 | char *syntax_file; // указатель на начало файла синтаксиса |
||
57 | uint32_t syntax_file_size; // TE_MAX_SYNTAX_FILESIZE ;+130 максимальный размер файла синтаксиса |
||
58 | void *text_colors; // указатель на массив цветов текста |
||
59 | char *help_text_f1; // указатель на текст справки (по нажатии F1) |
||
60 | int help_id; // -1 ;+142 идентификатор для справки |
||
61 | void *key_words_data; // указатель на структуры ключевых слов TexColViv |
||
62 | uint32_t tim_ch; // количество изменений в файле |
||
63 | uint32_t tim_undo; // количество отмененных действий |
||
64 | uint32_t tim_ls; // время последнего сохранения |
||
65 | uint32_t tim_co; // время последней цветовой разметки |
||
66 | void *el_focus; // указатель на переменную элемента в фокусе pointer to pointer** |
||
67 | uint8_t err_save; // ошибка сохранения файла |
||
68 | uint8_t panel_id; // номер открытой панели |
||
69 | uint8_t key_new; // символ, который будет добавлятся с клавиатуры |
||
70 | uint8_t symbol_new_line; // ascii 20 символ завершения строки |
||
71 | scrollbar *scr_w; // вертикальный скроллинг != NULL |
||
72 | scrollbar *scr_h; // горизонтальный скроллинг != NULL |
||
73 | char *arr_key_pos;// указатель на массив позиций ключевых слов |
||
74 | char *buffer; // указатель на буфер копирования/вставки != NULL, also size |
||
75 | char *buffer_find;// указатель на буфер для поиска (sized 302) |
||
76 | uint8_t cur_ins; // 1 режим работы курсора (обычный или замена) |
||
77 | uint8_t mode_color; // 1 режим выделения слов цветом (0-выкл. 1-вкл.) |
||
78 | uint8_t mode_invis; // 0 режим показа непечатаемых символов |
||
79 | uint8_t gp_opt; // 0 опции возвращаемые функцией ted_get_pos_by_cursor |
||
80 | editor_callback fun_on_key_ctrl_o; // указатель на функцию вызываемую при нажатии Ctrl+O (открытие файла), can be NULL |
||
81 | editor_callback fun_on_key_ctrl_f; // ... Ctrl+F (вызова/скрытия панели поиска) |
||
82 | editor_callback fun_on_key_ctrl_n; // ... Ctrl+N (создание нового документа) |
||
83 | editor_callback fun_on_key_ctrl_s; // ... Ctrl+S |
||
84 | uint32_t buffer_size;// BUF_SIZE размер буфера копирования/вставки |
||
85 | editor_callback fun_find_err; // указатель на функцию вызываемую если поиск закончился неудачно |
||
86 | editor_callback fun_init_synt_err; // unused указатель на функцию вызываемую при ошибочном открытии файла синтаксиса |
||
87 | editor_callback fun_draw_panel_buttons; // указатель на функцию рисования панели с кнопками |
||
88 | editor_callback fun_draw_panel_find; // указатель на функцию рисования панели поиска |
||
89 | editor_callback fun_draw_panel_syntax; // указатель на функцию рисования панели синтаксиса |
||
90 | editor_callback fun_save_err; // указатель на функцию вызываемую если сохранение файла закончилось неудачно |
||
91 | uint32_t increase_size; //200 число символов на которые будет увечиваться память при нехватке |
||
92 | void *ptr_free_symb; // используется внутри элемента для ускорения вставки текста |
||
93 | uint32_t font_size; // ;+250 множитель для размера шрифта // binary OR mask for ECX SysFn4 |
||
94 | } editor; |
||
95 | |||
96 | struct __attribute__ ((__packed__)) editor_color_item |
||
97 | { |
||
98 | char word[40]; // слово для подсветки |
||
99 | uint32_t f1_offset; // смещение в таблице F1 подсказок |
||
100 | uint8_t flags; // флаги используемые при выделении |
||
101 | uint8_t endc; // символ конца выделения (используется при flags&4) |
||
102 | uint8_t escc; // экранирующий символ (используется при flags&4) ascii(34) примеры экранирования \r \n \t |
||
103 | uint8_t color; // цвет по таблице цветов |
||
104 | }; |
||
105 | |||
106 | struct editor_syntax_file |
||
107 | { |
||
108 | uint32_t count_colors_text; // кол-во цветов текста dd (text-color_wnd_text)/4 |
||
109 | uint32_t count_key_words; // кол-во ключевых слов dd (f1-text)/48 |
||
110 | color_t color_cursor; // dd 0xf1fcd0 |
||
111 | color_t color_wnd_capt; // dd 0x080808 |
||
112 | color_t color_wnd_work; // dd 0x1C1C1C |
||
113 | color_t color_wnd_bord; // dd 0xc0c0c0 |
||
114 | color_t color_select; // dd 0x3E3D32 |
||
115 | color_t color_cur_text; // dd 0x808080 |
||
116 | color_t color_wnd_text[]; // таблица цветов размером count_colors_text |
||
117 | // editor_color_item[]; // таблица ключевых подсвеченных слов размером count_key_words |
||
118 | }; |
||
119 | |||
120 | |||
121 | static struct editor_syntax_file default_syntax = { |
||
122 | 10, //count_colors_text |
||
6601 | siemargl | 123 | 1, // count_key_words dd (f1-text)/48, minimum 1 |
6589 | siemargl | 124 | 0xf1fcd0, //color_cursor dd 0xf1fcd0 |
125 | 0x080808, //color_wnd_capt dd 0x080808 |
||
126 | 0x1C1C1C, //color_wnd_work dd 0x1C1C1C |
||
127 | 0xc0c0c0, //color_wnd_bord dd 0xc0c0c0 |
||
128 | 0x3E3D32, //color_select dd 0x3E3D32 |
||
129 | 0x808080, //color_cur_text dd 0x808080 |
||
130 | {0xD0D0D0, 0xffff00, 0x00ff00, 0x00ffff, 0x808080, 0xff40ff, 0x4080ff, 0xff0000, 0x8080ff, 0x00ccff} |
||
131 | }; |
||
132 | // next structure must follow syntax definition, at least has 1 element !!! |
||
133 | static struct editor_color_item word1 = { |
||
134 | "siemargl", 1, 0, 0, 1 // test word colored as 1st in table |
||
135 | }; |
||
136 | // next structure preferably follow syntax definition, at least has 1 element !!! |
||
137 | static char f1_table[] = { |
||
138 | "\0" |
||
139 | "First\0" |
||
140 | "Last\0" |
||
141 | }; |
||
142 | |||
143 | |||
144 | extern void (*ted_draw)(editor *) __attribute__((__stdcall__)); |
||
145 | extern void (*ted_init_scroll_bars)(editor *, int opt) __attribute__((__stdcall__)); |
||
146 | /// opt bits = 1 - менять цвет скроллингов, 2 - изменились размеры окна, 4 - изменились размеры документа |
||
147 | extern void (*ted_init_syntax_file)(editor *) __attribute__((__stdcall__)); |
||
148 | extern void (*ted_mouse)(editor *) __attribute__((__stdcall__)); |
||
149 | extern void (*ted_text_add)(editor *, char *text, int textlen, int opt) __attribute__((__stdcall__)); |
||
150 | /// add text to cursor pos |
||
151 | /// opt == ted_opt_ed_change_time, ted_opt_ed_move_cursor |
||
152 | ///ted_opt_ed_move_cursor equ 1 ;двигать курсор после добавления текста |
||
153 | ///ted_opt_ed_change_time equ 2 ;добавлять изменения при редактировании текста |
||
154 | extern void (*ted_but_select_word)(editor *) __attribute__((__stdcall__)); |
||
155 | /// select word under cursor |
||
156 | extern void (*ted_but_copy)(editor *) __attribute__((__stdcall__)); |
||
157 | extern void (*ted_but_paste)(editor *) __attribute__((__stdcall__)); |
||
158 | |||
159 | extern void (*ted_but_find_next)(editor *) __attribute__((__stdcall__)); |
||
160 | ///move cursor to |
||
161 | |||
162 | |||
163 | |||
164 | extern void (*ted_but_sumb_upper_asm)(editor *) __attribute__((__stdcall__)); |
||
165 | static inline void editor_selected_toupper(editor *ed) |
||
166 | { |
||
167 | __asm__ __volatile__ ( |
||
6601 | siemargl | 168 | "push %%edi \n\t" |
169 | "push %%esi \n\t":::); |
||
6589 | siemargl | 170 | |
171 | (*ted_but_sumb_upper_asm)(ed); |
||
172 | |||
173 | __asm__ __volatile__ ( |
||
6601 | siemargl | 174 | "pop %%esi \n\t" |
175 | "pop %%edi \n\t":::); |
||
6589 | siemargl | 176 | } |
177 | |||
178 | extern void (*ted_but_sumb_lover_asm)(editor *) __attribute__((__stdcall__)); |
||
179 | static inline void editor_selected_tolower(editor *ed) |
||
180 | { |
||
181 | __asm__ __volatile__ ( |
||
6601 | siemargl | 182 | "push %%edi \n\t" |
183 | "push %%esi \n\t":::); |
||
6589 | siemargl | 184 | |
185 | (*ted_but_sumb_lover_asm)(ed); |
||
186 | |||
187 | __asm__ __volatile__ ( |
||
6601 | siemargl | 188 | "pop %%esi \n\t" |
189 | "pop %%edi \n\t":::); |
||
6589 | siemargl | 190 | } |
191 | |||
192 | |||
193 | extern void (*ted_but_convert_by_table_asm)(editor *, char* table) __attribute__((__stdcall__)); |
||
194 | static inline void editor_convert_by_table(editor *ed, char* table) |
||
195 | { |
||
196 | __asm__ __volatile__ ( |
||
6601 | siemargl | 197 | "push %%edi \n\t" |
198 | "push %%esi \n\t":::); |
||
6589 | siemargl | 199 | |
200 | (*ted_but_convert_by_table_asm)(ed, table); |
||
201 | |||
202 | __asm__ __volatile__ ( |
||
6601 | siemargl | 203 | "pop %%esi \n\t" |
204 | "pop %%edi \n\t":::); |
||
6589 | siemargl | 205 | } |
206 | |||
207 | extern int (*ted_can_save_asm)(editor *) __attribute__((__stdcall__)); |
||
208 | static inline int editor_can_save(editor *ed) |
||
6601 | siemargl | 209 | /// return 1 if need to be saved (has changes), 0 otherwise |
6589 | siemargl | 210 | { |
211 | int ret; |
||
212 | __asm__ __volatile__ ( |
||
6601 | siemargl | 213 | "push %%edi \n\t":::); |
6589 | siemargl | 214 | |
215 | (*ted_can_save_asm)(ed); |
||
216 | |||
217 | __asm__ __volatile__ ( |
||
6601 | siemargl | 218 | "pop %%edi \n\t":"=a"(ret)::); |
6589 | siemargl | 219 | return ret; |
220 | } |
||
221 | |||
222 | extern void (*ted_clear_asm)(editor *, int) __attribute__((__stdcall__)); |
||
223 | static inline void editor_clear(editor *ed, int all) |
||
224 | /// all==1 - clear all memory |
||
225 | { |
||
226 | __asm__ __volatile__ ( |
||
6601 | siemargl | 227 | "push %%edi \n\t":::); |
6589 | siemargl | 228 | |
229 | (*ted_clear_asm)(ed, all); |
||
230 | |||
231 | __asm__ __volatile__ ( |
||
6601 | siemargl | 232 | "pop %%edi \n\t":::); |
6589 | siemargl | 233 | } |
234 | |||
235 | extern void (*ted_delete_asm)(editor *) __attribute__((__stdcall__)); |
||
236 | static inline void editor_delete(editor *ed) |
||
237 | /// frees all memory (destroy) |
||
238 | { |
||
239 | __asm__ __volatile__ ( |
||
6601 | siemargl | 240 | "push %%edi \n\t":::); |
6589 | siemargl | 241 | |
242 | (*ted_delete_asm)(ed); |
||
243 | |||
244 | __asm__ __volatile__ ( |
||
6601 | siemargl | 245 | "pop %%edi \n\t":::); |
6589 | siemargl | 246 | free(ed->scr_w); |
247 | free(ed->scr_h); |
||
248 | free(ed->buffer); |
||
249 | free(ed->buffer_find); |
||
250 | } |
||
251 | |||
252 | extern void (*ted_init_asm)(editor *) __attribute__((__stdcall__)); |
||
253 | static inline void editor_init(editor *ed) |
||
254 | /// allocate memory |
||
255 | { |
||
256 | __asm__ __volatile__ ( |
||
6601 | siemargl | 257 | "push %%edi \n\t":::); |
6589 | siemargl | 258 | |
259 | (*ted_init_asm)(ed); |
||
260 | |||
261 | __asm__ __volatile__ ( |
||
6601 | siemargl | 262 | "pop %%edi \n\t":::); |
6589 | siemargl | 263 | } |
264 | |||
265 | extern int (*ted_is_select)(editor *) __attribute__((__stdcall__)); |
||
266 | static inline int editor_is_select(editor *ed) |
||
267 | /// return 1 if have selection |
||
268 | { |
||
269 | int ret; |
||
270 | __asm__ __volatile__ ( |
||
6601 | siemargl | 271 | "push %%ebx \n\t":::); |
6589 | siemargl | 272 | |
273 | (*ted_is_select)(ed); |
||
274 | |||
275 | __asm__ __volatile__ ( |
||
6601 | siemargl | 276 | "pop %%ebx \n\t":"=a"(ret)::); |
6589 | siemargl | 277 | return ret; |
278 | } |
||
279 | |||
280 | enum control_keys { |
||
281 | KM_SHIFT = 0x00010000, |
||
282 | KM_CTRL = 0x00020000, |
||
283 | KM_ALT = 0x00040000, |
||
284 | KM_NUMLOCK = 0x00080000 |
||
285 | }; |
||
286 | |||
287 | extern void (*ted_key_asm)(editor *, char* table, int control) __attribute__((__stdcall__)); |
||
6612 | siemargl | 288 | static inline __attribute__((__stdcall__)) void editor_keyboard(editor *ed, char* table, enum control_keys control, int ch) |
6589 | siemargl | 289 | /// control is KM_SHIFT, KM_ALT, KM_CTRL, KM_NUMLOCK, |
290 | /// ch = GET_KEY |
||
291 | /// table = SF_SYSTEM_GET,SSF_KEYBOARD_LAYOUT |
||
292 | { |
||
293 | __asm__ __volatile__ ( |
||
6612 | siemargl | 294 | "push %4\n\t" |
295 | "push %3\n\t" |
||
296 | "push %2\n\t" |
||
297 | "call *%1 \n\t"::"a"(ch), "m"(ted_key_asm), "m"(ed), "m"(table), "m"(control):); |
||
298 | /* |
||
299 | __asm__ __volatile__ ( |
||
6589 | siemargl | 300 | "nop \n\t"::"a"(ch):); |
301 | (*ted_key_asm)(ed, table, control); |
||
6612 | siemargl | 302 | */ |
6589 | siemargl | 303 | } |
304 | |||
305 | extern void (*ted_open_file_asm)(editor *, struct fs_dirinfo*, char *fname) __attribute__((__stdcall__)); |
||
306 | static inline int editor_openfile(editor *ed, char *fname, int *readbytes) |
||
307 | /// returns errcode as SysFn70 |
||
308 | { |
||
309 | int ret; |
||
310 | struct fs_dirinfo di; |
||
311 | __asm__ __volatile__ ( |
||
6601 | siemargl | 312 | "push %%edi \n\t":::); |
6589 | siemargl | 313 | |
314 | (*ted_open_file_asm)(ed, &di, fname); |
||
315 | |||
316 | __asm__ __volatile__ ( |
||
6601 | siemargl | 317 | "pop %%edi \n\t":"=b"(*readbytes), "=a"(ret)::); |
6589 | siemargl | 318 | return ret; |
319 | } |
||
320 | |||
321 | extern void (*ted_save_file_asm)(editor *, struct fs_dirinfo*, char *fname) __attribute__((__stdcall__)); |
||
322 | static inline int editor_savefile(editor *ed, char *fname) |
||
323 | /// returns errcode, calls fun_save_err() if exists |
||
324 | { |
||
325 | struct fs_dirinfo di; |
||
326 | |||
327 | (*ted_save_file_asm)(ed, &di, fname); |
||
328 | |||
329 | return ed->err_save; |
||
330 | } |
||
331 | |||
332 | extern void (*ted_but_cut)(editor *) __attribute__((__stdcall__)); |
||
333 | static inline void editor_cut(editor *ed) |
||
334 | { |
||
335 | __asm__ __volatile__ ( |
||
6601 | siemargl | 336 | "push %%edi \n\t":::); |
6589 | siemargl | 337 | |
338 | (*ted_but_cut)(ed); |
||
339 | |||
340 | __asm__ __volatile__ ( |
||
6601 | siemargl | 341 | "pop %%edi \n\t":::); |
6589 | siemargl | 342 | } |
343 | |||
344 | extern void (*ted_but_undo)(editor *) __attribute__((__stdcall__)); |
||
345 | static inline void editor_undo(editor *ed) |
||
346 | { |
||
347 | __asm__ __volatile__ ( |
||
6601 | siemargl | 348 | "push %%edi \n\t":::); |
6589 | siemargl | 349 | |
350 | (*ted_but_undo)(ed); |
||
351 | |||
352 | __asm__ __volatile__ ( |
||
6601 | siemargl | 353 | "pop %%edi \n\t":::); |
6589 | siemargl | 354 | } |
355 | |||
356 | extern void (*ted_but_redo)(editor *) __attribute__((__stdcall__)); |
||
357 | static inline void editor_redo(editor *ed) |
||
358 | { |
||
359 | __asm__ __volatile__ ( |
||
6601 | siemargl | 360 | "push %%edi \n\t":::); |
6589 | siemargl | 361 | |
362 | (*ted_but_redo)(ed); |
||
363 | |||
364 | __asm__ __volatile__ ( |
||
6601 | siemargl | 365 | "pop %%edi \n\t":::); |
6589 | siemargl | 366 | } |
367 | |||
368 | extern void (*ted_but_reverse)(editor *) __attribute__((__stdcall__)); |
||
369 | static inline void editor_reverse(editor *ed) |
||
370 | { |
||
371 | __asm__ __volatile__ ( |
||
6601 | siemargl | 372 | "push %%edi \n\t" |
373 | "push %%ebx\n\t":::); |
||
6589 | siemargl | 374 | |
375 | (*ted_but_reverse)(ed); |
||
376 | |||
377 | __asm__ __volatile__ ( |
||
6601 | siemargl | 378 | "pop %%ebx \n\t" |
379 | "pop %%edi \n\t":::); |
||
6589 | siemargl | 380 | } |
381 | |||
382 | extern void (*ted_text_colored_asm)() __attribute__((__stdcall__)); |
||
383 | static inline void editor_text_colored(editor *ed) |
||
384 | { |
||
385 | __asm__ __volatile__ ( |
||
386 | "nop \n\t"::"D"(ed):); |
||
387 | |||
388 | (*ted_text_colored_asm)(); |
||
389 | } |
||
390 | |||
391 | static inline |
||
392 | uint32_t get_control_keys(void) |
||
393 | { |
||
394 | uint32_t ctrl; |
||
395 | |||
396 | __asm__ __volatile__( |
||
397 | "int $0x40 \n\t" |
||
398 | :"=a"(ctrl) |
||
399 | :"a"(66),"b"(3)); |
||
400 | |||
401 | return ctrl; |
||
402 | }; |
||
403 | |||
404 | static inline |
||
405 | int get_keyboard_layout(int opt, char* buf) |
||
406 | /// 128 byte buffer |
||
407 | /// opt: 1 - normal, 2 - shifted, 3 - alted, or 9 - return language |
||
408 | { |
||
409 | uint32_t lang; |
||
410 | |||
411 | __asm__ __volatile__( |
||
412 | "int $0x40 \n\t" |
||
413 | :"=a"(lang) |
||
414 | :"a"(26),"b"(2), "c"(opt), "d"(buf)); |
||
415 | |||
416 | return lang; |
||
417 | }; |
||
418 | |||
6612 | siemargl | 419 | __attribute__((__stdcall__)) |
420 | static void editor_key(editor* ed, oskey_t key) |
||
6589 | siemargl | 421 | // callback for gui |
422 | { |
||
6612 | siemargl | 423 | //if(ed->el_focus != ed) return; // need to check not to lose keyb buffer |
424 | |||
6589 | siemargl | 425 | uint32_t control = get_control_keys(); |
426 | enum control_keys ed_ctrl = 0; |
||
427 | int ly_opt = 1; |
||
428 | if (control & 3) { ed_ctrl |= KM_SHIFT; ly_opt = 2; } |
||
429 | if (control & 0xC) ed_ctrl |= KM_CTRL; |
||
430 | if (control & 0x30){ ed_ctrl |= KM_ALT; ly_opt = 3; } |
||
431 | if (control & 0x80) ed_ctrl |= KM_NUMLOCK; |
||
432 | |||
433 | char conv_table[128]; |
||
434 | get_keyboard_layout(ly_opt, conv_table); |
||
435 | |||
6612 | siemargl | 436 | editor_keyboard(ed, conv_table, ed_ctrl, key.val); |
6589 | siemargl | 437 | } |
438 | |||
6601 | siemargl | 439 | static inline void gui_add_editor(kolibri_window *wnd, editor* e) |
6589 | siemargl | 440 | { |
441 | kolibri_window_add_element(wnd, KOLIBRI_EDITOR, e); |
||
442 | } |
||
443 | |||
6612 | siemargl | 444 | static inline editor* kolibri_new_editor(uint32_t x_w, uint32_t y_h, uint32_t font, uint32_t max_chars, void *editor_interlock) |
6589 | siemargl | 445 | /// font - 0b10SSS 8x16 size multiply (SSS+1), 0xSSS - 6x9 multiply (SSS+1) |
446 | |||
447 | { |
||
448 | editor *ed = (editor *)calloc(1, sizeof(editor)); |
||
449 | ed->x_pos = x_w >> 16; |
||
450 | ed->width = x_w & 0xFFFF; |
||
451 | ed->y_pos = y_h >> 16; |
||
452 | ed->hight = y_h & 0xFFFF; |
||
453 | |||
6612 | siemargl | 454 | ed->w_pane = 30; |
455 | ed->h_pane = 20; |
||
6589 | siemargl | 456 | // font |
457 | if (font == 0) font = 0x10; // default 16 = 8x16 |
||
458 | int font_multipl = (font & 7) + 1; |
||
459 | ed->font_size = font << 24; |
||
460 | if (font & 0x10) // 8x16 |
||
461 | { |
||
462 | ed->width_sym = 8 * font_multipl; |
||
463 | ed->hight_sym = 16 * font_multipl; |
||
464 | } else // 6x9 |
||
465 | { |
||
466 | ed->width_sym = 6 * font_multipl; |
||
467 | ed->hight_sym = 9 * font_multipl; |
||
468 | } |
||
469 | // memory sizing for text & syntax |
||
470 | ed->max_chars = max_chars; |
||
471 | ed->increase_size = max_chars / 2; |
||
472 | ed->syntax_file_size = sizeof (default_syntax); |
||
473 | |||
474 | /* // loaded auto from syntax |
||
475 | ed->color_cursor = 0x808080; |
||
476 | ed->color_wnd_capt = 0x80; |
||
477 | ed->color_wnd_bord = 0xd0d0d0; |
||
478 | ed->color_select = 0x208080; |
||
479 | ed->color_cur_text = 0xff0000; |
||
480 | ed->color_wnd_text = 0xffff00; |
||
481 | */ |
||
482 | ed->symbol_new_line = 20; // ascii(20) |
||
483 | |||
6612 | siemargl | 484 | ed->scr_w = kolibri_new_scrollbar_def(X_Y(0, 16), X_Y(0, 0), 100, 30, 0); // cur_area will be inited ltr, max & pos undef |
485 | ed->scr_h = kolibri_new_scrollbar_def(X_Y(0, 0), X_Y(0, 16), 100, 30, 0); // cur_area will be inited ltr, max & pos undef |
||
6589 | siemargl | 486 | |
487 | ed->buffer_size = TE_BUF_SIZE; |
||
488 | ed->buffer = malloc(TE_BUF_SIZE); |
||
489 | ed->buffer_find = malloc(TE_BUF_SIZE / 8); //where to store text to search |
||
490 | |||
491 | ed->cur_ins = 1; // insert mode default |
||
492 | ed->mode_color = 1; // can select text |
||
493 | ed->mode_invis = 1; // show nonprinted symbols |
||
494 | |||
6612 | siemargl | 495 | ed->el_focus = editor_interlock; |
496 | |||
6589 | siemargl | 497 | // ??? saveregs ax,cx,di |
498 | editor_init(ed); // memory allocation, cleaning |
||
499 | ed->syntax_file = (char*)&default_syntax; |
||
500 | (*ted_init_syntax_file)(ed); // load colors and syntax highlight |
||
501 | ed->help_text_f1 = f1_table; // override if not aligned immediately after syntax words |
||
502 | ed->key_words_data = &word1; |
||
503 | |||
504 | return ed; |
||
505 | } |
||
506 | |||
507 | |||
508 | #endif // KOLIBRI_EDITOR_H><> |