kolibrios-gitea/programs/develop/libraries/box_lib/trunk/t_edit.mac
IgorA 165749a220 element 't_edit' use functions 'fb_char_todown' and 'fb_char_toupper'
git-svn-id: svn://kolibrios.org@2324 a494cfbc-eb01-0410-851d-a64ba20cac60
2011-12-15 22:00:21 +00:00

3972 lines
78 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; ¬ ªà®á ¤«ï á¨á⥬­®© ¡¨¡«¨®â¥ª¨ box_lib.obj
; í«¥¬¥­â TextEditor ¤«ï Kolibri OS
; ä ©« ¯®á«¥¤­¨© à § ¨§¬¥­ï«áï 22.08.2011 IgorA
; ­  ª®¤ ¯à¨¬¥­¥­  GPL2 «¨æ¥­§¨ï
;input:
; edi = pointer to tedit struct
; reg = index
;output:
; reg = pointer to 'tex' struct
macro ConvertIndexToPointer reg {
imul reg,sizeof.symbol
add reg,ted_tex
}
;--- out_reg = ted_key_words_data[ind_reg].Text[0] ---
macro ColToIndexOffset ind_reg,out_reg {
mov out_reg,ind_reg
imul out_reg,sizeof.TexColViv
add out_reg,ted_key_words_data
}
macro use_text_edit
{
TED_PANEL_NULL equ 0 ;­¥â ®âªàë⮩ ¯ ­¥«¨
TED_PANEL_FIND equ 1 ;¯ ­¥«ì ¯®¨áª 
TED_PANEL_SYNTAX equ 2 ;¯ ­¥«ì ¢ë¡®à  ä ©«®¢ ¯®¤á¢¥âª¨
TED_PANEL_WIDTH equ 150 ;è¨à¨­  ¯ ­¥«¨
MAX_COLOR_WORD_LEN equ 40
;------------------------------------------------------------------------------
struct TexSelect
x0 dd ?
y0 dd ?
x1 dd ?
y1 dd ?
ends
struct TexColViv
Text rb MAX_COLOR_WORD_LEN ; á«®¢® ¤«ï ¯®¤á¢¥âª¨
f1 dd 0 ; á¯à ¢ª  ¯® á«®¢ã
flags db ? ; f1+4 ä« £¨ ¨á¯®«ì§ã¥¬ë¥ ¯à¨ ¢ë¤¥«¥­¨¨
endc db ? ; f1+5 ᨬ¢®« ª®­æ  ¢ë¤¥«¥­¨ï (¨á¯®«ì§ã¥âáï ¯à¨ flags&4)
escc db ? ; f1+6 íªà ­¨àãî騩 ᨬ¢®« (¨á¯®«ì§ã¥âáï ¯à¨ flags&4)
color db ? ; f1+7 ­®¬¥à 梥â 
ends
struct symbol
c db ? ; +0 ᨬ¢®«
col db ? ; +1 梥â
perv dd ? ; +2
next dd ? ; +6 㪠§ â¥«¨
tc dd ? ; +10 ¢à¥¬. ᮧ¤ ­¨ï
td dd ? ; +14 ¢à¥¬. 㤠«¥­¨ï
ends
;------------------------------------------------------------------------------
ted_symbol_tab db 26 ;ascii ª®¤ áâ५ª¨ ¢¯à ¢®, ¨á¯®«ì§ã¥âáï ¤«ï à¨á®¢ ­¨ï â ¡ã«ï樨 ¢ ०¨¬¥ ¯®ª §  ­¥¢¨¤¨¬ëå ᨬ¢®«®¢
if lang eq ru
txtRow db '‘âப ',0
txtCol db '‡­ ª',0
txtOtm db 'Žâ¬¥­ë',0
txtBuf db '<27>ãä¥à:',0
else
txtRow db 'Rows',0
txtCol db 'Cols',0
txtOtm db 'Undo',0
txtBuf db 'Buffer:',0
end if
;EvChar - â ¡«¨æ  ¤«ï 䨫ìâ஢ ­¨ï ¤®¡ ¢«ï¥¬ëå ᨬ¢®«®¢, çâ®-¡ë ­¥ ¯®¯ «¨ «¨è­¨¥ §­ ª¨
align 4
EvChar db 0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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
align 4
proc ted_init, edit:dword
push eax ecx edi
mov edi,dword[edit]
mov ecx,sizeof.symbol
imul ecx,ted_max_chars
invoke mem.alloc,ecx ;¢ë¤¥«ï¥¬ ¯ ¬ïâì
mov ted_tex,eax
mov ted_tex_1,eax
add ted_tex_1,sizeof.symbol
add eax,ecx
mov ted_tex_end,eax
stdcall ted_clear, edi,1
;-------------------------------------------------
mov ecx,1024 ;1024 - ¤«ï ¬ áᨢ  ted_arr_key_pos
add ecx,ted_syntax_file_size
invoke mem.alloc,ecx
mov ted_arr_key_pos,eax
add eax,1024
mov ted_syntax_file,eax
stdcall ted_init_scroll_bars,edi,3
pop edi ecx eax
ret
endp
MIN_W_SCRL_ARE equ 3 ;¬¨­¨¬ «ì­ ï ®â®¡à ¦ ¥¬ ï ®¡« áâì ¤«ï ¢¥àâ. áªà®««¨­£ 
MIN_H_SCRL_ARE equ 3 ;¬¨­¨¬ «ì­ ï ®â®¡à ¦ ¥¬ ï ®¡« áâì ¤«ï £®à¨§. áªà®««¨­£ 
;input:
; opt = 1 - ¬¥­ïâì 梥â áªà®««¨­£®¢, 2 - ¨§¬¥­¨«¨áì à §¬¥àë ®ª­ ,
; 4 - ¨§¬¥­¨«¨áì à §¬¥àë ¤®ªã¬¥­â 
align 4
proc ted_init_scroll_bars, edit:dword, opt:dword
pushad
mov edi,dword[edit]
mov esi,ted_scr_w
mov ebx,ted_scr_h
bt dword[opt],0
jae @f
mov ecx,ted_color_wnd_work
mov dword[esi+sb_offs_bckg_col],ecx
mov dword[ebx+sb_offs_bckg_col],ecx
mov ecx,ted_color_wnd_capt
mov dword[esi+sb_offs_frnt_col],ecx
mov dword[ebx+sb_offs_frnt_col],ecx
mov ecx,ted_color_wnd_bord
mov dword[esi+sb_offs_line_col],ecx
mov dword[ebx+sb_offs_line_col],ecx
@@:
bt dword[opt],2 ; ¨§¬¥­¨«¨áì à §¬¥àë ¤®ªã¬¥­â  ?
jae .doc_resize
call ted_get_num_lines
cmp eax,100
jge @f
mov eax,100
@@:
mov dword[esi+sb_offs_max_area],eax
.doc_resize:
bt dword[opt],1 ; ¨§¬¥­¨«¨áì à §¬¥àë ®ª­  ?
jae .no_size
mov edx,ted_wnd_l
add edx,ted_rec_l
mov word[ebx+sb_offs_start_x],dx ;¢ëáâ ¢«ï¥¬ «¥¢ë© ®âáâ㯠£®à¨§. áªà®««¨­£ 
mov eax,ted_wnd_h ;calculate lines in page
mov edx,ted_wnd_t
add edx,eax
mov word[ebx+sb_offs_start_y],dx ;¢ëáâ ¢«ï¥¬ ¢¥àå­¨© ®âáâ㯠£®à¨§. áªà®««¨­£ 
sub eax,ted_rec_t
xor edx,edx
mov ecx,ted_rec_h
div ecx
cmp eax,MIN_W_SCRL_ARE
jg @f
mov eax,MIN_W_SCRL_ARE
@@:
mov dword[esi+sb_offs_cur_area],eax
mov eax,ted_wnd_w ;calculate cols in page
mov edx,ted_wnd_l ;«¥¢ë© ®âáâ㯠®ª­ 
add edx,eax ;¤®¡ ¢«ï¥¬ è¨à¨­ã ®ª­ 
mov word[esi+sb_offs_start_x],dx ;¢ëáâ ¢«ï¥¬ «¥¢ë© ®âáâ㯠¢¥àâ. áªà®««¨­£ 
mov edx,ted_wnd_t
mov word[esi+sb_offs_start_y],dx ;¢ëáâ ¢«ï¥¬ ¢¥àå­¨© ®âáâ㯠¢¥àâ. áªà®««¨­£ 
mov edx,ted_wnd_h
mov word[esi+sb_offs_size_y],dx ;¢ëáâ ¢«ï¥¬ ¢ëá®âã ¢¥àâ. áªà®««¨­£ 
sub eax,ted_rec_l
mov word[ebx+sb_offs_size_x],ax ;¢ëáâ ¢«ï¥¬ è¨à¨­ã £®à¨§. áªà®««¨­£ 
xor edx,edx
mov ecx,ted_rec_w
div ecx
cmp eax,MIN_H_SCRL_ARE
jg @f
mov eax,MIN_H_SCRL_ARE
@@:
dec eax
mov dword[ebx+sb_offs_cur_area],eax ;ãáâ ­ ¢«¨¢ ¥¬ ç¨á«® ᨬ¢®«®¢, ª®â®àë¥ ¢« §ïâ ¢ íªà ­ ¤«ï £®à¨§. áªà®««¨­£ 
.no_size:
popad
ret
endp
align 4
proc ted_delete, edit:dword
push edi
mov edi,dword[edit]
invoke mem.free,ted_tex
invoke mem.free,ted_arr_key_pos ;ted_syntax_file
pop edi
ret
endp
;input:
; eax = key kodes
align 4
proc ted_key, edit:dword, table:dword, control:dword
pushad
mov edi,dword[edit]
mov esi,ted_el_focus
cmp dword[esi],edi
jne .end_key_fun ;í«¥¬¥­â ­¥ ¢ 䮪ãᥠ¢ë室¨¬ ¨§ ä㭪樨
mov esi,dword[control]
cmp ah,KEY_F1 ;[F1]
jne @f
stdcall ted_show_help_f1,edi
jmp .end_key_fun
@@:
cmp ah,KEY_F3 ;[F3]
jne @f
stdcall ted_but_find_next,edi
jmp .end_key_fun
@@:
test esi,KM_CTRL ;Ctrl+...
jz .key_Ctrl
cmp ah,24 ;Ctrl+O
jne @f
cmp ted_fun_on_key_ctrl_o,0
je @f
call ted_fun_on_key_ctrl_o
@@:
cmp ah,31 ;Ctrl+S
jne @f
cmp ted_fun_on_key_ctrl_s,0
je @f
call ted_fun_on_key_ctrl_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 @f
call ted_fun_on_key_ctrl_f
@@:
cmp ah,44 ;Ctrl+Z
jne @f
stdcall ted_but_undo,edi
@@:
cmp ah,46 ;Ctrl+C
jne @f
stdcall ted_but_copy,edi
@@:
cmp ah,47 ;Ctrl+V
jne @f
stdcall ted_but_paste,edi
@@:
cmp ah,49 ;Ctrl+N
jne @f
cmp ted_fun_on_key_ctrl_n,0
je @f
call ted_fun_on_key_ctrl_n
@@:
cmp ah,199 ;Ctrl+Home
jne @f
call ted_key_ctrl_home
@@:
jmp .end_key_fun
.key_Ctrl:
test esi,KM_SHIFT ;Shift+...
jz .key_Shift
cmp ah,72 ;Shift+Up
jne @f
call ted_sel_key_up
@@:
cmp ah,75 ;Shift+Left
jne @f
call ted_sel_key_left
@@:
cmp ah,77 ;Shift+Right
jne @f
call ted_sel_key_right
@@:
cmp ah,80 ;Shift+Down
jne @f
call ted_sel_key_down
@@:
;mov ted_drag_k,1 ;­ ç¨­ ¥¬ ¢ë¤¥«¥­¨¥ ®â ª« ¢¨ âãàë
jmp .key_MoveCur
.key_Shift:
;-------------------------------------------------
cmp ah,72 ;178 ;Up
jne @f
call ted_draw_cursor_sumb
call ted_cur_move_up
cmp dl,8
jne .no_red_0
call ted_scroll_set_redraw
stdcall ted_draw,edi
jmp @f
.no_red_0:
call ted_draw_main_cursor
mov ted_drag_k,0 ;§ ª ­ç¨¢ ¥¬ ¢ë¤¥«¥­¨¥ ®â ª« ¢¨ âãàë
@@:
cmp ah,80 ;177 ;Down
jne @f
call ted_draw_cursor_sumb
call ted_cur_move_down
cmp dl,8
jne .no_red_1
call ted_scroll_set_redraw
stdcall ted_draw,edi
jmp @f
.no_red_1:
call ted_draw_main_cursor
mov ted_drag_k,0 ;§ ª ­ç¨¢ ¥¬ ¢ë¤¥«¥­¨¥ ®â ª« ¢¨ âãàë
@@:
cmp ah,75 ;176 ;Left
jne @f
call ted_draw_cursor_sumb
call ted_cur_move_left
cmp dl,8
jne .no_red_2
call ted_scroll_set_redraw
stdcall ted_draw,edi
jmp @f
.no_red_2:
call ted_draw_main_cursor
mov ted_drag_k,0 ;§ ª ­ç¨¢ ¥¬ ¢ë¤¥«¥­¨¥ ®â ª« ¢¨ âãàë
@@:
cmp ah,77 ;179 ;Right
jne @f
call ted_draw_cursor_sumb
call ted_cur_move_right
cmp dl,8
jne .no_red_3
call ted_scroll_set_redraw
stdcall ted_draw,edi
jmp @f
.no_red_3:
call ted_draw_main_cursor
mov ted_drag_k,0 ;§ ª ­ç¨¢ ¥¬ ¢ë¤¥«¥­¨¥ ®â ª« ¢¨ âãàë
@@:
cmp ah,71 ;180 ;Home
jne @f
call ted_draw_cursor_sumb
call ted_cur_move_x_first_char
cmp dl,8
jne .no_red_4
call ted_scroll_set_redraw
stdcall ted_draw,edi
jmp @f
.no_red_4:
call ted_draw_main_cursor
mov ted_drag_k,0 ;§ ª ­ç¨¢ ¥¬ ¢ë¤¥«¥­¨¥ ®â ª« ¢¨ âãàë
@@:
cmp ah,79 ;181 ;End
jne @f
call ted_draw_cursor_sumb
call ted_cur_move_x_last_char
cmp dl,8
jne .no_red_5
call ted_scroll_set_redraw
stdcall ted_draw,edi
jmp @f
.no_red_5:
call ted_draw_main_cursor
mov ted_drag_k,0 ;§ ª ­ç¨¢ ¥¬ ¢ë¤¥«¥­¨¥ ®â ª« ¢¨ âãàë
@@:
cmp ah,73 ;184 ;PageUp
jne @f
call ted_cur_move_page_up
cmp dl,0
je @f
call ted_scroll_set_redraw
stdcall ted_draw,edi
@@:
cmp ah,81 ;183 ;PageDown
jne @f
call ted_cur_move_page_down
cmp dl,0
je @f
call ted_scroll_set_redraw
stdcall ted_draw,edi
mov ted_drag_k,0 ;§ ª ­ç¨¢ ¥¬ ¢ë¤¥«¥­¨¥ ®â ª« ¢¨ âãàë
@@:
;-------------------------------------------------
; cmp esi,0
; jne .end_key_fun
.key_MoveCur:
cmp ah,69 ;[Pause Break]
je .end_key_fun
cmp ah,120 ;[Fn]
je .end_key_fun
cmp ah,0x80 ;if key up
ja .end_key_fun
cmp dword[table],0
je @f
stdcall KeyConvertToASCII, dword[table]
@@:
;mov ted_drag_k,0 ;§ ª ­ç¨¢ ¥¬ ¢ë¤¥«¥­¨¥ ®â ª« ¢¨ âãàë
lea edx,[EvChar] ;¡¥à¥¬  ¤à¥á â ¡«¨æë á ¤®¯ãá⨬묨 ᨬ¢®« ¬¨
add dl,ah
jae @f
add edx,0x100 ;¥á«¨ ¡ë«® ¯¥à¥¯®«­¥­¨¥ ¯à¨ ¤®¡ ¢«¥­¨¨ ª®¤  ᨬ¢®« 
@@:
cmp byte [edx],1
jne @f
mov ted_key_new,ah
call ted_set_undo
mov edx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
stdcall ted_sel_text_del,edx
cmp al,1
jne .del
mov edx,ted_opt_ed_move_cursor
.del:
cmp ted_cur_ins,1
je .no_ins_mod
stdcall ted_text_del,edi,ted_opt_ed_change_time
mov edx,ted_opt_ed_move_cursor
.no_ins_mod:
mov ecx,edi
add ecx,ted_offs_key_new
stdcall ted_text_add,edi,ecx,1,edx ;¤®¡ ¢«ï¥¬ ᨬ¢®« ¢¢¥¤¥­­ë© á ª« ¢¨ âãàë
cmp ted_key_new,13
jne .dr_m_win
stdcall ted_draw,edi
jmp .dr_cur_l
.dr_m_win:
stdcall ted_draw_cur_line,edi
.dr_cur_l:
cmp ted_fun_draw_panel_buttons,0
je @f
call ted_fun_draw_panel_buttons
@@:
cmp ah,8 ;[<-]
jne @f
call ted_set_undo
stdcall ted_sel_text_del,ted_opt_ed_change_time
cmp al,1
je .del_one_b
stdcall ted_text_del,edi,ted_opt_ed_change_time+ted_opt_ed_move_cursor
.del_one_b:
stdcall ted_draw,edi
cmp ted_fun_draw_panel_buttons,0
je .end_key_fun
call ted_fun_draw_panel_buttons
jmp .end_key_fun
@@:
cmp ah,182 ;Delete
jne @f
call ted_set_undo
stdcall ted_sel_text_del,ted_opt_ed_change_time
cmp al,1
je .del_one_d
stdcall ted_text_del,edi,ted_opt_ed_change_time
.del_one_d:
stdcall ted_draw,edi
cmp ted_fun_draw_panel_buttons,0
je .end_key_fun
call ted_fun_draw_panel_buttons
jmp .end_key_fun
@@:
cmp ah,185 ;Ins
jne @f
call ted_draw_cursor_sumb
xor ted_cur_ins,1
call ted_draw_main_cursor
@@:
.end_key_fun:
popad
ret
endp
;output:
; al = 1 - can save
align 4
proc ted_can_save, edit:dword
push ecx edi
mov edi,dword[edit]
mov ecx,ted_tim_ch
sub ecx,ted_tim_undo
mov al,1
cmp ted_tim_ls,ecx
jne @f
dec al
@@:
pop edi ecx
ret
endp
;input:
; edi = pointer to tedit struct
;output:
; al = 1 - selected
align 4
proc ted_is_select
push ebx
xor al,al
cmp ted_drag_m,1
je @f
mov al,1
mov ebx,ted_sel_x0
cmp ebx,ted_sel_x1
jne @f
mov ebx,ted_sel_y0
cmp ebx,ted_sel_y1
jne @f
xor al,al
@@:
pop ebx
ret
endp
;input:
; edi = pointer to tedit struct
align 4
proc ted_sel_normalize
push ecx esi
push edi
mov esi,edi
add esi,ted_offs_sel
add edi,ted_offs_seln
mov ecx,sizeof.TexSelect
rep movsb
pop edi
jmp @f
.swp_f:
mov ecx,ted_seln_x0
m2m ted_seln_x0,ted_seln_x1
mov ted_seln_x1,ecx
mov ecx,ted_seln_y0
cmp ecx,ted_seln_y1 ;(sel_y0>sel_y1)
jle .end_f
m2m ted_seln_y0,ted_seln_y1
mov ted_seln_y1,ecx
jmp .end_f
@@:
mov ecx,ted_seln_y0
cmp ecx,ted_seln_y1 ;(sel_y0>sel_y1)
jg .swp_f
cmp ecx,ted_seln_y1 ;(sel_y0==sel_y1)
jne .end_f
mov ecx,ted_seln_x0
cmp ecx,ted_seln_x1 ;(sel_x0>sel_x1)
jg .swp_f
.end_f:
pop esi ecx
ret
endp
;input:
; edi = pointer to tedit struct
;description:
; ”ã­ªæ¨ï ¢ë§ë¢ ¥¬ ï ¯à¨ ­ ç «¥ ¢ë¤¥«¥­¨ï
align 4
proc ted_sel_start
push eax ecx
mov eax,ted_scr_h
mov ecx,ted_cur_x
add ecx,dword[eax+sb_offs_position]
mov ted_sel_x0,ecx
mov ted_sel_x1,ecx
mov eax,ted_scr_w
mov ecx,ted_cur_y
add ecx,dword[eax+sb_offs_position]
mov ted_sel_y0,ecx
mov ted_sel_y1,ecx
pop ecx eax
ret
endp
;input:
; edi = pointer to tedit struct
;description:
; ”ã­ªæ¨ï ¢ë§ë¢ ¥¬ ï ¯à¨ ¯¥à¥¬¥é¥­¨¨ ¢ë¤¥«¥­¨ï
align 4
proc ted_sel_move
push eax ecx
mov ecx,ted_cur_x
mov eax,ted_scr_h
add ecx,dword[eax+sb_offs_position]
mov ted_sel_x1,ecx
mov eax,ted_scr_w
mov ecx,ted_cur_y
add ecx,dword[eax+sb_offs_position]
mov ted_sel_y1,ecx
pop ecx eax
cmp ted_fun_draw_panel_buttons,0 ;redraw toolbar (need to button Copy)
je @f
call ted_fun_draw_panel_buttons
@@:
ret
endp
;input:
; cl_al_mem = 1 - clear all memory
align 4
proc ted_clear, edit:dword, cl_al_mem:dword
push ecx edi
mov edi,dword[edit]
mov ted_cur_x,0
mov ted_cur_y,0
mov ted_tim_ch,0
mov ted_tim_ls,0
mov ted_tim_co,0
mov ted_tim_undo,0
mov ted_help_id,-1
mov ecx,sizeof.symbol
shl ecx,1
add ecx,ted_tex
mov ted_ptr_free_symb,ecx
mov ecx,ted_scr_w
mov dword[ecx+sb_offs_position],0
mov dword[ecx+sb_offs_max_area],100 ;ç¨á«® áâப ¢¨¤¨¬ëå ¢ ­®¢®¬ ¤®ªã¬¥­â¥
mov dword[ecx+sb_offs_redraw],1
mov ecx,ted_scr_h
mov dword[ecx+sb_offs_position],0
mov dword[ecx+sb_offs_max_area],100 ;ç¨á«® ᨬ¢®«®¢ ¢¨¤¨¬ëå ¢ ­®¢®¬ ¤®ªã¬¥­â¥
mov ted_sel_x0,0
mov ted_sel_y0,0
mov ted_sel_x1,0
mov ted_sel_y1,0
cmp dword[cl_al_mem],0
je .exit
push edx
mov ecx,sizeof.symbol
imul ecx,ted_max_chars
mov edx,ted_tex
@@:
mov byte [edx],0
inc edx
loop @b
mov edx,ted_tex
mov dword [edx+6],1
pop edx
.exit:
pop edi ecx
ret
endp
align 4
proc ted_init_syntax_file, edit:dword, file:dword, f_name:dword
pushad
mov edi,dword[edit]
mov eax,70
mov ebx,dword[file]
mov dword[ebx], 0
mov dword[ebx+4], 0
mov dword[ebx+8], 0
mov ecx,ted_syntax_file_size
mov dword[ebx+12], ecx
m2m dword[ebx+16], ted_syntax_file
mov byte[ebx+20], 0
m2m dword[ebx+21], dword[f_name]
int 0x40
mov ecx,0x100
mov edx,ted_arr_key_pos
@@:
mov dword[edx],-1
add edx,4
loop @b
;init: ted_colors_text_count, ted_key_words_count, ...
mov ted_colors_text_count,1
mov ted_key_words_count,0
mov ted_help_text_f1,0
mov ted_help_id,-1 ;¨¤¥­â¨ä¨ª â®à á«®¢  ¤«ï á¯à ¢ª¨
cmp eax,6
je @f
cmp eax,0
je @f
cmp ax,10
jl .zifra_0_9
mov al,'?'
sub ax,48
.zifra_0_9:
add ax,48
cmp ted_fun_init_synt_err,0
je .no_colors
call ted_fun_init_synt_err
jmp .no_colors
@@:
mov eax,edi ;á®å࠭塞 §­ ç¥­¨¥ edi
mov esi,ted_syntax_file
add edi,ted_offs_count_colors
mov ecx,9*4
rep movsb
mov edi,eax ;¢®áâ ­ ¢«¨¢ ¥¬ §­ ç¥­¨¥ edi
mov eax,ted_syntax_file
add eax,32
mov ted_text_colors,eax
mov eax,ted_colors_text_count ;init: count_colors_text (offset to key words)
add eax,8
shl eax,2
add eax,ted_syntax_file
mov ted_key_words_data,eax
mov ecx,ted_key_words_count ;init: ted_arr_key_pos (first key positions)
xor eax,eax
@@:
ColToIndexOffset eax,edx
xor ebx,ebx
mov bl,byte[edx]
shl bx,2
mov esi,ted_arr_key_pos
add esi,ebx
cmp dword[esi],-1
jne .no_ch_key
mov dword[esi],eax
.no_ch_key:
inc eax
loop @b
;init: ted_help_text_f1
mov ecx,ted_key_words_count ;ª®«¨ç¥á⢮ ª«î祢ëå á«®¢
imul ecx,sizeof.TexColViv ;à §¬¥à áâàãªâãàë á 1-¬ ª«. á«.
add ecx,ted_key_words_data ;­ ç «® ä ©«  á ª«. á«.
mov ted_help_text_f1,ecx ;¬¥âª  ¢ ¯ ¬ïâ¨, £¤¥ ­ ç¨­¥âáï ⥪áâ á® á¯à ¢ª®©
stdcall ted_init_scroll_bars,edi,1 ;¬¥­ï¥¬ æ¢¥â  áªà®««¨­£®¢
.no_colors:
popad
ret
endp
;input:
; ebx = file size
; edi = pointer to tedit struct
;description:
; ”ã­ªæ¨ï ¢ë§ë¢ ¥âáï ¯à¨ ®âªàë⨨ ä ©« 
align 4
proc ted_on_open_file
push eax ;destination
push ecx ;for cycle
push edx ;source
push esi
stdcall ted_clear,edi,0 ;ç¨á⨬ ­¥ ¢áî ¯ ¬ïâì, ¯®â®¬ã çâ® ­¨¦¥ ¡ã¤¥¬ ¥¥ § ¯®«­ïâì ­®¢ë¬¨ ¤ ­ë¬¨
mov eax,ebx
mov ecx,ebx
add eax,2
ConvertIndexToPointer eax
mov edx,ted_tex
add edx,ebx
push ebx
@@:
mov ebx,[edx]
mov byte [eax],bl
mov dword [eax+2],ecx
inc dword [eax+2]
mov dword [eax+6],ecx
add dword [eax+6],3
;mov byte[eax+1],0 ;col=0
mov dword [eax+10],-1 ;tc=-1
mov dword [eax+14],0 ;td=0
cmp ecx,0
je @f
dec ecx
dec edx
sub eax,sizeof.symbol
jmp @b
@@:
pop ebx
add eax,2
mov dword [eax],0 ; first sumbol 'perv=0'
mov edx,ted_tex
; begining sumbol 'perv=0' 'next=2'
mov dword [edx+2],0
mov dword [edx+6],2
add edx,sizeof.symbol
mov dword [edx+6],0 ; last sumbol 'next=0'
mov dword [edx+2],ebx ; last sumbol 'perv=last'
inc dword [edx+2]
mov edx,ebx
inc edx ;2 = rezerv sumbols
imul edx,sizeof.symbol
add edx,ted_tex
mov dword [edx+6],1 ; last sumbol 'next=1'
@@: ;clear memory, need if before was open big file
add edx,sizeof.symbol
cmp edx,ted_tex_end
jge @f
mov dword[edx+10],0
mov dword[edx+14],0
jmp @b
@@:
call ted_get_num_lines
cmp eax,100
jge @f
mov eax,100
@@:
mov esi,ted_scr_w
mov dword[esi+sb_offs_max_area],eax
pop esi edx ecx eax
call ted_text_colored
stdcall ted_draw,edi
cmp ted_fun_draw_panel_buttons,0
je @f
call ted_fun_draw_panel_buttons
@@:
ret
endp
;input:
; edx = pointer to symbol struct
; edi = pointer to tedit struct
;output:
; edx = pointer to 'perv' visible symbol struct
align 4
ted_iterat_perv:
cmp ted_tim_undo,0
je .else
push ebx
@@:
call ted_get_text_perv_pos
cmp edx,ted_tex
je @f
call ted_symbol_not_vis
cmp bl,1
je @b
cmp byte[edx],10 ;¯à®¯ã᪠ᨬ¢®«  á ª®¤®¬ 10
je @b
@@:
pop ebx
ret
.else:
call ted_get_text_perv_pos
cmp edx,ted_tex
je .endif
cmp dword [edx+14],0
jne .else
cmp byte[edx],10 ;¯à®¯ã᪠ᨬ¢®«  á ª®¤®¬ 10
je .else
.endif:
ret
;input:
; edx = pointer to symbol struct
; edi = pointer to tedit struct
;output:
; edx = pointer to 'next' visible symbol struct
align 4
ted_iterat_next:
cmp ted_tim_undo,0
je .else
push ebx
@@:
call ted_get_text_next_pos
cmp edx,ted_tex_1
jle @f
call ted_symbol_not_vis
cmp bl,1
je @b
cmp byte[edx],10 ;¯à®¯ã᪠ᨬ¢®«  á ª®¤®¬ 10
je @b
@@:
pop ebx
ret
.else:
call ted_get_text_next_pos
cmp edx,ted_tex_1
jle .endif
cmp dword [edx+14],0
jne .else
cmp byte[edx],10 ;¯à®¯ã᪠ᨬ¢®«  á ª®¤®¬ 10
je .else
.endif:
ret
;input:
; bl = symbol end of select
; bh = íªà ­¨àãî騩 ᨬ¢®« (= 0 ¥á«¨ ­¥â ¯à®¢¥àª¨ ­  ­¨å)
; edx = pointer to symbol struct
; edi = pointer to tedit struct
;description:
; ­ ©â¨ á«¥¤ãîéãî ¯®§¨æ¨î 㪠§ ­­®£® ᨬ¢®« 
align 4
ted_iterat_next_pos_char:
push ax
mov al,1 ;¯à¥¤ë¤ã騩 ᨬ¢®«, á«ã¦¨â ¤«ï áà ¢­¥­¨ï á ᨬ¢®«®¬ bh
@@:
cmp bl,byte[edx]
je .found
.no_found:
cmp edx,ted_tex_1
jle @f
mov al,byte[edx]
call ted_iterat_next
jmp @b
.found:
cmp bh,al
je .no_found
@@:
call ted_iterat_next
pop ax
ret
;input:
; edx = pointer to symbol struct
; edi = pointer to tedit struct
align 4
ted_iterat_perv_color_tag:
@@:
cmp byte[edx+1],0
jne @f
call ted_iterat_perv
cmp edx,ted_tex_1
jle @f
jmp @b
@@:
ret
;input:
; edx = pointer to symbol struct
; edi = pointer to tedit struct
align 4
ted_iterat_next_color_tag:
@@:
call ted_iterat_next
cmp byte[edx+1],0
jne @f
cmp edx,ted_tex_1
jle @f
jmp @b
@@:
;call ted_iterat_next
ret
;input:
; edx = pointer to symbol struct
; edi = pointer to tedit struct
;output:
; bl = 1 if sumbol not visible
; (tex[i].td+ted_tim_undo<=ted_tim_ch && tex[i].td) || (tex[i].tc>ted_tim_ch-ted_tim_undo)
align 4
ted_symbol_not_vis:
push eax
xor bl,bl
cmp dword [edx+14],0
je @f
mov eax,[edx+14] ;eax=tex[i].td
add eax,ted_tim_undo
cmp eax,ted_tim_ch
jg @f
mov bl,1
pop eax
ret
@@:
mov eax,ted_tim_ch
sub eax,ted_tim_undo
cmp [edx+10],eax
jle @f
or bl,1
@@:
pop eax
ret
;input:
; text:dword - pointer to text string
; add_opt:dword - options
align 4
proc ted_text_add, edit:dword, text:dword, t_len:dword, add_opt:dword
locals
new_spc dd ? ;count new spaces
new_lin dd ? ;count new lines
endl
;¨á¯®«ì§®¢ ­¨¥ ॣ¨áâ஢ ¢­ãâਠä㭪樨:
;eax - ¯®§¨æ¨ï ¤«ï ¢áâ ¢ª¨ ⥪áâ 
;ebx - ¤«ï ¢à¥¬¥­­ëå ­ã¦¤, ¤«¨­­  ¢áâ ¢«ï¥¬®£® ⥪áâ 
;ecx - ¤«ï ¢à¥¬¥­­ëå ­ã¦¤
;edx - 㪠§ â¥«ì ­  áâàãªâãàã ᨬ¢®« 
pushad
cmp dword[t_len],1 ;¯à®¢¥à塞 ¤«¨­­ã ¤®¡¢«ï¥¬®£® ⥪áâ 
jl .no_add ;ª®£¤  ¤«¨­­  <1 ¯à룠¥¬ ­  ª®­¥æ ä㭪樨, ¢® ¨§¡¥¦ ­¨¥ £«îª®¢
mov edi,dword[edit]
mov esi,dword[text]
call ted_get_pos_by_cursor
call ted_get_text_perv_pos
call ted_get_text_arr_index ;eax=po_t
mov dword[new_spc],0
cmp ted_gp_opt,2
je @f
push eax ;c_sp=cur[cn].x+Scroller->XPos-StrLen(cur[cn].y+Scroller->YPos);
mov eax,ted_scr_h
mov eax,dword[eax+sb_offs_position]
add eax,ted_cur_x ;eax - ­®¬¥à ᨬ¢®« 
mov dword[new_spc],eax
mov eax,ted_scr_w
mov eax,dword[eax+sb_offs_position]
add eax,ted_cur_y ;eax - ­®¬¥à áâப¨
call ted_strlen ;ebx = line len
sub dword[new_spc],ebx ;®â ¯®§¨æ¨¨ ªãàá®à  ®â­¨¬ ¥¬ ¤«¨­­ã áâப¨, 㧭 ¥¬ ª®««¨ç¥á⢮ ¤®¡ ¢«ï¥¬ëå ¯à®¡¥«®¢
pop eax
@@:
mov ebx,dword[t_len]
mov dword[new_lin],0
cmp ted_gp_opt,0
jne @f
push eax
mov eax,ted_scr_w
mov eax,dword[eax+sb_offs_position]
add eax,ted_cur_y
inc eax
mov dword[new_lin],eax
call ted_get_num_lines
sub dword[new_lin],eax
pop eax
@@:
mov edx,ted_ptr_free_symb
.beg_cycle: ;for(i=...;i<ted_max_chars;i++)
cmp dword [edx+10],0 ;if(!tex[i].tc && !tex[i].td)
jne .u1f
cmp dword [edx+14],0
jne .u1f
test dword[add_opt],ted_opt_ed_change_time ;if(n_tim) ted_tim_ch++;
jz .no_tim
inc ted_tim_ch
.no_tim:
test dword[add_opt],ted_opt_ed_move_cursor
jz .no_cur_mov
cmp dword[new_lin],0 ;¥á«¨ ¥áâì ¤®¡ ¢®ç­ë¥ áâப¨, â® ªãàá®à ¥é¥ ­¥ ¤¢¨£ ¥¬
jg .no_cur_mov
cmp dword[new_spc],0 ;¥á«¨ ­¥â ¤®¡ ¢®ç­ëå ¯à®¡¥«®¢, â® ªãàá®à ⮦¥ ­¥ ¤¢¨£ ¥¬
jg .no_cur_mov
inc ted_cur_x ;move cursor
;call ted_go_to_pos
cmp byte [esi],13
jne .no_cur_mov
mov ted_cur_x,0
inc ted_cur_y
.no_cur_mov:
mov ecx,ted_opt_ed_change_time
not ecx
and dword[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 [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;
call ted_get_text_arr_index ;*** eax = i ***
mov [ecx],eax ;tex[po_t].next=i; // áá뫪¨ ¯¥à¥­ ¯à ¢«ï¥¬
mov ecx,[edx+6] ; *** ecx = tex[i].next ***
imul ecx,sizeof.symbol
add ecx,ted_tex ; *** ecx = tex[tex[i].next] ***
mov [ecx+2],eax ;tex[tex[i].next].perv=i;
cmp dword[new_lin],0 ;add lines or text
jle .spc_add
dec dword[new_lin]
mov byte [edx],13
jmp .u1f
.spc_add:
cmp dword[new_spc],0 ;add spaces or text
jle .tex_add
dec dword[new_spc]
mov byte [edx],' '
jmp .u1f
.tex_add:
inc esi
dec ebx
.u1f:
add edx,sizeof.symbol
cmp edx,ted_tex_end
jge @f ;out of memory
cmp ebx,0
jne .beg_cycle
mov ted_ptr_free_symb,edx ;¬¥­ï¥¬ 㪠§ â¥«ì ­  ᢮¡®¤­ë© ᨬ¢®«, ¤«ï ¡®«¥¥ ¡ëáâண® ¯®¨áª  ¯ ¬ïâ¨
jmp .add_all
@@:
cmp ted_increase_size,0
je .add_all
call ted_memory_increase
cmp ebx,0
jne .beg_cycle
.add_all: ;¢á¥ ᨬ¢®«ë ¤®¡ ¢«¥­ë
call ted_text_colored
.no_add:
popad
ret
endp
;input:
; edx = pointer to sumbol, when insert
; edi = pointer to tedit struct
;output:
; edx = new pointer to sumbol, when insert
align 4
proc ted_memory_increase
cmp ted_increase_size,0
je @f
push eax ebx ecx
mov ecx,ted_increase_size
add ecx,ted_max_chars
mov ted_max_chars,ecx
imul ecx,sizeof.symbol
invoke mem.realloc, ted_tex,ecx
mov ebx,ted_tex
mov ted_tex,eax
mov ted_tex_1,eax
add ted_tex_1,sizeof.symbol
sub edx,ebx
add edx,eax
mov ted_ptr_free_symb,edx
add eax,ecx
mov ted_tex_end,eax
pop ecx ebx eax
@@:
ret
endp
;input:
; ecx = position to free insert cell
; edx = pointer to sumbol, when insert
; esi = added symbol
; edi = pointer to tedit struct
;output:
; ecx = position to inserted cell
align 4
ted_char_add:
.loop_b:
cmp ecx,ted_tex_end
jge .end_f
cmp dword[ecx+10],0
jne @f
cmp dword[ecx+14],0
je .loop_e
@@:
add ecx,sizeof.symbol
jmp .loop_b
.loop_e:
push eax ebx
mov eax,ted_tim_ch
mov dword[ecx+10],eax
mov ax,si
mov byte[ecx],al
call ted_get_text_arr_index ; *** eax=pos ***
mov [ecx+2],eax ;tex[i].perv=pos;
m2m dword[ecx+6],dword[edx+6] ;tex[i].next=tex[pos].next;
push edx
mov edx,ecx
call ted_get_text_arr_index ; *** eax=i ***
pop edx
mov [edx+6],eax ;tex[pos].next=i; // áá뫪¨ ¯¥à¥­ ¯à ¢«ï¥¬
mov ebx,[ecx+6]
ConvertIndexToPointer ebx
mov [ebx+2],eax ;tex[tex[i].next].perv=i; // ...
pop ebx eax
.end_f:
call ted_text_colored
ret
;input:
; edi = pointer to tedit struct
;output:
; esi = count converted symbols
;description:
; ”ã­ªæ¨ï ¨á¯®«ì§ã¥âáï ¤«ï ᬥ­ë ॣ¨áâà  ¢ë¡à ­­ëå ᨬ¢®«®¢
align 4
proc ted_convert_sel_text, conv_fun:dword
locals
conv_cou dd ?
endl
mov dword[conv_cou],0
pushad
call ted_is_select
cmp al,0
je .end_f
call ted_set_undo
call ted_sel_normalize
mov esi,ted_seln_x0
mov ecx,ted_seln_y0
call ted_get_pos_by_coords
mov eax,edx
mov esi,ted_seln_x1
mov ecx,ted_seln_y1
call ted_get_pos_by_coords
;call ted_get_text_perv_pos
mov ebx,edx
cmp eax,ebx
je .end_f
inc ted_tim_ch
mov edx,eax ;i=p0;
mov ecx,ted_ptr_free_symb
@@:
push eax
mov al,byte[edx]
call dword[conv_fun] ;¯à¥®¡à §®¢ ­¨¥ ᨬ¢®« 
mov esi,eax
cmp byte[edx],al
pop eax
je .no_change
m2m dword [edx+14],ted_tim_ch
call ted_char_add ;b_pos=ted_char_add(tex[i].c^32,i,false,b_pos);
call ted_get_text_next_pos ;go to added symbol
inc dword[conv_cou]
.no_change:
call ted_iterat_next
cmp edx,ted_tex
je @f
cmp edx,ebx
je @f
jmp @b
@@:
cmp dword[conv_cou],0
jne @f
dec ted_tim_ch
@@:
.end_f:
popad
mov esi,dword[conv_cou]
ret
endp
;output:
; bl = 0 - no delete
; bl = 1 - delete
align 4
proc ted_text_del, edit:dword, del_opt:dword
push cx edx edi
mov edi,dword[edit]
mov ebx,dword[del_opt]
xor cl,cl
test ebx,ted_opt_ed_move_cursor
jz @f
call ted_cur_move_left
cmp dl,0
je .no_del
@@:
call ted_get_pos_by_cursor
cmp ted_gp_opt,1
je .no_del
test ebx,ted_opt_ed_change_time
jz @f
inc ted_tim_ch
@@:
m2m dword [edx+14], ted_tim_ch
mov cl,1
.no_del:
mov bl,cl
pop edi edx cx
ret
endp
;input:
; edi = pointer to tedit struct
;output:
; al = 1 if delete
;description:
; ”ã­ªæ¨ï 㤠«ï¥â ¢ë¤¥«¥­­ë© ⥪áâ
align 4
proc ted_sel_text_del, del_opt:dword
push ebx ecx edx esi
call ted_is_select
cmp al,0
je .end_f
call ted_sel_normalize
mov esi,ted_seln_x1
mov ecx,ted_seln_y1
call ted_get_pos_by_coords
mov ebx,edx
mov esi,ted_seln_x0
mov ecx,ted_seln_y0
call ted_get_pos_by_coords
test dword[del_opt],ted_opt_ed_change_time
jz @f
inc ted_tim_ch
@@:
cmp edx,ted_tex
je @f
cmp edx,ebx ;if(i==te)break;
je @f
m2m dword[edx+14],ted_tim_ch
mov esi,ted_opt_ed_change_time
not esi
and dword[del_opt],esi ;n_tim=false;
call ted_iterat_next
jmp @b
@@:
test dword[del_opt],ted_opt_ed_change_time
jz @f
dec ted_tim_ch
xor al,al
@@:
test dword[del_opt],ted_opt_ed_change_time
jnz @f
mov ecx,ted_seln_x0
mov edx,ted_seln_y0
call ted_go_to_pos
mov ted_sel_x0,0
mov ted_sel_y0,0
mov ted_sel_x1,0
mov ted_sel_y1,0
@@:
.end_f:
pop esi edx ecx ebx
ret
endp
;input:
; eax = pointer to begin select
; ebx = pointer to end select
; edi = pointer to tedit struct
align 4
ted_revers:
cmp eax,ebx
jne @f
ret
@@:
push ecx edx
mov edx,ted_tex_1
cmp edx,ebx ;if(p1==1)p1=tex[1].perv;
jne @f
call ted_get_text_perv_pos
mov ebx,edx
@@:
push esi
mov edx,[eax+2] ; *** edx = tex[p0].perv ***
ConvertIndexToPointer edx
add edx,6
mov ecx,[edx] ;tmp = tex[tex[p0].perv].next;
mov esi,[ebx+6] ; *** esi = tex[p1].next ***
ConvertIndexToPointer esi
add esi,2
m2m dword[edx],dword[esi] ;tex[tex[p0].perv].next = tex[tex[p1].next].perv;
mov [esi],ecx ;tex[tex[p1].next].perv = tmp;
pop esi
mov ecx,[eax+2] ;tmp = tex[p0].perv;
m2m dword[eax+2],dword[ebx+6] ;tex[p0].perv = tex[p1].next;
mov [ebx+6],ecx ;tex[p1].next = tmp;
mov edx,eax ;i=p0;
@@:
mov ecx,[edx+6] ;tmp = tex[i].next;
m2m dword[edx+6],dword[edx+2] ;tex[i].next = tex[i].perv;
mov [edx+2],ecx ;tex[i].perv = tmp;
cmp edx,ebx ;if(i==p1)break;
je @f
; ---
;cmp edx,ted_tex
;je @f
; ---
mov edx,ecx ;i = tmp;
ConvertIndexToPointer edx
jmp @b
@@:
pop edx ecx
call ted_text_colored
ret
;input:
; edi = pointer to tedit struct
;output:
; dl = 0 not move
; dl = 2 if move up
; dl = 8 if scroll move up
align 4
ted_cur_move_up:
cmp ted_cur_y,0
je @f
dec ted_cur_y
mov dl,2
ret
@@:
push eax
mov eax,ted_scr_w
cmp dword[eax+sb_offs_position],0
je @f
dec dword[eax+sb_offs_position]
mov dl,8
jmp .ret_f
@@:
mov dl,0
.ret_f:
pop eax
ret
;input:
; edi = pointer to tedit struct
;output:
; dl = 0 not move
; dl = 2 if move down
; dl = 8 if scroll move down
align 4
ted_cur_move_down:
push eax ebx
mov ebx,ted_scr_w
mov dl,0
mov eax,dword[ebx+sb_offs_cur_area]
dec eax
cmp ted_cur_y,eax
jge @f
inc ted_cur_y
mov dl,2
jmp .ret_f
@@:
mov eax,ted_cur_y
add eax,dword[ebx+sb_offs_position]
inc eax
cmp dword[ebx+sb_offs_max_area],eax
jle @f
inc dword[ebx+sb_offs_position]
mov dl,8
@@:
.ret_f:
pop ebx eax
ret
;input:
; edi = pointer to tedit struct
;output:
; dl = 0 not move
; dl = 1 if move up
align 4
ted_cur_move_page_up:
push eax ebx
mov ebx,ted_scr_w
mov eax,dword[ebx+sb_offs_cur_area]
xor dl,dl
cmp eax,dword[ebx+sb_offs_position]
jg @f
sub dword[ebx+sb_offs_position],eax
mov dl,1
@@:
cmp dword[ebx+sb_offs_position],0
je @f
cmp dl,1
je @f
mov dword[ebx+sb_offs_position],0
mov dl,1
@@:
pop ebx eax
ret
;input:
; edi = pointer to tedit struct
align 4
ted_cur_move_page_down:
push eax ebx ecx
mov ecx,ted_scr_w
xor dl,dl
mov eax,dword[ecx+sb_offs_max_area]
sub eax,dword[ecx+sb_offs_cur_area]
cmp dword[ecx+sb_offs_position],eax
jge @f
mov ebx,dword[ecx+sb_offs_cur_area]
add dword[ecx+sb_offs_position],ebx
mov dl,1
mov dword[ecx+sb_offs_redraw],1
cmp dword[ecx+sb_offs_position],eax
jle @f
mov dword[ecx+sb_offs_position],eax
@@:
pop ecx ebx eax
ret
;input:
; edi = pointer to tedit struct
;output:
; dl = 0 not move
; dl = 1 if move left
; dl = 3 if move left and up
; dl = 8 if scroll move up
align 4
ted_cur_move_left:
cmp ted_cur_x,0
je @f
dec ted_cur_x
mov dl,1
ret
@@:
push eax
mov eax,ted_scr_h
cmp dword[eax+sb_offs_position],0
je @f
dec dword[eax+sb_offs_position]
mov dl,8
jmp .ret_f
@@:
cmp ted_cur_y,0
jne @f
mov eax,ted_scr_w
mov dl,0
cmp dword[eax+sb_offs_position],0
je .ret_f
dec dword[eax+sb_offs_position]
call ted_scroll_set_redraw
call ted_cur_move_x_last_char
mov dl,8
jmp .ret_f
@@:
cmp ted_cur_y,0
je @f
dec ted_cur_y
call ted_cur_move_x_last_char
cmp dl,8
je .ret_f
mov dl,3
jmp .ret_f
@@:
mov dl,0
.ret_f:
pop eax
ret
;input:
; edi = pointer to tedit struct
align 4
ted_cur_move_right:
push eax ebx
mov eax,ted_scr_h
xor dl,dl
mov ebx,dword[eax+sb_offs_cur_area]
cmp ted_cur_x,ebx
jge @f
inc ted_cur_x
mov dl,1
jmp .ret_f
@@:
inc dword[eax+sb_offs_position]
mov dl,8
.ret_f:
pop ebx eax
ret
;input:
; edi = pointer to tedit struct
align 4
ted_cur_move_x_last_char:
;[hScr.position]
;[hScr.cur_area]
;dl-???
push eax ebx ecx
mov eax,ted_cur_y
mov ecx,ted_scr_w
add eax,dword[ecx+sb_offs_position]
call ted_strlen
xor dl,dl
mov ecx,ted_scr_h
cmp ebx,dword[ecx+sb_offs_position]
jge @f
mov dl,8
mov dword[ecx+sb_offs_position],ebx
@@:
sub ebx,dword[ecx+sb_offs_position]
cmp ebx,dword[ecx+sb_offs_cur_area]
jle @f ; b---[---]---e
add dword[ecx+sb_offs_position],ebx
mov ebx,dword[ecx+sb_offs_cur_area]
sub dword[ecx+sb_offs_position],ebx
mov dl,8
@@:
mov ted_cur_x,ebx
pop ecx ebx eax
ret
;input:
; edi = pointer to tedit struct
;output:
; dl = 0 not move
; dl = 1 move cursor
; dl = 8 move cursor and scroll
align 4
ted_cur_move_x_first_char:
xor dl,dl
cmp ted_cur_x,0
je @f
mov ted_cur_x,0
mov dl,1
@@:
push eax
mov eax,ted_scr_h
cmp dword[eax+sb_offs_position],0
je @f
mov dword[eax+sb_offs_position],0
mov dl,8
@@:
pop eax
ret
;input:
; edx = pointer to symbol struct
; edi = pointer to tedit struct
;output:
; eax = array index
align 4
ted_get_text_arr_index:
push ecx edx
mov eax,edx
sub eax,ted_tex
xor edx,edx
mov ecx,sizeof.symbol
div ecx
pop edx ecx
ret
;input:
; edx = pointer to symbol struct
; edi = pointer to tedit struct
;output:
; edx = pointer to 'perv' struct
align 4
ted_get_text_perv_pos:
mov edx,dword[edx+2]
imul edx,sizeof.symbol
add edx,ted_tex
ret
;input:
; edx = pointer to symbol struct
;output:
; edx = pointer to 'next' symbol struct
align 4
ted_get_text_next_pos:
mov edx,dword[edx+6]
imul edx,sizeof.symbol
add edx,ted_tex
ret
;input:
; edi = pointer to tedit struct
;output:
; edx = symbol under cursor
; ted_gp_opt = 1,2
; edx = tex[1].perv if error
; ted_gp_opt = 0
align 4
ted_get_pos_by_cursor:
push eax ecx esi
mov esi,ted_cur_x
mov eax,ted_scr_h
add esi,dword[eax+sb_offs_position]
mov ecx,ted_cur_y
mov eax,ted_scr_w
add ecx,dword[eax+sb_offs_position]
call ted_get_pos_by_coords
pop esi ecx eax
ret
;input:
; esi = XPos
; ecx = YPos
; edi = pointer to tedit struct
;output:
; edx = symbol under cursor
; ted_gp_opt = 1 if found text line
; ted_gp_opt = 2 if found text line and column
; edx = tex[1] if error
; ted_gp_opt = 0 if text no found
align 4
ted_get_pos_by_coords:
push eax ;Row
push ebx ;Col
xor eax,eax
xor ebx,ebx
mov ted_gp_opt,0
mov edx,ted_tex
@@:
call ted_iterat_next
cmp edx,ted_tex_1
jle @f
cmp ebx,esi
jne .u1_0 ;Col <> ted_cur_x
mov ted_gp_opt,1
cmp eax,ecx
jge @f ; Row >= ted_cur_y
.u1_0:
mov ted_gp_opt,0
inc ebx
cmp byte [edx],13
jne @b
cmp eax,ecx
jge @f ; Row >= ted_cur_y
inc eax
xor ebx,ebx
jmp @b
@@:
cmp eax,ecx
jne @f ; Row = ted_cur_y
inc ted_gp_opt
@@:
cmp ted_gp_opt,0
jne @f
mov edx,ted_tex_1
;call ted_get_text_perv_pos
@@:
pop ebx eax
ret
;input:
; eax = Row
; edi = pointer to tedit struct
;output:
; ebx = str len
align 4
ted_strlen:
push edx ecx
;ecx = Row, from cycle
xor ebx,ebx
xor ecx,ecx
mov edx,ted_tex
@@:
call ted_iterat_next
cmp edx,ted_tex_1
jle @f
inc ebx
cmp byte [edx],13
jne @b
dec ebx ;lenght minus 1 sumbol to paragraph
cmp eax,ecx
je @f
xor ebx,ebx
inc ecx
jmp @b
@@:
cmp eax,ecx
je @f
xor ebx,ebx
@@:
pop ecx edx
ret
;input:
; edx = symbol position
; edi = pointer to tedit struct
;output:
; eax = number of line
; ebx = symbol position in line
align 4
ted_get_text_coords:
push edx
xor eax,eax
xor ebx,ebx
@@:
call ted_iterat_perv
cmp eax,0
jne .no_col_mov
inc ebx
.no_col_mov:
cmp edx,ted_tex_1
jle @f
cmp byte [edx],13
jne @b
inc eax
jmp @b
@@:
dec ebx
pop edx
ret
;input:
; edi = pointer to tedit struct
;output:
; eax = num lines
align 4
ted_get_num_lines:
push edx
mov eax,1
mov edx,ted_tex
@@:
call ted_iterat_next
cmp edx,ted_tex_1
jle @f
cmp byte [edx],13
jne @b
inc eax
jmp @b
@@:
;...
;dec eax
pop edx
ret
;input:
; edi = pointer to tedit struct
;description:
; ®â¬¥­ï¥â ®â¬¥­¥­­ë¥ ¤¥©á⢨ï, ¯¥à¥¤ ¨§¬¥­¥­¨¥¬ ¤®ªã¬¥­â 
align 4
proc ted_set_undo
mov ted_drag_k,0 ;§ ª ­ç¨¢ ¥¬ ¢ë¤¥«¥­¨¥ ®â ª« ¢¨ âãàë
cmp ted_tim_undo,1
jl .no_work
push eax ebx edx
mov edx,ted_tex
call ted_get_text_next_pos ;long i=tex[0].next;
mov eax,ted_tim_undo
sub ted_tim_ch,eax ;ted_tim_ch-=ted_tim_undo;
mov eax,ted_tim_ch
cmp ted_tim_ls,eax ;if(ted_tim_ls>ted_tim_ch)
jle @f
mov ted_tim_ls,0
@@:
cmp edx,ted_tex
je @f
;if(tex[i].tc>ted_tim_ch){ // ¥á«¨ ᮧ¤ ­¨¥ ᨬ¢®«  ¡ë«® ®â¬¥­¥­®
cmp [edx+10],eax
jle .no_u1
mov dword [edx+10],0
mov dword [edx+14],0
mov ebx,[edx+2]
imul ebx,sizeof.symbol
add ebx,ted_tex;.next
m2m dword [ebx+6],dword [edx+6] ;tex[tex[i].perv].next=tex[i].next;
mov ebx,[edx+6]
imul ebx,sizeof.symbol
add ebx,ted_tex;.perv
m2m dword [ebx+2],dword [edx+2] ;tex[tex[i].next].perv=tex[i].perv;
cmp ted_ptr_free_symb,edx
jle .no_u1
mov ted_ptr_free_symb,edx ;¬¥­ï¥¬ 㪠§ â¥«ì ­  ᢮¡®¤­ë© ᨬ¢®«, ¤«ï ¡®«¥¥ ¡ëáâண® ¯®¨áª  ¯ ¬ïâ¨
.no_u1:
;else if(tex[i].td>ted_tim_ch) tex[i].td=0; // ¥á«¨ 㤠«¥­¨¥ ᨬ¢®«  ¡ë«® ®â¬¥­¥­®
cmp [edx+14],eax
jle .no_u2
mov dword [edx+14],0
.no_u2:
call ted_get_text_next_pos
jmp @b
@@:
mov ted_tim_undo,0
mov eax,ted_tim_co
cmp ted_tim_ch,eax
jge @f
mov ted_tim_co,0
@@:
pop edx ebx eax
.no_work:
ret
endp
;input:
; ecx = Col
; edx = Row
; edi = pointer to tedit struct
align 4
ted_go_to_pos:
push eax
mov eax,ted_scr_w
mov ted_cur_x,ecx
sub edx,dword[eax+sb_offs_position]
cmp edx,dword[eax+sb_offs_cur_area] ;ted_cur_y > [.cur_area]
jl @f
push ebx
mov ebx,edx
sub ebx,dword[eax+sb_offs_cur_area]
inc ebx
add dword[eax+sb_offs_position],ebx
sub edx,ebx
pop ebx
; ??? redrav
@@:
mov ted_cur_y,edx
pop eax
ret
;input:
; edi = pointer to tedit struct
align 4
ted_text_colored:
push eax edx
mov eax,ted_tim_ch
sub eax,ted_tim_undo
mov ted_tim_co,eax
mov edx,ted_tex
@@:
call ted_iterat_next
cmp edx,ted_tex_1
jle @f
mov byte[edx+1],0
jmp @b
@@:
cmp ted_key_words_count,1
jl .no_colors
mov edx,ted_tex
@@:
call ted_text_find_sel_color
cmp edx,ted_tex_1
jle .no_colors
jmp @b
.no_colors:
pop edx eax
ret
;input:
; edx = pointer to start symbol
; edi = pointer to tedit struct
;output:
; edx = pointer to next symbol
;description:
; ”ã­ªæ¨ï ¤«ï ¯®¨áª  ¨ ¢ë¤¥«¥­¨ï ¯®¤á¢¥ç¥­ëå á«®¢
align 4
proc ted_text_find_sel_color
locals
begPos dd ? ;­ ç «ì­ ï ¯®§¨æ¨ï
endPos dd ? ;ª®­¥ç­ ï ¯®§¨æ¨ï
find db ? ;­ ©¤¥­® / ­¥ ­ ©¤¥­®
f_color db ? ;¨­¤¥ªá æ¢¥â  ­ ©¤¥­®£® á«®¢ 
endl
push eax ebx ecx esi
;eax = word_n ⥪ã騩 ­®¬¥à (¯®§¨æ¨ï) ¯à®¢¥à塞®£® á«®¢  ¢ ᯨ᪥
;ebx = ¤«ï à §­ëå 楫¥©
;ecx = l_pos ¯®á«¥¤­¨© ­®¬¥à (¯®§¨æ¨ï) ¯®¤å®¤ï饣® á«®¢  ¢ ᯨ᪥
;esi = ¤«ï à §­ëå 楫¥©, ­®¬¥à ¯à®¢¥à塞®£® ᨬ¢®«  ¢ á«®¢¥
mov dword[begPos],1
mov dword[endPos],1
mov byte[find],0
mov byte[f_color],1
@@:
call ted_iterat_next
cmp edx,ted_tex_1
jle @f
xor eax,eax
mov al,byte[edx]
shl ax,2 ;eax*=4
add eax,ted_arr_key_pos
mov eax,dword[eax]
cmp eax,0
jl @b ;if( (word_n=ted_arr_key_pos[(unsigned char)tex[i].c])>-1 ){
mov ecx,eax
;while(l_pos<ted_key_words_count && Col[l_pos].Text[0]==Col[word_n].Text[0])
.wh_1b:
cmp ecx,ted_key_words_count
jge .wh_1e
ColToIndexOffset ecx,esi
mov bl,byte[esi]
ColToIndexOffset eax,esi
cmp bl,byte[esi]
jne .wh_1e
inc ecx
jmp .wh_1b
.wh_1e:
mov dword[begPos],edx ;bP=i;
mov esi,1
.wh_2b: ;while(1){
call ted_iterat_next
;while(l_pos>word_n && Col[l_pos-1].Text[pos]!=tex[i].c)
.wh_3b:
cmp ecx,eax
jle .wh_3e
dec ecx
ColToIndexOffset ecx,ebx
inc ecx
;cmp byte[ebx+esi],byte[edx]
mov bl,byte[ebx+esi]
cmp bl,byte[edx]
je .wh_3e
dec ecx
jmp .wh_3b
.wh_3e:
ColToIndexOffset eax,ebx
cmp byte[ebx+esi],0
jne .if_0 ;if(Col[word_n].Text[pos]==0){
mov dword[endPos],edx ;eP=i;
ColToIndexOffset eax,ebx
mov bl,byte[ebx+MAX_COLOR_WORD_LEN+7]
mov byte[f_color],bl ;f_color=Col[word_n].color;
mov byte[find],1
ColToIndexOffset eax,ebx ;... ebx = Col[word_n]
mov bl,byte[ebx+MAX_COLOR_WORD_LEN+4]
cmp bl,0 ;if(Col[word_n].wwo)
je .if_2n
push edx
mov edx,dword[begPos]
call ted_iterat_perv
btr bx,0 ;1-1
jae .if_3e ;if(Col[word_n].wwo&1)
;u1= !(isalnum(cont_s)||cont_s=='_')
call isalnum
jae .if_3e
mov byte[find],0
.if_3e:
btr bx,3 ;4-1
jae .if_4e ;if(Col[word_n].wwo&8)
;u1= !isalpha(cont_s);
call isalpha
jae .if_4e
mov byte[find],0
.if_4e:
mov edx,dword[endPos]
; call ted_iterat_next
btr bx,1 ;2-1
jae .if_5e ;if(Col[word_n].wwo&2)
;u1= !(isalnum(cont_s)||cont_s=='_')
call isalnum
jae .if_5e
mov byte[find],0
.if_5e:
btr bx,4 ;5-1
jae .if_6e ;if(Col[word_n].wwo&16)
;u1= !isalpha(cont_s);
call isalpha
jae .if_6e
mov byte[find],0
.if_6e:
btr bx,2 ;3-1
jae .if_7e ;if(Col[word_n].wwo&4)
ColToIndexOffset eax,ebx
mov bx,word[ebx+MAX_COLOR_WORD_LEN+5]
call ted_iterat_next_pos_char
cmp edx,ted_tex_1
jle .if_7e
mov dword[endPos],edx
.if_7e:
pop edx
.if_2n:
; if(i!=1){ // ­¥ ª®­¥æ ¤®ªã¬¥­â 
; cont_s=tex[eP].c;
; if(Col[word_n].wwo&2) u2= !(isalnum(cont_s)||cont_s=='_'); // ­¥ ¡ãª¢.-ç¨á«. ᨬ¢®«
; if(u2 && Col[word_n].wwo&16) u2= !isalpha(cont_s); // ­¥ ç¨á«. ᨬ¢®«
; if(Col[word_n].wwo&4) eP=ted_iterat_next_pos_char(eP,Col[word_n].endc);
cmp eax,ecx
je .wh_2e ;if(word_n==l_pos) break; // do double - ¥á«¨ á«®¢® â®ç­® ¯®á«¥¤­¥¥
.if_0:
cmp edx,ted_tex_1
jle .wh_2e ;if(i==1) break;
;while(l_pos>word_n && Col[word_n].Text[pos]!=tex[i].c)
.wh_4b:
cmp ecx,eax
jle .wh_4e
ColToIndexOffset eax,ebx
;cmp byte[ebx+esi],byte[edx]
mov bl,byte[ebx+esi]
cmp bl,byte[edx]
je .wh_4e
inc eax
jmp .wh_4b
.wh_4e:
cmp eax,ecx
je .wh_2e;if(word_n==l_pos) break;
inc esi ;pos++;
jmp .wh_2b
.wh_2e:
cmp byte[find],1 ;if(fnd)break;
je @f
mov edx,dword[begPos];i=bP;
jmp @b
@@:
cmp byte[find],1
jne .if_1e ;if(fnd){ // ¢ë¤¥«¥­¨¥ ­ ©¤¥­®£® ⥪áâ 
; if(!mode_sf1 || (mode_sf1 && strlen(Col[word_n].f1->c_str())>0)){
mov eax,dword[begPos]
mov bl,byte[f_color]
mov byte[eax+1],bl ;tex[bP].col=f_color;
mov eax,dword[endPos]
mov byte[eax+1],0xff ;tex[eP].col=255;
; return ItPoPerv(eP); // ¢®§¢à é ¥¬ ¯®§¨æ¨î ª®­æ  ¢å®¦¤¥­¨ï
mov edx,dword[endPos]
call ted_get_text_perv_pos
jmp @f
.if_1e:
mov edx,ted_tex
@@:
pop esi ecx ebx eax
ret
endp
;input:
; edx = pointer to char (byte)
;output:
; cf=1 if symbol is...
align 4
tab_all_num db 0,0,0,0,0,0,11111111b,11b,11111110b,0xff,0xff,111b,11111110b,0xff,0xff,111b,0,0,0,0,0,0,0,0;,0,0,0,0,0,0,0,0 - tab_alpha_0,0,0,0,0,0,0,0
tab_alpha db 0,0,0,0,0,0,0,0,11111110b,0xff,0xff,111b,11111110b,0xff,0xff,111b,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
align 4
isalnum:
push eax ebx
mov al,byte[edx] ;al=offset
shr al,3
and eax,11111b
lea ebx,[tab_all_num]
add ebx,eax
mov ah,byte[ebx]
mov al,byte[edx] ;al=bit
and ax,111b
mov bx,word[ebx]
btr bx,ax
pop ebx eax
ret
align 4
isalpha:
push eax ebx
mov al,byte[edx] ;al=offset
shr al,3
and eax,11111b
lea ebx,[tab_alpha]
add ebx,eax
mov ah,byte[ebx]
mov al,byte[edx] ;al=bit
and ax,111b
mov bx,word[ebx]
btr bx,ax
pop ebx eax
ret
align 4
proc ted_show_help_f1, edit:dword
push eax edx edi
mov edi,dword[edit]
call ted_get_pos_by_cursor
push edx
call ted_iterat_next_color_tag
mov eax,edx
pop edx
call ted_iterat_perv_color_tag
cmp eax,ted_tex
jle @f
cmp edx,ted_tex_1
jle @f
stdcall ted_find_help_id,eax
@@:
;call ted_draw_main_cursor
call ted_draw_help_f1
pop edi edx eax
ret
endp
;input:
; edx = position begin 'symbol' struct
; edi = pointer to tedit struct
; end_pos = position end 'symbol' struct
align 4
proc ted_find_help_id, end_pos:dword
; ecx = word_n
; ebx = l_pos
mov ted_help_id,-1
push ebx ecx
xor ebx,ebx
mov bl,byte[edx]
shl bx,2 ;ebx*=4
add ebx,ted_arr_key_pos
mov ecx,dword[ebx]
cmp ecx,0
jl .if_0e ;if( (word_n=ted_arr_key_pos[(unsigned char)tf[0]])>-1 ){
push esi eax
mov ebx,ecx ;l_pos=word_n;
ColToIndexOffset ecx,esi
push cx
mov cl,byte[esi]
@@:
cmp ebx,ted_key_words_count ;while(l_pos<ted_key_words_count)
jge @f
;ColToIndexOffset ecx,esi
ColToIndexOffset ebx,eax
cmp cl,byte[eax] ;&& Col[l_pos].Text[0]==Col[word_n].Text[0])
jne @f
inc ebx ;l_pos++;
jmp @b
@@:
pop cx
call ted_iterat_next ;pos=1;
mov esi,1
@@:
push dx
push word[edx]
pop dx
.wh_0b:
cmp ebx,ecx ;while(l_pos>word_n
jle .wh_0e
dec ebx
ColToIndexOffset ebx,eax
inc ebx
cmp byte[eax+esi],dl ;&& Col[l_pos-1].Text[pos]!=tf[i])
je .wh_0e
dec ebx ;l_pos--;
jmp .wh_0b
.wh_0e:
.wh_1b:
cmp ebx,ecx ;while(l_pos>word_n
jle .wh_1e
ColToIndexOffset ecx,eax
cmp byte[eax+esi],dl
je .wh_1e
inc ecx ;word_n++;
jmp .wh_1b
.wh_1e:
pop dx
cmp ecx,ebx ;if(word_n==l_pos) break;
je @f
call ted_iterat_next ;pos++;
cmp edx,dword[end_pos] ;for(...;i<strlen;...)
je @f ;jge
inc esi
jmp @b
@@:
pop eax esi
mov ted_help_id,ecx
;return word_n;
.if_0e:
pop ecx ebx
ret
endp
;output:
; eax = ª®¤ ®è¨¡ª¨
; ebx = ª®««¨ç¥á⢮ ¯à®ç¨â ­­ëå ¡ ©â
align 4
proc ted_open_file, edit:dword, file:dword, f_name:dword ;äã­ªæ¨ï ®âªàëâ¨ï ä ©« 
push edi
mov edi,dword[edit]
mov eax,70
mov ebx,dword[file]
mov dword[ebx], 0
mov dword[ebx+4], 0
mov dword[ebx+8], 0
m2m dword[ebx+12], ted_max_chars ;ç¨á«® ¡ ©â, ª®â®àë¥ ¬®£ãâ ¡ëâì áç¨â ­ë á ä ©« 
m2m dword[ebx+16], ted_tex
mov byte[ebx+20], 0
push dword[f_name]
pop dword[ebx+21]
int 0x40
cmp eax,0
je @f
cmp eax,6
je @f
jmp .ret_f
@@:
cmp ebx,-1
je .ret_f
;if open file
call ted_on_open_file
.ret_f:
pop edi
ret
endp
align 4
proc ted_but_select_word, edit:dword
pushad
mov edi,dword[edit]
call ted_get_pos_by_cursor
push edx
call ted_iterat_perv_color_tag
cmp edx,ted_tex_1
jle @f
call ted_get_text_coords
mov ted_sel_x0,ebx
mov ted_sel_y0,eax
@@:
pop edx
call ted_iterat_next_color_tag
cmp edx,ted_tex_1
jle @f
call ted_get_text_coords
mov ted_sel_x1,ebx
mov ted_sel_y1,eax
@@:
cmp ted_fun_draw_panel_buttons,0
je @f
call ted_fun_draw_panel_buttons
@@:
stdcall ted_draw,edi
popad
ret
endp
align 4
proc ted_but_cut, edit:dword
push edi
mov edi,dword[edit]
stdcall ted_but_copy,edi
call ted_set_undo
stdcall ted_sel_text_del,ted_opt_ed_change_time
cmp al,1
jne @f
stdcall ted_draw,edi
cmp ted_fun_draw_panel_buttons,0
je @f
call ted_fun_draw_panel_buttons
@@:
pop edi
ret
endp
;output:
; al = 1 if copy text
align 4
proc ted_but_copy, edit:dword
pushad
mov edi,dword[edit]
call ted_is_select
cmp al,0
je .end_f ;if not selected text
call ted_sel_normalize
mov esi,ted_seln_x1
mov ecx,ted_seln_y1
call ted_get_pos_by_coords
mov ebx,edx
mov esi,ted_seln_x0
mov ecx,ted_seln_y0
call ted_get_pos_by_coords
mov esi,ebx
xor ecx,ecx
mov ebx,ted_buffer
;mov edx,ted_tex
@@:
cmp edx,ted_tex_1 ;end of file
jle @f
cmp edx,esi ;end of select
je @f
inc ecx
cmp ecx,ted_buffer_size ;owerflow bufer
je @f
mov al,byte[edx]
mov byte[ebx],al
inc ebx
call ted_iterat_next
jmp @b
@@:
add ecx,ted_buffer
mov byte[ebx],0
cmp ecx,0
je .end_f
call ted_draw_buffer
cmp ted_fun_draw_panel_buttons,0
je .end_f
call ted_fun_draw_panel_buttons
.end_f:
popad
ret
endp
align 4
proc ted_but_paste, edit:dword
push eax ebx esi edi
mov edi,dword[edit]
mov esi,ted_buffer
call tl_strlen
cmp eax,1
jl @f
mov esi,eax
call ted_set_undo
mov ebx,ted_opt_ed_change_time+ted_opt_ed_move_cursor
stdcall ted_sel_text_del,ebx
cmp al,1
jne .del
mov ebx,ted_opt_ed_move_cursor
.del:
stdcall ted_text_add,edi,ted_buffer,esi,ebx
stdcall ted_draw,edi
cmp ted_fun_draw_panel_buttons,0
je @f
call ted_fun_draw_panel_buttons
@@:
pop edi esi ebx eax
ret
endp
align 4
proc ted_but_sumb_upper uses edi esi, edit:dword
mov edi,dword[edit]
stdcall ted_convert_sel_text,fb_char_toupper
cmp esi,0
je @f
stdcall ted_draw,edi
@@:
ret
endp
align 4
proc ted_but_sumb_lover uses edi esi, edit:dword
mov edi,dword[edit]
stdcall ted_convert_sel_text,fb_char_todown
cmp esi,0
je @f
stdcall ted_draw,edi
@@:
ret
endp
align 4
proc ted_but_reverse, edit:dword
push eax ebx edi
mov edi,dword[edit]
call ted_is_select
cmp al,0
je @f
call ted_sel_normalize
push esi ecx edx
mov esi,ted_seln_x0
mov ecx,ted_seln_y0
call ted_get_pos_by_coords
mov eax,edx
mov esi,ted_seln_x1
cmp esi,0
je .beg_str
dec esi
.beg_str:
mov ecx,ted_seln_y1
call ted_get_pos_by_coords
;call ted_get_text_perv_pos
mov ebx,edx
pop edx ecx esi
;cmp eax,...
;je @f
call ted_revers
@@:
stdcall ted_draw,edi
pop edi ebx eax
ret
endp
align 4
proc ted_but_undo, edit:dword
push eax edi
mov edi,dword[edit]
mov eax,ted_tim_undo
cmp ted_tim_ch,eax
jbe @f
inc ted_tim_undo
;call ted_text_colored
stdcall ted_draw,edi
cmp ted_fun_draw_panel_buttons,0
je @f
call ted_fun_draw_panel_buttons
@@:
pop edi eax
ret
endp
align 4
proc ted_but_redo, edit:dword
push edi
mov edi,dword[edit]
cmp ted_tim_undo,1
jb @f
dec ted_tim_undo
;call ted_text_colored
stdcall ted_draw,edi
cmp ted_fun_draw_panel_buttons,0
je @f
call ted_fun_draw_panel_buttons
@@:
pop edi
ret
endp
align 4
proc ted_but_find_next, edit:dword
pushad
mov edi,dword[edit]
call ted_get_pos_by_cursor
mov eax,ted_buffer_find
mov bl,byte[eax]
@@:
call ted_get_find_rezult
cmp bh,1
je @f ; find
call ted_iterat_next
cmp edx,ted_tex_1
jle @f
jmp @b
@@:
cmp bh,0
je @f
call ted_get_text_coords
inc ebx ;move cursor right
mov ted_sel_x1,ebx
mov ted_sel_y1,eax
mov edx,eax
mov ecx,ebx
call ted_go_to_pos
mov edx,esi ;esi ¡ë«® ãáâ ­®¢«¥® ¢ ted_get_find_rezult
call ted_get_text_coords
mov ted_sel_x0,ebx
mov ted_sel_y0,eax
stdcall ted_draw,edi
jmp .end_find
@@:
;¯®¯ ¤ ¥¬ á ¥á«¨ ⥪áâ ­¥ ­ ©¤¥­
cmp ted_fun_find_err,0
je .end_find
call ted_fun_find_err ;¯®«ì§®¢ â¥«ì᪠ï äã­ªæ¨ï
.end_find:
popad
ret
endp
;input:
; edi = pointer to tedit struct
align 4
ted_key_ctrl_home:
mov ted_cur_x,0
mov ted_cur_y,0
push eax
mov eax,ted_scr_w
mov dword[eax+sb_offs_position],0
mov eax,ted_scr_h
mov dword[eax+sb_offs_position],0
pop eax
stdcall ted_draw,edi
cmp ted_fun_draw_panel_buttons,0
je @f
call ted_fun_draw_panel_buttons
@@:
ret
;input:
; edi = pointer to tedit struct
align 4
proc ted_sel_key_up
cmp ted_drag_k,1
je @f
call ted_sel_start
mov ted_drag_k,1
@@:
push dx
call ted_cur_move_up
cmp dl,8
jne @f
call ted_scroll_set_redraw
@@:
pop dx
call ted_sel_move
stdcall ted_draw,edi
ret
endp
;input:
; edi = pointer to tedit struct
align 4
proc ted_sel_key_down
cmp ted_drag_k,1
je @f
call ted_sel_start
mov ted_drag_k,1
@@:
push dx
call ted_cur_move_down
cmp dl,8
jne @f
call ted_scroll_set_redraw
@@:
pop dx
call ted_sel_move
stdcall ted_draw,edi
ret
endp
;input:
; edi = pointer to tedit struct
align 4
proc ted_sel_key_left
cmp ted_drag_k,1
je @f
call ted_sel_start
@@:
push dx
call ted_cur_move_left
call ted_sel_move
cmp ted_drag_k,1
je @f
mov ted_drag_k,1
mov dl,8
@@:
cmp dl,8
jne @f
call ted_scroll_set_redraw
stdcall ted_draw,edi
jmp .end_f
@@:
stdcall ted_draw_cur_line,edi
.end_f:
pop dx
ret
endp
;input:
; edi = pointer to tedit struct
align 4
proc ted_sel_key_right
cmp ted_drag_k,1
je @f
call ted_sel_start
@@:
push dx
call ted_cur_move_right
call ted_sel_move
cmp ted_drag_k,1
je @f
mov ted_drag_k,1
mov dl,8
@@:
cmp dl,8
jne @f
call ted_scroll_set_redraw
stdcall ted_draw,edi
jmp .end_f
@@:
stdcall ted_draw_cur_line,edi
.end_f:
pop dx
ret
endp
;input:
; edi = pointer to tedit struct
;description:
; this function need to optimize output
align 4
proc ted_draw_cursor_sumb
pushad
mov eax,13 ;rect
mov ebx,ted_wnd_l
add ebx,ted_rec_l
mov edx,ted_cur_x
imul edx,ted_rec_w
add ebx,edx
shl ebx,16
add ebx,ted_rec_w
mov ecx,ted_wnd_t ;calc rect -> y0,y1
add ecx,ted_rec_t
mov edx,ted_cur_y
imul edx,ted_rec_h
add ecx,edx
shl ecx,16
add ecx,ted_rec_h
mov edx,ted_color_wnd_work
push ecx
call ted_sel_normalize
mov esi,ted_scr_w
mov ecx,dword[esi+sb_offs_position]
sub ted_seln_y0,ecx
sub ted_seln_y1,ecx
mov ecx,ted_cur_y
cmp ecx,ted_seln_y0
jl .no_cur_sel
cmp ecx,ted_seln_y1
jg .no_cur_sel
mov edx,ted_color_select ;¬¥­ï¥¬ 梥â ä®­  ­  梥⠢뤥«¥­¨ï
mov esi,ted_scr_h
cmp ecx,ted_seln_y0
jne @f
mov ecx,ted_cur_x
add ecx,dword[esi+sb_offs_position]
cmp ecx,ted_seln_x0
jge @f
mov edx,ted_color_wnd_work
@@:
mov ecx,ted_cur_y
cmp ecx,ted_seln_y1
jne .no_cur_sel
mov ecx,ted_cur_x
add ecx,dword[esi+sb_offs_position]
cmp ecx,ted_seln_x1
jl .no_cur_sel
mov edx,ted_color_wnd_work
.no_cur_sel:
pop ecx
int 0x40 ;à¨á®¢ ­¨¥ ¯àאַ㣮«ì­¨ª 
call ted_get_pos_by_cursor ;¡¥à¥¬ ¯®§¨æ¨î ᨬ¢®« 
cmp ted_gp_opt,2
jne @f
mov eax,4
mov esi,1
ror ecx,16
mov bx,cx
add ebx,0x10001
call ted_get_symb_color
call ted_convert_invis_symb
int 0x40 ;à¨á®¢ ­¨¥ ᨬ¢®« 
@@:
popad
ret
endp
;input:
; edx -> pointer to text
; edi -> 㪠§ â¥«ì ­  áâàãªâãàã tedit
;output:
; ecx = color
; if ted_mode_color=0 then ecx=ted_color_wnd_text
align 4
ted_get_symb_color:
mov ecx,ted_color_wnd_text ;§ ¤ ¥¬ 梥â ⥪áâ  ¯® 㬮«ç ­¨î
push eax edx
cmp ted_mode_color,0
je .exit
jmp .on_first
@@:
call ted_iterat_perv
cmp edx,ted_tex_1
jle .exit
.on_first:
xor eax,eax
mov al,byte[edx+1]
cmp al,0 ;¥á«¨ al=0 ⮠梥⠭¥ ¬¥­ï¥âáï
je @b
cmp eax,ted_colors_text_count
jge .exit
shl ax,2 ;㬭®¦ ¥¬ ¨­¤¥ªá æ¢¥â  ­  4 ¡ ©â 
mov ecx,ted_text_colors ;¯à¨¡ ¢«ï¥¬ ᬥ饭¨¥ 1-£® 梥â 
add ecx,eax
mov ecx,dword[ecx] ;ãáâ ­ ¢«¨¢ ¥¬ ⥪ã騩 梥â ⥪áâ  ¯® ᬥ饭¨î
.exit:
pop edx eax
ret
;input:
; edx = pointer to text
; edi = pointer to tedit struct
;description:
; ”ã­ªæ¨ï ¯à¥®¡à §ã¥â ­¥¢¨¤¨¬ë¥ ᨬ¢®«ë ¢ ¯¥ç â ¥¬ë¥ ­  íªà ­¥
align 4
ted_convert_invis_symb:
cmp ted_mode_invis,1
jne .end_f
cmp byte[edx],9
jne @f
lea edx,[ted_symbol_tab]
@@:
cmp byte[edx],13
jne @f
mov edx,edi
add edx,ted_offs_symbol_new_line
@@:
.end_f:
ret
;input:
; edi = pointer to tedit struct
align 4
ted_scroll_set_redraw:
push eax
mov eax,ted_scr_w
mov dword[eax+sb_offs_redraw],1
mov eax,ted_scr_h
mov dword[eax+sb_offs_redraw],1
pop eax
ret
align 4
proc ted_draw, edit:dword
locals
line_num dd ?
endl
pushad
mov edi,dword[edit]
mov eax,4 ;draw text
mov ecx,ted_text_colors
mov ecx,dword[ecx]
mov ebx,ted_wnd_l
add ebx,ted_rec_l
shl ebx,16
add ebx,ted_wnd_t
add ebx,ted_rec_t
add ebx,0x10001 ;¤®¡ ¢«ï¥¬ ®âáâã¯ë ¤«ï ¢ëà ¢­¨¢ ­¨ï ¡ãª¢ë ¯® 業âàã
call ted_sel_normalize ;need before draw select
mov esi,ted_scr_w
mov esi,dword[esi+sb_offs_position]
mov dword[line_num],esi
stdcall ted_clear_line_before_draw, edi,ebx,1,esi
call ted_get_first_visible_pos
cmp edx,0
je .no_draw_text
mov esi,1 ;¤«¨­­  ¢ë¢®¤¨¬®£® ⥪áâ  ¯® 1-¬ã ᨬ¢®«ã
@@:
call ted_iterat_next
cmp edx,ted_tex_1
jle .no_draw_text
; *** 梥⮢ ï à §¬¥âª 
cmp ted_mode_color,0
je .no_col_change
cmp byte[edx+1],0
je .no_col_change
call ted_get_symb_color
.no_col_change:
cmp byte [edx],13
jne .no_13
cmp ted_mode_invis,1
jne .no_invis
push edx
mov edx,edi
add edx,ted_offs_symbol_new_line
int 0x40
pop edx
.no_invis:
add ebx,ted_rec_h
;optimized output \/
mov eax,ted_wnd_h
add eax,ted_wnd_t
cmp bx,ax
jg .no_draw_text
mov eax,4
;optimized output /\
and ebx,0xffff
ror ebx,16
add ebx,ted_wnd_l
add ebx,ted_rec_l
inc ebx
ror ebx,16
inc dword[line_num] ;increment line number
stdcall ted_clear_line_before_draw,edi,ebx,1,dword[line_num]
call ted_opt_draw_line_left
jmp @b
.no_13:
int 0x40
ror ebx,16
add ebx,ted_rec_w
mov esi,ted_wnd_l
add esi,ted_wnd_w
cmp bx,si
jl .no_opt
call ted_opt_draw_line_right
.no_opt:
mov si,1
ror ebx,16
jmp @b
.no_draw_text:
stdcall ted_clear_line_before_draw,edi,ebx,0,dword[line_num]
call ted_draw_line_numbers
call ted_draw_main_cursor
;---------------------------------------------
; set all_redraw flag for draw all ScrollBar
; In some cases it is necessity to draw only the area
; of moving of a "runner", for acceleration of output -
; in this case the flag needs to be reset to 0 (zero).
mov eax,ted_scr_h
mov esi,ted_scr_w
mov dword[eax+sb_offs_all_redraw],1
mov dword[esi+sb_offs_all_redraw],1
; à¨á®¢ ­¨¥ ¯®«®á ¯à®ªàã⪨
stdcall scroll_bar_horizontal.draw,eax ;[scrollbar_hor_draw]
stdcall scroll_bar_vertical.draw,esi ;[scrollbar_ver_draw]
; reset all_redraw flag
mov dword[eax+sb_offs_all_redraw],0
mov dword[esi+sb_offs_all_redraw],0
;---------------------------------------------
;left-bottom square
mov ebx,ted_wnd_l
shl ebx,16
add ebx,ted_rec_l
mov ecx,ted_wnd_t
add ecx,ted_wnd_h
shl ecx,16
mov cx,word[eax+sb_offs_size_y]
inc cx
mov edx,ted_color_wnd_capt ;[sc.work]
mov eax,13
int 0x40
;right-bottom square
mov ebx,ted_wnd_l
add ebx,ted_wnd_w
shl ebx,16
mov bx,word[esi+sb_offs_size_x]
inc bx
int 0x40
cmp ted_fun_draw_panel_find,0
je @f
call ted_fun_draw_panel_find
@@:
cmp ted_fun_draw_panel_syntax,0
je @f
call ted_fun_draw_panel_syntax
@@:
popad
ret
endp
;input:
; edi = pointer to tedit struct
align 4
proc ted_draw_main_cursor
pushad
mov eax,13 ;draw cursor
mov ecx,ted_wnd_t ;calc rect -> y0,y1
add ecx,ted_rec_t
mov edx,ted_cur_y
imul edx,ted_rec_h
add ecx,edx
cmp ted_cur_ins,1 ;¯à®¢¥àª  ०¨¬  à ¡®âë ªãàá®à  (®¡ëç­ë© ¨«¨ ¢áâ ¢ª )
jne @f
mov edx,ted_rec_h
inc edx ;1->1, 3->2, 5->3, ...
shr edx,1 ;edx = ¢ëá®â  áâப¨ ¤¥«¥­­ ï ­  2 (ª®£¤  ªãàá®à ­¥ ¯®«­ë©)
add ecx,edx
@@:
shl ecx,16
add ecx,ted_rec_h
cmp ted_cur_ins,1
jne @f
shr cx,1 ;¤¥«¨¬ ¢ëá®âã ªãàá®à  ­  2
@@:
mov ebx,ted_wnd_l ;calc rect -> x0,x1
add ebx,ted_rec_l
mov edx,ted_cur_x
imul edx,ted_rec_w
add ebx,edx
shl ebx,16
add ebx,ted_rec_w
mov edx,ted_color_cursor
int 0x40 ;¢ë¢®¤ ªãàá®à 
call ted_get_pos_by_cursor
cmp ted_gp_opt,2
jne @f
mov eax,4 ;draw text
mov esi,1
ror ecx,16
mov bx,cx
add ebx,0x10001
cmp ted_cur_ins,1
jne .no_up_tetx
mov ecx,ted_rec_h
inc cx ; 1->1, 3->2, 5->3, ...
shr cx,1
sub bx,cx
.no_up_tetx:
mov ecx,ted_color_cur_text
call ted_convert_invis_symb
int 0x40
@@:
mov eax,4
mov ebx,ted_wnd_l
add ebx,ted_rec_l
shl ebx,16
add ebx,ted_wnd_t
add ebx,3
mov ecx,ted_color_wnd_bord
or ecx,0x80000000
lea edx,[txtRow]
int 0x40 ;¢ë¢®¤ ¯®¤¯¨á¨ '‘âப '
add ebx,0x500000
lea edx,[txtCol]
int 0x40 ;¢ë¢®¤ ¯®¤¯¨á¨ '‡­ ª'
cmp ted_tim_undo,0
je @f
add ebx,0x500000
lea edx,[txtOtm]
int 0x40
sub ebx,0x500000
@@:
call ted_draw_buffer
call ted_draw_help_f1
mov eax,47 ;draw cursor coords
mov esi,ted_color_wnd_bord
or esi,0x40000000
mov edx,ebx
ror edx,16
sub edx,35
ror edx,16
;add edx,3
mov ebx,0x40000 ;Row=...
mov ecx,ted_scr_w
mov ecx,dword[ecx+sb_offs_position]
add ecx,ted_cur_y
inc ecx
push edi
mov edi,ted_color_wnd_work
int 0x40 ;¢ë¢®¤ ç¨á«  ⥪ã饩 áâப¨
pop edi
;mov ebx,0x40000 ;Col=...
mov ecx,ted_scr_h
mov ecx,dword[ecx+sb_offs_position]
add ecx,ted_cur_x
inc ecx
add edx,0x500000
push edi
mov edi,ted_color_wnd_work
int 0x40 ;¢ë¢®¤ ç¨á«  §­ ª®¢
pop edi
cmp ted_tim_undo,0
je @f
mov ecx,ted_tim_undo
add edx,0x500000
mov edi,ted_color_wnd_work ;¯®à⨬ ॣ¨áâà edi, ­® ¢ ª®­æ¥ ä㭪樨 í⮠㦥 ­¥ ¢ ¦­®
int 0x40 ;¢ë¢®¤ ç¨á«  ®â¬¥­¥­­ëå ¤¥©á⢨©
@@:
popad
ret
endp
;input:
; edi = pointer to tedit struct
proc ted_draw_buffer
pushad
mov eax,ted_buffer
cmp byte[eax],0 ;ᬮâਬ 1-© ᨬ¢®« ¨§ ¡ãä¥à 
je @f
mov ebx,ted_rec_l
add bx,300
cmp ebx,ted_wnd_w ;áà ¢­¨¢ ¥¬ ª®®à¤¨­ âã ¤«ï ¢ë¢®¤ ⥪áâ 
jge @f ;¯®¤¯¨áì ­¥ ¢« §¨â ¢ ®ª­®
add ebx,ted_wnd_l
shl ebx,16
add ebx,ted_wnd_t
add ebx,3
mov ecx,ted_color_wnd_bord
or ecx,0x40000000
mov edx,ted_buffer
mov esi,edx
mov edi,ted_color_wnd_work ;edi - destroy not pointer to tedit
call tl_strlen
;cmp eax,0 ;¡ãä¥à ¯ãáâ
;je @f
cmp eax,20
jle .crop_buf
mov eax,20 ;®¡à¥§ª  ¯®¤¯¨á¨ ¤® 20 ᨬ¢®«®¢
.crop_buf:
mov esi,eax
mov eax,4
int 0x40 ;¢ë¢®¤ ᮤ¥à¦¨¬®£® ¡ãä¥à 
sub ebx,50 shl 16
lea edx,[txtBuf]
mov esi,edx
call tl_strlen
mov esi,eax
mov eax,4
xor ecx,0x40000000 ;㡨ࠥ¬ 梥â ä®­ 
int 0x40 ;¢ë¢®¤ ¯®¤¯¨á¨ ¤«ï ¡ãä¥à 
@@:
popad
ret
endp
;input:
; edi = pointer to tedit struct
align 4
proc ted_draw_help_f1
pushad
cmp ted_rec_t,13 ;¬¨­¨¬ «ì­ ï ¢ëá®â  ¤«ï à¨á®¢ ­¨ï á¯à ¢ª¨
jle @f
mov eax,13 ;clear place before draw help
mov ebx,ted_wnd_l
add ebx,ted_rec_l
shl ebx,16
add ebx,ted_wnd_w
sub ebx,ted_rec_l
mov ecx,ted_wnd_t
add ecx,13
shl ecx,16
add ecx,ted_rec_h
mov edx,ted_color_wnd_capt
int 0x40
cmp ted_help_id,-1
je @f
mov eax,ted_help_id
ColToIndexOffset eax,edx
;SetCoordinates
mov ebx,ted_wnd_l
add ebx,ted_rec_l
shl ebx,16
add ebx,ted_wnd_t
add ebx,13 ;=3+10
;SetTextColor
xor eax,eax
mov al,byte[edx+MAX_COLOR_WORD_LEN+7]
shl ax,2
mov ecx,ted_text_colors
add ecx,eax
mov ecx,dword[ecx]
or ecx,0xc0000000 ;SetTextStyles
mov esi,edi
mov edi,ted_color_wnd_work
mov eax,4
int 0x40
mov edi,esi
;*** draw help string ***
mov ecx,ted_color_wnd_bord
or ecx,0x80000000
mov edx,dword[edx+MAX_COLOR_WORD_LEN]
cmp edx,0
je @f
add edx,ted_help_text_f1
add ebx,0x500000
int 0x40
@@:
popad
ret
endp
;input:
; edi = pointer to tedit struct
align 4
proc ted_draw_line_numbers
pushad
;top panel with caption
mov ebx,ted_wnd_l
; add ebx,ted_rec_l
shl ebx,16
add ebx,ted_wnd_w
; sub ebx,ted_rec_l
mov edx,ted_color_wnd_work
mov ecx,ted_wnd_t
shl ecx,16
add ecx,ted_rec_t
mov eax,13
mov edx,ted_color_wnd_capt
int 0x40
;line numbers
mov ebx,0x40000 ;format
mov ecx,ted_scr_w
mov ecx,dword[ecx+sb_offs_position]
inc ecx
mov edx,3
add edx,ted_wnd_l
rol edx,16
add edx,ted_wnd_t
add edx,ted_rec_t
@@:
push ebx ecx edx
;left panel with numbers
mov ebx,ted_wnd_l
shl ebx,16
add ebx,ted_rec_l
mov ecx,ted_rec_h
rol ecx,16
mov cx,dx
rol ecx,16
mov eax,13
mov edx,ted_color_wnd_capt
int 0x40 ;à¨á㥬 ¯àאַ㣮«ì­¨ª ¯®¤ ­®¬¥à®¬ áâப¨
pop edx ecx ebx
mov eax,47
mov esi,ted_color_wnd_bord
int 0x40 ;à¨á㥬 ­®¬¥à áâப¨
inc ecx
add edx,ted_rec_h
sub edx,ted_wnd_t
mov esi,edx
and esi,0xffff
cmp esi,ted_wnd_h
jge @f
add edx,ted_wnd_t
jmp @b
@@:
popad
ret
endp
;output:
; ah = symbol
align 4
proc KeyConvertToASCII, table:dword
push ebx
mov ebx,dword[table] ;convert scan to ascii
ror ax,8
xor ah,ah
add bx,ax ;? ebx,eax
mov ah,byte[ebx]
pop ebx
ret
endp
align 4
proc ted_draw_cur_line, edit:dword
pushad
mov edi,dword[edit]
mov ebx,ted_wnd_l
add ebx,ted_rec_l
shl ebx,16
mov eax,ted_cur_y
imul eax,ted_rec_h
mov bx,ax
add ebx,ted_wnd_t
add ebx,ted_rec_t ;ebx - ª®®à¤¨­ âë ¤«ï ¯àאַ㣮«ì­¨ª  ®ç¨á⪨ «¨­¨¨
add ebx,0x10001 ;¤®¡ ¢«ï¥¬ ®âáâã¯ë ¤«ï ¢ëà ¢­¨¢ ­¨ï ¡ãª¢ë ¯® 業âàã
call ted_sel_normalize ;need before draw select
mov ecx,ted_cur_y
mov eax,ted_scr_w
add ecx,dword[eax+sb_offs_position]
stdcall ted_clear_line_before_draw,edi,ebx,1,ecx
mov eax,ted_scr_h
mov esi,dword[eax+sb_offs_position]
call ted_get_pos_by_coords
cmp ted_gp_opt,2
jne .no_draw_text
; mov eax,4 ;draw text
call ted_get_symb_color
mov esi,1 ;draw 1 symbol
@@:
;call ted_iterat_next
cmp edx,ted_tex_1
jle .no_draw_text
; *** 梥⮢ ï à §¬¥âª 
cmp ted_mode_color,0
je .no_col_change
cmp byte[edx+1],0
je .no_col_change
call ted_get_symb_color
.no_col_change:
mov eax,4 ;draw text
cmp byte [edx],13
jne .no_13
cmp ted_mode_invis,1
jne .no_draw_text
push edx
mov edx,edi
add edx,ted_offs_symbol_new_line
int 0x40
pop edx
jmp .no_draw_text
.no_13:
int 0x40
ror ebx,16
add ebx,ted_rec_w
mov eax,ted_wnd_w
add eax,ted_wnd_l ;ax = ®âáâ㯠¯® ®á¨ x
cmp bx,ax
jge .no_draw_text ;Opt
ror ebx,16
call ted_iterat_next
jmp @b
.no_draw_text:
call ted_draw_main_cursor
popad
ret
endp
;input:
; eax - text need find
; bl - first symbol to find
; edx - first symbol pointer
; edi - pointer to tedit struct
;output:
; bh - rezult
; edx - last text position (if find sucess)
; esi - first symbol pointer
;description:
; ”ã­ªæ¨ï ¯à®¢¥àï¥â ᮢ¯ ¤ ¥â «¨ ⥪áâ ¢ ¡ãä¥à¥ eax
; á ⥪á⮬ । ªâ®à  ¯® 㪠§ â¥«î edx.
; ‘â ­¤ àâ­ë¥ ä㭪樨 (­ ¯à. strcmp) âãâ ­¥ ¯®¤®©¤ãâ, ¯®â®¬ã çâ®
; ¢ ¯ ¬ï⨠। ªâ®à  ⥪áâ ᮤ¥à¦¨âáï ­¥ ¢ ¢¨¤¥ ascii áâப.
align 4
ted_get_find_rezult:
push eax
mov bh,1
mov esi,edx ;copy edx
@@:
cmp byte[edx],bl
jne .no_text
inc eax ;*** get next symbol (in find text) ***
mov bl,byte[eax]
cmp bl,0
je @f ;end of find text
call ted_iterat_next ;*** get next symbol (in editor text) ***
cmp edx,ted_tex_1
jle @f ;end of editor text
jmp @b
.no_text:
xor bh,bh
mov edx,esi ;restore edx
@@:
pop eax
mov bl,byte[eax] ;restore bl
ret
;input:
; clear_o - ¥á«¨ =1 ®ç¨áâ¨âì ®¤­ã áâபã, =0 ®ç¨áâ¨âì ¢á¥ áâப¨ ®ª­  ¤® ­¨§ã
align 4
proc ted_clear_line_before_draw, edit:dword, coords:dword, clear_o:dword, numb_lin:dword
pushad
mov edi,dword[edit]
mov ebx,dword[coords] ;ebx = x*2^16+y coords to left up point clear line
mov esi,dword[numb_lin] ;esi - number text line
sub ebx,0x10001 ;®â­¨¬ ¥¬ ®âáâã¯ë ¤«ï ¢ëà ¢­¨¢ ­¨ï ¡ãª¢ë ¯® 業âàã
cmp dword[clear_o],0
jne @f
add ebx,ted_rec_h
inc esi
ror ebx,16
xor bx,bx
add ebx,ted_wnd_l
add ebx,ted_rec_l ;bx = ted_wnd_l+ted_rec_l
ror ebx,16
@@:
mov eax,ted_wnd_h
add eax,ted_wnd_t
cmp ax,bx
jl .no_clear
sub ax,bx
mov cx,bx
shl ecx,16
xor bx,bx
add ebx,ted_wnd_w
sub ebx,ted_rec_l
xor cx,cx
add ecx,ted_rec_h
mov edx,ted_color_wnd_work
cmp dword[clear_o],0
je .pusto
cmp ax,cx
jge @f
.pusto:
mov cx,ax
@@:
call ted_is_select
cmp al,0
je @f
cmp ted_seln_y0,esi
jg @f
cmp ted_seln_y1,esi
jl @f
mov edx,ted_color_select ;draw selected line
@@:
mov eax,13 ;rect
int 0x40
call ted_is_select
cmp al,0
je .no_clear
mov al,13 ;rect
xor cx,cx
add ecx,ted_rec_h
cmp ted_seln_y0,esi
jne @f
push bx esi
mov edx,ted_seln_x0 ; ¢¥àå­ïï ¯®«®á  (§ â¨à ¥â á«¥¢ )
mov esi,ted_scr_h
cmp edx,dword[esi+sb_offs_position]
jle .in_wnd
sub edx,dword[esi+sb_offs_position]
imul edx,ted_rec_w
mov bx,dx
jmp .no_wnd
.in_wnd:
mov bx,0
.no_wnd:
mov edx,ted_color_wnd_work
int 0x40
pop esi bx
@@:
cmp ted_seln_y1,esi
jne @f
push esi
mov edx,ted_seln_x1 ; ­¨¦­ïï ¯®«®á  (§ â¨à ¥â á¯à ¢ )
mov esi,ted_scr_h
cmp edx,dword[esi+sb_offs_position]
jle .in_wnd2
sub edx,dword[esi+sb_offs_position]
imul edx,ted_rec_w
sub bx,dx
shl edx,16
add ebx,edx
.in_wnd2:
mov edx,ted_color_wnd_work
int 0x40
pop esi
@@:
.no_clear:
popad
ret
endp
;input:
; edi = pointer to tedit struct
;output:
; ecx = ­®¢ë© 梥â ᨬ¢®« 
; edx = pointer to symbol
; edx = 0 if text not in screen
align 4
ted_get_first_visible_pos:
push eax ecx
mov eax,ted_scr_w
mov edx,ted_tex
xor ecx,ecx
@@:
cmp ecx,dword[eax+sb_offs_position]
je @f
call ted_iterat_next
cmp edx,ted_tex_1
jle @f
cmp byte [edx],13
jne @b
inc ecx
jmp @b
@@:
cmp ecx,dword[eax+sb_offs_position]
je @f
xor edx,edx
@@:
cmp ecx,dword[eax+sb_offs_max_area]
jle @f
mov dword[eax+sb_offs_max_area],ecx
@@:
pop ecx eax
call ted_opt_draw_line_left
ret
;input:
; edx = pointer to symbol
; edi = pointer to tedit struct
;output:
; ecx = 梥â ᨬ¢®« 
; edx = 㪠§ â¥«ì ­  ¯¥à¢ë© «¥¢ë© ᨬ¢®«
;description:
; äã­ªæ¨ï ­ã¦­  ¤«ï ®¯â¨¬¨§ æ¨¨ ¢ë¢®¤  ⥪áâ 
align 4
proc ted_opt_draw_line_left
push ebx
mov ebx,ted_scr_h
mov ebx,dword[ebx+sb_offs_position]
cmp ebx,0
je .ret_f
push eax
mov eax,edx
cmp edx,ted_tex
jne @f
call ted_iterat_next
jmp .beg_cycle
@@:
cmp ebx,0
je @f
cmp byte[edx],13
jne @f
call ted_iterat_next
.beg_cycle:
@@:
cmp edx,ted_tex_1
jle @f
cmp byte[edx],13
je @f
cmp ebx,0
je @f
;--------------------------------------
xor eax,eax ;eax ¡ã¤¥â ¬¥­ïâìáï
mov al,byte[edx+1]
cmp al,0
je .no_color
cmp eax,ted_colors_text_count
jge .no_color
xor ecx,ecx
mov cl,byte[edx+1]
shl cx,2
add ecx,ted_text_colors
mov ecx,dword[ecx]
.no_color:
;--------------------------------------
mov eax,edx
call ted_iterat_next
dec ebx
jmp @b
@@:
mov edx,eax
pop eax
.ret_f:
call ted_get_symb_color
pop ebx
ret
endp
;input:
; edx = pointer to symbol
; edi = pointer to tedit struct
;output:
; ecx = symbol color
; edx = pointer to 13 symbol
;description:
; äã­ªæ¨ï ­ã¦­  ¤«ï ®¯â¨¬¨§ æ¨¨ ¢ë¢®¤  ⥪áâ 
align 4
proc ted_opt_draw_line_right
push eax
mov eax,edx
@@:
cmp edx,ted_tex_1
jle @f
cmp byte[edx],13
je @f
mov eax,edx
call ted_iterat_next
jmp @b
@@:
mov edx,eax ;perv sumbol
call ted_get_symb_color
pop eax
ret
endp
align 4
proc ted_mouse, edit:dword
pushad
mov edi,dword[edit]
;®¡à ¡ â뢠¥¬ áªà®««¨­£¨
mov edx,ted_scr_h
mov ecx,ted_scr_w
cmp word[edx+sb_offs_delta2],0
jne .horizontal
mov eax,dword[ecx+sb_offs_max_area]
cmp eax,dword[ecx+sb_offs_cur_area]
jbe .horizontal
; mouse event for Vertical ScrollBar
stdcall scroll_bar_vertical.mouse,ecx ;[scrollbar_ver_mouse]
cmp dword[ecx+sb_offs_redraw],0
je @f
mov dword[ecx+sb_offs_redraw],0
stdcall ted_draw,edi
jmp .no_in_wnd
@@:
cmp word[ecx+sb_offs_delta2],0
jne .no_in_wnd
.horizontal:
mov eax,dword[edx+sb_offs_max_area]
cmp eax,dword[edx+sb_offs_cur_area]
jbe .other
; mouse event for Horizontal ScrollBar
stdcall scroll_bar_horizontal.mouse,edx ;[scrollbar_hor_mouse]
cmp dword[edx+sb_offs_redraw],0
je .other
mov dword[edx+sb_offs_redraw],0
stdcall ted_draw,edi
jmp .no_in_wnd
.other:
cmp word[ecx+sb_offs_delta2],0
jne .no_in_wnd
cmp word[edx+sb_offs_delta2],0
jne .no_in_wnd
;®¡à ¡ â뢠¥¬ ®ª­® । ªâ®à 
mcall 37,2 ;get mouse buttons
cmp al,1
jne @f
mcall 37,1 ;get mouse coords
mov ebx,ted_wnd_t
add ebx,ted_rec_t
cmp ax,bx
jl @f ;y_mouse<y_wnd
sub ebx,ted_rec_t
add ebx,ted_wnd_h
cmp bx,ax
jl @f ;y_mouse>y_wnd
mov ebx,ted_wnd_l
add ebx,ted_rec_l
mov ecx,eax
shr ecx,16
cmp cx,bx
jl @f ;x_mouse<x_wnd
sub ebx,ted_rec_l
add ebx,ted_wnd_w
cmp bx,cx
jl @f ;x_mouse>x_wnd
call ted_draw_cursor_sumb
call ted_wnd_main_click
jmp .no_in_wnd
@@:
mov edx,ted_el_focus
cmp dword[edx],edi
jne @f
call ted_wnd_main_mouse_scroll ;ᬮâਬ ­  ¯à®ªàãâªã ª®«¥á  ¬ëè¨
@@:
cmp ted_drag_m,0
je .no_in_wnd
mov ted_drag_m,0
stdcall ted_draw,edi
cmp ted_fun_draw_panel_buttons,0
je .no_in_wnd
call ted_fun_draw_panel_buttons
.no_in_wnd:
popad
ret
endp
;input:
; eax -> (x,y)
; edi -> 㪠§ â¥«ì ­  áâàãªâãàã tedit
;description:
; äã­ªæ¨ï ¢ë§ë¢¥âáï ¯à¨ ­ ¦ â¨¨ ª­®¯ª®© ¬ëè¨ ¨ ¯®¯ ¤¥­¨¨ ªãàá®à®¬ ¢ ®ª­® । ªâ®à 
align 4
ted_wnd_main_click:
push ebx ecx edx
mov ebx,ted_el_focus
mov dword[ebx],edi ;áâ ¢¨¬ 䮪ãá
push eax
shr eax,16
and eax,0xffff
sub eax,ted_wnd_l
sub eax,ted_rec_l
xor edx,edx
mov ecx,ted_rec_w
div cx
;inc eax
mov ebx,ted_scr_h
cmp eax,dword[ebx+sb_offs_cur_area]
jle @f
mov eax,dword[ebx+sb_offs_cur_area]
@@:
;dec eax
mov ted_cur_x,eax
pop eax
push eax
and eax,0xffff
sub eax,ted_wnd_t
sub eax,ted_rec_t
xor edx,edx
mov ecx,ted_rec_h
div cx
inc eax
mov ebx,ted_scr_w
cmp eax,dword[ebx+sb_offs_cur_area]
jle @f
mov eax,dword[ebx+sb_offs_cur_area]
@@:
dec eax
mov ted_cur_y,eax
pop eax
cmp ted_drag_m,0
je @f
call ted_sel_move
jmp .sel_move
@@:
mov ted_drag_m,1
call ted_sel_start
.sel_move:
pop edx ecx ebx
ret
;input:
; edi = pointer to tedit struct
align 4
ted_wnd_main_mouse_scroll:
push eax ebx ecx
mcall 37,7 ;¯à®ªàã⪠ ª®«¥á  ¬ëè¨
cmp ax,0
je .no_scroll
mov ecx,ted_scr_w
mov ebx,dword[ecx+sb_offs_position] ;copy old scroll position
and eax,0xffff
btr ax,15
jae @f
or eax,0xffff8000
@@:
add dword[ecx+sb_offs_position],eax
mov eax,[ecx+sb_offs_position]
cmp eax,[ecx+sb_offs_max_area]
jb @f
mov dword[ecx+sb_offs_position],ebx ;if scroll position out of range
jmp .no_scroll
@@:
stdcall ted_draw,edi
.no_scroll:
pop ecx ebx eax
ret
align 4
proc ted_but_save_file, edit:dword, file:dword, f_name:dword
pushad
mov edi,dword[edit]
stdcall ted_can_save,edi
cmp al,0
; je .no_save
mov ecx,ted_max_chars
invoke mem.alloc,ecx
push eax ;§ ¯®¬¨­ ¥¬ 㪠§ â¥«ì ­  ¢ë¤¥«¥­­ãî ¯ ¬ïâì
mov edx,ted_tex
xor ecx,ecx
@@:
call ted_iterat_next
cmp edx,ted_tex_1
jle @f ;edx = ted_tex or edx = ted_tex+sizeof.symbol
mov bl,[edx]
mov byte[eax],bl
inc eax
inc ecx
jmp @b
@@:
cmp ecx,0
je @f
mov ebx,dword[file]
pop eax ;§ ¯¨á뢠¥¬ 㪠§ â¥«ì ­  ¢ë¤¥«¥­­ãî ¯ ¬ïâì
mov dword[ebx+16],eax
push eax ;®¡à â­® § ¯®¬¨­ ¥¬ 㪠§ â¥«ì ­  ¢ë¤¥«¥­­ãî ¯ ¬ïâì
mov eax,70
mov dword[ebx], 2
mov dword[ebx+4], 0
mov dword[ebx+8], 0
mov dword[ebx+12], ecx
mov byte[ebx+20], 0
push dword[f_name]
pop dword[ebx+21]
int 0x40
mov ted_err_save,al
cmp eax,0
je .no_msg
; cmp eax,6
; je @f
cmp ax,10
jl .zifra_0_9
mov al,'?'
sub ax,48
.zifra_0_9:
add ax,48
cmp ted_fun_save_err,0
je @f
call ted_fun_save_err
jmp @f
.no_msg:
m2m ted_tim_ls,ted_tim_ch
@@:
pop ecx ;§ ¯¨á뢠¥¬ 㪠§ â¥«ì ­  ¢ë¤¥«¥­­ãî ¯ ¬ïâì
invoke mem.free,ecx
.no_save:
popad
ret
endp
}