Subversion Repositories Kolibri OS

Compare Revisions

Ignore whitespace Rev 5878 → Rev 5879

/programs/develop/libraries/box_lib/trunk/box_lib.mac
314,6 → 314,7
.on_press dd on_press
}
 
tl_data_info equ dword[edi] ;㪠§ â¥«ì ­  ®á­®¢­ë¥ ¤ ­ë¥
tl_info_size equ word[edi +4] ;à §¬¥à ¤ ­­ëå ¢ë¤¥«ï¥¬ëå ¤«ï ª ¦¤®£® 㧫  (¯®«ì§®¢ â¥«ìá쪨¥ ¤ ­­ë¥ + ⥪áâ ¤«ï ¯®¤¯¨á¨)
tl_info_max_count equ dword[edi+6] ;¬ ªá¨¬ «ì­®¥ ª®«¨ç¥á⢮ 㧫®¢, ª®â®àë¥ ¬®¦­® ¤®¡ ¢¨âì ¢ í«¥¬¥­â
tl_style equ dword[edi+10] ;á⨫¨ í«¥¬¥­â 
/programs/develop/libraries/box_lib/trunk/tree_list.mac
1,6 → 1,6
; ìàêðîñ äëÿ ñèñòåìíîé áèáëèîòåêè box_lib.obj
; ýëåìåíò TreeList äëÿ Kolibri OS
; ôàéë ïîñëåäíèé ðàç èçìåíÿëñÿ 01.12.2010 IgorA
; ôàéë ïîñëåäíèé ðàç èçìåíÿëñÿ 04.11.2015 IgorA
; íà êîä ïðèìåíåíà GPL2 ëèöåíçèÿ
 
 
17,56 → 17,54
 
macro use_tree_list
{
 
;âûäåëíèå ïàìÿòè äëÿ ñòðóêòóð ñïèñêà è îñíîâíîé èíôîðìàöèè (êîíñòðóêòîð)
align 4
tl_data_init: ;âûäåëíèå ïàìÿòè äëÿ ñòðóêòóð ñïèñêà è îñíîâíîé èíôîðìàöèè (êîíñòðóêòîð)
push ebp
mov ebp,esp
push eax ecx edi
mov edi,dword[ebp+8]
proc tl_data_init uses eax ecx edi, tlist:dword
mov edi,dword[tlist]
 
xor ecx,ecx
mov cx,tl_info_size
imul ecx,tl_info_max_count
invoke mem.alloc,ecx
mov dword[edi],eax ;êîïèðóåì óêàçàòåëü íà ïîëó÷åíóþ ïàìÿòü â ñòðóêòóðó
mov tl_data_img,0 ;îáíóëÿåì óêàçàòåëü 'data_img'
mov tl_data_img_sys,0 ;îáíóëÿåì óêàçàòåëü 'data_img_sys'
xor ecx,ecx
mov cx,tl_info_size
imul ecx,tl_info_max_count
invoke mem.alloc,ecx
mov tl_data_info,eax ;êîïèðóåì óêàçàòåëü íà ïîëó÷åíóþ ïàìÿòü â ñòðóêòóðó
mov tl_data_img,0 ;îáíóëÿåì óêàçàòåëü 'data_img'
mov tl_data_img_sys,0 ;îáíóëÿåì óêàçàòåëü 'data_img_sys'
 
mov ecx,sizeof.TreeList
imul ecx,tl_info_max_count
invoke mem.alloc,ecx
mov tl_data_nodes,eax ;êîïèðóåì óêàçàòåëü íà ïîëó÷åíóþ ïàìÿòü â ñòðóêòóðó
mov ecx,sizeof.TreeList
imul ecx,tl_info_max_count
invoke mem.alloc,ecx
mov tl_data_nodes,eax ;êîïèðóåì óêàçàòåëü íà ïîëó÷åíóþ ïàìÿòü â ñòðóêòóðó
 
push dword edi
call tl_info_clear
stdcall tl_info_clear, edi
 
;íàñòðîéêè äî÷åðíåãî ñêðîëëèíãà
cmp tl_p_scrol,0
je @f
mov eax,tl_p_scrol
;*** öâåòîâûå íàñòðîéêè ***
mov ecx,tl_col_bkg
mov dword[eax+sb_offs_bckg_col],ecx
mov ecx,tl_col_zag
mov dword[eax+sb_offs_frnt_col],ecx
mov ecx,tl_col_txt
mov dword[eax+sb_offs_line_col],ecx
;*** íàñòðîéêè ðàçìåðîâ ***
mov ecx,tl_box_left
add ecx,tl_box_width
mov word[eax+2],cx
mov ecx,tl_box_height
mov word[eax+4],cx
mov ecx,tl_box_top
mov word[eax+6],cx
@@:
pop edi ecx eax
pop ebp
ret 4
;íàñòðîéêè äî÷åðíåãî ñêðîëëèíãà
cmp tl_p_scrol,0
je @f
mov eax,tl_p_scrol
;*** öâåòîâûå íàñòðîéêè ***
mov ecx,tl_col_bkg
mov dword[eax+sb_offs_bckg_col],ecx
mov ecx,tl_col_zag
mov dword[eax+sb_offs_frnt_col],ecx
mov ecx,tl_col_txt
mov dword[eax+sb_offs_line_col],ecx
;*** íàñòðîéêè ðàçìåðîâ ***
mov ecx,tl_box_left
add ecx,tl_box_width
mov word[eax+2],cx
mov ecx,tl_box_height
mov word[eax+4],cx
mov ecx,tl_box_top
mov word[eax+6],cx
@@:
ret
endp
 
;î÷èñòêà ïàìÿòè ýëåìåíòà (äåñòðóêòîð)
align 4
proc tl_data_clear, tlist:dword ;î÷èñòêà ïàìÿòè ýëåìåíòà (äåñòðóêòîð)
push edi
proc tl_data_clear uses edi, tlist:dword
;uses eax ???
mov edi,dword[tlist]
cmp tl_data_img,0
je @f
76,328 → 74,285
je @f
invoke mem.free,tl_data_img_sys ;÷èñòêà ñèñòåìíûõ èêîíîê
@@:
invoke mem.free,dword[edi]
 
invoke mem.free,tl_data_info
invoke mem.free,tl_data_nodes
pop edi
ret
endp
 
;î÷èñòêà ñïèñêà (èíôîðìàöèè)
align 4
tl_info_clear: ;î÷èñòêà ñïèñêà (èíôîðìàöèè)
push ebp
mov ebp,esp
push eax ecx edi
mov edi,dword[ebp+8]
mov tl_ch_tim,0
mov dword[edi+34],0 ;ls_tim
mov tl_tim_undo,0
mov tl_cur_pos,0
;xor ecx,ecx
mov ecx,sizeof.TreeList
imul ecx,tl_info_max_count
mov eax,tl_data_nodes
@@:
mov byte[eax],0 ;÷èñòèì óçëû 0-ìè
inc eax
loop @b
mov eax,tl_data_nodes ;óêàçàòåëü íà 0-é óçåë
mov dword[eax+8],1 ;óêàçàòåëü next â 0-ì óçëå ïðèðàâíèâàåì ê 1
proc tl_info_clear uses eax ecx edi, tlist:dword
mov edi,dword[tlist]
mov tl_ch_tim,0
mov dword[edi+34],0 ;ls_tim
mov tl_tim_undo,0
mov tl_cur_pos,0
mov ecx,sizeof.TreeList
imul ecx,tl_info_max_count
mov eax,tl_data_nodes
@@:
mov byte[eax],0 ;÷èñòèì óçëû 0-ìè
inc eax
loop @b
mov eax,tl_data_nodes ;óêàçàòåëü íà 0-é óçåë
mov dword[eax+8],1 ;óêàçàòåëü next â 0-ì óçëå ïðèðàâíèâàåì ê 1
 
cmp tl_p_scrol,0 ;îáðàáîòêà ñêðîëëèíãà
je @f
mov eax,tl_p_scrol
mov dword[eax+sb_offs_position],0
call tb_scrol_resize
@@:
pop edi ecx eax
pop ebp
ret 4
cmp tl_p_scrol,0 ;îáðàáîòêà ñêðîëëèíãà
je @f
mov eax,tl_p_scrol
mov dword[eax+sb_offs_position],0
call tb_scrol_resize
@@:
ret
endp
 
 
;ðåàêöèÿ íà êëàâèàòóðó
align 4
tl_key: ;ðåàêöèÿ íà êëàâèàòóðó
push ebp
mov ebp,esp
push ebx ecx edi
mov edi,dword[ebp+8]
proc tl_key uses ebx ecx edi, tlist:dword
mov edi,dword[tlist]
 
mov ebx,tl_el_focus
cmp dword[ebx],edi
jne .no_focus ;ýëåìåíò íå â ôîêóñå
mov ebx,tl_el_focus
cmp dword[ebx],edi
jne .no_focus ;ýëåìåíò íå â ôîêóñå
 
push eax
mov eax,66
mov ebx,2
int 0x40 ;ïîëó÷èòü ðåæèì ââîäà ñ êëàâèàòóðû
push eax
mcall 66,2 ;ïîëó÷èòü ðåæèì ââîäà ñ êëàâèàòóðû
 
lea ecx,[tl_key_scan]
cmp eax,1 ;1 = ñêàíêîäû
je @f
lea ecx,[tl_key_ascii]
@@:
pop eax
lea ecx,[tl_key_scan]
cmp eax,1 ;1 = ñêàíêîäû
je @f
lea ecx,[tl_key_ascii]
@@:
pop eax
 
xor bx,bx
cmp ah,byte[ecx] ;Enter
jne @f
cmp tl_on_press,0
je @f
call tl_on_press
@@:
cmp ah,byte[ecx+1] ;Space
jne @f
push dword edi
call tl_node_close_open
@@:
cmp ah,byte[ecx+2] ;Up
jne @f
push dword edi
call tl_cur_perv
@@:
cmp ah,byte[ecx+3] ;Down
jne @f
push dword edi
call tl_cur_next
@@:
cmp ah,byte[ecx+7] ;Page Up
jne @f
push dword edi
call tl_cur_page_up
@@:
cmp ah,byte[ecx+8] ;Page Down
jne @f
push dword edi
call tl_cur_page_down
@@:
xor bx,bx
cmp ah,byte[ecx] ;Enter
jne @f
cmp tl_on_press,0
je @f
call tl_on_press
@@:
cmp ah,byte[ecx+1] ;Space
jne @f
stdcall tl_node_close_open, edi
@@:
cmp ah,byte[ecx+2] ;Up
jne @f
stdcall tl_cur_perv, edi
@@:
cmp ah,byte[ecx+3] ;Down
jne @f
stdcall tl_cur_next, edi
@@:
cmp ah,byte[ecx+7] ;Page Up
jne @f
stdcall tl_cur_page_up, edi
@@:
cmp ah,byte[ecx+8] ;Page Down
jne @f
stdcall tl_cur_page_down, edi
@@:
 
bt tl_style,0 ;tl_key_no_edit
jc .no_edit
cmp ah,byte[ecx+4] ;Left
jne @f
push dword edi
call tl_node_lev_dec
mov bx,1
@@:
cmp ah,byte[ecx+5] ;Right
jne @f
push dword edi
call tl_node_lev_inc
mov bx,1
@@:
cmp ah,byte[ecx+6] ;Delete
jne @f
push dword edi
call tl_node_delete
mov bx,1
@@:
.no_edit:
bt tl_style,0 ;tl_key_no_edit
jc .no_edit
cmp ah,byte[ecx+4] ;Left
jne @f
stdcall tl_node_lev_dec, edi
mov bx,1
@@:
cmp ah,byte[ecx+5] ;Right
jne @f
stdcall tl_node_lev_inc, edi
mov bx,1
@@:
cmp ah,byte[ecx+6] ;Delete
jne @f
stdcall tl_node_delete, edi
mov bx,1
@@:
.no_edit:
 
cmp bx,1
jne .no_focus
push dword edi
call tl_draw
.no_focus:
cmp bx,1
jne .no_focus
stdcall tl_draw, edi
.no_focus:
ret
endp
 
pop edi ecx ebx
pop ebp
ret 4
 
;ðåàêöèÿ íà ìûøü
align 4
tl_mouse: ;ðåàêöèÿ íà ìûøü
push ebp
mov ebp,esp
pushad
mov edi,dword[ebp+8]
proc tl_mouse, tlist:dword
pushad
mov edi,dword[tlist]
 
mov eax,37
mov ebx,1
int 0x40
mcall 37,1 ;êîîðäèíàòû ìûøè îòíîñèòåëüíî îêíà
 
mov ebx,tl_box_left
shl ebx,16
cmp eax,ebx ;ëåâàÿ ãðàíèöà îêíà
jl .no_in_wnd ;.test_scroll
mov ebx,tl_box_left
shl ebx,16
cmp eax,ebx ;ëåâàÿ ãðàíèöà îêíà
jl .no_in_wnd ;.test_scroll íå ïðèìåíÿåì
 
mov ebx,tl_box_left
add ebx,tl_box_width
shl ebx,16
cmp eax,ebx ;ïðàâàÿ ãðàíèöà îêíà
jg .test_scroll
shr ebx,16
add ebx,tl_box_width
shl ebx,16
cmp eax,ebx ;ïðàâàÿ ãðàíèöà îêíà
jg .test_scroll
 
mov ebx,tl_box_top
add ebx,tl_box_height
cmp ax,bx ;íèæíÿÿ ãðàíèöà îêíà
jg .test_scroll
mov ebx,tl_box_top
add ebx,tl_box_height
cmp ax,bx ;íèæíÿÿ ãðàíèöà îêíà
jg .test_scroll
 
sub ebx,tl_box_height
add bx,tl_capt_cy
cmp ax,bx ;âåðõíÿÿ ãðàíèöà îêíà + âûñîòà ïîäïèñè
jl .test_scroll
sub ebx,tl_box_height
add bx,tl_capt_cy
cmp ax,bx ;âåðõíÿÿ ãðàíèöà îêíà + âûñîòà ïîäïèñè
jl .test_scroll
 
push eax ebx
mov eax,37
mov ebx,2
int 0x40
push eax ebx
mcall 37,2
 
bt eax,0 ;left mouse button press
pop ebx eax
jae .no_draw
bt eax,0 ;left mouse button press
pop ebx eax
jae .no_draw
 
mov esi,tl_el_focus
mov dword[esi],edi ;set focus
 
mov esi,tl_el_focus
mov dword[esi],edi ;set focus
; if '+' or '-' press
mov esi,eax
shr esi,16
sub esi,tl_box_left ;esi = mouse x coord in element window
 
; if '+' or '-' press
mov esi,eax
shr esi,16
sub esi,tl_box_left ;esi = mouse x coord in element window
and eax,0xffff
sub ax,bx
xor edx,edx
xor ecx,ecx
mov cx,tl_img_cy
div ecx
cmp tl_p_scrol,0 ;ó÷èòûâàåì ñêðîëëèíã
je @f
mov edx,tl_p_scrol
add eax,dword[edx+sb_offs_position] ;äîáàâëÿåì ñêðîëëèíã íà âåðõó
@@:
 
and eax,0xffff
sub ax,bx
xor edx,edx
xor ecx,ecx
mov cx,tl_img_cy
div ecx
cmp tl_p_scrol,0 ;ó÷èòûâàåì ñêðîëëèíã
je @f
mov edx,tl_p_scrol
add eax,dword[edx+24] ;äîáàâëÿåì ñêðîëëèíã íà âåðõó
@@:
mov ecx,eax
call tl_get_node_count ;eax = node count
cmp eax,ecx
jl @f
mov eax,ecx ;åñëè êóðñîð íå âûøåë çà ïðåäåëû óçëîâ, âîññòàíàâëèâàåì ñòàðîå çíà÷åíèå eax
@@:
 
mov ecx,eax
call tl_get_node_count ;eax = node count
cmp eax,ecx
jl @f
mov eax,ecx ;åñëè êóðñîð íå âûøåë çà ïðåäåëû óçëîâ, âîññòàíàâëèâàåì ñòàðîå çíà÷åíèå eax
@@:
cmp eax,tl_cur_pos ;åñëè íîâîå çíà÷åíèå êóðñîðà ñîâïàëî ñ ïðåäûäóùèì
je @f ;òî íå ñòèðàåì êóðñîð
push esi
mov esi,tl_box_top
add esi,tl_box_height ;esi = coord bottom border
call tl_draw_null_cursor ;ñòèðàåì êóðñîð
pop esi
@@:
 
cmp eax,tl_cur_pos ;åñëè íîâîå çíà÷åíèå êóðñîðà ñîâïàëî ñ ïðåäûäóùèì
je @f ;òî íå ñòèðàåì êóðñîð
push esi
mov esi,tl_box_top
add esi,tl_box_height ;esi = coord bottom border
call tl_draw_null_cursor ;ñòèðàåì êóðñîð
pop esi
@@:
mov tl_cur_pos,eax
 
mov tl_cur_pos,eax
; if '+' or '-' press
call tl_get_cur_node_index ;eax = node index
cmp eax,2
jl .no_open_close ;êóðñîð ñòîèò íà ïóñòîì ìåñòå, áåç óçëîâ
imul eax,sizeof.TreeList
add eax,tl_data_nodes
xor bx,bx
mov bl,byte[eax+2] ;+2 lev ñîõðàíÿåì óðîâåíü òåêóùåãî óçëà
inc bx ;+ ïîëå äëÿ êóðñîðà
 
; if '+' or '-' press
call tl_get_cur_node_index ;eax = node index
cmp eax,2
jl .no_open_close ;êóðñîð ñòîèò íà ïóñòîì ìåñòå, áåç óçëîâ
imul eax,sizeof.TreeList
add eax,tl_data_nodes
xor bx,bx
mov bl,byte[eax+2] ;+2 lev ñîõðàíÿåì óðîâåíü òåêóùåãî óçëà
inc bx ;+ ïîëå äëÿ êóðñîðà
cmp si,tl_img_cx
jl .no_open_close ;ìûøåé ïîïàëè íà ëåâîå ïîëå äëÿ êóðñîðà, ãäå òî÷íî íåò '+' è '-'
mov eax,esi
xor edx,edx
xor ecx,ecx
mov cx,tl_img_cx
div ecx
 
cmp si,tl_img_cx
jl .no_open_close ;ìûøåé ïîïàëè íà ëåâîå ïîëå äëÿ êóðñîðà, ãäå òî÷íî íåò '+' è '-'
mov eax,esi
xor edx,edx
xor ecx,ecx
mov cx,tl_img_cx
div ecx
cmp ax,bx
jne .no_open_close
 
cmp ax,bx
jne .no_open_close
stdcall tl_node_close_open, edi
.no_open_close:
 
push dword edi
call tl_node_close_open
.no_open_close:
 
mov esi,tl_box_top
add esi,tl_box_height ;esi = coord bottom border
call tl_draw_cursor ;ïåðåðèñîâêà êóðñîðà
call tl_draw_caption_cur_pos
jmp .no_draw
mov esi,tl_box_top
add esi,tl_box_height ;esi = coord bottom border
call tl_draw_cursor ;ïåðåðèñîâêà êóðñîðà
call tl_draw_caption_cur_pos
jmp .no_draw
;--- mouse event for children scrollbar ----------------------------------------
.test_scroll:
mov edx,tl_p_scrol
cmp edx,0
je .no_in_wnd ;ïîëüçîâàòåëü íå ñîçäàë äî÷åðíåãî ñêðîëëèíãà
shr ebx,16
add bx,word[edx] ;+0 .size_x
shl ebx,16
cmp eax,ebx ;ïðàâàÿ ãðàíèöà îêíà
jg .no_in_wnd
mov edx,tl_p_scrol
cmp edx,0
je .no_in_wnd ;ïîëüçîâàòåëü íå ñîçäàë äî÷åðíåãî ñêðîëëèíãà
shr ebx,16
add bx,word[edx] ;+0 .size_x
shl ebx,16
cmp eax,ebx ;ïðàâàÿ ãðàíèöà îêíà
jg .no_in_wnd
 
mov eax,dword[edx+sb_offs_max_area]
cmp eax,dword[edx+sb_offs_cur_area]
jbe .no_in_wnd ;âñå óçëû ïîïàäàþò â îêíî ñêðîëëèíãà
push dword edx
call scroll_bar_vertical.mouse ;scrollbar_ver_mouse
mov eax,dword[edx+sb_offs_max_area]
cmp eax,dword[edx+sb_offs_cur_area]
jbe .no_in_wnd ;âñå óçëû ïîïàäàþò â îêíî ñêðîëëèíãà
stdcall scroll_bar_vertical.mouse, edx ;scrollbar_ver_mouse
 
cmp dword[edx+sb_offs_redraw],0
je @f
mov dword[edx+sb_offs_redraw],0
push dword edi
call tl_draw ;ïðîèçîøëè èçìåíåíèÿ ñêðîëëèíãà
@@:
cmp dword[edx+sb_offs_delta2],0
jne .no_draw ;ïîïàëè íà ñêðîëëèíã - íå ñíèìàåì ôîêóñ ñ TreeList
cmp dword[edx+sb_offs_redraw],0
je @f
mov dword[edx+sb_offs_redraw],0
stdcall tl_draw, edi ;ïðîèçîøëè èçìåíåíèÿ ñêðîëëèíãà
@@:
cmp dword[edx+sb_offs_delta2],0
jne .no_draw ;ïîïàëè íà ñêðîëëèíã - íå ñíèìàåì ôîêóñ ñ TreeList
;-------------------------------------------------------------------------------
.no_in_wnd: ;íå ïîïàëè â îêíî - ïîòåðÿ ôîêóñà (ïðè óñëîâèè ÷òî ôîêóñ áûë íà äàííîì ýåëåìåíòå)
mov eax,37 ;ïðîâåðÿåì íàæàòîñòü ëþáûõ êíîïîê
mov ebx,2
int 0x40
cmp eax,0 ;íè÷å íå íàæàëè eax=0
je .no_draw
.no_in_wnd: ;íå ïîïàëè â îêíî - ïîòåðÿ ôîêóñà (ïðè óñëîâèè ÷òî ôîêóñ áûë íà äàííîì ýåëåìåíòå)
mcall 37,2 ;ïðîâåðÿåì íàæàòîñòü ëþáûõ êíîïîê
cmp eax,0 ;íè÷åãî íå íàæàëè eax=0
je .no_draw
 
mov ebx,tl_el_focus
cmp dword[ebx],edi
jne .no_draw ;ýëåìåíò íå â ôîêóñå
mov dword[ebx],0 ;reset focus
mov esi,tl_box_top
add esi,tl_box_height ;esi = coord bottom border
call tl_draw_cursor ;ðèñóåì êóðñîð ñ ïîòåðÿíûì ôîêóñîì
.no_draw:
mov ebx,tl_el_focus
cmp dword[ebx],edi
jne .no_draw ;ýëåìåíò íå â ôîêóñå
mov dword[ebx],0 ;reset focus
mov esi,tl_box_top
add esi,tl_box_height ;esi = coord bottom border
call tl_draw_cursor ;ðèñóåì êóðñîð ñ ïîòåðÿíûì ôîêóñîì
.no_draw:
 
popad
pop ebp
ret 4
popad
ret
endp
 
;îòìåíà äåéñòâèÿ
align 4
tl_info_undo: ;îòìåíà äåéñòâèÿ
push ebp
mov ebp,esp
push eax edi
mov edi,dword[ebp+8]
mov eax,tl_tim_undo
cmp tl_ch_tim,eax
jbe @f
inc tl_tim_undo
call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
@@:
pop edi eax
pop ebp
ret 4
proc tl_info_undo uses eax edi, tlist:dword
mov edi,dword[tlist]
mov eax,tl_tim_undo
cmp tl_ch_tim,eax
jbe @f
inc tl_tim_undo
call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
@@:
ret
endp
 
;ïîâòîð äåéñòâèÿ
align 4
tl_info_redo: ;ïîâòîð äåéñòâèÿ
push ebp
mov ebp,esp
push edi
mov edi,dword[ebp+8]
cmp tl_tim_undo,1
jl @f
dec tl_tim_undo
call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
@@:
pop edi
pop ebp
ret 4
proc tl_info_redo uses edi, tlist:dword
mov edi,dword[tlist]
cmp tl_tim_undo,1
jl @f
dec tl_tim_undo
call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
@@:
ret
endp
 
;óäàëåíèå îòìåíåííûõ äåéñòâèé
;âíóòðåííÿÿ ôóíêöèÿ, íå äëÿ ýêñïîðòà
align 4
tl_info_set_undo: ;óäàëåíèå îòìåíåííûõ äåéñòâèé
; push ebp
; mov ebp,esp
; push edi
; mov edi,dword[ebp+8]
 
; mov [dragk],0 ;çàêàí÷èâàåì âûäåëåíèå îò êëàâèàòóðû
tl_info_set_undo:
cmp tl_tim_undo,1
jl .no_work
 
454,18 → 409,14
pop edx ecx ebx eax
.no_work:
 
; pop edi
; pop ebp
; ret 4
ret
 
;âûâîä ñïèñêà íà ýêðàí
align 4
tl_draw: ;âûâîä ñïèñêà íà ýêðàí
push ebp
mov ebp,esp
proc tl_draw, tlist:dword
pushad
;draw dir_list main rect
mov edi,dword[ebp+8]
mov edi,dword[tlist]
mov ebx,tl_box_left
shl ebx,16
add ebx,tl_box_width
473,8 → 424,7
shl ecx,16
mov cx,tl_capt_cy
mov edx,tl_col_zag
mov eax,13
int 0x40 ;draw window caption
mcall 13 ;draw window caption
 
add ecx,tl_box_top
shl ecx,16
505,7 → 455,7
add ebx,5*65536+3
add ebx,tl_box_top
mov ecx,tl_col_txt
or ecx,0x80000000
or ecx,0x80000000
lea edx,[txt_capt_cur]
int 0x40
 
527,7 → 477,7
cmp tl_p_scrol,0 ;åñëè åñòü óêàçàòåëü íà ñêðîëëèíã
je .end_c1
mov esi,tl_p_scrol
cmp dword[esi+24],0 ;åñëè ñêðîëëèíã íà âåðõó, âûõîäèì
cmp dword[esi+sb_offs_position],0 ;åñëè ñêðîëëèíã íà âåðõó, âûõîäèì
je .end_c1
@@:
call tl_iterat_next
534,7 → 484,7
cmp edx,ecx
jle .end_draw
inc eax
cmp eax,dword[esi+24]
cmp eax,dword[esi+sb_offs_position]
jge .end_c1
jmp @b
.end_c1:
556,14 → 506,14
mov edi,tl_p_scrol ;ðèñóåì äî÷åðíèé ñêðîëëèíã
cmp edi,0 ;äëÿ òîãî ÷òî-áû åãî íå ïðèøëîñü ðèñîâàòü â ïîëüçîâàòåëüñêîé ïðîãðàììå
je .end_draw ;åñëè íåò ñêðîëëèíãà âûõîäèì
push dword edi
call scroll_bar_vertical.draw
stdcall scroll_bar_vertical.draw, edi
 
.end_draw:
popad
pop ebp
ret 4
ret
endp
 
;ïåðåõîä íà ñëåäóùèé âèäèìûé óçåë (ïðîïóñêàÿ çàêðûòûå)
;input:
; ecx = pointer to 1 node struct
; edx = pointer to some node struct
571,7 → 521,7
;output:
; edx = pointer to next node struct
align 4
tl_iterat_next: ;ïåðåõîä íà ñëåäóùèé âèäèìûé óçåë (ïðîïóñêàÿ çàêðûòûå)
tl_iterat_next:
push bx
mov bl,0x7f
cmp byte[edx+3],1
609,12 → 559,15
pop bx
ret
 
;ïåðåõîä íà ñëåäóùèé âèäèìûé óçåë (è íà çàêðûòûå òîæå)
;input:
; ecx = pointer to 1 node struct
; edx = pointer to some node struct
; edi = pointer to 'TreeList' struct
;output:
; edx = pointer to next visible node struct
align 4
tl_iterat_next_all: ;ïåðåõîä íà ñëåäóùèé âèäèìûé óçåë (è íà çàêðûòûå òîæå)
tl_iterat_next_all:
cmp tl_tim_undo,0
je .else
 
638,12 → 591,13
.endif:
ret
 
;ïåðåõîä íà ïðåäûäóùèé âèäèìûé óçåë (ïðîïóñêàÿ çàêðûòûå)
;input:
; ecx = pointer to 1 node struct
; edx = pointer to some node struct
; edi = pointer to 'TreeList' struct
align 4
tl_iterat_perv: ;ïåðåõîä íà ïðåäûäóùèé âèäèìûé óçåë (ïðîïóñêàÿ çàêðûòûå)
tl_iterat_perv:
push eax
cmp tl_tim_undo,0
je .beg1
668,7 → 622,7
pop eax
ret
 
 
;íàõîäèò ðîäèòåëüñêèé çàêðûòûé óçåë ìàêñèìàëüíîãî óðîâíÿ
;input:
; edx = pointer to some node struct
; edi = pointer to 'TreeList' struct
675,8 → 629,7
;output:
; edx = pointer closed parent node with maximum level
align 4
tl_move_max_clo_par: ;íàõîäèò ðîäèòåëüñêèé çàêðûòûé óçåë ìàêñèìàëüíîãî óðîâíÿ
push eax ebx
proc tl_move_max_clo_par uses eax ebx
mov eax,edx
xor ebx,ebx
.beg:
691,8 → 644,8
jmp .beg
.end_f:
mov edx,eax
pop ebx eax
ret
endp
 
;input:
; edx = pointer to some node struct
718,6 → 671,7
add edx,tl_data_nodes
ret
 
;ïåðåäâèãàåìñÿ íà ðîäèòåëüñêèé óçåë, åñëè òàêîãî íåò, òî îñòàâëÿåì ñòàðîå çíà÷åíèå óêàçàòåëÿ
;input:
; ecx =
; edx = pointer to some node struct
725,29 → 679,30
;output:
; edx = pointer to parent node struct
align 4
tl_move_par: ;ïåðåäâèãàåìñÿ íà ðîäèòåëüñêèé óçåë, åñëè òàêîãî íåò, òî îñòàâëÿåì ñòàðîå çíà÷åíèå óêàçàòåëÿ
cmp byte[edx+2],0
je .end_f ;óçåë 0-ãî óðîâíÿ íå ìîæåò áûòü äî÷åðíèì
push eax ebx esi
mov esi,edx ;copy node pointer (edx)
mov bl,byte[edx+2]
@@:
call tl_move_perv
cmp edx,ecx
jle @f ;âñå âûøå ñòîÿùèå óçëû íå ðîäèòåëüñêèå
call tl_node_not_vis ;ïðîïóñê óäàëåííûõ è îòìåíåííûõ
cmp al,1
je @b
cmp byte[edx+2],bl
jl .end_0 ;óäà÷íî íàøëè ðîäèòåëüñêèé óçåë
jmp @b
@@:
mov esi,ebx ;restore node pointer
.end_0:
pop esi ebx eax
.end_f:
ret
tl_move_par:
cmp byte[edx+2],0
je .end_f ;óçåë 0-ãî óðîâíÿ íå ìîæåò áûòü äî÷åðíèì
push eax ebx esi
mov esi,edx ;copy node pointer (edx)
mov bl,byte[edx+2]
@@:
call tl_move_perv
cmp edx,ecx
jle @f ;âñå âûøå ñòîÿùèå óçëû íå ðîäèòåëüñêèå
call tl_node_not_vis ;ïðîïóñê óäàëåííûõ è îòìåíåííûõ
cmp al,1
je @b
cmp byte[edx+2],bl
jl .end_0 ;óäà÷íî íàøëè ðîäèòåëüñêèé óçåë
jmp @b
@@:
mov esi,ebx ;restore node pointer
.end_0:
pop esi ebx eax
.end_f:
ret
 
;ïðîâåðÿåò âèäèìûé ëè óêàçàííûé óçåë ñ ó÷åòîì: äîáàâëåíèé, óäàëåíèé, îòìåí äåéñòâèé
;input:
; edx = pointer to symbol struct
; edi = pointer to 'TreeList' struct
755,7 → 710,7
; al = 1 if sumbol not visible
; (node[i].td+tim_Undo<=ch_tim && node[i].td) || (node[i].tc>ch_tim-tim_Undo)
align 4
tl_node_not_vis: ;ïðîâåðÿåò âèäèìûé ëè óêàçàííûé óçåë ñ ó÷åòîì: äîáàâëåíèé, óäàëåíèé, îòìåí äåéñòâèé
tl_node_not_vis:
cmp dword[edx+16],0
je @f
mov eax,dword[edx+16] ;eax=node[i].td
776,91 → 731,89
xor al,al
ret
 
 
;ðèñóåì êóðñîð íà ýêðàíå
;input:
; edi = pointer to TreeInfo struct
; esi = coord bottom border
align 4
tl_draw_cursor: ;ðèñóåì êóðñîð íà ýêðàíå
push eax ebx ecx edx esi
call tl_get_display_cur_pos ;eax = cursor pos in screen
cmp eax,0
jl .end_f ;êóðñîð íàõîäèòñÿ âûøå îêíà, â îáëàñòè ïðîêðó÷åííîé ñêðîëëèíãîì
proc tl_draw_cursor uses eax ebx ecx edx esi
call tl_get_display_cur_pos ;eax = cursor pos in screen
cmp eax,0
jl .end_f ;êóðñîð íàõîäèòñÿ âûøå îêíà, â îáëàñòè ïðîêðó÷åííîé ñêðîëëèíãîì
 
cmp tl_data_img_sys,0 ;ñìîòðèì åñòü ëè óêàçàòåëü íà êàðòèíêó ñèñòåìíûõ èêîíîê
jne @f
mov ebx,tl_box_left
shl ebx,16
mov bx,tl_img_cx
xor ecx,ecx
mov cx,tl_img_cy
imul ecx,eax
add ecx,tl_box_top
add cx,tl_capt_cy
cmp tl_data_img_sys,0 ;ñìîòðèì åñòü ëè óêàçàòåëü íà êàðòèíêó ñèñòåìíûõ èêîíîê
jne @f
mov ebx,tl_box_left
shl ebx,16
mov bx,tl_img_cx
xor ecx,ecx
mov cx,tl_img_cy
imul ecx,eax
add ecx,tl_box_top
add cx,tl_capt_cy
 
;crop image if on the border
cmp esi,ecx ;åñëè êóðñîð âíèçó è åãî âîîáùå íå âèäíî
jl .end_f
;crop image if on the border
cmp esi,ecx ;åñëè êóðñîð âíèçó è åãî âîîáùå íå âèäíî
jl .end_f
 
sub esi,ecx
shl ecx,16
mov cx,tl_img_cy
cmp si,tl_img_cy
jge .crop0
mov cx,si ;åñëè êóðñîð âèäåí ÷àñòè÷íî (ïîïàë íà íèæíþþ ãðàíèöó)
.crop0:
sub esi,ecx
shl ecx,16
mov cx,tl_img_cy
cmp si,tl_img_cy
jge .crop0
mov cx,si ;åñëè êóðñîð âèäåí ÷àñòè÷íî (ïîïàë íà íèæíþþ ãðàíèöó)
.crop0:
 
mov edx,tl_col_txt
mov eax,13
int 0x40 ;ðèñóåì ïðîñòîé ïðÿìîóãîëüíèê, ò.ê. íåò ñèñòåìíûõ èêîíîê
jmp .end_f
@@:
mov ebx,tl_data_img_sys
imul ax,tl_img_cy
mov edx,tl_box_left
shl edx,16
mov dx,ax
add edx,tl_box_top
add dx,tl_capt_cy
mov edx,tl_col_txt
mcall 13 ;ðèñóåì ïðîñòîé ïðÿìîóãîëüíèê, ò.ê. íåò ñèñòåìíûõ èêîíîê
jmp .end_f
@@:
mov ebx,tl_data_img_sys
imul ax,tl_img_cy
mov edx,tl_box_left
shl edx,16
mov dx,ax
add edx,tl_box_top
add dx,tl_capt_cy
 
mov ecx,tl_el_focus ;ïðîâåðÿåì â ôîêóñå ýëåìåíò èëè íåò
cmp dword[ecx],edi
je .focus
xor eax,eax
xor ecx,ecx
mov cx,tl_img_cx
mov ax,tl_img_cy
imul eax,ecx
imul eax,4*3 ;4=icon index 3=rgb
add ebx,eax
.focus:
mov ecx,tl_el_focus ;ïðîâåðÿåì â ôîêóñå ýëåìåíò èëè íåò
cmp dword[ecx],edi
je .focus
;åñëè íå â ôîêóñå ñäâèãàåì êîîðäèíàòû íà èêîíêó íå àêòèâíîãî êóðñîðà
xor eax,eax
xor ecx,ecx
mov cx,tl_img_cx
mov ax,tl_img_cy
imul eax,ecx
imul eax,4*3 ;4=icon index 3=rgb
add ebx,eax
.focus:
 
mov cx,tl_img_cx
shl ecx,16
mov cx,tl_img_cy
mov cx,tl_img_cx
shl ecx,16
mov cx,tl_img_cy
 
;crop image if on the border
cmp si,dx ;åñëè êóðñîð âíèçó è åãî âîîáùå íå âèäíî
jl .end_f
;crop image if on the border
cmp si,dx ;åñëè êóðñîð âíèçó è åãî âîîáùå íå âèäíî
jl .end_f
 
sub si,dx
cmp si,tl_img_cy
jge .crop1
mov cx,si ;åñëè êóðñîð âèäåí ÷àñòè÷íî (ïîïàë íà íèæíþþ ãðàíèöó)
.crop1:
sub si,dx
cmp si,tl_img_cy
jge .crop1
mov cx,si ;åñëè êóðñîð âèäåí ÷àñòè÷íî (ïîïàë íà íèæíþþ ãðàíèöó)
.crop1:
 
mov eax,7
int 0x40 ;ðèñóåì èêîíêó êóðñîðà
.end_f:
pop esi edx ecx ebx eax
ret
mcall 7 ;ðèñóåì èêîíêó êóðñîðà
.end_f:
ret
endp
 
;ñòèðàåì êóðñîð íà ýêðàíå
;input:
; edi = pointer to TreeInfo struct
; esi = coord bottom border
align 4
tl_draw_null_cursor: ;ñòèðàåì êóðñîð íà ýêðàíå
push eax ebx ecx edx esi
proc tl_draw_null_cursor uses eax ebx ecx edx esi
call tl_get_display_cur_pos ;eax = cursor pos in screen
cmp eax,0
jl .end_f ;êóðñîð íàõîäèòñÿ âûøå îêíà, â îáëàñòè ïðîêðó÷åííîé ñêðîëëèíãîì
887,30 → 840,31
@@:
 
mov edx,tl_col_bkg
mov eax,13
int 0x40 ;ðèñóåì ïðîñòîé ïðÿìîóãîëüíèê ñ ôîíîâûì öâåòîì
mcall 13 ;ðèñóåì ïðîñòîé ïðÿìîóãîëüíèê ñ ôîíîâûì öâåòîì
 
.end_f:
pop esi edx ecx ebx eax
ret
endp
 
;áåðåò ïîçèöèþ êóðñîðà, îòíîñèòåëüíî ýêðàíà
;input:
; edi = pointer to TreeInfo struct
;output:
; eax = index
align 4
tl_get_display_cur_pos: ;áåðåò ïîçèöèþ êóðñîðà, îòíîñèòåëüíî ýêðàíà
tl_get_display_cur_pos:
mov eax,tl_cur_pos
cmp tl_p_scrol,0
je @f
push ebx
mov ebx,tl_p_scrol
mov ebx,dword[ebx+24]
mov ebx,dword[ebx+sb_offs_position]
sub eax,ebx ;îòíèìàåì ïîçèöèþ ñêðîëëèíãà
pop ebx
@@:
ret
 
;ðèñóåò óçåë ñ: êàðòèíêîé, ïîäïèñüþ, èêîíêîé îòêðûòèÿ/çàêðûòèÿ è ëèíèÿìè ê ðîäèò. óçëó
;input:
; eax = node position
; edx = pointer to some node struct
917,9 → 871,7
; edi = pointer to 'TreeList' struct
; esi = coord of bottom border
align 4
tl_draw_node: ;ðèñóåò óçåë ñ: êàðòèíêîé, ïîäïèñüþ, èêîíêîé îòêðûòèÿ/çàêðûòèÿ è ëèíèÿìè ê ðîäèò. óçëó
push eax ebx ecx edx esi
 
proc tl_draw_node uses eax ebx ecx edx esi
mov ebx,1 ;1 - ìåñòî ïîä êóðñîð
bt tl_style,2 ;tl_list_box_mode
jc @f
957,8 → 909,7
jne .draw_img_n
push edx
mov edx,tl_col_txt
mov eax,13
int 0x40 ;draw node rect
mcall 13 ;draw node rect
pop edx
jmp @f
.draw_img_n:
976,8 → 927,7
imul ebx,esi ;esi = icon index
add ebx,tl_data_img
 
mov eax,7
int 0x40 ;draw node icon '-'
mcall 7 ;draw node icon '-'
pop esi edx ebx
@@:
 
997,16 → 947,17
call tl_draw_node_icon_par_lin ;ðèñîâàíèå ëèíèè ê ðîäèòåëüñêîìó ýëåìåíòó
call tl_draw_node_icon_par_lin_up ;ðèñîâàíèå âåðòèêàëüíîé ëèíèè ê ðîäèòåëüñêîìó ýëåìåíòó
.end_draw:
pop esi edx ecx ebx eax
ret
endp
 
;ðèñóåò èêîíêè îòêðûòîãî èëè çàêðûòîãî óçëà (îáû÷íî + èëè -)
;input:
; al = óðîâåíü ýëåìåíòà
; ecx = pointer to 1 node struct
; edx = pointer to some node struct
;...
align 4
tl_draw_node_icon_opn_clo: ;ðèñóåò èêîíêè îòêðûòîãî èëè çàêðûòîãî óçëà (îáû÷íî + èëè -)
push eax ebx ecx edx esi
proc tl_draw_node_icon_opn_clo uses eax ebx ecx edx esi
inc al
call tl_iterat_next_all ;get next visible item
cmp edx,ecx
1020,8 → 971,7
cmp tl_data_img_sys,0
jne .draw_img_s
mov edx,tl_col_txt
mov eax,13
int 0x40 ;draw minus rect, if not system icons
mcall 13 ;draw minus rect, if not system icons
jmp @f
.draw_img_s:
mov ecx,esi ;load ecx
1037,12 → 987,12
and eax,0xff
imul ebx,eax ;eax = icon index
add ebx,tl_data_img_sys
mov eax,7
int 0x40 ;draw minus icon '-'
mcall 7 ;draw minus icon '-'
@@:
pop esi edx ecx ebx eax
ret
endp
 
;ðèñîâàíèå ëèíèè ê ðîäèòåëüñêîìó ýëåìåíòó
;input:
; al = óðîâåíü ýëåìåíòà
; ecx = pointer to 1 node struct
1049,7 → 999,7
; edx = pointer to some node struct
;...
align 4
tl_draw_node_icon_par_lin: ;ðèñîâàíèå ëèíèè ê ðîäèòåëüñêîìó ýëåìåíòó
tl_draw_node_icon_par_lin:
cmp byte[edx+3],1
je .close
push eax ebx ecx edx esi
1076,8 → 1026,7
cmp tl_data_img_sys,0
jne .draw_img_s
mov edx,tl_col_txt
mov eax,13
int 0x40 ;draw minus rect, if not system icons
mcall 13 ;draw minus rect, if not system icons
jmp @f
.draw_img_s:
; mov ecx,esi ;load ecx
1094,8 → 1043,7
; and eax,0xff
imul ebx,eax ;eax = icon index
add ebx,tl_data_img_sys
mov eax,7
int 0x40 ;draw line icon
mcall 7 ;draw line icon
@@:
pop esi edx ecx ebx eax
.close:
1204,7 → 1152,7
imul esi,eax
pop eax
add si,tl_info_capt_offs
add esi,dword[edi]
add esi,tl_data_info
mov edx,esi
 
shr ebx,16
1221,8 → 1169,7
mov ecx,tl_col_txt
and ecx,0xffffff
; or ecx,0x80000000 ;text is ASCIIZ
mov eax,4
int 0x40
mcall 4
@@:
pop esi edx ecx ebx
ret
1272,16 → 1219,14
sub eax,esi
ret
 
;äîáàâèòü óçåë
;input:
;dword[ebp+ 8] - pointer to node info
;dword[ebp+12] - options
;dword[ebp+16] - pointer to 'TreeList' struct
; tlist - óêàçàòåëü íà ñòðóêòóðó ëèñòà
; n_opt - îïöèè äîáàâëåíèÿ
; n_info - óêàçàòåëü íà äîáàâëÿåìûå äàííûå
align 4
tl_node_add: ;äîáàâèòü óçåë
push ebp
mov ebp,esp
push eax ebx ecx edx edi
mov edi,dword[ebp+16]
proc tl_node_add uses eax ebx ecx edx edi, n_info:dword, n_opt:dword, tlist:dword
mov edi,dword[tlist]
 
call tl_info_set_undo
 
1306,14 → 1251,16
jne .u0
 
inc tl_ch_tim
mov cx,word[ebp+14] ;get type
mov ecx,dword[n_opt]
ror ecx,16 ;cx = type
mov word[edx],cx
mov cl,byte[ebp+13]
;;;mov cl,byte[ebp+13]
rol ecx,8 ;cl = close|open
mov byte[edx+3],cl ;node[i].clo
mov byte[edx+2], 0 ;node[i].lev=0
bt tl_style,2 ;tl_list_box_mode
jc .l_box_m
mov cl,byte[ebp+12]
mov cl,byte[n_opt]
mov byte[edx+2],cl ;node[i].lev
.l_box_m:
push tl_ch_tim ;node[i].tc=ch_tim;
1329,13 → 1276,13
call tl_get_node_index ;eax = node index
imul esi,eax
pop eax
add esi,dword[edi]
mov edi,dword[ebp+8] ;pointer to node data
add esi,tl_data_info
mov edi,dword[n_info] ;pointer to node data
xchg edi,esi
rep movsb
 
mov esi,edi
mov edi,dword[ebp+16] ;restore edi
mov edi,dword[tlist] ;restore edi
mov cx,tl_info_capt_offs
cmp cx,tl_info_size
jge .no_text_data
1376,16 → 1323,14
cmp edx,ebx ;enf of node memory ?
jle @b
@@:
pop edi edx ecx ebx eax
pop ebp
ret 12
ret
endp
 
;input:
; edi = pointer to TreeInfo struct
align 4
tb_scrol_resize:
push eax ecx edx
cmp tl_p_scrol,0 ;îáðàáîòêà ñêðîëëèíãà
proc tb_scrol_resize uses eax ecx edx
cmp tl_p_scrol,0 ;îáðàáîòêà ñêðîëëèíãà
je @f
call tl_get_node_count ;eax = node count
mov ecx,eax
1398,21 → 1343,16
mov edx,tl_p_scrol
mov dword[edx+sb_offs_cur_area],eax
mov dword[edx+sb_offs_max_area],ecx
push dword edx ;pointer to scroll struct
call scroll_bar_vertical.draw
stdcall scroll_bar_vertical.draw,edx
@@:
pop edx ecx eax
ret
endp
 
;input:
;dword[ebp+ 8] - pointer to node info
;dword[ebp+12] - pointer to 'TreeList' struct
;n_info - pointer to node info
align 4
tl_node_set_data:
push ebp
mov ebp,esp
push eax ecx edx edi esi
mov edi,dword[ebp+12]
proc tl_node_set_data uses eax ecx edx edi esi, n_info:dword, tlist:dword
mov edi,dword[tlist]
call tl_get_cur_node_index ;eax=po_t
cmp eax,2
jl @f
1419,13 → 1359,13
xor ecx,ecx
mov cx,tl_info_size
imul eax,ecx
add eax,dword[edi]
add eax,tl_data_info
mov edi,eax
mov esi,dword[ebp+8] ;pointer to node data
mov esi,dword[n_info] ;pointer to node data
rep movsb
 
mov esi,edi
mov edi,dword[ebp+12] ;restore edi
mov edi,dword[tlist] ;restore edi
mov cx,tl_info_capt_offs
cmp cx,tl_info_size
jge .no_text_data
1446,9 → 1386,8
.no_text_data:
 
@@:
pop esi edi edx ecx eax
pop ebp
ret 8
ret
endp
 
;input:
;dword[ebp+ 8] - pointer to 'TreeList' struct
1465,7 → 1404,7
xor ecx,ecx
mov cx,tl_info_size
imul eax,ecx
add eax,dword[edi]
add eax,tl_data_info
mov dword[ebp+8],eax ;return node data pointer
@@:
pop edi ecx eax
1553,13 → 1492,13
pop ebp
ret 4
 
;áåðåò ïîçèöèþ ïîä êóðñîðîì
;input:
; edi = pointer 'tl' struct
;output:
; eax = index of current node
align 4
tl_get_cur_node_index: ;áåðåò ïîçèöèþ ïîä êóðñîðîì
push ecx edx
proc tl_get_cur_node_index uses ecx edx
;cycle to nodes
xor eax,eax
mov edx,tl_data_nodes
1579,9 → 1518,10
xor edx,edx
mov ecx,sizeof.TreeList
div ecx
pop edx ecx
ret
endp
 
;áåðåò ïîçèöèþ óêàçàííîãî ñèìâîëà
;input:
; edx = pointer node memory
; edi = pointer 'tl' struct
1588,7 → 1528,7
;output:
; eax = struct index of current node
align 4
tl_get_node_index: ;áåðåò ïîçèöèþ óêàçàííîãî ñèìâîëà
tl_get_node_index:
push ecx edx
mov eax,edx
sub eax,tl_data_nodes
1598,12 → 1538,10
pop edx ecx
ret
 
;óäàëèòü óçåë
align 4
tl_node_delete: ;óäàëèòü óçåë
push ebp
mov ebp,esp
push eax edx edi
mov edi,dword[ebp+8]
proc tl_node_delete uses eax edx edi, tlist:dword
mov edi,dword[tlist]
call tl_get_cur_node_index ;eax=po_t
cmp eax,2
jl @f
1615,36 → 1553,27
mov dword[edx+16],eax
call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
@@:
pop edi edx eax
pop ebp
ret 4
ret
endp
 
;ïîñòàâèòü êóðñîð íà ïåðâûé óçåë
align 4
tl_cur_beg: ;ïîñòàâèòü êóðñîð íà ïåðâûé óçåë
push ebp
mov ebp,esp
push edi
mov edi,dword[ebp+8]
proc tl_cur_beg uses edi, tlist:dword
mov edi,dword[tlist]
mov tl_cur_pos,0
cmp tl_p_scrol,0
je @f
mov edi,tl_p_scrol
mov dword[edi+24],0
push dword edi
mov edi,dword[ebp+8]
call scroll_bar_vertical.draw
mov dword[edi+sb_offs_position],0
stdcall scroll_bar_vertical.draw, edi
@@:
pop edi
ret
endp
 
pop ebp
ret 4
 
;ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ íèæå
align 4
tl_cur_next: ;ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ íèæå
push ebp
mov ebp,esp
push eax ebx edi esi
mov edi,dword[ebp+8]
proc tl_cur_next uses eax ebx edi esi, tlist:dword
mov edi,dword[tlist]
call tl_get_node_count ;eax = node count
;inc eax
cmp tl_cur_pos,eax
1662,29 → 1591,25
cmp tl_cur_pos,eax
jl @f
inc dword[ebx+sb_offs_position]
push dword ebx
call scroll_bar_vertical.draw
stdcall scroll_bar_vertical.draw,ebx
 
mov edi,dword[ebp+8] ;restore edi
push dword edi
call tl_draw ;ïîëíàÿ ïåðåðèñîâêà îêíà
stdcall tl_draw,dword[tlist] ;ïîëíàÿ ïåðåðèñîâêà îêíà
jmp .no_redraw
@@:
mov edi,dword[ebp+8] ;restore edi
mov edi,dword[tlist] ;restore edi
call tl_draw_cursor ;ïåðåðèñîâêà êóðñîðà
call tl_draw_caption_cur_pos
.no_redraw:
pop esi edi ebx eax
pop ebp
ret 4
ret
endp
 
 
;áåðåò ÷èñëî âñåõ âèäèìûõ óçëîâ (íå ñ÷èòàÿ çàêðûòûõ äî÷åðíèõ)
;input:
; edi = pointer 'tl' struct
;output:
; eax = struct index of current node
align 4
tl_get_node_count: ;áåðåò ÷èñëî âñåõ âèäèìûõ óçëîâ (íå ñ÷èòàÿ çàêðûòûõ äî÷åðíèõ)
tl_get_node_count:
push ecx edx
;cycle to nodes
xor eax,eax
1701,12 → 1626,13
pop edx ecx
ret
 
;áåðåò ÷èñëî âñåõ âèäèìûõ óçëîâ (ñ÷èòàÿ çàêðûòûå äî÷åðíèå)
;input:
; edi = pointer 'tl' struct
;output:
; eax = struct index of current node
align 4
tl_get_node_count_all: ;áåðåò ÷èñëî âñåõ âèäèìûõ óçëîâ (ñ÷èòàÿ çàêðûòûå äî÷åðíèå)
tl_get_node_count_all:
push ecx edx
;cycle to nodes
xor eax,eax
1723,12 → 1649,10
pop edx ecx
ret
 
;ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ âûøå
align 4
tl_cur_perv: ;ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ âûøå
push ebp
mov ebp,esp
push eax edi esi
mov edi,dword[ebp+8]
proc tl_cur_perv uses eax edi esi, tlist:dword
mov edi,dword[tlist]
cmp tl_cur_pos,0
je .no_redraw
mov esi,tl_box_top
1739,36 → 1663,29
cmp tl_p_scrol,0 ;åñëè åñòü óêàçàòåëü íà ñêðîëëèíã
je @f
mov eax,tl_p_scrol
cmp dword[eax+24],0 ;åñëè ñêðîëëèíã íà âåðõó, âûõîäèì
cmp dword[eax+sb_offs_position],0 ;åñëè ñêðîëëèíã íà âåðõó, âûõîäèì
je @f
mov edi,tl_cur_pos
cmp edi,dword[eax+24] ;åñëè êóðñîð óøåë âûøå ñêðîëëèíãà, òîãäà îïóñêàåì ñêðîëëèíã
cmp edi,dword[eax+sb_offs_position] ;åñëè êóðñîð óøåë âûøå ñêðîëëèíãà, òîãäà îïóñêàåì ñêðîëëèíã
jge @f
dec dword[eax+24]
push dword eax
mov edi,dword[ebp+8]
call scroll_bar_vertical.draw
mov edi,dword[ebp+8] ;restore edi
push dword edi
call tl_draw ;ïîëíàÿ ïåðåðèñîâêà îêíà
dec dword[eax+sb_offs_position]
stdcall scroll_bar_vertical.draw, eax
stdcall tl_draw, dword[tlist] ;ïîëíàÿ ïåðåðèñîâêà îêíà
jmp .no_redraw
@@:
mov edi,dword[ebp+8] ;restore edi
mov edi,dword[tlist] ;restore edi
;mov esi,tl_box_top
;add esi,tl_box_height ;esi = coord bottom border
call tl_draw_cursor ;ïåðåðèñîâêà êóðñîðà
call tl_draw_caption_cur_pos
.no_redraw:
pop esi edi eax
pop ebp
ret 4
ret
endp
 
;ïåðåíåñòè êóðñîð íà 1 ñòðàíèöó âûøå
align 4
tl_cur_page_up: ;ïåðåíåñòè êóðñîð íà 1 ñòðàíèöó âûøå
push ebp
mov ebp,esp
push eax edi esi
mov edi,dword[ebp+8]
proc tl_cur_page_up uses eax edi esi, tlist:dword
mov edi,dword[tlist]
 
cmp tl_p_scrol,0 ;åñëè åñòü óêàçàòåëü íà ñêðîëëèíã
je .no_redraw
1778,7 → 1695,7
 
cmp tl_cur_pos,0
jne @f
cmp dword[esi+24],0 ;åñëè ñêðîëëèíã íà âåðõó, âûõîäèì
cmp dword[esi+sb_offs_position],0 ;åñëè ñêðîëëèíã íà âåðõó, âûõîäèì
jne @f
jmp .no_redraw
@@:
1789,32 → 1706,27
@@:
mov tl_cur_pos,0
.cursor:
cmp dword[esi+24],eax
cmp dword[esi+sb_offs_position],eax
jl @f
sub dword[esi+24],eax
sub dword[esi+sb_offs_position],eax
jmp .scroll
@@:
mov dword[esi+24],0
mov dword[esi+sb_offs_position],0
.scroll:
;ïåðåðèñîâêè îêíà è ñêðîëëèíãà
push dword edi
call tl_draw ;draw window
push dword esi
call scroll_bar_vertical.draw
stdcall tl_draw, edi ;draw window
stdcall scroll_bar_vertical.draw, esi
.no_redraw:
pop esi edi eax
pop ebp
ret 4
ret
endp
 
;ïåðåíåñòè êóðñîð íà 1 ñòðàíèöó íèæå
align 4
tl_cur_page_down: ;ïåðåíåñòè êóðñîð íà 1 ñòðàíèöó íèæå
push ebp
mov ebp,esp
push eax ebx ecx edi esi
proc tl_cur_page_down uses eax ebx ecx edi esi, tlist:dword
;eax - êîë-âî ñòðîê íà ñòðàíèöå
;ebx - ìàêñ. ïîçèöèÿ êóðñîðà
;ecx - ìàêñ. ïîçèöèÿ ñêðîëëèíãà
mov edi,dword[ebp+8]
mov edi,dword[tlist]
 
cmp tl_p_scrol,0 ;åñëè åñòü óêàçàòåëü íà ñêðîëëèíã
je .no_redraw
1836,7 → 1748,7
 
cmp tl_cur_pos,ebx ;êóðñîð âíèçó ?
jl @f
cmp dword[esi+24],ecx ;ñêðîëëèíã âíèçó ?
cmp dword[esi+sb_offs_position],ecx ;ñêðîëëèíã âíèçó ?
jl @f
jmp .no_redraw
@@:
1847,28 → 1759,23
mov tl_cur_pos,ebx
@@:
 
add dword[esi+24],eax ;ïåðåìåùàåì ñêðîëëèíã
cmp dword[esi+24],ecx
add dword[esi+sb_offs_position],eax ;ïåðåìåùàåì ñêðîëëèíã
cmp dword[esi+sb_offs_position],ecx
jl @f
mov dword[esi+24],ecx
mov dword[esi+sb_offs_position],ecx
@@:
 
;ïåðåðèñîâêè îêíà è ñêðîëëèíãà
push dword edi
call tl_draw ;draw window
push dword esi
call scroll_bar_vertical.draw
stdcall tl_draw, edi ;draw window
stdcall scroll_bar_vertical.draw, esi
.no_redraw:
pop esi edi ecx ebx eax
pop ebp
ret 4
ret
endp
 
;îòêðûòü/çàêðûòü óçåë (ðàáîòàåò ñ óçëàìè êîòîðûå èìåþò äî÷åðíèå óçëû)
align 4
tl_node_close_open: ;îòêðûòü/çàêðûòü óçåë (ðàáîòàåò ñ óçëàìè êîòîðûå èìåþò äî÷åðíèå óçëû)
push ebp
mov ebp,esp
push eax edx edi
mov edi,dword[ebp+8]
proc tl_node_close_open uses eax edx edi, tlist:dword
mov edi,dword[tlist]
call tl_get_cur_node_index ;eax = ïîçèöèÿ óçëà íà êîòîðîì ñòîèò êóðñîð
cmp eax,2 ;êóðñîð ñòîèò íà óçëå ?
jl @f
1887,19 → 1794,15
xor byte[eax+3],1 ;+3 = .clo *** îòêðûòèå/çàêðûòèå óçëà ***
call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
 
push dword edi
call tl_draw ;îáíîâëåíèå îêíà
stdcall tl_draw, edi ;îáíîâëåíèå îêíà
@@:
pop edi edx eax
pop ebp
ret 4
ret
endp
 
;óâåëè÷èòü óðîâåíü
align 4
tl_node_lev_inc: ;óâåëè÷èòü óðîâåíü
push ebp
mov ebp,esp
push eax ecx edx edi
mov edi,dword[ebp+8]
proc tl_node_lev_inc uses eax ecx edx edi, tlist:dword
mov edi,dword[tlist]
bt tl_style,2 ;tl_list_box_mode
jc @f
call tl_get_cur_node_index ;eax=po_t
1920,16 → 1823,13
jge @f
inc byte[eax+2] ;óâåëè÷èâàåì çíà÷åíèå óçëà
@@:
pop edi edx ecx eax
pop ebp
ret 4
ret
endp
 
;óìåíüøèòü óðîâåíü
align 4
tl_node_lev_dec: ;óìåíüøèòü óðîâåíü
push ebp
mov ebp,esp
push eax edi
mov edi,dword[ebp+8]
proc tl_node_lev_dec uses eax edi, tlist:dword
mov edi,dword[tlist]
call tl_get_cur_node_index ;eax=po_t
cmp eax,2
jl @f
1939,16 → 1839,13
je @f
dec byte[eax+2]
@@:
pop edi eax
pop ebp
ret 4
ret
endp
 
;ïåðåìåùàåì óçåë ââåðõ
align 4
tl_node_move_up: ;ïåðåìåùàåì óçåë ââåðõ
push ebp
mov ebp,esp
push eax ebx ecx edx edi esi
mov edi,dword[ebp+8]
proc tl_node_move_up uses eax ebx ecx edx edi esi, tlist:dword
mov edi,dword[tlist]
call tl_get_cur_node_index ;eax=po_t
cmp eax,2
jl @f
1976,16 → 1873,13
push dword edi
call tl_draw
@@:
pop esi edi edx ecx ebx eax
pop ebp
ret 4
ret
endp
 
;ïåðåìåùàåì óçåë âíèç
align 4
tl_node_move_down: ;ïåðåìåùàåì óçåë âíèç
push ebp
mov ebp,esp
push eax ebx ecx edx edi esi
mov edi,dword[ebp+8]
proc tl_node_move_down uses eax ebx ecx edx edi esi, tlist:dword
mov edi,dword[tlist]
call tl_get_cur_node_index ;eax=po_t
cmp eax,2
jl @f
2010,14 → 1904,11
.po8: ;à òóò ïîðÿäîê ñëåäîâàíèÿ óçëîâ íå ìåíÿåì
call tl_node_move_po8 ;óçëû èäóò íå ïîäðÿä ìåíÿåì 8 ññûëîê
.cur_mov:
push dword edi
call tl_cur_next
push dword edi
call tl_draw
stdcall tl_cur_next, edi
stdcall tl_draw, edi
@@:
pop esi edi edx ecx ebx eax
pop ebp
ret 4
ret
endp
 
align 4
tl_node_move_po6:
2191,9 → 2082,7
mov dword[esi],eax
add esi,4
 
push dword edi
push dword edx
call tl_node_poi_get_data
stdcall tl_node_poi_get_data, edx,edi
pop dword eax
 
;call tl_node_copy_data
2260,8 → 2149,7
jne .no_tree
bt word[ebp+18],1 ;load in add mode
jc @f
push dword edi
call tl_info_clear
stdcall tl_info_clear, dword edi
@@:
 
xor ebx,ebx
2276,18 → 2164,13
mov edx,esi ;save header pointer
add esi,tl_save_load_heder_size
 
@@:
;load node params
push dword edi
cld
@@: ;load node params
mov eax,dword[esi+4]
ror eax,16
push dword eax ;options (type; lev; clo)
ror eax,16 ;eax - options (type; lev; clo)
add esi,8
push dword esi
call tl_node_add
 
push dword edi
call tl_cur_next
stdcall tl_node_add, esi,eax,edi
stdcall tl_cur_next, edi
;...
add esi,ebx
loop @b
2301,9 → 2184,7
cmp ebx,0
je .end_f
mov dword[ebx+sb_offs_position],eax
push dword ebx ;pointer to scroll struct
call scroll_bar_vertical.draw
 
stdcall scroll_bar_vertical.draw, ebx
jmp .end_f
.no_tree:
mov dword[ebp+20],tl_err_load_caption
2388,5 → 2269,5
;das ;ïîñëå äàííîé êîìàíäû êàê áû ïðîèñõîäèò óìåíüøåíèå al íà 66h (â êíèãå íàïèñàíî äðóãîå)
or al,0x30 ;äàííàÿ êîìàíäà êîðî÷å ÷åì äâå âûøå
stosb ;çàïèñàòü ýëåìåíò èç ðåãèñòðà al â ÿ÷åêó ïàìÿòè es:edi
ret ;âåðíóòüñÿ ÷åíü èíòåðåñíûé õîä ò.ê. ïîêà â ñòåêå õðàíèòüñÿ êîë-âî âûçîâîâ òî ñòîëüêî ðàç ìû è áóäåì âûçûâàòüñÿ
ret ;âåðíóòüñÿ î÷åíü èíòåðåñíûé õîä ò.ê. ïîêà â ñòåêå õðàíèòüñÿ êîë-âî âûçîâîâ òî ñòîëüêî ðàç ìû è áóäåì âûçûâàòüñÿ
}