diff --git a/programs/develop/libraries/box_lib/trunk/bl_sys.mac b/programs/develop/libraries/box_lib/trunk/bl_sys.mac index e9c4edbf71..87c5a24f2b 100644 --- a/programs/develop/libraries/box_lib/trunk/bl_sys.mac +++ b/programs/develop/libraries/box_lib/trunk/bl_sys.mac @@ -1,9 +1,7 @@ -include 'optionbox.mac' ;macro implements optionbox include 'scrollbar.mac' ;macro implements scrollbar include 'd_button.mac' ;macro implements dinamic_button include 'menubar.mac' ;macro implements menubar include 'filebrowser.mac' ;macro implements filebrowser -include 'tree_list.mac' ;macro implements tree_list, image_list, list_box include 'pathshow.mac' ;macro implements pathshow include 't_edit.mac' ;macro implements text_editor include 'frame.mac' ;macro implements frame diff --git a/programs/develop/libraries/box_lib/trunk/box_lib.asm b/programs/develop/libraries/box_lib/trunk/box_lib.asm index 1576a78701..a8a7d38585 100644 --- a/programs/develop/libraries/box_lib/trunk/box_lib.asm +++ b/programs/develop/libraries/box_lib/trunk/box_lib.asm @@ -39,13 +39,7 @@ include 'checkbox.asm' ;checkbox ;-------------------------------------------------- ;radiobutton Group -;-------------------------------------------------- -align 16 -use_optionbox_driver ;macro that control the operating modes -align 16 -use_optionbox_draw ;macro reveals the function of the display. -align 16 -use_optionbox_mouse ;macro reveals processing function of the mouse. +include 'optionbox.asm' ;macro implements optionbox ;-------------------------------------------------- ;scrollbar Group @@ -77,9 +71,7 @@ use_file_browser ;-------------------------------------------------- ;tree list -;-------------------------------------------------- -align 16 -use_tree_list +include 'tree_list.asm' ;macro implements tree_list, image_list, list_box ;-------------------------------------------------- ;PathShow Group diff --git a/programs/develop/libraries/box_lib/trunk/optionbox.asm b/programs/develop/libraries/box_lib/trunk/optionbox.asm new file mode 100644 index 0000000000..0174d54109 --- /dev/null +++ b/programs/develop/libraries/box_lib/trunk/optionbox.asm @@ -0,0 +1,173 @@ +; элемент Optionbox для библиотеки box_lib.obj +; на код применена GPL2 лицензия +; файл создан 13.02.2009 +; последняя модификация 12.09.2017 IgorA + +align 16 +option_box_draw: + pusha + + mov eax,dword[esp+36] +@@: + mov edi,dword[eax] + test edi,edi + je option_check + call option_box_draw_box + add eax,4 + jmp @b + +option_check: + mov eax,dword[esp+36] +@@: + mov edi,dword[eax] + test edi,edi + je @f + + mov ebx,dword[edi] + mov ebx,dword[ebx] + cmp edi,ebx + jne .clear_op + + pusha + call option_box_draw_op + popa + add eax,4 + jmp @b + +.clear_op: + pusha + call option_box_clear_op + popa + add eax,4 + jmp @b + +@@: + popa + ret 4 + + +align 16 +option_box_mouse: + pusha + mcall SF_MOUSE_GET,SSF_BUTTON + test eax,eax + jnz @f + popa + ret 4 + +@@: + mov eax,dword[esp+36] +@@: + mov edi,dword[eax] + test edi,edi + je option_check + call option_box_mouse_op + add eax,4 + jmp @b + +align 16 +option_box_draw_box: + pusha ;сохраним все регистры + + movzx ebx,word op_left + shl ebx,16 + add ebx,dword op_size + movzx ecx,word op_top + shl ecx,16 + add ecx,dword op_size + mcall SF_DRAW_RECT,,,op_border_color ;рисуем рамку + + add ebx,1 shl 16 - 2 + add ecx,1 shl 16 - 2 + mcall ,,,op_color ;закрашиваем внутренности чекбокса + +; mov eax,dword option_group +; mov eax,[eax] +; cmp eax,edi +; jne @f +; call option_box_draw_op ;нарисовать включенный чек бокс + + +;---------------------------- +;расчет куда будет произведен вывод текста +;---------------------------- +@@: + movzx ebx,word op_left ;загрузить значение х для чек бокса + add ebx,dword op_size + add ebx,dword op_text_margin ;добавить размер стороны и расстояние на котором начнется вывод текста + shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + mov bx,word op_top ;загрузим значение по y + mov eax,op_size + shr eax,1 + add eax,4 + add ebx,eax + sub ebx,7 ;добавим значение длины стороны -9+2 + mov esi,dword op_text_length + mcall SF_DRAW_TEXT,,op_text_color,op_text_ptr ;Вывод надписи на канву + popa ;восстановить значения регистров из стека + ret ;выйдем из процедуры + +option_box_clear_op: ;очистка чек бокса + mov edx,dword op_color ;цвет внутри чек бокса + jmp @f ;безусловный прыжок на нижнюю метку @@ + + +option_box_draw_op: ;нарисовать включенный чек бокс + mov edx,dword op_border_color ;загрузить цвет +@@: + movzx ebx,word op_left ;загрузить координату по х + mov eax,dword op_size + mov bp,ax + shr eax,2 + push ax + + push ax + add ebx,eax + shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + pop ax + lea eax,[eax*2] + sub bp,ax ;сохраним регистр bx в регистре указателя базы + mov bx,bp + + movzx ecx,word op_top ;загрузить координату по у + pop ax + add cx,ax + shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) + mov cx,bp ;загрузим значения регистра указателя базы в cx + mcall SF_DRAW_RECT ;вывод полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс + ret ;выйти из процедуры + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Обработчик mouse +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +align 16 +option_box_mouse_op: ;обработка мыши +pusha + mov esi,dword op_text_length ;загрузить кол-во символов в текстовой строке + imul esi,6 ;или можно и так умножить на 6 + add esi,dword op_text_margin ;добавить 3 - расстояние от чек бокса до надписи + + mcall SF_MOUSE_GET,SSF_WINDOW_POSITION ;получить координаты курсора относительно окна + + movzx ebx,word op_top ;загрузить в bx значение координаты у + cmp ax,bx ;сравнить с с координатой курсора + jl option_box_mouse_end ;SF <> OF если меньше + add ebx,dword op_size ;добавить размер + cmp ax,bx ;сравнить + jg option_box_mouse_end ;ZF = 0 и SF = OF если больше + + shr eax,16 ;разделим на 65536 или просто сдвинем биты на 16 значений + movzx ebx,word op_left ;произведем аналогичное сравнение + cmp ax,bx ;сравнить регистры + jl option_box_mouse_end ;если меньше + add ebx,dword op_size ;добавить длину стороны прямоугольника + add ebx,esi ;Учесть в значении по х еще и длину надписи к чекбоксу + cmp ax,bx ;стравнить регистры + jg option_box_mouse_end ;если больше + mov eax,dword option_group + mov [eax],edi + +option_box_mouse_end: + popa ;восстановить регистры из стека + ret ;выйти diff --git a/programs/develop/libraries/box_lib/trunk/optionbox.mac b/programs/develop/libraries/box_lib/trunk/optionbox.mac deleted file mode 100644 index 7709ce73a3..0000000000 --- a/programs/develop/libraries/box_lib/trunk/optionbox.mac +++ /dev/null @@ -1,189 +0,0 @@ -;файл создан 13.02.2009 На код применена GPL2 лицензия -;Макрос для системной библиотеки box_lib.obj -;Optionbox - -macro use_optionbox_driver ;макросы которые управляют работой бокса ) -{ -option_box_draw: - pusha - - mov eax,dword [esp+36] -@@: mov edi,dword [eax] - test edi,edi - je option_check - call option_box_draw_box - add eax,4 - jmp @b - -option_check: - mov eax,dword [esp+36] -@@: mov edi,dword [eax] - test edi,edi - je @f - - mov ebx,dword [edi] - mov ebx,dword [ebx] - cmp edi,ebx - jne .clear_op - - pusha - call option_box_draw_op - popa - add eax,4 - jmp @b - -.clear_op: - pusha - call option_box_clear_op - popa - add eax,4 - jmp @b - - -@@: popa - ret 4 - ; exit вообще :) - - -option_box_mouse: - pusha - mcall 37,2 - test eax,eax - jnz @f - popa - ret 4 -@@: - mov eax,dword [esp+36] -@@: mov edi,dword [eax] - test edi,edi - je option_check - call option_box_mouse_op - add eax,4 - jmp @b - -} -macro use_optionbox_draw -{ -option_box_draw_box: - pusha ;сохраним все регистры - - movzx ebx,word op_left - shl ebx,16 - add ebx,dword op_size - movzx ecx,word op_top - shl ecx,16 - add ecx,dword op_size - mov edx,dword op_border_color - mov eax,13 - mcall ;рисуем рамку - - mov edx,dword op_color - add ebx,1 shl 16 - 2 - add ecx,1 shl 16 - 2 - mcall ;закрашиваем внутренности чекбокса - -; mov eax,dword option_group -; mov dword eax,[eax] -; cmp eax,edi -; jne @f -; call option_box_draw_op ;нарисовать включенный чек бокс - - -;---------------------------- -;расчет куда будет произведен вывод текста -;---------------------------- -@@: movzx ebx,word op_left ;загрузить значение х для чек бокса - add ebx,dword op_size - add ebx,dword op_text_margin;добавить размер стороны и расстояние на котором начнется вывод текста - shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - mov bx,word op_top ;загрузим значение по y - mov eax,op_size - shr eax,1 - add eax,4 - add ebx,eax - mov ecx,dword op_text_color ;загрузим цвет надписи + flags - sub ebx,7 ;добавим значение длины стороны -9+2 - - mov edx,dword op_text_ptr ;укажем адрес от куда нужно выводить строку - mov esi,dword op_text_length - ;внесем в eax значение вывода надписи на канву - mov eax,4 - mcall ;Вывод -popa ;восстановить значения регистров из стека -ret ;выйдем из процедуры - -option_box_clear_op: ;очистка чек бокса - mov edx,dword op_color ;цвет внутри чек бокса - jmp @f ;безусловный прыжок на нижнюю метку @@ - - -option_box_draw_op: ;нарисовать включенный чек бокс - mov edx,dword op_border_color ;загрузить цвет -@@: - movzx ebx,word op_left ;загрузить координату по х - mov eax,dword op_size - mov bp,ax - shr eax,2 - push ax - - push ax - add ebx,eax - shl ebx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - pop ax - lea eax,[eax*2] - sub bp,ax ;сохраним регистр bx в регистре указателя базы - mov bx,bp - - movzx ecx,word op_top ;загрузить координату по у - pop ax - add cx,ax - shl ecx,16 ;сдвинем на 16 разрядов в лево (умножим на 65536) - mov cx,bp ;загрузим значения регистра указателя базы в cx - mov eax,13 ;в eax - значения функции для вывода полосы т.е. по сути прямоугольника, который отображает включенный компонент чек бокс - mcall ;вывод -ret ;выйти из процедуры -} - - -macro use_optionbox_mouse -{ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Обработчик mouse -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -option_box_mouse_op: ;обработка мыши -pusha - mov esi,dword op_text_length ;загрузить кол-во символов в текстовой строке - ;Умножение на 6 Быстрое умножение можно воспользоваться любым мз методов, но на старых Процессорах (386,486,P1)быстрее будет с инструкцией Lea -; lea esi,[eax*2+eax] -; shl eax,1 - imul esi,6 ; или можно и так умножить на 6 - xor ebx,ebx - add esi,dword op_text_margin ;добавить 3 - расстояние от чек бокса до надписи - - mov eax,37 ;получим координаты мышки - inc ebx ;добавить 1 - mcall ;получить координаты курсора относительно окна - - movzx ebx,word op_top ;загрузить в bx значение координаты у - cmp ax,bx ;сравнить с с координатой курсора - jl option_box_mouse_end ;SF <> OF если меньше - add ebx,dword op_size ;добавить размер - cmp ax,bx ;сравнить - jg option_box_mouse_end ;ZF = 0 и SF = OF если больше - - shr eax,16 ;разделим на 65536 или просто сдвинем биты на 16 значений - movzx ebx,word op_left ;произведем аналогичное сравнение - cmp ax,bx ;сравнить регистры - jl option_box_mouse_end ;если меньше - add ebx,dword op_size ;добавить длину стороны прямоугольника - add ebx,esi ;Учесть в значении по х еще и длину надписи к чекбоксу - cmp ax,bx ;стравнить регистры - jg option_box_mouse_end ;если больше - mov eax,dword option_group - mov [eax],edi - -option_box_mouse_end: -popa ;восстановить регистры из стека -ret ;выйти - -} \ No newline at end of file diff --git a/programs/develop/libraries/box_lib/trunk/tree_list.mac b/programs/develop/libraries/box_lib/trunk/tree_list.asm similarity index 78% rename from programs/develop/libraries/box_lib/trunk/tree_list.mac rename to programs/develop/libraries/box_lib/trunk/tree_list.asm index 7a5dfd78a7..85f1fbe5ec 100644 --- a/programs/develop/libraries/box_lib/trunk/tree_list.mac +++ b/programs/develop/libraries/box_lib/trunk/tree_list.asm @@ -1,27 +1,23 @@ -; макрос для системной библиотеки box_lib.obj -; элемент TreeList для Kolibri OS -; файл последний раз изменялся 03.12.2015 IgorA +; элемент TreeList для библиотеки box_lib.obj ; на код применена GPL2 лицензия +; последняя модификация 12.09.2017 IgorA -sizeof.TreeList equ 20 -;struct TreeList -; type dw ? ;+ 0 тип элемента, или индекс иконки для узла -; lev db ? ;+ 2 уровень элемента -; clo db ? ;+ 3 флаг закрытия, или открытия (имеет смысл для родительского узла) -; perv dd ? ;+ 4 индекс предыдущего элемента -; next dd ? ;+ 8 индекс последующего элемента -; tc dd ? ;+12 врем. создания -; td dd ? ;+16 врем. удаления -;ends +struct TreeNode + type dw ? ;+ 0 тип элемента, или индекс иконки для узла + level db ? ;+ 2 уровень элемента + close db ? ;+ 3 флаг закрытия, или открытия (имеет смысл для родительского узла) + perv dd ? ;+ 4 индекс предыдущего элемента + next dd ? ;+ 8 индекс последующего элемента + t_create dd ? ;+12 врем. создания + t_delete dd ? ;+16 врем. удаления +ends -macro use_tree_list -{ ;выделние памяти для структур списка и основной информации (конструктор) -align 4 +align 16 proc tl_data_init uses eax ecx edi, tlist:dword - mov edi,dword[tlist] + mov edi,[tlist] xor ecx,ecx mov cx,tl_info_size @@ -31,7 +27,7 @@ proc tl_data_init uses eax ecx edi, tlist:dword mov tl_data_img,0 ;обнуляем указатель 'data_img' mov tl_data_img_sys,0 ;обнуляем указатель 'data_img_sys' - mov ecx,sizeof.TreeList + mov ecx,sizeof.TreeNode imul ecx,tl_info_max_count invoke mem.alloc,ecx mov tl_data_nodes,eax ;копируем указатель на полученую память в структуру @@ -64,7 +60,7 @@ endp ;очистка памяти элемента (деструктор) align 4 proc tl_data_clear uses eax edi, tlist:dword - mov edi,dword[tlist] + mov edi,[tlist] cmp tl_data_img,0 je @f invoke mem.free,tl_data_img ;чистка системных иконок @@ -81,11 +77,11 @@ endp ;очистка списка (информации) align 4 proc tl_info_clear uses eax ecx edi, tlist:dword - mov edi,dword[tlist] + mov edi,[tlist] mov tl_ch_tim,0 mov tl_tim_undo,0 mov tl_cur_pos,0 - mov ecx,sizeof.TreeList + mov ecx,sizeof.TreeNode imul ecx,tl_info_max_count mov eax,tl_data_nodes @@: @@ -93,7 +89,7 @@ proc tl_info_clear uses eax ecx edi, tlist:dword inc eax loop @b mov eax,tl_data_nodes ;указатель на 0-й узел - mov dword[eax+8],1 ;указатель next в 0-м узле приравниваем к 1 + mov dword[eax+TreeNode.next],1 ;указатель next в 0-м узле приравниваем к 1 cmp tl_p_scroll,0 ;обработка скроллинга je @f @@ -107,14 +103,14 @@ endp ;реакция на клавиатуру align 4 proc tl_key uses ebx ecx edi, tlist:dword - mov edi,dword[tlist] + mov edi,[tlist] mov ebx,tl_el_focus - cmp dword[ebx],edi + cmp [ebx],edi jne .no_focus ;элемент не в фокусе push eax - mcall 66,2 ;получить режим ввода с клавиатуры + mcall SF_KEYBOARD,SSF_GET_INPUT_MODE ;получить режим ввода с клавиатуры lea ecx,[tl_key_scan] cmp eax,1 ;1 = сканкоды @@ -181,9 +177,9 @@ endp align 4 proc tl_mouse, tlist:dword pushad - mov edi,dword[tlist] + mov edi,[tlist] - mcall 37,1 ;координаты мыши относительно окна + mcall SF_MOUSE_GET,SSF_WINDOW_POSITION ;координаты мыши относительно окна mov ebx,tl_box_left shl ebx,16 @@ -206,7 +202,7 @@ proc tl_mouse, tlist:dword jl .test_scroll push eax ebx - mcall 37,7 ;обработка колеса мыши + mcall SF_MOUSE_GET,SSF_SCROLL_DATA mov edx,eax xor ecx,ecx test eax,eax @@ -226,8 +222,7 @@ push eax ebx jz .mouse_next @@: stdcall tl_cur_next, edi - dec ecx - jnz @r + loop @r jmp .mouse_next ;------------------------------------------------ .decr: ;вертикальная прокрутка отрицательная @@ -241,21 +236,17 @@ push eax ebx inc ecx @@: stdcall tl_cur_perv, edi - dec ecx - jnz @r + loop @r ;------------------------------------------------ .mouse_next: -pop ebx eax - - push eax ebx - mcall 37,2 + mcall SF_MOUSE_GET,SSF_BUTTON bt eax,0 ;left mouse button press - pop ebx eax +pop ebx eax jae .no_draw mov esi,tl_el_focus - mov dword[esi],edi ;set focus + mov [esi],edi ;set focus ; if '+' or '-' press mov esi,eax @@ -263,15 +254,14 @@ pop ebx eax sub esi,tl_box_left ;esi = mouse x coord in element window and eax,0xffff - sub ax,bx + sub eax,ebx xor edx,edx - xor ecx,ecx - mov cx,tl_img_cy + movzx ecx,tl_img_cy div ecx cmp tl_p_scroll,0 ;учитываем скроллинг je @f mov edx,tl_p_scroll - add eax,dword[edx+sb_offs_position] ;добавляем скроллинг на верху + add eax,[edx+sb_offs_position] ;добавляем скроллинг на верху @@: mov ecx,eax @@ -296,10 +286,10 @@ pop ebx eax call tl_get_cur_node_index ;eax = node index cmp eax,2 jl .no_open_close ;курсор стоит на пустом месте, без узлов - imul eax,sizeof.TreeList + imul eax,sizeof.TreeNode add eax,tl_data_nodes xor bx,bx - mov bl,byte[eax+2] ;+2 lev сохраняем уровень текущего узла + mov bl,byte[eax+TreeNode.level] ;сохраняем уровень текущего узла inc bx ;+ поле для курсора cmp si,tl_img_cx @@ -324,16 +314,16 @@ pop ebx eax ;--- mouse event for children scrollbar ---------------------------------------- .test_scroll: mov edx,tl_p_scroll - cmp edx,0 - je .no_in_wnd ;пользователь не создал дочернего скроллинга + or edx,edx + jz .no_in_wnd ;пользователь не создал дочернего скроллинга shr ebx,16 add bx,word[edx] ;+0 .size_x shl ebx,16 cmp eax,ebx ;правая граница окна jg .no_in_wnd - mov eax,dword[edx+sb_offs_max_area] - cmp eax,dword[edx+sb_offs_cur_area] + mov eax,[edx+sb_offs_max_area] + cmp eax,[edx+sb_offs_cur_area] jbe .no_in_wnd ;все узлы попадают в окно скроллинга stdcall scroll_bar_vertical.mouse, edx ;scrollbar_ver_mouse @@ -345,12 +335,12 @@ pop ebx eax cmp dword[edx+sb_offs_delta2],0 jne .no_draw ;попали на скроллинг - не снимаем фокус с TreeList ;------------------------------------------------------------------------------- - .no_in_wnd: ;не попали в окно - потеря фокуса (при условии что фокус был на данном эелементе) - mcall 37,2 ;проверяем нажатость любых кнопок - cmp eax,0 ;ничего не нажали eax=0 - je .no_draw + .no_in_wnd: ;не попали в окно - потеря фокуса (при условии что фокус был на данном эелементе) + mcall SF_MOUSE_GET,SSF_BUTTON + or eax,eax ;ничего не нажали eax=0 + jz .no_draw mov ebx,tl_el_focus - cmp dword[ebx],edi + cmp [ebx],edi jne .no_draw ;элемент не в фокусе mov dword[ebx],0 ;reset focus mov esi,tl_box_top @@ -365,7 +355,7 @@ endp ;отмена действия align 4 proc tl_info_undo uses eax edi, tlist:dword - mov edi,dword[tlist] + mov edi,[tlist] mov eax,tl_tim_undo cmp tl_ch_tim,eax jbe @f @@ -378,7 +368,7 @@ endp ;повтор действия align 4 proc tl_info_redo uses edi, tlist:dword - mov edi,dword[tlist] + mov edi,[tlist] cmp tl_tim_undo,1 jl @f dec tl_tim_undo @@ -397,36 +387,38 @@ tl_info_set_undo: push eax ebx ecx edx mov edx,tl_data_nodes mov ecx,edx - add ecx,sizeof.TreeList + add ecx,sizeof.TreeNode call tl_move_next ;long i=node[0].next; + mov eax,tl_tim_undo sub tl_ch_tim,eax ;ch_tim-=tim_undo; - mov eax,tl_ch_tim + cmp edx,ecx jle @f ;if(node[i].tc>ch_tim){ // если создание символа было отменено - cmp dword[edx+12],eax + mov eax,tl_ch_tim + cmp [edx+TreeNode.t_create],eax jle .no_u1 - mov dword[edx+12],0 - mov dword[edx+16],0 + mov dword[edx+TreeNode.t_create],0 + mov dword[edx+TreeNode.t_delete],0 - mov ebx, dword[edx+4] - imul ebx,sizeof.TreeList + mov ebx, [edx+TreeNode.perv] + imul ebx,sizeof.TreeNode add ebx, tl_data_nodes ;.next - push dword[edx+8] ;node[node[i].perv].next=node[i].next; - pop dword[ebx+8] + push dword[edx+TreeNode.next] ;node[node[i].perv].next=node[i].next; + pop dword[ebx+TreeNode.next] - mov ebx, dword[edx+8] - imul ebx,sizeof.TreeList + mov ebx, [edx+TreeNode.next] + imul ebx,sizeof.TreeNode add ebx, tl_data_nodes ;.perv - push dword[edx+4] ;node[node[i].next].perv=node[i].perv; - pop dword[ebx+4] + push dword[edx+TreeNode.perv] ;node[node[i].next].perv=node[i].perv; + pop dword[ebx+TreeNode.perv] .no_u1: ;else if(node[i].td>ch_tim) node[i].td=0; // если удаление символа было отменено - cmp dword[edx+16],eax + cmp [edx+TreeNode.t_delete],eax jle .no_u2 - mov dword[edx+16],0 + mov dword[edx+TreeNode.t_delete],0 .no_u2: call tl_move_next jmp @b @@ -441,7 +433,7 @@ align 4 proc tl_draw, tlist:dword pushad ;draw dir_list main rect - mov edi,dword[tlist] + mov edi,[tlist] mov ebx,tl_box_left shl ebx,16 add ebx,tl_box_width @@ -449,32 +441,29 @@ proc tl_draw, tlist:dword shl ecx,16 mov cx,tl_capt_cy mov edx,tl_col_zag - mcall 13 ;draw window caption + mcall SF_DRAW_RECT ;draw window caption add ecx,tl_box_top shl ecx,16 add ecx,tl_box_height sub cx,tl_capt_cy - mov edx,tl_col_bkg - int 0x40 ;draw window client rect + mcall ,,,tl_col_bkg ;draw window client rect cmp tl_capt_cy,9 ;9 - minimum caption height jl @f mov ebx,edi ;calculate cursor position mov eax,tl_cur_pos inc eax - lea edi,[txt_capt_cur] - add edi,7 - call tl_convert_to_str + lea edi,[txt_capt_cur.v] + stdcall tl_convert_to_str, 5 mov edi,ebx mov eax,tl_tim_undo - lea edi,[txt_capt_otm] - add edi,7 - call tl_convert_to_str + lea edi,[txt_capt_otm.v] + stdcall tl_convert_to_str, 5 mov edi,ebx ;restore edi - mov eax,4 ;draw text captions + mov eax,SF_DRAW_TEXT ;captions mov ebx,tl_box_left shl ebx,16 add ebx,5*65536+3 @@ -496,7 +485,7 @@ proc tl_draw, tlist:dword xor eax,eax mov edx,tl_data_nodes mov ecx,edx - add ecx,sizeof.TreeList + add ecx,sizeof.TreeNode ;*** пропуск узлов, которые промотаны скроллингом *** cmp tl_p_scroll,0 ;если есть указатель на скроллинг @@ -539,7 +528,7 @@ endp ;переход на следущий видимый узел (пропуская закрытые) ;input: ; ecx = pointer to 1 node struct -; edx = pointer to some node struct +; edx = pointer to node struct ; edi = pointer to 'TreeList' struct ;output: ; edx = pointer to next node struct @@ -547,9 +536,9 @@ align 4 tl_iterat_next: push bx mov bl,0x7f - cmp byte[edx+3],1 + cmp byte[edx+TreeNode.close],1 jne @f - mov bl,byte[edx+2] + mov bl,byte[edx+TreeNode.level] @@: cmp tl_tim_undo,0 @@ -563,7 +552,7 @@ tl_iterat_next: call tl_node_not_vis ;пропуск удаленных и отмененных cmp al,1 je .beg0 - cmp bl,byte[edx+2] ;пропуск закрытых + cmp bl,byte[edx+TreeNode.level] ;пропуск закрытых jl .beg0 @@: pop eax @@ -574,9 +563,9 @@ tl_iterat_next: call tl_move_next cmp edx,ecx jle .endif - cmp dword[edx+16],0 ;td = 'time delete' -> пропуск удаленных + cmp dword[edx+TreeNode.t_delete],0 ;пропуск удаленных jne .else - cmp bl,byte[edx+2] ;пропуск закрытых + cmp bl,byte[edx+TreeNode.level] ;пропуск закрытых jl .else .endif: pop bx @@ -585,7 +574,7 @@ tl_iterat_next: ;переход на следущий видимый узел (и на закрытые тоже) ;input: ; ecx = pointer to 1 node struct -; edx = pointer to some node struct +; edx = pointer to node struct ; edi = pointer to 'TreeList' struct ;output: ; edx = pointer to next visible node struct @@ -609,7 +598,7 @@ tl_iterat_next_all: call tl_move_next cmp edx,ecx jle .endif - cmp dword[edx+16],0 ;td -> time delete + cmp dword[edx+TreeNode.t_delete],0 ;td -> time delete jne .else .endif: ret @@ -617,11 +606,10 @@ tl_iterat_next_all: ;переход на предыдущий видимый узел (пропуская закрытые) ;input: ; ecx = pointer to 1 node struct -; edx = pointer to some node struct +; edx = pointer to node struct ; edi = pointer to 'TreeList' struct align 4 -tl_iterat_perv: - push eax +proc tl_iterat_perv uses eax cmp tl_tim_undo,0 je .beg1 @@ -637,17 +625,17 @@ tl_iterat_perv: call tl_move_perv cmp edx,ecx jle @f - cmp dword[edx+16],0 ;td = 'time delete' -> пропуск удаленных + cmp dword[edx+TreeNode.t_delete],0 ;td = 'time delete' -> пропуск удаленных jne .beg1 @@: - call tl_move_max_clo_par - pop eax + call tl_move_max_clo_par ret +endp ;находит родительский закрытый узел максимального уровня ;input: -; edx = pointer to some node struct +; edx = pointer to node struct ; edi = pointer to 'TreeList' struct ;output: ; edx = pointer closed parent node with maximum level @@ -657,7 +645,7 @@ proc tl_move_max_clo_par uses eax ebx xor ebx,ebx .beg: call tl_move_par - cmp byte[edx+3],1 ;родительский узел закрыт ? + cmp byte[edx+TreeNode.close],1 ;родительский узел закрыт ? jne @f mov eax,edx @@: @@ -671,43 +659,43 @@ proc tl_move_max_clo_par uses eax ebx endp ;input: -; edx = pointer to some node struct +; edx = pointer to node struct ; edi = pointer to 'TreeList' struct ;output: ; edx = pointer to next node struct align 4 tl_move_next: - mov edx,dword[edx+8] - imul edx,sizeof.TreeList + mov edx,[edx+TreeNode.next] + imul edx,sizeof.TreeNode add edx,tl_data_nodes ret ;input: -; edx = pointer to some node struct +; edx = pointer to node struct ; edi = pointer to 'TreeList' struct ;output: ; edx = pointer to perv node struct align 4 tl_move_perv: - mov edx,dword[edx+4] - imul edx,sizeof.TreeList + mov edx,[edx+TreeNode.perv] + imul edx,sizeof.TreeNode add edx,tl_data_nodes ret ;передвигаемся на родительский узел, если такого нет, то оставляем старое значение указателя ;input: -; ecx = -; edx = pointer to some node struct +; ecx = pointer to 1 node struct +; edx = pointer to node struct ; edi = pointer to 'TreeList' struct ;output: ; edx = pointer to parent node struct align 4 tl_move_par: - cmp byte[edx+2],0 + cmp byte[edx+TreeNode.level],0 je .end_f ;узел 0-го уровня не может быть дочерним push eax ebx esi mov esi,edx ;copy node pointer (edx) - mov bl,byte[edx+2] + mov bl,byte[edx+TreeNode.level] @@: call tl_move_perv cmp edx,ecx @@ -715,7 +703,7 @@ tl_move_par: call tl_node_not_vis ;пропуск удаленных и отмененных cmp al,1 je @b - cmp byte[edx+2],bl + cmp byte[edx+TreeNode.level],bl jl .end_0 ;удачно нашли родительский узел jmp @b @@: @@ -727,16 +715,16 @@ tl_move_par: ;проверяет видимый ли указанный узел с учетом: добавлений, удалений, отмен действий ;input: -; edx = pointer to symbol struct +; edx = pointer to node struct ; edi = pointer to 'TreeList' struct ;output: ; al = 1 if sumbol not visible ; (node[i].td+tim_Undo<=ch_tim && node[i].td) || (node[i].tc>ch_tim-tim_Undo) align 4 tl_node_not_vis: - cmp dword[edx+16],0 + cmp dword[edx+TreeNode.t_delete],0 je @f - mov eax,dword[edx+16] ;eax=node[i].td + mov eax,[edx+TreeNode.t_delete] ;eax=node[i].td add eax,tl_tim_undo cmp eax,tl_ch_tim jg @f @@ -746,7 +734,7 @@ tl_node_not_vis: mov eax,tl_ch_tim sub eax,tl_tim_undo - cmp dword[edx+12],eax ;tc -> time create + cmp [edx+TreeNode.t_create],eax ;time create jle @f mov al,1 ret @@ -769,8 +757,7 @@ proc tl_draw_cursor uses eax ebx ecx edx esi mov ebx,tl_box_left shl ebx,16 mov bx,tl_img_cx - xor ecx,ecx - mov cx,tl_img_cy + movzx ecx,tl_img_cy imul ecx,eax add ecx,tl_box_top add cx,tl_capt_cy @@ -788,7 +775,7 @@ proc tl_draw_cursor uses eax ebx ecx edx esi .crop0: mov edx,tl_col_txt - mcall 13 ;рисуем простой прямоугольник, т.к. нет системных иконок + mcall SF_DRAW_RECT ;рисуем простой прямоугольник, т.к. нет системных иконок jmp .end_f @@: mov ebx,tl_data_img_sys @@ -803,10 +790,8 @@ proc tl_draw_cursor uses eax ebx ecx edx esi cmp dword[ecx],edi je .focus ;если не в фокусе сдвигаем координаты на иконку не активного курсора - xor eax,eax - xor ecx,ecx - mov cx,tl_img_cx - mov ax,tl_img_cy + movzx ecx,tl_img_cx + movzx eax,tl_img_cy imul eax,ecx imul eax,4*3 ;4=icon index 3=rgb add ebx,eax @@ -826,7 +811,7 @@ proc tl_draw_cursor uses eax ebx ecx edx esi mov cx,si ;если курсор виден частично (попал на нижнюю границу) .crop1: - mcall 7 ;рисуем иконку курсора + mcall SF_PUT_IMAGE ;рисуем иконку курсора .end_f: ret endp @@ -843,8 +828,7 @@ proc tl_draw_null_cursor uses eax ebx ecx edx esi mov ebx,tl_box_left shl ebx,16 mov bx,tl_img_cx - xor ecx,ecx - mov cx,tl_img_cy + movzx ecx,tl_img_cy imul ecx,eax add ecx,tl_box_top add cx,tl_capt_cy @@ -860,7 +844,7 @@ proc tl_draw_null_cursor uses eax ebx ecx edx esi jge @f mov cx,si ;если курсор виден частично (попал на нижнюю границу) @@: - mcall 13,,,tl_col_bkg ;рисуем простой прямоугольник с фоновым цветом + mcall SF_DRAW_RECT,,,tl_col_bkg ;рисуем простой прямоугольник с фоновым цветом .end_f: ret endp @@ -886,7 +870,7 @@ tl_get_display_cur_pos: ;рисует узел с: картинкой, подписью, иконкой открытия/закрытия и линиями к родит. узлу ;input: ; eax = node position (0, ..., max_nodes-scroll_pos) не до tl_box_height/tl_img_cy -; edx = pointer to some node struct +; edx = pointer to node struct ; edi = pointer to 'TreeList' struct ; esi = coord of bottom border align 4 @@ -895,15 +879,14 @@ proc tl_draw_node uses eax ebx ecx edx esi bt tl_style,2 ;tl_list_box_mode jc @f inc ebx ;+1 - место под знак +,- - add bl,byte[edx+2] ;добавляем уровень элемента для его учета в левом отступе иконки + add bl,byte[edx+TreeNode.level] ;добавляем уровень элемента для его учета в левом отступе иконки @@: imul bx,tl_img_cx add ebx,tl_box_left shl ebx,16 mov bx,tl_img_cx - xor ecx,ecx - mov cx,tl_img_cy + movzx ecx,tl_img_cy imul ecx,eax add cx,tl_capt_cy jc .end_draw ;когда много узлов, то может быть переполнение координаты cx @@ -925,17 +908,14 @@ proc tl_draw_node uses eax ebx ecx edx esi .crop: mov esi,ecx ;save ecx + push edx cmp tl_data_img,0 jne .draw_img_n - push edx - mov edx,tl_col_txt - mcall 13 ;draw node rect - pop edx - jmp @f + mcall SF_DRAW_RECT,,,tl_col_txt ;draw node rect + jmp @f .draw_img_n: - push ebx edx esi - xor esi,esi - mov si,word[edx] ;get icon type + push ebx esi + movzx esi,word[edx+TreeNode.type] ;get icon type mov edx,ebx ror ecx,16 mov dx,cx @@ -947,16 +927,17 @@ proc tl_draw_node uses eax ebx ecx edx esi imul ebx,esi ;esi = icon index add ebx,tl_data_img - mcall 7 ;draw node icon '-' - pop esi edx ebx + mcall SF_PUT_IMAGE ;draw node icon '-' + pop esi ebx @@: + pop edx - mov al,byte[edx+2] ;draw minus '-' + mov al,byte[edx+TreeNode.level] ;draw minus '-' mov ecx,tl_data_nodes - add ecx,sizeof.TreeList + add ecx,sizeof.TreeNode mov ah,10 ;get icon index '+' or '-' ? - cmp byte[edx+3],1 + cmp byte[edx+TreeNode.close],1 jne .close dec ah .close: @@ -974,7 +955,7 @@ endp ;input: ; al = уровень элемента ; ecx = pointer to 1 node struct -; edx = pointer to some node struct +; edx = pointer to node struct ;... align 4 proc tl_draw_node_icon_opn_clo uses eax ebx ecx edx esi @@ -983,14 +964,14 @@ proc tl_draw_node_icon_opn_clo uses eax ebx ecx edx esi cmp edx,ecx jle @f mov ecx,esi ;load ecx - cmp al,byte[edx+2] + cmp al,byte[edx+TreeNode.level] jne @f ror ebx,16 sub bx,tl_img_cx ror ebx,16 cmp tl_data_img_sys,0 jne .draw_img_s - mcall 13,,,tl_col_txt ;draw minus rect, if not system icons + mcall SF_DRAW_RECT,,,tl_col_txt ;draw minus rect, if not system icons jmp @f .draw_img_s: mov ecx,esi ;load ecx @@ -1006,7 +987,7 @@ proc tl_draw_node_icon_opn_clo uses eax ebx ecx edx esi and eax,0xff imul ebx,eax ;eax = icon index add ebx,tl_data_img_sys - mcall 7 ;draw minus icon '-' + mcall SF_PUT_IMAGE ;draw minus icon '-' @@: ret endp @@ -1015,19 +996,19 @@ endp ;input: ; al = уровень элемента ; ecx = pointer to 1 node struct -; edx = pointer to some node struct +; edx = pointer to node struct ;... align 4 tl_draw_node_icon_par_lin: - cmp byte[edx+3],1 + cmp byte[edx+TreeNode.close],1 je .close + or al,al + jz .close push eax ebx ecx edx esi - cmp al,0 - je @f call tl_iterat_next_all ;get next visible item cmp edx,ecx jle .line3 ;if end of list - cmp al,byte[edx+2] + cmp al,byte[edx+TreeNode.level] jne .line3 ;jg ??? mov eax,3 ;line in middle element jmp .line2 @@ -1041,7 +1022,7 @@ tl_draw_node_icon_par_lin: ror ebx,16 cmp tl_data_img_sys,0 jne .draw_img_s - mcall 13,,,tl_col_txt ;draw minus rect, if not system icons + mcall SF_DRAW_RECT,,,tl_col_txt ;draw minus rect, if not system icons jmp @f .draw_img_s: mov edx,ebx @@ -1055,8 +1036,8 @@ tl_draw_node_icon_par_lin: imul ebx,eax ;eax = icon index add ebx,tl_data_img_sys - mcall 7 ;draw line icon - @@: + mcall SF_PUT_IMAGE ;draw line icon + @@: pop esi edx ecx ebx eax .close: ret @@ -1066,14 +1047,14 @@ tl_draw_node_icon_par_lin: ; al = уровень элемента ; ebx = (node.left shl 16) + tl_img_cx ; ecx = pointer to 1 node struct -; edx = pointer to some node struct +; edx = pointer to node struct ; edi = pointer to 'TreeList' struct align 4 proc tl_draw_node_icon_par_lin_up uses eax ebx ecx edx esi cmp tl_data_img_sys,0 ;if not image je @f - cmp al,0 - je @f + or al,al + jz @f xor esi,esi ;в si будем насчитывать кол-во иконок, нужных для прорисовки линии ;--- цикл для вычисления колличества вертикальных линий --- .cycle0: @@ -1081,13 +1062,13 @@ proc tl_draw_node_icon_par_lin_up uses eax ebx ecx edx esi cmp edx,ecx jle .cycle1 ;if begin of list - cmp byte[edx+2],al + cmp byte[edx+TreeNode.level],al jle .cycle0end ;уровень верхнего элемента не требует прорисовки inc si jmp .cycle0 .cycle0end: - cmp si,0 ;si = кол-во иконок линии которые нужно нарисовать сверху - je @f + or si,si ;si = кол-во иконок линии которые нужно нарисовать сверху + jz @f shl esi,16 pop ecx ;esi->ecx @@ -1110,7 +1091,7 @@ proc tl_draw_node_icon_par_lin_up uses eax ebx ecx edx esi add esi,tl_box_top add si,tl_capt_cy ;si = верхняя граница окна - mov eax,7 + mov eax,SF_PUT_IMAGE ;--- цикл для рисования вертикальной линии --- .cycle1: sub dx,tl_img_cy ;поднимаем координату y вверх @@ -1134,8 +1115,7 @@ tl_get_rows_count: push ecx edx mov eax,tl_box_height sub ax,tl_capt_cy - xor ecx,ecx - mov cx,tl_img_cy + movzx ecx,tl_img_cy xor edx,edx div ecx pop edx ecx @@ -1145,7 +1125,7 @@ tl_get_rows_count: ; eax = node position ; ebx = [координата по оси x]*65536 + [img_cx] ; ecx = [координата по оси y]*65536 + [img_cy] -; edx = pointer to some node struct +; edx = pointer to node struct ; edi = pointer to TreeInfo struct align 4 proc tl_draw_node_caption uses ebx ecx edx esi @@ -1174,7 +1154,7 @@ proc tl_draw_node_caption uses ebx ecx edx esi sub bx,9 ;отнимаем высоту текста mov ecx,tl_col_txt and ecx,0xffffff - mcall 4 + mcall SF_DRAW_TEXT @@: ret endp @@ -1228,45 +1208,45 @@ tl_strlen: ; n_info - указатель на добавляемые данные align 4 proc tl_node_add uses eax ebx ecx edx edi, tlist:dword, n_opt:dword, n_info:dword - mov edi,dword[tlist] + mov edi,[tlist] call tl_info_set_undo - mov ebx,sizeof.TreeList + mov ebx,sizeof.TreeNode imul ebx,tl_info_max_count add ebx,tl_data_nodes ;-- call tl_get_cur_node_index ;eax=po_t - imul eax,sizeof.TreeList + imul eax,sizeof.TreeNode add eax,tl_data_nodes mov edx,eax call tl_move_perv call tl_get_node_index ;eax = index of pointer [edx] ;-- - mov edx,sizeof.TreeList + mov edx,sizeof.TreeNode shl edx,1 add edx,tl_data_nodes @@: ;for(i=2;i