Box lib tree list

From KolibriOS wiki
Jump to navigation Jump to search

Functions

  • tl_data_init - Element constructor, must be called before using the item to allocate memory and other settings.
  • tl_data_clear - Деструктор элемента, чистит память по указателям: data_info, data_nodes, data_img и data_img_sys. Если в программе используется несколько элементов с одинаковыми иконками, то указатели data_img и data_img_sys нужно приравнять к 0 в других элементах, так что-бы при вызове деструкторов не было повторного удаления одних и тех же иконок.
  • tl_info_clear - Clearing the list of all nodes. You can not undo with tl_info_undo.
  • tl_key - Function that should be called when you press on the keyboard. Buttons that are not available if there is tl_key_no_edit style: [Enter], [Delete], [←], [→]. Always available: [↑], [↓], [Page Up], [Page Dn], [Space]. The function checks whether the scan code is enabled, and if necessary, converts the code itself.
  • tl_mouse - Function for mouse events.
  • tl_draw - draw tree list.
  • tl_info_undo - Отменяет добавление узлов. Действует только на весь узел целиком, не учитывая изменения внутри узлов. Т. е. нельзя отменить действия выполненные например функциями: tl_node_set_data, tl_node_lev_inc и им подобным.
  • tl_info_redo - Повтор отмененных действий. Обратная функция по отношению к tl_info_undo.
  • tl_node_add - Adds a node to the position indicated by the cursor. Example of adding a node:

<syntaxhighlight lang="asm"> stdcall dword[tl_node_add], tree1, 0x10002, data_buffer</syntaxhighlight> where: tree1 - tree_list structure; 0x10002 - site settings (upper bytes of 0x0001 - index icon type that is displayed next to the node; a smaller byte 0x02 - level of nesting); data_buffer - pointer to the data to add.

  • tl_node_set_data - sets the new data (user and signature) of the node under the cursor.
  • tl_node_get_data - returns a pointer to the data (user and signature) of the node under the cursor.
  • tl_node_delete - удаляет узел, но не окончательно, при необходимости узел можно вернуть функцией tl_info_undo.
  • tl_cur_beg - puts the cursor at the top of the list, if you want to rewind the scroll.
  • tl_cur_next - moves the cursor one position lower.
  • tl_cur_perv - moves the cursor one position higher.
  • tl_node_close_open - Opens or closes the parent node. If this node has no child elements, it does nothing. Automatically redraws the screen if the host state has changed.
  • tl_node_lev_inc - Increments level of nesting of the node.
  • tl_node_lev_dec - Decrements level of nesting of the node.
  • tl_node_move_up - Moves up the node under the cursor. Example:

<syntaxhighlight lang="asm"> push dword tree1

 call dword[tl_node_move_up]</syntaxhighlight>

where: tree1 - tree_list structure

  • tl_node_move_down

moves down the node under the cursor. Example: <syntaxhighlight lang="asm"> push dword tree1

 call dword[tl_node_move_down]</syntaxhighlight>

where: tree1 - tree_list structure

  • tl_node_poi_get_info - Get the internal pointer to a structure describing the node. Example:

<syntaxhighlight lang="asm">stdcall dword[tl_node_poi_get_info], tree1, 0</syntaxhighlight> where: tree1 - tree_list structure; 0 - node position at which the pointer is taken; the eax - a pointer to a structure describing the node.

  • tl_node_poi_get_next_info - берет указатель на следующий элемент в цепи, без учета открытия/закрытия дочерних узлов.
  • tl_node_poi_get_data - берет указатель на данные (пользовательские и подпись) из узла указанного в указателе.

Функциями tl_node_poi_get_info, tl_node_poi_get_next_info и tl_node_poi_get_data можно считывать информацию о узлах элемента, при этом не меняя текущего положения курсора. Т. е. можно организовать доступ к данным элемента в "фоновом режиме".

  • tl_save_mem - Сохраняет информацию об узлах элемента в память. Пример использования функции:

<syntaxhighlight lang="asm"> MEM_SIZE equ 5000

 node_data rb MEM_SIZE

.........

 stdcall dword[tl_save_mem], tree1, 0, node_data, MEM_SIZE</syntaxhighlight>

где: tree1 - структура tree_list; 0 - опция сохранения в начало блока памяти (если = 1, то добавляет элемент после других сохраненных ранее); node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок сохранения.

  • tl_load_mem - Загружает информацию об узлах элемента из памяти. Пример использования функции:

<syntaxhighlight lang="asm"> MEM_SIZE equ 5000

 node_data rb MEM_SIZE

.........

 stdcall dword[tl_load_mem], tree1, 0, node_data, MEM_SIZE</syntaxhighlight>

где: tree1 - структура tree_list; 0 - индекс считываемого элемента; node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок считывания.

  • tl_get_mem_size - Вычисляет размер блока памяти (в который были раньше сохранены элементы). Эту функцию можно использовать перед сохранением на диск, для получения точного размера сохраняемых данных.
  • version_tree_list - version element

tree_list structure

<syntaxhighlight lang="asm">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,\
   info_capt_len,el_focus, p_scrol,on_press {
 .box_left   dd box_l
 .box_top    dd box_t
 .box_width  dd box_w
 .box_height dd box_h
 .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
 .tim_undo   dd 0
 .cur_pos    dd 0
 .col_bkg    dd col_bkg
 .col_zag    dd col_zag
 .col_txt    dd col_txt
 .capt_cy    dw capt_cy
 .info_capt_offs dw info_capt_offs
 .info_capt_len  dw info_capt_len
 .el_focus    dd el_focus
 .p_scrol     dd p_scrol
 .on_press    dd on_press

}</syntaxhighlight>

  • info_size - the number of bytes that will be allocated for each node. Part of this memory, the user can use for their own purposes (regulated through info_capt_offs and info_capt_len) and the rest will be used as a node signature.
  • info_max_count - the maximum number of nodes that can be added to an element.
  • style - style element.
  • data_nodes - указатель на внутренние структуры узлов (TreeList).
  • data_img - указатель на изображения с иконками узлов. Формат изображения такой же как и в сист. ф. 7: BBGGRRBBGGRR....
  • img_cx - width of a single icon.
  • img_cy - the height of a single icon.
  • data_img_sys - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов). Формат изображения такой же как и в сист. ф. 7: BBGGRRBBGGRR...
  • col_bkg - background color.
  • col_zag - the color of the title bar (if specified) and the buttons and slider to the vertical scroll bar (if any).
  • col_txt - the color of the text.
  • capt_cy - высота строки для подписи вверху элемента, если меньше 9 подпись не выводится.
  • info_capt_len - длинна текста для подписи. Если равно 0, то длинна считается так: info_size - info_capt_offs.
  • p_scrol - a pointer to the scroll structure associated with the item.
  • on_press - a pointer to a function that will be called by pressing [Enter]. If the index is equal to 0 then nothing will be called.

Example of creating a structure: <syntaxhighlight lang="asm">tree1 tree_list 24,500, tl_draw_par_line+tl_list_box_mode, 16,16,\

   0x8080ff,0x0000ff,0xffffff, 10,35,200-16,285, 14,4,0,\
   el_focus, wScr,fun_on_enter</syntaxhighlight>

Style elements

  • tl_key_no_edit

The element can not be edited on the keyboard (to change levels, delete). Put this style if you want to create an item to view the data.

  • tl_draw_par_line

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

  • tl_list_box_mode

The style does not display the levels (as in the ListBox all nodes are of the same level).

Example

To compile include the full path to SVN directory. The program uses two icon files tl_sys_16.bmp and tl_nod_16.bmp from programs\develop\libraries\box_lib\trunk. The files macros.inc, proc32.inc, etc. can be found in programs directory. <syntaxhighlight lang="asm">use32  ; use 32-bit command

standard header
   db 'MENUET01'      ; signature
   dd 1               ; header version
   dd start           ; entry point
   dd i_end           ; initialized size
   dd mem             ; required memory
   dd stacktop        ; stack pointer
   dd file_name       ; parameters
   dd cur_dir_path    ; path

include 'macros.inc' include 'proc32.inc' include 'box_lib.mac' include 'load_lib.mac' include 'dll.inc' ;for mem.Alloc,mem.Free,mem.ReAlloc

@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,0

struct FileInfoBlock

   Function dd ?
   Position dd ?
   Flags    dd ?
   Count    dd ?
   Buffer   dd ?
            db ?
   FileName dd ?

ends

fn_icon1 db 'tl_sys_16.bmp',0 fn_icon2 db 'tl_nod_16.bmp',0 bmp_icon dd 0 run_file_70 FileInfoBlock

align 4 start:

   ; load libraries
   stdcall dll.Load, @IMPORT_BOXLIB
   test    eax, eax
   jnz     exit

   mcall 48,3,sc,sizeof.system_colors
   mcall 40,0x27 ;mask anticipated events
   mcall 68,11

   stdcall dword[tl_data_init], tree1

read * .bmp file system icons
   copy_path fn_icon1,cur_dir_path,file_name,0

   mov ecx,3*256*13
   stdcall mem.Alloc,ecx
   mov [bmp_icon],eax

   mov [run_file_70.Buffer], eax
   mov [run_file_70.Function], 0
   mov [run_file_70.Position], 54
   mov [run_file_70.Flags], 0
   mov [run_file_70.Count], ecx
   mov byte[run_file_70+20], 0
   mov [run_file_70.FileName], file_name
   mcall 70,run_file_70
   cmp ebx,0
   jl @f
       m2m dword[tree1.data_img_sys],dword[bmp_icon]
   @@:

read * .bmp file with the icon of nodes
   copy_path fn_icon2,cur_dir_path,file_name,0

   mov ecx,3*256*13
   stdcall mem.Alloc,ecx
   mov [bmp_icon],eax

   mov [run_file_70.Buffer], eax
   ;mov [run_file_70.Function], 0
   ;mov [run_file_70.Position], 54
   ;mov [run_file_70.Flags], 0
   mov [run_file_70.Count], ecx
   mov byte[run_file_70+20], 0
   mov [run_file_70.FileName], file_name
   mcall 70,run_file_70
   cmp ebx,0
   jl @f
       m2m dword[tree1.data_img],dword[bmp_icon]
   @@:

Redraw the window

align 4 red_win:

   mcall 12,1

   xor eax,eax ; draw window
   mov ebx,30*65536+320
   mov ecx,25*65536+255
   mov edx,[sc.work]
   or  edx,0x33000000
   mov edi,hed
   mcall

   ; buttons
   mov eax,8
   mov ebx,215*65536+85
   mov ecx,5*65536+15
   mov edx,2
   mov esi,[sc.work_button]
   int 0x40

   mov ebx,215*65536+60
   mov ecx,25*65536+15
   mov edx,3
mov esi,0xffd000
   int 0x40

   mov ebx,215*65536+85
   mov ecx,45*65536+15
   mov edx,4
   int 0x40

   mov ecx,65*65536+15
   mov edx,5
   int 0x40

   mov ecx,85*65536+15
   mov edx,6
   int 0x40

   mov ecx,105*65536+15
   mov edx,7
   int 0x40

   mov ecx,125*65536+15
   mov edx,8
   int 0x40

   mov ecx,145*65536+15
   mov edx,9
   int 0x40

   mov ecx,165*65536+15
   mov edx,10
   int 0x40

   mov ecx,185*65536+15
   mov edx,11
   int 0x40

   mov ecx,205*65536+15
   mov edx,12
   int 0x40

   mov ebx,280*65536+20
   mov ecx,25*65536+15
   mov edx,100
   mov esi,0xd0d0
   int 0x40

   mov eax,4 ;drawing text
   mov ebx,10*65536+25
   mov ecx,[sc.work_button_text]
   or  ecx,0x80000000
   mov edx,dword[node_data]
   int 0x40

   mov eax,4 ;drawing text on buttons
   mov ebx,220*65536+10
   mov edx,txt10
   int 0x40

   mov ebx,220*65536+30
   mov edx,txt11
   int 0x40

   mov ebx,220*65536+50
   mov edx,txt12
   int 0x40

   mov ebx,220*65536+70
   mov edx,txt13
   int 0x40

   mov ebx,220*65536+90
   mov edx,txt14
   int 0x40

   mov ebx,220*65536+110
   mov edx,txt15
   int 0x40

   mov ebx,220*65536+130
   mov edx,txt16
   int 0x40

   mov ebx,220*65536+150
   mov edx,txt17
   int 0x40

   mov ebx,220*65536+170
   mov edx,txt18
   int 0x40

   mov ebx,220*65536+190
   mov edx,txt19
   int 0x40

   mov ebx,220*65536+210
   mov edx,txt20
   int 0x40

   stdcall dword[tl_draw], tree1
   stdcall [edit_box_draw], dword edit1

   mov dword[wScr.all_redraw],1
   stdcall [scrollbar_ver_draw], dword wScr

   mcall 12,2
   jmp still


align 4 still:

   mcall 10

   cmp al, 1 ;change in window position
   jz  red_win
   cmp al, 2
   jz  key
   cmp al, 3
   jz  button
   cmp al, 6
   jz  mouse
   jmp still

align 4 key:

   mcall 2
   stdcall [tl_key], tree1
   stdcall [edit_box_key], dword edit1
   jmp still

align 4 button:

   mcall 17 ;get the code of the pressed button
   cmp ah,2
   jz  but_clear
   cmp ah,3
   jz  but_add_node
   cmp ah,4
   jz  but_undo
   cmp ah,5
   jz  but_redo
   cmp ah,6
   jz  but_lev_add
   cmp ah,7
   jz  but_lev_dec
   cmp ah,8
   jz  but_node_set_data
   cmp ah,9
   jz  but_node_get_data
   cmp ah,10
   jz  but_node_delete
   cmp ah,11
   jz  but_node_move_up
   cmp ah,12
   jz  but_node_move_down
   cmp ah,100
   jz  but_add_node_2

   cmp ah,1
   jne still

exit:

stdcall mem.Free,[bmp_icon]
   stdcall dword[tl_data_clear], tree1
   mcall -1 ;выход из программы


align 4 mouse:

   stdcall [tl_mouse], tree1
   stdcall [edit_box_mouse], dword edit1
   jmp still

but_clear:

   stdcall dword[tl_info_clear], tree1
   stdcall dword[tl_draw], tree1
   jmp still

Add a node (the icon which is at index 0)

but_add_node:

   stdcall dword[tl_node_add], tree1, 0, ed_buffer
   stdcall dword[tl_draw], tree1
   jmp still

Add a node (the icon which is at index 1)

but_add_node_2:

   stdcall dword[tl_node_add], tree1, 0x10000, ed_buffer
   stdcall dword[tl_draw], tree1
   jmp still

but_undo:

 stdcall dword[tl_info_undo], tree1
 stdcall dword[tl_draw], tree1
 jmp still

but_redo:

 stdcall dword[tl_info_redo], tree1
 stdcall dword[tl_draw], tree1
 jmp still

but_lev_add:

 stdcall dword[tl_node_lev_inc], tree1
 stdcall dword[tl_draw], tree1
 jmp still

but_lev_dec:

 stdcall dword[tl_node_lev_dec], tree1
 stdcall dword[tl_draw], tree1
 jmp still

We set the (new) unit data

but_node_set_data:

   stdcall dword[tl_node_set_data], tree1, ed_buffer
   stdcall dword[tl_draw], tree1
   jmp still
Take a pointer to the node data

but_node_get_data: push eax

   stdcall dword[tl_node_get_data], tree1
   mov dword[node_data], eax

pop eax

   jmp red_win ;still

Remove the node

but_node_delete:

 stdcall dword[tl_node_delete], tree1
 stdcall dword[tl_draw], tree1
 jmp still

Function to call when you press [Enter]

align 4 fun_on_enter:

   stdcall dword[tl_node_set_data], tree1, txt_on_enter
   stdcall dword[tl_draw], tree1
   ret

but_node_move_up:

 stdcall dword[tl_node_move_up], tree1
 jmp still

but_node_move_down:

 stdcall dword[tl_node_move_down], tree1
 jmp still

подписи на кнопки

txt10 db 'List Clear',0 txt11 db 'Node add',0 txt12 db 'List Undo',0 txt13 db 'List Redo',0 txt14 db 'Node lev >>',0 txt15 db 'Node lev <<',0 txt16 db 'Node set data',0 txt17 db 'Node get data',0 txt18 db 'Node delete',0 txt19 db 'Node move ',24,0 ;24 up txt20 db 'Node move ',25,0 ;25 down

A table of imported functions

align 4 @IMPORT_BOXLIB:

library box_lib, 'box_lib.obj'

import box_lib, \

       edit_box_draw,      'edit_box', \
       edit_box_key,       'edit_box_key', \
       edit_box_mouse,     'edit_box_mouse', \
       version_ed,         'version_ed', \
       scrollbar_ver_draw ,'scrollbar_v_draw', \
       scrollbar_ver_mouse,'scrollbar_v_mouse', \
       scrollbar_hor_draw, 'scrollbar_h_draw', \
       scrollbar_hor_mouse,'scrollbar_h_mouse', \
       version_scrollbar,  'version_scrollbar', \
       tl_info_undo,       'tl_info_undo', \
       tl_info_redo,       'tl_info_redo', \
       tl_node_lev_inc,    'tl_node_lev_inc', \
       tl_node_lev_dec,    'tl_node_lev_dec', \
       tl_node_move_up,    'tl_node_move_up', \
       tl_node_move_down,  'tl_node_move_down', \
       tl_data_init,       'tl_data_init', \
       tl_data_clear,      'tl_data_clear', \
       tl_info_clear,      'tl_info_clear', \
       tl_key,             'tl_key', \
       tl_mouse,           'tl_mouse', \
       tl_draw,            'tl_draw', \
       tl_node_add,        'tl_node_add', \
       tl_node_set_data,   'tl_node_set_data', \
       tl_node_get_data,   'tl_node_get_data', \
       tl_node_delete,     'tl_node_delete', \
       tl_cur_beg,         'tl_cur_beg', \
       tl_cur_next,        'tl_cur_next', \
       tl_cur_perv,        'tl_cur_perv', \
       tl_node_close_open, 'tl_node_close_open' 

Element structure tree_list

tree1 tree_list 24,500, tl_draw_par_line, 16,16, 0x8080ff,0x0000ff,0xffffff,\

   10,35,200-16,185, 14,4,0, el_focus, wScr,fun_on_enter

A subsidiary structure for scrolling

align 4 wScr: .x: .size_x dw 16 ;+0 .start_x dw 210-16 ;+2 .y: .size_y dw 185 ;+4 .start_y dw 35 ;+6 .btn_high dd 15 ;+8 .type dd 1  ;+12 .max_area dd 100  ;+16 .cur_area dd 30  ;+20 .position dd 0  ;+24 .bckg_col dd 0xeeeeee ;+28 .frnt_col dd 0xbbddff ;+32 .line_col dd 0  ;+36 .redraw dd 0  ;+40 .delta dw 0  ;+44 .delta2 dw 0  ;+46 .run_x: .r_size_x dw 0  ;+48 .r_start_x dw 0  ;+50 .run_y: .r_size_y dw 0 ;+52 .r_start_y dw 0 ;+54 .m_pos dd 0 ;+56 .m_pos_2 dd 0 ;+60 .m_keys dd 0 ;+64 .run_size dd 0 ;+68 .position2 dd 0 ;+72 .work_size dd 0 ;+76 .all_redraw dd 0 ;+80 .ar_offset dd 1 ;+84

Element structure editbox

edit1 edit_box 200, 10, 5, 0xffffff, 0x80ff, 0xff0080, 0, 0xff, 80, ed_buffer, mouse_dd, ed_focus, 13, 13 ed_buffer: db 'dataNode Text',0

   rb 69

txt_on_enter db '1111Enter',0 hed db 'tree_list example',0

-------------------------------------------------------------------------------

node_data dd 0 el_focus dd tree1 mouse_dd dd ?

i_end: ;the end of the executable file

   sc system_colors
   rb 2048

stacktop:

   cur_dir_path rb 4096
   library_path rb 4096
   file_name rb 4096

mem:</syntaxhighlight>