From eb764b9844d0b0c9344618ea6bf6c1c6812c585f Mon Sep 17 00:00:00 2001 From: IgorA Date: Fri, 20 Nov 2009 10:15:49 +0000 Subject: [PATCH] add new element 'TreeList' git-svn-id: svn://kolibrios.org@1277 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../libraries/box_lib/trunk/box_lib.asm | 176 +- .../libraries/box_lib/trunk/tl_nod_16.bmp | Bin 0 -> 1590 bytes .../libraries/box_lib/trunk/tl_sys_16.bmp | Bin 0 -> 8502 bytes .../libraries/box_lib/trunk/tree_list.mac | 1725 +++++++++++++++++ .../trunk/tree_list_doc/info_treelist.htm | 175 ++ .../trunk/tree_list_doc/window_tree_list.png | Bin 0 -> 10961 bytes 6 files changed, 2016 insertions(+), 60 deletions(-) create mode 100644 programs/develop/libraries/box_lib/trunk/tl_nod_16.bmp create mode 100644 programs/develop/libraries/box_lib/trunk/tl_sys_16.bmp create mode 100644 programs/develop/libraries/box_lib/trunk/tree_list.mac create mode 100644 programs/develop/libraries/box_lib/trunk/tree_list_doc/info_treelist.htm create mode 100644 programs/develop/libraries/box_lib/trunk/tree_list_doc/window_tree_list.png diff --git a/programs/develop/libraries/box_lib/trunk/box_lib.asm b/programs/develop/libraries/box_lib/trunk/box_lib.asm index bf3f372e36..c3306635e6 100644 --- a/programs/develop/libraries/box_lib/trunk/box_lib.asm +++ b/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 @@ -15,41 +16,42 @@ public EXPORTS section '.flat' code readable align 16 include '../../../../macros.inc' -include 'editbox.mac' ;macro which should make life easier :) specially for editbox +include 'editbox.mac' ;macro which should make life easier :) specially for editbox include 'checkbox.mac' ;macro implements checkbox include 'optionbox.mac' ;macro implements optionbox include 'scrollbar.mac' ;macro implements scrollbar 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 ;---------------------------------------------------- align 16 -use_editbox_draw ;macro reveals the function of the display. +use_editbox_draw ;macro reveals the function of the display. align 16 -use_editbox_key ;macro reveals processing function of the keypad. +use_editbox_key ;macro reveals processing function of the keypad. align 16 -use_editbox_mouse ;macro reveals processing function of the mouse. +use_editbox_mouse ;macro reveals processing function of the mouse. ;---------------------------------------------------- ;CheckBox ;---------------------------------------------------- align 16 -use_checkbox_draw ;macro reveals the function of the display. +use_checkbox_draw ;macro reveals the function of the display. align 16 -use_checkbox_mouse ;macro reveals processing function of the mouse. +use_checkbox_mouse ;macro reveals processing function of the mouse. ;-------------------------------------------------- ;radiobutton Group ;-------------------------------------------------- align 16 -use_optionbox_driver ;macro that control the operating modes +use_optionbox_driver ;macro that control the operating modes align 16 -use_optionbox_draw ;macro reveals the function of the display. +use_optionbox_draw ;macro reveals the function of the display. align 16 -use_optionbox_mouse ;macro reveals processing function of the mouse. +use_optionbox_mouse ;macro reveals processing function of the mouse. ;-------------------------------------------------- ;scrollbar Group @@ -89,81 +91,135 @@ ret ;align 16 ;mouse_flag dd 0x0 +;-------------------------------------------------- +;tree list +;-------------------------------------------------- +align 16 +use_tree_list + + align 16 EXPORTS: - dd sz_init, init - dd sz_version, 0x00000001 + dd sz_init, init + dd sz_version, 0x00000001 - dd sz_edit_box, edit_box - dd sz_edit_box_key, edit_box_key - dd sz_edit_box_mouse, edit_box_mouse - dd szVersion_ed, 0x00000001 + dd sz_edit_box, edit_box + dd sz_edit_box_key, edit_box_key + dd sz_edit_box_mouse, edit_box_mouse + dd szVersion_ed, 0x00000001 - dd sz_check_box_draw, check_box_draw - dd sz_check_box_mouse, check_box_mouse - dd szVersion_ch, 0x00000001 + dd sz_check_box_draw, check_box_draw + dd sz_check_box_mouse, check_box_mouse + dd szVersion_ch, 0x00000001 - dd sz_option_box_draw, option_box_draw - dd sz_option_box_mouse, option_box_mouse - dd szVersion_op, 0x00000001 + dd sz_option_box_draw, option_box_draw + dd sz_option_box_mouse, option_box_mouse + dd szVersion_op, 0x00000001 - dd sz_Scrollbar_ver_draw, scroll_bar_vertical.draw - dd sz_Scrollbar_ver_mouse, scroll_bar_vertical.mouse - dd sz_Scrollbar_hor_draw, scroll_bar_horizontal.draw - dd sz_Scrollbar_hor_mouse, scroll_bar_horizontal.mouse - dd szVersion_scrollbar, 0x00010001 + dd sz_Scrollbar_ver_draw, scroll_bar_vertical.draw + dd sz_Scrollbar_ver_mouse, scroll_bar_vertical.mouse + dd sz_Scrollbar_hor_draw, scroll_bar_horizontal.draw + dd sz_Scrollbar_hor_mouse, scroll_bar_horizontal.mouse + dd szVersion_scrollbar, 0x00010001 - dd sz_Dbutton_draw, dinamic_button.draw - dd sz_Dbutton_mouse, dinamic_button.mouse - dd szVersion_dbutton, 0x00010001 + dd sz_Dbutton_draw, dinamic_button.draw + dd sz_Dbutton_mouse, dinamic_button.mouse + dd szVersion_dbutton, 0x00010001 - dd sz_Menu_bar_draw, menu_bar.draw - dd sz_Menu_bar_mouse, menu_bar.mouse - dd sz_Menu_bar_activate, menu_bar.activate - dd szVersion_menu_bar, 0x00010002 + dd sz_Menu_bar_draw, menu_bar.draw + dd sz_Menu_bar_mouse, menu_bar.mouse + dd sz_Menu_bar_activate, menu_bar.activate + dd szVersion_menu_bar, 0x00010002 - dd sz_FileBrowser_draw, fb_draw_panel - dd sz_FileBrowser_mouse, fb_mouse - dd sz_FileBrowser_key, fb_key - dd szVersion_FileBrowser, 0x00010001 - dd 0,0 + dd sz_FileBrowser_draw, fb_draw_panel + 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 -sz_init db 'lib_init',0 -sz_version db 'version',0 +sz_init db 'lib_init',0 +sz_version db 'version',0 -sz_edit_box db 'edit_box',0 +sz_edit_box db 'edit_box',0 sz_edit_box_key db 'edit_box_key',0 sz_edit_box_mouse db 'edit_box_mouse',0 -szVersion_ed db 'version_ed',0 +szVersion_ed db 'version_ed',0 sz_check_box_draw db 'check_box_draw',0 sz_check_box_mouse db 'check_box_mouse',0 -szVersion_ch db 'version_ch',0 +szVersion_ch db 'version_ch',0 sz_option_box_draw db 'option_box_draw',0 sz_option_box_mouse db 'option_box_mouse',0 -szVersion_op db 'version_op',0 +szVersion_op db 'version_op',0 -sz_Scrollbar_ver_draw db 'scrollbar_v_draw',0 -sz_Scrollbar_ver_mouse db 'scrollbar_v_mouse',0 -sz_Scrollbar_hor_draw db 'scrollbar_h_draw',0 -sz_Scrollbar_hor_mouse db 'scrollbar_h_mouse',0 -szVersion_scrollbar db 'version_scrollbar',0 +sz_Scrollbar_ver_draw db 'scrollbar_v_draw',0 +sz_Scrollbar_ver_mouse db 'scrollbar_v_mouse',0 +sz_Scrollbar_hor_draw db 'scrollbar_h_draw',0 +sz_Scrollbar_hor_mouse db 'scrollbar_h_mouse',0 +szVersion_scrollbar db 'version_scrollbar',0 -sz_Dbutton_draw db 'dbutton_draw',0 -sz_Dbutton_mouse db 'dbutton_mouse',0 -szVersion_dbutton db 'version_dbutton',0 +sz_Dbutton_draw db 'dbutton_draw',0 +sz_Dbutton_mouse db 'dbutton_mouse',0 +szVersion_dbutton db 'version_dbutton',0 -sz_Menu_bar_draw db 'menu_bar_draw',0 -sz_Menu_bar_mouse db 'menu_bar_mouse',0 -sz_Menu_bar_activate db 'menu_bar_activate',0 -szVersion_menu_bar db 'version_menu_bar',0 +sz_Menu_bar_draw db 'menu_bar_draw',0 +sz_Menu_bar_mouse db 'menu_bar_mouse',0 +sz_Menu_bar_activate db 'menu_bar_activate',0 +szVersion_menu_bar db 'version_menu_bar',0 -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 \ No newline at end of file +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 + + 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 \ No newline at end of file diff --git a/programs/develop/libraries/box_lib/trunk/tl_nod_16.bmp b/programs/develop/libraries/box_lib/trunk/tl_nod_16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c08904a44bf445d68c3f7ebe9ca705f5ae0da149 GIT binary patch literal 1590 zcmZ?rHDhA{12Z700mK48tN_G}3=%*R0 z^wgW}PbE|(L_JK4;%}tH547c(pZm*TrbliJ|LV}ygS3_$`}ZGMy7Z)% z*PHlwOvMoE-bP29Q{)9XWBvMLQBhAqLLecD<``t|>xhWcW@dN1yndFJB8%f=<4Df{ DV5j`v literal 0 HcmV?d00001 diff --git a/programs/develop/libraries/box_lib/trunk/tl_sys_16.bmp b/programs/develop/libraries/box_lib/trunk/tl_sys_16.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3ba8426daff832f41d450ae0b64a067814a2eb38 GIT binary patch literal 8502 zcmeI1Pe>F|9LIl_f7W%yy(tl8hpIB^8~FJ=AesB0N+i(j{Emes5;>?b|o+J*Ny7b(Y@@za2lnH{bW$-~9GH z_h`7`0GO`^JRia%h{qE=il7G1*6ULx06DU+jA0bSl0*H`4s9xOd@Xw2jR1t956TBi zn%fS#2_bwOAPxRuLCDXM;mM03WT-XjwS>=zLoRjHmtNaV0M?dGJ{uBlucH&GI_ZNi z*}o#-v^0PQls|l?8s3O78khioQwimt_MR&X72^nbHkTbC0fCm%g@G>0I~_YeIKB%Q z!)@LjjC{OXM{THCEyF3SfLA~>Ad?}cxq2u(Uj1Qt`SJ3@W`M1Sah-NDxj#N;Fbv&NUhST3nez5*oyB#rpJ046re%0f*q<9$H)p74~=Qt;c z^7~g-`1=34TG2fA7yOGv?WvfIFFk*U+>5bbIQIUEs{Xm5gm0;Sbc6tRajWy(biB7- z2D}Vx;|%M_{%`wf-S1 zZD#R*|J0wIfM*}XylDM{748e&WXqoVdv(G3M_AFam~-Qq8$W;lD}*tb0zQ$F!5nYxe^Ikj2K|`W@##f{ zvz>T1_0P`NP5txyM)l9~Zt6eBTm65d`d9UTQT?m>zo`EC{=ZTEv!zAyiTT0jOIgx1 z#OB?>80Dt^>EK)1iR(rb`-x_t<7OfN2Ee>&?s@BXp#R2G%_!T{V~=l5#5os6Gb&#M z`v)y_tcl<`Pa89)HL~-(DZV-|X5NB`_Z3fCdQ8Wfj)8#evtYF4X($v==c3Ro)8<|O sw+t-ndQ#IAh5$SAOMs-NG6Xn2ga6x>+a~#U!2ph+Fa%gVo-fP5AH1lRFaQ7m literal 0 HcmV?d00001 diff --git a/programs/develop/libraries/box_lib/trunk/tree_list.mac b/programs/develop/libraries/box_lib/trunk/tree_list.mac new file mode 100644 index 0000000000..e05c57dff9 --- /dev/null +++ b/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 + +элемент Tree List + + + + +

Оглавление

+

Введение

+

Функции

+
    +
  • tl_data_init
  • +
  • tl_data_clear
  • +
  • tl_info_clear
  • +
  • tl_key
  • +
  • tl_mouse
  • +
  • tl_draw
  • +
  • tl_info_undo
  • +
  • tl_info_redo
  • +
  • tl_node_add
  • +
  • tl_node_set_data
  • +
  • tl_node_get_data
  • +
  • tl_node_delete
  • +
  • tl_cur_beg
  • +
  • tl_cur_next
  • +
  • tl_cur_perv
  • +
  • tl_node_close_open
  • +
  • tl_node_lev_inc
  • +
  • tl_node_lev_dec
  • +
  • tl_node_poi_get_info
  • +
  • tl_node_poi_get_next_info
  • +
  • tl_node_poi_get_data
  • +
  • version_tree_list
  • +
+

Стили элемента

+ +

Введение

+

Внешний вид элемента управления TreeList:

+

+ +

Функции

+ +

tl_data_init

+

Конструктор элемента, нужно вызывать перед использованием элемента для выделения памяти и других настроек.

+

tl_data_clear

+

Деструктор элемента.

+

tl_info_clear

+

Очистка списка от всех узлов.

+

tl_key

+

Функция которую нужно вызывать при нажатии на клавиатуру.

+

tl_mouse

+

Функция для событий от мыши.

+

tl_draw

+

Полная перерисовка окна элемента.

+

tl_info_undo

+

Отменяет добавление узлов. Действует только на весь узел целиком, не учитывая изменения внутри узлов. Т. е. нельзя отменить действия выполненные например функциями: tl_node_set_data, tl_node_lev_inc и им подобным.

+

tl_info_redo

+

+

tl_node_add

+

Добавляет узел, в позицию указанную курсором.

+

tl_node_set_data

+

Устанавливает новые данные (пользовательские и подпись) в узел под курсором.

+

tl_node_get_data

+

Берет указатель на данные (пользовательские и подпись) из узла под курсором.

+

tl_node_delete

+

Удаляет узел, но не окончательно, при необходимости узел можно вернуть функцией tl_info_undo.

+

tl_cur_beg

+

Ставит курсор в начало списка, перематывает скроллинг если нужно.

+

tl_cur_next

+

Переносит курсор ниже.

+

tl_cur_perv

+

Переносит курсор выше.

+

tl_node_close_open

+

Открывает или закрывает родительский узел. Если у узла нет дочерних элементов, + то ничего не делает. Автоматически перерисовывает окно если состояние узла изменилось.

+

tl_node_lev_inc

+

Добавить уровень узла под курсором. Делает узел дочерним.

+

tl_node_lev_dec

+

Уменьшает уровень узла под курсором. Делает узел родительским.

+

tl_node_poi_get_info

+

Берет внутренний указатель на структуру описывающую узел.

+

tl_node_poi_get_next_info

+

+

tl_node_poi_get_data

+

Берет указатель на данные (пользовательские и подпись) из узла указанного в указателе.

+

version_tree_list

+

Версия элемента

+ +

Структура tree_list

+
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
+}
+

data_img - указатель на изображения с иконками узлов.

+

data_img_sys - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов).

+

p_scrol - указатель на структуру скроллинга, связанного с данным элементом.

+

p_sb_draw - указатель на функцию перерисовки вертикального скроллинга (scrollbar_ver_draw).

+

fun_enter - указатель на функцию, которая будет вызвана при нажитии [Enter]. Если указатель равен 0 то ничего не будет вызыватся.

+ +

Стили элемента

+

tl_key_no_edit

+

Элемент нельзя редактировать на клавиатуре (изменять уровни, удалять). Ставьте этот стиль если нужно создать элемент только для просмотра данных.

+

tl_draw_par_line

+

Рисовать линии к родительскому узлу.

+

tl_list_box_mode

+

Стиль не отображает уровни (как в ListBox все узлы одного уровня).

+ + + \ No newline at end of file diff --git a/programs/develop/libraries/box_lib/trunk/tree_list_doc/window_tree_list.png b/programs/develop/libraries/box_lib/trunk/tree_list_doc/window_tree_list.png new file mode 100644 index 0000000000000000000000000000000000000000..20087d5cbc889069313aef810dd031fdab9e15d3 GIT binary patch literal 10961 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 EKR4~nl>h($ literal 0 HcmV?d00001