Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ; ìàêðîñ äëÿ ñèñòåìíîé áèáëèîòåêè box_lib.obj
  2. ; ýëåìåíò TreeList äëÿ Kolibri OS
  3. ; ôàéë ïîñëåäíèé ðàç èçìåíÿëñÿ 20.11.2009 IgorA
  4. ; íà êîä ïðèìåíåíà GPL2 ëèöåíçèÿ
  5.  
  6.  
  7. sizeof.TreeList equ 20
  8.  
  9. tl_style      equ dword[edi+10] ;ñòèëè ýëåìåíòà
  10. tl_img_cx     equ  word[edi+22] ;øèðèíà èêîíîê
  11. tl_img_cy     equ  word[edi+24] ;âûñîòà èêîíîê
  12. tl_data_img_sys equ dword[edi+26] ;óêàçàòåëü íà ñèñòåìíûå èçîáðàæåíèÿ (ñòðåëêè, ïëþñèêè)
  13. tl_ch_tim     equ dword[edi+30] ;êîëè÷åñòâî èçìåíåíèé â ôàéëå
  14. tl_tim_undo   equ dword[edi+38] ;êîëè÷åñòâî îòìåíåííûõ äåéñòâèé
  15. tl_cur_pos    equ dword[edi+42] ;ïîçèöèÿ êóðñîðà
  16. tl_col_bkg    equ dword[edi+46] ;öâåò ôîíà
  17. tl_col_zag    equ dword[edi+50] ;öâåò çàãîëîâêà
  18. tl_col_txt    equ dword[edi+54] ;öâåò òåêñòà
  19. tl_box_left   equ dword[edi+58]
  20. tl_box_top    equ dword[edi+62]
  21. tl_box_width  equ dword[edi+66]
  22. tl_box_height equ dword[edi+70]
  23. tl_capt_cy    equ  word[edi+74] ;âûñîòà ïîäïèñè
  24. tl_info_capt_offs equ dword[edi+76]
  25. tl_el_focus   equ dword[edi+80] ;óêàçàòåëü íà ñòðóêòóðó ýëåìåíòà â ôîêóñå
  26. tl_p_scrol    equ dword[edi+84] ;óêàçàòåëü íà ñòðóêòóðó ñêðîëëèíãà
  27. tl_sb_draw    equ dword[edi+88] ;óêàçàòåëü íà ôóíêöèþ ïåðåðèñîâûâàþùóþ ñêðîëëèíã
  28. tl_on_press   equ dword[edi+96] ;óêàçàòåëü íà ôóíêöèþ, êîòîðàÿ âûçûâàåòñÿ ïðè íàæàòèè Enter
  29.  
  30. ;êîíñòàíòû ñòèëÿ
  31. tl_key_no_edit   equ   1b ;ýëåìåíò íåëüçÿ ðåäàêòèðîâàòü íà êëàâèàòóðå (èçìåíÿòü óðîâíè, óäàëÿòü)
  32. tl_draw_par_line equ  10b ;ðèñîâàòü ëèíèè ê ðîäèòåëüñêîìó óçëó
  33. tl_list_box_mode equ 100b ;ñòèëü íå îòîáðàæàåò óðîâíè (êàê â ListBox âñå îäíîãî óðîâíÿ)
  34.  
  35. macro use_tree_list_structs
  36. {
  37. struct TreeInfo
  38.   data_info      dd ? ;+ 0 óêàçàòåëü íà îñíîâíûå äàíûå
  39.   info_size      dw ? ;+ 4 ðàçìåð èíôîðìàöèîííîé ñòðóêòóðû (ïîëüçîâàòåëüñüêèå äàííûå + òåêñò äëÿ ïîäïèñè)
  40.   info_max_count dd ? ;+ 6 ìàêñèìàëüíîå êîëëè÷åñòâî ñòðóêòóð
  41.   style          dd ? ;+10 ñòèëè ýëåìåíòà
  42.   data_nodes     dd ? ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  43.   data_img       dd ? ;+18 óêàçàòåëü íà èçîáðàæåíèÿ
  44.   img_cx         dw ? ;+22 øèðèíà èêîíîê
  45.   img_cy         dw ? ;+24 âûñîòà èêîíîê
  46.   data_img_sys dd ? ;+26 óêàçàòåëü íà ñèñòåìíûå èçîáðàæåíèÿ (ñòðåëêè, ïëþñèêè)
  47.   ch_tim                dd ? ;+30 êîëè÷åñòâî èçìåíåíèé â ôàéëå
  48.   ls_tim                dd ? ;+34 âðåìÿ ïîñëåäíåãî ñîõðàíåíèÿ
  49.   tim_undo       dd ? ;+38 êîëè÷åñòâî îòìåíåííûõ äåéñòâèé
  50.   cur_pos        dd ? ;+42 ïîçèöèÿ êóðñîðà
  51.   col_bkg        dd ? ;+46 öâåò ôîíà
  52.   col_zag        dd ? ;+50 öâåò çàãîëîâêà
  53.   col_txt        dd ? ;+54 öâåò òåêñòà
  54.   wndMain       BOX ? ;+58 ðàçìåð îêíà äëÿ âûâîäà
  55.   capt_cy        dw ? ;+74 âûñîòà ïîäïèñè
  56.   info_capt_offs dd ? ;+76 ñäâèã äëÿ íà÷àëà òåêñòà (ïîäïèñè óçëà)
  57.   el_focus dd ? ;+80 óêàçàòåëü íà ñòðóêòóðó ýëåìåíòà â ôîêóñå
  58.   p_scrol dd ?  ;+84 óêàçàòåëü íà ñòðóêòóðó ñêðîëëèíãà
  59.   sb_draw dd ?  ;+88 óêàçàòåëü íà ôóíêöèþ ïåðåðèñîâûâàþùóþ ñêðîëëèíã
  60.   on_activate dd ? ;+92 óêàçàòåëü íà ôóíêöèþ ïðè àêòèâèðîâàíèè óçëà
  61.   on_press dd ? ;+96 óêàçàòåëü íà ôóíêöèþ ïðè íàæàòèè Enter
  62. ends
  63.  
  64. struct TreeList
  65.   type dw ? ;+ 0 òèï ýëåìåíòà, èëè èíäåêñ èêîíêè äëÿ óçëà
  66.   lev db ?  ;+ 2 óðîâåíü ýëåìåíòà
  67.   clo db ?  ;+ 3 ôëàã çàêðûòèÿ, èëè îòêðûòèÿ (èìååò ñìûñë äëÿ ðîäèòåëüñêîãî óçëà)
  68.   perv dd ? ;+ 4 èíäåêñ ïðåäûäóùåãî ýëåìåíòà
  69.   next dd ? ;+ 8 èíäåêñ ïîñëåäóþùåãî ýëåìåíòà
  70.   tc dd ?   ;+12 âðåì. ñîçäàíèÿ
  71.   td dd ?   ;+16 âðåì. óäàëåíèÿ
  72. ends
  73. }
  74.  
  75. struc tree_list info_size,info_max_count,style, img_cx,img_cy,\
  76.     col_bkg,col_zag,col_txt, box_l,box_t,box_w,box_h, capt_cy,info_capt_offs,\
  77.     el_focus, p_scrol,p_sb_draw,fun_enter {
  78.   .data_info    dd 0
  79.   .info_size    dw info_size
  80.   .info_max_count dd info_max_count
  81.   .style            dd style
  82.   .data_nodes   dd 0
  83.   .data_img      dd 0
  84.   .img_cx          dw img_cx
  85.   .img_cy          dw img_cy
  86.   .data_img_sys  dd 0
  87.   .ch_tim                 dd 0
  88.   .ls_tim                 dd 0
  89.   .tim_undo      dd 0
  90.   .cur_pos        dd 0
  91.   .col_bkg        dd col_bkg
  92.   .col_zag        dd col_zag
  93.   .col_txt        dd col_txt
  94.   .box_lert   dd box_l
  95.   .box_top    dd box_t
  96.   .box_width  dd box_w
  97.   .box_height dd box_h
  98.   .capt_cy         dw capt_cy
  99.   .info_capt_offs dd info_capt_offs
  100.   .el_focus dd el_focus
  101.   .p_scrol  dd p_scrol
  102.   .p_sb_draw dd p_sb_draw
  103.   .on_activate dd 0
  104.   .on_press dd fun_enter
  105. }
  106.  
  107. ;-----------------------------------------------------------------------------
  108. ;ôóíêöèÿ äëÿ âûäåëåíèÿ ïàìÿòè
  109. ;input:
  110. ; ecx = size data
  111. ;otput:
  112. ; eax = pointer to memory
  113. align 4
  114. mem_Alloc:
  115.   push ebx
  116.   mov eax,68
  117.   mov ebx,12
  118.   int 0x40
  119.   pop ebx
  120.   ret
  121. ;-----------------------------------------------------------------------------
  122. ;ôóíêöèÿ äëÿ îñâîáîæäåíèÿ ïàìÿòè
  123. ;input:
  124. ; ecx = pointer to memory
  125. align 4
  126. mem_Free:
  127.   push eax ebx
  128.   cmp ecx,0
  129.   jz @f
  130.     mov eax,68
  131.     mov ebx,13
  132.     int 0x40
  133.   @@:
  134.   pop ebx eax
  135.   ret
  136.  
  137. macro use_tree_list
  138. {
  139. align 4
  140. tl_data_init: ;âûäåëíèå ïàìÿòè äëÿ ñòðóêòóð ñïèñêà è îñíîâíîé èíôîðìàöèè (êîíñòðóêòîð)
  141.   push ebp
  142.   mov ebp,esp
  143.   push eax ecx edi
  144.     mov edi,dword[ebp+8]
  145.  
  146.     xor ecx,ecx
  147.     mov cx,word[edi+4]
  148.     imul ecx,dword[edi+6]
  149.     call mem_Alloc
  150.     mov dword[edi],eax ;êîïèðóåì óêàçàòåëü íà ïîëó÷åíóþ ïàìÿòü â ñòðóêòóðó
  151.     mov dword[edi+18],0 ;îáíóëÿåì óêàçàòåëü 'data_img'
  152.     mov tl_data_img_sys,0 ;îáíóëÿåì óêàçàòåëü 'data_img_sys'
  153.  
  154.     mov ecx,sizeof.TreeList
  155.     imul ecx,dword[edi+6]
  156.     call mem_Alloc
  157.     mov dword[edi+14],eax ;êîïèðóåì óêàçàòåëü íà ïîëó÷åíóþ ïàìÿòü â ñòðóêòóðó
  158.  
  159.     push dword edi
  160.     call tl_info_clear
  161.  
  162.     ;íàñòðîéêè äî÷åðíåãî ñêðîëëèíãà
  163.     cmp tl_p_scrol,0
  164.     je @f
  165.       mov eax,tl_p_scrol
  166.       ;*** öâåòîâûå íàñòðîéêè ***
  167.       mov ecx,tl_col_bkg
  168.       mov dword[eax+28],ecx ;+28 .bckg_col
  169.       mov ecx,tl_col_zag
  170.       mov dword[eax+32],ecx ;+32 .frnt_col
  171.       mov ecx,tl_col_txt
  172.       mov dword[eax+36],ecx ;+32 .line_col
  173.       ;*** íàñòðîéêè ðàçìåðîâ ***
  174.       mov ecx,tl_box_left
  175.       add ecx,tl_box_width
  176.       mov word[eax+2],cx
  177.       mov ecx,tl_box_height
  178.       mov word[eax+4],cx
  179.       mov ecx,tl_box_top
  180.       mov word[eax+6],cx
  181.     @@:
  182.   pop edi ecx eax
  183.   pop ebp
  184.   ret 4
  185.  
  186. align 4
  187. tl_data_clear: ;î÷èñòêà ïàìÿòè ýëåìåíòà (äåñòðóêòîð)
  188.   push ebp
  189.   mov ebp,esp
  190.     push ecx edi
  191.     mov edi,dword[ebp+8]
  192.     cmp dword[edi+18],0 ;data_img
  193.     je @f
  194.       mov ecx,dword[edi+18]
  195.       call mem_Free ;÷èñòêà ñèñòåìíûõ èêîíîê
  196.     @@:
  197.     cmp tl_data_img_sys,0
  198.     je @f
  199.       mov ecx,tl_data_img_sys
  200.       call mem_Free ;÷èñòêà ñèñòåìíûõ èêîíîê
  201.     @@:
  202.     mov ecx,dword[edi]
  203.     call mem_Free
  204.  
  205.     mov ecx,dword[edi+14]
  206.     call mem_Free
  207.     pop edi ecx
  208.   pop ebp
  209.   ret 4
  210.  
  211. align 4
  212. tl_info_clear: ;î÷èñòêà ñïèñêà (èíôîðìàöèè)
  213.   push ebp
  214.   mov ebp,esp
  215.     push eax ecx edi
  216.     mov edi,dword[ebp+8]
  217.     mov tl_ch_tim,0
  218.     mov dword[edi+34],0 ;ls_tim
  219.     mov tl_tim_undo,0
  220.     mov tl_cur_pos,0
  221.     ;xor ecx,ecx
  222.     mov ecx,sizeof.TreeList
  223.     imul ecx,dword[edi+6]
  224.     mov eax,dword[edi+14]
  225.     @@:
  226.       mov byte[eax],0 ;÷èñòèì óçëû 0-ìè
  227.       inc eax
  228.       loop @b
  229.     mov eax,dword[edi+14] ;óêàçàòåëü íà 1-é óçåë
  230.     mov dword[eax+8],1 ;óêàçàòåëü next â 1-ì óçëå ïðèðàâíèâàåì ê 1
  231.     call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
  232.     pop edi ecx eax
  233.   pop ebp
  234.   ret 4
  235.  
  236.  
  237. align 4
  238. tl_key: ;ðåàêöèÿ íà êëàâèàòóðó
  239.   push ebp
  240.   mov ebp,esp
  241.     push ebx edi
  242.     mov edi,dword[ebp+8]
  243.  
  244.     mov ebx,tl_el_focus
  245.     cmp dword[ebx],edi
  246.     jne .no_focus ;ýëåìåíò íå â ôîêóñå
  247.  
  248.     xor bx,bx
  249.     cmp ah,13 ;Enter
  250.     jne @f
  251.       cmp tl_on_press,0
  252.       je @f
  253.         call tl_on_press
  254.     @@:
  255.     cmp ah,32 ;Space
  256.     jne @f
  257.       push dword edi
  258.       call tl_node_close_open
  259.     @@:
  260.     cmp ah,178 ;Up
  261.     jne @f
  262.       push dword edi
  263.       call tl_cur_perv
  264.     @@:
  265.     cmp ah,177 ;Down
  266.     jne @f
  267.       push dword edi
  268.       call tl_cur_next
  269.     @@:
  270.  
  271.     bt tl_style,0 ;tl_key_no_edit
  272.     jc .no_edit
  273.       cmp ah,176 ;Left
  274.       jne @f
  275.         push dword edi
  276.         call tl_node_lev_dec
  277.         mov bx,1
  278.       @@:
  279.       cmp ah,179 ;Right
  280.       jne @f
  281.         push dword edi
  282.         call tl_node_lev_inc
  283.         mov bx,1
  284.       @@:
  285.       cmp ah,182 ;Delete
  286.       jne @f
  287.         push dword edi
  288.         call tl_node_delete
  289.         mov bx,1
  290.       @@:
  291.     .no_edit:
  292.  
  293.     cmp bx,1
  294.     jne .no_focus
  295.       push dword edi
  296.       call tl_draw
  297.     .no_focus:
  298.  
  299.     pop edi ebx
  300.   pop ebp
  301.   ret 4
  302.  
  303. align 4
  304. tl_mouse: ;ðåàêöèÿ íà ìûøü
  305.   push ebp
  306.   mov ebp,esp
  307.     push eax ebx ecx edx edi esi
  308.     mov edi,dword[ebp+8]
  309.  
  310.     mov eax,37
  311.     mov ebx,2
  312.     int 0x40
  313.  
  314.     bt eax,0 ;left mouse button press
  315.     jae .no_draw
  316.  
  317.     mov ebx,tl_el_focus
  318.     mov dword[ebx],edi ;set focus
  319.  
  320.     mov eax,37
  321.     mov ebx,1
  322.     int 0x40
  323.  
  324.     mov ebx,tl_box_left
  325.     shl ebx,16
  326.     cmp eax,ebx ;ëåâàÿ ãðàíèöà îêíà
  327.     jl .no_in_wnd
  328.  
  329.     mov ebx,tl_box_left
  330.     add ebx,tl_box_width
  331.     shl ebx,16
  332.     cmp eax,ebx ;ïðàâàÿ ãðàíèöà îêíà
  333.     jg .no_in_wnd
  334.  
  335.     mov ebx,tl_box_top
  336.     add ebx,tl_box_height
  337.     cmp ax,bx ;íèæíÿÿ ãðàíèöà îêíà
  338.     jg .no_in_wnd
  339.  
  340.     sub ebx,tl_box_height
  341.     add bx,tl_capt_cy
  342.     cmp ax,bx ;âåðõíÿÿ ãðàíèöà îêíà + âûñîòà ïîäïèñè
  343.     jl .no_in_wnd
  344.  
  345.     ; if '+' or '-' press
  346.     mov esi,eax
  347.     shr esi,16
  348.     sub esi,tl_box_left ;esi = mouse x coord in element window
  349.  
  350.     and eax,0xffff
  351.     sub ax,bx
  352.     xor edx,edx
  353.     xor ecx,ecx
  354.     mov cx,tl_img_cy
  355.     div ecx
  356.     cmp tl_p_scrol,0 ;ó÷èòûâàåì ñêðîëëèíã
  357.     je @f
  358.       mov edx,tl_p_scrol
  359.       add eax,dword[edx+24] ;äîáàâëÿåì ñêðîëëèíã íà âåðõó
  360.     @@:
  361.  
  362.     mov ecx,eax
  363.     call tl_get_node_count ;eax = node count
  364.     cmp eax,ecx
  365.     jl @f
  366.       mov eax,ecx ;åñëè êóðñîð íå âûøåë çà ïðåäåëû óçëîâ, âîññòàíàâëèâàåì ñòàðîå çíà÷åíèå eax
  367.     @@:
  368.  
  369.     mov ebx,0x80000000 ;ñòàâèì ôëàã äëÿ âûõîäà áåç îáíîâëåíèÿ
  370.     cmp eax,tl_cur_pos ;åñëè íîâîå çíà÷åíèå êóðñîðà ñîâïàëî ñ ïðåäûäóùèì
  371.     je @f              ;òî ìîæåì âûéòè áåç îáíîâëåíèÿ îêíà
  372.       xor ebx,ebx
  373.     @@:
  374.  
  375.     mov tl_cur_pos,eax
  376.  
  377.     ; if '+' or '-' press
  378.     call tl_get_cur_node_index ;eax = node index
  379.     cmp eax,2
  380.     jl .no_open_close ;êóðñîð ñòîèò íà ïóñòîì ìåñòå, áåç óçëîâ
  381.     imul eax,sizeof.TreeList
  382.     add eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  383.     xor bx,bx
  384.     mov bl,byte[eax+2] ;+2 lev ñîõðàíÿåì óðîâåíü òåêóùåãî óçëà
  385.     inc bx ;+ ïîëå äëÿ êóðñîðà
  386.  
  387.     cmp si,tl_img_cx
  388.     jl .no_open_close ;ìûøåé ïîïàëè íà ëåâîå ïîëå äëÿ êóðñîðà, ãäå òî÷íî íåò '+' è '-'
  389.       mov eax,esi
  390.       xor edx,edx
  391.       xor ecx,ecx
  392.       mov cx,tl_img_cx
  393.       div ecx
  394.  
  395.       cmp ax,bx
  396.       jne .no_open_close
  397.  
  398.       push dword edi
  399.       call tl_node_close_open
  400.     .no_open_close:
  401.  
  402.     bt ebx,31
  403.     jc .no_draw
  404.       push dword edi
  405.       call tl_draw
  406.       jmp .no_draw
  407.     .no_in_wnd: ;íå ïîïàëè â îêíî - ïîòåðÿ ôîêóñà
  408.       mov ebx,tl_el_focus
  409.       mov dword[ebx],0 ;reset focus
  410.     .no_draw:
  411.  
  412.     pop esi edi edx ecx ebx eax
  413.   pop ebp
  414.   ret 4
  415.  
  416. align 4
  417. tl_info_undo: ;îòìåíà äåéñòâèÿ
  418.   push ebp
  419.   mov ebp,esp
  420.   push eax edi
  421.     mov edi,dword[ebp+8]
  422.     mov eax,tl_tim_undo
  423.     cmp tl_ch_tim,eax
  424.     jbe @f
  425.       inc tl_tim_undo
  426.       call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
  427.     @@:
  428.   pop edi eax
  429.   pop ebp
  430.   ret 4
  431.  
  432. align 4
  433. tl_info_redo: ;ïîâòîð äåéñòâèÿ
  434.   push ebp
  435.   mov ebp,esp
  436.   push edi
  437.     mov edi,dword[ebp+8]
  438.     cmp tl_tim_undo,1
  439.     jl @f
  440.       dec tl_tim_undo
  441.       call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
  442.     @@:
  443.   pop edi
  444.   pop ebp
  445.   ret 4
  446.  
  447. align 4
  448. tl_info_set_undo: ;óäàëåíèå îòìåíåííûõ äåéñòâèé
  449. ;  push ebp
  450. ;  mov ebp,esp
  451. ;  push edi
  452. ;    mov edi,dword[ebp+8]
  453.  
  454. ;  mov [dragk],0 ;çàêàí÷èâàåì âûäåëåíèå îò êëàâèàòóðû
  455.   cmp tl_tim_undo,1
  456.   jl .no_work
  457.  
  458.   push eax ebx ecx edx
  459.   mov edx,dword[edi+14]
  460.   mov ecx,edx
  461.   add ecx,sizeof.TreeList
  462.   call tl_move_next ;long i=tex[0].next;
  463.   mov eax,tl_tim_undo
  464.   sub tl_ch_tim,eax ;ch_tim-=tim_undo;
  465.   mov eax,tl_ch_tim
  466.   cmp [edi+34],eax ;if(ls_tim>ch_tim)
  467.   jle @f
  468.     mov dword[edi+34],0 ;ls_tim=0
  469.   @@:
  470.     cmp edx,ecx
  471.     jle @f
  472.  
  473.     ;if(tex[i].tc>ch_tim){ // åñëè ñîçäàíèå ñèìâîëà áûëî îòìåíåíî
  474.     cmp dword[edx+12],eax
  475.     jle .no_u1
  476.       mov dword[edx+12],0
  477.       mov dword[edx+16],0
  478.  
  479.       mov ebx, dword[edx+4]
  480.       imul ebx,sizeof.TreeList
  481.       add ebx, dword[edi+14] ;.next
  482.       push dword[edx+8] ;tex[tex[i].perv].next=tex[i].next;
  483.       pop dword[ebx+8]
  484.  
  485.       mov ebx, dword[edx+8]
  486.       imul ebx,sizeof.TreeList
  487.       add ebx, dword[edi+14] ;.perv
  488.       push dword[edx+4] ;tex[tex[i].next].perv=tex[i].perv;
  489.       pop dword[ebx+4]
  490.  
  491.     .no_u1:
  492.  
  493.     ;else if(tex[i].td>ch_tim) tex[i].td=0; // åñëè óäàëåíèå ñèìâîëà áûëî îòìåíåíî
  494.     cmp dword[edx+16],eax
  495.     jle .no_u2
  496.       mov dword[edx+16],0
  497.     .no_u2:
  498.  
  499.     call tl_move_next
  500.     jmp @b
  501.   @@:
  502.   mov tl_tim_undo,0
  503. ;  mov eax,[edi+?] ;co_tim
  504. ;  cmp tl_ch_tim,eax ;ch_tim
  505. ;  jge @f
  506. ;    mov [edi+?],0 ;co_tim
  507. ;  @@:
  508.   pop edx ecx ebx eax
  509.   .no_work:
  510.  
  511. ;  pop edi
  512. ;  pop ebp
  513. ;  ret 4
  514.   ret
  515.  
  516. align 4
  517. tl_draw: ;âûâîä ñïèñêà íà ýêðàí
  518.   push ebp
  519.   mov ebp,esp
  520.     push eax ebx ecx edx edi esi
  521.     ;draw dir_list main rect
  522.     mov edi,dword[ebp+8]
  523.     mov ebx,tl_box_left
  524.     shl ebx,16
  525.     add ebx,tl_box_width
  526.     mov ecx,tl_box_top
  527.     shl ecx,16
  528.     mov cx,tl_capt_cy
  529.     mov edx,tl_col_zag
  530.     mov eax,13
  531.     int 0x40 ;draw window caption
  532.  
  533.     add ecx,tl_box_top
  534.     shl ecx,16
  535.     add ecx,tl_box_height
  536.     sub cx,tl_capt_cy
  537.     mov edx,tl_col_bkg
  538.     int 0x40 ;draw window client rect
  539.  
  540.     cmp tl_capt_cy,9 ;9 - minimum caption height
  541.     jl @f
  542.     mov eax,4 ;draw text captions
  543.     mov ebx,tl_box_left
  544.     shl ebx,16
  545.     add ebx,5*65536+3
  546.     add ebx,tl_box_top
  547.     mov ecx,tl_col_txt
  548.     or  ecx,0x80000000
  549.     lea edx,[txt_capt_cur]
  550.     int 0x40
  551.  
  552.     mov ebx,tl_box_left
  553.     shl ebx,16
  554.     add ebx,100*65536+3
  555.     add ebx,tl_box_top
  556.     lea edx,[txt_capt_otm]
  557.     int 0x40
  558.  
  559.     mov eax,47 ;draw
  560.     mov ebx,0x40000
  561.     mov ecx,tl_cur_pos
  562.   inc ecx
  563.     mov edx,tl_box_left
  564.     shl edx,16
  565.     add edx,50*65536+3
  566.     add edx,tl_box_top
  567.     mov esi,tl_col_txt
  568.     int 0x40
  569.     mov ecx,tl_tim_undo
  570.     mov edx,tl_box_left
  571.     shl edx,16
  572.     add edx,140*65536+3
  573.     add edx,tl_box_top
  574.     mov esi,tl_col_txt
  575.     int 0x40
  576.     @@:
  577.  
  578. ;---debug---
  579. ;mov ecx,0
  580. ;@@:
  581. ;call DebugSymb
  582. ;inc ecx
  583. ;cmp ecx,10
  584. ;jge @f
  585. ;jmp @b
  586. ;@@:
  587. ;---debug---
  588.  
  589.     ;cycle to nodes
  590.     xor eax,eax
  591.     mov edx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  592.     mov ecx,edx
  593.     add ecx,sizeof.TreeList
  594.  
  595.     ;*** ïðîïóñê óçëîâ, êîòîðûå ïðîìîòàíû ñêðîëëèíãîì ***
  596.     cmp tl_p_scrol,0 ;åñëè åñòü óêàçàòåëü íà ñêðîëëèíã
  597.     je .end_c1
  598.     mov esi,tl_p_scrol
  599.     cmp dword[esi+24],0 ;åñëè ñêðîëëèíã íà âåðõó, âûõîäèì
  600.     je .end_c1
  601.       @@:
  602.         call tl_iterat_next
  603.         cmp edx,ecx
  604.         jle .end_draw
  605.         inc eax
  606.         cmp eax,dword[esi+24]
  607.         jge .end_c1
  608.         jmp @b
  609.     .end_c1:
  610.  
  611.     xor eax,eax
  612.     mov esi,tl_box_top
  613.     add esi,tl_box_height ;esi = coord bottom border
  614.     @@:
  615.       call tl_iterat_next
  616.       cmp edx,ecx
  617.       jle @f
  618.       call tl_draw_node
  619.       inc eax
  620.       jmp @b
  621.     @@:
  622.  
  623.     call tl_draw_cursor
  624.     .end_draw:
  625.     pop esi edi edx ecx ebx eax
  626.   pop ebp
  627.   ret 4
  628.  
  629. ;input:
  630. ; ecx = pointer to 1 node struct
  631. ; edx = pointer to some node struct
  632. ; edi = pointer to 'TreeList' struct
  633. align 4
  634. tl_iterat_next:
  635.   push bx
  636.   mov bl,0x7f
  637.   cmp byte[edx+3],1
  638.   jne @f
  639.     mov bl,byte[edx+2]
  640.   @@:
  641.  
  642.   cmp tl_tim_undo,0
  643.   je .else
  644.  
  645.   push eax
  646.   .beg0:
  647.     call tl_move_next
  648.     cmp edx,ecx
  649.     jle @f
  650.     call tl_node_not_vis ;ïðîïóñê óäàëåííûõ è îòìåíåííûõ
  651.     cmp al,1
  652.     je .beg0
  653.     cmp bl,byte[edx+2] ;ïðîïóñê çàêðûòûõ
  654.     jl .beg0
  655.   @@:
  656.   pop eax
  657.   pop bx
  658.   ret
  659.  
  660.   .else:
  661.     call tl_move_next
  662.     cmp edx,ecx
  663.     jle .endif
  664.     cmp dword[edx+16],0 ;td = 'time delete' -> ïðîïóñê óäàëåííûõ
  665.     jne .else
  666.     cmp bl,byte[edx+2] ;ïðîïóñê çàêðûòûõ
  667.     jl .else
  668.   .endif:
  669.   pop bx
  670.   ret
  671.  
  672. ;input:
  673. ; ecx = pointer to 1 node struct
  674. ; edx = pointer to some node struct
  675. ; edi = pointer to 'TreeList' struct
  676. align 4
  677. tl_iterat_next_all:
  678.   cmp tl_tim_undo,0
  679.   je .else
  680.  
  681.   push eax
  682.   @@:
  683.     call tl_move_next
  684.     cmp edx,ecx
  685.     jle @f
  686.     call tl_node_not_vis
  687.     cmp al,1
  688.     je @b
  689.   @@:
  690.   pop eax
  691.   ret
  692.   .else:
  693.     call tl_move_next
  694.     cmp edx,ecx
  695.     jle .endif
  696.     cmp dword[edx+16],0 ;td -> time delete
  697.     jne .else
  698.   .endif:
  699.   ret
  700.  
  701. ;input:
  702. ; ecx = pointer to 1 node struct
  703. ; edx = pointer to some node struct
  704. ; edi = pointer to 'TreeList' struct
  705. align 4
  706. tl_iterat_perv:
  707.   push bx
  708.   mov bl,0x7f
  709.   cmp byte[edx+3],1
  710.   jne @f
  711.     mov bl,byte[edx+2]
  712.   @@:
  713.  
  714.   cmp tl_tim_undo,0
  715.   je .else
  716.  
  717.   push eax
  718.   .beg0:
  719.     call tl_move_perv
  720.     cmp edx,ecx
  721.     jle @f
  722.     call tl_node_not_vis ;ïðîïóñê óäàëåííûõ è îòìåíåííûõ
  723.     cmp al,1
  724.     je .beg0
  725.     cmp bl,byte[edx+2] ;ïðîïóñê çàêðûòûõ
  726.     jl .beg0
  727.   @@:
  728.   pop eax
  729.   pop bx
  730.   ret
  731.  
  732.   .else:
  733.     call tl_move_perv
  734.     cmp edx,ecx
  735.     jle .endif
  736.     cmp dword[edx+16],0 ;td = 'time delete' -> ïðîïóñê óäàëåííûõ
  737.     jne .else
  738.     cmp bl,byte[edx+2] ;ïðîïóñê çàêðûòûõ
  739.     jl .else
  740.   .endif:
  741.   pop bx
  742.   ret
  743.  
  744. ;input:
  745. ; edx = pointer to some node struct
  746. ; edi = pointer to 'TreeList' struct
  747. ;output:
  748. ; edx = pointer to next node struct
  749. align 4
  750. tl_move_next:
  751.   mov edx,dword[edx+8]
  752.   imul edx,sizeof.TreeList
  753.   add edx,dword[edi+14]
  754.   ret
  755.  
  756. ;input:
  757. ; edx = pointer to some node struct
  758. ; edi = pointer to 'TreeList' struct
  759. ;output:
  760. ; edx = pointer to perv node struct
  761. align 4
  762. tl_move_perv:
  763.   mov edx,dword[edx+4]
  764.   imul edx,sizeof.TreeList
  765.   add edx,dword[edi+14]
  766.   ret
  767.  
  768. ;input:
  769. ; edx = pointer to symbol struct
  770. ; edi = pointer to 'TreeList' struct
  771. ;output:
  772. ; al = 1 if sumbol not visible
  773. ; (tex[i].td+tim_Undo<=ch_tim && tex[i].td) || (tex[i].tc>ch_tim-tim_Undo)
  774. align 4
  775. tl_node_not_vis:
  776.   cmp dword[edx+16],0
  777.   je @f
  778.   mov eax,dword[edx+16] ;eax=tex[i].td
  779.   add eax,tl_tim_undo
  780.   cmp eax,tl_ch_tim
  781.   jg @f
  782.     mov al,1
  783.     ret
  784.   @@:
  785.  
  786.   mov eax,tl_ch_tim
  787.   sub eax,tl_tim_undo
  788.   cmp dword[edx+12],eax ;tc -> time create
  789.   jle @f
  790.     mov al,1
  791.     ret
  792.   @@:
  793.   xor al,al
  794.   ret
  795.  
  796.  
  797. ;input:
  798. ; edi = pointer to TreeInfo struct
  799. ; esi = coord bottom border
  800. align 4
  801. tl_draw_cursor: ;ðèñóåì êóðñîð íà ýêðàíå
  802.   push eax ebx ecx edx esi
  803.     call tl_get_display_cur_pos ;eax = cursor pos in screen
  804.     cmp eax,0
  805.     jl .end_f ;êóðñîð íàõîäèòñÿ âûøå îêíà, â îáëàñòè ïðîêðó÷åííîé ñêðîëëèíãîì
  806.  
  807.     cmp tl_data_img_sys,0 ;ñìîòðèì åñòü ëè óêàçàòåëü íà êàðòèíêó ñèñòåìíûõ èêîíîê
  808.     jne @f
  809.       mov ebx,tl_box_left
  810.       shl ebx,16
  811.       mov bx,tl_img_cx
  812.       xor ecx,ecx
  813.       mov cx,tl_img_cy
  814.       imul ecx,eax
  815.       add ecx,tl_box_top
  816.       add cx,tl_capt_cy
  817.  
  818.       ;crop image if on the border
  819.       cmp esi,ecx ;åñëè êóðñîð âíèçó è åãî âîîáùå íå âèäíî
  820.       jl .end_f
  821.  
  822.       sub esi,ecx
  823.       shl ecx,16
  824.       mov cx,tl_img_cy
  825.       cmp si,tl_img_cy
  826.       jge .crop0
  827.         mov cx,si ;åñëè êóðñîð âèäåí ÷àñòè÷íî (ïîïàë íà íèæíþþ ãðàíèöó)
  828.       .crop0:
  829.  
  830.       mov edx,tl_col_txt
  831.       mov eax,13
  832.       int 0x40 ;ðèñóåì ïðîñòîé ïðÿìîóãîëüíèê, ò.ê. íåò ñèñòåìíûõ èêîíîê
  833.       jmp .end_f
  834.     @@:
  835.       mov ebx,tl_data_img_sys
  836.       imul ax,tl_img_cy
  837.       mov cx,tl_img_cx
  838.       shl ecx,16
  839.       mov cx,tl_img_cy
  840.       mov edx,tl_box_left
  841.       shl edx,16
  842.       mov dx,ax
  843.       add edx,tl_box_top
  844.       add dx,tl_capt_cy
  845.  
  846.       ;crop image if on the border
  847.       cmp si,dx ;åñëè êóðñîð âíèçó è åãî âîîáùå íå âèäíî
  848.       jl .end_f
  849.  
  850.       sub si,dx
  851.       cmp si,tl_img_cy
  852.       jge .crop1
  853.         mov cx,si ;åñëè êóðñîð âèäåí ÷àñòè÷íî (ïîïàë íà íèæíþþ ãðàíèöó)
  854.       .crop1:
  855.  
  856.       mov eax,7
  857.       int 0x40 ;ðèñóåì èêîíêó êóðñîðà
  858.     .end_f:
  859.   pop esi edx ecx ebx eax
  860.   ret
  861.  
  862. ;input:
  863. ; edi = pointer to TreeInfo struct
  864. ; esi = coord bottom border
  865. align 4
  866. tl_draw_null_cursor: ;ñòèðàåì êóðñîð íà ýêðàíå
  867.   push eax ebx ecx edx esi
  868.     call tl_get_display_cur_pos ;eax = cursor pos in screen
  869.     cmp eax,0
  870.     jl .end_f ;êóðñîð íàõîäèòñÿ âûøå îêíà, â îáëàñòè ïðîêðó÷åííîé ñêðîëëèíãîì
  871.  
  872.     mov ebx,tl_box_left
  873.     shl ebx,16
  874.     mov bx,tl_img_cx
  875.     xor ecx,ecx
  876.     mov cx,tl_img_cy
  877.     imul ecx,eax
  878.     add ecx,tl_box_top
  879.     add cx,tl_capt_cy
  880.  
  881.     ;crop image if on the border
  882.     cmp esi,ecx ;åñëè êóðñîð âíèçó è åãî âîîáùå íå âèäíî
  883.     jl .end_f
  884.  
  885.     sub esi,ecx
  886.     shl ecx,16
  887.     mov cx,tl_img_cy
  888.     cmp si,tl_img_cy
  889.     jge @f
  890.       mov cx,si ;åñëè êóðñîð âèäåí ÷àñòè÷íî (ïîïàë íà íèæíþþ ãðàíèöó)
  891.     @@:
  892.  
  893.     mov edx,tl_col_bkg
  894.     mov eax,13
  895.     int 0x40 ;ðèñóåì ïðîñòîé ïðÿìîóãîëüíèê ñ ôîíîâûì öâåòîì
  896.  
  897.     .end_f:
  898.   pop esi edx ecx ebx eax
  899.   ret
  900.  
  901. ;input:
  902. ; edi = pointer to TreeInfo struct
  903. ;output:
  904. ; eax = index
  905. align 4
  906. tl_get_display_cur_pos: ;áåðåò ïîçèöèþ êóðñîðà, îòíîñèòåëüíî ýêðàíà
  907.    mov eax,tl_cur_pos
  908.    cmp tl_p_scrol,0
  909.    je @f
  910.      push ebx
  911.        mov ebx,tl_p_scrol
  912.        mov ebx,dword[ebx+24]
  913.        sub eax,ebx ;îòíèìàåì ïîçèöèþ ñêðîëëèíãà
  914.      pop ebx
  915.   @@:
  916.   ret
  917.  
  918. ;input:
  919. ; eax = node position
  920. ; edx = pointer to some node struct
  921. ; edi = pointer to TreeInfo struct
  922. ; esi = coord of bottom border
  923. align 4
  924. tl_draw_node:
  925.   push eax ebx ecx edx esi
  926.  
  927.     mov ebx,1 ;1 - ìåñòî ïîä êóðñîð è ïîä çíàê +,-
  928.     bt tl_style,2 ;tl_list_box_mode
  929.     jc @f
  930.       inc ebx ;+1 - ìåñòî ïîä çíàê +,-
  931.     @@:
  932.     add bl,byte[edx+2];get level
  933.     imul bx,tl_img_cx
  934.     add ebx,tl_box_left
  935.  
  936.     shl ebx,16
  937.     mov bx,tl_img_cx
  938.     xor ecx,ecx
  939.     mov cx,tl_img_cy
  940.     imul ecx,eax
  941.     add ecx,tl_box_top
  942.     add cx,tl_capt_cy
  943.  
  944.     ;crop image if on the border
  945.     cmp esi,ecx ;åñëè óçåë âíèçó è åãî âîîáùå íå âèäíî
  946.     jl .end_draw
  947.  
  948.     sub esi,ecx
  949.     shl ecx,16
  950.     mov cx,tl_img_cy
  951.     cmp si,tl_img_cy
  952.     jge @f
  953.       mov cx,si ;åñëè óçåë âèäåí ÷àñòè÷íî (ïîïàë íà íèæíþþ ãðàíèöó)
  954.       jmp .crop ;ïðîïóñêàåì ðèñîâàíèå íàäïèñè, êîòîðàÿ ñêîðåå âñåãî òîæå âûëåçåò çà íèæíþþ ãðàíèöó
  955.     @@:
  956.       call tl_draw_node_caption
  957.     .crop:
  958.     mov esi,ecx ;save ecx
  959.  
  960.     cmp dword[edi+18],0 ;data_img
  961.     jne .draw_img_n
  962.     push edx
  963.       mov edx,tl_col_txt
  964.       mov eax,13
  965.       int 0x40 ;draw node rect
  966.     pop edx
  967.     jmp @f
  968.     .draw_img_n:
  969.     push ebx edx esi
  970.       xor esi,esi
  971.       mov si,word[edx] ;get icon type
  972.       mov edx,ebx
  973.       ror ecx,16
  974.       mov dx,cx
  975.       mov cx,bx
  976.       ror ecx,16
  977.       mov ebx,3 ;rgb = 3 bytes
  978.       imul bx,tl_img_cx
  979.       imul bx,tl_img_cy
  980.       imul ebx,esi ;esi = icon index
  981.       add ebx,dword[edi+18] ;data_img
  982.  
  983.       mov eax,7
  984.       int 0x40 ;draw node icon '-'
  985.     pop esi edx ebx
  986.     @@:
  987.  
  988.     mov al,byte[edx+2] ;draw minus '-'
  989.     mov ecx,dword[edi+14]
  990.     add ecx,sizeof.TreeList
  991.  
  992.     mov ah,10 ;get icon index '+' or '-' ?
  993.     cmp byte[edx+3],1
  994.     jne .close
  995.       dec ah
  996.     .close:
  997.  
  998.     call tl_draw_node_icon_opn_clo
  999.     bt tl_style,1
  1000.     jae .end_draw
  1001.       call tl_draw_node_icon_par_lin
  1002.  
  1003.     .end_draw:
  1004.   pop esi edx ecx ebx eax
  1005.   ret
  1006.  
  1007. ;input:
  1008. ; ecx = pointer to 1 node struct
  1009. ;...
  1010. align 4
  1011. tl_draw_node_icon_opn_clo:
  1012.   push eax ebx ecx edx esi
  1013.     inc al
  1014.     call tl_iterat_next_all ;get next visible item
  1015.     cmp edx,ecx
  1016.     jle @f
  1017.       mov ecx,esi ;load ecx
  1018.       cmp al,byte[edx+2]
  1019.       jne @f
  1020.       ror ebx,16
  1021.       sub bx,tl_img_cx
  1022.       ror ebx,16
  1023.       cmp tl_data_img_sys,0
  1024.       jne .draw_img_s
  1025.         mov edx,tl_col_txt
  1026.         mov eax,13
  1027.         int 0x40 ;draw minus rect, if not system icons
  1028.         jmp @f
  1029.       .draw_img_s:
  1030.       mov ecx,esi ;load ecx
  1031.       mov edx,ebx
  1032.       ror ecx,16
  1033.       mov dx,cx
  1034.       mov cx,bx
  1035.       ror ecx,16
  1036.       mov ebx,3 ;rgb = 3 bytes
  1037.       imul bx,tl_img_cx
  1038.       imul bx,tl_img_cy
  1039.       shr eax,8
  1040.       and eax,0xff
  1041.       imul ebx,eax ;eax = icon index
  1042.       add ebx,tl_data_img_sys
  1043.       mov eax,7
  1044.       int 0x40 ;draw minus icon '-'
  1045.     @@:
  1046.   pop esi edx ecx ebx eax
  1047.   ret
  1048.  
  1049. ;input:
  1050. ;...
  1051. align 4
  1052. tl_draw_node_icon_par_lin:
  1053.   cmp byte[edx+3],1
  1054.   je .close
  1055.   push eax ebx ecx edx esi
  1056.     cmp al,0
  1057.     je @f
  1058. ;    dec al
  1059. ;    call tl_iterat_perv ;get perv visible item
  1060.  
  1061.     call tl_iterat_next_all ;get next visible item
  1062.     cmp edx,ecx
  1063.     jle .line3 ;if end of list
  1064.       cmp al,byte[edx+2]
  1065.       jne .line3 ;jg ???
  1066.       mov eax,3 ;line in middle element
  1067.       jmp .line2
  1068.     .line3:
  1069.       mov eax,6 ;line in end element
  1070.     .line2:
  1071.  
  1072.       mov ecx,esi ;load ecx
  1073.       ror ebx,16
  1074.       sub bx,tl_img_cx
  1075.       ror ebx,16
  1076.       cmp tl_data_img_sys,0
  1077.       jne .draw_img_s
  1078.         mov edx,tl_col_txt
  1079.         mov eax,13
  1080.         int 0x40 ;draw minus rect, if not system icons
  1081.         jmp @f
  1082.       .draw_img_s:
  1083.       mov ecx,esi ;load ecx
  1084.       mov edx,ebx
  1085.       ror ecx,16
  1086.       mov dx,cx
  1087.       mov cx,bx
  1088.       ror ecx,16
  1089.       mov ebx,3 ;rgb = 3 bytes
  1090.       imul bx,tl_img_cx
  1091.       imul bx,tl_img_cy
  1092.  
  1093. ;      shr eax,8
  1094. ;      and eax,0xff
  1095.       imul ebx,eax ;eax = icon index
  1096.       add ebx,tl_data_img_sys
  1097.       mov eax,7
  1098.       int 0x40 ;draw line icon
  1099.     @@:
  1100.   pop esi edx ecx ebx eax
  1101.   .close:
  1102.   ret
  1103.  
  1104. ;input:
  1105. ; edi = pointer to TreeInfo struct
  1106. ;output:
  1107. ; eax = rows
  1108. align 4
  1109. tl_get_rows_count:
  1110.   push ecx edx
  1111.     mov eax,tl_box_height
  1112.     sub ax,tl_capt_cy
  1113.     xor ecx,ecx
  1114.     mov cx,tl_img_cy
  1115.     xor edx,edx
  1116.     div ecx
  1117.   pop edx ecx
  1118.   ret
  1119.  
  1120. ;input:
  1121. ; eax = node position
  1122. ; ebx = [êîîðäèíàòà ïî îñè x]*65536 + [img_cx]
  1123. ; ecx = [êîîðäèíàòà ïî îñè y]*65536 + [img_cy]
  1124. ; edx = pointer to some node struct
  1125. ; edi = pointer to TreeInfo struct
  1126. align 4
  1127. tl_draw_node_caption:
  1128.     push ebx ecx edx esi
  1129.  
  1130.     xor esi,esi
  1131.     mov si,word[edi+4];info_size
  1132.     cmp esi,tl_info_capt_offs
  1133.     jle @f ;if caption size <= 0
  1134.  
  1135.     push eax
  1136.       call tl_get_node_index ;eax = node index
  1137.       imul esi,eax
  1138.     pop eax
  1139.       add esi,dword[edi]
  1140.       add esi,tl_info_capt_offs
  1141.       mov edx,esi
  1142.  
  1143.       shr ebx,16
  1144.       add bx,tl_img_cx ;ñäâèãàåì íàäïèñü ïî ãîðèçîíòàëè --->
  1145.       add bx,3 ;îòñòóï
  1146.       ;bx = coord. x
  1147.       call tl_strlen ;eax = strlen
  1148.       call tl_get_draw_text_len
  1149.       mov cx,bx
  1150.       ror ecx,16
  1151.       mov ebx,ecx
  1152.       add bx,tl_img_cy ;âûðàâíèâèíèå ïî íèæíåé ãðàíèöå èêîíêè
  1153.       sub bx,9 ;îòíèìàåì âûñîòó òåêñòà
  1154.       mov ecx,tl_col_txt
  1155.       and ecx,0xffffff
  1156. ;      or ecx,0x80000000 ;text is ASCIIZ
  1157.       mov eax,4
  1158.       int 0x40
  1159.     @@:
  1160.     pop esi edx ecx ebx
  1161.   ret
  1162.  
  1163. ;input:
  1164. ; eax = strlen
  1165. ; ebx = text coord x
  1166. ;output:
  1167. ; esi = text len
  1168. align 4
  1169. tl_get_draw_text_len:
  1170.   push eax ecx edx
  1171.     mov esi,eax ;áåðåì äëèííó ñòðîêè
  1172.  
  1173.     mov eax,tl_box_left
  1174.     add eax,tl_box_width
  1175.     cmp eax,ebx
  1176.     jle .text_null ;åñëè ïîäïèñü ïîëíîñòüþ âñÿ çà ýêðàíîì
  1177.     sub eax,ebx
  1178.     xor edx,edx
  1179.     mov ecx,6 ;øèðèíà ñèñòåìíîãî øðèôòà
  1180.     div ecx ;ñìîòðèì ñêîëüêî ñèìâîëîâ ìîæåò ïîìåñòèòüñÿ íà ýêðàíå
  1181.  
  1182.     cmp esi,eax
  1183.     jl @f
  1184.       mov esi,eax ;åñëè äëèííà òåêñòà ìåíüøå, ÷åì âñå ìåñòî ïîä ñòðîêó
  1185.     jmp @f
  1186.     .text_null:
  1187.       xor esi,esi
  1188.     @@:
  1189.   pop edx ecx eax
  1190.   ret
  1191.  
  1192. ;input:
  1193. ; esi = pointer to string
  1194. ;output:
  1195. ; eax = strlen
  1196. align 4
  1197. tl_strlen:
  1198.   mov eax,esi
  1199.   @@:
  1200.     cmp byte[eax],0
  1201.     je @f
  1202.     inc eax
  1203.     loop @b
  1204.   @@:
  1205.   sub eax,esi
  1206.   ret
  1207.  
  1208. ;input:
  1209. ;dword[ebp+ 8] - pointer to node info
  1210. ;dword[ebp+12] - options
  1211. ;dword[ebp+16] - pointer to 'TreeList' struct
  1212. align 4
  1213. tl_node_add: ;äîáàâèòü óçåë
  1214.   push ebp
  1215.   mov ebp,esp
  1216.   push eax ebx ecx edx edi
  1217.     mov edi,dword[ebp+16]
  1218.  
  1219.     call tl_info_set_undo
  1220.  
  1221.     mov ebx,sizeof.TreeList
  1222.     imul ebx,dword[edi+6] ;+6 ìàêñ. êîëè÷åñòâî óçëîâ
  1223.     add ebx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  1224. ;--
  1225.     call tl_get_cur_node_index ;eax=po_t
  1226.     imul eax,sizeof.TreeList
  1227.     add eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  1228.     mov edx,eax
  1229.     call tl_move_perv
  1230.     call tl_get_node_index ;eax = index of pointer [edx]
  1231. ;--
  1232.     mov edx,sizeof.TreeList
  1233.     shl edx,1
  1234.     add edx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  1235.     @@: ;for(i=2;i<texMax;i++)
  1236.       cmp dword [edx+12],0
  1237.       jne .u0
  1238.       cmp dword [edx+16],0
  1239.       jne .u0
  1240.  
  1241.         inc  tl_ch_tim
  1242.         push  word[ebp+14] ;get type
  1243.         pop   word[edx]
  1244.         mov   byte[edx+2], 0 ;node[i].lev=0
  1245.         push tl_ch_tim       ;node[i].tc=ch_tim;
  1246.         pop  dword[edx+12]
  1247.         mov  dword[edx+4], eax ;node[i].perv=po_t;
  1248.         ;*** copy node data ***
  1249.         push esi
  1250.         xor ecx,ecx
  1251.         mov cx,word[edi+4];info_size
  1252.         mov esi,ecx
  1253.  
  1254.         push eax
  1255.           call tl_get_node_index ;eax = node index
  1256.           imul esi,eax
  1257.         pop eax
  1258.         add esi,dword[edi]
  1259.         mov edi,dword[ebp+8] ;pointer to node data
  1260.         xchg edi,esi
  1261.         rep movsb
  1262.  
  1263.         mov esi,edi
  1264.         mov edi,dword[ebp+16] ;restore edi
  1265.         mov ecx,tl_info_capt_offs
  1266.         cmp cx,word[edi+4] ;+4 info_size
  1267.         jge .no_text_data
  1268.           dec esi
  1269.           mov byte[esi],0
  1270.         .no_text_data:
  1271.         pop esi ;restore esi
  1272.  
  1273.         mov ecx,eax
  1274.         imul ecx,sizeof.TreeList
  1275.         add ecx,dword[edi+14] ; *** ecx = tex[po_t] ***
  1276.         add ecx,8   ; *** ecx = tex[po_t].next ***
  1277.         push dword [ecx] ;tex[i].next=tex[po_t].next;
  1278.         pop dword [edx+8]
  1279.  
  1280.         call tl_get_node_index ;*** eax = i ***
  1281.         cmp eax,dword[edi+6] ;info_max_count
  1282.         jge .u0
  1283.  
  1284.         mov [ecx],eax ;tex[po_t].next=i; // ññûëêè ïåðåíàïðàâëÿåì
  1285.         mov ecx,[edx+8] ; *** ecx = tex[i].next ***
  1286.         imul ecx,sizeof.TreeList
  1287.         add ecx,dword[edi+14] ; *** ecx = tex[tex[i].next] ***
  1288.         mov [ecx+4],eax ;tex[tex[i].next].perv=i;
  1289.  
  1290.         call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
  1291.     jmp @f
  1292.       .u0:
  1293.       add edx,sizeof.TreeList
  1294.       cmp edx,ebx ;enf of node memory ?
  1295.       jle @b
  1296.     @@:
  1297.   pop edi edx ecx ebx eax
  1298.   pop ebp
  1299.   ret 12
  1300.  
  1301. ;input:
  1302. ; edi = pointer to TreeInfo struct
  1303. align 4
  1304. tb_scrol_resize:
  1305.   push eax ecx edx
  1306.   cmp tl_p_scrol,0 ;îáðàáîòêà ñêðîëëèíãà
  1307.   je @f
  1308.     call tl_get_node_count ;eax = node count
  1309.     mov ecx,eax
  1310.     call tl_get_rows_count
  1311.     cmp ecx,eax
  1312.     jg .ye_sb
  1313.       xor ecx,ecx
  1314.     .ye_sb:
  1315.  
  1316.     mov edx,tl_p_scrol
  1317.     mov dword[edx+20],eax ;+20 .cur_area
  1318.     mov dword[edx+16],ecx ;+16 .max_area
  1319.     push dword edx ;pointer to scroll struct
  1320.     mov edx,tl_sb_draw ;pointer to scroll draw function
  1321.     call dword[edx]
  1322.   @@:
  1323.   pop edx ecx eax
  1324. ret
  1325.  
  1326. ;input:
  1327. ;dword[ebp+ 8] - pointer to node info
  1328. ;dword[ebp+12] - pointer to 'TreeList' struct
  1329. align 4
  1330. tl_node_set_data:
  1331.   push ebp
  1332.   mov ebp,esp
  1333.   push eax ecx edx edi esi
  1334.     mov edi,dword[ebp+12]
  1335.     call tl_get_cur_node_index ;eax=po_t
  1336.     cmp eax,2
  1337.     jl @f
  1338.       xor ecx,ecx
  1339.       mov cx,word[edi+4];info_size
  1340.       imul eax,ecx
  1341.       add eax,dword[edi]
  1342.       mov edi,eax
  1343.       mov esi,dword[ebp+8] ;pointer to node data
  1344.       rep movsb
  1345.  
  1346.       mov esi,edi
  1347.       mov edi,dword[ebp+12] ;restore edi
  1348.       mov ecx,tl_info_capt_offs
  1349.       cmp cx,word[edi+4] ;+4 info_size
  1350.       jge .no_text_data
  1351.         dec esi
  1352.         mov byte[esi],0
  1353.       .no_text_data:
  1354.  
  1355.     @@:
  1356.   pop esi edi edx ecx eax
  1357.   pop ebp
  1358.   ret 8
  1359.  
  1360. ;input:
  1361. ;dword[ebp+ 8] - pointer to 'TreeList' struct
  1362. align 4
  1363. tl_node_get_data: ;âçÿòü óêàçàòåëü íà äàííûå óçëà ïîä êóðñîðîì
  1364.   push ebp
  1365.   mov ebp,esp
  1366.   push eax ecx edi
  1367.     mov edi,dword[ebp+8]
  1368.     call tl_get_cur_node_index ;eax=po_t
  1369.     mov dword[ebp+8],0 ;if return 0 pointer
  1370.     cmp eax,2
  1371.     jl @f
  1372.       xor ecx,ecx
  1373.       mov cx,word[edi+4];info_size
  1374.       imul eax,ecx
  1375.       add eax,dword[edi]
  1376.       mov dword[ebp+8],eax ;return node data pointer
  1377.     @@:
  1378.   pop edi ecx eax
  1379.   pop ebp
  1380.   ret
  1381.  
  1382. ;input:
  1383. ;dword[ebp+ 8] - node index
  1384. ;dword[ebp+12] - pointer to 'TreeList' struct
  1385. align 4
  1386. tl_node_poi_get_info: ;âçÿòü óêàçàòåëü íà ñòðóêòóðó óçëà â óêàçàííîé ïîçèöèè
  1387.   push ebp
  1388.   mov ebp,esp
  1389.   push eax ecx edx edi
  1390.     mov edi,dword[ebp+12]
  1391.     mov eax,dword[ebp+8]
  1392.  
  1393.     ;cycle to nodes
  1394.     mov edx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  1395.     mov ecx,edx
  1396.     add ecx,sizeof.TreeList
  1397.     @@:
  1398.       call tl_iterat_next_all
  1399.       cmp edx,ecx
  1400.       jle @f
  1401.       dec eax
  1402.       cmp eax,0
  1403.       jg @b
  1404.       jmp .find
  1405.     @@:
  1406.       xor edx,edx
  1407.     .find:
  1408.     mov dword[ebp+12],edx
  1409.   pop edi edx ecx eax
  1410.   pop ebp
  1411.   ret 4
  1412.  
  1413. ;input:
  1414. ;dword[ebp+ 8] - node param struct
  1415. ;dword[ebp+12] - pointer to 'TreeList' struct
  1416. align 4
  1417. tl_node_poi_get_next_info: ;âçÿòü óêàçàòåëü íà ñëåäóùóþ ñòðóêòóðó óçëà
  1418.   push ebp
  1419.   mov ebp,esp
  1420.   push ecx edx edi
  1421.     mov edi,dword[ebp+12]
  1422.     mov edx,dword[ebp+8]
  1423.  
  1424.     mov ecx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  1425.     add ecx,sizeof.TreeList
  1426.  
  1427.     call tl_iterat_next_all
  1428.     cmp edx,ecx
  1429.     jg @f
  1430.       xor edx,edx
  1431.     @@:
  1432.  
  1433.     mov dword[ebp+12],edx
  1434.   pop edi edx ecx
  1435.   pop ebp
  1436.   ret 4
  1437.  
  1438. ;input:
  1439. ;dword[ebp+ 8] - node param struct
  1440. ;dword[ebp+12] - pointer to 'TreeList' struct
  1441. align 4
  1442. tl_node_poi_get_data: ;âçÿòü óêàçàòåëü íà äàííûå óçëà
  1443.   push ebp
  1444.   mov ebp,esp
  1445.   push eax ecx edi
  1446.     mov edi,dword[ebp+12]
  1447.     mov edx,dword[ebp+8]
  1448.  
  1449.     mov dword[ebp+12],0
  1450.     call tl_get_node_index ;eax = node index
  1451.     cmp eax,2
  1452.     jl @f
  1453.       xor ecx,ecx
  1454.       mov cx,word[edi+4];info_size
  1455.       imul eax,ecx
  1456.       add eax,dword[edi]
  1457.       mov dword[ebp+12],eax ;return node data pointer
  1458.     @@:
  1459.   pop edi ecx eax
  1460.   pop ebp
  1461.   ret 4
  1462.  
  1463. ;input:
  1464. ; edi = pointer 'tl' struct
  1465. ;output:
  1466. ; eax = index of current node
  1467. align 4
  1468. tl_get_cur_node_index: ;áåðåò ïîçèöèþ ïîä êóðñîðîì
  1469.   push ecx edx
  1470.     ;cycle to nodes
  1471.     xor eax,eax
  1472.     mov edx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  1473.     mov ecx,edx
  1474.     add ecx,sizeof.TreeList
  1475.     @@:
  1476.       call tl_iterat_next
  1477.       cmp edx,ecx
  1478.       jle @f
  1479.       cmp eax,tl_cur_pos
  1480.       je @f
  1481.       inc eax
  1482.       jmp @b
  1483.     @@:
  1484.   mov eax,edx
  1485.   sub eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  1486.   xor edx,edx
  1487.   mov ecx,sizeof.TreeList
  1488.   div ecx
  1489.   pop edx ecx
  1490.   ret
  1491.  
  1492. ;input:
  1493. ; edx = pointer node memory
  1494. ; edi = pointer 'tl' struct
  1495. ;output:
  1496. ; eax = struct index of current node
  1497. align 4
  1498. tl_get_node_index: ;áåðåò ïîçèöèþ óêàçàííîãî ñèìâîëà
  1499.   push ecx edx
  1500.   mov eax,edx
  1501.   sub eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  1502.   xor edx,edx
  1503.   mov ecx,sizeof.TreeList
  1504.   div ecx
  1505.   pop edx ecx
  1506.   ret
  1507.  
  1508. align 4
  1509. tl_node_delete: ;óäàëèòü óçåë
  1510.   push ebp
  1511.   mov ebp,esp
  1512.   push eax edx edi
  1513.     mov edi,dword[ebp+8]
  1514.     call tl_get_cur_node_index ;eax=po_t
  1515.     cmp eax,2
  1516.     jl @f
  1517.       imul eax,sizeof.TreeList
  1518.       add eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  1519.       mov edx,eax
  1520.       inc tl_ch_tim
  1521.       mov eax,tl_ch_tim
  1522.       mov dword[edx+16],eax
  1523.       call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
  1524.     @@:
  1525.   pop edi edx eax
  1526.   pop ebp
  1527.   ret 4
  1528.  
  1529. align 4
  1530. tl_cur_beg: ;ïîñòàâèòü êóðñîð íà ïåðâûé óçåë
  1531.   push ebp
  1532.   mov ebp,esp
  1533.   push edi
  1534.     mov edi,dword[ebp+8]
  1535.     mov tl_cur_pos,0
  1536.     cmp tl_p_scrol,0
  1537.     je @f
  1538.       mov edi,tl_p_scrol
  1539.       mov dword[edi+24],0
  1540.       push dword edi
  1541.       mov edi,dword[ebp+8]
  1542.       mov edi,tl_sb_draw
  1543.       call dword[edi]
  1544.     @@:
  1545.   pop edi
  1546.  
  1547.   pop ebp
  1548.   ret 4
  1549.  
  1550. align 4
  1551. tl_cur_next: ;ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ íèæå
  1552.   push ebp
  1553.   mov ebp,esp
  1554.   push eax ebx edi esi
  1555.     mov edi,dword[ebp+8]
  1556.     call tl_get_node_count ;eax = node count
  1557.     ;inc eax
  1558.     cmp tl_cur_pos,eax
  1559.     jge .no_redraw
  1560.       mov esi,tl_box_top
  1561.       add esi,tl_box_height ;esi = coord bottom border
  1562.       call tl_draw_null_cursor ;ñòèðàåì êóðñîð
  1563.       inc tl_cur_pos
  1564.  
  1565.     cmp tl_p_scrol,0 ;if not scrol struct
  1566.     je @f
  1567.     call tl_get_rows_count ;eax = rows count
  1568.     mov ebx,tl_p_scrol
  1569.     add eax,dword[ebx+24] ;.position +24
  1570.     cmp tl_cur_pos,eax
  1571.     jl @f
  1572.       inc dword[ebx+24] ;.position +24
  1573.       push dword ebx
  1574.       mov edi,tl_sb_draw ;ïåðåðèñîâêà ñêðîëëèíãà
  1575.       call dword[edi]
  1576.  
  1577.       mov edi,dword[ebp+8] ;restore edi
  1578.       push dword edi
  1579.       call tl_draw ;ïîëíàÿ ïåðåðèñîâêà îêíà
  1580.       jmp .no_redraw
  1581.     @@:
  1582.       mov edi,dword[ebp+8] ;restore edi
  1583.       call tl_draw_cursor ;ïåðåðèñîâêà êóðñîðà
  1584.     .no_redraw:
  1585.   pop esi edi ebx eax
  1586.   pop ebp
  1587.   ret 4
  1588.  
  1589.  
  1590. ;input:
  1591. ; edi = pointer 'tl' struct
  1592. ;output:
  1593. ; eax = struct index of current node
  1594. align 4
  1595. tl_get_node_count: ;áåðåò ÷èñëî âñåõ âèäèìûõ óçëîâ (íå ñ÷èòàÿ çàêðûòûõ äî÷åðíèõ)
  1596.   push ecx edx
  1597.     ;cycle to nodes
  1598.     xor eax,eax
  1599.     mov edx,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  1600.     mov ecx,edx
  1601.     add ecx,sizeof.TreeList
  1602.     @@:
  1603.       call tl_iterat_next
  1604.       cmp edx,ecx
  1605.       jle @f
  1606.       inc eax
  1607.       jmp @b
  1608.     @@:
  1609.   pop edx ecx
  1610.   ret
  1611.  
  1612. align 4
  1613. tl_cur_perv: ;ïåðåíåñòè êóðñîð íà 1 ïîçèöèþ âûøå
  1614.   push ebp
  1615.   mov ebp,esp
  1616.   push eax edi esi
  1617.     mov edi,dword[ebp+8]
  1618.     cmp tl_cur_pos,0
  1619.     je .no_redraw
  1620.       mov esi,tl_box_top
  1621.       add esi,tl_box_height ;esi = coord bottom border
  1622.       call tl_draw_null_cursor ;ñòèðàåì êóðñîð
  1623.       dec tl_cur_pos ;äâèãàåì êóðñîð ââåðõ
  1624.  
  1625.     cmp tl_p_scrol,0 ;åñëè åñòü óêàçàòåëü íà ñêðîëëèíã
  1626.     je @f
  1627.     mov eax,tl_p_scrol
  1628.     cmp dword[eax+24],0 ;åñëè ñêðîëëèíã íà âåðõó, âûõîäèì
  1629.     je @f
  1630.     mov edi,tl_cur_pos
  1631.     cmp edi,dword[eax+24] ;åñëè êóðñîð óøåë âûøå ñêðîëëèíãà, òîãäà îïóñêàåì ñêðîëëèíã
  1632.     jge @f
  1633.       dec dword[eax+24]
  1634.       push dword eax
  1635.       mov edi,dword[ebp+8]
  1636.       mov edi,tl_sb_draw ;.redraw
  1637.       call dword[edi]
  1638.       mov edi,dword[ebp+8] ;restore edi
  1639.       push dword edi
  1640.       call tl_draw ;ïîëíàÿ ïåðåðèñîâêà îêíà
  1641.       jmp .no_redraw
  1642.     @@:
  1643.       mov edi,dword[ebp+8] ;restore edi
  1644.       ;mov esi,tl_box_top
  1645.       ;add esi,tl_box_height ;esi = coord bottom border
  1646.       call tl_draw_cursor ;ïåðåðèñîâêà êóðñîðà
  1647.     .no_redraw:
  1648.   pop esi edi eax
  1649.   pop ebp
  1650.   ret 4
  1651.  
  1652. align 4
  1653. tl_node_close_open: ;îòêðûòü/çàêðûòü óçåë (ðàáîòàåò ñ óçëàìè êîòîðûå èìåþò äî÷åðíèå óçëû)
  1654.   push ebp
  1655.   mov ebp,esp
  1656.   push eax edx edi
  1657.     mov edi,dword[ebp+8]
  1658.     call tl_get_cur_node_index ;eax = ïîçèöèÿ óçëà íà êîòîðîì ñòîèò êóðñîð
  1659.     cmp eax,2 ;êóðñîð ñòîèò íà óçëå ?
  1660.     jl @f
  1661.       imul eax,sizeof.TreeList
  1662.       add eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  1663.       ;eax = óêàçàòåëü íà ñòðóêòóðó óçëà âûáðàííîãî êóðñîðîì
  1664.       push dword edi
  1665.       push dword eax
  1666.       call tl_node_poi_get_next_info
  1667.       pop dword edx ;edx = óêàçàòåëü íà ñòðóêòóðó óçëà êîòîðûé èäåò ïîñëå óçëà eax
  1668.       cmp edx,0 ;åñòü ëè óçëû íèæå âûáðàííîãî íàìè ?
  1669.       je @f
  1670.         mov dl,byte[edx+2] ;áåðåì óðîâåíü íèæíåãî óçëà
  1671.         cmp byte[eax+2],dl ;+2 = .lev
  1672.         jge @f ;åñëè íèæíèå óçëû ìåíüøåãî óðîâíÿ, çíà÷èò îíè íå äî÷åðíèå, êîíåö ôóíêöèè
  1673.           xor byte[eax+3],1 ;+3 = .clo *** îòêðûòèå/çàêðûòèå óçëà ***
  1674.           call tb_scrol_resize ;îáðàáîòêà ñêðîëëèíãà
  1675.  
  1676.           push dword edi
  1677.           call tl_draw ;îáíîâëåíèå îêíà
  1678.     @@:
  1679.   pop edi edx eax
  1680.   pop ebp
  1681.   ret 4
  1682.  
  1683. align 4
  1684. tl_node_lev_inc: ;óâåëè÷èòü óðîâåíü
  1685.   push ebp
  1686.   mov ebp,esp
  1687.   push eax edx edi
  1688.     mov edi,dword[ebp+8]
  1689.     bt tl_style,2 ;tl_list_box_mode
  1690.     jc @f
  1691.     call tl_get_cur_node_index ;eax=po_t
  1692.     cmp eax,2
  1693.     jl @f
  1694.       imul eax,sizeof.TreeList
  1695.       add eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  1696.       mov edx,eax
  1697.       inc word[edx+2]
  1698.     @@:
  1699.   pop edi edx eax
  1700.   pop ebp
  1701.   ret 4
  1702.  
  1703. align 4
  1704. tl_node_lev_dec: ;óìåíüøèòü óðîâåíü
  1705.   push ebp
  1706.   mov ebp,esp
  1707.   push eax edx edi
  1708.     mov edi,dword[ebp+8]
  1709.     call tl_get_cur_node_index ;eax=po_t
  1710.     cmp eax,2
  1711.     jl @f
  1712.       imul eax,sizeof.TreeList
  1713.       add eax,dword[edi+14] ;+14 óêàçàòåëü íà ñòðóêòóðû óçëîâ
  1714.       mov edx,eax
  1715.       cmp word[edx+2],0
  1716.       je @f
  1717.       dec word[edx+2]
  1718.     @@:
  1719.   pop edi edx eax
  1720.   pop ebp
  1721.   ret 4
  1722.  
  1723. txt_capt_cur db '‘âப ',0
  1724. txt_capt_otm db 'Žâ¬¥­ë',0
  1725. }