From f097bebc8f59a7b245903d46ff1a24bb3b885e7b Mon Sep 17 00:00:00 2001 From: IgorA Date: Wed, 7 Dec 2016 08:31:30 +0000 Subject: [PATCH] editbox: clean code git-svn-id: svn://kolibrios.org@6788 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../libraries/box_lib/trunk/bl_sys.mac | 1 - .../libraries/box_lib/trunk/box_lib.asm | 8 +- .../trunk/{editbox.mac => editbox.asm} | 965 ++++++++---------- 3 files changed, 437 insertions(+), 537 deletions(-) rename programs/develop/libraries/box_lib/trunk/{editbox.mac => editbox.asm} (88%) diff --git a/programs/develop/libraries/box_lib/trunk/bl_sys.mac b/programs/develop/libraries/box_lib/trunk/bl_sys.mac index a46ef82cf8..51f4082e98 100644 --- a/programs/develop/libraries/box_lib/trunk/bl_sys.mac +++ b/programs/develop/libraries/box_lib/trunk/bl_sys.mac @@ -1,4 +1,3 @@ -include 'editbox.mac' ;macro which should make life easier :) specially for editbox include 'checkbox2.mac' ;macro implements checkbox version 2 include 'optionbox.mac' ;macro implements optionbox include 'scrollbar.mac' ;macro implements scrollbar diff --git a/programs/develop/libraries/box_lib/trunk/box_lib.asm b/programs/develop/libraries/box_lib/trunk/box_lib.asm index f398f6133c..8718173816 100644 --- a/programs/develop/libraries/box_lib/trunk/box_lib.asm +++ b/programs/develop/libraries/box_lib/trunk/box_lib.asm @@ -31,13 +31,7 @@ dll.load dd ? ;---------------------------------------------------- ;EditBox -;---------------------------------------------------- -align 16 -use_editbox_draw ;macro reveals the function of the display. -align 16 -use_editbox_key ;macro reveals processing function of the keypad. -align 16 -use_editbox_mouse ;macro reveals processing function of the mouse. +include 'editbox.asm' ;editbox ;---------------------------------------------------- ;CheckBox2 diff --git a/programs/develop/libraries/box_lib/trunk/editbox.mac b/programs/develop/libraries/box_lib/trunk/editbox.asm similarity index 88% rename from programs/develop/libraries/box_lib/trunk/editbox.mac rename to programs/develop/libraries/box_lib/trunk/editbox.asm index d0d098a30a..ef85bcba74 100644 --- a/programs/develop/libraries/box_lib/trunk/editbox.mac +++ b/programs/develop/libraries/box_lib/trunk/editbox.asm @@ -1,9 +1,49 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Basic macros for use editbox ; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -macro use_editbox_draw +macro use_key_no_process up,down,esc,enter,tab,numl,capsl,scrolll { +if up eq +else + cmp ah,177 + jz edit_box.editbox_exit +end if +if down eq +else + cmp ah,178 + jz edit_box.editbox_exit +end if +if esc eq +else + cmp ah,27 ;ESC - клавиша )) + jz edit_box.editbox_exit +end if +if enter eq +else + cmp ah,13 ;ENTER - клавиша )) + jz edit_box.editbox_exit +end if +if tab eq +else + cmp ah,9 ;TAB - клавиша )) + jz edit_box.editbox_exit +end if +if numl eq +else + cmp ah,4 ;Num Lock - клавиша )) + jz edit_box.editbox_exit +end if +if capsl eq +else + cmp ah,2 ;Caps Lock - клавиша )) + jz edit_box.editbox_exit +end if +if scrolll eq +else + cmp ah,1 ;Scroll Lock - клавиша )) + jz edit_box.editbox_exit +end if +} + + +align 16 edit_box: .draw: pushad @@ -44,13 +84,11 @@ edit_box: .editbox_exit: popad ret 4 -} -macro use_editbox_key -{ ;========================================================== ;=== обработка клавиатуры ================================= ;========================================================== +align 16 edit_box_key: pushad mov edi,[esp+36] @@ -63,7 +101,7 @@ edit_box_key: ; kernel SVN r.3356 or later push eax push ebx - mcall 66,3 + mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS test ax,0x200 ; LWin jnz .win_key_pressed test ax,0x400 ; RWin @@ -114,37 +152,324 @@ use_key_no_process up,down,esc,enter,tab,numl,capsl,scrolll ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе, если такой необходимости нет, нужно закоментировать макрос ;;;;;;;;;;;;;;;;;;;;;;;;;;;; -use_key_figures_only + test word ed_flags,ed_figure_only ; только цифры? + jz @f + cmp ah,'0' + jb edit_box.editbox_exit + cmp ah,'9' + ja edit_box.editbox_exit +@@: + ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;проверка на shift, был ли нажат ;;;;;;;;;;;;;;;;;;;;;;;;;;;; -are_key_shift_press + test word ed_flags,ed_shift_on + je @f +; edx = ed_size, ecx = ed_pos + push eax + mov edx,ed_size + mov ecx, ed_pos + pusha +; clear input area + mov ebp,ed_color + movzx ebx, word ed_shift_pos + call edit_box_key.sh_cl_ + mov ebp,ed_size + call edit_box_key.clear_bg + popa + call edit_box_key.del_char + mov ebx,ed_size + sub bx,ed_shift_pos + mov ed_size,ebx + pop eax +@@: + ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; проверяем, находится ли курсор в конце + дальнейшая обработка ;;;;;;;;;;;;;;;;;;;;;;;;;;;; -are_key_cur_end + mov ecx,ed_size + mov edx, ed_max + test word ed_flags,ed_insert + jne @f + cmp ecx,edx + jae edit_box.editbox_exit +@@: mov ebx, ed_pos + cmp ebx,edx + jnl edit_box.editbox_exit + mov ecx,ed_size + push edi eax + mov ebp,edi + mov esi,ed_text + add esi,ecx + mov edi,esi + cmp ecx,ebx + je edit_box_key.In_k + test dword bp_flags,ed_insert + jne edit_box_key.ins_v + pusha + mov edi,ebp + mov ebp,ed_size + call edit_box_key.clear_bg + popa + sub ecx,ebx + inc edi + std + inc ecx +@@: + lodsb + stosb + loop @b +edit_box_key.In_k: + cld + pop eax + mov al,ah + stosb + pop edi + inc dword ed_size + inc dword ed_pos + call edit_box_key.draw_all2 + jmp edit_box_key.shift + ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Обработка клавиш insert,delete.backspace,home,end,left,right ;;;;;;;;;;;;;;;;;;;;;;;;;;;; -use_work_key -} +edit_box_key.insert: + test word ed_flags,ed_insert + je @f + and word ed_flags,ed_insert_cl + jmp edit_box.editbox_exit + +@@: or word ed_flags,ed_insert + jmp edit_box.editbox_exit + +edit_box_key.ins_v: + dec dword bp_size + sub esi,ecx + add esi,ebx + mov edi,esi + pusha + mov edi,ebp + mov ebp,ed_pos + call edit_box_key.clear_bg + popa + jmp edit_box_key.In_k + +edit_box_key.delete: + mov edx,ed_size + mov ecx,ed_pos + cmp edx,ecx + jg edit_box_key.bac_del + test word ed_flags,ed_shift_on + jne edit_box_key.del_bac + popad + ret 4 + +edit_box_key.bac_del: + call edit_box_key.del_char + jmp edit_box_key.draw_all + +edit_box_key.backspace: + test word ed_flags,ed_shift_on + jne edit_box_key.delete + mov ecx,ed_pos + test ecx,ecx + jnz edit_box_key.del_bac + popad + ret 4 + +edit_box_key.del_bac: + mov edx,ed_size + cmp edx,ecx ;if ed_pos=ed_size + je @f + dec ecx + call edit_box_key.del_char +@@: test word ed_flags,ed_shift_on + jne edit_box_key.bac_del + dec dword ed_pos +edit_box_key.draw_all: + push edit_box_key.shift + test word ed_flags,ed_shift_on + je @f + movzx eax, word ed_shift_pos + mov ebx,ed_size + sub ebx,eax + mov ed_size,ebx + mov ebp,ed_color + call edit_box.clear_cursor + call edit_box.check_offset + jmp edit_box.draw_bg + +@@: dec dword ed_size +edit_box_key.draw_all2: + and word ed_flags,ed_shift_cl + mov ebp,ed_color + call edit_box.clear_cursor + call edit_box.check_offset + mov ebp,ed_size + jmp edit_box_key.clear_bg + +;--- нажата клавиша left --- +edit_box_key.left: + mov ebx,ed_pos + test ebx,ebx + jz edit_box_key.sh_st_of + or word ed_flags,ed_left_fl + call edit_box_key.sh_first_sh + dec dword ed_pos + call edit_box.draw_bg + call edit_box.draw_shift + call edit_box_key.sh_enable + jmp edit_box.draw_cursor_text + +;--- нажата клавиша right --- +edit_box_key.right: + mov ebx,ed_pos + cmp ebx,ed_size + je edit_box_key.sh_st_of + and word ed_flags,ed_right_fl + call edit_box_key.sh_first_sh + inc dword ed_pos + call edit_box.draw_bg + call edit_box.draw_shift + call edit_box_key.sh_enable + jmp edit_box.draw_cursor_text + +edit_box_key.home: + mov ebx,ed_pos + test ebx,ebx + jz edit_box_key.sh_st_of + call edit_box_key.sh_first_sh + xor eax,eax + mov ed_pos,eax + call edit_box.draw_bg + call edit_box.draw_shift + call edit_box_key.sh_home_end + jmp edit_box.draw_cursor_text + +;--- нажата клавиша end --- +edit_box_key.end: + mov ebx,ed_pos + cmp ebx,ed_size + je edit_box_key.sh_st_of + call edit_box_key.sh_first_sh + mov eax,ed_size + mov ed_pos,eax + call edit_box.draw_bg + call edit_box.draw_shift + call edit_box_key.sh_home_end + jmp edit_box.draw_cursor_text + +edit_box_key.ctrl_c: +; add memory area + mov ecx,ed_size + add ecx,3*4 + mcall SF_SYS_MISC,SSF_MEM_ALLOC +; building the clipboard slot header + xor ecx,ecx + mov [eax+4],ecx ; type 'text' + inc ecx + mov [eax+8],ecx ; cp866 text encoding + mov ecx,ed_size + add ecx,3*4 + mov [eax],ecx + sub ecx,3*4 +; copy data + mov esi,ed_text + push edi + mov edi,eax + add edi,3*4 + cld + rep movsb + pop edi +; put slot to the kernel clipboard + mov edx,eax + mov ecx,[edx] + push eax + mcall SF_CLIPBOARD,SSF_WRITE_CB + pop ecx +; remove unnecessary memory area + mcall SF_SYS_MISC,SSF_MEM_FREE +.exit: + jmp edit_box.editbox_exit + +edit_box_key.ctrl_v: + mcall SF_CLIPBOARD,SSF_GET_SLOT_COUNT +; no slots of clipboard ? + test eax,eax + jz .exit +; main list area not found ? + inc eax + test eax,eax + jz .exit + sub eax,2 + mov ecx,eax + mcall SF_CLIPBOARD,SSF_READ_CB +; main list area not found ? + inc eax + test eax,eax + jz .exit +; error ? + sub eax,2 + test eax,eax + jz .exit + inc eax +; check contents of container + mov ebx,[eax+4] +; check for text + test ebx,ebx + jnz .no_valid_text + mov ebx,[eax+8] +; check for cp866 + cmp bl,1 + jnz .no_valid_text + mov ecx,[eax] + sub ecx,3*4 + cmp ecx,ed_max + jb @f + mov ecx,ed_max +@@: + mov esi,eax + add esi,3*4 + mov ed_size,ecx + mov ed_pos,ecx + push eax edi + mov edi,ed_text + cld +@@: + lodsb + cmp al,0x0d ; EOS (end of string) + je .replace + cmp al,0x0a ; EOS (end of string) + jne .continue +.replace: + mov al,0x20 ; space +.continue: + stosb + dec ecx + jnz @b + pop edi eax +.no_valid_text: +; remove unnecessary memory area + mov ecx,eax + mcall SF_SYS_MISC,SSF_MEM_FREE +.exit: + jmp edit_box.draw_bg_cursor_text -macro use_editbox_mouse -{ ;========================================================== ;=== обработка мыши ======================================= ;========================================================== ;save for stdcall ebx,esi,edi,ebp +align 16 edit_box_mouse: pushad mov edi,[esp+36] test word ed_flags,ed_disabled jnz edit_box.editbox_exit -;debug + ;---------------------------------------------------------- ;--- получаем состояние кнопок мыши ----------------------- ;---------------------------------------------------------- - mcall 37,2 + mcall SF_MOUSE_GET,SSF_BUTTON ;---------------------------------------------------------- ;--- проверяем состояние ---------------------------------- ;---------------------------------------------------------- @@ -171,35 +496,91 @@ edit_box_mouse: ;---------------------------------------------------------- ;--- получаем координаты мыши относительно 0 т.е всей области экрана ;---------------------------------------------------------- -@@: mcall 37,1 +@@: + mcall SF_MOUSE_GET,SSF_WINDOW_POSITION ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Функция обработки мышки получение координат и проверка их + выделения ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -use_work_mouse +; Не удерживаем ли мы клавишу мышки, перемещая курсор? + test word ed_flags,ed_mouse_on + jne edit_box_mouse.mouse_wigwag +; проверяем, попадает ли курсор в edit box + mov ebx,ed_top + cmp ax,bx + jl edit_box_mouse._blur + add ebx,ed_height + cmp ax,bx + jg edit_box_mouse._blur + shr eax,16 + mov ebx,ed_left + cmp ax,bx + jl edit_box_mouse._blur + add ebx,ed_width + cmp ax,bx + jg edit_box_mouse._blur +; изменяем позицию курсора + push eax + mov ebp,ed_color + call edit_box.clear_cursor + pop eax +edit_box_mouse._mvpos: + xor edx,edx + sub eax,ed_left + div word ed_char_width + add eax,ed_offset + cmp eax,ed_size + jna edit_box_mouse._mshift + mov eax,ed_size +edit_box_mouse._mshift: +; секция обработки shift и выделения по shift + test word ed_flags,ed_shift_bac + je @f + mov ebp,ed_color + movzx ebx, word ed_shift_pos + push eax + call edit_box_key.sh_cl_ + and word ed_flags,ed_shift_bac_cl + pop eax +@@: + test word ed_flags,ed_mouse_on + jne @f + mov ed_shift_pos,ax + or word ed_flags,ed_mouse_on + mov ed_pos,eax + mov ebx,ed_mouse_variable + push edi + pop dword [ebx] + bts word ed_flags,1 + call edit_box.draw_bg + jmp edit_box_mouse.m_sh + +@@: cmp ax,ed_shift_pos + je edit_box.editbox_exit + mov ed_pos,eax + call edit_box.draw_bg + mov ebp,shift_color + movzx ebx, word ed_shift_pos + call edit_box_key.sh_cl_ + or word ed_flags,ed_mous_adn_b +edit_box_mouse.m_sh: + call edit_box.draw_text + call edit_box.draw_cursor +; процедура установки фокуса + jmp edit_box_mouse.drc + +edit_box_mouse._blur: + test word ed_flags,ed_always_focus + jne edit_box.editbox_exit + btr word ed_flags,1 ; если не в фокусе, выходим + jnc edit_box.editbox_exit + mov ebp,ed_color + call edit_box.clear_cursor +edit_box_mouse.drc: + call edit_box.draw_border + jmp edit_box.editbox_exit + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Общие функции обработки -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -use_general_func -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Функции для работы с key -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -use_key_func -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Функции для работы с mouse -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -use_mouse_func -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Bit mask from editbox -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -} - -;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -;ниже расположены функции которыми реализуется весь алгоритм -;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -;Макрос для вывода основных функций которые используются боксом -macro use_general_func -{ -;debug_func ;---------------------------------------------------------- ;--- процедура прорисовки выделенной части ---------------- ;---------------------------------------------------------- @@ -223,7 +604,7 @@ edit_box.draw_text: @@: test esi,esi jz @f - mov eax,4 + mov eax,SF_DRAW_TEXT mov ebx,ed_left add ebx,2 shl ebx,16 @@ -270,7 +651,7 @@ edit_box.draw_bg_eax: inc ecx shl ecx,16 add ecx,ed_height - mcall 13 + mcall SF_DRAW_RECT ret ;---------------------------------------------------------- @@ -314,7 +695,7 @@ edit_box.draw_curs: or ecx, eax add ecx, ed_height sub ecx, 3 - mcall 38 + mcall SF_DRAW_LINE ret ;---------------------------------------------------------- @@ -335,7 +716,7 @@ edit_box.draw_border: mov esi,ecx shl ecx,16 add ecx,esi - mcall 38 ; top + mcall SF_DRAW_LINE ; top mov esi,ecx inc ecx add ecx,ed_height @@ -410,6 +791,7 @@ edit_box.chk_d: popad ret +align 4 proc edit_box_set_text, edit:dword, text:dword pushad mov edi,[edit] @@ -433,10 +815,11 @@ proc edit_box_set_text, edit:dword, text:dword popad ret endp -} -macro use_key_func -{ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Функции для работы с key +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;Обработка Shift для снятия выделения неизвестной области edit_box_key.shift: call edit_box.draw_bg @@ -763,7 +1146,7 @@ edit_box_key.draw_rectangle: ;;;;;;;;;;;;;;;;;; edit_box_key.check_shift_ctrl_alt: pusha - mcall 66,3 + mcall SF_KEYBOARD,SSF_GET_CONTROL_KEYS test al,11b je @f or word ed_flags,ed_shift ;установим флаг Shift @@ -780,360 +1163,10 @@ edit_box_key.check_shift_ctrl_alt: @@: popad ret -} -macro use_key_no_process up,down,esc,enter,tab,numl,capsl,scrolll -{ -if up eq -else - cmp ah,177 - jz edit_box.editbox_exit -end if -if down eq -else - cmp ah,178 - jz edit_box.editbox_exit -end if -if esc eq -else - cmp ah,27 ;ESC - клавиша )) - jz edit_box.editbox_exit -end if -if enter eq -else - cmp ah,13 ;ENTER - клавиша )) - jz edit_box.editbox_exit -end if -if tab eq -else - cmp ah,9 ;TAB - клавиша )) - jz edit_box.editbox_exit -end if -if numl eq -else - cmp ah,4 ;Num Lock - клавиша )) - jz edit_box.editbox_exit -end if -if capsl eq -else - cmp ah,2 ;Caps Lock - клавиша )) - jz edit_box.editbox_exit -end if -if scrolll eq -else - cmp ah,1 ;Scroll Lock - клавиша )) - jz edit_box.editbox_exit -end if -} - -macro use_key_figures_only -{ - test word ed_flags,ed_figure_only ; только цифры? - jz @f - cmp ah,'0' - jb edit_box.editbox_exit - cmp ah,'9' - ja edit_box.editbox_exit -@@: -} - -macro are_key_shift_press -{ - test word ed_flags,ed_shift_on - je @f -; edx = ed_size, ecx = ed_pos - push eax - mov edx,ed_size - mov ecx, ed_pos - pusha -; clear input area - mov ebp,ed_color - movzx ebx, word ed_shift_pos - call edit_box_key.sh_cl_ - mov ebp,ed_size - call edit_box_key.clear_bg - popa - call edit_box_key.del_char - mov ebx,ed_size - sub bx,ed_shift_pos - mov ed_size,ebx - pop eax -@@: -} - -macro are_key_cur_end -{ - mov ecx,ed_size - mov edx, ed_max - test word ed_flags,ed_insert - jne @f - cmp ecx,edx - jae edit_box.editbox_exit -@@: mov ebx, ed_pos - cmp ebx,edx - jnl edit_box.editbox_exit - mov ecx,ed_size - push edi eax - mov ebp,edi - mov esi,ed_text - add esi,ecx - mov edi,esi - cmp ecx,ebx - je edit_box_key.In_k - test dword bp_flags,ed_insert - jne edit_box_key.ins_v - pusha - mov edi,ebp - mov ebp,ed_size - call edit_box_key.clear_bg - popa - sub ecx,ebx - inc edi - std - inc ecx -@@: - lodsb - stosb - loop @b -edit_box_key.In_k: - cld - pop eax - mov al,ah - stosb - pop edi - inc dword ed_size - inc dword ed_pos - call edit_box_key.draw_all2 - jmp edit_box_key.shift -} - -macro use_work_key -{ -edit_box_key.insert: - test word ed_flags,ed_insert - je @f - and word ed_flags,ed_insert_cl - jmp edit_box.editbox_exit - -@@: or word ed_flags,ed_insert - jmp edit_box.editbox_exit - -edit_box_key.ins_v: - dec dword bp_size - sub esi,ecx - add esi,ebx - mov edi,esi - pusha - mov edi,ebp - mov ebp,ed_pos - call edit_box_key.clear_bg - popa - jmp edit_box_key.In_k - -edit_box_key.delete: - mov edx,ed_size - mov ecx,ed_pos - cmp edx,ecx - jg edit_box_key.bac_del - test word ed_flags,ed_shift_on - jne edit_box_key.del_bac - popad - ret 4 - -edit_box_key.bac_del: - call edit_box_key.del_char - jmp edit_box_key.draw_all - -edit_box_key.backspace: - test word ed_flags,ed_shift_on - jne edit_box_key.delete - mov ecx,ed_pos - test ecx,ecx - jnz edit_box_key.del_bac - popad - ret 4 - -edit_box_key.del_bac: - mov edx,ed_size - cmp edx,ecx ;if ed_pos=ed_size - je @f - dec ecx - call edit_box_key.del_char -@@: test word ed_flags,ed_shift_on - jne edit_box_key.bac_del - dec dword ed_pos -edit_box_key.draw_all: - push edit_box_key.shift - test word ed_flags,ed_shift_on - je @f - movzx eax, word ed_shift_pos - mov ebx,ed_size - sub ebx,eax - mov ed_size,ebx - mov ebp,ed_color - call edit_box.clear_cursor - call edit_box.check_offset - jmp edit_box.draw_bg - -@@: dec dword ed_size -edit_box_key.draw_all2: - and word ed_flags,ed_shift_cl - mov ebp,ed_color - call edit_box.clear_cursor - call edit_box.check_offset - mov ebp,ed_size - jmp edit_box_key.clear_bg - -;--- нажата клавиша left --- -edit_box_key.left: - mov ebx,ed_pos - test ebx,ebx - jz edit_box_key.sh_st_of - or word ed_flags,ed_left_fl - call edit_box_key.sh_first_sh - dec dword ed_pos - call edit_box.draw_bg - call edit_box.draw_shift - call edit_box_key.sh_enable - jmp edit_box.draw_cursor_text - -;--- нажата клавиша right --- -edit_box_key.right: - mov ebx,ed_pos - cmp ebx,ed_size - je edit_box_key.sh_st_of - and word ed_flags,ed_right_fl - call edit_box_key.sh_first_sh - inc dword ed_pos - call edit_box.draw_bg - call edit_box.draw_shift - call edit_box_key.sh_enable - jmp edit_box.draw_cursor_text - -edit_box_key.home: - mov ebx,ed_pos - test ebx,ebx - jz edit_box_key.sh_st_of - call edit_box_key.sh_first_sh - xor eax,eax - mov ed_pos,eax - call edit_box.draw_bg - call edit_box.draw_shift - call edit_box_key.sh_home_end - jmp edit_box.draw_cursor_text - -;--- нажата клавиша end --- -edit_box_key.end: - mov ebx,ed_pos - cmp ebx,ed_size - je edit_box_key.sh_st_of - call edit_box_key.sh_first_sh - mov eax,ed_size - mov ed_pos,eax - call edit_box.draw_bg - call edit_box.draw_shift - call edit_box_key.sh_home_end - jmp edit_box.draw_cursor_text - -edit_box_key.ctrl_c: -; add memory area - mov ecx,ed_size - add ecx,3*4 - mcall 68,12 -; building the clipboard slot header - xor ecx,ecx - mov [eax+4],ecx ; type 'text' - inc ecx - mov [eax+8],ecx ; cp866 text encoding - mov ecx,ed_size - add ecx,3*4 - mov [eax],ecx - sub ecx,3*4 -; copy data - mov esi,ed_text - push edi - mov edi,eax - add edi,3*4 - cld - rep movsb - pop edi -; put slot to the kernel clipboard - mov edx,eax - mov ecx,[edx] - push eax - mcall 54,2 - pop ecx -; remove unnecessary memory area - mcall 68,13 -.exit: - jmp edit_box.editbox_exit - -edit_box_key.ctrl_v: - mcall 54,0 -; no slots of clipboard ? - test eax,eax - jz .exit -; main list area not found ? - inc eax - test eax,eax - jz .exit - sub eax,2 - mov ecx,eax - mcall 54,1 -; main list area not found ? - inc eax - test eax,eax - jz .exit -; error ? - sub eax,2 - test eax,eax - jz .exit - inc eax -; check contents of container - mov ebx,[eax+4] -; check for text - test ebx,ebx - jnz .no_valid_text - mov ebx,[eax+8] -; check for cp866 - cmp bl,1 - jnz .no_valid_text - mov ecx,[eax] - sub ecx,3*4 - cmp ecx,ed_max - jb @f - mov ecx,ed_max -@@: - mov esi,eax - add esi,3*4 - mov ed_size,ecx - mov ed_pos,ecx - push eax edi - mov edi,ed_text - cld -@@: - lodsb - cmp al,0x0d ; EOS (end of string) - je .replace - cmp al,0x0a ; EOS (end of string) - jne .continue -.replace: - mov al,0x20 ; space -.continue: - stosb - dec ecx - jnz @b - pop edi eax -.no_valid_text: -; remove unnecessary memory area - mov ecx,eax - mcall 68,13 -.exit: - jmp edit_box.draw_bg_cursor_text -} - -macro use_mouse_func -{ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;Функции для работы с mouse +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; edit_box_mouse.mouse_wigwag: push eax call edit_box.draw_bg @@ -1214,132 +1247,6 @@ edit_box_mouse.mright: call edit_box_key.sh_cl_ pop eax jmp edit_box_mouse.mdraw -} -macro use_work_mouse -; Не удерживаем ли мы клавишу мышки, перемещая курсор? -{ - test word ed_flags,ed_mouse_on - jne edit_box_mouse.mouse_wigwag -; проверяем, попадает ли курсор в edit box - mov ebx,ed_top - cmp ax,bx - jl edit_box_mouse._blur - add ebx,ed_height - cmp ax,bx - jg edit_box_mouse._blur - shr eax,16 - mov ebx,ed_left - cmp ax,bx - jl edit_box_mouse._blur - add ebx,ed_width - cmp ax,bx - jg edit_box_mouse._blur -; изменяем позицию курсора - push eax - mov ebp,ed_color - call edit_box.clear_cursor - pop eax -edit_box_mouse._mvpos: - xor edx,edx - sub eax,ed_left - div word ed_char_width - add eax,ed_offset - cmp eax,ed_size - jna edit_box_mouse._mshift - mov eax,ed_size -edit_box_mouse._mshift: -; секция обработки shift и выделения по shift - test word ed_flags,ed_shift_bac - je @f - mov ebp,ed_color - movzx ebx, word ed_shift_pos - push eax - call edit_box_key.sh_cl_ - and word ed_flags,ed_shift_bac_cl - pop eax -@@: - test word ed_flags,ed_mouse_on - jne @f - mov ed_shift_pos,ax - or word ed_flags,ed_mouse_on - mov ed_pos,eax - mov ebx,ed_mouse_variable - push edi - pop dword [ebx] - bts word ed_flags,1 - call edit_box.draw_bg - jmp edit_box_mouse.m_sh - -@@: cmp ax,ed_shift_pos - je edit_box.editbox_exit - mov ed_pos,eax - call edit_box.draw_bg - mov ebp,shift_color - movzx ebx, word ed_shift_pos - call edit_box_key.sh_cl_ - or word ed_flags,ed_mous_adn_b -edit_box_mouse.m_sh: - call edit_box.draw_text - call edit_box.draw_cursor -; процедура установки фокуса - jmp edit_box_mouse.drc - -edit_box_mouse._blur: - test word ed_flags,ed_always_focus - jne edit_box.editbox_exit - btr word ed_flags,1 ; если не в фокусе, выходим - jnc edit_box.editbox_exit - mov ebp,ed_color - call edit_box.clear_cursor -edit_box_mouse.drc: - call edit_box.draw_border - jmp edit_box.editbox_exit -} - -macro debug -{ - ;----------- отладка - pushad - mov eax,dword [ed_buffer.2] - mov edi,ed_buffer.3 - call .str - ;рисование фона - mov eax,13 - mov ebx,178*65536+70 - mov ecx,28*65536+10 - xor edx,edx - int 0x40 - ;вывод значения на экран - mov eax,4 - mov ebx,180*65536+30 - mov ecx,0x10DDBBCC - mov edx,ed_buffer.3 - mov esi,8 - int 0x40 - popad - ;----------- отладка -} -macro debug_func -{ -.str: - mov ecx,0x0a ;задается система счисления, изменяются регистры ebx,eax,ecx,edx, входные параметры eax - число - ;перевод числа в ASCII строку, входные данные ecx=система счисления, edi адрес куда будем записывать строку, причем конец переменной - cmp eax,ecx ;сравнить, если в eax меньше, чем в ecx, то перейти на @@-1 т.е. на pop eax - jb @f - xor edx,edx ;очистить edx - div ecx ;разделить - остаток в edx - push edx ;положить в стек - ;dec edi ;смещение необходимое для записи с конца строки - call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента, пока в eax не станет меньше чем в ecx - pop eax - @@: ;cmp al,10 ;проверить не меньше ли значение в al, чем 10 (для системы счисления 10 данная команда - лишная)) - ;sbb al,$69 ;- честно, данная инструкция меня заставляет задуматься т.е. я не знаю как это работает - ;das ;после данной команды как бы происходит уменьшение al на 66h (в книге написано другое) - or al,0x30 ;данная команда короче, чем две выше - stosb ;записать элемент из регистра al в ячейку памяти es:edi - - ret ;вернуться очень интересный ход, т.к. пока в стеке хранится кол-во вызовов, то столько раз мы и будем вызываться -} ed_struc_size=84