Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 1269 → Rev 1277

/programs/develop/libraries/box_lib/trunk/box_lib.asm
7,6 → 7,7
; Evtikhov Maxim aka Maxxxx32
; Eugene Grechnikov aka Diamond
; hidnplayr
; Igor Afanasiev aka IgorA
;*****************************************************************************
 
format MS COFF
22,6 → 23,7
include 'd_button.mac' ;macro implements dinamic_button
include 'menubar.mac' ;macro implements menubar
include 'filebrowser.mac' ;macro implements filebrowser
include 'tree_list.mac' ;macro implements tree_list, image_list, list_box
;----------------------------------------------------
;EditBox
;----------------------------------------------------
89,7 → 91,14
;align 16
;mouse_flag dd 0x0
 
;--------------------------------------------------
;tree list
;--------------------------------------------------
align 16
use_tree_list
 
 
 
align 16
EXPORTS:
 
129,6 → 138,30
dd sz_FileBrowser_mouse, fb_mouse
dd sz_FileBrowser_key, fb_key
dd szVersion_FileBrowser, 0x00010001
 
dd sz_tl_data_init, tl_data_init
dd sz_tl_data_clear, tl_data_clear
dd sz_tl_info_clear, tl_info_clear
dd sz_tl_key, tl_key
dd sz_tl_mouse, tl_mouse
dd sz_tl_draw, tl_draw
dd sz_tl_info_undo, tl_info_undo
dd sz_tl_info_redo, tl_info_redo
dd sz_tl_node_add, tl_node_add
dd sz_tl_node_set_data,tl_node_set_data
dd sz_tl_node_get_data,tl_node_get_data
dd sz_tl_node_delete,tl_node_delete
dd sz_tl_cur_beg, tl_cur_beg
dd sz_tl_cur_next, tl_cur_next
dd sz_tl_cur_perv, tl_cur_perv
dd sz_tl_node_close_open,tl_node_close_open
dd sz_tl_node_lev_inc,tl_node_lev_inc
dd sz_tl_node_lev_dec,tl_node_lev_dec
dd sz_tl_node_poi_get_info, tl_node_poi_get_info
dd sz_tl_node_poi_get_next_info,tl_node_poi_get_next_info
dd sz_tl_node_poi_get_data, tl_node_poi_get_data
dd sz_tl_version_tree_list, 0x00000001
 
dd 0,0
 
 
166,4 → 199,27
sz_FileBrowser_draw db 'FileBrowser_draw',0
sz_FileBrowser_mouse db 'FileBrowser_mouse',0
sz_FileBrowser_key db 'FileBrowser_key',0
szVersion_FileBrowser db 'version_FileBrowser',0
szVersion_FileBrowser db 'version_FileBrowser',0
 
sz_tl_data_init db 'tl_data_init',0
sz_tl_data_clear db 'tl_data_clear',0
sz_tl_info_clear db 'tl_info_clear',0
sz_tl_key db 'tl_key',0
sz_tl_mouse db 'tl_mouse',0
sz_tl_draw db 'tl_draw',0
sz_tl_info_undo db 'tl_info_undo',0
sz_tl_info_redo db 'tl_info_redo',0
sz_tl_node_add db 'tl_node_add',0
sz_tl_node_set_data db 'tl_node_set_data',0
sz_tl_node_get_data db 'tl_node_get_data',0
sz_tl_node_delete db 'tl_node_delete',0
sz_tl_cur_beg db 'tl_cur_beg',0
sz_tl_cur_next db 'tl_cur_next',0
sz_tl_cur_perv db 'tl_cur_perv',0
sz_tl_node_close_open db 'tl_node_close_open',0
sz_tl_node_lev_inc db 'tl_node_lev_inc',0
sz_tl_node_lev_dec db 'tl_node_lev_dec',0
sz_tl_node_poi_get_info db 'tl_node_poi_get_info',0
sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0
sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0
sz_tl_version_tree_list db 'version_tree_list',0
/programs/develop/libraries/box_lib/trunk/tl_nod_16.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/develop/libraries/box_lib/trunk/tl_sys_16.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/develop/libraries/box_lib/trunk/tree_list.mac
0,0 → 1,1725
; ìàêðîñ äëÿ ñèñòåìíîé áèáëèîòåêè box_lib.obj
; ýëåìåíò TreeList äëÿ Kolibri OS
; ôàéë ïîñëåäíèé ðàç èçìåíÿëñÿ 20.11.2009 IgorA
; íà êîä ïðèìåíåíà GPL2 ëèöåíçèÿ
 
 
sizeof.TreeList equ 20
 
tl_style equ dword[edi+10] ;ñòèëè ýëåìåíòà
tl_img_cx equ word[edi+22] ;øèðèíà èêîíîê
tl_img_cy equ word[edi+24] ;âûñîòà èêîíîê
tl_data_img_sys equ dword[edi+26] ;óêàçàòåëü íà ñèñòåìíûå èçîáðàæåíèÿ (ñòðåëêè, ïëþñèêè)
tl_ch_tim equ dword[edi+30] ;êîëè÷åñòâî èçìåíåíèé â ôàéëå
tl_tim_undo equ dword[edi+38] ;êîëè÷åñòâî îòìåíåííûõ äåéñòâèé
tl_cur_pos equ dword[edi+42] ;ïîçèöèÿ êóðñîðà
tl_col_bkg equ dword[edi+46] ;öâåò ôîíà
tl_col_zag equ dword[edi+50] ;öâåò çàãîëîâêà
tl_col_txt equ dword[edi+54] ;öâåò òåêñòà
tl_box_left equ dword[edi+58]
tl_box_top equ dword[edi+62]
tl_box_width equ dword[edi+66]
tl_box_height equ dword[edi+70]
tl_capt_cy equ word[edi+74] ;âûñîòà ïîäïèñè
tl_info_capt_offs equ dword[edi+76]
tl_el_focus equ dword[edi+80] ;óêàçàòåëü íà ñòðóêòóðó ýëåìåíòà â ôîêóñå
tl_p_scrol equ dword[edi+84] ;óêàçàòåëü íà ñòðóêòóðó ñêðîëëèíãà
tl_sb_draw equ dword[edi+88] ;óêàçàòåëü íà ôóíêöèþ ïåðåðèñîâûâàþùóþ ñêðîëëèíã
tl_on_press equ dword[edi+96] ;óêàçàòåëü íà ôóíêöèþ, êîòîðàÿ âûçûâàåòñÿ ïðè íàæàòèè Enter
 
;êîíñòàíòû ñòèëÿ
tl_key_no_edit equ 1b ;ýëåìåíò íåëüçÿ ðåäàêòèðîâàòü íà êëàâèàòóðå (èçìåíÿòü óðîâíè, óäàëÿòü)
tl_draw_par_line equ 10b ;ðèñîâàòü ëèíèè ê ðîäèòåëüñêîìó óçëó
tl_list_box_mode equ 100b ;ñòèëü íå îòîáðàæàåò óðîâíè (êàê â ListBox âñå îäíîãî óðîâíÿ)
 
macro use_tree_list_structs
{
struct TreeInfo
data_info dd ? ;+ 0 óêàçàòåëü íà îñíîâíûå äàíûå
info_size dw ? ;+ 4 ðàçìåð èíôîðìàöèîííîé ñòðóêòóðû (ïîëüçîâàòåëüñüêèå äàííûå + òåêñò äëÿ ïîäïèñè)
info_max_count dd ? ;+ 6 ìàêñèìàëüíîå êîëëè÷åñòâî ñòðóêòóð
style dd ? ;+10 ñòèëè ýëåìåíòà
data_nodes dd ? ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
data_img dd ? ;+18 óêàçàòåëü íà èçîáðàæåíèÿ
img_cx dw ? ;+22 øèðèíà èêîíîê
img_cy dw ? ;+24 âûñîòà èêîíîê
data_img_sys dd ? ;+26 óêàçàòåëü íà ñèñòåìíûå èçîáðàæåíèÿ (ñòðåëêè, ïëþñèêè)
ch_tim dd ? ;+30 êîëè÷åñòâî èçìåíåíèé â ôàéëå
ls_tim dd ? ;+34 âðåìÿ ïîñëåäíåãî ñîõðàíåíèÿ
tim_undo dd ? ;+38 êîëè÷åñòâî îòìåíåííûõ äåéñòâèé
cur_pos dd ? ;+42 ïîçèöèÿ êóðñîðà
col_bkg dd ? ;+46 öâåò ôîíà
col_zag dd ? ;+50 öâåò çàãîëîâêà
col_txt dd ? ;+54 öâåò òåêñòà
wndMain BOX ? ;+58 ðàçìåð îêíà äëÿ âûâîäà
capt_cy dw ? ;+74 âûñîòà ïîäïèñè
info_capt_offs dd ? ;+76 ñäâèã äëÿ íà÷àëà òåêñòà (ïîäïèñè óçëà)
el_focus dd ? ;+80 óêàçàòåëü íà ñòðóêòóðó ýëåìåíòà â ôîêóñå
p_scrol dd ? ;+84 óêàçàòåëü íà ñòðóêòóðó ñêðîëëèíãà
sb_draw dd ? ;+88 óêàçàòåëü íà ôóíêöèþ ïåðåðèñîâûâàþùóþ ñêðîëëèíã
on_activate dd ? ;+92 óêàçàòåëü íà ôóíêöèþ ïðè àêòèâèðîâàíèè óçëà
on_press dd ? ;+96 óêàçàòåëü íà ôóíêöèþ ïðè íàæàòèè Enter
ends
 
struct TreeList
type dw ? ;+ 0 òèï ýëåìåíòà, èëè èíäåêñ èêîíêè äëÿ óçëà
lev db ? ;+ 2 óðîâåíü ýëåìåíòà
clo db ? ;+ 3 ôëàã çàêðûòèÿ, èëè îòêðûòèÿ (èìååò ñìûñë äëÿ ðîäèòåëüñêîãî óçëà)
perv dd ? ;+ 4 èíäåêñ ïðåäûäóùåãî ýëåìåíòà
next dd ? ;+ 8 èíäåêñ ïîñëåäóþùåãî ýëåìåíòà
tc dd ? ;+12 âðåì. ñîçäàíèÿ
td dd ? ;+16 âðåì. óäàëåíèÿ
ends
}
 
struc tree_list info_size,info_max_count,style, img_cx,img_cy,\
col_bkg,col_zag,col_txt, box_l,box_t,box_w,box_h, capt_cy,info_capt_offs,\
el_focus, p_scrol,p_sb_draw,fun_enter {
.data_info dd 0
.info_size dw info_size
.info_max_count dd info_max_count
.style dd style
.data_nodes dd 0
.data_img dd 0
.img_cx dw img_cx
.img_cy dw img_cy
.data_img_sys dd 0
.ch_tim dd 0
.ls_tim dd 0
.tim_undo dd 0
.cur_pos dd 0
.col_bkg dd col_bkg
.col_zag dd col_zag
.col_txt dd col_txt
.box_lert dd box_l
.box_top dd box_t
.box_width dd box_w
.box_height dd box_h
.capt_cy dw capt_cy
.info_capt_offs dd info_capt_offs
.el_focus dd el_focus
.p_scrol dd p_scrol
.p_sb_draw dd p_sb_draw
.on_activate dd 0
.on_press dd fun_enter
}
 
;-----------------------------------------------------------------------------
;ôóíêöèÿ äëÿ âûäåëåíèÿ ïàìÿòè
;input:
; ecx = size data
;otput:
; eax = pointer to memory
align 4
mem_Alloc:
push ebx
mov eax,68
mov ebx,12
int 0x40
pop ebx
ret
;-----------------------------------------------------------------------------
;ôóíêöèÿ äëÿ îñâîáîæäåíèÿ ïàìÿòè
;input:
; ecx = pointer to memory
align 4
mem_Free:
push eax ebx
cmp ecx,0
jz @f
mov eax,68
mov ebx,13
int 0x40
@@:
pop ebx eax
ret
 
macro use_tree_list
{
align 4
tl_data_init: ;âûäåëíèå ïàìÿòè äëÿ ñòðóêòóð ñïèñêà è îñíîâíîé èíôîðìàöèè (êîíñòðóêòîð)
push ebp
mov ebp,esp
push eax ecx edi
mov edi,dword[ebp+8]
 
xor ecx,ecx
mov cx,word[edi+4]
imul ecx,dword[edi+6]
call mem_Alloc
mov dword[edi],eax ;êîïèðóåì óêàçàòåëü íà ïîëó÷åíóþ ïàìÿòü â ñòðóêòóðó
mov dword[edi+18],0 ;îáíóëÿåì óêàçàòåëü 'data_img'
mov tl_data_img_sys,0 ;îáíóëÿåì óêàçàòåëü 'data_img_sys'
 
mov ecx,sizeof.TreeList
imul ecx,dword[edi+6]
call mem_Alloc
mov dword[edi+14],eax ;êîïèðóåì óêàçàòåëü íà ïîëó÷åíóþ ïàìÿòü â ñòðóêòóðó
 
push dword edi
call tl_info_clear
 
;íàñòðîéêè äî÷åðíåãî ñêðîëëèíãà
cmp tl_p_scrol,0
je @f
mov eax,tl_p_scrol
;*** öâåòîâûå íàñòðîéêè ***
mov ecx,tl_col_bkg
mov dword[eax+28],ecx ;+28 .bckg_col
mov ecx,tl_col_zag
mov dword[eax+32],ecx ;+32 .frnt_col
mov ecx,tl_col_txt
mov dword[eax+36],ecx ;+32 .line_col
;*** íàñòðîéêè ðàçìåðîâ ***
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
 
align 4
tl_data_clear: ;î÷èñòêà ïàìÿòè ýëåìåíòà (äåñòðóêòîð)
push ebp
mov ebp,esp
push ecx edi
mov edi,dword[ebp+8]
cmp dword[edi+18],0 ;data_img
je @f
mov ecx,dword[edi+18]
call mem_Free ;÷èñòêà ñèñòåìíûõ èêîíîê
@@:
cmp tl_data_img_sys,0
je @f
mov ecx,tl_data_img_sys
call mem_Free ;÷èñòêà ñèñòåìíûõ èêîíîê
@@:
mov ecx,dword[edi]
call mem_Free
 
mov ecx,dword[edi+14]
call mem_Free
pop edi ecx
pop ebp
ret 4
 
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,dword[edi+6]
mov eax,dword[edi+14]
@@:
mov byte[eax],0 ;÷èñòèì óçëû 0-ìè
inc eax
loop @b
mov eax,dword[edi+14] ;óêàçàòåëü íà 1-é óçåë
mov dword[eax+8],1 ;óêàçàòåëü next â 1-ì óçëå ïðèðàâíèâàåì ê 1
call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
pop edi ecx eax
pop ebp
ret 4
 
 
align 4
tl_key: ;ðåàêöèÿ íà êëàâèàòóðó
push ebp
mov ebp,esp
push ebx edi
mov edi,dword[ebp+8]
 
mov ebx,tl_el_focus
cmp dword[ebx],edi
jne .no_focus ;ýëåìåíò íå â ôîêóñå
 
xor bx,bx
cmp ah,13 ;Enter
jne @f
cmp tl_on_press,0
je @f
call tl_on_press
@@:
cmp ah,32 ;Space
jne @f
push dword edi
call tl_node_close_open
@@:
cmp ah,178 ;Up
jne @f
push dword edi
call tl_cur_perv
@@:
cmp ah,177 ;Down
jne @f
push dword edi
call tl_cur_next
@@:
 
bt tl_style,0 ;tl_key_no_edit
jc .no_edit
cmp ah,176 ;Left
jne @f
push dword edi
call tl_node_lev_dec
mov bx,1
@@:
cmp ah,179 ;Right
jne @f
push dword edi
call tl_node_lev_inc
mov bx,1
@@:
cmp ah,182 ;Delete
jne @f
push dword edi
call tl_node_delete
mov bx,1
@@:
.no_edit:
 
cmp bx,1
jne .no_focus
push dword edi
call tl_draw
.no_focus:
 
pop edi ebx
pop ebp
ret 4
 
align 4
tl_mouse: ;ðåàêöèÿ íà ìûøü
push ebp
mov ebp,esp
push eax ebx ecx edx edi esi
mov edi,dword[ebp+8]
 
mov eax,37
mov ebx,2
int 0x40
 
bt eax,0 ;left mouse button press
jae .no_draw
 
mov ebx,tl_el_focus
mov dword[ebx],edi ;set focus
 
mov eax,37
mov ebx,1
int 0x40
 
mov ebx,tl_box_left
shl ebx,16
cmp eax,ebx ;ëåâàÿ ãðàíèöà îêíà
jl .no_in_wnd
 
mov ebx,tl_box_left
add ebx,tl_box_width
shl ebx,16
cmp eax,ebx ;ïðàâàÿ ãðàíèöà îêíà
jg .no_in_wnd
 
mov ebx,tl_box_top
add ebx,tl_box_height
cmp ax,bx ;íèæíÿÿ ãðàíèöà îêíà
jg .no_in_wnd
 
sub ebx,tl_box_height
add bx,tl_capt_cy
cmp ax,bx ;âåðõíÿÿ ãðàíèöà îêíà + âûñîòà ïîäïèñè
jl .no_in_wnd
 
; 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+24] ;äîáàâëÿåì ñêðîëëèíã íà âåðõó
@@:
 
mov ecx,eax
call tl_get_node_count ;eax = node count
cmp eax,ecx
jl @f
mov eax,ecx ;åñëè êóðñîð íå âûøåë çà ïðåäåëû óçëîâ, âîññòàíàâëèâàåì ñòàðîå çíà÷åíèå eax
@@:
 
mov ebx,0x80000000 ;ñòàâèì ôëàã äëÿ âûõîäà áåç îáíîâëåíèÿ
cmp eax,tl_cur_pos ;åñëè íîâîå çíà÷åíèå êóðñîðà ñîâïàëî ñ ïðåäûäóùèì
je @f ;òî ìîæåì âûéòè áåç îáíîâëåíèÿ îêíà
xor ebx,ebx
@@:
 
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,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
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 ax,bx
jne .no_open_close
 
push dword edi
call tl_node_close_open
.no_open_close:
 
bt ebx,31
jc .no_draw
push dword edi
call tl_draw
jmp .no_draw
.no_in_wnd: ;íå ïîïàëè â îêíî - ïîòåðÿ ôîêóñà
mov ebx,tl_el_focus
mov dword[ebx],0 ;reset focus
.no_draw:
 
pop esi edi edx ecx ebx eax
pop ebp
ret 4
 
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
 
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
 
align 4
tl_info_set_undo: ;óäàëåíèå îòìåíåííûõ äåéñòâèé
; push ebp
; mov ebp,esp
; push edi
; mov edi,dword[ebp+8]
 
; mov [dragk],0 ;çàêàí÷èâàåì âûäåëåíèå îò êëàâèàòóðû
cmp tl_tim_undo,1
jl .no_work
 
push eax ebx ecx edx
mov edx,dword[edi+14]
mov ecx,edx
add ecx,sizeof.TreeList
call tl_move_next ;long i=tex[0].next;
mov eax,tl_tim_undo
sub tl_ch_tim,eax ;ch_tim-=tim_undo;
mov eax,tl_ch_tim
cmp [edi+34],eax ;if(ls_tim>ch_tim)
jle @f
mov dword[edi+34],0 ;ls_tim=0
@@:
cmp edx,ecx
jle @f
 
;if(tex[i].tc>ch_tim){ // åñëè ñîçäàíèå ñèìâîëà áûëî îòìåíåíî
cmp dword[edx+12],eax
jle .no_u1
mov dword[edx+12],0
mov dword[edx+16],0
 
mov ebx, dword[edx+4]
imul ebx,sizeof.TreeList
add ebx, dword[edi+14] ;.next
push dword[edx+8] ;tex[tex[i].perv].next=tex[i].next;
pop dword[ebx+8]
 
mov ebx, dword[edx+8]
imul ebx,sizeof.TreeList
add ebx, dword[edi+14] ;.perv
push dword[edx+4] ;tex[tex[i].next].perv=tex[i].perv;
pop dword[ebx+4]
 
.no_u1:
 
;else if(tex[i].td>ch_tim) tex[i].td=0; // åñëè óäàëåíèå ñèìâîëà áûëî îòìåíåíî
cmp dword[edx+16],eax
jle .no_u2
mov dword[edx+16],0
.no_u2:
 
call tl_move_next
jmp @b
@@:
mov tl_tim_undo,0
; mov eax,[edi+?] ;co_tim
; cmp tl_ch_tim,eax ;ch_tim
; jge @f
; mov [edi+?],0 ;co_tim
; @@:
pop edx ecx ebx eax
.no_work:
 
; pop edi
; pop ebp
; ret 4
ret
 
align 4
tl_draw: ;âûâîä ñïèñêà íà ýêðàí
push ebp
mov ebp,esp
push eax ebx ecx edx edi esi
;draw dir_list main rect
mov edi,dword[ebp+8]
mov ebx,tl_box_left
shl ebx,16
add ebx,tl_box_width
mov ecx,tl_box_top
shl ecx,16
mov cx,tl_capt_cy
mov edx,tl_col_zag
mov eax,13
int 0x40 ;draw window caption
 
add ecx,tl_box_top
shl ecx,16
add ecx,tl_box_height
sub cx,tl_capt_cy
mov edx,tl_col_bkg
int 0x40 ;draw window client rect
 
cmp tl_capt_cy,9 ;9 - minimum caption height
jl @f
mov eax,4 ;draw text captions
mov ebx,tl_box_left
shl ebx,16
add ebx,5*65536+3
add ebx,tl_box_top
mov ecx,tl_col_txt
or ecx,0x80000000
lea edx,[txt_capt_cur]
int 0x40
 
mov ebx,tl_box_left
shl ebx,16
add ebx,100*65536+3
add ebx,tl_box_top
lea edx,[txt_capt_otm]
int 0x40
 
mov eax,47 ;draw
mov ebx,0x40000
mov ecx,tl_cur_pos
inc ecx
mov edx,tl_box_left
shl edx,16
add edx,50*65536+3
add edx,tl_box_top
mov esi,tl_col_txt
int 0x40
mov ecx,tl_tim_undo
mov edx,tl_box_left
shl edx,16
add edx,140*65536+3
add edx,tl_box_top
mov esi,tl_col_txt
int 0x40
@@:
 
;---debug---
;mov ecx,0
;@@:
;call DebugSymb
;inc ecx
;cmp ecx,10
;jge @f
;jmp @b
;@@:
;---debug---
 
;cycle to nodes
xor eax,eax
mov edx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
mov ecx,edx
add ecx,sizeof.TreeList
 
;*** ïðîïóñê óçëîâ, êîòîðûå ïðîìîòàíû ñêðîëëèíãîì ***
cmp tl_p_scrol,0 ;åñëè åñòü óêàçàòåëü íà ñêðîëëèíã
je .end_c1
mov esi,tl_p_scrol
cmp dword[esi+24],0 ;åñëè ñêðîëëèíã íà âåðõó, âûõîäèì
je .end_c1
@@:
call tl_iterat_next
cmp edx,ecx
jle .end_draw
inc eax
cmp eax,dword[esi+24]
jge .end_c1
jmp @b
.end_c1:
 
xor eax,eax
mov esi,tl_box_top
add esi,tl_box_height ;esi = coord bottom border
@@:
call tl_iterat_next
cmp edx,ecx
jle @f
call tl_draw_node
inc eax
jmp @b
@@:
 
call tl_draw_cursor
.end_draw:
pop esi edi edx ecx ebx eax
pop ebp
ret 4
 
;input:
; ecx = pointer to 1 node struct
; edx = pointer to some node struct
; edi = pointer to 'TreeList' struct
align 4
tl_iterat_next:
push bx
mov bl,0x7f
cmp byte[edx+3],1
jne @f
mov bl,byte[edx+2]
@@:
 
cmp tl_tim_undo,0
je .else
 
push eax
.beg0:
call tl_move_next
cmp edx,ecx
jle @f
call tl_node_not_vis ;ïðîïóñê óäàëåííûõ è îòìåíåííûõ
cmp al,1
je .beg0
cmp bl,byte[edx+2] ;ïðîïóñê çàêðûòûõ
jl .beg0
@@:
pop eax
pop bx
ret
 
.else:
call tl_move_next
cmp edx,ecx
jle .endif
cmp dword[edx+16],0 ;td = 'time delete' -> ïðîïóñê óäàëåííûõ
jne .else
cmp bl,byte[edx+2] ;ïðîïóñê çàêðûòûõ
jl .else
.endif:
pop bx
ret
 
;input:
; ecx = pointer to 1 node struct
; edx = pointer to some node struct
; edi = pointer to 'TreeList' struct
align 4
tl_iterat_next_all:
cmp tl_tim_undo,0
je .else
 
push eax
@@:
call tl_move_next
cmp edx,ecx
jle @f
call tl_node_not_vis
cmp al,1
je @b
@@:
pop eax
ret
.else:
call tl_move_next
cmp edx,ecx
jle .endif
cmp dword[edx+16],0 ;td -> time delete
jne .else
.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:
push bx
mov bl,0x7f
cmp byte[edx+3],1
jne @f
mov bl,byte[edx+2]
@@:
 
cmp tl_tim_undo,0
je .else
 
push eax
.beg0:
call tl_move_perv
cmp edx,ecx
jle @f
call tl_node_not_vis ;ïðîïóñê óäàëåííûõ è îòìåíåííûõ
cmp al,1
je .beg0
cmp bl,byte[edx+2] ;ïðîïóñê çàêðûòûõ
jl .beg0
@@:
pop eax
pop bx
ret
 
.else:
call tl_move_perv
cmp edx,ecx
jle .endif
cmp dword[edx+16],0 ;td = 'time delete' -> ïðîïóñê óäàëåííûõ
jne .else
cmp bl,byte[edx+2] ;ïðîïóñê çàêðûòûõ
jl .else
.endif:
pop bx
ret
 
;input:
; edx = pointer to some node struct
; edi = pointer to 'TreeList' struct
;output:
; edx = pointer to next node struct
align 4
tl_move_next:
mov edx,dword[edx+8]
imul edx,sizeof.TreeList
add edx,dword[edi+14]
ret
 
;input:
; edx = pointer to some node struct
; edi = pointer to 'TreeList' struct
;output:
; edx = pointer to perv node struct
align 4
tl_move_perv:
mov edx,dword[edx+4]
imul edx,sizeof.TreeList
add edx,dword[edi+14]
ret
 
;input:
; edx = pointer to symbol struct
; edi = pointer to 'TreeList' struct
;output:
; al = 1 if sumbol not visible
; (tex[i].td+tim_Undo<=ch_tim && tex[i].td) || (tex[i].tc>ch_tim-tim_Undo)
align 4
tl_node_not_vis:
cmp dword[edx+16],0
je @f
mov eax,dword[edx+16] ;eax=tex[i].td
add eax,tl_tim_undo
cmp eax,tl_ch_tim
jg @f
mov al,1
ret
@@:
 
mov eax,tl_ch_tim
sub eax,tl_tim_undo
cmp dword[edx+12],eax ;tc -> time create
jle @f
mov al,1
ret
@@:
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 ;êóðñîð íàõîäèòñÿ âûøå îêíà, â îáëàñòè ïðîêðó÷åííîé ñêðîëëèíãîì
 
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
 
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 cx,tl_img_cx
shl ecx,16
mov cx,tl_img_cy
mov edx,tl_box_left
shl edx,16
mov dx,ax
add edx,tl_box_top
add dx,tl_capt_cy
 
;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:
 
mov eax,7
int 0x40 ;ðèñóåì èêîíêó êóðñîðà
.end_f:
pop esi edx ecx ebx eax
ret
 
;input:
; edi = pointer to TreeInfo struct
; esi = coord bottom border
align 4
tl_draw_null_cursor: ;ñòèðàåì êóðñîð íà ýêðàíå
push eax ebx ecx edx esi
call tl_get_display_cur_pos ;eax = cursor pos in screen
cmp eax,0
jl .end_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
 
sub esi,ecx
shl ecx,16
mov cx,tl_img_cy
cmp si,tl_img_cy
jge @f
mov cx,si ;åñëè êóðñîð âèäåí ÷àñòè÷íî (ïîïàë íà íèæíþþ ãðàíèöó)
@@:
 
mov edx,tl_col_bkg
mov eax,13
int 0x40 ;ðèñóåì ïðîñòîé ïðÿìîóãîëüíèê ñ ôîíîâûì öâåòîì
 
.end_f:
pop esi edx ecx ebx eax
ret
 
;input:
; edi = pointer to TreeInfo struct
;output:
; eax = index
align 4
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]
sub eax,ebx ;îòíèìàåì ïîçèöèþ ñêðîëëèíãà
pop ebx
@@:
ret
 
;input:
; eax = node position
; edx = pointer to some node struct
; edi = pointer to TreeInfo struct
; esi = coord of bottom border
align 4
tl_draw_node:
push eax ebx ecx edx esi
 
mov ebx,1 ;1 - ìåñòî ïîä êóðñîð è ïîä çíàê +,-
bt tl_style,2 ;tl_list_box_mode
jc @f
inc ebx ;+1 - ìåñòî ïîä çíàê +,-
@@:
add bl,byte[edx+2];get level
imul bx,tl_img_cx
add 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_draw
 
sub esi,ecx
shl ecx,16
mov cx,tl_img_cy
cmp si,tl_img_cy
jge @f
mov cx,si ;åñëè óçåë âèäåí ÷àñòè÷íî (ïîïàë íà íèæíþþ ãðàíèöó)
jmp .crop ;ïðîïóñêàåì ðèñîâàíèå íàäïèñè, êîòîðàÿ ñêîðåå âñåãî òîæå âûëåçåò çà íèæíþþ ãðàíèöó
@@:
call tl_draw_node_caption
.crop:
mov esi,ecx ;save ecx
 
cmp dword[edi+18],0 ;data_img
jne .draw_img_n
push edx
mov edx,tl_col_txt
mov eax,13
int 0x40 ;draw node rect
pop edx
jmp @f
.draw_img_n:
push ebx edx esi
xor esi,esi
mov si,word[edx] ;get icon type
mov edx,ebx
ror ecx,16
mov dx,cx
mov cx,bx
ror ecx,16
mov ebx,3 ;rgb = 3 bytes
imul bx,tl_img_cx
imul bx,tl_img_cy
imul ebx,esi ;esi = icon index
add ebx,dword[edi+18] ;data_img
 
mov eax,7
int 0x40 ;draw node icon '-'
pop esi edx ebx
@@:
 
mov al,byte[edx+2] ;draw minus '-'
mov ecx,dword[edi+14]
add ecx,sizeof.TreeList
 
mov ah,10 ;get icon index '+' or '-' ?
cmp byte[edx+3],1
jne .close
dec ah
.close:
 
call tl_draw_node_icon_opn_clo
bt tl_style,1
jae .end_draw
call tl_draw_node_icon_par_lin
 
.end_draw:
pop esi edx ecx ebx eax
ret
 
;input:
; ecx = pointer to 1 node struct
;...
align 4
tl_draw_node_icon_opn_clo:
push eax ebx ecx edx esi
inc al
call tl_iterat_next_all ;get next visible item
cmp edx,ecx
jle @f
mov ecx,esi ;load ecx
cmp al,byte[edx+2]
jne @f
ror ebx,16
sub bx,tl_img_cx
ror ebx,16
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
jmp @f
.draw_img_s:
mov ecx,esi ;load ecx
mov edx,ebx
ror ecx,16
mov dx,cx
mov cx,bx
ror ecx,16
mov ebx,3 ;rgb = 3 bytes
imul bx,tl_img_cx
imul bx,tl_img_cy
shr eax,8
and eax,0xff
imul ebx,eax ;eax = icon index
add ebx,tl_data_img_sys
mov eax,7
int 0x40 ;draw minus icon '-'
@@:
pop esi edx ecx ebx eax
ret
 
;input:
;...
align 4
tl_draw_node_icon_par_lin:
cmp byte[edx+3],1
je .close
push eax ebx ecx edx esi
cmp al,0
je @f
; dec al
; call tl_iterat_perv ;get perv visible item
 
call tl_iterat_next_all ;get next visible item
cmp edx,ecx
jle .line3 ;if end of list
cmp al,byte[edx+2]
jne .line3 ;jg ???
mov eax,3 ;line in middle element
jmp .line2
.line3:
mov eax,6 ;line in end element
.line2:
 
mov ecx,esi ;load ecx
ror ebx,16
sub bx,tl_img_cx
ror ebx,16
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
jmp @f
.draw_img_s:
mov ecx,esi ;load ecx
mov edx,ebx
ror ecx,16
mov dx,cx
mov cx,bx
ror ecx,16
mov ebx,3 ;rgb = 3 bytes
imul bx,tl_img_cx
imul bx,tl_img_cy
 
; shr eax,8
; and eax,0xff
imul ebx,eax ;eax = icon index
add ebx,tl_data_img_sys
mov eax,7
int 0x40 ;draw line icon
@@:
pop esi edx ecx ebx eax
.close:
ret
 
;input:
; edi = pointer to TreeInfo struct
;output:
; eax = rows
align 4
tl_get_rows_count:
push ecx edx
mov eax,tl_box_height
sub ax,tl_capt_cy
xor ecx,ecx
mov cx,tl_img_cy
xor edx,edx
div ecx
pop edx ecx
ret
 
;input:
; eax = node position
; ebx = [êîîðäèíàòà ïî îñè x]*65536 + [img_cx]
; ecx = [êîîðäèíàòà ïî îñè y]*65536 + [img_cy]
; edx = pointer to some node struct
; edi = pointer to TreeInfo struct
align 4
tl_draw_node_caption:
push ebx ecx edx esi
 
xor esi,esi
mov si,word[edi+4];info_size
cmp esi,tl_info_capt_offs
jle @f ;if caption size <= 0
 
push eax
call tl_get_node_index ;eax = node index
imul esi,eax
pop eax
add esi,dword[edi]
add esi,tl_info_capt_offs
mov edx,esi
 
shr ebx,16
add bx,tl_img_cx ;ñäâèãàåì íàäïèñü ïî ãîðèçîíòàëè --->
add bx,3 ;îòñòóï
;bx = coord. x
call tl_strlen ;eax = strlen
call tl_get_draw_text_len
mov cx,bx
ror ecx,16
mov ebx,ecx
add bx,tl_img_cy ;âûðàâíèâèíèå ïî íèæíåé ãðàíèöå èêîíêè
sub bx,9 ;îòíèìàåì âûñîòó òåêñòà
mov ecx,tl_col_txt
and ecx,0xffffff
; or ecx,0x80000000 ;text is ASCIIZ
mov eax,4
int 0x40
@@:
pop esi edx ecx ebx
ret
 
;input:
; eax = strlen
; ebx = text coord x
;output:
; esi = text len
align 4
tl_get_draw_text_len:
push eax ecx edx
mov esi,eax ;áåðåì äëèííó ñòðîêè
 
mov eax,tl_box_left
add eax,tl_box_width
cmp eax,ebx
jle .text_null ;åñëè ïîäïèñü ïîëíîñòüþ âñÿ çà ýêðàíîì
sub eax,ebx
xor edx,edx
mov ecx,6 ;øèðèíà ñèñòåìíîãî øðèôòà
div ecx ;ñìîòðèì ñêîëüêî ñèìâîëîâ ìîæåò ïîìåñòèòüñÿ íà ýêðàíå
 
cmp esi,eax
jl @f
mov esi,eax ;åñëè äëèííà òåêñòà ìåíüøå, ÷åì âñå ìåñòî ïîä ñòðîêó
jmp @f
.text_null:
xor esi,esi
@@:
pop edx ecx eax
ret
 
;input:
; esi = pointer to string
;output:
; eax = strlen
align 4
tl_strlen:
mov eax,esi
@@:
cmp byte[eax],0
je @f
inc eax
loop @b
@@:
sub eax,esi
ret
 
;input:
;dword[ebp+ 8] - pointer to node info
;dword[ebp+12] - options
;dword[ebp+16] - pointer to 'TreeList' struct
align 4
tl_node_add: ;äîáàâèòü óçåë
push ebp
mov ebp,esp
push eax ebx ecx edx edi
mov edi,dword[ebp+16]
 
call tl_info_set_undo
 
mov ebx,sizeof.TreeList
imul ebx,dword[edi+6] ;+6 ìàêñ. êîëè÷åñòâî óçëîâ
add ebx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
;--
call tl_get_cur_node_index ;eax=po_t
imul eax,sizeof.TreeList
add eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
mov edx,eax
call tl_move_perv
call tl_get_node_index ;eax = index of pointer [edx]
;--
mov edx,sizeof.TreeList
shl edx,1
add edx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
@@: ;for(i=2;i<texMax;i++)
cmp dword [edx+12],0
jne .u0
cmp dword [edx+16],0
jne .u0
 
inc tl_ch_tim
push word[ebp+14] ;get type
pop word[edx]
mov byte[edx+2], 0 ;node[i].lev=0
push tl_ch_tim ;node[i].tc=ch_tim;
pop dword[edx+12]
mov dword[edx+4], eax ;node[i].perv=po_t;
;*** copy node data ***
push esi
xor ecx,ecx
mov cx,word[edi+4];info_size
mov esi,ecx
 
push eax
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
xchg edi,esi
rep movsb
 
mov esi,edi
mov edi,dword[ebp+16] ;restore edi
mov ecx,tl_info_capt_offs
cmp cx,word[edi+4] ;+4 info_size
jge .no_text_data
dec esi
mov byte[esi],0
.no_text_data:
pop esi ;restore esi
 
mov ecx,eax
imul ecx,sizeof.TreeList
add ecx,dword[edi+14] ; *** ecx = tex[po_t] ***
add ecx,8 ; *** ecx = tex[po_t].next ***
push dword [ecx] ;tex[i].next=tex[po_t].next;
pop dword [edx+8]
 
call tl_get_node_index ;*** eax = i ***
cmp eax,dword[edi+6] ;info_max_count
jge .u0
 
mov [ecx],eax ;tex[po_t].next=i; // ññûëêè ïåðåíàïðàâëÿåì
mov ecx,[edx+8] ; *** ecx = tex[i].next ***
imul ecx,sizeof.TreeList
add ecx,dword[edi+14] ; *** ecx = tex[tex[i].next] ***
mov [ecx+4],eax ;tex[tex[i].next].perv=i;
 
call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
jmp @f
.u0:
add edx,sizeof.TreeList
cmp edx,ebx ;enf of node memory ?
jle @b
@@:
pop edi edx ecx ebx eax
pop ebp
ret 12
 
;input:
; edi = pointer to TreeInfo struct
align 4
tb_scrol_resize:
push eax ecx edx
cmp tl_p_scrol,0 ;îáðàáîòêà ñêðîëëèíãà
je @f
call tl_get_node_count ;eax = node count
mov ecx,eax
call tl_get_rows_count
cmp ecx,eax
jg .ye_sb
xor ecx,ecx
.ye_sb:
 
mov edx,tl_p_scrol
mov dword[edx+20],eax ;+20 .cur_area
mov dword[edx+16],ecx ;+16 .max_area
push dword edx ;pointer to scroll struct
mov edx,tl_sb_draw ;pointer to scroll draw function
call dword[edx]
@@:
pop edx ecx eax
ret
 
;input:
;dword[ebp+ 8] - pointer to node info
;dword[ebp+12] - pointer to 'TreeList' struct
align 4
tl_node_set_data:
push ebp
mov ebp,esp
push eax ecx edx edi esi
mov edi,dword[ebp+12]
call tl_get_cur_node_index ;eax=po_t
cmp eax,2
jl @f
xor ecx,ecx
mov cx,word[edi+4];info_size
imul eax,ecx
add eax,dword[edi]
mov edi,eax
mov esi,dword[ebp+8] ;pointer to node data
rep movsb
 
mov esi,edi
mov edi,dword[ebp+12] ;restore edi
mov ecx,tl_info_capt_offs
cmp cx,word[edi+4] ;+4 info_size
jge .no_text_data
dec esi
mov byte[esi],0
.no_text_data:
 
@@:
pop esi edi edx ecx eax
pop ebp
ret 8
 
;input:
;dword[ebp+ 8] - pointer to 'TreeList' struct
align 4
tl_node_get_data: ;âçÿòü óêàçàòåëü íà äàííûå óçëà ïîä êóðñîðîì
push ebp
mov ebp,esp
push eax ecx edi
mov edi,dword[ebp+8]
call tl_get_cur_node_index ;eax=po_t
mov dword[ebp+8],0 ;if return 0 pointer
cmp eax,2
jl @f
xor ecx,ecx
mov cx,word[edi+4];info_size
imul eax,ecx
add eax,dword[edi]
mov dword[ebp+8],eax ;return node data pointer
@@:
pop edi ecx eax
pop ebp
ret
 
;input:
;dword[ebp+ 8] - node index
;dword[ebp+12] - pointer to 'TreeList' struct
align 4
tl_node_poi_get_info: ;âçÿòü óêàçàòåëü íà ñòðóêòóðó óçëà â óêàçàííîé ïîçèöèè
push ebp
mov ebp,esp
push eax ecx edx edi
mov edi,dword[ebp+12]
mov eax,dword[ebp+8]
 
;cycle to nodes
mov edx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
mov ecx,edx
add ecx,sizeof.TreeList
@@:
call tl_iterat_next_all
cmp edx,ecx
jle @f
dec eax
cmp eax,0
jg @b
jmp .find
@@:
xor edx,edx
.find:
mov dword[ebp+12],edx
pop edi edx ecx eax
pop ebp
ret 4
 
;input:
;dword[ebp+ 8] - node param struct
;dword[ebp+12] - pointer to 'TreeList' struct
align 4
tl_node_poi_get_next_info: ;âçÿòü óêàçàòåëü íà ñëåäóùóþ ñòðóêòóðó óçëà
push ebp
mov ebp,esp
push ecx edx edi
mov edi,dword[ebp+12]
mov edx,dword[ebp+8]
 
mov ecx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
add ecx,sizeof.TreeList
 
call tl_iterat_next_all
cmp edx,ecx
jg @f
xor edx,edx
@@:
 
mov dword[ebp+12],edx
pop edi edx ecx
pop ebp
ret 4
 
;input:
;dword[ebp+ 8] - node param struct
;dword[ebp+12] - pointer to 'TreeList' struct
align 4
tl_node_poi_get_data: ;âçÿòü óêàçàòåëü íà äàííûå óçëà
push ebp
mov ebp,esp
push eax ecx edi
mov edi,dword[ebp+12]
mov edx,dword[ebp+8]
 
mov dword[ebp+12],0
call tl_get_node_index ;eax = node index
cmp eax,2
jl @f
xor ecx,ecx
mov cx,word[edi+4];info_size
imul eax,ecx
add eax,dword[edi]
mov dword[ebp+12],eax ;return node data pointer
@@:
pop edi ecx eax
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
;cycle to nodes
xor eax,eax
mov edx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
mov ecx,edx
add ecx,sizeof.TreeList
@@:
call tl_iterat_next
cmp edx,ecx
jle @f
cmp eax,tl_cur_pos
je @f
inc eax
jmp @b
@@:
mov eax,edx
sub eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
xor edx,edx
mov ecx,sizeof.TreeList
div ecx
pop edx ecx
ret
 
;input:
; edx = pointer node memory
; edi = pointer 'tl' struct
;output:
; eax = struct index of current node
align 4
tl_get_node_index: ;áåðåò ïîçèöèþ óêàçàííîãî ñèìâîëà
push ecx edx
mov eax,edx
sub eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
xor edx,edx
mov ecx,sizeof.TreeList
div ecx
pop edx ecx
ret
 
align 4
tl_node_delete: ;óäàëèòü óçåë
push ebp
mov ebp,esp
push eax edx edi
mov edi,dword[ebp+8]
call tl_get_cur_node_index ;eax=po_t
cmp eax,2
jl @f
imul eax,sizeof.TreeList
add eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
mov edx,eax
inc tl_ch_tim
mov eax,tl_ch_tim
mov dword[edx+16],eax
call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
@@:
pop edi edx eax
pop ebp
ret 4
 
align 4
tl_cur_beg: ;ïîñòàâèòü êóðñîð íà ïåðâûé óçåë
push ebp
mov ebp,esp
push edi
mov edi,dword[ebp+8]
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]
mov edi,tl_sb_draw
call dword[edi]
@@:
pop edi
 
pop ebp
ret 4
 
align 4
tl_cur_next: ;ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ íèæå
push ebp
mov ebp,esp
push eax ebx edi esi
mov edi,dword[ebp+8]
call tl_get_node_count ;eax = node count
;inc eax
cmp tl_cur_pos,eax
jge .no_redraw
mov esi,tl_box_top
add esi,tl_box_height ;esi = coord bottom border
call tl_draw_null_cursor ;ñòèðàåì êóðñîð
inc tl_cur_pos
 
cmp tl_p_scrol,0 ;if not scrol struct
je @f
call tl_get_rows_count ;eax = rows count
mov ebx,tl_p_scrol
add eax,dword[ebx+24] ;.position +24
cmp tl_cur_pos,eax
jl @f
inc dword[ebx+24] ;.position +24
push dword ebx
mov edi,tl_sb_draw ;ïåðåðèñîâêà ñêðîëëèíãà
call dword[edi]
 
mov edi,dword[ebp+8] ;restore edi
push dword edi
call tl_draw ;ïîëíàÿ ïåðåðèñîâêà îêíà
jmp .no_redraw
@@:
mov edi,dword[ebp+8] ;restore edi
call tl_draw_cursor ;ïåðåðèñîâêà êóðñîðà
.no_redraw:
pop esi edi ebx eax
pop ebp
ret 4
 
 
;input:
; edi = pointer 'tl' struct
;output:
; eax = struct index of current node
align 4
tl_get_node_count: ;áåðåò ÷èñëî âñåõ âèäèìûõ óçëîâ (íå ñ÷èòàÿ çàêðûòûõ äî÷åðíèõ)
push ecx edx
;cycle to nodes
xor eax,eax
mov edx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
mov ecx,edx
add ecx,sizeof.TreeList
@@:
call tl_iterat_next
cmp edx,ecx
jle @f
inc eax
jmp @b
@@:
pop edx ecx
ret
 
align 4
tl_cur_perv: ;ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ âûøå
push ebp
mov ebp,esp
push eax edi esi
mov edi,dword[ebp+8]
cmp tl_cur_pos,0
je .no_redraw
mov esi,tl_box_top
add esi,tl_box_height ;esi = coord bottom border
call tl_draw_null_cursor ;ñòèðàåì êóðñîð
dec tl_cur_pos ;äâèãàåì êóðñîð ââåðõ
 
cmp tl_p_scrol,0 ;åñëè åñòü óêàçàòåëü íà ñêðîëëèíã
je @f
mov eax,tl_p_scrol
cmp dword[eax+24],0 ;åñëè ñêðîëëèíã íà âåðõó, âûõîäèì
je @f
mov edi,tl_cur_pos
cmp edi,dword[eax+24] ;åñëè êóðñîð óøåë âûøå ñêðîëëèíãà, òîãäà îïóñêàåì ñêðîëëèíã
jge @f
dec dword[eax+24]
push dword eax
mov edi,dword[ebp+8]
mov edi,tl_sb_draw ;.redraw
call dword[edi]
mov edi,dword[ebp+8] ;restore edi
push dword edi
call tl_draw ;ïîëíàÿ ïåðåðèñîâêà îêíà
jmp .no_redraw
@@:
mov edi,dword[ebp+8] ;restore edi
;mov esi,tl_box_top
;add esi,tl_box_height ;esi = coord bottom border
call tl_draw_cursor ;ïåðåðèñîâêà êóðñîðà
.no_redraw:
pop esi edi eax
pop ebp
ret 4
 
align 4
tl_node_close_open: ;îòêðûòü/çàêðûòü óçåë (ðàáîòàåò ñ óçëàìè êîòîðûå èìåþò äî÷åðíèå óçëû)
push ebp
mov ebp,esp
push eax edx edi
mov edi,dword[ebp+8]
call tl_get_cur_node_index ;eax = ïîçèöèÿ óçëà íà êîòîðîì ñòîèò êóðñîð
cmp eax,2 ;êóðñîð ñòîèò íà óçëå ?
jl @f
imul eax,sizeof.TreeList
add eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
;eax = óêàçàòåëü íà ñòðóêòóðó óçëà âûáðàííîãî êóðñîðîì
push dword edi
push dword eax
call tl_node_poi_get_next_info
pop dword edx ;edx = óêàçàòåëü íà ñòðóêòóðó óçëà êîòîðûé èäåò ïîñëå óçëà eax
cmp edx,0 ;åñòü ëè óçëû íèæå âûáðàííîãî íàìè ?
je @f
mov dl,byte[edx+2] ;áåðåì óðîâåíü íèæíåãî óçëà
cmp byte[eax+2],dl ;+2 = .lev
jge @f ;åñëè íèæíèå óçëû ìåíüøåãî óðîâíÿ, çíà÷èò îíè íå äî÷åðíèå, êîíåö ôóíêöèè
xor byte[eax+3],1 ;+3 = .clo *** îòêðûòèå/çàêðûòèå óçëà ***
call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
 
push dword edi
call tl_draw ;îáíîâëåíèå îêíà
@@:
pop edi edx eax
pop ebp
ret 4
 
align 4
tl_node_lev_inc: ;óâåëè÷èòü óðîâåíü
push ebp
mov ebp,esp
push eax edx edi
mov edi,dword[ebp+8]
bt tl_style,2 ;tl_list_box_mode
jc @f
call tl_get_cur_node_index ;eax=po_t
cmp eax,2
jl @f
imul eax,sizeof.TreeList
add eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
mov edx,eax
inc word[edx+2]
@@:
pop edi edx eax
pop ebp
ret 4
 
align 4
tl_node_lev_dec: ;óìåíüøèòü óðîâåíü
push ebp
mov ebp,esp
push eax edx edi
mov edi,dword[ebp+8]
call tl_get_cur_node_index ;eax=po_t
cmp eax,2
jl @f
imul eax,sizeof.TreeList
add eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
mov edx,eax
cmp word[edx+2],0
je @f
dec word[edx+2]
@@:
pop edi edx eax
pop ebp
ret 4
 
txt_capt_cur db '‘âப ',0
txt_capt_otm db 'Žâ¬¥­ë',0
}
/programs/develop/libraries/box_lib/trunk/tree_list_doc/info_treelist.htm
0,0 → 1,175
<html>
<head>
<title>ýëåìåíò Tree List</title>
<meta http-equiv="content-type" content="text/html; charset=WINDOWS-1251">
<style>
body
{
font-size: 15px;
font-family: "Bookman Old Style";
color: black;
text-align: justify;
}
h1 { color: green; font-size: 23px; }
h2 { color: green; font-size: 21px; }
h3 { color: green; font-size: 19px; }
h4 { color: #803f00; font-size: 17px; }
i { color: #0099cc; }
b { color: #0099cc; }
p {
text-indent: 1em;
margin-top: 3px;
margin-bottom: 2px;
margin-left: 0px;
margin-right: 0px;
}
ol, ul, dl{
margin-top: 3px;
margin-bottom: 2px;
}
pre
{
padding: 2px;
padding-left: 20px;
margin-top: 5px;
margin-bottom: 5px;
margin-left: 0px;
margin-right: 0px;
font-family: "Courier New";
font-size: 15px;
color: #004000;
background-color: #ffd0ff;
}
table { font-size: 15px; }
</style>
</head>
<body>
<h1>Îãëàâëåíèå</h1>
<p>Ââåäåíèå</p>
<p>Ôóíêöèè</p>
<ul>
<li>tl_data_init</li>
<li>tl_data_clear</li>
<li>tl_info_clear</li>
<li>tl_key</li>
<li>tl_mouse</li>
<li>tl_draw</li>
<li>tl_info_undo</li>
<li>tl_info_redo</li>
<li>tl_node_add</li>
<li>tl_node_set_data</li>
<li>tl_node_get_data</li>
<li>tl_node_delete</li>
<li>tl_cur_beg</li>
<li>tl_cur_next</li>
<li>tl_cur_perv</li>
<li>tl_node_close_open</li>
<li>tl_node_lev_inc</li>
<li>tl_node_lev_dec</li>
<li>tl_node_poi_get_info</li>
<li>tl_node_poi_get_next_info</li>
<li>tl_node_poi_get_data</li>
<li>version_tree_list</li>
</ul>
<p>Ñòèëè ýëåìåíòà</p>
 
<h1>Ââåäåíèå</h1>
<p>Âíåøíèé âèä ýëåìåíòà óïðàâëåíèÿ TreeList:</p>
<p><img src="window_tree_list.png"></p>
 
<h1>Ôóíêöèè</h1>
 
<h2>tl_data_init</h2>
<p>Êîíñòðóêòîð ýëåìåíòà, íóæíî âûçûâàòü ïåðåä èñïîëüçîâàíèåì ýëåìåíòà äëÿ âûäåëåíèÿ ïàìÿòè è äðóãèõ íàñòðîåê.</p>
<h2>tl_data_clear</h2>
<p>Äåñòðóêòîð ýëåìåíòà.</p>
<h2>tl_info_clear</h2>
<p>Î÷èñòêà ñïèñêà îò âñåõ óçëîâ.</p>
<h2>tl_key</h2>
<p>Ôóíêöèÿ êîòîðóþ íóæíî âûçûâàòü ïðè íàæàòèè íà êëàâèàòóðó.</p>
<h2>tl_mouse</h2>
<p>Ôóíêöèÿ äëÿ ñîáûòèé îò ìûøè.</p>
<h2>tl_draw</h2>
<p>Ïîëíàÿ ïåðåðèñîâêà îêíà ýëåìåíòà.</p>
<h2>tl_info_undo</h2>
<p>Îòìåíÿåò äîáàâëåíèå óçëîâ. Äåéñòâóåò òîëüêî íà âåñü óçåë öåëèêîì, íå ó÷èòûâàÿ èçìåíåíèÿ âíóòðè óçëîâ. Ò. å. íåëüçÿ îòìåíèòü äåéñòâèÿ âûïîëíåííûå íàïðèìåð ôóíêöèÿìè: <b>tl_node_set_data</b>, <b>tl_node_lev_inc</b> è èì ïîäîáíûì.</p>
<h2>tl_info_redo</h2>
<p></p>
<h2>tl_node_add</h2>
<p>Äîáàâëÿåò óçåë, â ïîçèöèþ óêàçàííóþ êóðñîðîì.</p>
<h2>tl_node_set_data</h2>
<p>Óñòàíàâëèâàåò íîâûå äàííûå (ïîëüçîâàòåëüñêèå è ïîäïèñü) â óçåë ïîä êóðñîðîì.</p>
<h2>tl_node_get_data</h2>
<p>Áåðåò óêàçàòåëü íà äàííûå (ïîëüçîâàòåëüñêèå è ïîäïèñü) èç óçëà ïîä êóðñîðîì.</p>
<h2>tl_node_delete</h2>
<p>Óäàëÿåò óçåë, íî íå îêîí÷àòåëüíî, ïðè íåîáõîäèìîñòè óçåë ìîæíî âåðíóòü ôóíêöèåé <b>tl_info_undo</b>.</p>
<h2>tl_cur_beg</h2>
<p>Ñòàâèò êóðñîð â íà÷àëî ñïèñêà, ïåðåìàòûâàåò ñêðîëëèíã åñëè íóæíî.</p>
<h2>tl_cur_next</h2>
<p>Ïåðåíîñèò êóðñîð íèæå.</p>
<h2>tl_cur_perv</h2>
<p>Ïåðåíîñèò êóðñîð âûøå.</p>
<h2>tl_node_close_open</h2>
<p>Îòêðûâàåò èëè çàêðûâàåò ðîäèòåëüñêèé óçåë. Åñëè ó óçëà íåò äî÷åðíèõ ýëåìåíòîâ,
òî íè÷åãî íå äåëàåò. Àâòîìàòè÷åñêè ïåðåðèñîâûâàåò îêíî åñëè ñîñòîÿíèå óçëà èçìåíèëîñü.</p>
<h2>tl_node_lev_inc</h2>
<p>Äîáàâèòü óðîâåíü óçëà ïîä êóðñîðîì. Äåëàåò óçåë äî÷åðíèì.</p>
<h2>tl_node_lev_dec</h2>
<p>Óìåíüøàåò óðîâåíü óçëà ïîä êóðñîðîì. Äåëàåò óçåë ðîäèòåëüñêèì.</p>
<h2>tl_node_poi_get_info</h2>
<p>Áåðåò âíóòðåííèé óêàçàòåëü íà ñòðóêòóðó îïèñûâàþùóþ óçåë.</p>
<h2>tl_node_poi_get_next_info</h2>
<p></p>
<h2>tl_node_poi_get_data</h2>
<p>Áåðåò óêàçàòåëü íà äàííûå (ïîëüçîâàòåëüñêèå è ïîäïèñü) èç óçëà óêàçàííîãî â óêàçàòåëå.</p>
<h2>version_tree_list</h2>
<p>Âåðñèÿ ýëåìåíòà</p>
 
<h1>Ñòðóêòóðà tree_list</h1>
<pre>struc tree_list info_size,info_max_count,style, img_cx,img_cy,\
col_bkg,col_zag,col_txt, box_l,box_t,box_w,box_h, capt_cy,info_capt_offs,\
el_focus, p_scrol,p_sb_draw,fun_enter {
.data_info dd 0
.info_size dw info_size
.info_max_count dd info_max_count
.style dd style
.data_nodes dd 0
.data_img dd 0
.img_cx dw img_cx
.img_cy dw img_cy
.data_img_sys dd 0
.ch_tim dd 0
.ls_tim dd 0
.tim_undo dd 0
.cur_pos dd 0
.col_bkg dd col_bkg
.col_zag dd col_zag
.col_txt dd col_txt
.box_lert dd box_l
.box_top dd box_t
.box_width dd box_w
.box_height dd box_h
.capt_cy dw capt_cy
.info_capt_offs dd info_capt_offs
.el_focus dd el_focus
.p_scrol dd p_scrol
.p_sb_draw dd p_sb_draw
.on_activate dd 0
.on_press dd fun_enter
}</pre>
<p><b>data_img</b> - óêàçàòåëü íà èçîáðàæåíèÿ ñ èêîíêàìè óçëîâ.</p>
<p><b>data_img_sys</b> - óêàçàòåëü íà ñèñòåìíûå èçîáðàæåíèÿ (êóðñîð, ïëþñèêè, ëèíèè, ... âñå êðîìå èêîíîê óçëîâ).</p>
<p><b>p_scrol</b> - óêàçàòåëü íà ñòðóêòóðó ñêðîëëèíãà, ñâÿçàííîãî ñ äàííûì ýëåìåíòîì.</p>
<p><b>p_sb_draw</b> - óêàçàòåëü íà ôóíêöèþ ïåðåðèñîâêè âåðòèêàëüíîãî ñêðîëëèíãà (<i>scrollbar_ver_draw</i>).</p>
<p><b>fun_enter</b> - óêàçàòåëü íà ôóíêöèþ, êîòîðàÿ áóäåò âûçâàíà ïðè íàæèòèè <b>[Enter]</b>. Åñëè óêàçàòåëü ðàâåí 0 òî íè÷åãî íå áóäåò âûçûâàòñÿ.</p>
 
<h1>Ñòèëè ýëåìåíòà</h1>
<h2>tl_key_no_edit</h2>
<p>Ýëåìåíò íåëüçÿ ðåäàêòèðîâàòü íà êëàâèàòóðå (èçìåíÿòü óðîâíè, óäàëÿòü). Ñòàâüòå ýòîò ñòèëü åñëè íóæíî ñîçäàòü ýëåìåíò òîëüêî äëÿ ïðîñìîòðà äàííûõ.</p>
<h2>tl_draw_par_line</h2>
<p>Ðèñîâàòü ëèíèè ê ðîäèòåëüñêîìó óçëó.</p>
<h2>tl_list_box_mode</h2>
<p>Ñòèëü íå îòîáðàæàåò óðîâíè (êàê â ListBox âñå óçëû îäíîãî óðîâíÿ).</p>
 
</body>
</html>
/programs/develop/libraries/box_lib/trunk/tree_list_doc/window_tree_list.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/develop/libraries/box_lib/trunk/tree_list_doc
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property