Box lib tree list/ru
Функции
- 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 '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], 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: