From c30f9415d34348400a7167c73bddff8546c1b539 Mon Sep 17 00:00:00 2001 From: IgorA Date: Tue, 29 Jan 2019 20:02:48 +0000 Subject: [PATCH] t_edit: 1) add keys Ctrl+H, Ctrl+G 2) update panels code git-svn-id: svn://kolibrios.org@7579 a494cfbc-eb01-0410-851d-a64ba20cac60 --- contrib/C_Layer/ASM/loadboxlib.asm | 2 + contrib/C_Layer/INCLUDE/kolibri_editor.h | 50 +++---- .../libraries/box_lib/trunk/box_lib.asm | 4 +- .../libraries/box_lib/trunk/box_lib.mac | 9 +- .../box_lib/trunk/doc/t_edit/t_edit.htm | 31 +++-- .../libraries/box_lib/trunk/t_edit.asm | 118 +++++++++------- programs/network/ftpc/gui.inc | 10 +- programs/other/t_edit/strlen.inc | 75 +++++++++- programs/other/t_edit/t_button.inc | 130 +++++++++++++----- programs/other/t_edit/t_data.inc | 2 +- programs/other/t_edit/t_draw.inc | 85 +++++++++--- programs/other/t_edit/t_edit.asm | 48 +++++-- programs/other/t_edit/t_edit.png | Bin 10544 -> 20336 bytes programs/other/t_edit_synt/te_data.inc | 11 +- programs/other/t_edit_synt/te_syntax.asm | 27 +++- 15 files changed, 424 insertions(+), 178 deletions(-) diff --git a/contrib/C_Layer/ASM/loadboxlib.asm b/contrib/C_Layer/ASM/loadboxlib.asm index b560c9f787..11d76363fd 100644 --- a/contrib/C_Layer/ASM/loadboxlib.asm +++ b/contrib/C_Layer/ASM/loadboxlib.asm @@ -119,6 +119,7 @@ import lib_boxlib, \ ted_but_find, 'ted_but_find' , \ ted_but_replace, 'ted_but_replace' , \ ted_text_colored, 'ted_text_colored' , \ + ted_go_to_position, 'ted_go_to_position' , \ frame_draw, 'frame_draw' , \ progressbar_draw,'progressbar_draw' , \ progressbar_progress, 'progressbar_progress' @@ -186,6 +187,7 @@ public ted_but_reverse as '_ted_but_reverse' public ted_but_find as '_ted_but_find' public ted_but_replace as '_ted_but_replace' public ted_text_colored as 'ted_text_colored_asm' +public ted_go_to_position as '_ted_go_to_position' public tl_data_init as '_tl_data_init' public tl_data_clear as '_tl_data_clear' diff --git a/contrib/C_Layer/INCLUDE/kolibri_editor.h b/contrib/C_Layer/INCLUDE/kolibri_editor.h index 61e8a961ab..2818fe4dd9 100644 --- a/contrib/C_Layer/INCLUDE/kolibri_editor.h +++ b/contrib/C_Layer/INCLUDE/kolibri_editor.h @@ -77,16 +77,16 @@ typedef struct __attribute__ ((__packed__)) { uint8_t mode_color; // 1 Ёхцшь т√фхыхэш  ёыют ЎтхЄюь (0-т√ъы. 1-тъы.) uint8_t mode_invis; // 0 Ёхцшь яюърчр эхяхўрЄрхь√ї ёшьтюыют uint8_t gp_opt; // 0 юяЎшш тючтЁр∙рхь√х ЇєэъЎшхщ ted_get_pos_by_cursor - editor_callback fun_on_key_ctrl_o; // єърчрЄхы№ эр ЇєэъЎш■ т√ч√трхьє■ яЁш эрцрЄшш Ctrl+O (юЄъЁ√Єшх Їрщыр), can be NULL - editor_callback fun_on_key_ctrl_f; // ... Ctrl+F (т√чютр/ёъЁ√Єш  ярэхыш яюшёър) - editor_callback fun_on_key_ctrl_n; // ... Ctrl+N (ёючфрэшх эютюую фюъєьхэЄр) - editor_callback fun_on_key_ctrl_s; // ... Ctrl+S + editor_callback fun_on_key_ctrl_all; // єърчрЄхы№ эр ЇєэъЎш■ т√ч√трхьє■ яЁш эрцрЄшш Ctrl+N,O,S,F,G,H, can be NULL + uint32_t reserved_1; // ... + uint32_t reserved_2; // ... + uint32_t reserved_3; // ... uint32_t buffer_size;// BUF_SIZE ЁрчьхЁ сєЇхЁр ъюяшЁютрэш /тёЄртъш editor_callback fun_find_err; // єърчрЄхы№ эр ЇєэъЎш■ т√ч√трхьє■ хёыш яюшёъ чръюэўшыё  эхєфрўэю editor_callback fun_init_synt_err; // unused єърчрЄхы№ эр ЇєэъЎш■ т√ч√трхьє■ яЁш ю°шсюўэюь юЄъЁ√Єшш Їрщыр ёшэЄръёшёр editor_callback fun_draw_panel_buttons; // єърчрЄхы№ эр ЇєэъЎш■ Ёшёютрэш  ярэхыш ё ъэюяърьш - editor_callback fun_draw_panel_find; // єърчрЄхы№ эр ЇєэъЎш■ Ёшёютрэш  ярэхыш яюшёър - editor_callback fun_draw_panel_syntax; // єърчрЄхы№ эр ЇєэъЎш■ Ёшёютрэш  ярэхыш ёшэЄръёшёр + editor_callback fun_draw_panels; // єърчрЄхы№ эр ЇєэъЎш■ Ёшёютрэш  ярэхыш яюшёър|чрьхэ√|яхЁхїюфр|ёшэЄръёшёр + uint32_t reserved_4; // ... editor_callback fun_save_err; // єърчрЄхы№ эр ЇєэъЎш■ т√ч√трхьє■ хёыш ёюїЁрэхэшх Їрщыр чръюэўшыюё№ эхєфрўэю uint32_t increase_size; //200 ўшёыю ёшьтюыют эр ъюЄюЁ√х сєфхЄ єтхўштрЄ№ё  ярь Є№ яЁш эхїтрЄъх void *ptr_free_symb; // шёяюы№чєхЄё  тэєЄЁш ¤ыхьхэЄр фы  єёъюЁхэш  тёЄртъш ЄхъёЄр @@ -145,19 +145,19 @@ extern void (*ted_draw)(editor *) __attribute__((__stdcall__)); extern void (*ted_init_scroll_bars)(editor *, int opt) __attribute__((__stdcall__)); /// opt bits = 1 - ьхэ Є№ ЎтхЄ ёъЁюыышэуют, 2 - шчьхэшышё№ ЁрчьхЁ√ юъэр, 4 - шчьхэшышё№ ЁрчьхЁ√ фюъєьхэЄр extern void (*ted_init_syntax_file)(editor *) __attribute__((__stdcall__)); -extern void (*ted_mouse)(editor *) __attribute__((__stdcall__)); +extern void (*ted_mouse)(editor *) __attribute__((__stdcall__)); extern void (*ted_text_add)(editor *, char *text, int textlen, int opt) __attribute__((__stdcall__)); /// add text to cursor pos /// opt == ted_opt_ed_change_time, ted_opt_ed_move_cursor ///ted_opt_ed_move_cursor equ 1 ;фтшурЄ№ ъєЁёюЁ яюёых фюсртыхэш  ЄхъёЄр ///ted_opt_ed_change_time equ 2 ;фюсрты Є№ шчьхэхэш  яЁш ЁхфръЄшЁютрэшш ЄхъёЄр -extern void (*ted_but_select_word)(editor *) __attribute__((__stdcall__)); +extern void (*ted_but_select_word)(editor *) __attribute__((__stdcall__)); /// select word under cursor -extern void (*ted_but_copy)(editor *) __attribute__((__stdcall__)); -extern void (*ted_but_paste)(editor *) __attribute__((__stdcall__)); +extern void (*ted_but_copy)(editor *) __attribute__((__stdcall__)); +extern void (*ted_but_paste)(editor *) __attribute__((__stdcall__)); extern void (*ted_but_find)(editor *) __attribute__((__stdcall__)); -extern void (*ted_but_replace)(editor *) __attribute__((__stdcall__)); +extern void (*ted_but_replace)(editor *) __attribute__((__stdcall__)); ///move cursor to , calls ted_fun_find_err() if exist @@ -170,7 +170,7 @@ extern void (*ted_but_convert_by_table)(editor *, char* table) __attribute__((__ /// return 1 if need to be saved (has changes), 0 otherwise extern int (*ted_can_save)(editor *) __attribute__((__stdcall__)); - + /// all==1 - clear all memory extern void (*ted_clear)(editor *, int all) __attribute__((__stdcall__)); @@ -183,7 +183,7 @@ static inline void editor_delete(editor *ed) free(ed->scr_h); free(ed->buffer); free(ed->buffer_find); -} +} /// allocate memory extern void (*ted_init)(editor *) __attribute__((__stdcall__)); @@ -214,7 +214,7 @@ static inline __attribute__((__stdcall__)) void editor_keyboard(editor *ed, char "nop \n\t"::"a"(ch):); (*ted_key_asm)(ed, table, control); */ -} +} extern void (*ted_open_file_asm)(editor *, struct fs_dirinfo*, char *fname) __attribute__((__stdcall__)); static inline int editor_openfile(editor *ed, char *fname, int *readbytes) @@ -230,7 +230,7 @@ static inline int editor_openfile(editor *ed, char *fname, int *readbytes) __asm__ __volatile__ ( "pop %%edi \n\t":"=b"(*readbytes), "=a"(ret)::); return ret; -} +} extern void (*ted_save_file_asm)(editor *, struct fs_dirinfo*, char *fname) __attribute__((__stdcall__)); static inline int editor_savefile(editor *ed, char *fname) @@ -241,7 +241,7 @@ static inline int editor_savefile(editor *ed, char *fname) (*ted_save_file_asm)(ed, &di, fname); return ed->err_save; -} +} extern void (*ted_but_cut)(editor *) __attribute__((__stdcall__)); @@ -257,7 +257,7 @@ static inline void editor_text_colored(editor *ed) __asm__ __volatile__ ( "call *%0 \n\t"::"m"(ted_text_colored_asm), "D"(ed):); -} +} static inline uint32_t get_control_keys(void) @@ -309,7 +309,7 @@ static void editor_key(editor* ed, oskey_t key) static inline void gui_add_editor(kolibri_window *wnd, editor* e) { - kolibri_window_add_element(wnd, KOLIBRI_EDITOR, e); + kolibri_window_add_element(wnd, KOLIBRI_EDITOR, e); } static inline editor* kolibri_new_editor(uint32_t x_w, uint32_t y_h, uint32_t font, uint32_t max_chars, void *editor_interlock) @@ -317,11 +317,11 @@ static inline editor* kolibri_new_editor(uint32_t x_w, uint32_t y_h, uint32_t fo { editor *ed = (editor *)calloc(1, sizeof(editor)); - ed->x_pos = x_w >> 16; - ed->width = x_w & 0xFFFF; - ed->y_pos = y_h >> 16; + ed->x_pos = x_w >> 16; + ed->width = x_w & 0xFFFF; + ed->y_pos = y_h >> 16; ed->hight = y_h & 0xFFFF; - + ed->w_pane = 30; ed->h_pane = 20; // font @@ -352,8 +352,8 @@ static inline editor* kolibri_new_editor(uint32_t x_w, uint32_t y_h, uint32_t fo */ ed->symbol_new_line = 20; // ascii(20) - 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 - 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 + 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 + 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 ed->buffer_size = TE_BUF_SIZE; ed->buffer = malloc(TE_BUF_SIZE); @@ -372,7 +372,7 @@ static inline editor* kolibri_new_editor(uint32_t x_w, uint32_t y_h, uint32_t fo ed->key_words_data = &word1; return ed; -} +} /// return 1 if symbol is not visible (deleted or undo-ed) static inline int editor_symbol_not_vis(editor* ed, struct editor_symbol* sym) diff --git a/programs/develop/libraries/box_lib/trunk/box_lib.asm b/programs/develop/libraries/box_lib/trunk/box_lib.asm index b32a6be070..db1a10adff 100644 --- a/programs/develop/libraries/box_lib/trunk/box_lib.asm +++ b/programs/develop/libraries/box_lib/trunk/box_lib.asm @@ -321,7 +321,8 @@ dd sz_ted_but_reverse, ted_but_reverse dd sz_ted_but_find, ted_but_find dd sz_ted_but_replace, ted_but_replace dd sz_ted_text_colored, ted_text_colored -dd sz_ted_version, 0x00000005 +dd sz_ted_go_to_position, ted_go_to_position +dd sz_ted_version, 6 dd sz_Frame_draw, frame.draw dd szVersion_frame, 0x00010001 @@ -434,6 +435,7 @@ sz_ted_but_reverse db 'ted_but_reverse',0 sz_ted_but_find db 'ted_but_find',0 sz_ted_but_replace db 'ted_but_replace',0 sz_ted_text_colored db 'ted_text_colored',0 +sz_ted_go_to_position db 'ted_go_to_position',0 sz_ted_version db 'version_text_edit',0 sz_Frame_draw db 'frame_draw',0 diff --git a/programs/develop/libraries/box_lib/trunk/box_lib.mac b/programs/develop/libraries/box_lib/trunk/box_lib.mac index 5e15cb243c..d944c75ed8 100644 --- a/programs/develop/libraries/box_lib/trunk/box_lib.mac +++ b/programs/develop/libraries/box_lib/trunk/box_lib.mac @@ -408,16 +408,13 @@ ted_cur_ins equ byte[edi+194] ;реж ted_mode_color equ byte[edi+195] ;режим выделения слов цветом (0-выкл. 1-вкл.) ted_mode_invis equ byte[edi+196] ;режим показа непечатаемых символов ted_gp_opt equ byte[edi+197] ;опции возвращаемые функцией ted_get_pos_by_cursor -ted_fun_on_key_ctrl_o equ dword[edi+198] ;указатель на функцию вызываемую при нажатии Ctrl+O (открытие файла) -ted_fun_on_key_ctrl_f equ dword[edi+202] ;... Ctrl+F (вызова/скрытия панели поиска) -ted_fun_on_key_ctrl_n equ dword[edi+206] ;... Ctrl+N (создание нового документа) -ted_fun_on_key_ctrl_s equ dword[edi+210] ;... Ctrl+S +ted_fun_on_key_ctrl_all equ dword[edi+198] ;указатель на функцию вызываемую при нажатии Ctrl+N,O,F,S,H,G +;+202,+206,+210 зарезервировано ted_buffer_size equ dword[edi+214] ;размер буфера копирования/вставки ted_fun_find_err equ dword[edi+218] ;указатель на функцию вызываемую если поиск закончился неудачно ;ted_fun_init_synt_err equ dword[edi+222] ;указатель на функцию вызываемую при ошибочном открытии файла синтаксиса ted_fun_draw_panel_buttons equ dword[edi+226] ;указатель на функцию рисования панели с кнопками -ted_fun_draw_panel_find equ dword[edi+230] ;указатель на функцию рисования панели поиска -ted_fun_draw_panel_syntax equ dword[edi+234] ;указатель на функцию рисования панели синтаксиса +ted_fun_draw_panels equ dword[edi+230] ;указатель на функцию рисования панели поиска|...|синтаксиса ted_fun_save_err equ dword[edi+238] ;указатель на функцию вызываемую если сохранение файла закончилось неудачно ted_increase_size equ dword[edi+242] ;число символов на которые будет увечиваться память при нехватке ted_ptr_free_symb equ dword[edi+246] ;указатель на свободную память, в которую можно добавлять символ (используется внутри элемента для ускорения вставки текста) diff --git a/programs/develop/libraries/box_lib/trunk/doc/t_edit/t_edit.htm b/programs/develop/libraries/box_lib/trunk/doc/t_edit/t_edit.htm index 053c13ffe0..55a765d822 100644 --- a/programs/develop/libraries/box_lib/trunk/doc/t_edit/t_edit.htm +++ b/programs/develop/libraries/box_lib/trunk/doc/t_edit/t_edit.htm @@ -37,6 +37,7 @@
  • ted_open_file
  • ted_text_add
  • ted_text_colored
  • +
  • ted_go_to_position
  • ╘юЁьрЄ Їрщыр яюфётхЄъш *.syn

    ╤ЄЁєъЄєЁр tedit

    @@ -48,8 +49,8 @@

    ┬ючьюцэюёЄш ¤ыхьхэЄр

    @@ -284,6 +285,14 @@ stdcall [ted_text_add], tedit0,text_buffer,30,ebx call [ted_text_colored] pop edi +

    ted_go_to_position

    +

    ╘єэъЎш  фы  яхЁхїюфр эр єърчрээє■ яючшЎш■. ╧ЁшэшьрхЄ 3 ярЁрьхЄЁр:

    +

    1) ёЄЁєъЄєЁр tedit,

    +

    2) эюьхЁ ёЄЁюъш,

    +

    3) эюьхЁ ёшьтюыр.

    +

    ╧ЁшьхЁ шёяюы№чютрэш :

    +
    stdcall [ted_go_to_position], tedit0,50,3
    +

    ┬эєЄЁхээшх ЇєэъЎшш:

    ted_get_text_perv_pos - яхЁхїюф эр яЁхф√фє∙шщ ёшьтюы т Ўхяш (ўхЁхч єърчрЄхы№ 'perv')

    ted_get_text_next_pos - яхЁхїюф эр ёыхфє■∙шщ ёшьтюы т Ўхяш (ўхЁхч єърчрЄхы№ 'next')

    @@ -373,22 +382,20 @@ tedit0: ; .mode_color db 1 ;+195 Ёхцшь т√фхыхэш  ёыют ЎтхЄюь (0-т√ъы. 1-тъы.) .mode_invis db 0 ;+196 Ёхцшь яюърчр эхяхўрЄрхь√ї ёшьтюыют .gp_opt db 0 ;+197 юяЎшш тючтЁр∙рхь√х ЇєэъЎшхщ ted_get_pos_by_cursor - .fun_on_key_ctrl_o dd but_ctrl_o ;+198 єърчрЄхы№ эр ЇєэъЎш■ т√ч√трхьє■ яЁш эрцрЄшш Ctrl+O (юЄъЁ√Єшх Їрщыр) - .fun_on_key_ctrl_f dd 0 ;+202 ... Ctrl+F (т√чютр/ёъЁ√Єш  ярэхыш яюшёър) - .fun_on_key_ctrl_n dd but_ctrl_n ;+206 ... Ctrl+N (ёючфрэшх эютюую фюъєьхэЄр) - .fun_on_key_ctrl_s dd 0 ;+210 ... Ctrl+S - .buffer_size dd BUF_SIZE ;+214 ЁрчьхЁ сєЇхЁр ъюяшЁютрэш /тёЄртъш - .fun_find_err dd 0 ;+218 єърчрЄхы№ эр ЇєэъЎш■ т√ч√трхьє■ хёыш яюшёъ чръюэўшыё  эхєфрўэю + .fun_on_key_ctrl_all dd but_ctrl_all ;+198 єърчрЄхы№ эр ЇєэъЎш■ т√ч√трхьє■ яЁш эрцрЄшш Ctrl+N,O,S,F,H,G + dd 0,0,0 ;чрЁхчхЁтшЁютрэю + .buffer_size dd BUF_SIZE ;+214 ЁрчьхЁ сєЇхЁр ъюяшЁютрэш /тёЄртъш + .fun_find_err dd 0 ;+218 єърчрЄхы№ эр ЇєэъЎш■ т√ч√трхьє■ хёыш яюшёъ чръюэўшыё  эхєфрўэю .fun_init_synt_err dd 0 ;+222 єърчрЄхы№ эр ЇєэъЎш■ т√ч√трхьє■ яЁш ю°шсюўэюь юЄъЁ√Єшш Їрщыр ёшэЄръёшёр .fun_draw_panel_buttons dd 0 ;+226 єърчрЄхы№ эр ЇєэъЎш■ Ёшёютрэш  ярэхыш ё ъэюяърьш - .fun_draw_panel_find dd 0 ;+230 єърчрЄхы№ эр ЇєэъЎш■ Ёшёютрэш  ярэхыш яюшёър - .fun_draw_panel_syntax dd 0 ;+234 єърчрЄхы№ эр ЇєэъЎш■ Ёшёютрэш  ярэхыш ёшэЄръёшёр - .fun_save_err dd 0 ;+238 єърчрЄхы№ эр ЇєэъЎш■ т√ч√трхьє■ хёыш ёюїЁрэхэшх Їрщыр чръюэўшыюё№ эхєфрўэю + .fun_draw_panels dd 0 ;+230 єърчрЄхы№ эр ЇєэъЎш■ Ёшёютрэш  ярэхыш яюшёър/чрьхэ√/яхЁхїюфр/ёшэЄръёшёр + dd 0 ;чрЁхчхЁтшЁютрэю + .fun_save_err dd 0 ;+238 єърчрЄхы№ эр ЇєэъЎш■ т√ч√трхьє■ хёыш ёюїЁрэхэшх Їрщыр чръюэўшыюё№ эхєфрўэю .increase_size dd 225 ;+242 ўшёыю ёшьтюыют эр ъюЄюЁ√х сєфхЄ єтхўштрЄ№ё  ярь Є№ яЁш эхїтрЄъх .ptr_free_symb dd ? ;+246 єърчрЄхы№ эр ётюсюфэє■ ярь Є№, т ъюЄюЁє■ ьюцэю фюсрты Є№ ёшьтюы (шёяюы№чєхЄё  тэєЄЁш ¤ыхьхэЄр фы  єёъюЁхэш  тёЄртъш ЄхъёЄр) .font_s dd ? ;+250 ёЄшыш фы  °ЁшЇЄр (юЄ 0 фю 7 ьэюцшЄхы№ фы  ЁрчьхЁр, +16 фы  тЄюЁюую ёшёЄхьэюую °ЁшЇЄр)
    -

    ─юъєьхэЄрЎш  юсэюты ырё№ яюёыхфэшщ Ёрч 21.01.19.

    +

    ─юъєьхэЄрЎш  юсэюты ырё№ яюёыхфэшщ Ёрч 29.01.19.

    \ No newline at end of file diff --git a/programs/develop/libraries/box_lib/trunk/t_edit.asm b/programs/develop/libraries/box_lib/trunk/t_edit.asm index 56634f7600..e5a651a427 100644 --- a/programs/develop/libraries/box_lib/trunk/t_edit.asm +++ b/programs/develop/libraries/box_lib/trunk/t_edit.asm @@ -1,6 +1,6 @@ ; макрос для системной библиотеки box_lib.obj ; элемент TextEditor для Kolibri OS -; файл последний раз изменялся 21.10.2018 IgorA +; файл последний раз изменялся 29.01.2019 IgorA ; на код применена GPL2 лицензия ;input: @@ -20,12 +20,6 @@ macro ColToIndexOffset ind_reg,out_reg { add out_reg,ted_key_words_data } -TED_PANEL_NULL equ 0 ;нет открытой панели -TED_PANEL_FIND equ 1 ;панель поиска -TED_PANEL_SYNTAX equ 2 ;панель выбора файлов подсветки -TED_PANEL_REPLACE equ 3 ;панель замены -TED_PANEL_WIDTH equ 150 ;ширина панели - TED_LINES_IN_NEW_FILE equ 30 ;число строк в новом файле MAX_COLOR_WORD_LEN equ 40 ;------------------------------------------------------------------------------ @@ -241,38 +235,44 @@ proc ted_key, edit:dword, table:dword, control:dword test esi,KM_CTRL ;Ctrl+... jz .key_Ctrl ; *** вызов внешних функций которые требуют окна открытия/сохранения/поиска/... + cmp ted_fun_on_key_ctrl_all,0 + je .end0 + xor al,al cmp ah,24 ;Ctrl+O jne @f - cmp ted_fun_on_key_ctrl_o,0 - je .end_key_fun - call ted_fun_on_key_ctrl_o + mov al,'O' @@: cmp ah,31 ;Ctrl+S - jne .end_ctrl_s - cmp ted_fun_on_key_ctrl_s,0 - je .end_key_fun - xor eax,eax - test esi,KM_SHIFT - jz @f - inc eax - @@: - call ted_fun_on_key_ctrl_s - jmp .end_key_fun - .end_ctrl_s: + jne @f + mov al,'S' + @@: cmp ah,33 ;Ctrl+F jne @f - cmp ted_panel_id,TED_PANEL_FIND - je @f - cmp ted_fun_on_key_ctrl_f,0 - je .end_key_fun - call ted_fun_on_key_ctrl_f + mov al,'F' + @@: + cmp ah,34 ;Ctrl+G + jne @f + mov al,'G' + @@: + cmp ah,35 ;Ctrl+H + jne @f + mov al,'H' @@: cmp ah,49 ;Ctrl+N jne @f - cmp ted_fun_on_key_ctrl_n,0 - je .end_key_fun - call ted_fun_on_key_ctrl_n + mov al,'N' @@: + or al,al + jz .end0 + and eax,0xff + test esi,KM_SHIFT + jz @f + or eax,0x100 + @@: + stdcall ted_fun_on_key_ctrl_all, eax + jmp .end_key_fun + .end0: + ; *** вызов внутренних функций cmp ah,30 ;Ctrl+A jne @f @@ -441,7 +441,7 @@ proc ted_key, edit:dword, table:dword, control:dword cmp dword[table],0 je @f - stdcall KeyConvertToASCII, dword[table] + stdcall KeyConvertToASCII, [table] @@: ;mov ted_drag_k,0 ;заканчиваем выделение от клавиатуры @@ -1157,7 +1157,7 @@ proc ted_text_add, edit:dword, text:dword, t_len:dword, add_opt:dword jg .no_cur_mov inc ted_cur_x ;move cursor ;call ted_go_to_pos - cmp byte [esi],13 + cmp byte[esi],13 jne .no_cur_mov mov ted_cur_x,0 inc ted_cur_y @@ -1169,18 +1169,18 @@ proc ted_text_add, edit:dword, text:dword, t_len:dword, add_opt:dword ; *** вставка текущего символа из строки *** mov ecx,ted_opt_ed_change_time not ecx - and dword[add_opt],ecx ;n_tim=false; + and [add_opt],ecx ;n_tim=false; - mov cl,byte [esi] ;tex[i].c=ta[ns]; - mov byte [edx],cl - m2m dword [edx+10],ted_tim_ch ;tex[i].tc=ted_tim_ch; + mov cl,byte[esi] ;tex[i].c=ta[ns]; + mov byte[edx],cl + m2m dword[edx+10],ted_tim_ch ;tex[i].tc=ted_tim_ch; mov [edx+2],eax ;tex[i].perv=po_t; mov ecx,eax imul ecx,sizeof.symbol add ecx,ted_tex ; *** ecx = tex[po_t] *** add ecx,6 ; *** ecx = tex[po_t].next *** - m2m dword [edx+6],dword [ecx] ;tex[i].next=tex[po_t].next; + m2m dword[edx+6],dword[ecx] ;tex[i].next=tex[po_t].next; call ted_get_text_arr_index ;*** eax = i *** mov [ecx],eax ;tex[po_t].next=i; // ссылки перенаправляем @@ -1968,7 +1968,7 @@ ted_get_num_lines: call ted_iterat_next cmp edx,ted_tex_1 jle @f - cmp byte [edx],13 + cmp byte[edx],13 jne @b inc eax jmp @b @@ -2046,6 +2046,38 @@ proc ted_set_undo ret endp +;description: +; переход на указанную позицию +;input: +; row = номер строки +; col = символ +align 16 +proc ted_go_to_position uses ecx edx edi, edit:dword, row:dword, col:dword + mov edi,[edit] + ; подготовка строки + mov edx,[row] + call ted_get_num_lines + cmp edx,eax + jle @f + mov edx,eax ;ограничение по строке max + @@: + dec edx + cmp edx,0 + jge @f + xor edx,edx ;ограничение по строке min + @@: + ; подготовка символа + mov ecx,[col] + dec ecx + cmp ecx,0 + jge @f + xor ecx,ecx + @@: + call ted_go_to_pos + stdcall ted_draw,edi + ret +endp + ;input: ; ecx = Col ; edx = Row @@ -3498,13 +3530,9 @@ align 4 inc bx int 0x40 - cmp ted_fun_draw_panel_find,0 + cmp ted_fun_draw_panels,0 je @f - call ted_fun_draw_panel_find - @@: - cmp ted_fun_draw_panel_syntax,0 - je @f - call ted_fun_draw_panel_syntax + stdcall ted_fun_draw_panels, edi @@: popad ret @@ -3515,7 +3543,6 @@ endp align 16 proc ted_draw_main_cursor pushad - mov eax,SF_DRAW_RECT ;draw cursor mov ecx,ted_wnd_t ;calc rect -> y0,y1 add ecx,ted_rec_t @@ -3811,8 +3838,7 @@ endp align 16 proc KeyConvertToASCII uses ebx, table:dword mov ebx,[table] ;convert scan to ascii - ror ax,8 - xor ah,ah + shr ax,8 add bx,ax ;? ebx,eax mov ah,byte[ebx] ret diff --git a/programs/network/ftpc/gui.inc b/programs/network/ftpc/gui.inc index aca98fc085..2ac6c68160 100755 --- a/programs/network/ftpc/gui.inc +++ b/programs/network/ftpc/gui.inc @@ -1025,16 +1025,14 @@ tedit0: .mode_color db 1 ;+195 .mode_invis db 0 ;+196 .gp_opt db 0 ;+197 - dd 0;.fun_on_key_ctrl_o dd but_ctrl_o ;+198 - .fun_on_key_ctrl_f dd 0 ;+202 ... Ctrl+F - dd 0;.fun_on_key_ctrl_n dd but_ctrl_n ;+206 ... Ctrl+N - .fun_on_key_ctrl_s dd 0 ;+210 ... Ctrl+S + dd 0 ;.fun_on_key_ctrl_all dd but_ctrl_all ;+198 + dd 0,0,0 ;reserved .buffer_size dd 4096 ;+214 .fun_find_err dd 0 ;+218 .fun_init_synt_err dd 0 ;+222 .fun_draw_panel_buttons dd 0 ;+226 .fun_draw_panel_find dd 0 ;+230 - .fun_draw_panel_syntax dd 0 ;+234 + dd 0 ;+234 reserved .fun_save_err dd 0 ;+238 .increase_size dd 1000 ;+242 .ptr_free_symb dd ? ;+246 @@ -1161,6 +1159,8 @@ import box_lib, \ ted_but_find, 'ted_but_find', \ ted_but_replace, 'ted_but_replace', \ ted_text_colored, 'ted_text_colored', \ + ted_text_colored, 'ted_text_colored', \ + ted_go_to_position, 'ted_go_to_position', \ progressbar_draw, 'progressbar_draw' import libimg, \ diff --git a/programs/other/t_edit/strlen.inc b/programs/other/t_edit/strlen.inc index ccac9e1747..5641bc0afc 100644 --- a/programs/other/t_edit/strlen.inc +++ b/programs/other/t_edit/strlen.inc @@ -89,4 +89,77 @@ align 4 stosb mov byte[edi],0 ;╨▓ ╨║╨╛╨╜╨╡╤Ж ╤Б╤В╤А╨╛╨║╨╕ ╤Б╤В╨░╨▓╨╕╨╝ 0, ╤З╤В╨╛-╨▒╤Л ╨╜╨╡ ╨▓╤Л╨╗╨░╨╖╨╕╨╗ ╨╝╤Г╤Б╨╛╤А @@: - ret \ No newline at end of file + ret + +;input: +; buf - ╤Г╨║╨░╨╖╨░╤В╨╡╨╗╤М ╨╜╨░ ╤Б╤В╤А╨╛╨║╤Г, ╤З╨╕╤Б╨╗╨╛ ╨┤╨╛╨╗╨╢╨╜╨╛ ╨▒╤Л╤В╤М ╨▓ 10 ╨╕╨╗╨╕ 16 ╤А╨╕╤З╨╜╨╛╨╝ ╨▓╨╕╨┤╨╡ +;output: +; eax - ╤З╨╕╤Б╨╗╨╛ +align 4 +proc conv_str_to_int, buf:dword + xor eax,eax + push ebx ecx esi + xor ebx,ebx + mov esi,[buf] + ;╨╛╨┐╤А╨╡╨┤╨╡╨╗╨╡╨╜╨╕╨╡ ╨╛╤В╤А╨╕╤Ж╨░╤В╨╡╨╗╤М╨╜╤Л╤Е ╤З╨╕╤Б╨╡╨╗ + xor ecx,ecx + inc ecx + cmp byte[esi],'-' + jne @f + dec ecx + inc esi + @@: + + cmp word[esi],'0x' + je .load_digit_16 + + .load_digit_10: ;╤Б╤З╨╕╤В╤Л╨▓╨░╨╜╨╕╨╡ 10-╤В╨╕╤З╨╜╤Л╤Е ╤Ж╨╕╤Д╤А + mov bl,byte[esi] + cmp bl,'0' + jl @f + cmp bl,'9' + jg @f + sub bl,'0' + imul eax,10 + add eax,ebx + inc esi + jmp .load_digit_10 + jmp @f + + .load_digit_16: ;╤Б╤З╨╕╤В╤Л╨▓╨░╨╜╨╕╨╡ 16-╤А╨╕╤З╨╜╤Л╤Е ╤Ж╨╕╤Д╤А + add esi,2 + .cycle_16: + mov bl,byte[esi] + cmp bl,'0' + jl @f + cmp bl,'f' + jg @f + cmp bl,'9' + jle .us1 + cmp bl,'A' + jl @f ;╨╛╤В╤Б╨╡╨╕╨▓╨░╨╡╨╝ ╤Б╨╕╨╝╨▓╨╛╨╗╤Л >'9' ╨╕ <'A' + .us1: ;╤Б╨╛╤Б╤В╨░╨▓╨╜╨╛╨╡ ╤Г╤Б╨╗╨╛╨▓╨╕╨╡ + cmp bl,'F' + jle .us2 + cmp bl,'a' + jl @f ;╨╛╤В╤Б╨╡╨╕╨▓╨░╨╡╨╝ ╤Б╨╕╨╝╨▓╨╛╨╗╤Л >'F' ╨╕ <'a' + sub bl,32 ;╨┐╨╡╤А╨╡╨▓╨╛╨┤╨╕╨╝ ╤Б╨╕╨╝╨▓╨╛╨╗╤Л ╨▓ ╨▓╨╡╤А╤Е╨╜╨╕╨╣ ╤А╨╡╨│╨╕╤Б╤В╤А, ╨┤╨╗╤П ╤Г╨┐╤А╨╛╤Й╨╡╨╜╨╕╤П ╨╕╤Е ╨┐╨╛╤Б╨╗╨╡╨┤╤Г╤Й╨╡╨╣ ╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨╕ + .us2: ;╤Б╨╛╤Б╤В╨░╨▓╨╜╨╛╨╡ ╤Г╤Б╨╗╨╛╨▓╨╕╨╡ + sub bl,'0' + cmp bl,9 + jle .cor1 + sub bl,7 ;convert 'A' to '10' + .cor1: + shl eax,4 + add eax,ebx + inc esi + jmp .cycle_16 + @@: + cmp ecx,0 ;╨╡╤Б╨╗╨╕ ╤З╨╕╤Б╨╗╨╛ ╨╛╤В╤А╨╕╤Ж╨░╤В╨╡╨╗╤М╨╜╨╛╨╡ + jne @f + sub ecx,eax + mov eax,ecx + @@: + pop esi ecx ebx + ret +endp \ No newline at end of file diff --git a/programs/other/t_edit/t_button.inc b/programs/other/t_edit/t_button.inc index 9a8e37d707..eac0799e8c 100644 --- a/programs/other/t_edit/t_button.inc +++ b/programs/other/t_edit/t_button.inc @@ -137,7 +137,7 @@ button: @@: cmp ah,ID_BUT_SYNTAX_MODE jne @f - stdcall but_panel_choose_syntax, tedit0 + call but_panel_choose_syntax jmp still @@: cmp ah,ID_BUT_CONVERT_1251_866 @@ -172,10 +172,15 @@ button: jmp still .no_change: cmp ah,203 ;заменить все - jne .no_change_a + jne @f call but_replace_all jmp still - .no_change_a: + @@: + cmp ah,204 ;перейти на строку + jne @f + call but_goto_line + jmp still + @@: cmp ah,1 jne @f @@ -258,6 +263,13 @@ proc but_replace_all uses ebx ecx edx ret endp +align 4 +proc but_goto_line uses eax + stdcall conv_str_to_int, buf_goto + stdcall [ted_go_to_position], tedit0,eax,1 + ret +endp + ;input: ; al = код ошибки align 4 @@ -366,6 +378,44 @@ proc but_no_msg_OpenFile uses eax ebx esi ret endp +;description: +; функция вызываемую при нажатии Ctrl+N,O,F,S,H,G +align 4 +proc ted_but_ctrl_all uses eax, opt_key:dword + mov eax,[opt_key] + cmp al,'N' ;Ctrl+N + jne @f + call ted_but_new_file + jmp .end0 + @@: + cmp al,'O' ;Ctrl+O + jne @f + call ted_but_open_file + jmp .end0 + @@: + cmp al,'S' ;Ctrl+S + jne @f + shr eax,8 + call ted_but_save_file + jmp .end0 + @@: + cmp al,'F' ;Ctrl+F + jne @f + call but_panel_find + jmp .end0 + @@: + cmp al,'G' ;Ctrl+G + jne @f + call but_panel_goto + jmp .end0 + @@: + cmp al,'H' ;Ctrl+H + jne .end0 + call but_panel_replace + .end0: + ret +endp + ;description: ; функция открытия файла с возможным окном сообщения (о возможности отменить открытие) align 4 @@ -598,60 +648,64 @@ endp ;description: ; вызов/скрытие панели поиска align 4 -proc but_panel_find uses edi - mov edi,tedit0 +proc but_panel_find + stdcall on_panel_change, tedit0,TED_PANEL_FIND + ;or word[edit_find.flags],ed_focus + ret +endp - cmp ted_panel_id,TED_PANEL_NULL - je @f - mov ted_panel_id,TED_PANEL_NULL - mov ted_wnd_l,0 - jmp .e_if - @@: - mov ted_panel_id,TED_PANEL_FIND - mov ted_wnd_l,TED_PANEL_WIDTH - .e_if: - call EvSize - stdcall [ted_draw],edi +;description: +; вызов/скрытие панели перехода +align 4 +proc but_panel_goto + stdcall on_panel_change, tedit0,TED_PANEL_GOTO + ;or word[edit_goto.flags],ed_focus ret endp ;description: ; вызов/скрытие панели замены align 4 -proc but_panel_replace uses edi - mov edi,tedit0 - - cmp ted_panel_id,TED_PANEL_NULL - je @f - mov ted_panel_id,TED_PANEL_NULL - mov ted_wnd_l,0 - jmp .e_if - @@: - mov ted_panel_id,TED_PANEL_REPLACE - mov ted_wnd_l,TED_PANEL_WIDTH - .e_if: - call EvSize - stdcall [ted_draw],edi +proc but_panel_replace + stdcall on_panel_change, tedit0,TED_PANEL_REPLACE + ;or word[edit_find.flags],ed_focus ret endp ;description: ; вызов/скрытие панели с файлами синтаксиса align 4 -proc but_panel_choose_syntax uses edi, edit:dword - mov edi,[edit] +proc but_panel_choose_syntax + stdcall on_panel_change, tedit0,TED_PANEL_SYNTAX + ret +endp - cmp ted_panel_id,TED_PANEL_NULL - je @f +align 4 +proc on_panel_change uses eax edi, edit:dword, new_id:dword + mov edi,[edit] + mov eax,[new_id] + + ;if(panel_id==new_id) panel_id=0, draw all + cmp ted_panel_id,al + jne @f mov ted_panel_id,TED_PANEL_NULL mov ted_wnd_l,0 jmp .e_if @@: - mov ted_panel_id,TED_PANEL_SYNTAX + ;elseif(panel_id==0) panel_id=new_id, draw all + cmp ted_panel_id,TED_PANEL_NULL + jne @f + mov ted_panel_id,al mov ted_wnd_l,TED_PANEL_WIDTH .e_if: call EvSize stdcall [ted_draw],edi + jmp .end0 + ;else panel_id=new_id, draw panel + @@: + mov ted_panel_id,al + stdcall draw_panels,edi + .end0: ret endp @@ -692,7 +746,7 @@ but_find_key_w: jne @f pushad mcall SF_CREATE_THREAD,1,prop_start,thread_coords - mov dword[wnd_k_words_run],eax + mov [wnd_k_words_run],eax popad @@: ret @@ -701,7 +755,7 @@ but_find_key_w: ; выделение/скрытие непечатаемых символов align 4 proc but_sumb_invis uses edi, edit:dword - mov edi,dword[edit] + mov edi,[edit] xor ted_mode_invis,1 call draw_but_toolbar @@ -713,7 +767,7 @@ endp ; выделение/скрытие ключевых слов align 4 proc but_use_syntax uses edi, edit:dword - mov edi,dword[edit] + mov edi,[edit] xor ted_mode_color,1 cmp ted_mode_color,0 diff --git a/programs/other/t_edit/t_data.inc b/programs/other/t_edit/t_data.inc index 02f5b1def7..ebd6bf214a 100644 --- a/programs/other/t_edit/t_data.inc +++ b/programs/other/t_edit/t_data.inc @@ -1 +1 @@ -fn_col_option dd def_col_file fn_syntax_dir db 'info/',0 def_col_file db 'default.syn',0 exit_code dd 0 ;переменная используемая для выхода из программы panel_but rb 21 ;настройки отображения кнопок на панели ;значения задаваемые по умолчанию, без ini файла ini_def_window_t equ 20 ini_def_window_l equ 200 ini_def_window_w equ 570 ini_def_window_h equ 470 ini_def_symbol_w equ 7 ini_def_symbol_h equ 10 ini_def_font_s equ 0 ini_def_scroll_type equ 0 ;описание параматров для ini файла ini_name db 't_edit.ini',0 ini_sec_window db 'Window',0 key_window_t db 't',0 key_window_l db 'l',0 key_window_w db 'w',0 key_window_h db 'h',0 key_symbol_w db 'symbol_w',0 key_symbol_h db 'symbol_h',0 key_font_s db 'font_s',0 key_scroll_type db 'scroll_type',0 key_but_new db 'but_new',0 key_but_open db 'but_open',0 key_but_save db 'but_save',0 key_but_save_as db 'but_save_as',0 key_but_select db 'but_select',0 key_but_cut db 'but_cut',0 key_but_copy db 'but_copy',0 key_but_paste db 'but_paste',0 key_but_find db 'but_find',0 key_but_replace db 'but_replace',0 key_but_key_words db 'but_key_words',0 key_but_upper db 'but_upper',0 key_but_lower db 'but_lower',0 key_but_reverse db 'but_reverse',0 key_but_undo db 'but_undo',0 key_but_redo db 'but_redo',0 key_but_invisible db 'but_invisible',0 key_but_syntax_list db 'but_syntax_list',0 key_but_syntax_mode db 'but_syntax_mode',0 key_but_convert_1251_866 db 'but_convert_1251_866',0 key_but_convert_866_1251 db 'but_convert_866_1251',0 ini_sec_options db 'Options',0 key_synt_file: db 'syntax_' .numb: db '0',0 key_synt_ext: db 'ext_' .numb: db '0',0 ini_def_synt_f db 0 align 4 max_synt_auto_open equ 10 synt_auto_open: rb 64*max_synt_auto_open db 0 system_dir_0 db '/sys/lib/' lib_name_0 db 'box_lib.obj',0 system_dir_1 db '/sys/lib/' lib_name_1 db 'msgbox.obj',0 system_dir_2 db '/sys/lib/' lib_name_2 db 'proc_lib.obj',0 system_dir_3 db '/sys/lib/' lib_name_3 db 'libimg.obj',0 system_dir_4 db '/sys/lib/' lib_name_4 db 'libini.obj',0 system_dir_5 db '/sys/lib/' lib_name_5 db 'kmenu.obj',0 ;--------------------------------------------------------------------- align 4 import_box_lib: dd alib_init0 ;функция запускается макросом 1 раз при подключении бибилиотеки, потому в программе метка на нее не нужна edit_box_draw dd aEdit_box_draw edit_box_key dd aEdit_box_key edit_box_mouse dd aEdit_box_mouse ;edit_box_set_text dd aEdit_box_set_text ;version_ed dd aVersion_ed option_box_draw dd aOption_box_draw option_box_mouse dd aOption_box_mouse ;version_op dd aVersion_op scrollbar_ver_draw dd aScrollbar_ver_draw scrollbar_ver_mouse dd aScrollbar_ver_mouse scrollbar_hor_draw dd aScrollbar_hor_draw scrollbar_hor_mouse dd aScrollbar_hor_mouse ;version_scrollbar dd aVersion_scrollbar tl_data_init dd sz_tl_data_init tl_data_clear dd sz_tl_data_clear tl_info_clear dd sz_tl_info_clear tl_key dd sz_tl_key tl_mouse dd sz_tl_mouse tl_draw dd sz_tl_draw tl_info_undo dd sz_tl_info_undo tl_info_redo dd sz_tl_info_redo tl_node_add dd sz_tl_node_add tl_node_set_data dd sz_tl_node_set_data tl_node_get_data dd sz_tl_node_get_data tl_node_delete dd sz_tl_node_delete tl_cur_beg dd sz_tl_cur_beg tl_cur_next dd sz_tl_cur_next tl_cur_perv dd sz_tl_cur_perv ;tl_node_close_open dd sz_tl_node_close_open tl_node_lev_inc dd sz_tl_node_lev_inc tl_node_lev_dec dd sz_tl_node_lev_dec ted_but_sumb_upper dd sz_ted_but_sumb_upper ted_but_sumb_lover dd sz_ted_but_sumb_lover ted_but_convert_by_table dd sz_ted_but_convert_by_table ted_can_save dd sz_ted_can_save ted_clear dd sz_ted_clear ted_delete dd sz_ted_delete ted_draw dd sz_ted_draw ted_init dd sz_ted_init ted_init_scroll_bars dd sz_ted_init_scroll_bars ted_init_syntax_file dd sz_ted_init_syntax_file ted_is_select dd sz_ted_is_select ted_key dd sz_ted_key ted_mouse dd sz_ted_mouse ted_open_file dd sz_ted_open_file ted_save_file dd sz_ted_save_file ted_text_add dd sz_ted_text_add ted_but_select_word dd sz_ted_but_select_word ted_but_cut dd sz_ted_but_cut ted_but_copy dd sz_ted_but_copy ted_but_paste dd sz_ted_but_paste ted_but_undo dd sz_ted_but_undo ted_but_redo dd sz_ted_but_redo ted_but_reverse dd sz_ted_but_reverse ted_but_find dd sz_ted_but_find ted_but_replace dd sz_ted_but_replace ted_text_colored dd sz_ted_text_colored version_text_edit dd sz_ted_version dd 0,0 alib_init0 db 'lib_init',0 aEdit_box_draw db 'edit_box',0 aEdit_box_key db 'edit_box_key',0 aEdit_box_mouse db 'edit_box_mouse',0 ;aEdit_box_set_text db 'edit_box_set_text',0 ;aVersion_ed db 'version_ed',0 aOption_box_draw db 'option_box_draw',0 aOption_box_mouse db 'option_box_mouse',0 ;aVersion_op db 'version_op',0 aScrollbar_ver_draw db 'scrollbar_v_draw',0 aScrollbar_ver_mouse db 'scrollbar_v_mouse',0 aScrollbar_hor_draw db 'scrollbar_h_draw',0 aScrollbar_hor_mouse db 'scrollbar_h_mouse',0 ;aVersion_scrollbar db 'version_scrollbar',0 sz_tl_data_init db 'tl_data_init',0 sz_tl_data_clear db 'tl_data_clear',0 sz_tl_info_clear db 'tl_info_clear',0 sz_tl_key db 'tl_key',0 sz_tl_mouse db 'tl_mouse',0 sz_tl_draw db 'tl_draw',0 sz_tl_info_undo db 'tl_info_undo',0 sz_tl_info_redo db 'tl_info_redo',0 sz_tl_node_add db 'tl_node_add',0 sz_tl_node_set_data db 'tl_node_set_data',0 sz_tl_node_get_data db 'tl_node_get_data',0 sz_tl_node_delete db 'tl_node_delete',0 sz_tl_cur_beg db 'tl_cur_beg',0 sz_tl_cur_next db 'tl_cur_next',0 sz_tl_cur_perv db 'tl_cur_perv',0 ;sz_tl_node_close_open db 'tl_node_close_open',0 sz_tl_node_lev_inc db 'tl_node_lev_inc',0 sz_tl_node_lev_dec db 'tl_node_lev_dec',0 sz_ted_but_sumb_upper db 'ted_but_sumb_upper',0 sz_ted_but_sumb_lover db 'ted_but_sumb_lover',0 sz_ted_but_convert_by_table db 'ted_but_convert_by_table',0 sz_ted_can_save db 'ted_can_save',0 sz_ted_clear db 'ted_clear',0 sz_ted_delete db 'ted_delete',0 sz_ted_draw db 'ted_draw',0 sz_ted_init db 'ted_init',0 sz_ted_init_scroll_bars db 'ted_init_scroll_bars',0 sz_ted_init_syntax_file db 'ted_init_syntax_file',0 sz_ted_is_select db 'ted_is_select',0 sz_ted_key db 'ted_key',0 sz_ted_mouse db 'ted_mouse',0 sz_ted_open_file db 'ted_open_file',0 sz_ted_save_file db 'ted_save_file',0 sz_ted_text_add db 'ted_text_add',0 sz_ted_but_select_word db 'ted_but_select_word',0 sz_ted_but_cut db 'ted_but_cut',0 sz_ted_but_copy db 'ted_but_copy',0 sz_ted_but_paste db 'ted_but_paste',0 sz_ted_but_undo db 'ted_but_undo',0 sz_ted_but_redo db 'ted_but_redo',0 sz_ted_but_reverse db 'ted_but_reverse',0 sz_ted_but_find db 'ted_but_find',0 sz_ted_but_replace db 'ted_but_replace',0 sz_ted_text_colored db 'ted_text_colored',0 sz_ted_version db 'version_text_edit',0 align 4 import_proclib: OpenDialog_Init dd aOpenDialog_Init OpenDialog_Start dd aOpenDialog_Start dd 0,0 aOpenDialog_Init db 'OpenDialog_init',0 aOpenDialog_Start db 'OpenDialog_start',0 align 4 import_msgbox_lib: mb_create dd amb_create mb_reinit dd amb_reinit mb_setfunctions dd amb_setfunctions dd 0,0 amb_create db 'mb_create',0 amb_reinit db 'mb_reinit',0 amb_setfunctions db 'mb_setfunctions',0 align 4 import_libimg: dd alib_init1 img_to_rgb2 dd aimg_to_rgb2 img_decode dd aimg_decode img_destroy dd aimg_destroy dd 0,0 alib_init1 db 'lib_init',0 aimg_to_rgb2 db 'img_to_rgb2',0 aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных aimg_destroy db 'img_destroy',0 align 4 import_libini: dd alib_init2 ini_get_str dd aini_get_str ini_get_int dd aini_get_int ini_get_color dd aini_get_color dd 0,0 alib_init2 db 'lib_init',0 aini_get_str db 'ini_get_str',0 aini_get_int db 'ini_get_int',0 aini_get_color db 'ini_get_color',0 align 4 import_libkmenu: kmenu_init dd akmenu_init kmainmenu_draw dd akmainmenu_draw kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent ksubmenu_new dd aksubmenu_new ksubmenu_delete dd aksubmenu_delete ksubmenu_draw dd aksubmenu_draw ksubmenu_add dd aksubmenu_add kmenuitem_new dd akmenuitem_new kmenuitem_delete dd akmenuitem_delete kmenuitem_draw dd akmenuitem_draw dd 0,0 akmenu_init db 'kmenu_init',0 akmainmenu_draw db 'kmainmenu_draw',0 akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0 aksubmenu_new db 'ksubmenu_new',0 aksubmenu_delete db 'ksubmenu_delete',0 aksubmenu_draw db 'ksubmenu_draw',0 aksubmenu_add db 'ksubmenu_add',0 akmenuitem_new db 'kmenuitem_new',0 akmenuitem_delete db 'kmenuitem_delete',0 akmenuitem_draw db 'kmenuitem_draw',0 ;--------------------------------------------------------------------- align 4 wScr scrollbar 16,50, 300,50, 15, 100,30,0, 0,0,0, 1 align 4 hScr scrollbar 150,0, 16,50, 15, 100,30,0, 0,0,0, 1 ;дочерний скроллинг для элемента ListBox align 4 ws_dir_lbox scrollbar 16,0, 30,70, 15, 100,30,0, 0,0,0, 1 ;--------------------------------------------------------------------- align 4 OpenDialog_data: .type dd 0 .procinfo dd procinfo ;+4 .com_area_name dd communication_area_name ;+8 .com_area dd 0 ;+12 .opendir_path dd plugin_path ;+16 .dir_default_path dd default_dir ;+20 .start_path dd file_name ;+24 путь к диалогу открытия файлов .draw_window dd draw_window ;+28 .status dd 0 ;+32 .openfile_path dd openfile_path ;+36 путь к открываемому файлу .filename_area dd filename_area ;+40 имя открываемого файла .filter_area dd Filter .x: .x_size dw 420 ;+48 ; Window X size .x_start dw 10 ;+50 ; Window X position .y: .y_size dw 320 ;+52 ; Window y size .y_start dw 10 ;+54 ; Window Y position default_dir db '/rd/1',0 ;директория по умолчанию communication_area_name: db 'FFFFFFFF_open_dialog',0 open_dialog_name: db 'opendial',0 communication_area_default_path: db '/rd/1/File managers/',0 Filter: dd Filter.end - Filter.1 .1: db 'ASM',0 db 'CPP',0 db 'INC',0 db 'MAC',0 db 'INI',0 db 'TXT',0 db 'H',0 db 'C',0 db 'HTM',0 db 'HTML',0 db 'PY',0 db 'SH',0 db 'BAT',0 db 'LUA',0 db 'INF',0 db 'LOG',0 db 'DBG',0 db 'DAT',0 .end: db 0 txt_Info db '" -tI',0 TED_PANEL_NULL equ 0 ;нет открытой панели TED_PANEL_FIND equ 1 ;панель поиска TED_PANEL_SYNTAX equ 2 ;панель выбора файлов подсветки TED_PANEL_REPLACE equ 3 ;панель замены TED_PANEL_WIDTH equ 150 ;ширина панели count_of_dir_list_files equ 15 ;максимальное число файлов синтаксиса показываемых в окне элемента tree1 ;------------------------------------------------------------------------------ struct TexSelect x0 dd ? y0 dd ? x1 dd ? y1 dd ? ends ;------------------------------------------------------------------------------ align 4 tedit0: ;структура текстового редактора .wnd BOX 0,50,440,150 ;+ 0 .rec BOX 30,25,ini_def_symbol_w,ini_def_symbol_h ;+16 .drag_m db 0 ;+32 выделение от мыши .drag_k db 0 ;+33 выделение от клавиатуры .sel TexSelect 0,0,0,0 ;+34 структура выделения .seln TexSelect ;+50 дополнительная структура выделения .tex dd 0 ;+66 text memory pointer .tex_1 dd 0 ;+70 text first symbol pointer .tex_end dd 0 ;+74 text end memory pointer .cur_x dd 0 ;+78 координата x курсора .cur_y dd 0 ;+82 координата y курсора .max_chars dd maxChars ;+86 максимальное число символов в одном документе .count_colors_text dd 1 ;+90 колличество цветов текста .count_key_words dd 0 ;+94 колличество ключевых слов .color_cursor dd 0x808080 ;+98 цвет курсора .color_wnd_capt dd 0x80 ;+102 цвет полей вокруг окна .color_wnd_work dd 0x0 ;+106 цвет фона окна .color_wnd_bord dd 0xd0d0d0 ;+110 цвет текста на полях .color_select dd 0x208080 ;+114 цвет выделения .color_cur_text dd 0xff0000 ;+118 цвет символа под курсором .color_wnd_text dd 0xffff00 ;+122 цвет текста в окне .syntax_file dd 0 ;+126 указатель на начало файла синтаксиса .syntax_file_size dd maxSyntaxFileSize ;+130 максимальный размер файла синтаксиса .text_colors dd 0 ;+134 указатель на массив цветов текста .help_text_f1 dd 0 ;+138 указатель на текст справки (по нажатии F1) .help_id dd -1 ;+142 идентификатор для справки .key_words_data dd 0 ;+146 указатель на структуры ключевых слов TexColViv .tim_ch dd ? ;+150 количество изменений в файле .tim_undo dd ? ;+154 количество отмененных действий .tim_ls dd ? ;+158 время последнего сохранения .tim_co dd ? ;+162 время последней цветовой разметки .el_focus dd el_focus ;+166 указатель на переменную элемента в фокусе .err_save db 0 ;+170 ошибка сохранения файла .panel_id db 0 ;+171 номер открытой панели .key_new db 0 ;+172 символ, который будет добавлятся с клавиатуры .symbol_new_line db 20 ;+173 символ завершения строки .scr_w dd wScr ;+174 вертикальный скроллинг .scr_h dd hScr ;+178 горизонтальный скроллинг .arr_key_pos dd 0 ;+182 указатель на массив позиций ключевых слов .buffer dd buf ;+186 указатель на буфер копирования/вставки .buffer_find dd buf_find ;+190 указатель на буфер для поиска .cur_ins db 1 ;+194 режим работы курсора (обычный или замена) .mode_color db 1 ;+195 режим выделения слов цветом (0-выкл. 1-вкл.) .mode_invis db 0 ;+196 режим показа непечатаемых символов .gp_opt db 0 ;+197 опции возвращаемые функцией ted_get_pos_by_cursor .fun_on_key_ctrl_o dd ted_but_open_file ;+198 указатель на функцию вызываемую при нажатии Ctrl+O (открытие файла) .fun_on_key_ctrl_f dd but_panel_find ;+202 ... Ctrl+F (вызова/скрытия панели поиска) .fun_on_key_ctrl_n dd ted_but_new_file ;+206 ... Ctrl+N (создание нового документа) .fun_on_key_ctrl_s dd ted_but_save_file ;+210 ... Ctrl+S или Ctrl+Shiht+S (на входе eax =0 или =1) .buffer_size dd BUF_SIZE ;+214 размер буфера копирования/вставки .fun_find_err dd ted_on_find_err ;+218 указатель на функцию вызываемую если поиск закончился неудачно .fun_init_synt_err dd 0 ;+222 .fun_draw_panel_buttons dd draw_but_toolbar ;+226 указатель на функцию рисования панели с кнопками .fun_draw_panel_find dd draw_panel_find ;+230 указатель на функцию рисования панели поиска/замены .fun_draw_panel_syntax dd draw_panel_syntax ;+234 указатель на функцию рисования панели синтаксиса .fun_save_err dd ted_save_err_msg ;+238 указатель на функцию вызываемую если сохранение файла закончилось неудачно .increase_size dd 200 ;+242 число символов на которые будет увечиваться память при нехватке .ptr_free_symb dd ? ;+246 используется внутри элемента для ускорения вставки текста .font_size dd 0 ;+250 множитель для размера шрифта ;------------------------------------------------------------------------------ conv_tabl rb 128 ; таблица для конвертирования scan-кода в ascii-код el_focus dd tedit0 mouse_dd dd 0 tree1 tree_list 264,count_of_dir_list_files+2, tl_key_no_edit+tl_draw_par_line+tl_list_box_mode,\ 16,16, 0x8080ff,0x0000ff,0xffffff, 0,70,TED_PANEL_WIDTH-17,120, 0,0,0, el_focus,\ ws_dir_lbox,0 ;dir_list memory tree_file_struct: dd 1,0,0,count_of_dir_list_files dd dir_mem db 0 .f: dd file_name align 4 opt_gr1 dd opt1 opt_grlist1 dd opt1,opt2,opt3,0 ;end option group opt1 option_box opt_gr1, 5, 90,6,12,0xd0d0ff, 0xff, 0x80ff,txt_f_opt_next,txt_f_opt_next.end-txt_f_opt_next opt2 option_box opt_gr1, 5,108,6,12,0xd0d0ff, 0xff, 0x80ff,txt_f_opt_perv,txt_f_opt_perv.end-txt_f_opt_perv opt3 option_box opt_gr1, 5,126,6,12,0xd0d0ff, 0xff, 0x80ff,txt_f_opt_beg,txt_f_opt_beg.end-txt_f_opt_beg if lang eq ru msgbox_1: db '"Замена',13,10,'Сделано замен: ' .z: rb 10 msgbox_2: db 3,0 db 'Внимание',0 db 'Сохранить изменения в файле?',0 db 'Сохранить',0 db 'Не сохранять',0 db 'Отмена',0 db 0 msgbox_3: db 1,0 db 'Внимание',0 db 'Ошибка при открытии файла с цветовыми настройками!',13,\ 'Потому выделение слов цветом не возможно.',13,\ ' (код ошибки =' .err: db '?' db ')',0 db 'Закрыть',0 db 0 msgbox_4: db 1,0 db 'Внимание',0 db 'Ошибка при открытии файла!',13,\ 'Возможно имя файла введено не правильно.',13,\ ' (код ошибки =' .err: db '?' db ')',0 db 'Закрыть',0 db 0 msgbox_6: db 1,0 db 'Внимание',0 db 'Ошибка при сохранении файла!',13,\ 'Возможно имя файла введено не правильно.',13,\ ' (код ошибки =' .err: db '?' db ')',0 db 'Закрыть',0 db 0 msgbox_7: db '"Текст не найден',13,10 db 'Попробуйте или изменить запрос и повторить поиск." -tI',0 msgbox_9: db 3,0 db 'Внимание',0 db 'Не открылся ',39,'диалог открытия файла',39,'.',13 .fdp: rb 100 db 0 db 'Закрыть',0 db 0 txtFindCapt db 'Поиск:',0 txtFindNext db 'Найти далее',0 txtRerlaceCapt db 'Чем заменить:',0 txtRerlace db 'Заменить',0 txtRerlaceAll db 'Заменить все',0 txtFormatCapt db 'Формат',0 txtFormatApply db 'Применить',0 txtReplace db 'Заменить',0 txtReplaceAll db 'Заменить все',0 txt_f_opt_next: db 'Вниз' .end: db 0 txt_f_opt_perv: db 'Вверх' .end: db 0 txt_f_opt_beg: db 'С начала' .end: db 0 else msgbox_1: db '"Replace',13,10,'Made replacements: ' .z: rb 10 msgbox_2: db 3,0 db 'Warning',0 db 'Save changes to the file?',0 db 'Save',0 db 'Discard',0 db 'Cancel',0 db 0 msgbox_3: db 1,0 db 'Warning',0 db 'Error opening the file with the color settings!',13,\ 'Because color selection of words is not possible.',13,\ ' (error code =' .err: db '?' db ')',0 db 'Close',0 db 0 msgbox_4: db 1,0 db 'Warning',0 db 'Error opening file!',13,\ 'Maybe the file name is not entered correctly.',13,\ ' (error code =' .err: db '?' db ')',0 db 'Close',0 db 0 msgbox_6: db 1,0 db 'Warning',0 db 'Error saving file!',13,\ 'Maybe the file name is not entered correctly.',13,\ ' (error code =' .err: db '?' db ')',0 db 'Close',0 db 0 msgbox_7: db '"Text not found.',13,10 db 'Try change the query and search again." -tI',0 msgbox_9: db 3,0 db 'Warning',0 db 'Error run ',39,'open file dialog',39,'.',13 .fdp: rb 100 db 0 db 'Close',0 db 0 txtFindCapt db 'Search:',0 txtFindNext db 'Find next',0 txtRerlaceCapt db 'Replace with:',0 txtRerlace db 'Replace',0 txtRerlaceAll db 'Replace all',0 txtFormatCapt db 'Format',0 txtFormatApply db 'Apply',0 txtReplace db 'Replace',0 txtReplaceAll db 'Replace all',0 txt_f_opt_next: db 'Down' .end: db 0 txt_f_opt_perv: db 'Up' .end: db 0 txt_f_opt_beg: db 'At first' .end: db 0 end if ;функции для кнопок в сообщениях msgbox_2N_funct: dd On_SaveAndNewFile dd On_NewFile dd 0 msgbox_2O_funct: dd On_SaveAndOpenFile dd ted_but_open_file.no_msg dd 0 msgbox_2E_funct: dd On_SaveAndExit dd On_Exit dd 0 KM_SHIFT equ 0x00010000 KM_CTRL equ 0x00020000 KM_ALT equ 0x00040000 KM_NUMLOCK equ 0x00080000 ; KEY CODES KEY_F1 equ 0x0000003B KEY_F2 equ 0x0000003C KEY_F3 equ 0x0000003D \ No newline at end of file +fn_col_option dd def_col_file fn_syntax_dir db 'info/',0 def_col_file db 'default.syn',0 exit_code dd 0 ;переменная используемая для выхода из программы panel_but rb 21 ;настройки отображения кнопок на панели ;значения задаваемые по умолчанию, без ini файла ini_def_window_t equ 20 ini_def_window_l equ 200 ini_def_window_w equ 570 ini_def_window_h equ 470 ini_def_symbol_w equ 7 ini_def_symbol_h equ 10 ini_def_font_s equ 0 ini_def_scroll_type equ 0 ;описание параматров для ini файла ini_name db 't_edit.ini',0 ini_sec_window db 'Window',0 key_window_t db 't',0 key_window_l db 'l',0 key_window_w db 'w',0 key_window_h db 'h',0 key_symbol_w db 'symbol_w',0 key_symbol_h db 'symbol_h',0 key_font_s db 'font_s',0 key_scroll_type db 'scroll_type',0 key_but_new db 'but_new',0 key_but_open db 'but_open',0 key_but_save db 'but_save',0 key_but_save_as db 'but_save_as',0 key_but_select db 'but_select',0 key_but_cut db 'but_cut',0 key_but_copy db 'but_copy',0 key_but_paste db 'but_paste',0 key_but_find db 'but_find',0 key_but_replace db 'but_replace',0 key_but_key_words db 'but_key_words',0 key_but_upper db 'but_upper',0 key_but_lower db 'but_lower',0 key_but_reverse db 'but_reverse',0 key_but_undo db 'but_undo',0 key_but_redo db 'but_redo',0 key_but_invisible db 'but_invisible',0 key_but_syntax_list db 'but_syntax_list',0 key_but_syntax_mode db 'but_syntax_mode',0 key_but_convert_1251_866 db 'but_convert_1251_866',0 key_but_convert_866_1251 db 'but_convert_866_1251',0 ini_sec_options db 'Options',0 key_synt_file: db 'syntax_' .numb: db '0',0 key_synt_ext: db 'ext_' .numb: db '0',0 ini_def_synt_f db 0 align 4 max_synt_auto_open equ 10 synt_auto_open: rb 64*max_synt_auto_open db 0 system_dir_0 db '/sys/lib/' lib_name_0 db 'box_lib.obj',0 system_dir_1 db '/sys/lib/' lib_name_1 db 'msgbox.obj',0 system_dir_2 db '/sys/lib/' lib_name_2 db 'proc_lib.obj',0 system_dir_3 db '/sys/lib/' lib_name_3 db 'libimg.obj',0 system_dir_4 db '/sys/lib/' lib_name_4 db 'libini.obj',0 system_dir_5 db '/sys/lib/' lib_name_5 db 'kmenu.obj',0 ;--------------------------------------------------------------------- align 4 import_box_lib: dd alib_init0 ;функция запускается макросом 1 раз при подключении бибилиотеки, потому в программе метка на нее не нужна edit_box_draw dd aEdit_box_draw edit_box_key dd aEdit_box_key edit_box_mouse dd aEdit_box_mouse ;edit_box_set_text dd aEdit_box_set_text ;version_ed dd aVersion_ed option_box_draw dd aOption_box_draw option_box_mouse dd aOption_box_mouse ;version_op dd aVersion_op scrollbar_ver_draw dd aScrollbar_ver_draw scrollbar_ver_mouse dd aScrollbar_ver_mouse scrollbar_hor_draw dd aScrollbar_hor_draw scrollbar_hor_mouse dd aScrollbar_hor_mouse ;version_scrollbar dd aVersion_scrollbar tl_data_init dd sz_tl_data_init tl_data_clear dd sz_tl_data_clear tl_info_clear dd sz_tl_info_clear tl_key dd sz_tl_key tl_mouse dd sz_tl_mouse tl_draw dd sz_tl_draw tl_info_undo dd sz_tl_info_undo tl_info_redo dd sz_tl_info_redo tl_node_add dd sz_tl_node_add tl_node_set_data dd sz_tl_node_set_data tl_node_get_data dd sz_tl_node_get_data tl_node_delete dd sz_tl_node_delete tl_cur_beg dd sz_tl_cur_beg tl_cur_next dd sz_tl_cur_next tl_cur_perv dd sz_tl_cur_perv ;tl_node_close_open dd sz_tl_node_close_open tl_node_lev_inc dd sz_tl_node_lev_inc tl_node_lev_dec dd sz_tl_node_lev_dec ted_but_sumb_upper dd sz_ted_but_sumb_upper ted_but_sumb_lover dd sz_ted_but_sumb_lover ted_but_convert_by_table dd sz_ted_but_convert_by_table ted_can_save dd sz_ted_can_save ted_clear dd sz_ted_clear ted_delete dd sz_ted_delete ted_draw dd sz_ted_draw ted_init dd sz_ted_init ted_init_scroll_bars dd sz_ted_init_scroll_bars ted_init_syntax_file dd sz_ted_init_syntax_file ted_is_select dd sz_ted_is_select ted_key dd sz_ted_key ted_mouse dd sz_ted_mouse ted_open_file dd sz_ted_open_file ted_save_file dd sz_ted_save_file ted_text_add dd sz_ted_text_add ted_but_select_word dd sz_ted_but_select_word ted_but_cut dd sz_ted_but_cut ted_but_copy dd sz_ted_but_copy ted_but_paste dd sz_ted_but_paste ted_but_undo dd sz_ted_but_undo ted_but_redo dd sz_ted_but_redo ted_but_reverse dd sz_ted_but_reverse ted_but_find dd sz_ted_but_find ted_but_replace dd sz_ted_but_replace ted_text_colored dd sz_ted_text_colored ted_go_to_position dd sz_ted_go_to_position version_text_edit dd sz_ted_version dd 0,0 alib_init0 db 'lib_init',0 aEdit_box_draw db 'edit_box',0 aEdit_box_key db 'edit_box_key',0 aEdit_box_mouse db 'edit_box_mouse',0 ;aEdit_box_set_text db 'edit_box_set_text',0 ;aVersion_ed db 'version_ed',0 aOption_box_draw db 'option_box_draw',0 aOption_box_mouse db 'option_box_mouse',0 ;aVersion_op db 'version_op',0 aScrollbar_ver_draw db 'scrollbar_v_draw',0 aScrollbar_ver_mouse db 'scrollbar_v_mouse',0 aScrollbar_hor_draw db 'scrollbar_h_draw',0 aScrollbar_hor_mouse db 'scrollbar_h_mouse',0 ;aVersion_scrollbar db 'version_scrollbar',0 sz_tl_data_init db 'tl_data_init',0 sz_tl_data_clear db 'tl_data_clear',0 sz_tl_info_clear db 'tl_info_clear',0 sz_tl_key db 'tl_key',0 sz_tl_mouse db 'tl_mouse',0 sz_tl_draw db 'tl_draw',0 sz_tl_info_undo db 'tl_info_undo',0 sz_tl_info_redo db 'tl_info_redo',0 sz_tl_node_add db 'tl_node_add',0 sz_tl_node_set_data db 'tl_node_set_data',0 sz_tl_node_get_data db 'tl_node_get_data',0 sz_tl_node_delete db 'tl_node_delete',0 sz_tl_cur_beg db 'tl_cur_beg',0 sz_tl_cur_next db 'tl_cur_next',0 sz_tl_cur_perv db 'tl_cur_perv',0 ;sz_tl_node_close_open db 'tl_node_close_open',0 sz_tl_node_lev_inc db 'tl_node_lev_inc',0 sz_tl_node_lev_dec db 'tl_node_lev_dec',0 sz_ted_but_sumb_upper db 'ted_but_sumb_upper',0 sz_ted_but_sumb_lover db 'ted_but_sumb_lover',0 sz_ted_but_convert_by_table db 'ted_but_convert_by_table',0 sz_ted_can_save db 'ted_can_save',0 sz_ted_clear db 'ted_clear',0 sz_ted_delete db 'ted_delete',0 sz_ted_draw db 'ted_draw',0 sz_ted_init db 'ted_init',0 sz_ted_init_scroll_bars db 'ted_init_scroll_bars',0 sz_ted_init_syntax_file db 'ted_init_syntax_file',0 sz_ted_is_select db 'ted_is_select',0 sz_ted_key db 'ted_key',0 sz_ted_mouse db 'ted_mouse',0 sz_ted_open_file db 'ted_open_file',0 sz_ted_save_file db 'ted_save_file',0 sz_ted_text_add db 'ted_text_add',0 sz_ted_but_select_word db 'ted_but_select_word',0 sz_ted_but_cut db 'ted_but_cut',0 sz_ted_but_copy db 'ted_but_copy',0 sz_ted_but_paste db 'ted_but_paste',0 sz_ted_but_undo db 'ted_but_undo',0 sz_ted_but_redo db 'ted_but_redo',0 sz_ted_but_reverse db 'ted_but_reverse',0 sz_ted_but_find db 'ted_but_find',0 sz_ted_but_replace db 'ted_but_replace',0 sz_ted_text_colored db 'ted_text_colored',0 sz_ted_go_to_position db 'ted_go_to_position',0 sz_ted_version db 'version_text_edit',0 align 4 import_proclib: OpenDialog_Init dd aOpenDialog_Init OpenDialog_Start dd aOpenDialog_Start dd 0,0 aOpenDialog_Init db 'OpenDialog_init',0 aOpenDialog_Start db 'OpenDialog_start',0 align 4 import_msgbox_lib: mb_create dd amb_create mb_reinit dd amb_reinit mb_setfunctions dd amb_setfunctions dd 0,0 amb_create db 'mb_create',0 amb_reinit db 'mb_reinit',0 amb_setfunctions db 'mb_setfunctions',0 align 4 import_libimg: dd alib_init1 img_to_rgb2 dd aimg_to_rgb2 img_decode dd aimg_decode img_destroy dd aimg_destroy dd 0,0 alib_init1 db 'lib_init',0 aimg_to_rgb2 db 'img_to_rgb2',0 aimg_decode db 'img_decode',0 ;автоматически определяет формат графических данных aimg_destroy db 'img_destroy',0 align 4 import_libini: dd alib_init2 ini_get_str dd aini_get_str ini_get_int dd aini_get_int ini_get_color dd aini_get_color dd 0,0 alib_init2 db 'lib_init',0 aini_get_str db 'ini_get_str',0 aini_get_int db 'ini_get_int',0 aini_get_color db 'ini_get_color',0 align 4 import_libkmenu: kmenu_init dd akmenu_init kmainmenu_draw dd akmainmenu_draw kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent ksubmenu_new dd aksubmenu_new ksubmenu_delete dd aksubmenu_delete ksubmenu_draw dd aksubmenu_draw ksubmenu_add dd aksubmenu_add kmenuitem_new dd akmenuitem_new kmenuitem_delete dd akmenuitem_delete kmenuitem_draw dd akmenuitem_draw dd 0,0 akmenu_init db 'kmenu_init',0 akmainmenu_draw db 'kmainmenu_draw',0 akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0 aksubmenu_new db 'ksubmenu_new',0 aksubmenu_delete db 'ksubmenu_delete',0 aksubmenu_draw db 'ksubmenu_draw',0 aksubmenu_add db 'ksubmenu_add',0 akmenuitem_new db 'kmenuitem_new',0 akmenuitem_delete db 'kmenuitem_delete',0 akmenuitem_draw db 'kmenuitem_draw',0 ;--------------------------------------------------------------------- align 4 wScr scrollbar 16,50, 300,50, 15, 100,30,0, 0,0,0, 1 align 4 hScr scrollbar 150,0, 16,50, 15, 100,30,0, 0,0,0, 1 ;дочерний скроллинг для элемента ListBox align 4 ws_dir_lbox scrollbar 16,0, 30,70, 15, 100,30,0, 0,0,0, 1 ;--------------------------------------------------------------------- align 4 OpenDialog_data: .type dd 0 .procinfo dd procinfo ;+4 .com_area_name dd communication_area_name ;+8 .com_area dd 0 ;+12 .opendir_path dd plugin_path ;+16 .dir_default_path dd default_dir ;+20 .start_path dd file_name ;+24 путь к диалогу открытия файлов .draw_window dd draw_window ;+28 .status dd 0 ;+32 .openfile_path dd openfile_path ;+36 путь к открываемому файлу .filename_area dd filename_area ;+40 имя открываемого файла .filter_area dd Filter .x: .x_size dw 420 ;+48 ; Window X size .x_start dw 10 ;+50 ; Window X position .y: .y_size dw 320 ;+52 ; Window y size .y_start dw 10 ;+54 ; Window Y position default_dir db '/rd/1',0 ;директория по умолчанию communication_area_name: db 'FFFFFFFF_open_dialog',0 open_dialog_name: db 'opendial',0 communication_area_default_path: db '/rd/1/File managers/',0 Filter: dd Filter.end - Filter.1 .1: db 'ASM',0 db 'CPP',0 db 'INC',0 db 'MAC',0 db 'INI',0 db 'TXT',0 db 'H',0 db 'C',0 db 'HTM',0 db 'HTML',0 db 'PY',0 db 'SH',0 db 'BAT',0 db 'LUA',0 db 'INF',0 db 'LOG',0 db 'DBG',0 db 'DAT',0 .end: db 0 txt_Info db '" -tI',0 TED_PANEL_NULL equ 0 ;нет открытой панели TED_PANEL_FIND equ 1 ;панель поиска TED_PANEL_REPLACE equ 2 ;панель замены TED_PANEL_SYNTAX equ 3 ;панель выбора файлов подсветки TED_PANEL_GOTO equ 4 ;панель перехода TED_PANEL_WIDTH equ 150 ;ширина панели count_of_dir_list_files equ 15 ;максимальное число файлов синтаксиса показываемых в окне элемента tree1 ;------------------------------------------------------------------------------ struct TexSelect x0 dd ? y0 dd ? x1 dd ? y1 dd ? ends ;------------------------------------------------------------------------------ align 4 tedit0: ;структура текстового редактора .wnd BOX 0,50,440,150 ;+ 0 .rec BOX 30,25,ini_def_symbol_w,ini_def_symbol_h ;+16 .drag_m db 0 ;+32 выделение от мыши .drag_k db 0 ;+33 выделение от клавиатуры .sel TexSelect 0,0,0,0 ;+34 структура выделения .seln TexSelect ;+50 дополнительная структура выделения .tex dd 0 ;+66 text memory pointer .tex_1 dd 0 ;+70 text first symbol pointer .tex_end dd 0 ;+74 text end memory pointer .cur_x dd 0 ;+78 координата x курсора .cur_y dd 0 ;+82 координата y курсора .max_chars dd maxChars ;+86 максимальное число символов в одном документе .count_colors_text dd 1 ;+90 колличество цветов текста .count_key_words dd 0 ;+94 колличество ключевых слов .color_cursor dd 0x808080 ;+98 цвет курсора .color_wnd_capt dd 0x80 ;+102 цвет полей вокруг окна .color_wnd_work dd 0x0 ;+106 цвет фона окна .color_wnd_bord dd 0xd0d0d0 ;+110 цвет текста на полях .color_select dd 0x208080 ;+114 цвет выделения .color_cur_text dd 0xff0000 ;+118 цвет символа под курсором .color_wnd_text dd 0xffff00 ;+122 цвет текста в окне .syntax_file dd 0 ;+126 указатель на начало файла синтаксиса .syntax_file_size dd maxSyntaxFileSize ;+130 максимальный размер файла синтаксиса .text_colors dd 0 ;+134 указатель на массив цветов текста .help_text_f1 dd 0 ;+138 указатель на текст справки (по нажатии F1) .help_id dd -1 ;+142 идентификатор для справки .key_words_data dd 0 ;+146 указатель на структуры ключевых слов TexColViv .tim_ch dd ? ;+150 количество изменений в файле .tim_undo dd ? ;+154 количество отмененных действий .tim_ls dd ? ;+158 время последнего сохранения .tim_co dd ? ;+162 время последней цветовой разметки .el_focus dd el_focus ;+166 указатель на переменную элемента в фокусе .err_save db 0 ;+170 ошибка сохранения файла .panel_id db 0 ;+171 номер открытой панели .key_new db 0 ;+172 символ, который будет добавлятся с клавиатуры .symbol_new_line db 20 ;+173 символ завершения строки .scr_w dd wScr ;+174 вертикальный скроллинг .scr_h dd hScr ;+178 горизонтальный скроллинг .arr_key_pos dd 0 ;+182 указатель на массив позиций ключевых слов .buffer dd buf ;+186 указатель на буфер копирования/вставки .buffer_find dd buf_find ;+190 указатель на буфер для поиска .cur_ins db 1 ;+194 режим работы курсора (обычный или замена) .mode_color db 1 ;+195 режим выделения слов цветом (0-выкл. 1-вкл.) .mode_invis db 0 ;+196 режим показа непечатаемых символов .gp_opt db 0 ;+197 опции возвращаемые функцией ted_get_pos_by_cursor .fun_on_key_ctrl_all dd ted_but_ctrl_all ;+198 указатель на функцию вызываемую при нажатии Ctrl+N,O,S,F,H,G dd 0,0,0 ;зарезервировано .buffer_size dd BUF_SIZE ;+214 размер буфера копирования/вставки .fun_find_err dd ted_on_find_err ;+218 указатель на функцию вызываемую если поиск закончился неудачно .fun_init_synt_err dd 0 ;+222 .fun_draw_panel_buttons dd draw_but_toolbar ;+226 указатель на функцию рисования панели с кнопками .fun_draw_panels dd draw_panels ;+230 указатель на функцию рисования панели поиска/замены dd 0 ;+234 зарезервировано .fun_save_err dd ted_save_err_msg ;+238 указатель на функцию вызываемую если сохранение файла закончилось неудачно .increase_size dd 200 ;+242 число символов на которые будет увечиваться память при нехватке .ptr_free_symb dd ? ;+246 используется внутри элемента для ускорения вставки текста .font_size dd 0 ;+250 множитель для размера шрифта ;------------------------------------------------------------------------------ conv_tabl rb 128 ; таблица для конвертирования scan-кода в ascii-код el_focus dd tedit0 mouse_dd dd 0 tree1 tree_list 264,count_of_dir_list_files+2, tl_key_no_edit+tl_draw_par_line+tl_list_box_mode,\ 16,16, 0x8080ff,0x0000ff,0xffffff, 0,70,TED_PANEL_WIDTH-17,120, 0,0,0, el_focus,\ ws_dir_lbox,0 ;dir_list memory tree_file_struct: dd 1,0,0,count_of_dir_list_files dd dir_mem db 0 .f: dd file_name align 4 opt_gr1 dd opt1 opt_grlist1 dd opt1,opt2,opt3,0 ;end option group opt1 option_box opt_gr1, 5, 90,6,12,0xd0d0ff, 0xff, 0x80ff,txt_f_opt_next,txt_f_opt_next.end-txt_f_opt_next opt2 option_box opt_gr1, 5,108,6,12,0xd0d0ff, 0xff, 0x80ff,txt_f_opt_perv,txt_f_opt_perv.end-txt_f_opt_perv opt3 option_box opt_gr1, 5,126,6,12,0xd0d0ff, 0xff, 0x80ff,txt_f_opt_beg,txt_f_opt_beg.end-txt_f_opt_beg if lang eq ru msgbox_1: db '"Замена',13,10,'Сделано замен: ' .z: rb 10 msgbox_2: db 3,0 db 'Внимание',0 db 'Сохранить изменения в файле?',0 db 'Сохранить',0 db 'Не сохранять',0 db 'Отмена',0 db 0 msgbox_3: db 1,0 db 'Внимание',0 db 'Ошибка при открытии файла с цветовыми настройками!',13,\ 'Потому выделение слов цветом не возможно.',13,\ ' (код ошибки =' .err: db '?' db ')',0 db 'Закрыть',0 db 0 msgbox_4: db 1,0 db 'Внимание',0 db 'Ошибка при открытии файла!',13,\ 'Возможно имя файла введено не правильно.',13,\ ' (код ошибки =' .err: db '?' db ')',0 db 'Закрыть',0 db 0 msgbox_6: db 1,0 db 'Внимание',0 db 'Ошибка при сохранении файла!',13,\ 'Возможно имя файла введено не правильно.',13,\ ' (код ошибки =' .err: db '?' db ')',0 db 'Закрыть',0 db 0 msgbox_7: db '"Текст не найден',13,10 db 'Попробуйте или изменить запрос и повторить поиск." -tI',0 msgbox_9: db 3,0 db 'Внимание',0 db 'Не открылся ',39,'диалог открытия файла',39,'.',13 .fdp: rb 100 db 0 db 'Закрыть',0 db 0 txtFindCapt db 'Поиск:',0 txtFindNext db 'Найти далее',0 txtRerlaceCapt db 'Чем заменить:',0 txtRerlace db 'Заменить',0 txtRerlaceAll db 'Заменить все',0 txtFormatCapt db 'Формат',0 txtFormatApply db 'Применить',0 txtReplace db 'Заменить',0 txtReplaceAll db 'Заменить все',0 txtGotoCapt db 'Переход на строку:',0 txtGoto db 'Перейти',0 txt_f_opt_next: db 'Вниз' .end: db 0 txt_f_opt_perv: db 'Вверх' .end: db 0 txt_f_opt_beg: db 'С начала' .end: db 0 else msgbox_1: db '"Replace',13,10,'Made replacements: ' .z: rb 10 msgbox_2: db 3,0 db 'Warning',0 db 'Save changes to the file?',0 db 'Save',0 db 'Discard',0 db 'Cancel',0 db 0 msgbox_3: db 1,0 db 'Warning',0 db 'Error opening the file with the color settings!',13,\ 'Because color selection of words is not possible.',13,\ ' (error code =' .err: db '?' db ')',0 db 'Close',0 db 0 msgbox_4: db 1,0 db 'Warning',0 db 'Error opening file!',13,\ 'Maybe the file name is not entered correctly.',13,\ ' (error code =' .err: db '?' db ')',0 db 'Close',0 db 0 msgbox_6: db 1,0 db 'Warning',0 db 'Error saving file!',13,\ 'Maybe the file name is not entered correctly.',13,\ ' (error code =' .err: db '?' db ')',0 db 'Close',0 db 0 msgbox_7: db '"Text not found.',13,10 db 'Try change the query and search again." -tI',0 msgbox_9: db 3,0 db 'Warning',0 db 'Error run ',39,'open file dialog',39,'.',13 .fdp: rb 100 db 0 db 'Close',0 db 0 txtFindCapt db 'Search:',0 txtFindNext db 'Find next',0 txtRerlaceCapt db 'Replace with:',0 txtRerlace db 'Replace',0 txtRerlaceAll db 'Replace all',0 txtFormatCapt db 'Format',0 txtFormatApply db 'Apply',0 txtReplace db 'Replace',0 txtReplaceAll db 'Replace all',0 txtGotoCapt db 'Go to line:',0 txtGoto db 'Go to',0 txt_f_opt_next: db 'Down' .end: db 0 txt_f_opt_perv: db 'Up' .end: db 0 txt_f_opt_beg: db 'At first' .end: db 0 end if ;функции для кнопок в сообщениях msgbox_2N_funct: dd On_SaveAndNewFile dd On_NewFile dd 0 msgbox_2O_funct: dd On_SaveAndOpenFile dd ted_but_open_file.no_msg dd 0 msgbox_2E_funct: dd On_SaveAndExit dd On_Exit dd 0 KM_SHIFT equ 0x00010000 KM_CTRL equ 0x00020000 KM_ALT equ 0x00040000 KM_NUMLOCK equ 0x00080000 ; KEY CODES KEY_F1 equ 0x0000003B KEY_F2 equ 0x0000003C KEY_F3 equ 0x0000003D \ No newline at end of file diff --git a/programs/other/t_edit/t_draw.inc b/programs/other/t_edit/t_draw.inc index 5ebdd1d778..ebf17a5729 100644 --- a/programs/other/t_edit/t_draw.inc +++ b/programs/other/t_edit/t_draw.inc @@ -216,10 +216,9 @@ draw_but_toolbar: ; ;txtBRi db 26 ;txtBLe db 27 -;input: -; edi = pointer to tedit struct align 4 -proc draw_panel_find +proc draw_panels uses edi, edit:dword + mov edi,[edit] cmp ted_panel_id,TED_PANEL_FIND jne @f call p_find @@ -230,10 +229,22 @@ proc draw_panel_find call p_replace jmp .end_f @@: + cmp ted_panel_id,TED_PANEL_GOTO + jne @f + call p_goto + jmp .end_f + @@: + cmp ted_panel_id,TED_PANEL_SYNTAX + jne @f + call p_syntax + jmp .end_f + @@: push eax edx - mcall SF_DEFINE_BUTTON,,,0x80000000+201 + mcall SF_DEFINE_BUTTON,,,0x80000000+200 + mcall ,,,0x80000000+201 mcall ,,,0x80000000+202 mcall ,,,0x80000000+203 + mcall ,,,0x80000000+204 pop edx eax .end_f: ret @@ -256,7 +267,7 @@ p_find: sub cx,20+15-1 ; 15 - height text box mcall ,,,[sc.work] - stdcall [edit_box_draw], edit2 + stdcall [edit_box_draw], edit_find mov ecx,ted_wnd_t shl ecx,16 @@ -296,8 +307,8 @@ p_replace: sub cx,20+15-1 ; 15 - height text box mcall ,,,[sc.work] - stdcall [edit_box_draw], edit1 - stdcall [edit_box_draw], edit2 + stdcall [edit_box_draw], edit_replace + stdcall [edit_box_draw], edit_find mov ecx,ted_wnd_t shl ecx,16 @@ -327,12 +338,48 @@ p_replace: pop edx ecx ebx eax ret +align 4 +p_goto: + push eax ebx ecx edx + mov ecx,ted_wnd_t + shl ecx,16 + mov cx,20 + mcall SF_DRAW_RECT,TED_PANEL_WIDTH,,[sc.work] + + mov ecx,ted_wnd_t + add cx,20+15 ; 15 - height text box + shl ecx,16 + add ecx,ted_wnd_h + mov edx,ted_scr_h + add cx,word[edx+sb_offs_size_y] + sub cx,20+15-1 ; 15 - height text box + mcall ,,,[sc.work] + + stdcall [edit_box_draw], edit_goto + + mov ecx,ted_wnd_t + shl ecx,16 + add ecx,(40 shl 16)+20 + mcall SF_DEFINE_BUTTON,(5 shl 16)+85,,204,[sc.work_button] + + mov ebx,(23 shl 16)+7 + add ebx,ted_wnd_t + mov ecx,[sc.work_text] + or ecx,0x80000000 + mcall SF_DRAW_TEXT,,,txtGotoCapt + + mov ecx,[sc.work_button_text] + or ecx,0x80000000 + mov ebx,(15 shl 16)+47 + add ebx,ted_wnd_t + mcall ,,,txtGoto + pop edx ecx ebx eax + ret + ;input: ; edi = pointer to tedit struct align 4 -proc draw_panel_syntax - cmp ted_panel_id,TED_PANEL_SYNTAX ;if not panel - jne @f +p_syntax: pushad mov ecx,ted_wnd_t @@ -378,15 +425,7 @@ proc draw_panel_syntax mcall ,,,txtFormatApply popad - jmp .end_f - @@: - push eax edx - mov edx,0x80000000+200 - mcall SF_DEFINE_BUTTON ;хёыш эхЄ ярэхыш Єю єфры хь ъэюяъє - pop edx eax - .end_f: ret -endp MIN_M_WND_H equ 100 ;ьшэшьры№эр  т√ёюЄр уыртэюую юъэр ;input: @@ -421,10 +460,12 @@ EvSize: mov tl_box_top,eax ;=ted_wnd_t add tl_box_top,20 - mov [edit2.top],eax ;=ted_wnd_t - add dword[edit2.top],20 - mov [edit1.top],eax ;=ted_wnd_t - add dword[edit1.top],113 + mov [edit_find.top],eax ;=ted_wnd_t + add dword[edit_find.top],20 + mov [edit_replace.top],eax + add dword[edit_replace.top],113 + mov [edit_goto.top],eax + add dword[edit_goto.top],20 popad ret diff --git a/programs/other/t_edit/t_edit.asm b/programs/other/t_edit/t_edit.asm index d6f875ff28..ee4e7da07f 100644 --- a/programs/other/t_edit/t_edit.asm +++ b/programs/other/t_edit/t_edit.asm @@ -241,19 +241,23 @@ mouse: ;проверка боковых панелей cmp byte[tedit0.panel_id],TED_PANEL_FIND jne @f - stdcall [edit_box_mouse], edit2 + stdcall [edit_box_mouse], edit_find stdcall [option_box_mouse], opt_grlist1 @@: cmp byte[tedit0.panel_id],TED_PANEL_REPLACE jne @f - stdcall [edit_box_mouse], edit2 - stdcall [edit_box_mouse], edit1 + stdcall [edit_box_mouse], edit_find + stdcall [edit_box_mouse], edit_replace stdcall [option_box_mouse], opt_grlist1 @@: cmp byte[tedit0.panel_id],TED_PANEL_SYNTAX jne @f stdcall [tl_mouse], tree1 @@: + cmp byte[tedit0.panel_id],TED_PANEL_GOTO + jne @f + stdcall [edit_box_mouse], edit_goto + @@: ret ;--------------------------------------------------------------------- @@ -262,8 +266,7 @@ mouse: align 16 proc KeyConvertToASCII uses ebx, table:dword mov ebx,dword[table] ;convert scan to ascii - ror ax,8 - xor ah,ah + shr ax,8 add bx,ax mov ah,byte[ebx] ret @@ -274,7 +277,7 @@ key: mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS ;66.3 получить состояние управляющих клавиш xor esi,esi mov ecx,1 - test al,0x03 ;[Shift] + test al,3 ;[Shift] jz @f mov cl,2 or esi,KM_SHIFT @@ -297,7 +300,7 @@ key: mcall SF_GET_KEY stdcall [tl_key], tree1 - test word [edit1.flags],10b ;ed_focus ;если не в фокусе, выходим + test word[edit_replace.flags],ed_focus ;если не в фокусе, выходим je @f cmp ah,0x80 ;if key up ja still @@ -313,10 +316,10 @@ key: je still stdcall KeyConvertToASCII, conv_tabl - stdcall [edit_box_key], edit1 + stdcall [edit_box_key], edit_replace jmp still @@: - test word [edit2.flags],10b ;ed_focus ;если не в фокусе, выходим + test word[edit_find.flags],ed_focus ;если не в фокусе, выходим je @f cmp ah,0x80 ;if key up ja still @@ -332,7 +335,26 @@ key: je still stdcall KeyConvertToASCII, conv_tabl - stdcall [edit_box_key], edit2 + stdcall [edit_box_key], edit_find + jmp still + @@: + test word[edit_goto.flags],ed_focus ;если не в фокусе, выходим + je @f + cmp ah,0x80 ;if key up + ja still + cmp ah,42 ;[Shift] (left) + je still + cmp ah,54 ;[Shift] (right) + je still + cmp ah,56 ;[Alt] + je still + cmp ah,29 ;[Ctrl] + je still + cmp ah,69 ;[Pause Break] + je still + + stdcall KeyConvertToASCII, conv_tabl + stdcall [edit_box_key], edit_goto jmp still @@: @@ -340,8 +362,9 @@ key: jmp still align 4 -edit1 edit_box TED_PANEL_WIDTH-1, 0, 20, 0xffffff, 0xff80, 0xff0000, 0xff, 0x4080, 300, buf_replace, mouse_dd, 0 -edit2 edit_box TED_PANEL_WIDTH-1, 0, 20, 0xffffff, 0xff80, 0xff0000, 0xff, 0x4080, 300, buf_find, mouse_dd, 0 +edit_replace edit_box TED_PANEL_WIDTH-1, 0, 20, 0xffffff, 0xff80, 0xff0000, 0xff, 0x4080, 300, buf_replace, mouse_dd, 0 +edit_find edit_box TED_PANEL_WIDTH-1, 0, 20, 0xffffff, 0xff80, 0xff0000, 0xff, 0x4080, 300, buf_find, mouse_dd, 0 +edit_goto edit_box TED_PANEL_WIDTH-1, 0, 20, 0xffffff, 0xff80, 0xff0000, 0xff, 0x4080, 10, buf_goto, mouse_dd, 0 unpac_mem dd 0 @@ -405,6 +428,7 @@ i_end: buf rb BUF_SIZE ;буфер для копирования и вставки buf_find rb 302 ;буфер для поиска текста buf_replace rb 302 ;буфер для замены текста + buf_goto rb 12 ;буфер для перхода на строку sc system_colors IncludeUGlobals align 16 diff --git a/programs/other/t_edit/t_edit.png b/programs/other/t_edit/t_edit.png index 79986425dd4ea79c7b6d9c7a2190c7777dde670f..494c2efb69e1309ad645ac2650500174bf614120 100644 GIT binary patch literal 20336 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 literal 10544 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 diff --git a/programs/other/t_edit_synt/te_data.inc b/programs/other/t_edit_synt/te_data.inc index 7d13ab0949..fb8d7f794d 100644 --- a/programs/other/t_edit_synt/te_data.inc +++ b/programs/other/t_edit_synt/te_data.inc @@ -130,6 +130,7 @@ sz_ted_but_redo db 'ted_but_redo',0 sz_ted_but_reverse db 'ted_but_reverse',0 sz_ted_but_find db 'ted_but_find',0 sz_ted_text_colored db 'ted_text_colored',0 +sz_ted_go_to_position db 'ted_go_to_position',0 sz_PathShow_prepare db 'PathShow_prepare',0 sz_PathShow_draw db 'PathShow_draw',0 @@ -223,16 +224,14 @@ tedit0: ; .mode_color db 1 ;+195 режим выделения слов цветом (0-выкл. 1-вкл.) .mode_invis db 0 ;+196 режим показа непечатаемых символов .gp_opt db 0 ;+197 опции возвращаемые функцией ted_get_pos_by_cursor - .fun_on_key_ctrl_o dd but_ctrl_o ;+198 указатель на функцию вызываемую при нажатии Ctrl+O (открытие файла) - .fun_on_key_ctrl_f dd 0 ;+202 ... Ctrl+F (вызова/скрытия панели поиска) - .fun_on_key_ctrl_n dd but_ctrl_n ;+206 ... Ctrl+N (создание нового документа) - .fun_on_key_ctrl_s dd 0 ;+210 ... Ctrl+S + .fun_on_key_ctrl_all dd ted_but_ctrl_all ;+198 указатель на функцию вызываемую при нажатии Ctrl+N,O,S,F,G,H + dd 0,0,0 .buffer_size dd BUF_SIZE ;+214 размер буфера копирования/вставки .fun_find_err dd 0 ;+218 указатель на функцию вызываемую если поиск закончился неудачно .fun_init_synt_err dd 0 ;+222 указатель на функцию вызываемую при ошибочном открытии файла синтаксиса .fun_draw_panel_buttons dd 0 ;+226 указатель на функцию рисования панели с кнопками - .fun_draw_panel_find dd 0 ;+230 указатель на функцию рисования панели поиска - .fun_draw_panel_syntax dd 0 ;+234 указатель на функцию рисования панели синтаксиса + .fun_draw_panels dd 0 ;+230 указатель на функцию рисования панели поиска|...|синтаксиса + dd 0 .fun_save_err dd 0 ;+238 указатель на функцию вызываемую если сохранение файла закончилось неудачно .increase_size dd 1000 ;+242 число символов на которые будет увечиваться память при нехватке .ptr_free_symb dd ? ;+246 указатель на свободную память, в которую можно добавлять символ (используется внутри элемента для ускорения вставки текста) diff --git a/programs/other/t_edit_synt/te_syntax.asm b/programs/other/t_edit_synt/te_syntax.asm index c2b7eb5766..3b63ddd029 100644 --- a/programs/other/t_edit_synt/te_syntax.asm +++ b/programs/other/t_edit_synt/te_syntax.asm @@ -198,8 +198,7 @@ align 4 proc KeyConvertToASCII, table:dword push ebx mov ebx,dword[table] ;convert scan to ascii - ror ax,8 - xor ah,ah + shr ax,8 add bx,ax mov ah,byte[ebx] pop ebx @@ -294,6 +293,28 @@ but_SaveSyntax: stdcall [ted_save_file], tedit0,run_file_70,[edit1.text] ret +;description: +; функция вызываемую при нажатии Ctrl+N,O,F,S,H,G +align 4 +proc ted_but_ctrl_all uses eax, opt_key:dword + mov eax,[opt_key] + cmp al,'N' ;Ctrl+N + jne @f + call but_ctrl_n + jmp .end0 + @@: + cmp al,'O' ;Ctrl+O + jne @f + call but_ctrl_o + @@: + ;cmp al,'S' ;Ctrl+S + ;cmp al,'F' ;Ctrl+F + ;cmp al,'G' ;Ctrl+G + ;cmp al,'H' ;Ctrl+H + .end0: + ret +endp + align 4 but_ctrl_o: push eax @@ -332,7 +353,7 @@ get_wnd_in_focus: ;@@: ret -hed db 'TextEditor syntax file converter 23.01.19',0 ;подпись окна +hed db 'TextEditor syntax file converter 29.01.19',0 ;подпись окна conv_tabl rb 128 ; таблица для конвертирования scan-кода в ascii-код txt_load_f db 'Загр. файл',0