Box lib tree list/ru

From KolibriOS wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Функции

  • 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: