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

From KolibriOS wiki
Jump to navigation Jump to search
(Created page with '==Функции== *tl_data_init Конструктор элемента, нужно вызывать перед использованием элемента для выделе...')
 
Line 1: Line 1:
 
==Функции==
 
==Функции==
*tl_data_init
+
*'''tl_data_init''' - Конструктор элемента, нужно вызывать перед использованием элемента для выделения памяти и других настроек.
Конструктор элемента, нужно вызывать перед использованием элемента для выделения памяти и других настроек.
+
*'''tl_data_clear''' - Деструктор элемента, чистит память по указателям: data_info, data_nodes, data_img и data_img_sys. Если в программе используется несколько элементов с одинаковыми иконками, то указатели data_img и data_img_sys нужно приравнять к 0 в других элементах, так что-бы при вызове деструкторов не было повторного удаления одних и тех же иконок.
*tl_data_clear
+
*'''tl_info_clear''' - Очистка списка от всех узлов. Это действие нельзя отменить функцией tl_info_undo.
Деструктор элемента, чистит память по указателям: data_info, data_nodes, data_img и data_img_sys. Если в программе используется несколько элементов с одинаковыми иконками, то указатели data_img и data_img_sys нужно приравнять к 0 в других элементах, так что-бы при вызове деструкторов не было повторного удаления одних и тех же иконок.
+
*'''tl_key''' - Функция которую нужно вызывать при нажатии на клавиатуру. Кнопки, которые не доступны если есть стиль tl_key_no_edit: [Enter], [Delete], [←], [→]. Всегда доступны: [↑], [↓], [Page Up], [Page Dn], [Space]. Функция проверяет включен ли режим scan кодов, и в случае необходимости сама преобразует коды.
*tl_info_clear
+
*'''tl_mouse''' - функция для событий от мыши.
Очистка списка от всех узлов. Это действие нельзя отменить функцией tl_info_undo.
+
*'''tl_draw''' - полная перерисовка окна элемента.
*tl_key
+
*'''tl_info_undo''' - Отменяет добавление узлов. Действует только на весь узел целиком, не учитывая изменения внутри узлов. Т. е. нельзя отменить действия выполненные например функциями: tl_node_set_data, tl_node_lev_inc и им подобным.
Функция которую нужно вызывать при нажатии на клавиатуру. Кнопки, которые не доступны если есть стиль tl_key_no_edit: [Enter], [Delete], [←], [→]. Всегда доступны: [↑], [↓], [Page Up], [Page Dn], [Space]. Функция проверяет включен ли режим scan кодов, и в случае необходимости сама преобразует коды.
+
*'''tl_info_redo''' - Повтор отмененных действий. Обратная функция по отношению к tl_info_undo.
*tl_mouse
+
*'''tl_node_add''' - Добавляет узел, в позицию указанную курсором. Пример добавления узла:
Функция для событий от мыши.
 
*tl_draw
 
Полная перерисовка окна элемента.
 
*tl_info_undo
 
Отменяет добавление узлов. Действует только на весь узел целиком, не учитывая изменения внутри узлов. Т. е. нельзя отменить действия выполненные например функциями: tl_node_set_data, tl_node_lev_inc и им подобным.
 
*tl_info_redo
 
Повтор отмененных действий. Обратная функция по отношению к tl_info_undo.
 
*tl_node_add
 
Добавляет узел, в позицию указанную курсором. Пример добавления узла:
 
 
<asm>  push dword tree1
 
<asm>  push dword tree1
 
   push dword 0x10002
 
   push dword 0x10002
Line 23: Line 14:
 
   call dword[tl_node_add]</asm>
 
   call dword[tl_node_add]</asm>
 
где: tree1 - структура tree_list; 0x10002 - параметры узла (старшие байты 0x0001 - индекс иконки, отображаемой возле узла; меньший байт 0x02 - уровень вложености узла); data_buffer - указатель на дынные, добавляемые в узел.
 
где: tree1 - структура tree_list; 0x10002 - параметры узла (старшие байты 0x0001 - индекс иконки, отображаемой возле узла; меньший байт 0x02 - уровень вложености узла); data_buffer - указатель на дынные, добавляемые в узел.
*tl_node_set_data
+
*'''tl_node_set_data''' - устанавливает новые данные (пользовательские и подпись) в узел под курсором.
Устанавливает новые данные (пользовательские и подпись) в узел под курсором.
+
*'''tl_node_get_data''' - берет указатель на данные (пользовательские и подпись) из узла под курсором.
*tl_node_get_data
+
*'''tl_node_delete''' - удаляет узел, но не окончательно, при необходимости узел можно вернуть функцией tl_info_undo.
Берет указатель на данные (пользовательские и подпись) из узла под курсором.
+
*'''tl_cur_beg''' - ставит курсор в начало списка, перематывает скроллинг если нужно.
*tl_node_delete
+
*'''tl_cur_next''' - переносит курсор на одну позицию ниже.
Удаляет узел, но не окончательно, при необходимости узел можно вернуть функцией tl_info_undo.
+
*'''tl_cur_perv''' - переносит курсор на одну позицию выше.
*tl_cur_beg
+
*'''tl_node_close_open''' - Открывает или закрывает родительский узел. Если у узла нет дочерних элементов, то ничего не делает. Автоматически перерисовывает окно если состояние узла изменилось.
Ставит курсор в начало списка, перематывает скроллинг если нужно.
+
*'''tl_node_lev_inc''' - Добавить уровень узла под курсором. Делает узел дочерним.
*tl_cur_next
+
*'''tl_node_lev_dec''' - Уменьшает уровень узла под курсором. Делает узел родительским.
Переносит курсор на одну позицию ниже.
+
*'''tl_node_move_up''' - Перемещает вверх узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:
*tl_cur_perv
 
Переносит курсор на одну позицию выше.
 
*tl_node_close_open
 
Открывает или закрывает родительский узел. Если у узла нет дочерних элементов, то ничего не делает. Автоматически перерисовывает окно если состояние узла изменилось.
 
*tl_node_lev_inc
 
Добавить уровень узла под курсором. Делает узел дочерним.
 
*tl_node_lev_dec
 
Уменьшает уровень узла под курсором. Делает узел родительским.
 
*tl_node_move_up
 
Перемещает вверх узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:
 
 
<asm>  push dword tree1
 
<asm>  push dword tree1
 
   call dword[tl_node_move_up] ;переместить узел</asm>
 
   call dword[tl_node_move_up] ;переместить узел</asm>
 
где: tree1 - структура tree_list
 
где: tree1 - структура tree_list
*tl_node_move_down
+
*'''tl_node_move_down'''
 
Перемещает вниз узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:
 
Перемещает вниз узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:
 
<asm>  push dword tree1
 
<asm>  push dword tree1
 
   call dword[tl_node_move_down] ;переместить узел</asm>
 
   call dword[tl_node_move_down] ;переместить узел</asm>
 
где: tree1 - структура tree_list
 
где: tree1 - структура tree_list
*tl_node_poi_get_info
+
*'''tl_node_poi_get_info''' - берет внутренний указатель на структуру описывающую узел.
Берет внутренний указатель на структуру описывающую узел.
+
*'''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
 
<asm>  MEM_SIZE equ 5000
 
   node_data rb MEM_SIZE
 
   node_data rb MEM_SIZE
Line 71: Line 48:
 
   pop eax</asm>
 
   pop eax</asm>
 
где: tree1 - структура tree_list; 0 - опция сохранения в начало блока памяти (если = 1, то добавляет элемент после других сохраненных ранее); node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок сохранения.
 
где: tree1 - структура tree_list; 0 - опция сохранения в начало блока памяти (если = 1, то добавляет элемент после других сохраненных ранее); node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок сохранения.
*tl_load_mem
+
*'''tl_load_mem''' - Загружает информацию об узлах элемента из памяти. Пример использования функции:
Загружает информацию об узлах элемента из памяти. Пример использования функции:
 
 
<asm>  MEM_SIZE equ 5000
 
<asm>  MEM_SIZE equ 5000
 
   node_data rb MEM_SIZE
 
   node_data rb MEM_SIZE
Line 83: Line 59:
 
   pop eax</asm>
 
   pop eax</asm>
 
где: tree1 - структура tree_list; 0 - индекс считываемого элемента; node_data - указатель на блок памяти; MEM_SIZE - размер блока памяти для сохранения. В регистр eax пишется значение 0 или записываются коды ошибок считывания.
 
где: 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,\
 
<asm>struc tree_list info_size,info_max_count,style, img_cx,img_cy,\
Line 120: Line 94:
 
   .on_press    dd on_press
 
   .on_press    dd on_press
 
}</asm>
 
}</asm>
*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'' - указатель на изображения с иконками узлов.
*data_img_sys - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов).
+
*''data_img_sys'' - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов).
*capt_cy - высота строки для подписи вверху элемента, если меньше 9 подпись не выводится.
+
*''capt_cy'' - высота строки для подписи вверху элемента, если меньше 9 подпись не выводится.
*info_capt_len - длинна текста для подписи. Если равно 0, то длинна считается так: info_size - info_capt_offs.
+
*''info_capt_len'' - длинна текста для подписи. Если равно 0, то длинна считается так: info_size - info_capt_offs.
*p_scrol - указатель на структуру скроллинга, связанного с данным элементом.
+
*''p_scrol'' - указатель на структуру скроллинга, связанного с данным элементом.
*on_press - указатель на функцию, которая будет вызвана при нажитии [Enter]. Если указатель равен 0 то ничего не будет вызыватся.
+
*''on_press'' - указатель на функцию, которая будет вызвана при нажитии [Enter]. Если указатель равен 0 то ничего не будет вызыватся.
  
 
Пример создания структуры:
 
Пример создания структуры:
Line 143: Line 117:
 
*tl_list_box_mode
 
*tl_list_box_mode
 
Стиль не отображает уровни (как в ListBox все узлы одного уровня).
 
Стиль не отображает уровни (как в ListBox все узлы одного уровня).
 +
==Пример==
 +
Пример использования элемента ''tree_list''. Для компиляции в ''include'' нужно указать полный путь к папке ''svn''. Программа использует 2 файла с иконками ''tl_sys_16.bmp'' и ''tl_nod_16.bmp'' из папки ''svn\programs\develop\libraries\box_lib\trunk''.
 +
<asm>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 'mem.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], dword 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 eax,70 ;load icon file
 +
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
 +
mov ebx,run_file_70
 +
int 0x40
 +
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 eax,70 ;load icon file
 +
;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
 +
mov ebx,run_file_70
 +
int 0x40
 +
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], dword 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], dword 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], dword tree1
 +
  mcall -1 ;выход из программы
 +
 +
 +
align 4
 +
mouse:
 +
  stdcall [tl_mouse], dword tree1
 +
  stdcall [edit_box_mouse], dword edit1
 +
  jmp still
 +
 +
but_clear:
 +
  stdcall dword[tl_info_clear], dword tree1
 +
  stdcall dword[tl_draw], dword tree1
 +
  jmp still
 +
 +
;добавляем узел (иконка которого будет с индексом 0)
 +
but_add_node:
 +
  stdcall dword[tl_node_add], dword ed_buffer, dword 0, dword tree1
 +
  stdcall dword[tl_draw], dword tree1
 +
  jmp still
 +
 +
;добавляем узел (иконка которого будет с индексом 1)
 +
but_add_node_2:
 +
  stdcall dword[tl_node_add], dword ed_buffer, dword 0x10000, dword tree1
 +
  stdcall dword[tl_draw], dword tree1
 +
  jmp still
 +
 +
but_undo:
 +
  stdcall dword[tl_info_undo], dword tree1
 +
  stdcall dword[tl_draw], dword tree1
 +
  jmp still
 +
 +
but_redo:
 +
  stdcall dword[tl_info_redo], dword tree1
 +
  stdcall dword[tl_draw], dword tree1
 +
  jmp still
 +
 +
but_lev_add:
 +
  stdcall dword[tl_node_lev_inc], dword tree1
 +
  stdcall dword[tl_draw], dword tree1
 +
  jmp still
 +
 +
but_lev_dec:
 +
  stdcall dword[tl_node_lev_dec], dword tree1
 +
  stdcall dword[tl_draw], dword tree1
 +
  jmp still
 +
 +
;устанавливаем (новые) данные узла
 +
but_node_set_data:
 +
  stdcall dword[tl_node_set_data], dword ed_buffer, dword tree1
 +
  stdcall dword[tl_draw], dword tree1
 +
  jmp still
 +
 +
;берем указатель на данные узла
 +
but_node_get_data:
 +
  stdcall dword[tl_node_get_data], dword tree1
 +
  pop dword[node_data]
 +
  jmp red_win ;still
 +
 +
;удаляем узел
 +
but_node_delete:
 +
  stdcall dword[tl_node_delete], dword tree1
 +
  stdcall dword[tl_draw], dword tree1
 +
  jmp still
 +
 +
;функция вызываемая при нажатии [Enter]
 +
align 4
 +
fun_on_enter:
 +
  stdcall dword[tl_node_set_data], dword txt_on_enter, dword tree1
 +
  stdcall dword[tl_draw], dword tree1
 +
  ret
 +
 +
but_node_move_up:
 +
  stdcall dword[tl_node_move_up], dword tree1
 +
  jmp still
 +
 +
but_node_move_down:
 +
  stdcall dword[tl_node_move_down], dword 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 13.06.10',0
 +
sc system_colors
 +
 +
;-------------------------------------------------------------------------------
 +
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: ;конец кода
 +
  rb 1024
 +
  cur_dir_path rb 4096
 +
  library_path rb 4096
 +
  file_name rb 4096
 +
stacktop:
 +
mem:</asm>

Revision as of 21:12, 13 June 2010

Функции

  • 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 - Добавляет узел, в позицию указанную курсором. Пример добавления узла:

<asm> push dword tree1

 push dword 0x10002
 push dword data_buffer
 call dword[tl_node_add]</asm>

где: 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 - Перемещает вверх узел под курсором. Вместе с узлом двигается также и курсор. Пример использования функции:

<asm> push dword tree1

 call dword[tl_node_move_up] ;переместить узел</asm>

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

  • tl_node_move_down

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

 call dword[tl_node_move_down] ;переместить узел</asm>

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

  • 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 - Сохраняет информацию об узлах элемента в память. Пример использования функции:

<asm> MEM_SIZE equ 5000

 node_data rb MEM_SIZE

.........

 push dword tree1
 push dword 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 - Загружает информацию об узлах элемента из памяти. Пример использования функции:

<asm> MEM_SIZE equ 5000

 node_data rb MEM_SIZE

.........

 push dword tree1
 push dword 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 - Вычисляет размер блока памяти (в который были раньше сохранены элементы). Эту функцию можно использовать перед сохранением на диск, для получения точного размера сохраняемых данных.
  • version_tree_list - версия элемента

Структура tree_list

<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 {
 .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_left   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 dw info_capt_offs
 .info_capt_len  dw info_capt_len
 .el_focus    dd el_focus
 .p_scrol     dd p_scrol
 rb 4
 .on_activate dd 0
 .on_press    dd on_press

}</asm>

  • info_size - количество байт, которое будет выделено для каждого узла. Часть этой памяти пользователь может использовать для своих целей (регулируется через info_capt_offs и info_capt_len) а остальная часть будет использована как подпись узла.
  • info_max_count - максимальное количество узлов, которые можно добавить в элемент.
  • style - стили элемента.
  • data_nodes - указатель на внутренние структуры узлов (TreeList).
  • data_img - указатель на изображения с иконками узлов.
  • data_img_sys - указатель на системные изображения (курсор, плюсики, линии, ... все кроме иконок узлов).
  • 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,\

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

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

  • 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. <asm>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 'mem.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], dword 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 eax,70 ;load icon file 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 mov ebx,run_file_70 int 0x40 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 eax,70 ;load icon file ;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 mov ebx,run_file_70 int 0x40 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], dword 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], dword 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], dword tree1
 mcall -1 ;выход из программы


align 4 mouse:

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

but_clear:

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

but_add_node:

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

but_add_node_2:

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

but_undo:

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

but_redo:

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

but_lev_add:

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

but_lev_dec:

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

but_node_set_data:

 stdcall dword[tl_node_set_data], dword ed_buffer, dword tree1
 stdcall dword[tl_draw], dword tree1
 jmp still
берем указатель на данные узла

but_node_get_data:

 stdcall dword[tl_node_get_data], dword tree1
 pop dword[node_data]
 jmp red_win ;still
удаляем узел

but_node_delete:

 stdcall dword[tl_node_delete], dword tree1
 stdcall dword[tl_draw], dword tree1
 jmp still
функция вызываемая при нажатии [Enter]

align 4 fun_on_enter:

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

but_node_move_up:

 stdcall dword[tl_node_move_up], dword tree1
 jmp still

but_node_move_down:

 stdcall dword[tl_node_move_down], dword 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 13.06.10',0 sc system_colors

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

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: ;конец кода

 rb 1024
 cur_dir_path rb 4096
 library_path rb 4096
 file_name rb 4096

stacktop: mem:</asm>