Subversion Repositories Kolibri OS

Rev

Rev 6601 | Go to most recent revision | Details | 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
27
    uint32_t    w_pane;      //30 ширина панели в окне
28
    uint32_t    h_pane;      //25 высота панели в окне
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
123
    0,      // count_key_words dd (f1-text)/48
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 , calls ted_fun_find_err() if exist
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__ (
168
             "push edi \n\t"
169
             "push esi \n\t":::);
170
 
171
    (*ted_but_sumb_upper_asm)(ed);
172
 
173
    __asm__ __volatile__ (
174
             "pop esi \n\t"
175
             "pop edi \n\t":::);
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__ (
182
             "push edi \n\t"
183
             "push esi \n\t":::);
184
 
185
    (*ted_but_sumb_lover_asm)(ed);
186
 
187
    __asm__ __volatile__ (
188
             "pop esi \n\t"
189
             "pop edi \n\t":::);
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__ (
197
             "push edi \n\t"
198
             "push esi \n\t":::);
199
 
200
    (*ted_but_convert_by_table_asm)(ed, table);
201
 
202
    __asm__ __volatile__ (
203
             "pop esi \n\t"
204
             "pop edi \n\t":::);
205
}
206
 
207
extern int (*ted_can_save_asm)(editor *) __attribute__((__stdcall__));
208
static inline int editor_can_save(editor *ed)
209
/// return 1 if can be saved
210
{
211
    int ret;
212
    __asm__ __volatile__ (
213
             "push edi \n\t":::);
214
 
215
    (*ted_can_save_asm)(ed);
216
 
217
    __asm__ __volatile__ (
218
             "pop edi \n\t":"=a"(ret)::);
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__ (
227
             "push edi \n\t":::);
228
 
229
    (*ted_clear_asm)(ed, all);
230
 
231
    __asm__ __volatile__ (
232
             "pop edi \n\t":::);
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__ (
240
             "push edi \n\t":::);
241
 
242
    (*ted_delete_asm)(ed);
243
 
244
    __asm__ __volatile__ (
245
             "pop edi \n\t":::);
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__ (
257
             "push edi \n\t":::);
258
 
259
    (*ted_init_asm)(ed);
260
 
261
    __asm__ __volatile__ (
262
             "pop edi \n\t":::);
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__ (
271
             "push ebx \n\t":::);
272
 
273
    (*ted_is_select)(ed);
274
 
275
    __asm__ __volatile__ (
276
             "pop ebx \n\t":"=a"(ret)::);
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__));
288
static inline void editor_keyboard(editor *ed, char* table, enum control_keys control, int ch)
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__ (
294
             "nop \n\t"::"a"(ch):);
295
 
296
    (*ted_key_asm)(ed, table, control);
297
}
298
 
299
extern void (*ted_open_file_asm)(editor *, struct fs_dirinfo*, char *fname) __attribute__((__stdcall__));
300
static inline int editor_openfile(editor *ed, char *fname, int *readbytes)
301
/// returns errcode as SysFn70
302
{
303
    int     ret;
304
    struct fs_dirinfo   di;
305
    __asm__ __volatile__ (
306
             "push edi \n\t":::);
307
 
308
    (*ted_open_file_asm)(ed, &di, fname);
309
 
310
    __asm__ __volatile__ (
311
             "pop edi \n\t":"=b"(*readbytes), "=a"(ret)::);
312
    return ret;
313
}
314
 
315
extern void (*ted_save_file_asm)(editor *, struct fs_dirinfo*, char *fname) __attribute__((__stdcall__));
316
static inline int editor_savefile(editor *ed, char *fname)
317
/// returns errcode, calls fun_save_err() if exists
318
{
319
    struct fs_dirinfo   di;
320
 
321
    (*ted_save_file_asm)(ed, &di, fname);
322
 
323
    return ed->err_save;
324
}
325
 
326
extern void (*ted_but_cut)(editor *) __attribute__((__stdcall__));
327
static inline void editor_cut(editor *ed)
328
{
329
    __asm__ __volatile__ (
330
             "push edi \n\t":::);
331
 
332
    (*ted_but_cut)(ed);
333
 
334
    __asm__ __volatile__ (
335
             "pop edi \n\t":::);
336
}
337
 
338
extern void (*ted_but_undo)(editor *) __attribute__((__stdcall__));
339
static inline void editor_undo(editor *ed)
340
{
341
    __asm__ __volatile__ (
342
             "push edi \n\t":::);
343
 
344
    (*ted_but_undo)(ed);
345
 
346
    __asm__ __volatile__ (
347
             "pop edi \n\t":::);
348
}
349
 
350
extern void (*ted_but_redo)(editor *) __attribute__((__stdcall__));
351
static inline void editor_redo(editor *ed)
352
{
353
    __asm__ __volatile__ (
354
             "push edi \n\t":::);
355
 
356
    (*ted_but_redo)(ed);
357
 
358
    __asm__ __volatile__ (
359
             "pop edi \n\t":::);
360
}
361
 
362
extern void (*ted_but_reverse)(editor *) __attribute__((__stdcall__));
363
static inline void editor_reverse(editor *ed)
364
{
365
    __asm__ __volatile__ (
366
             "push edi \n\t"
367
             "push ebx\n\t":::);
368
 
369
    (*ted_but_reverse)(ed);
370
 
371
    __asm__ __volatile__ (
372
             "pop ebx \n\t"
373
             "pop edi \n\t":::);
374
}
375
 
376
extern void (*ted_text_colored_asm)() __attribute__((__stdcall__));
377
static inline void editor_text_colored(editor *ed)
378
{
379
    __asm__ __volatile__ (
380
             "nop \n\t"::"D"(ed):);
381
 
382
    (*ted_text_colored_asm)();
383
}
384
 
385
static inline
386
uint32_t get_control_keys(void)
387
{
388
    uint32_t ctrl;
389
 
390
    __asm__ __volatile__(
391
    "int $0x40 \n\t"
392
    :"=a"(ctrl)
393
    :"a"(66),"b"(3));
394
 
395
    return ctrl;
396
};
397
 
398
static inline
399
int get_keyboard_layout(int opt, char* buf)
400
/// 128 byte buffer
401
/// opt: 1 - normal, 2 - shifted, 3 - alted, or 9 - return language
402
{
403
    uint32_t lang;
404
 
405
    __asm__ __volatile__(
406
    "int $0x40 \n\t"
407
    :"=a"(lang)
408
    :"a"(26),"b"(2), "c"(opt), "d"(buf));
409
 
410
    return lang;
411
};
412
 
413
 
414
static void editor_key(editor* ed)
415
// callback for gui
416
{
417
    uint32_t control = get_control_keys();
418
    enum control_keys ed_ctrl = 0;
419
    int ly_opt = 1;
420
    if (control & 3) { ed_ctrl |= KM_SHIFT; ly_opt = 2; }
421
    if (control & 0xC) ed_ctrl |= KM_CTRL;
422
    if (control & 0x30){ ed_ctrl |= KM_ALT; ly_opt = 3; }
423
    if (control & 0x80) ed_ctrl |= KM_NUMLOCK;
424
 
425
    char conv_table[128];
426
    get_keyboard_layout(ly_opt, conv_table);
427
 
428
    editor_keyboard(ed, conv_table, ed_ctrl, get_key().val);
429
}
430
 
431
inline void gui_add_editor(kolibri_window *wnd, editor* e)
432
{
433
    kolibri_window_add_element(wnd, KOLIBRI_EDITOR, e);
434
}
435
 
436
static inline editor* kolibri_new_editor(uint32_t x_w, uint32_t y_h, uint32_t font, uint32_t max_chars, editor **editor_interlock)
437
/// font - 0b10SSS 8x16 size multiply (SSS+1), 0xSSS - 6x9 multiply (SSS+1)
438
 
439
{
440
    editor *ed = (editor *)calloc(1, sizeof(editor));
441
    ed->x_pos = x_w >> 16;
442
    ed->width = x_w & 0xFFFF;
443
    ed->y_pos = y_h >> 16;
444
    ed->hight = y_h & 0xFFFF;
445
 
446
    // no panel, w_pane, h_pane == 0
447
    // font
448
    if (font == 0) font = 0x10;  // default 16 = 8x16
449
    int font_multipl = (font & 7) + 1;
450
    ed->font_size = font << 24;
451
    if (font & 0x10) // 8x16
452
    {
453
        ed->width_sym = 8 * font_multipl;
454
        ed->hight_sym = 16 * font_multipl;
455
    } else   // 6x9
456
    {
457
        ed->width_sym = 6 * font_multipl;
458
        ed->hight_sym = 9 * font_multipl;
459
    }
460
    // memory sizing for text & syntax
461
    ed->max_chars = max_chars;
462
    ed->increase_size = max_chars / 2;
463
    ed->syntax_file_size = sizeof (default_syntax);
464
 
465
/* // loaded auto from syntax
466
    ed->color_cursor = 0x808080;
467
    ed->color_wnd_capt = 0x80;
468
    ed->color_wnd_bord = 0xd0d0d0;
469
    ed->color_select = 0x208080;
470
    ed->color_cur_text = 0xff0000;
471
    ed->color_wnd_text = 0xffff00;
472
*/
473
    ed->symbol_new_line = 20;  // ascii(20)
474
 
475
    ed->scr_w = kolibri_new_scrollbar_def(0, 0, 100, 30, 0);
476
    ed->scr_h = kolibri_new_scrollbar_def(0, 0, 100, 30, 0);
477
 
478
    ed->buffer_size = TE_BUF_SIZE;
479
    ed->buffer = malloc(TE_BUF_SIZE);
480
    ed->buffer_find = malloc(TE_BUF_SIZE / 8);  //where to store text to search
481
 
482
    ed->cur_ins = 1; // insert mode default
483
    ed->mode_color = 1; // can select text
484
    ed->mode_invis = 1; // show nonprinted symbols
485
 
486
    // ??? saveregs ax,cx,di
487
    editor_init(ed);  // memory allocation, cleaning
488
    ed->syntax_file = (char*)&default_syntax;
489
    (*ted_init_syntax_file)(ed); // load colors and syntax highlight
490
    ed->help_text_f1 = f1_table; // override if not aligned immediately after syntax words
491
    ed->key_words_data = &word1;
492
 
493
    return ed;
494
}
495
 
496
 
497
#endif // KOLIBRI_EDITOR_H