Difference between revisions of "Box lib tree list/ru"

From KolibriOS wiki
Jump to navigation Jump to search
m
m (fix file include in example code)
 
(7 intermediate revisions by 2 users not shown)
Line 9: Line 9:
 
*'''tl_info_redo''' - Повтор отмененных действий. Обратная функция по отношению к tl_info_undo.
 
*'''tl_info_redo''' - Повтор отмененных действий. Обратная функция по отношению к tl_info_undo.
 
*'''tl_node_add''' - Добавляет узел, в позицию указанную курсором. Пример добавления узла:
 
*'''tl_node_add''' - Добавляет узел, в позицию указанную курсором. Пример добавления узла:
<asm>  push dword tree1
+
<syntaxhighlight lang="asm"stdcall dword[tl_node_add], tree1, 0x10002, data_buffer</syntaxhighlight>
  push dword 0x10002
+
где: ''tree1'' - структура tree_list; ''0x10002'' - параметры узла (старшие байты ''0x0001'' - индекс иконки, отображаемой возле узла; меньший байт ''0x02'' - уровень вложености узла); data_buffer - указатель на дынные, добавляемые в узел.
  push dword data_buffer
 
  call dword[tl_node_add]</asm>
 
где: tree1 - структура tree_list; 0x10002 - параметры узла (старшие байты 0x0001 - индекс иконки, отображаемой возле узла; меньший байт 0x02 - уровень вложености узла); data_buffer - указатель на дынные, добавляемые в узел.
 
 
*'''tl_node_set_data''' - устанавливает новые данные (пользовательские и подпись) в узел под курсором.
 
*'''tl_node_set_data''' - устанавливает новые данные (пользовательские и подпись) в узел под курсором.
 
*'''tl_node_get_data''' - берет указатель на данные (пользовательские и подпись) из узла под курсором.
 
*'''tl_node_get_data''' - берет указатель на данные (пользовательские и подпись) из узла под курсором.
Line 24: Line 21:
 
*'''tl_node_lev_dec''' - Уменьшает уровень узла под курсором. Делает узел родительским.
 
*'''tl_node_lev_dec''' - Уменьшает уровень узла под курсором. Делает узел родительским.
 
*'''tl_node_move_up''' - Перемещает вверх узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:
 
*'''tl_node_move_up''' - Перемещает вверх узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:
<asm>  push dword tree1
+
<syntaxhighlight lang="asm">  push dword tree1
   call dword[tl_node_move_up] ;переместить узел</asm>
+
   call dword[tl_node_move_up] ;переместить узел</syntaxhighlight>
где: tree1 - структура tree_list
+
где: ''tree1'' - структура tree_list
 
*'''tl_node_move_down'''
 
*'''tl_node_move_down'''
 
Перемещает вниз узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:
 
Перемещает вниз узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:
<asm>  push dword tree1
+
<syntaxhighlight lang="asm">  push dword tree1
   call dword[tl_node_move_down] ;переместить узел</asm>
+
   call dword[tl_node_move_down] ;переместить узел</syntaxhighlight>
 
где: tree1 - структура tree_list
 
где: tree1 - структура tree_list
*'''tl_node_poi_get_info''' - берет внутренний указатель на структуру описывающую узел.
+
*'''tl_node_poi_get_info''' - Берет внутренний указатель на структуру описывающую узел. Пример использования функции:
 +
<syntaxhighlight lang="asm">stdcall dword[tl_node_poi_get_info], tree1, 0</syntaxhighlight>
 +
где: ''tree1'' - структура tree_list; ''0'' - позиция узла, с которого берется указатель; ''eax'' - указатель на структуру описывающую узел.
 
*'''tl_node_poi_get_next_info''' - берет указатель на следующий элемент в цепи, без учета открытия/закрытия дочерних узлов.
 
*'''tl_node_poi_get_next_info''' - берет указатель на следующий элемент в цепи, без учета открытия/закрытия дочерних узлов.
 
*'''tl_node_poi_get_data''' - берет указатель на данные (пользовательские и подпись) из узла указанного в указателе.
 
*'''tl_node_poi_get_data''' - берет указатель на данные (пользовательские и подпись) из узла указанного в указателе.
  
Функциями tl_node_poi_get_info, 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''' - Сохраняет информацию об узлах элемента в память. Пример использования функции:
 
*'''tl_save_mem''' - Сохраняет информацию об узлах элемента в память. Пример использования функции:
<asm>  MEM_SIZE equ 5000
+
<syntaxhighlight lang="asm">  MEM_SIZE equ 5000
 
   node_data rb MEM_SIZE
 
   node_data rb MEM_SIZE
 
.........
 
.........
   push dword tree1
+
   stdcall dword[tl_save_mem], tree1, 0, node_data, MEM_SIZE</syntaxhighlight>
  push dword 0
+
где: ''tree1'' - структура tree_list; ''0'' - опция сохранения в начало блока памяти (если = 1, то добавляет элемент после других сохраненных ранее); ''node_data'' - указатель на блок памяти; ''MEM_SIZE'' - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок сохранения.
  push dword node_data
 
  push dword MEM_SIZE
 
  call dword[tl_save_mem]
 
  pop eax</asm>
 
где: tree1 - структура tree_list; 0 - опция сохранения в начало блока памяти (если = 1, то добавляет элемент после других сохраненных ранее); node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок сохранения.
 
 
*'''tl_load_mem''' - Загружает информацию об узлах элемента из памяти. Пример использования функции:
 
*'''tl_load_mem''' - Загружает информацию об узлах элемента из памяти. Пример использования функции:
<asm>  MEM_SIZE equ 5000
+
<syntaxhighlight lang="asm">  MEM_SIZE equ 5000
 
   node_data rb MEM_SIZE
 
   node_data rb MEM_SIZE
 
.........
 
.........
   push dword tree1
+
   stdcall dword[tl_load_mem], tree1, 0, node_data, MEM_SIZE</syntaxhighlight>
  push dword 0
+
где: ''tree1'' - структура tree_list; 0 - индекс считываемого элемента; ''node_data'' - указатель на блок памяти; ''MEM_SIZE'' - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок считывания.
  push dword node_data
 
  push dword MEM_SIZE
 
  call dword[tl_load_mem]
 
  pop eax</asm>
 
где: tree1 - структура tree_list; 0 - индекс считываемого элемента; node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок считывания.
 
 
*'''tl_get_mem_size''' - Вычисляет размер блока памяти (в который были раньше сохранены элементы). Эту функцию можно использовать перед сохранением на диск, для получения точного размера сохраняемых данных.
 
*'''tl_get_mem_size''' - Вычисляет размер блока памяти (в который были раньше сохранены элементы). Эту функцию можно использовать перед сохранением на диск, для получения точного размера сохраняемых данных.
 
*'''version_tree_list''' - версия элемента
 
*'''version_tree_list''' - версия элемента
 +
 
==Структура tree_list==
 
==Структура tree_list==
<asm>struc tree_list info_size,info_max_count,style, img_cx,img_cy,\
+
<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,\
 
     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 {
 
     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
 
   .data_info  dd 0
 
   .info_size  dw info_size
 
   .info_size  dw info_size
Line 75: Line 69:
 
   .data_img_sys dd 0
 
   .data_img_sys dd 0
 
   .ch_tim    dd 0
 
   .ch_tim    dd 0
  .ls_tim    dd 0
 
 
   .tim_undo  dd 0
 
   .tim_undo  dd 0
 
   .cur_pos    dd 0
 
   .cur_pos    dd 0
Line 81: Line 74:
 
   .col_zag    dd col_zag
 
   .col_zag    dd col_zag
 
   .col_txt    dd col_txt
 
   .col_txt    dd col_txt
  .box_left  dd box_l
 
  .box_top    dd box_t
 
  .box_width  dd box_w
 
  .box_height dd box_h
 
 
   .capt_cy    dw capt_cy
 
   .capt_cy    dw capt_cy
 
   .info_capt_offs dw info_capt_offs
 
   .info_capt_offs dw info_capt_offs
Line 90: Line 79:
 
   .el_focus    dd el_focus
 
   .el_focus    dd el_focus
 
   .p_scrol    dd p_scrol
 
   .p_scrol    dd p_scrol
  rb 4
 
  .on_activate dd 0
 
 
   .on_press    dd on_press
 
   .on_press    dd on_press
}</asm>
+
}</syntaxhighlight>
*''info_size'' - количество байт, которое будет выделено для каждого узла. Часть этой памяти пользователь может использовать для своих целей (регулируется через info_capt_offs и info_capt_len) а остальная часть будет использована как подпись узла.
+
*'''info_size''' - количество байт, которое будет выделено для каждого узла. Часть этой памяти пользователь может использовать для своих целей (регулируется через ''info_capt_offs'' и ''info_capt_len'') а остальная часть будет использована как подпись узла.
*''info_max_count'' - максимальное количество узлов, которые можно добавить в элемент.
+
*'''info_max_count''' - максимальное количество узлов, которые можно добавить в элемент.
*''style'' - стили элемента.
+
*'''style''' - стили элемента.
*''data_nodes'' - указатель на внутренние структуры узлов (TreeList).
+
*'''data_nodes''' - указатель на внутренние структуры узлов (''TreeList'').
*''data_img'' - указатель на изображения с иконками узлов.
+
*'''data_img''' - указатель на изображения с иконками узлов. Формат изображения такой же как и в сист. ф. 7: ''BBGGRRBBGGRR...''.
*''data_img_sys'' - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов).
+
*'''img_cx''' - ширина одной иконки.
*''capt_cy'' - высота строки для подписи вверху элемента, если меньше 9 подпись не выводится.
+
*'''img_cy''' - высота одной иконки.
*''info_capt_len'' - длинна текста для подписи. Если равно 0, то длинна считается так: info_size - info_capt_offs.
+
*'''data_img_sys''' - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов). Формат изображения такой же как и в сист. ф. 7: ''BBGGRRBBGGRR...''
*''p_scrol'' - указатель на структуру скроллинга, связанного с данным элементом.
+
*'''col_bkg''' - цвет фона.
*''on_press'' - указатель на функцию, которая будет вызвана при нажитии [Enter]. Если указатель равен 0 то ничего не будет вызыватся.
+
*'''col_zag''' - цвет строки заголовка (если она задана) и кнопок и ползунка вертикальной полосы прокрутки (если она есть).
 +
*'''col_txt''' - цвет текста.
 +
*'''capt_cy''' - высота строки для подписи вверху элемента, если меньше 9 подпись не выводится.
 +
*'''info_capt_len''' - длинна текста для подписи. Если равно 0, то длинна считается так: ''info_size - info_capt_offs''.
 +
*'''p_scrol''' - указатель на структуру скроллинга, связанного с данным элементом.
 +
*'''on_press''' - указатель на функцию, которая будет вызвана при нажатии [''Enter'']. Если указатель равен 0 то ничего не будет вызываться.
  
 
Пример создания структуры:
 
Пример создания структуры:
<asm>tree1 tree_list 24,500, tl_draw_par_line+tl_list_box_mode, 16,16,\
+
<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,\
 
     0x8080ff,0x0000ff,0xffffff, 10,35,200-16,285, 14,4,0,\
     el_focus, wScr,fun_on_enter</asm>
+
     el_focus, wScr,fun_on_enter</syntaxhighlight>
  
 
==Стили элемента==
 
==Стили элемента==
Line 119: Line 111:
 
==Пример==
 
==Пример==
 
Пример использования элемента ''tree_list''. Для компиляции в ''include'' нужно указать полный путь к папке ''svn''. Программа использует 2 файла с иконками ''tl_sys_16.bmp'' и ''tl_nod_16.bmp'' из папки ''svn\programs\develop\libraries\box_lib\trunk''.
 
Пример использования элемента ''tree_list''. Для компиляции в ''include'' нужно указать полный путь к папке ''svn''. Программа использует 2 файла с иконками ''tl_sys_16.bmp'' и ''tl_nod_16.bmp'' из папки ''svn\programs\develop\libraries\box_lib\trunk''.
<asm>use32
+
<syntaxhighlight lang="asm">use32
 
org 0x0
 
org 0x0
 
db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
 
db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
Line 134: Line 126:
 
include 'svn/programs/develop/libraries/box_lib/trunk/box_lib.mac'
 
include 'svn/programs/develop/libraries/box_lib/trunk/box_lib.mac'
 
include 'svn/programs/develop/libraries/box_lib/load_lib.mac'
 
include 'svn/programs/develop/libraries/box_lib/load_lib.mac'
include 'mem.inc' ;функции mem.Alloc,mem.Free,mem.ReAlloc
+
include 'svn/programs/dll.inc' ;функции mem.Alloc,mem.Free,mem.ReAlloc
  
 
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,0
 
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,0
Line 165: Line 157:
 
mcall 68,11
 
mcall 68,11
  
stdcall dword[tl_data_init], dword tree1
+
stdcall dword[tl_data_init], tree1
  
 
; читаем *.bmp файл с системными иконками
 
; читаем *.bmp файл с системными иконками
Line 175: Line 167:
  
 
mov [run_file_70.Buffer], eax
 
mov [run_file_70.Buffer], eax
mov eax,70 ;load icon file
 
 
mov [run_file_70.Function], 0
 
mov [run_file_70.Function], 0
 
mov [run_file_70.Position], 54
 
mov [run_file_70.Position], 54
Line 182: Line 173:
 
mov byte[run_file_70+20], 0
 
mov byte[run_file_70+20], 0
 
mov [run_file_70.FileName], file_name
 
mov [run_file_70.FileName], file_name
mov ebx,run_file_70
+
mcall 70,run_file_70
int 0x40
 
 
cmp ebx,0
 
cmp ebx,0
 
jl @f
 
jl @f
Line 197: Line 187:
  
 
mov [run_file_70.Buffer], eax
 
mov [run_file_70.Buffer], eax
mov eax,70 ;load icon file
 
 
;mov [run_file_70.Function], 0
 
;mov [run_file_70.Function], 0
 
;mov [run_file_70.Position], 54
 
;mov [run_file_70.Position], 54
Line 204: Line 193:
 
mov byte[run_file_70+20], 0
 
mov byte[run_file_70+20], 0
 
mov [run_file_70.FileName], file_name
 
mov [run_file_70.FileName], file_name
mov ebx,run_file_70
+
mcall 70,run_file_70
int 0x40
 
 
cmp ebx,0
 
cmp ebx,0
 
jl @f
 
jl @f
Line 214: Line 202:
 
align 4
 
align 4
 
red_win:
 
red_win:
  mcall 12,1
+
mcall 12,1
  
  xor eax,eax
+
xor eax,eax
  mov ebx,30*65536+320
+
mov ebx,30*65536+320
  mov ecx,25*65536+255
+
mov ecx,25*65536+255
  mov edx,[sc.work]
+
mov edx,[sc.work]
  or  edx,0x33000000
+
or  edx,0x33000000
  mov edi,hed
+
mov edi,hed
  mcall
+
mcall
  
  mov eax,8 ;кнопка
+
mov eax,8 ;кнопка
  mov ebx,215*65536+85
+
mov ebx,215*65536+85
  mov ecx,5*65536+15
+
mov ecx,5*65536+15
  mov edx,2
+
mov edx,2
  mov esi,[sc.work_button]
+
mov esi,[sc.work_button]
  int 0x40
+
int 0x40
  
  mov ebx,215*65536+60
+
mov ebx,215*65536+60
  mov ecx,25*65536+15
+
mov ecx,25*65536+15
  mov edx,3
+
mov edx,3
 
;  mov esi,0xffd000
 
;  mov esi,0xffd000
  int 0x40
+
int 0x40
  
  mov ebx,215*65536+85
+
mov ebx,215*65536+85
  mov ecx,45*65536+15
+
mov ecx,45*65536+15
  mov edx,4
+
mov edx,4
  int 0x40
+
int 0x40
  
  mov ecx,65*65536+15
+
mov ecx,65*65536+15
  mov edx,5
+
mov edx,5
  int 0x40
+
int 0x40
  
  mov ecx,85*65536+15
+
mov ecx,85*65536+15
  mov edx,6
+
mov edx,6
  int 0x40
+
int 0x40
  
  mov ecx,105*65536+15
+
mov ecx,105*65536+15
  mov edx,7
+
mov edx,7
  int 0x40
+
int 0x40
  
  mov ecx,125*65536+15
+
mov ecx,125*65536+15
  mov edx,8
+
mov edx,8
  int 0x40
+
int 0x40
  
  mov ecx,145*65536+15
+
mov ecx,145*65536+15
  mov edx,9
+
mov edx,9
  int 0x40
+
int 0x40
  
  mov ecx,165*65536+15
+
mov ecx,165*65536+15
  mov edx,10
+
mov edx,10
  int 0x40
+
int 0x40
  
  mov ecx,185*65536+15
+
mov ecx,185*65536+15
  mov edx,11
+
mov edx,11
  int 0x40
+
int 0x40
  
  mov ecx,205*65536+15
+
mov ecx,205*65536+15
  mov edx,12
+
mov edx,12
  int 0x40
+
int 0x40
  
  mov ebx,280*65536+20
+
mov ebx,280*65536+20
  mov ecx,25*65536+15
+
mov ecx,25*65536+15
  mov edx,100
+
mov edx,100
  mov esi,0xd0d0
+
mov esi,0xd0d0
  int 0x40
+
int 0x40
  
  mov eax,4 ;рисование текста
+
mov eax,4 ;рисование текста
  mov ebx,10*65536+25
+
mov ebx,10*65536+25
  mov ecx,[sc.work_button_text]
+
mov ecx,[sc.work_button_text]
  or  ecx,0x80000000
+
or  ecx,0x80000000
  mov edx,dword[node_data]
+
mov edx,dword[node_data]
  int 0x40
+
int 0x40
  
  mov eax,4 ;рисование текста
+
mov eax,4 ;рисование текста
  mov ebx,220*65536+10
+
mov ebx,220*65536+10
  mov edx,txt10
+
mov edx,txt10
  int 0x40
+
int 0x40
  
  mov ebx,220*65536+30
+
mov ebx,220*65536+30
  mov edx,txt11
+
mov edx,txt11
  int 0x40
+
int 0x40
  
  mov ebx,220*65536+50
+
mov ebx,220*65536+50
  mov edx,txt12
+
mov edx,txt12
  int 0x40
+
int 0x40
  
  mov ebx,220*65536+70
+
mov ebx,220*65536+70
  mov edx,txt13
+
mov edx,txt13
  int 0x40
+
int 0x40
  
  mov ebx,220*65536+90
+
mov ebx,220*65536+90
  mov edx,txt14
+
mov edx,txt14
  int 0x40
+
int 0x40
  
  mov ebx,220*65536+110
+
mov ebx,220*65536+110
  mov edx,txt15
+
mov edx,txt15
  int 0x40
+
int 0x40
  
  mov ebx,220*65536+130
+
mov ebx,220*65536+130
  mov edx,txt16
+
mov edx,txt16
  int 0x40
+
int 0x40
  
  mov ebx,220*65536+150
+
mov ebx,220*65536+150
  mov edx,txt17
+
mov edx,txt17
  int 0x40
+
int 0x40
  
  mov ebx,220*65536+170
+
mov ebx,220*65536+170
  mov edx,txt18
+
mov edx,txt18
  int 0x40
+
int 0x40
  
  mov ebx,220*65536+190
+
mov ebx,220*65536+190
  mov edx,txt19
+
mov edx,txt19
  int 0x40
+
int 0x40
  
  mov ebx,220*65536+210
+
mov ebx,220*65536+210
  mov edx,txt20
+
mov edx,txt20
  int 0x40
+
int 0x40
  
  stdcall dword[tl_draw], dword tree1
+
stdcall dword[tl_draw], tree1
  stdcall [edit_box_draw], dword edit1
+
stdcall [edit_box_draw], dword edit1
  
  mov dword[wScr.all_redraw],1
+
mov dword[wScr.all_redraw],1
  stdcall [scrollbar_ver_draw], dword wScr
+
stdcall [scrollbar_ver_draw], dword wScr
  
  mcall 12,2
+
mcall 12,2
  
 
align 4
 
align 4
Line 357: Line 345:
 
key:
 
key:
 
mcall 2
 
mcall 2
stdcall [tl_key], dword tree1
+
stdcall [tl_key], tree1
 
stdcall [edit_box_key], dword edit1
 
stdcall [edit_box_key], dword edit1
 
jmp still
 
jmp still
Line 363: Line 351:
 
align 4
 
align 4
 
button:
 
button:
  mcall 17 ;получить код нажатой кнопки
+
mcall 17 ;получить код нажатой кнопки
  cmp ah,2
+
cmp ah,2
  jz  but_clear
+
jz  but_clear
  cmp ah,3
+
cmp ah,3
  jz  but_add_node
+
jz  but_add_node
  cmp ah,4
+
cmp ah,4
  jz  but_undo
+
jz  but_undo
  cmp ah,5
+
cmp ah,5
  jz  but_redo
+
jz  but_redo
  cmp ah,6
+
cmp ah,6
  jz  but_lev_add
+
jz  but_lev_add
  cmp ah,7
+
cmp ah,7
  jz  but_lev_dec
+
jz  but_lev_dec
  cmp ah,8
+
cmp ah,8
  jz  but_node_set_data
+
jz  but_node_set_data
  cmp ah,9
+
cmp ah,9
  jz  but_node_get_data
+
jz  but_node_get_data
  cmp ah,10
+
cmp ah,10
  jz  but_node_delete
+
jz  but_node_delete
  cmp ah,11
+
cmp ah,11
  jz  but_node_move_up
+
jz  but_node_move_up
  cmp ah,12
+
cmp ah,12
  jz  but_node_move_down
+
jz  but_node_move_down
  cmp ah,100
+
cmp ah,100
  jz  but_add_node_2
+
jz  but_add_node_2
  
  cmp ah,1
+
cmp ah,1
  jne still
+
jne still
 
.exit:
 
.exit:
 
;  stdcall mem.Free,[bmp_icon]
 
;  stdcall mem.Free,[bmp_icon]
  stdcall dword[tl_data_clear], dword tree1
+
stdcall dword[tl_data_clear], tree1
  mcall -1 ;выход из программы
+
mcall -1 ;выход из программы
  
  
 
align 4
 
align 4
 
mouse:
 
mouse:
  stdcall [tl_mouse], dword tree1
+
stdcall [tl_mouse], tree1
  stdcall [edit_box_mouse], dword edit1
+
stdcall [edit_box_mouse], dword edit1
  jmp still
+
jmp still
  
 
but_clear:
 
but_clear:
  stdcall dword[tl_info_clear], dword tree1
+
stdcall dword[tl_info_clear], tree1
  stdcall dword[tl_draw], dword tree1
+
stdcall dword[tl_draw], tree1
  jmp still
+
jmp still
  
 
;добавляем узел (иконка которого будет с индексом 0)
 
;добавляем узел (иконка которого будет с индексом 0)
 
but_add_node:
 
but_add_node:
  stdcall dword[tl_node_add], dword ed_buffer, dword 0, dword tree1
+
stdcall dword[tl_node_add], tree1, 0, ed_buffer
  stdcall dword[tl_draw], dword tree1
+
stdcall dword[tl_draw], tree1
  jmp still
+
jmp still
  
 
;добавляем узел (иконка которого будет с индексом 1)
 
;добавляем узел (иконка которого будет с индексом 1)
 
but_add_node_2:
 
but_add_node_2:
  stdcall dword[tl_node_add], dword ed_buffer, dword 0x10000, dword tree1
+
stdcall dword[tl_node_add], tree1, 0x10000, ed_buffer
  stdcall dword[tl_draw], dword tree1
+
stdcall dword[tl_draw], tree1
  jmp still
+
jmp still
  
 
but_undo:
 
but_undo:
  stdcall dword[tl_info_undo], dword tree1
+
stdcall dword[tl_info_undo], tree1
  stdcall dword[tl_draw], dword tree1
+
stdcall dword[tl_draw], tree1
  jmp still
+
jmp still
  
 
but_redo:
 
but_redo:
  stdcall dword[tl_info_redo], dword tree1
+
stdcall dword[tl_info_redo], tree1
  stdcall dword[tl_draw], dword tree1
+
stdcall dword[tl_draw], tree1
  jmp still
+
jmp still
  
 
but_lev_add:
 
but_lev_add:
  stdcall dword[tl_node_lev_inc], dword tree1
+
stdcall dword[tl_node_lev_inc], tree1
  stdcall dword[tl_draw], dword tree1
+
stdcall dword[tl_draw], tree1
  jmp still
+
jmp still
  
 
but_lev_dec:
 
but_lev_dec:
  stdcall dword[tl_node_lev_dec], dword tree1
+
stdcall dword[tl_node_lev_dec], tree1
  stdcall dword[tl_draw], dword tree1
+
stdcall dword[tl_draw], tree1
  jmp still
+
jmp still
  
 
;устанавливаем (новые) данные узла
 
;устанавливаем (новые) данные узла
 
but_node_set_data:
 
but_node_set_data:
  stdcall dword[tl_node_set_data], dword ed_buffer, dword tree1
+
stdcall dword[tl_node_set_data], tree1, ed_buffer
  stdcall dword[tl_draw], dword tree1
+
stdcall dword[tl_draw], tree1
  jmp still
+
jmp still
  
 
;берем указатель на данные узла
 
;берем указатель на данные узла
 
but_node_get_data:
 
but_node_get_data:
  stdcall dword[tl_node_get_data], dword tree1
+
push eax
  pop dword[node_data]
+
stdcall dword[tl_node_get_data], tree1
  jmp red_win ;still
+
mov dword[node_data], eax
 +
pop eax
 +
jmp red_win ;still
  
 
;удаляем узел
 
;удаляем узел
 
but_node_delete:
 
but_node_delete:
  stdcall dword[tl_node_delete], dword tree1
+
stdcall dword[tl_node_delete], tree1
  stdcall dword[tl_draw], dword tree1
+
stdcall dword[tl_draw], tree1
  jmp still
+
jmp still
  
 
;функция вызываемая при нажатии [Enter]
 
;функция вызываемая при нажатии [Enter]
 
align 4
 
align 4
 
fun_on_enter:
 
fun_on_enter:
  stdcall dword[tl_node_set_data], dword txt_on_enter, dword tree1
+
stdcall dword[tl_node_set_data], tree1, txt_on_enter
  stdcall dword[tl_draw], dword tree1
+
stdcall dword[tl_draw], tree1
  ret
+
ret
  
 
but_node_move_up:
 
but_node_move_up:
  stdcall dword[tl_node_move_up], dword tree1
+
stdcall dword[tl_node_move_up], tree1
  jmp still
+
jmp still
  
 
but_node_move_down:
 
but_node_move_down:
  stdcall dword[tl_node_move_down], dword tree1
+
stdcall dword[tl_node_move_down], tree1
  jmp still
+
jmp still
  
 
;подписи на кнопки
 
;подписи на кнопки
Line 489: Line 479:
 
align 4
 
align 4
 
boxlib_import:
 
boxlib_import:
  dd sz_lib_init ;функция запускается макросом 1 раз при подключении бибилиотеки, потому в программе метка на нее не нужна
+
dd sz_lib_init ;функция запускается макросом 1 раз при подключении бибилиотеки, потому в программе метка на нее не нужна
  
  edit_box_draw  dd sz_Edit_box_draw
+
edit_box_draw  dd sz_Edit_box_draw
   edit_box_key dd sz_Edit_box_key
+
edit_box_key   dd sz_Edit_box_key
  edit_box_mouse dd sz_Edit_box_mouse
+
edit_box_mouse dd sz_Edit_box_mouse
  version_ed dd sz_Version_ed
+
version_ed     dd sz_Version_ed
  
  scrollbar_ver_draw  dd sz_Scrollbar_ver_draw
+
scrollbar_ver_draw  dd sz_Scrollbar_ver_draw
  scrollbar_ver_mouse dd sz_Scrollbar_ver_mouse
+
scrollbar_ver_mouse dd sz_Scrollbar_ver_mouse
  scrollbar_hor_draw  dd sz_Scrollbar_hor_draw
+
scrollbar_hor_draw  dd sz_Scrollbar_hor_draw
  scrollbar_hor_mouse dd sz_Scrollbar_hor_mouse
+
scrollbar_hor_mouse dd sz_Scrollbar_hor_mouse
  version_scrollbar  dd sz_Version_scrollbar
+
version_scrollbar  dd sz_Version_scrollbar
  
  tl_data_init dd sz_tl_data_init
+
tl_data_init dd sz_tl_data_init
  tl_data_clear dd sz_tl_data_clear
+
tl_data_clear dd sz_tl_data_clear
  tl_info_clear dd sz_tl_info_clear
+
tl_info_clear dd sz_tl_info_clear
  tl_key dd sz_tl_key
+
tl_key dd sz_tl_key
  tl_mouse dd sz_tl_mouse
+
tl_mouse dd sz_tl_mouse
  tl_draw dd sz_tl_draw
+
tl_draw dd sz_tl_draw
  tl_info_undo dd sz_tl_info_undo
+
tl_info_undo dd sz_tl_info_undo
  tl_info_redo dd sz_tl_info_redo
+
tl_info_redo dd sz_tl_info_redo
  tl_node_add dd sz_tl_node_add
+
tl_node_add dd sz_tl_node_add
  tl_node_set_data dd sz_tl_node_set_data
+
tl_node_set_data dd sz_tl_node_set_data
  tl_node_get_data dd sz_tl_node_get_data
+
tl_node_get_data dd sz_tl_node_get_data
  tl_node_delete dd sz_tl_node_delete
+
tl_node_delete dd sz_tl_node_delete
  tl_cur_beg dd sz_tl_cur_beg
+
tl_cur_beg dd sz_tl_cur_beg
  tl_cur_next dd sz_tl_cur_next
+
tl_cur_next dd sz_tl_cur_next
  tl_cur_perv dd sz_tl_cur_perv
+
tl_cur_perv dd sz_tl_cur_perv
  tl_node_close_open dd sz_tl_node_close_open
+
tl_node_close_open dd sz_tl_node_close_open
  tl_node_lev_inc dd sz_tl_node_lev_inc
+
tl_node_lev_inc dd sz_tl_node_lev_inc
  tl_node_lev_dec dd sz_tl_node_lev_dec
+
tl_node_lev_dec dd sz_tl_node_lev_dec
  tl_node_move_up dd sz_tl_node_move_up
+
tl_node_move_up dd sz_tl_node_move_up
  tl_node_move_down dd sz_tl_node_move_down
+
tl_node_move_down dd sz_tl_node_move_down
  
 
dd 0,0
 
dd 0,0
  
  sz_lib_init db 'lib_init',0
+
sz_lib_init db 'lib_init',0
  
  sz_Edit_box_draw  db 'edit_box',0
+
sz_Edit_box_draw  db 'edit_box',0
  sz_Edit_box_key  db 'edit_box_key',0
+
sz_Edit_box_key  db 'edit_box_key',0
  sz_Edit_box_mouse db 'edit_box_mouse',0
+
sz_Edit_box_mouse db 'edit_box_mouse',0
  sz_Version_ed   db 'version_ed',0
+
sz_Version_ed   db 'version_ed',0
  
  sz_Scrollbar_ver_draw  db 'scrollbar_v_draw',0
+
sz_Scrollbar_ver_draw  db 'scrollbar_v_draw',0
  sz_Scrollbar_ver_mouse db 'scrollbar_v_mouse',0
+
sz_Scrollbar_ver_mouse db 'scrollbar_v_mouse',0
  sz_Scrollbar_hor_draw  db 'scrollbar_h_draw',0
+
sz_Scrollbar_hor_draw  db 'scrollbar_h_draw',0
  sz_Scrollbar_hor_mouse db 'scrollbar_h_mouse',0
+
sz_Scrollbar_hor_mouse db 'scrollbar_h_mouse',0
  sz_Version_scrollbar  db 'version_scrollbar',0
+
sz_Version_scrollbar  db 'version_scrollbar',0
  
  sz_tl_data_init db 'tl_data_init',0
+
sz_tl_data_init db 'tl_data_init',0
  sz_tl_data_clear db 'tl_data_clear',0
+
sz_tl_data_clear db 'tl_data_clear',0
  sz_tl_info_clear db 'tl_info_clear',0
+
sz_tl_info_clear db 'tl_info_clear',0
  sz_tl_key db 'tl_key',0
+
sz_tl_key db 'tl_key',0
  sz_tl_mouse db 'tl_mouse',0
+
sz_tl_mouse db 'tl_mouse',0
  sz_tl_draw db 'tl_draw',0
+
sz_tl_draw db 'tl_draw',0
  sz_tl_info_undo db 'tl_info_undo',0
+
sz_tl_info_undo db 'tl_info_undo',0
  sz_tl_info_redo db 'tl_info_redo',0
+
sz_tl_info_redo db 'tl_info_redo',0
  sz_tl_node_add db 'tl_node_add',0
+
sz_tl_node_add db 'tl_node_add',0
  sz_tl_node_set_data db 'tl_node_set_data',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_get_data db 'tl_node_get_data',0
  sz_tl_node_delete db 'tl_node_delete',0
+
sz_tl_node_delete db 'tl_node_delete',0
  sz_tl_cur_beg db 'tl_cur_beg',0
+
sz_tl_cur_beg db 'tl_cur_beg',0
  sz_tl_cur_next db 'tl_cur_next',0
+
sz_tl_cur_next db 'tl_cur_next',0
  sz_tl_cur_perv db 'tl_cur_perv',0
+
sz_tl_cur_perv db 'tl_cur_perv',0
  sz_tl_node_close_open db 'tl_node_close_open',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_inc db 'tl_node_lev_inc',0
  sz_tl_node_lev_dec db 'tl_node_lev_dec',0
+
sz_tl_node_lev_dec db 'tl_node_lev_dec',0
  sz_tl_node_move_up db 'tl_node_move_up',0
+
sz_tl_node_move_up db 'tl_node_move_up',0
  sz_tl_node_move_down db 'tl_node_move_down',0
+
sz_tl_node_move_down db 'tl_node_move_down',0
  
  
Line 602: Line 592:
 
edit1 edit_box 200, 10, 5, 0xffffff, 0x80ff, 0xff0080, 0, 0xff, 80, ed_buffer, mouse_dd, ed_focus, 13, 13
 
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
 
ed_buffer: db 'dataNode Text',0
  rb 69
+
rb 69
  
 
txt_on_enter db '1111Enter',0
 
txt_on_enter db '1111Enter',0
hed db 'Tree (Image) List 13.06.10',0
+
hed db 'Tree (Image) List 17.11.15',0
sc system_colors
 
  
 
;-------------------------------------------------------------------------------
 
;-------------------------------------------------------------------------------
 
err_message_import db 'Ошибка при импорте box_lib.obj',0
 
err_message_import db 'Ошибка при импорте box_lib.obj',0
  err_message_found_lib db 'Ошибка при поиске box_lib.obj',0 ;строка, которая будет в сформированном окне, если библиотека не будет найдена
+
err_message_found_lib db 'Ошибка при поиске box_lib.obj',0 ;строка, которая будет в сформированном окне, если библиотека не будет найдена
  head_f_i:  
+
head_f_i:  
  head_f_l db 'System error',0 ;заголовок окна, при возникновении ошибки
+
head_f_l db 'System error',0 ;заголовок окна, при возникновении ошибки
  system_path db '/sys/lib/'
+
system_path db '/sys/lib/'
  library_name db 'box_lib.obj',0
+
library_name db 'box_lib.obj',0
  
 
node_data dd 0
 
node_data dd 0
Line 620: Line 609:
 
mouse_dd dd ?
 
mouse_dd dd ?
  
i_end: ;конец кода
+
i_end: ;конец исполняемого файла программы
  rb 1024
+
sc system_colors
  cur_dir_path rb 4096
+
rb 2048
  library_path rb 4096
 
  file_name rb 4096
 
 
stacktop:
 
stacktop:
mem:</asm>
+
cur_dir_path rb 4096
 +
library_path rb 4096
 +
file_name rb 4096
 +
mem:</syntaxhighlight>
  
[[Category: Coding]]
+
[[Category: Кодинг]]
 +
[[Category: Библиотеки]]

Latest revision as of 19:15, 29 June 2016

Функции

  • tl_data_init - Конструктор элемента, нужно вызывать перед использованием элемента для выделения памяти и других настроек.
  • tl_data_clear - Деструктор элемента, чистит память по указателям: data_info, data_nodes, data_img и data_img_sys. Если в программе используется несколько элементов с одинаковыми иконками, то указатели data_img и data_img_sys нужно приравнять к 0 в других элементах, так что-бы при вызове деструкторов не было повторного удаления одних и тех же иконок.
  • tl_info_clear - Очистка списка от всех узлов. Это действие нельзя отменить функцией tl_info_undo.
  • tl_key - Функция которую нужно вызывать при нажатии на клавиатуру. Кнопки, которые не доступны если есть стиль tl_key_no_edit: [Enter], [Delete], [←], [→]. Всегда доступны: [↑], [↓], [Page Up], [Page Dn], [Space]. Функция проверяет включен ли режим scan кодов, и в случае необходимости сама преобразует коды.
  • tl_mouse - функция для событий от мыши.
  • tl_draw - полная перерисовка окна элемента.
  • tl_info_undo - Отменяет добавление узлов. Действует только на весь узел целиком, не учитывая изменения внутри узлов. Т. е. нельзя отменить действия выполненные например функциями: tl_node_set_data, tl_node_lev_inc и им подобным.
  • tl_info_redo - Повтор отмененных действий. Обратная функция по отношению к tl_info_undo.
  • tl_node_add - Добавляет узел, в позицию указанную курсором. Пример добавления узла:
  stdcall dword[tl_node_add], tree1, 0x10002, data_buffer

где: tree1 - структура tree_list; 0x10002 - параметры узла (старшие байты 0x0001 - индекс иконки, отображаемой возле узла; меньший байт 0x02 - уровень вложености узла); data_buffer - указатель на дынные, добавляемые в узел.

  • 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_move_up - Перемещает вверх узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:
  push dword tree1
  call dword[tl_node_move_up] ;переместить узел

где: tree1 - структура tree_list

  • tl_node_move_down

Перемещает вниз узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:

  push dword tree1
  call dword[tl_node_move_down] ;переместить узел

где: tree1 - структура tree_list

  • tl_node_poi_get_info - Берет внутренний указатель на структуру описывающую узел. Пример использования функции:
stdcall dword[tl_node_poi_get_info], tree1, 0

где: tree1 - структура tree_list; 0 - позиция узла, с которого берется указатель; eax - указатель на структуру описывающую узел.

  • 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 - Сохраняет информацию об узлах элемента в память. Пример использования функции:
  MEM_SIZE equ 5000
  node_data rb MEM_SIZE
.........
  stdcall dword[tl_save_mem], tree1, 0, node_data, MEM_SIZE

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

  • tl_load_mem - Загружает информацию об узлах элемента из памяти. Пример использования функции:
  MEM_SIZE equ 5000
  node_data rb MEM_SIZE
.........
  stdcall dword[tl_load_mem], tree1, 0, node_data, MEM_SIZE

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

  • tl_get_mem_size - Вычисляет размер блока памяти (в который были раньше сохранены элементы). Эту функцию можно использовать перед сохранением на диск, для получения точного размера сохраняемых данных.
  • 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,\
    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
}
  • info_size - количество байт, которое будет выделено для каждого узла. Часть этой памяти пользователь может использовать для своих целей (регулируется через info_capt_offs и info_capt_len) а остальная часть будет использована как подпись узла.
  • info_max_count - максимальное количество узлов, которые можно добавить в элемент.
  • style - стили элемента.
  • data_nodes - указатель на внутренние структуры узлов (TreeList).
  • data_img - указатель на изображения с иконками узлов. Формат изображения такой же как и в сист. ф. 7: BBGGRRBBGGRR....
  • img_cx - ширина одной иконки.
  • img_cy - высота одной иконки.
  • data_img_sys - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов). Формат изображения такой же как и в сист. ф. 7: BBGGRRBBGGRR...
  • col_bkg - цвет фона.
  • col_zag - цвет строки заголовка (если она задана) и кнопок и ползунка вертикальной полосы прокрутки (если она есть).
  • col_txt - цвет текста.
  • capt_cy - высота строки для подписи вверху элемента, если меньше 9 подпись не выводится.
  • info_capt_len - длинна текста для подписи. Если равно 0, то длинна считается так: info_size - info_capt_offs.
  • p_scrol - указатель на структуру скроллинга, связанного с данным элементом.
  • on_press - указатель на функцию, которая будет вызвана при нажатии [Enter]. Если указатель равен 0 то ничего не будет вызываться.

Пример создания структуры:

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

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

  • tl_key_no_edit

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

  • tl_draw_par_line

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

  • tl_list_box_mode

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

Пример

Пример использования элемента tree_list. Для компиляции в include нужно указать полный путь к папке svn. Программа использует 2 файла с иконками tl_sys_16.bmp и tl_nod_16.bmp из папки svn\programs\develop\libraries\box_lib\trunk.

use32
	org 0x0
	db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
	dd 0x1
	dd start
	dd i_end ; размер приложения
	dd mem
	dd stacktop
	dd file_name
	dd cur_dir_path

include 'svn/programs/macros.inc'
include 'svn/programs/proc32.inc'
include 'svn/programs/develop/libraries/box_lib/trunk/box_lib.mac'
include 'svn/programs/develop/libraries/box_lib/load_lib.mac'
include 'svn/programs/dll.inc' ;функции 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:

sys_load_library  library_name, cur_dir_path, library_path, system_path, \
	err_message_found_lib, head_f_l, boxlib_import, err_message_import, head_f_i
;  cmp   eax,-1
;  jz    button.exit

	mcall 48,3,sc,sizeof.system_colors
	mcall 40,0x27 ;маска ожидаемых событий
	mcall 68,11

	stdcall dword[tl_data_init], tree1

; читаем *.bmp файл с системными иконками
	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]
	@@:

; читаем *.bmp файл с иконками узлов
	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]
	@@:

;перерисовка окна
align 4
red_win:
	mcall 12,1

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

	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 ;рисование текста
	mov ebx,10*65536+25
	mov ecx,[sc.work_button_text]
	or  ecx,0x80000000
	mov edx,dword[node_data]
	int 0x40

	mov eax,4 ;рисование текста
	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

align 4
still:
	mcall 10

	cmp al,0x1 ;изм. положение окна
	jz red_win
	cmp al,0x2
	jz key
	cmp al,0x3
	jz button
	cmp al,0x6
	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 ;получить код нажатой кнопки
	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

;добавляем узел (иконка которого будет с индексом 0)
but_add_node:
	stdcall dword[tl_node_add], tree1, 0, ed_buffer
	stdcall dword[tl_draw], tree1
	jmp still

;добавляем узел (иконка которого будет с индексом 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

;устанавливаем (новые) данные узла
but_node_set_data:
	stdcall dword[tl_node_set_data], tree1, ed_buffer
	stdcall dword[tl_draw], tree1
	jmp still

;берем указатель на данные узла
but_node_get_data:
push eax
	stdcall dword[tl_node_get_data], tree1
	mov dword[node_data], eax
pop eax
	jmp red_win ;still

;удаляем узел
but_node_delete:
	stdcall dword[tl_node_delete], tree1
	stdcall dword[tl_draw], tree1
	jmp still

;функция вызываемая при нажатии [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

;таблица импортируемых функций
align 4
boxlib_import:
	dd sz_lib_init ;функция запускается макросом 1 раз при подключении бибилиотеки, потому в программе метка на нее не нужна

	edit_box_draw  dd sz_Edit_box_draw
	edit_box_key   dd sz_Edit_box_key
	edit_box_mouse dd sz_Edit_box_mouse
	version_ed     dd sz_Version_ed

	scrollbar_ver_draw  dd sz_Scrollbar_ver_draw
	scrollbar_ver_mouse dd sz_Scrollbar_ver_mouse
	scrollbar_hor_draw  dd sz_Scrollbar_hor_draw
	scrollbar_hor_mouse dd sz_Scrollbar_hor_mouse
	version_scrollbar   dd sz_Version_scrollbar

	tl_data_init dd sz_tl_data_init
	tl_data_clear dd sz_tl_data_clear
	tl_info_clear dd sz_tl_info_clear
	tl_key dd sz_tl_key
	tl_mouse dd sz_tl_mouse
	tl_draw dd sz_tl_draw
	tl_info_undo dd sz_tl_info_undo
	tl_info_redo dd sz_tl_info_redo
	tl_node_add dd sz_tl_node_add
	tl_node_set_data dd sz_tl_node_set_data
	tl_node_get_data dd sz_tl_node_get_data
	tl_node_delete dd sz_tl_node_delete
	tl_cur_beg dd sz_tl_cur_beg
	tl_cur_next dd sz_tl_cur_next
	tl_cur_perv dd sz_tl_cur_perv
	tl_node_close_open dd sz_tl_node_close_open
	tl_node_lev_inc dd sz_tl_node_lev_inc
	tl_node_lev_dec dd sz_tl_node_lev_dec
	tl_node_move_up dd sz_tl_node_move_up
	tl_node_move_down dd sz_tl_node_move_down

dd 0,0

	sz_lib_init db 'lib_init',0

	sz_Edit_box_draw  db 'edit_box',0
	sz_Edit_box_key   db 'edit_box_key',0
	sz_Edit_box_mouse db 'edit_box_mouse',0
	sz_Version_ed	  db 'version_ed',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
	sz_Version_scrollbar   db 'version_scrollbar',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_move_up db 'tl_node_move_up',0
	sz_tl_node_move_down db 'tl_node_move_down',0


;структура элемента 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

;структура для дочернего скроллинга
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

;структура элемента 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 (Image) List 17.11.15',0

;-------------------------------------------------------------------------------
err_message_import db 'Ошибка при импорте box_lib.obj',0
	err_message_found_lib db 'Ошибка при поиске box_lib.obj',0 ;строка, которая будет в сформированном окне, если библиотека не будет найдена
head_f_i: 
	head_f_l db 'System error',0 ;заголовок окна, при возникновении ошибки
	system_path db '/sys/lib/'
	library_name db 'box_lib.obj',0

node_data dd 0
el_focus dd tree1
mouse_dd dd ?

i_end: ;конец исполняемого файла программы
	sc system_colors
	rb 2048
stacktop:
	cur_dir_path rb 4096
	library_path rb 4096
	file_name rb 4096
mem: