update functions: tl_mouse, tl_node_add

update documentation

git-svn-id: svn://kolibrios.org@1283 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
IgorA 2009-11-23 09:33:00 +00:00
parent 7b9c6b519b
commit c44423f7ec
2 changed files with 128 additions and 118 deletions

View File

@ -1,12 +1,23 @@
; ìàêðîñ äëÿ ñèñòåìíîé áèáëèîòåêè box_lib.obj ; ìàêðîñ äëÿ ñèñòåìíîé áèáëèîòåêè box_lib.obj
; ýëåìåíò TreeList äëÿ Kolibri OS ; ýëåìåíò TreeList äëÿ Kolibri OS
; файл последний раз изменялся 20.11.2009 IgorA ; ôàéë ïîñëåäíèé ðàç èçìåíÿëñÿ 23.11.2009 IgorA
; íà êîä ïðèìåíåíà GPL2 ëèöåíçèÿ ; íà êîä ïðèìåíåíà GPL2 ëèöåíçèÿ
sizeof.TreeList equ 20 sizeof.TreeList equ 20
;struct TreeList
; type dw ? ;+ 0 òèï ýëåìåíòà, èëè èíäåêñ èêîíêè äëÿ óçëà
; lev db ? ;+ 2 óðîâåíü ýëåìåíòà
; clo db ? ;+ 3 ôëàã çàêðûòèÿ, èëè îòêðûòèÿ (èìååò ñìûñë äëÿ ðîäèòåëüñêîãî óçëà)
; perv dd ? ;+ 4 èíäåêñ ïðåäûäóùåãî ýëåìåíòà
; next dd ? ;+ 8 èíäåêñ ïîñëåäóþùåãî ýëåìåíòà
; tc dd ? ;+12 âðåì. ñîçäàíèÿ
; td dd ? ;+16 âðåì. óäàëåíèÿ
;ends
tl_info_size equ word[edi +4] ;ðàçìåð äàííûõ âûäåëÿåìûõ äëÿ êàæäîãî óçëà (ïîëüçîâàòåëüñüêèå äàííûå + òåêñò äëÿ ïîäïèñè)
tl_style equ dword[edi+10] ;ñòèëè ýëåìåíòà tl_style equ dword[edi+10] ;ñòèëè ýëåìåíòà
tl_data_nodes equ dword[edi+14] ;óêàçàòåëü íà ñòðóêòóðû óçëîâ
tl_img_cx equ word[edi+22] ;øèðèíà èêîíîê tl_img_cx equ word[edi+22] ;øèðèíà èêîíîê
tl_img_cy equ word[edi+24] ;âûñîòà èêîíîê tl_img_cy equ word[edi+24] ;âûñîòà èêîíîê
tl_data_img_sys equ dword[edi+26] ;óêàçàòåëü íà ñèñòåìíûå èçîáðàæåíèÿ (ñòðåëêè, ïëþñèêè) tl_data_img_sys equ dword[edi+26] ;óêàçàòåëü íà ñèñòåìíûå èçîáðàæåíèÿ (ñòðåëêè, ïëþñèêè)
@ -21,7 +32,7 @@ tl_box_top equ dword[edi+62]
tl_box_width equ dword[edi+66] tl_box_width equ dword[edi+66]
tl_box_height equ dword[edi+70] tl_box_height equ dword[edi+70]
tl_capt_cy equ word[edi+74] ;âûñîòà ïîäïèñè tl_capt_cy equ word[edi+74] ;âûñîòà ïîäïèñè
tl_info_capt_offs equ dword[edi+76] tl_info_capt_offs equ dword[edi+76] ;ñäâèã äëÿ íà÷àëà òåêñòà (ïîäïèñè óçëà)
tl_el_focus equ dword[edi+80] ;óêàçàòåëü íà ñòðóêòóðó ýëåìåíòà â ôîêóñå tl_el_focus equ dword[edi+80] ;óêàçàòåëü íà ñòðóêòóðó ýëåìåíòà â ôîêóñå
tl_p_scrol equ dword[edi+84] ;óêàçàòåëü íà ñòðóêòóðó ñêðîëëèíãà tl_p_scrol equ dword[edi+84] ;óêàçàòåëü íà ñòðóêòóðó ñêðîëëèíãà
tl_sb_draw equ dword[edi+88] ;óêàçàòåëü íà ôóíêöèþ ïåðåðèñîâûâàþùóþ ñêðîëëèíã tl_sb_draw equ dword[edi+88] ;óêàçàòåëü íà ôóíêöèþ ïåðåðèñîâûâàþùóþ ñêðîëëèíã
@ -32,49 +43,15 @@ tl_key_no_edit equ 1b ;
tl_draw_par_line equ 10b ;ðèñîâàòü ëèíèè ê ðîäèòåëüñêîìó óçëó tl_draw_par_line equ 10b ;ðèñîâàòü ëèíèè ê ðîäèòåëüñêîìó óçëó
tl_list_box_mode equ 100b ;ñòèëü íå îòîáðàæàåò óðîâíè (êàê â ListBox âñå îäíîãî óðîâíÿ) tl_list_box_mode equ 100b ;ñòèëü íå îòîáðàæàåò óðîâíè (êàê â ListBox âñå îäíîãî óðîâíÿ)
macro use_tree_list_structs ;data_info dd ? ;+ 0 óêàçàòåëü íà îñíîâíûå äàíûå
{ ;info_max_count dd ? ;+ 6 ìàêñèìàëüíîå êîëëè÷åñòâî ñòðóêòóð
struct TreeInfo ;data_img dd ? ;+18 óêàçàòåëü íà èçîáðàæåíèÿ
data_info dd ? ;+ 0 указатель на основные даные ;ls_tim dd ? ;+34 âðåìÿ ïîñëåäíåãî ñîõðàíåíèÿ
info_size dw ? ;+ 4 размер информационной структуры (пользовательськие данные + текст для подписи) ;on_activate dd ? ;+92 óêàçàòåëü íà ôóíêöèþ ïðè àêòèâèðîâàíèè óçëà
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,\ 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,\ 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 { el_focus, p_scrol,p_sb_draw,on_press {
.data_info dd 0 .data_info dd 0
.info_size dw info_size .info_size dw info_size
.info_max_count dd info_max_count .info_max_count dd info_max_count
@ -101,7 +78,7 @@ struc tree_list info_size,info_max_count,style, img_cx,img_cy,\
.p_scrol dd p_scrol .p_scrol dd p_scrol
.p_sb_draw dd p_sb_draw .p_sb_draw dd p_sb_draw
.on_activate dd 0 .on_activate dd 0
.on_press dd fun_enter .on_press dd on_press
} }
;----------------------------------------------------------------------------- ;-----------------------------------------------------------------------------
@ -144,7 +121,7 @@ tl_data_init: ;
mov edi,dword[ebp+8] mov edi,dword[ebp+8]
xor ecx,ecx xor ecx,ecx
mov cx,word[edi+4] mov cx,tl_info_size
imul ecx,dword[edi+6] imul ecx,dword[edi+6]
call mem_Alloc call mem_Alloc
mov dword[edi],eax ;êîïèðóåì óêàçàòåëü íà ïîëó÷åíóþ ïàìÿòü â ñòðóêòóðó mov dword[edi],eax ;êîïèðóåì óêàçàòåëü íà ïîëó÷åíóþ ïàìÿòü â ñòðóêòóðó
@ -154,7 +131,7 @@ tl_data_init: ;
mov ecx,sizeof.TreeList mov ecx,sizeof.TreeList
imul ecx,dword[edi+6] imul ecx,dword[edi+6]
call mem_Alloc call mem_Alloc
mov dword[edi+14],eax ;копируем указатель на полученую память в структуру mov tl_data_nodes,eax ;êîïèðóåì óêàçàòåëü íà ïîëó÷åíóþ ïàìÿòü â ñòðóêòóðó
push dword edi push dword edi
call tl_info_clear call tl_info_clear
@ -202,7 +179,7 @@ tl_data_clear: ;
mov ecx,dword[edi] mov ecx,dword[edi]
call mem_Free call mem_Free
mov ecx,dword[edi+14] mov ecx,tl_data_nodes
call mem_Free call mem_Free
pop edi ecx pop edi ecx
pop ebp pop ebp
@ -221,13 +198,13 @@ tl_info_clear: ;
;xor ecx,ecx ;xor ecx,ecx
mov ecx,sizeof.TreeList mov ecx,sizeof.TreeList
imul ecx,dword[edi+6] imul ecx,dword[edi+6]
mov eax,dword[edi+14] mov eax,tl_data_nodes
@@: @@:
mov byte[eax],0 ;÷èñòèì óçëû 0-ìè mov byte[eax],0 ;÷èñòèì óçëû 0-ìè
inc eax inc eax
loop @b loop @b
mov eax,dword[edi+14] ;указатель на 1-й узел mov eax,tl_data_nodes ;óêàçàòåëü íà 0-é óçåë
mov dword[eax+8],1 ;указатель next в 1-м узле приравниваем к 1 mov dword[eax+8],1 ;óêàçàòåëü next â 0-ì óçëå ïðèðàâíèâàåì ê 1
call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
pop edi ecx eax pop edi ecx eax
pop ebp pop ebp
@ -314,9 +291,6 @@ tl_mouse: ;
bt eax,0 ;left mouse button press bt eax,0 ;left mouse button press
jae .no_draw jae .no_draw
mov ebx,tl_el_focus
mov dword[ebx],edi ;set focus
mov eax,37 mov eax,37
mov ebx,1 mov ebx,1
int 0x40 int 0x40
@ -342,6 +316,9 @@ tl_mouse: ;
cmp ax,bx ;âåðõíÿÿ ãðàíèöà îêíà + âûñîòà ïîäïèñè cmp ax,bx ;âåðõíÿÿ ãðàíèöà îêíà + âûñîòà ïîäïèñè
jl .no_in_wnd jl .no_in_wnd
mov esi,tl_el_focus
mov dword[esi],edi ;set focus
; if '+' or '-' press ; if '+' or '-' press
mov esi,eax mov esi,eax
shr esi,16 shr esi,16
@ -366,10 +343,13 @@ tl_mouse: ;
mov eax,ecx ;åñëè êóðñîð íå âûøåë çà ïðåäåëû óçëîâ, âîññòàíàâëèâàåì ñòàðîå çíà÷åíèå eax mov eax,ecx ;åñëè êóðñîð íå âûøåë çà ïðåäåëû óçëîâ, âîññòàíàâëèâàåì ñòàðîå çíà÷åíèå eax
@@: @@:
mov ebx,0x80000000 ;ставим флаг для выхода без обновления
cmp eax,tl_cur_pos ;åñëè íîâîå çíà÷åíèå êóðñîðà ñîâïàëî ñ ïðåäûäóùèì cmp eax,tl_cur_pos ;åñëè íîâîå çíà÷åíèå êóðñîðà ñîâïàëî ñ ïðåäûäóùèì
je @f ;то можем выйти без обновления окна je @f ;òî íå ñòèðàåì êóðñîð
xor ebx,ebx 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
@ -379,7 +359,7 @@ tl_mouse: ;
cmp eax,2 cmp eax,2
jl .no_open_close ;êóðñîð ñòîèò íà ïóñòîì ìåñòå, áåç óçëîâ jl .no_open_close ;êóðñîð ñòîèò íà ïóñòîì ìåñòå, áåç óçëîâ
imul eax,sizeof.TreeList imul eax,sizeof.TreeList
add eax,dword[edi+14] ;+14 указатель на структуры узлов add eax,tl_data_nodes
xor bx,bx xor bx,bx
mov bl,byte[eax+2] ;+2 lev ñîõðàíÿåì óðîâåíü òåêóùåãî óçëà mov bl,byte[eax+2] ;+2 lev ñîõðàíÿåì óðîâåíü òåêóùåãî óçëà
inc bx ;+ ïîëå äëÿ êóðñîðà inc bx ;+ ïîëå äëÿ êóðñîðà
@ -399,13 +379,14 @@ tl_mouse: ;
call tl_node_close_open call tl_node_close_open
.no_open_close: .no_open_close:
bt ebx,31 mov esi,tl_box_top
jc .no_draw add esi,tl_box_height ;esi = coord bottom border
push dword edi call tl_draw_cursor ;ïåðåðèñîâêà êóðñîðà
call tl_draw
jmp .no_draw jmp .no_draw
.no_in_wnd: ;не попали в окно - потеря фокуса .no_in_wnd: ;íå ïîïàëè â îêíî - ïîòåðÿ ôîêóñà (ïðè óñëîâèè ÷òî ôîêóñ áûë íà äàííîì ýåëåìåíòå)
mov ebx,tl_el_focus mov ebx,tl_el_focus
cmp dword[ebx],edi
jne .no_draw ;ýëåìåíò íå â ôîêóñå
mov dword[ebx],0 ;reset focus mov dword[ebx],0 ;reset focus
.no_draw: .no_draw:
@ -456,10 +437,10 @@ tl_info_set_undo: ;
jl .no_work jl .no_work
push eax ebx ecx edx push eax ebx ecx edx
mov edx,dword[edi+14] mov edx,tl_data_nodes
mov ecx,edx mov ecx,edx
add ecx,sizeof.TreeList add ecx,sizeof.TreeList
call tl_move_next ;long i=tex[0].next; call tl_move_next ;long i=node[0].next;
mov eax,tl_tim_undo mov eax,tl_tim_undo
sub tl_ch_tim,eax ;ch_tim-=tim_undo; sub tl_ch_tim,eax ;ch_tim-=tim_undo;
mov eax,tl_ch_tim mov eax,tl_ch_tim
@ -470,7 +451,7 @@ tl_info_set_undo: ;
cmp edx,ecx cmp edx,ecx
jle @f jle @f
;if(tex[i].tc>ch_tim){ // если создание символа было отменено ;if(node[i].tc>ch_tim){ // åñëè ñîçäàíèå ñèìâîëà áûëî îòìåíåíî
cmp dword[edx+12],eax cmp dword[edx+12],eax
jle .no_u1 jle .no_u1
mov dword[edx+12],0 mov dword[edx+12],0
@ -478,19 +459,19 @@ tl_info_set_undo: ;
mov ebx, dword[edx+4] mov ebx, dword[edx+4]
imul ebx,sizeof.TreeList imul ebx,sizeof.TreeList
add ebx, dword[edi+14] ;.next add ebx, tl_data_nodes ;.next
push dword[edx+8] ;tex[tex[i].perv].next=tex[i].next; push dword[edx+8] ;node[node[i].perv].next=node[i].next;
pop dword[ebx+8] pop dword[ebx+8]
mov ebx, dword[edx+8] mov ebx, dword[edx+8]
imul ebx,sizeof.TreeList imul ebx,sizeof.TreeList
add ebx, dword[edi+14] ;.perv add ebx, tl_data_nodes ;.perv
push dword[edx+4] ;tex[tex[i].next].perv=tex[i].perv; push dword[edx+4] ;node[node[i].next].perv=node[i].perv;
pop dword[ebx+4] pop dword[ebx+4]
.no_u1: .no_u1:
;else if(tex[i].td>ch_tim) tex[i].td=0; // если удаление символа было отменено ;else if(node[i].td>ch_tim) node[i].td=0; // åñëè óäàëåíèå ñèìâîëà áûëî îòìåíåíî
cmp dword[edx+16],eax cmp dword[edx+16],eax
jle .no_u2 jle .no_u2
mov dword[edx+16],0 mov dword[edx+16],0
@ -588,7 +569,7 @@ tl_draw: ;
;cycle to nodes ;cycle to nodes
xor eax,eax xor eax,eax
mov edx,dword[edi+14] ;+14 указатель на структуры узлов mov edx,tl_data_nodes
mov ecx,edx mov ecx,edx
add ecx,sizeof.TreeList add ecx,sizeof.TreeList
@ -750,7 +731,7 @@ align 4
tl_move_next: tl_move_next:
mov edx,dword[edx+8] mov edx,dword[edx+8]
imul edx,sizeof.TreeList imul edx,sizeof.TreeList
add edx,dword[edi+14] add edx,tl_data_nodes
ret ret
;input: ;input:
@ -762,7 +743,7 @@ align 4
tl_move_perv: tl_move_perv:
mov edx,dword[edx+4] mov edx,dword[edx+4]
imul edx,sizeof.TreeList imul edx,sizeof.TreeList
add edx,dword[edi+14] add edx,tl_data_nodes
ret ret
;input: ;input:
@ -770,12 +751,12 @@ tl_move_perv:
; edi = pointer to 'TreeList' struct ; edi = pointer to 'TreeList' struct
;output: ;output:
; al = 1 if sumbol not visible ; al = 1 if sumbol not visible
; (tex[i].td+tim_Undo<=ch_tim && tex[i].td) || (tex[i].tc>ch_tim-tim_Undo) ; (node[i].td+tim_Undo<=ch_tim && node[i].td) || (node[i].tc>ch_tim-tim_Undo)
align 4 align 4
tl_node_not_vis: tl_node_not_vis:
cmp dword[edx+16],0 cmp dword[edx+16],0
je @f je @f
mov eax,dword[edx+16] ;eax=tex[i].td mov eax,dword[edx+16] ;eax=node[i].td
add eax,tl_tim_undo add eax,tl_tim_undo
cmp eax,tl_ch_tim cmp eax,tl_ch_tim
jg @f jg @f
@ -986,7 +967,7 @@ tl_draw_node:
@@: @@:
mov al,byte[edx+2] ;draw minus '-' mov al,byte[edx+2] ;draw minus '-'
mov ecx,dword[edi+14] mov ecx,tl_data_nodes
add ecx,sizeof.TreeList add ecx,sizeof.TreeList
mov ah,10 ;get icon index '+' or '-' ? mov ah,10 ;get icon index '+' or '-' ?
@ -1128,7 +1109,7 @@ tl_draw_node_caption:
push ebx ecx edx esi push ebx ecx edx esi
xor esi,esi xor esi,esi
mov si,word[edi+4];info_size mov si,tl_info_size
cmp esi,tl_info_capt_offs cmp esi,tl_info_capt_offs
jle @f ;if caption size <= 0 jle @f ;if caption size <= 0
@ -1220,19 +1201,19 @@ tl_node_add: ;
mov ebx,sizeof.TreeList mov ebx,sizeof.TreeList
imul ebx,dword[edi+6] ;+6 ìàêñ. êîëè÷åñòâî óçëîâ imul ebx,dword[edi+6] ;+6 ìàêñ. êîëè÷åñòâî óçëîâ
add ebx,dword[edi+14] ;+14 указатель на структуры узлов add ebx,tl_data_nodes
;-- ;--
call tl_get_cur_node_index ;eax=po_t call tl_get_cur_node_index ;eax=po_t
imul eax,sizeof.TreeList imul eax,sizeof.TreeList
add eax,dword[edi+14] ;+14 указатель на структуры узлов add eax,tl_data_nodes
mov edx,eax mov edx,eax
call tl_move_perv call tl_move_perv
call tl_get_node_index ;eax = index of pointer [edx] call tl_get_node_index ;eax = index of pointer [edx]
;-- ;--
mov edx,sizeof.TreeList mov edx,sizeof.TreeList
shl edx,1 shl edx,1
add edx,dword[edi+14] ;+14 указатель на структуры узлов add edx,tl_data_nodes
@@: ;for(i=2;i<texMax;i++) @@: ;for(i=2;i<nodeMax;i++)
cmp dword [edx+12],0 cmp dword [edx+12],0
jne .u0 jne .u0
cmp dword [edx+16],0 cmp dword [edx+16],0
@ -1242,13 +1223,18 @@ tl_node_add: ;
push word[ebp+14] ;get type push word[ebp+14] ;get type
pop word[edx] pop word[edx]
mov byte[edx+2], 0 ;node[i].lev=0 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 byte[edx+2],cl ;node[i].lev
.l_box_m:
push tl_ch_tim ;node[i].tc=ch_tim; push tl_ch_tim ;node[i].tc=ch_tim;
pop dword[edx+12] pop dword[edx+12]
mov dword[edx+4], eax ;node[i].perv=po_t; mov dword[edx+4], eax ;node[i].perv=po_t;
;*** copy node data *** ;*** copy node data ***
push esi push esi
xor ecx,ecx xor ecx,ecx
mov cx,word[edi+4];info_size mov cx,tl_info_size
mov esi,ecx mov esi,ecx
push eax push eax
@ -1263,7 +1249,7 @@ tl_node_add: ;
mov esi,edi mov esi,edi
mov edi,dword[ebp+16] ;restore edi mov edi,dword[ebp+16] ;restore edi
mov ecx,tl_info_capt_offs mov ecx,tl_info_capt_offs
cmp cx,word[edi+4] ;+4 info_size cmp cx,tl_info_size
jge .no_text_data jge .no_text_data
dec esi dec esi
mov byte[esi],0 mov byte[esi],0
@ -1272,20 +1258,20 @@ tl_node_add: ;
mov ecx,eax mov ecx,eax
imul ecx,sizeof.TreeList imul ecx,sizeof.TreeList
add ecx,dword[edi+14] ; *** ecx = tex[po_t] *** add ecx,tl_data_nodes ; *** ecx = node[po_t] ***
add ecx,8 ; *** ecx = tex[po_t].next *** add ecx,8 ; *** ecx = node[po_t].next ***
push dword [ecx] ;tex[i].next=tex[po_t].next; push dword [ecx] ;node[i].next=node[po_t].next;
pop dword [edx+8] pop dword [edx+8]
call tl_get_node_index ;*** eax = i *** call tl_get_node_index ;*** eax = i ***
cmp eax,dword[edi+6] ;info_max_count cmp eax,dword[edi+6] ;info_max_count
jge .u0 jge .u0
mov [ecx],eax ;tex[po_t].next=i; // ссылки перенаправляем mov [ecx],eax ;node[po_t].next=i; // ññûëêè ïåðåíàïðàâëÿåì
mov ecx,[edx+8] ; *** ecx = tex[i].next *** mov ecx,[edx+8] ; *** ecx = node[i].next ***
imul ecx,sizeof.TreeList imul ecx,sizeof.TreeList
add ecx,dword[edi+14] ; *** ecx = tex[tex[i].next] *** add ecx,tl_data_nodes ; *** ecx = node[node[i].next] ***
mov [ecx+4],eax ;tex[tex[i].next].perv=i; mov [ecx+4],eax ;node[node[i].next].perv=i;
call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
jmp @f jmp @f
@ -1336,7 +1322,7 @@ tl_node_set_data:
cmp eax,2 cmp eax,2
jl @f jl @f
xor ecx,ecx xor ecx,ecx
mov cx,word[edi+4];info_size mov cx,tl_info_size
imul eax,ecx imul eax,ecx
add eax,dword[edi] add eax,dword[edi]
mov edi,eax mov edi,eax
@ -1346,7 +1332,7 @@ tl_node_set_data:
mov esi,edi mov esi,edi
mov edi,dword[ebp+12] ;restore edi mov edi,dword[ebp+12] ;restore edi
mov ecx,tl_info_capt_offs mov ecx,tl_info_capt_offs
cmp cx,word[edi+4] ;+4 info_size cmp cx,tl_info_size
jge .no_text_data jge .no_text_data
dec esi dec esi
mov byte[esi],0 mov byte[esi],0
@ -1370,7 +1356,7 @@ tl_node_get_data: ;
cmp eax,2 cmp eax,2
jl @f jl @f
xor ecx,ecx xor ecx,ecx
mov cx,word[edi+4];info_size mov cx,tl_info_size
imul eax,ecx imul eax,ecx
add eax,dword[edi] add eax,dword[edi]
mov dword[ebp+8],eax ;return node data pointer mov dword[ebp+8],eax ;return node data pointer
@ -1391,7 +1377,7 @@ tl_node_poi_get_info: ;
mov eax,dword[ebp+8] mov eax,dword[ebp+8]
;cycle to nodes ;cycle to nodes
mov edx,dword[edi+14] ;+14 указатель на структуры узлов mov edx,tl_data_nodes
mov ecx,edx mov ecx,edx
add ecx,sizeof.TreeList add ecx,sizeof.TreeList
@@: @@:
@ -1421,7 +1407,7 @@ tl_node_poi_get_next_info: ;
mov edi,dword[ebp+12] mov edi,dword[ebp+12]
mov edx,dword[ebp+8] mov edx,dword[ebp+8]
mov ecx,dword[edi+14] ;+14 указатель на структуры узлов mov ecx,tl_data_nodes
add ecx,sizeof.TreeList add ecx,sizeof.TreeList
call tl_iterat_next_all call tl_iterat_next_all
@ -1451,7 +1437,7 @@ tl_node_poi_get_data: ;
cmp eax,2 cmp eax,2
jl @f jl @f
xor ecx,ecx xor ecx,ecx
mov cx,word[edi+4];info_size mov cx,tl_info_size
imul eax,ecx imul eax,ecx
add eax,dword[edi] add eax,dword[edi]
mov dword[ebp+12],eax ;return node data pointer mov dword[ebp+12],eax ;return node data pointer
@ -1469,7 +1455,7 @@ tl_get_cur_node_index: ;
push ecx edx push ecx edx
;cycle to nodes ;cycle to nodes
xor eax,eax xor eax,eax
mov edx,dword[edi+14] ;+14 указатель на структуры узлов mov edx,tl_data_nodes
mov ecx,edx mov ecx,edx
add ecx,sizeof.TreeList add ecx,sizeof.TreeList
@@: @@:
@ -1482,7 +1468,7 @@ tl_get_cur_node_index: ;
jmp @b jmp @b
@@: @@:
mov eax,edx mov eax,edx
sub eax,dword[edi+14] ;+14 указатель на структуры узлов sub eax,tl_data_nodes
xor edx,edx xor edx,edx
mov ecx,sizeof.TreeList mov ecx,sizeof.TreeList
div ecx div ecx
@ -1498,7 +1484,7 @@ align 4
tl_get_node_index: ;áåðåò ïîçèöèþ óêàçàííîãî ñèìâîëà tl_get_node_index: ;áåðåò ïîçèöèþ óêàçàííîãî ñèìâîëà
push ecx edx push ecx edx
mov eax,edx mov eax,edx
sub eax,dword[edi+14] ;+14 указатель на структуры узлов sub eax,tl_data_nodes
xor edx,edx xor edx,edx
mov ecx,sizeof.TreeList mov ecx,sizeof.TreeList
div ecx div ecx
@ -1515,7 +1501,7 @@ tl_node_delete: ;
cmp eax,2 cmp eax,2
jl @f jl @f
imul eax,sizeof.TreeList imul eax,sizeof.TreeList
add eax,dword[edi+14] ;+14 указатель на структуры узлов add eax,tl_data_nodes
mov edx,eax mov edx,eax
inc tl_ch_tim inc tl_ch_tim
mov eax,tl_ch_tim mov eax,tl_ch_tim
@ -1596,7 +1582,7 @@ tl_get_node_count: ;
push ecx edx push ecx edx
;cycle to nodes ;cycle to nodes
xor eax,eax xor eax,eax
mov edx,dword[edi+14] ;+14 указатель на структуры узлов mov edx,tl_data_nodes
mov ecx,edx mov ecx,edx
add ecx,sizeof.TreeList add ecx,sizeof.TreeList
@@: @@:
@ -1659,7 +1645,7 @@ tl_node_close_open: ;
cmp eax,2 ;êóðñîð ñòîèò íà óçëå ? cmp eax,2 ;êóðñîð ñòîèò íà óçëå ?
jl @f jl @f
imul eax,sizeof.TreeList imul eax,sizeof.TreeList
add eax,dword[edi+14] ;+14 указатель на структуры узлов add eax,tl_data_nodes
;eax = óêàçàòåëü íà ñòðóêòóðó óçëà âûáðàííîãî êóðñîðîì ;eax = óêàçàòåëü íà ñòðóêòóðó óçëà âûáðàííîãî êóðñîðîì
push dword edi push dword edi
push dword eax push dword eax
@ -1692,7 +1678,7 @@ tl_node_lev_inc: ;
cmp eax,2 cmp eax,2
jl @f jl @f
imul eax,sizeof.TreeList imul eax,sizeof.TreeList
add eax,dword[edi+14] ;+14 указатель на структуры узлов add eax,tl_data_nodes
mov edx,eax mov edx,eax
inc word[edx+2] inc word[edx+2]
@@: @@:
@ -1710,7 +1696,7 @@ tl_node_lev_dec: ;
cmp eax,2 cmp eax,2
jl @f jl @f
imul eax,sizeof.TreeList imul eax,sizeof.TreeList
add eax,dword[edi+14] ;+14 указатель на структуры узлов add eax,tl_data_nodes
mov edx,eax mov edx,eax
cmp word[edx+2],0 cmp word[edx+2],0
je @f je @f

View File

@ -45,8 +45,8 @@ table { font-size: 15px; }
</head> </head>
<body> <body>
<h1>Оглавление</h1> <h1>Оглавление</h1>
<p>Введение</p> <p><a href="#vveden">Введение</a></p>
<p>Функции</p> <p><a href="#funct">Функции</a></p>
<ul> <ul>
<li>tl_data_init</li> <li>tl_data_init</li>
<li>tl_data_clear</li> <li>tl_data_clear</li>
@ -71,20 +71,21 @@ table { font-size: 15px; }
<li>tl_node_poi_get_data</li> <li>tl_node_poi_get_data</li>
<li>version_tree_list</li> <li>version_tree_list</li>
</ul> </ul>
<p>Стили элемента</p> <p><a href="#struc_tree_list">Структура tree_list</a></p>
<p><a href="#tree_list_styles">Стили элемента</a></p>
<h1>Введение</h1> <h1><a name="#vveden">Введение</a></h1>
<p>Внешний вид элемента управления TreeList:</p> <p>Внешний вид элемента управления TreeList:</p>
<p><img src="window_tree_list.png"></p> <p><img src="window_tree_list.png"></p>
<h1>Функции</h1> <h1><a name="funct">Функции</a></h1>
<h2>tl_data_init</h2> <h2>tl_data_init</h2>
<p>Конструктор элемента, нужно вызывать перед использованием элемента для выделения памяти и других настроек.</p> <p>Конструктор элемента, нужно вызывать перед использованием элемента для выделения памяти и других настроек.</p>
<h2>tl_data_clear</h2> <h2>tl_data_clear</h2>
<p>Деструктор элемента.</p> <p>Деструктор элемента, чистит память по указателям: <b>data_info</b>, <b>data_nodes</b>, <b>data_img</b> и <b>data_img_sys</b>. Если в программе используется <i>несколько элементов с одинаковыми иконками</i>, то указатели data_img и data_img_sys нужно приравнять к 0 в других элементах, так что-бы при вызове деструкторов не было повторного удаления одних и тех же иконок.</p>
<h2>tl_info_clear</h2> <h2>tl_info_clear</h2>
<p>Очистка списка от всех узлов.</p> <p>Очистка списка от всех узлов. Это действие нельзя отменить функцией <b>tl_info_undo</b>.</p>
<h2>tl_key</h2> <h2>tl_key</h2>
<p>Функция которую нужно вызывать при нажатии на клавиатуру.</p> <p>Функция которую нужно вызывать при нажатии на клавиатуру.</p>
<h2>tl_mouse</h2> <h2>tl_mouse</h2>
@ -95,8 +96,15 @@ table { font-size: 15px; }
<p>Отменяет добавление узлов. Действует только на весь узел целиком, не учитывая изменения внутри узлов. Т. е. нельзя отменить действия выполненные например функциями: <b>tl_node_set_data</b>, <b>tl_node_lev_inc</b> и им подобным.</p> <p>Отменяет добавление узлов. Действует только на весь узел целиком, не учитывая изменения внутри узлов. Т. е. нельзя отменить действия выполненные например функциями: <b>tl_node_set_data</b>, <b>tl_node_lev_inc</b> и им подобным.</p>
<h2>tl_info_redo</h2> <h2>tl_info_redo</h2>
<p></p> <p></p>
<h2>tl_node_add</h2> <h2>tl_node_add</h2>
<p>Добавляет узел, в позицию указанную курсором.</p> <p>Добавляет узел, в позицию указанную курсором. Пример добавления узла:</p>
<pre> push dword tree1
push dword 0x10002
push dword data_buffer
call dword[tl_node_add]</pre>
<p>где: <b>tree1</b> - структура tree_list; <b>0x10002</b> - параметры узла (старшие байты 0x0001 - индекс иконки, отображаемой возле узла; меньший байт 0x02 - уровень вложености узла); <b>data_buffer</b> - указатель на дынные, добавляемые в узел.</p>
<h2>tl_node_set_data</h2> <h2>tl_node_set_data</h2>
<p>Устанавливает новые данные (пользовательские и подпись) в узел под курсором.</p> <p>Устанавливает новые данные (пользовательские и подпись) в узел под курсором.</p>
<h2>tl_node_get_data</h2> <h2>tl_node_get_data</h2>
@ -116,19 +124,23 @@ table { font-size: 15px; }
<p>Добавить уровень узла под курсором. Делает узел дочерним.</p> <p>Добавить уровень узла под курсором. Делает узел дочерним.</p>
<h2>tl_node_lev_dec</h2> <h2>tl_node_lev_dec</h2>
<p>Уменьшает уровень узла под курсором. Делает узел родительским.</p> <p>Уменьшает уровень узла под курсором. Делает узел родительским.</p>
<h2>tl_node_poi_get_info</h2> <h2>tl_node_poi_get_info</h2>
<p>Берет внутренний указатель на структуру описывающую узел.</p> <p>Берет внутренний указатель на структуру описывающую узел.</p>
<h2>tl_node_poi_get_next_info</h2> <h2>tl_node_poi_get_next_info</h2>
<p></p> <p>Берет указатель на следующий элемент в цепи, без учета открытия/закрытия дочерних узлов.</p>
<h2>tl_node_poi_get_data</h2> <h2>tl_node_poi_get_data</h2>
<p>Берет указатель на данные (пользовательские и подпись) из узла указанного в указателе.</p> <p>Берет указатель на данные (пользовательские и подпись) из узла указанного в указателе.</p>
<p>Функциями tl_node_poi_get_info, tl_node_poi_get_next_info и tl_node_poi_get_data можно считывать информацию о узлах элемента, при этом не меняя текущего положения курсора.</p>
<h2>version_tree_list</h2> <h2>version_tree_list</h2>
<p>Версия элемента</p> <p>Версия элемента</p>
<h1>Структура tree_list</h1> <h1><a name="struc_tree_list">Структура tree_list</a></h1>
<pre>struc tree_list info_size,info_max_count,style, img_cx,img_cy,\ <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,\ 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 { el_focus, p_scrol,p_sb_draw,on_press {
.data_info dd 0 .data_info dd 0
.info_size dw info_size .info_size dw info_size
.info_max_count dd info_max_count .info_max_count dd info_max_count
@ -155,15 +167,25 @@ table { font-size: 15px; }
.p_scrol dd p_scrol .p_scrol dd p_scrol
.p_sb_draw dd p_sb_draw .p_sb_draw dd p_sb_draw
.on_activate dd 0 .on_activate dd 0
.on_press dd fun_enter .on_press dd on_press
}</pre> }</pre>
<p><b>info_size</b> - количество байт, которое будет выделено для каждого узла. Часть этой памяти пользователь может использовать для своих целей (регулируется через <i>info_capt_offs</i>) а остальная часть будет использована как подпись узла.</p>
<p><b>info_max_count</b> - максимальное количество узлов, которые можно добавить в элемент.</p>
<p><b>style</b> - стили элемента.</p>
<p><b>data_nodes</b> - указатель на внутренние структуры узлов (<i>TreeList</i>).</p>
<p><b>data_img</b> - указатель на изображения с иконками узлов.</p> <p><b>data_img</b> - указатель на изображения с иконками узлов.</p>
<p><b>data_img_sys</b> - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов).</p> <p><b>data_img_sys</b> - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов).</p>
<p><b>capt_cy</b> - высота строки для подписи вверху элемента, если меньше 9 подпись не выводится.</p>
<p><b>p_scrol</b> - указатель на структуру скроллинга, связанного с данным элементом.</p> <p><b>p_scrol</b> - указатель на структуру скроллинга, связанного с данным элементом.</p>
<p><b>p_sb_draw</b> - указатель на функцию перерисовки вертикального скроллинга (<i>scrollbar_ver_draw</i>).</p> <p><b>p_sb_draw</b> - указатель на функцию перерисовки вертикального скроллинга (<i>scrollbar_ver_draw</i>).</p>
<p><b>fun_enter</b> - указатель на функцию, которая будет вызвана при нажитии <b>[Enter]</b>. Если указатель равен 0 то ничего не будет вызыватся.</p> <p><b>on_press</b> - указатель на функцию, которая будет вызвана при нажитии <b>[Enter]</b>. Если указатель равен 0 то ничего не будет вызыватся.</p>
<h1>Стили элемента</h1> <p>Пример создания структуры:</p>
<pre>tree1 tree_list 24,500, tl_draw_par_line+tl_list_box_mode, 16,16,\
0x8080ff,0x0000ff,0xffffff, 10,35,200-16,285, 14,4,\
el_focus, wScr,scrollbar_ver_draw,fun_on_enter</pre>
<h1><a name="tree_list_styles">Стили элемента</a></h1>
<h2>tl_key_no_edit</h2> <h2>tl_key_no_edit</h2>
<p>Элемент нельзя редактировать на клавиатуре (изменять уровни, удалять). Ставьте этот стиль если нужно создать элемент только для просмотра данных.</p> <p>Элемент нельзя редактировать на клавиатуре (изменять уровни, удалять). Ставьте этот стиль если нужно создать элемент только для просмотра данных.</p>
<h2>tl_draw_par_line</h2> <h2>tl_draw_par_line</h2>
@ -171,5 +193,7 @@ table { font-size: 15px; }
<h2>tl_list_box_mode</h2> <h2>tl_list_box_mode</h2>
<p>Стиль не отображает уровни (как в ListBox все узлы одного уровня).</p> <p>Стиль не отображает уровни (как в ListBox все узлы одного уровня).</p>
<hr>
<p>Документация обновлялась последний раз 23.11.09.</p>
</body> </body>
</html> </html>