modify macros and optimization
git-svn-id: svn://kolibrios.org@483 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
1 parent
9104b5cebc
commit
b192d9260a
5 files changed
+680
-609
No files matched your search
@@ -2,7 +2,7 @@
|
||||
;;;;;;;;;;;;;;;;;;
|
||||
include 'editbox.mac' ;макрос который должен облегчить жизнь :) специально для editbox
|
||||
;;;;;;;;;;;;;;;;;;
|
||||
macro use_edit_box structure_of_potock,scr_h,scr_w
|
||||
macro use_edit_box procinfo,scr_h,scr_w
|
||||
{
|
||||
edit_box:
|
||||
ed_width equ [edi] ;ширина компонента
|
||||
@@ -46,252 +46,28 @@ pusha
|
||||
@@:
|
||||
call .draw_text
|
||||
edit_ex
|
||||
|
||||
;debug_func
|
||||
;----------------------------------------------------------
|
||||
;--- процедура прорисовки выделеной части -----------------
|
||||
;----------------------------------------------------------
|
||||
.draw_shift:
|
||||
test word ed_flags,ed_shift_bac ;установка флага, выделенной области
|
||||
jz @f
|
||||
mov ebp,shift_color
|
||||
mov ebx,dword ed_shift_pos
|
||||
call .sh_cl_
|
||||
@@: ret
|
||||
;----------------------------------------------------------
|
||||
;--- процедура прорисовки текста --------------------------
|
||||
;----------------------------------------------------------
|
||||
.draw_text:
|
||||
;--- вычисляем, сколько помещается символов ---
|
||||
;--- чтобы мусор не рисовать ---
|
||||
call .get_n
|
||||
mov esi,ed_size
|
||||
mov ebx,ed_offset
|
||||
sub esi,ebx
|
||||
cmp eax,esi
|
||||
jae @F
|
||||
mov esi,eax ;чтобы не выходить за пределы экрана
|
||||
;--- рисуем текст ---
|
||||
@@: mov eax,4
|
||||
mov ebx,ed_left
|
||||
mov edx,ed_offset
|
||||
add ebx,2
|
||||
shl ebx,16
|
||||
mov bx,ed_top
|
||||
add ebx,4
|
||||
mov ecx,ed_text_color
|
||||
add edx,ed_text
|
||||
int 0x40
|
||||
ret
|
||||
;----------------------------------------------------------
|
||||
;--- процедура прорисовки фона ----------------------------
|
||||
;входные данные
|
||||
;eax
|
||||
;edx - color
|
||||
;----------------------------------------------------------
|
||||
;вход только цвет edx
|
||||
.draw_bg:
|
||||
mov ebx,ed_left
|
||||
add ebx,1
|
||||
shl ebx,16
|
||||
mov bx,ed_width
|
||||
sub ebx,1
|
||||
mov edx,ed_color
|
||||
.draw_bg_eax:
|
||||
mov ecx,ed_top
|
||||
mov eax,13
|
||||
add ecx,1
|
||||
shl ecx,16
|
||||
mov cx,ed_height
|
||||
dec ecx
|
||||
int 0x40
|
||||
ret
|
||||
|
||||
;----------------------------------------------------------
|
||||
;--- процедура получения количества символов в текущей щирине компонента --------------
|
||||
;----------------------------------------------------------
|
||||
.get_n:
|
||||
mov eax,ed_width ;получем ширину компонента
|
||||
xor edx,edx ;результат распологается в паре edx:eax в eax - остаток
|
||||
sub eax,4 ;вычтим 4
|
||||
mov ebx,6 ;загрузми делитель
|
||||
div ebx ;размделим на 6
|
||||
ret
|
||||
;----------------------------------------------------------
|
||||
;--- процедура рисования курсора --------------------------
|
||||
;----------------------------------------------------------
|
||||
;входные ebp- цвет
|
||||
.clear_cursor:
|
||||
mov edx,ebp
|
||||
mov ebx,cl_curs_x
|
||||
mov ecx,cl_curs_y
|
||||
jmp .draw_curs
|
||||
.draw_cursor:
|
||||
mov edx,ed_text_color
|
||||
mov ebx,ed_pos
|
||||
mov ecx,ed_offset
|
||||
sub ebx,ecx
|
||||
|
||||
lea ebx,[ebx*2+ebx]
|
||||
shl ebx,1
|
||||
;imul ebx,6
|
||||
add bx,ed_left
|
||||
mov ecx,ed_top
|
||||
inc ebx
|
||||
add ecx,2
|
||||
mov ebp,ebx
|
||||
shl ebx,16
|
||||
mov bx,bp
|
||||
mov ebp,ecx
|
||||
|
||||
shl ecx,16
|
||||
mov cx,bp
|
||||
add cx,ed_height-4
|
||||
|
||||
mov cl_curs_x,ebx
|
||||
mov cl_curs_y,ecx
|
||||
.draw_curs:
|
||||
mov eax,38
|
||||
int 0x40
|
||||
ret
|
||||
;----------------------------------------------------------
|
||||
;--- процедура рисования рамки ----------------------------
|
||||
;----------------------------------------------------------
|
||||
.draw_border:
|
||||
;--- цвет рамки ---
|
||||
test word ed_flags,ed_focus
|
||||
mov edx,ed_focus_border_color
|
||||
jne @f
|
||||
mov edx,ed_blur_border_color
|
||||
@@:
|
||||
;--- сверху ---
|
||||
mov eax,38
|
||||
mov ebx,ed_left
|
||||
mov ecx,ebx
|
||||
shl ebx,16
|
||||
mov bx,cx
|
||||
add bx,ed_width
|
||||
mov ecx, ed_top
|
||||
mov esi,ecx
|
||||
shl ecx,16
|
||||
mov cx,si
|
||||
int 0x40
|
||||
|
||||
;--- снизу ---
|
||||
mov esi,ecx
|
||||
add ecx,ed_height
|
||||
mov ebp,ecx
|
||||
shl ecx,16
|
||||
mov cx,bp
|
||||
int 0x40
|
||||
|
||||
;--- слева ---
|
||||
mov cx,si
|
||||
mov ebp,ebx
|
||||
sub bx,ed_width
|
||||
int 0x40
|
||||
|
||||
;--- справа ---
|
||||
mov ebx,ebp
|
||||
shl ebx,16
|
||||
mov bx,bp
|
||||
int 0x40
|
||||
ret
|
||||
;----------------------------------------------------------
|
||||
;--- проверка, зашел ли курсор за границы и, если надо, ---
|
||||
;--- изменяем смещение ------------------------------------
|
||||
;--- eax = -1, если не изменилось или eax = 0, если
|
||||
; изменилось
|
||||
;----------------------------------------------------------
|
||||
.check_offset:
|
||||
pusha
|
||||
mov ecx,ed_pos
|
||||
mov ebx,ed_offset
|
||||
cmp ebx,ecx
|
||||
ja .sub_8
|
||||
|
||||
push ebx
|
||||
call .get_n ;получим кол-во символов в паре регистров edx:eax
|
||||
pop ebx
|
||||
mov edx,ebx
|
||||
add edx,eax ;ed_offset+width editbox
|
||||
inc edx ;необходимо для номального положения курсора в крайней левой позиции
|
||||
cmp edx,ecx
|
||||
ja @f
|
||||
|
||||
mov edx,ed_size
|
||||
cmp edx,ecx
|
||||
je .add_end
|
||||
|
||||
sub edx,ecx
|
||||
cmp edx,8
|
||||
jbe .add_8
|
||||
add ebx,8
|
||||
jmp .chk_d
|
||||
|
||||
.sub_8: cmp ecx,0
|
||||
je .sub_min
|
||||
cmp ebx,8
|
||||
jbe .sub_min
|
||||
sub ebx,8 ;ebx=ed_offset
|
||||
jmp .chk_d
|
||||
.sub_min:
|
||||
xor ebx,ebx
|
||||
jmp .chk_d
|
||||
|
||||
.add_end:sub edx,eax
|
||||
mov ebx,edx
|
||||
jmp .chk_d
|
||||
.add_8: add ebx,edx
|
||||
.chk_d: mov ed_offset,ebx
|
||||
call .draw_bg
|
||||
and word ed_flags,ed_offset_cl
|
||||
edit_ex
|
||||
@@:
|
||||
or word ed_flags,ed_offset_fl
|
||||
edit_ex
|
||||
;==========================================================
|
||||
;=== обработка клавиатуры =================================
|
||||
;==========================================================
|
||||
.key:
|
||||
pusha
|
||||
test word ed_flags,ed_focus ; если не в фокусе, выходим
|
||||
je @b
|
||||
;Проверка на нажаты shift
|
||||
je .no_figure
|
||||
;Проверка нажат shift ?
|
||||
call .check_shift
|
||||
;----------------------------------------------------------
|
||||
;--- проверяем, что нажато --------------------------------
|
||||
;----------------------------------------------------------
|
||||
cmp ah,8
|
||||
jz .backspace
|
||||
cmp ah,0xb6
|
||||
jz .delete
|
||||
cmp ah,176
|
||||
jz .left
|
||||
cmp ah,179
|
||||
jz .right
|
||||
cmp ah,180
|
||||
jz .home
|
||||
cmp ah,181
|
||||
jz .end
|
||||
cmp ah,185 ;insert
|
||||
jz .insert
|
||||
use_key_process backspase,delete,left,right,home,end,insert
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;Заглушка на обработку клавиш вверх и вниз
|
||||
;Заглушка на обработку клавиш вверх и вниз т.е. при обнаружении этих кодов происходит выход из обработчика
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
cmp ah,177
|
||||
jz .no_figure
|
||||
cmp ah,178
|
||||
jz .no_figure
|
||||
cmp ah,27 ;ESC - клавиша ))
|
||||
jz .no_figure
|
||||
use_key_no_process up,down,esc
|
||||
;--- нажата другая клавиша ---
|
||||
test word ed_flags,ed_figure_only ; только цифры ?
|
||||
jz @f
|
||||
cmp ah,'0'
|
||||
jb .no_figure
|
||||
cmp ah,'9'
|
||||
ja .no_figure
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе если такойнеобходимости нет нужно закоментировать макрос
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
use_key_figures_only
|
||||
;проверка на shift
|
||||
@@: test word ed_flags,ed_shift_on
|
||||
je @f
|
||||
@@ -301,8 +77,8 @@ pusha
|
||||
mov ecx,ed_pos
|
||||
pusha
|
||||
;clear
|
||||
mov ebp,edx ;ed_size
|
||||
call .clear_bg
|
||||
; mov ebp,edx ;ed_size
|
||||
; call .clear_bg
|
||||
mov ebp,ed_color
|
||||
mov ebx,dword ed_shift_pos
|
||||
call .sh_cl_
|
||||
@@ -479,349 +255,6 @@ edit_ex
|
||||
mov ed_pos,eax
|
||||
call .sh_home_end
|
||||
jmp .draw_cursor_text
|
||||
;Обработка Shift для снятия выделения неизвестной области
|
||||
.shift: ;;;;;;;SHIFT
|
||||
test word ed_flags,ed_shift
|
||||
je .f_exit
|
||||
|
||||
@@: mov ebp,shift_color
|
||||
or word ed_flags,ed_shift_bac ;установка флага, выделенной области
|
||||
mov ebx,dword ed_shift_pos
|
||||
call .sh_cl_
|
||||
jmp .draw_cursor_text
|
||||
;;;;;;;;;;;;;;;;;;;;;
|
||||
.f_exit:call .check_offset
|
||||
and word ed_flags,ed_shift_cl
|
||||
call .enable_null
|
||||
jmp .draw_cursor_text
|
||||
.sh_cl_:
|
||||
;;;;;;SHIFT end
|
||||
;обработка очистки, при левом - правом движении выделения
|
||||
;для обработки снятия выделения
|
||||
;входные параметры ebp=color ebx=ed_shift_pos
|
||||
mov eax,dword ed_pos
|
||||
cmp eax,ebx
|
||||
|
||||
jae .sh_n
|
||||
push eax ;меньшее в eax
|
||||
push ebx ;большее
|
||||
jmp .sh_n1
|
||||
;если иначе
|
||||
.sh_n: push ebx
|
||||
push eax
|
||||
.sh_n1:
|
||||
call .check_offset
|
||||
call .get_n
|
||||
mov edx,eax ;size of ed_box
|
||||
mov ecx,ed_offset
|
||||
add eax,ecx ;eax = w_off= ed_offset+width
|
||||
mov edx,eax ;save
|
||||
pop ebx ;большее
|
||||
pop eax ;меньшее
|
||||
|
||||
cmp eax,ecx ;сравнение с меньшего с offset.
|
||||
jae .f_f ;если больше
|
||||
xor eax,eax
|
||||
cmp edx,ebx ;cравним размер w_off с большим
|
||||
jb @f
|
||||
sub ebx,ecx
|
||||
jmp .nxt_f
|
||||
@@: mov ebx,edx
|
||||
sub ebx,ecx
|
||||
jmp .nxt_f
|
||||
.f_f:
|
||||
sub eax,ecx
|
||||
cmp edx,ebx ;cравним размер w_off с большим
|
||||
jle @f
|
||||
sub ebx,ecx
|
||||
sub ebx,eax
|
||||
jmp .nxt_f
|
||||
@@:
|
||||
mov ebx,edx
|
||||
sub ebx,ecx
|
||||
sub ebx,eax
|
||||
.nxt_f:
|
||||
mov edx,ebx
|
||||
lea ebx,[eax*2+eax]
|
||||
shl ebx,1
|
||||
add ebx,ed_left
|
||||
inc ebx
|
||||
shl ebx,16
|
||||
lea ecx,[edx*2+edx]
|
||||
shl ecx,1
|
||||
mov bx,cx
|
||||
inc ebx
|
||||
mov edx,ebp;shift_color
|
||||
|
||||
call .draw_bg_eax
|
||||
@@: call .enable_null
|
||||
ret
|
||||
;;;;;;;;;;;;;;;;;;;;;
|
||||
;Установка- снятие выделения в один символ
|
||||
;;;;;;;;;;;;;;;;;;;;;
|
||||
.drw_sim:
|
||||
mov eax,dword ed_pos
|
||||
call .draw_rectangle ;нарисовать прямоугольник с заданным цветом
|
||||
jmp @b
|
||||
;;;;;;;;;;;;;;;;;;;;;
|
||||
;Фукция установки выделения при движения влево и вправо и нажатии shift
|
||||
;Логика:
|
||||
;;;;;;;;;;
|
||||
.draw_wigwag:
|
||||
;функция установки переменных
|
||||
mov ebp,shift_color
|
||||
call .clear_cursor
|
||||
|
||||
or word ed_flags,ed_shift_bac ;установка флага, выделенной области
|
||||
mov ebp,shift_color
|
||||
mov eax,dword ed_pos
|
||||
test word ed_flags,ed_left_fl
|
||||
jz .low
|
||||
jmp @f
|
||||
;;;;;;;;;;
|
||||
;Фукция удаления выделения при движения влево и вправо и нажатии shift
|
||||
;Логика:
|
||||
;;;;;;;;;;
|
||||
.draw_wigwag_cl:
|
||||
;функция установки переменных
|
||||
mov ebp,ed_color
|
||||
call .clear_cursor
|
||||
|
||||
mov ebp,ed_color
|
||||
mov eax,dword ed_pos
|
||||
test word ed_flags,ed_left_fl
|
||||
jz .low
|
||||
@@: call .draw_rectangle ;нарисовать прямоугольник закрашиваемой области
|
||||
ret
|
||||
.low: dec eax
|
||||
jmp @b
|
||||
;входной параметр ebx - ed_pos
|
||||
.sh_first_sh:
|
||||
test word ed_flags,ed_shift
|
||||
je @f
|
||||
mov dword ed_shift_pos_old,ebx
|
||||
test word ed_flags,ed_shift_on
|
||||
jne @f
|
||||
mov dword ed_shift_pos,ebx
|
||||
or word ed_flags,ed_shift_on
|
||||
@@: ret
|
||||
;Обработка крайних положений в editbox при нажатом shift
|
||||
;производит снятие выделение, если нет shift
|
||||
;иначе вообще выходит
|
||||
.sh_st_of:
|
||||
test word ed_flags,ed_shift
|
||||
jne @f
|
||||
test word ed_flags,ed_shift_bac
|
||||
je @f
|
||||
mov ebp,ed_color
|
||||
mov ebx,dword ed_shift_pos
|
||||
call .sh_cl_ ;очистка выделеного фрагмента
|
||||
and word ed_flags,ed_shift_cl ; очистка от того что убрали выделение
|
||||
jmp .draw_cursor_text
|
||||
@@:
|
||||
and word ed_flags,ed_shift_off
|
||||
edit_ex
|
||||
;проверка состояния shift был ли он нажат раньше?
|
||||
.sh_enable:
|
||||
test word ed_flags,ed_shift
|
||||
jne .sh_ext_en ;нарисовать закрашеный прямоугольник
|
||||
|
||||
test word ed_flags,ed_shift_bac
|
||||
je @f
|
||||
call .check_offset
|
||||
|
||||
mov ebp,ed_color
|
||||
mov ebx,dword ed_shift_pos
|
||||
call .sh_cl_ ;очистка выделеного фрагмента
|
||||
call .draw_wigwag_cl
|
||||
and word ed_flags,ed_shift_cl ; 1вар не нужно
|
||||
ret
|
||||
|
||||
@@: mov ebp,ed_color
|
||||
call .clear_cursor
|
||||
call .check_offset
|
||||
ret
|
||||
.sh_ext_en:
|
||||
call .check_offset
|
||||
test word ed_flags,ed_offset_fl
|
||||
je @f
|
||||
;Рисование закрашеных прямоугольников и очистка их
|
||||
mov eax,dword ed_shift_pos
|
||||
mov ebx,dword ed_pos
|
||||
mov ecx,dword ed_shift_pos_old
|
||||
;проверка и рисование закрашеных областей
|
||||
cmp eax,ecx
|
||||
je .1_shem
|
||||
jb .smaller
|
||||
cmp ecx,ebx
|
||||
ja .1_shem
|
||||
call .draw_wigwag_cl ;clear
|
||||
jmp .sh_e_end
|
||||
.smaller:
|
||||
cmp ecx,ebx
|
||||
jb .1_shem
|
||||
call .draw_wigwag_cl ;clear
|
||||
jmp .sh_e_end
|
||||
;alike =
|
||||
.1_shem: call .draw_wigwag
|
||||
.sh_e_end: and word ed_flags,ed_shift_off
|
||||
ret
|
||||
@@: mov ebp,shift_color
|
||||
mov ebx,dword ed_shift_pos
|
||||
call .sh_cl_
|
||||
jmp .sh_e_end
|
||||
;функция для обработки shift при нажатии home and end
|
||||
.sh_home_end:
|
||||
mov ebp,ed_color
|
||||
call .clear_cursor
|
||||
test word ed_flags,ed_shift_bac
|
||||
je @f
|
||||
mov ebp,ed_color
|
||||
mov ebx,dword ed_shift_pos_old
|
||||
call .sh_cl_
|
||||
|
||||
@@: test word ed_flags,ed_shift
|
||||
je .sh_exit_ ;выйти
|
||||
mov ebp,shift_color
|
||||
mov ebx,dword ed_shift_pos
|
||||
call .sh_cl_
|
||||
or word ed_flags,ed_shift_bac ;установка флага, выделенной области
|
||||
jmp .sh_e_end
|
||||
.sh_exit_: call .check_offset
|
||||
ret
|
||||
;функция внесения 0 по адресу ed_size+1
|
||||
.enable_null:
|
||||
pusha
|
||||
mov eax,ed_size
|
||||
mov ebx,ed_text
|
||||
test eax,eax
|
||||
add eax,ebx
|
||||
jne @f
|
||||
inc eax
|
||||
@@: xor ebx,ebx
|
||||
mov [eax],bl
|
||||
edit_ex
|
||||
;- удаление символа
|
||||
;Входные данные edx=ed_size;ecx=ed_pos
|
||||
.del_char:
|
||||
mov esi,ed_text
|
||||
test word ed_flags,ed_shift_on
|
||||
je @f
|
||||
mov eax,dword ed_shift_pos
|
||||
mov ebx,esi
|
||||
cmp eax,ecx
|
||||
jae .dh_n
|
||||
|
||||
mov ed_pos,eax ;что бы не было убегания курсора
|
||||
mov ebp,ecx
|
||||
sub ebp,eax
|
||||
add ebx,eax ;eax меньше
|
||||
sub edx,ecx
|
||||
add esi,ecx
|
||||
|
||||
mov dword ed_shift_pos,ebp
|
||||
jmp .del_ch_sh
|
||||
;если иначе
|
||||
.dh_n:
|
||||
mov ebp,eax
|
||||
sub ebp,ecx
|
||||
add ebx,ecx
|
||||
sub edx,eax
|
||||
add esi,eax
|
||||
mov dword ed_shift_pos,ebp
|
||||
jmp .del_ch_sh
|
||||
|
||||
@@: add esi,ecx ;указатель + смещение к реальному буфферу
|
||||
mov ebx,esi
|
||||
inc esi
|
||||
cld
|
||||
|
||||
sub edx,ecx
|
||||
.del_ch_sh:
|
||||
|
||||
push edi
|
||||
mov edi,ebx
|
||||
@@:
|
||||
lodsb
|
||||
stosb
|
||||
dec edx
|
||||
jns @b
|
||||
|
||||
pop edi
|
||||
ret
|
||||
;вычислить закрашиваемую область
|
||||
;соглашение в ebp - передается ed_size
|
||||
.clear_bg:
|
||||
call .get_n ;получить размер в символах ширины компонента
|
||||
push eax
|
||||
mov ebx,ed_offset
|
||||
add eax,ebx ;eax = w_off= ed_offset+width
|
||||
mov ebx,ebp ;ed_size
|
||||
|
||||
cmp eax,ebx
|
||||
jb @f
|
||||
mov eax,ed_pos
|
||||
sub ebx,eax
|
||||
mov ecx,ed_offset
|
||||
sub eax,ecx
|
||||
jmp .nxt
|
||||
@@: mov ebx,ed_pos
|
||||
push ebx
|
||||
sub eax,ebx
|
||||
mov ebx,eax ;It is don't optimal
|
||||
|
||||
pop eax ;ed_pos
|
||||
mov ecx,ed_offset
|
||||
sub eax,ecx
|
||||
.nxt:
|
||||
mov ebp,eax ;проверка на выход закрашиваемой области за пределы длины
|
||||
add ebp,ebx
|
||||
pop edx
|
||||
cmp ebp,edx
|
||||
je @f
|
||||
inc ebx
|
||||
|
||||
@@: mov edx,ebx
|
||||
lea ebx,[eax*2+eax]
|
||||
shl ebx,1
|
||||
add ebx,ed_left
|
||||
inc ebx
|
||||
shl ebx,16
|
||||
lea ecx,[edx*2+edx]
|
||||
shl ecx,1
|
||||
mov bx,cx
|
||||
mov edx,ed_color
|
||||
call .draw_bg_eax
|
||||
ret
|
||||
;;;;;;;;;;;;;;;;;;;
|
||||
;;; Обработка примитивов
|
||||
;;;;;;;;;;;;;;;;;;;;
|
||||
;Нарисовать прямоугольник, цвет передается в ebp
|
||||
;входные параметры:
|
||||
;eax=dword ed_pos
|
||||
;ebp=-цвет ed_color or shift_color
|
||||
.draw_rectangle:
|
||||
mov ecx,dword ed_offset
|
||||
sub eax,ecx
|
||||
lea ebx,[eax*2+eax]
|
||||
shl ebx,1
|
||||
inc ebx
|
||||
add ebx,ed_left
|
||||
shl ebx,16
|
||||
mov bx,6
|
||||
mov edx,ebp
|
||||
call .draw_bg_eax
|
||||
ret
|
||||
;;;;;;;;;;;;;;;;;;
|
||||
;;Проверка нажат ли shift
|
||||
;;;;;;;;;;;;;;;;;;
|
||||
.check_shift:
|
||||
pusha ;сохраним все регистры
|
||||
mcall 66,3,1
|
||||
test al,0x03
|
||||
je @f
|
||||
or word ed_flags,ed_shift ;установим флаг
|
||||
@@:edit_ex
|
||||
;==========================================================
|
||||
;=== обработка мыши =======================================
|
||||
;==========================================================
|
||||
@@ -858,7 +291,7 @@ edit_ex
|
||||
;----------------------------------------------------------
|
||||
;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны?
|
||||
;----------------------------------------------------------
|
||||
mov ecx,structure_of_potock
|
||||
mov ecx,procinfo
|
||||
test word ed_flags,ed_mouse_on
|
||||
jne .mouse_wigwag
|
||||
;----------------------------------------------------------
|
||||
@@ -897,7 +330,7 @@ end if
|
||||
call .clear_cursor
|
||||
pop eax
|
||||
._mvpos:
|
||||
mov ecx,structure_of_potock
|
||||
mov ecx,procinfo
|
||||
mov ebx,dword [ecx+34]
|
||||
xor edx,edx
|
||||
sub eax,ed_left
|
||||
@@ -961,6 +394,14 @@ end if
|
||||
.mouse_ex:
|
||||
|
||||
edit_ex
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;Общие функции обработки
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
use_general_func
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;Функции для работы с key
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
use_key_func
|
||||
;----------------------------------------------------------
|
||||
;--- процедура размывания фокуса --------------------------
|
||||
;----------------------------------------------------------
|
||||
@@ -983,7 +424,7 @@ edit_ex
|
||||
;;;;;;;;;;;;;;;;;;
|
||||
;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox
|
||||
;;;;;;;;;;;;;;;;;;
|
||||
mov ecx,structure_of_potock
|
||||
mov ecx,procinfo
|
||||
mov ebx,dword [ecx+34]
|
||||
add ebx,ed_left
|
||||
if scr_w eq
|
||||
@@ -1049,7 +490,7 @@ end if
|
||||
; ret
|
||||
.mleft:
|
||||
mov eax,ed_pos
|
||||
cmp eax,0
|
||||
cmp eax,0
|
||||
jbe .mwigvag
|
||||
dec eax
|
||||
call .check_offset
|
||||
@@ -1095,11 +536,11 @@ ed_mouse_on = 100000000b
|
||||
ed_mous_adn_b= 100011000b
|
||||
ed_mouse_on_off=1111111011111111b
|
||||
ed_height=14 ; высота
|
||||
macro draw_edit_boxes start,_end,use_f9,structure_of_potock
|
||||
macro draw_edit_boxes start,_end,use_f9,procinfo
|
||||
{
|
||||
if use_f9 eq
|
||||
else
|
||||
mcall 9,structure_of_potock,-1
|
||||
mcall 9,procinfo,-1
|
||||
end if
|
||||
mov edi,start
|
||||
mov ecx,((_end-start)/ed_struc_size)
|
||||
@@ -1179,11 +620,11 @@ macro edit_boxes_set_sys_color start,end,color_table
|
||||
loop @b
|
||||
}
|
||||
|
||||
macro draw_edit_box ed_ptr,use_f9,structure_of_potock
|
||||
macro draw_edit_box ed_ptr,use_f9,procinfo
|
||||
{
|
||||
if use_f9 eq
|
||||
else
|
||||
mcall 9,structure_of_potock,-1
|
||||
mcall 9,procinfo,-1
|
||||
end if
|
||||
mov edi,ed_ptr
|
||||
call edit_box.draw
|
||||
@@ -1203,10 +644,10 @@ macro key_edit_box ed_ptr
|
||||
macro default_box ed_ptr
|
||||
{
|
||||
pusha
|
||||
; xor eax,eax
|
||||
; mov ed_shift_pos,eax
|
||||
; mov ed_shift_pos_old,eax
|
||||
and word ed_flags,ed_shift_cl
|
||||
; mov ed_offset,eax
|
||||
; xor eax,eax
|
||||
; mov ed_shift_pos,eax
|
||||
; mov ed_shift_pos_old,eax
|
||||
and word ed_flags,ed_shift_cl
|
||||
; mov ed_offset,eax
|
||||
popa
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
╧юёфхфэр ьюфшЇшърЎш
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;;;╤ЄЁєъЄєЁэюх юяшёрэшх тючьюцэюёЄш ъюьяюхэЄр ш ьюфхыхщ хую шёяюы№чютрэш .
|
||||
;;;╤ЄЁєъЄєЁэюх юяшёрэшх тючьюцэюёЄш ъюьяюэхЄр ш ьюфхыхщ хую шёяюы№чютрэш .
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
═ряш°шЄх т шёїюфэюь ъюфх ётюхщ яЁюуЁрьь√ use_edit_box,
|
||||
¤Єю тёЄртшЄ эхюсїюфшь√х яЁюЎхфєЁ√ т ъюф тр°хщ яЁюуЁрьь√.
|
||||
@@ -43,7 +43,7 @@ some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text
|
||||
***********
|
||||
use_edit_box
|
||||
фрээ√щ ьръЁюё тёЄрты хЄ юс∙шщ ъюф editbox
|
||||
structure_of_potock - єърчрЄхы№ эр шэЇюЁьрЎшюээє■ ёЄЁъЄєЁє 9 ЇєэЎшш - юс чрЄхы№э√щ ярЁрьхЄЁ
|
||||
procinfo - єърчрЄхы№ эр шэЇюЁьрЎшюээє■ ёЄЁъЄєЁє 9 ЇєэЎшш - юс чрЄхы№э√щ ярЁрьхЄЁ
|
||||
|
||||
┼ёыш т√ шёяюы№чєхЄх яЁш яЁюЁшёютъх юъэр
|
||||
mcall 0,(50*65536+390),(30*65536+200),0xb3AABBCC,0x805080DD,hed
|
||||
@@ -79,18 +79,18 @@ draw_edit_boxes -
|
||||
╧хЁхфртрхь√х ярЁрьхЄЁ√
|
||||
editboxes - єърчрЄхы№ эр шэЇюЁьрЎшюээє■ ёЄЁєъєЁє сюъёют
|
||||
editboxes_end - ъюэхЎ шэЇюЁьрЎшюээющ ёЄЁєъЄєЁ√ сюъёют
|
||||
use_f9 ш structure_of_potock - яЁш яхЁхфрўх ¤Єюую ярЁрьхЄЁр - яЁш яхЁхЁшёютъш сюъёют сєфхЄ шёяюычютрэр ЇєэЎш
|
||||
mcall 9,structure_of_potock,-1
|
||||
ъюЄюЁр яюыєўрхЄ фрээ√х ю юъэх ш ёъырф√трхЄ ярЁрьхЄЁ√ яю рфЁхёє structure_of_potock- хую Єю цх юс чрЄхы№эю эєцэю яхЁхфртрЄ№!!!!
|
||||
use_f9 ш procinfo - яЁш яхЁхфрўх ¤Єюую ярЁрьхЄЁр - яЁш яхЁхЁшёютъш сюъёют сєфхЄ шёяюычютрэр ЇєэЎш
|
||||
mcall 9,procinfo,-1
|
||||
ъюЄюЁр яюыєўрхЄ фрээ√х ю юъэх ш ёъырф√трхЄ ярЁрьхЄЁ√ яю рфЁхёє procinfo- хую Єю цх юс чрЄхы№эю эєцэю яхЁхфртрЄ№!!!!
|
||||
┼ёыш т яЁюуЁрььх єцх шёяюы№чєхЄё ¤Єр ЇєэЎш , Єю эх эєцэю єърч√трЄ№ фрээ√х ярЁрьхЄЁ!!!!
|
||||
|
||||
╩ръ яюф трЁшрэЄ ёє∙хёЄтєхЄ ьръЁюё
|
||||
draw_edit_box - юэ шёяюы№чєхЄё хёыш т√тюфшЄ№ё ў юфшэ сюъё
|
||||
╧хЁхфртрхь√щ ярЁрьхЄЁ
|
||||
editboxes - єърчрЄхы№ эр шэЇюЁьрЎшюээє■ ёЄЁєъєЁє сюъёют
|
||||
use_f9 ш structure_of_potock - яЁш яхЁхфрўх ¤Єюую ярЁрьхЄЁр - яЁш яхЁхЁшёютъш сюъёют сєфхЄ шёяюычютрэр ЇєэЎш
|
||||
mcall 9,structure_of_potock,-1
|
||||
ъюЄюЁр яюыєўрхЄ фрээ√х ю юъэх ш ёъырф√трхЄ ярЁрьхЄЁ√ яю рфЁхёє structure_of_potock- хую Єю цх юс чрЄхы№эю эєцэю яхЁхфртрЄ№!!!!
|
||||
use_f9 ш procinfo - яЁш яхЁхфрўх ¤Єюую ярЁрьхЄЁр - яЁш яхЁхЁшёютъш сюъёют сєфхЄ шёяюычютрэр ЇєэЎш
|
||||
mcall 9,procinfo,-1
|
||||
ъюЄюЁр яюыєўрхЄ фрээ√х ю юъэх ш ёъырф√трхЄ ярЁрьхЄЁ√ яю рфЁхёє procinfo- хую Єю цх юс чрЄхы№эю эєцэю яхЁхфртрЄ№!!!!
|
||||
┼ёыш т яЁюуЁрььх єцх шёяюы№чєхЄё ¤Єр ЇєэЎш , Єю эх эєцэю єърч√трЄ№ фрээ√х ярЁрьхЄЁ!!!!
|
||||
┴юы№°х эшъръшї ярЁрьхЄЁют яхЁхфртрЄ№ эх эєцэю.
|
||||
**********
|
||||
|
||||
@@ -6,6 +6,7 @@ You bunny wrote .....
|
||||
▌Єю эх ьэюую Їюы№ъыхЁр, ёт чрээюх, ё Єхь, ўЄю эряшёрэшх яЁюуЁрьь фышээ√х ш ьєЄюЁэ√щ яЁюЎхёё, ш юэ эх юсїюфшЄ№ё схч т√Ёрцхэшщ яюфюсэюую ёюфхЁцрэш , эю эх яюярфр■∙хую т ъюьхэЄрЁшш ш юёэютэющ ъюф.....
|
||||
|
||||
╥хяыют └ыхъёхщ ▐Ё№хтшў aka <Lrz>
|
||||
; <Lrz> 09.05.2007 ╬с∙р фюЁрсюЄър ьръЁюёют,чрьхэр эхёъюы№ъю ьхЄюъ, ьшуЁрЎш ъюфр т edit_box.mac
|
||||
; <Lrz> 19.04.2007 ╬с∙р фюЁрсюЄър ьръЁюёют
|
||||
; <Lrz> 14.04.2007 ╚ёяЁртыхэю єяЁртыхэшх ь√°ъющ, яЁш єфрыхэшш яюёыхфэхую ёшьтюыр т сєЇхЁх яш°хЄ№ё 0 (ёярёшсю Mario79)
|
||||
; <Lrz> 04.04.2007 ╠юфхЁэшчшЁютры ёшёЄхьє т√фхыхэш , ёє∙хёЄтхээю яхЁхфхырэю єяЁртыхэшх ш юсЁрсюЄър, фюсртыхээю сыюъшЁютрэш юсЁрсюЄъш фЁєушї сюъёют, тю тЁхь т√фхыхэш ь√°ъющ ЄхъёЄр, фы ¤Єюую т ЄхъёЄ яЁюуЁрьь√ эхюсїюфшью фюсртшЄ№ шфхэЄшЇшърЄюЁ сюъёр Є.х. dd 0x0 ш т эхую сєфхЄ яюьх∙рЄ№ё єъррЄхы№ эр editbox
|
||||
|
||||
@@ -10,18 +10,20 @@ use32 ;
|
||||
dd start ; адрес, на который система передаёт управление
|
||||
; после загрузки приложения в память
|
||||
dd i_end ; размер приложения
|
||||
dd i_end and not 3 ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
|
||||
dd i_end and not 3 ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
|
||||
dd i_end ; Объем используемой памяти, для стека отведем 0х100 байт и выровним на грницу 4 байта
|
||||
dd i_end ; расположим позицию стека в области памяти, сразу за телом программы. Вершина стека в диапазоне памяти, указанном выше
|
||||
dd 0x0,0x0 ; указатель на строку с параметрами.
|
||||
include 'macros.inc'
|
||||
include 'editbox.inc'
|
||||
use_edit_box structure_of_potock,22,5
|
||||
align 4
|
||||
use_edit_box procinfo,22,5
|
||||
;Область кода
|
||||
start: ;Точка входа в программу
|
||||
mcall 40,0x27 ;установить маску для ожидаемых событий
|
||||
;система будет реагировать только на сообщение о перерисовке,нажата кнопка, определённая ранее, событие от мыши (что-то случилось - нажатие на кнопку мыши или перемещение; сбрасывается при прочтении) и нажатие клавиши
|
||||
red_win:
|
||||
call draw_window ;первоначально необходимо нарисовать окно
|
||||
align 4
|
||||
still: ;основной обработчик
|
||||
mcall 10 ;Ожидать события
|
||||
cmp al,0x1 ;если изменилось положение окна
|
||||
@@ -45,10 +47,11 @@ key:
|
||||
jmp still
|
||||
|
||||
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
align 4
|
||||
draw_window: ;рисование окна приложения
|
||||
mcall 12,1
|
||||
mcall 0,(50*65536+390),(30*65536+200),0xb3AABBCC,0x805080DD,hed
|
||||
draw_edit_boxes editboxes,editboxes_end,use_f9,structure_of_potock ;рисование edit box'ов
|
||||
draw_edit_boxes editboxes,editboxes_end,use_f9,procinfo ;рисование edit box'ов
|
||||
mcall 12,2
|
||||
ret
|
||||
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
||||
@@ -61,7 +64,7 @@ edit4 edit_box 16,5,70,0xffffff,0x6a9480,0,0,0,1,ed_buffer.4,ed_figure_only
|
||||
editboxes_end:
|
||||
data_of_code dd 0
|
||||
mouse_flag dd 0x0
|
||||
hed db 'EDITBOX optimization and retype <Lrz> date 19.04.2007',0
|
||||
hed db 'EDITBOX optimization and retype <Lrz> date 09.05.2007',0
|
||||
rb 256
|
||||
ed_buffer:
|
||||
;.1: rb 514;256
|
||||
@@ -70,7 +73,8 @@ ed_buffer:
|
||||
.4: rb 3
|
||||
;два запасных байта необходимы для того что бы не пепереписать следующией байты, в конце буфера 0
|
||||
buffer_end:
|
||||
structure_of_potock:
|
||||
align 16
|
||||
procinfo:
|
||||
rb 1024 ;1 кб для получения общей структуры
|
||||
rb 1024
|
||||
i_end:
|
||||
rb 1024 ;Stack
|
||||
i_end:
|
||||
@@ -1,7 +1,632 @@
|
||||
;Макрос для вывода основных функций которые испльзуются боксом
|
||||
macro use_general_func
|
||||
{
|
||||
;debug_func
|
||||
;----------------------------------------------------------
|
||||
;--- процедура прорисовки выделеной части -----------------
|
||||
;----------------------------------------------------------
|
||||
.draw_shift:
|
||||
test word ed_flags,ed_shift_bac ;установка флага, выделенной области
|
||||
jz @f
|
||||
mov ebp,shift_color
|
||||
mov ebx,dword ed_shift_pos
|
||||
call .sh_cl_
|
||||
@@: ret
|
||||
;----------------------------------------------------------
|
||||
;--- процедура прорисовки текста --------------------------
|
||||
;----------------------------------------------------------
|
||||
.draw_text:
|
||||
;--- вычисляем, сколько помещается символов ---
|
||||
;--- чтобы мусор не рисовать ---
|
||||
call .get_n
|
||||
mov esi,ed_size
|
||||
mov ebx,ed_offset
|
||||
sub esi,ebx
|
||||
cmp eax,esi
|
||||
jae @F
|
||||
mov esi,eax ;чтобы не выходить за пределы экрана
|
||||
;--- рисуем текст ---
|
||||
@@: mov eax,4
|
||||
mov ebx,ed_left
|
||||
mov edx,ed_offset
|
||||
add ebx,2
|
||||
shl ebx,16
|
||||
mov bx,ed_top
|
||||
add ebx,4
|
||||
mov ecx,ed_text_color
|
||||
add edx,ed_text
|
||||
mcall
|
||||
ret
|
||||
;----------------------------------------------------------
|
||||
;--- процедура прорисовки фона ----------------------------
|
||||
;входные данные
|
||||
;eax
|
||||
;edx - color
|
||||
;----------------------------------------------------------
|
||||
;вход только цвет edx
|
||||
.draw_bg:
|
||||
mov ebx,ed_left
|
||||
add ebx,1
|
||||
shl ebx,16
|
||||
mov bx,ed_width
|
||||
sub ebx,1
|
||||
mov edx,ed_color
|
||||
.draw_bg_eax:
|
||||
mov ecx,ed_top
|
||||
mov eax,13
|
||||
add ecx,1
|
||||
shl ecx,16
|
||||
mov cx,ed_height
|
||||
dec ecx
|
||||
mcall
|
||||
ret
|
||||
|
||||
;----------------------------------------------------------
|
||||
;--- процедура получения количества символов в текущей щирине компонента
|
||||
;----------------------------------------------------------
|
||||
.get_n:
|
||||
mov eax,ed_width ;получем ширину компонента
|
||||
xor edx,edx ;результат распологается в паре edx:eax в eax - остаток
|
||||
sub eax,4 ;вычтим 4
|
||||
mov ebx,6 ;загрузми делитель
|
||||
div ebx ;размделим на 6
|
||||
ret
|
||||
;----------------------------------------------------------
|
||||
;--- процедура рисования курсора --------------------------
|
||||
;----------------------------------------------------------
|
||||
;входные ebp- цвет
|
||||
.clear_cursor:
|
||||
mov edx,ebp
|
||||
mov ebx,cl_curs_x
|
||||
mov ecx,cl_curs_y
|
||||
jmp .draw_curs
|
||||
.draw_cursor:
|
||||
mov edx,ed_text_color
|
||||
mov ebx,ed_pos
|
||||
mov ecx,ed_offset
|
||||
sub ebx,ecx
|
||||
|
||||
lea ebx,[ebx*2+ebx]
|
||||
shl ebx,1
|
||||
;imul ebx,6
|
||||
add bx,ed_left
|
||||
mov ecx,ed_top
|
||||
inc ebx
|
||||
add ecx,2
|
||||
mov ebp,ebx
|
||||
shl ebx,16
|
||||
mov bx,bp
|
||||
mov ebp,ecx
|
||||
|
||||
shl ecx,16
|
||||
mov cx,bp
|
||||
add cx,ed_height-4
|
||||
|
||||
mov cl_curs_x,ebx
|
||||
mov cl_curs_y,ecx
|
||||
.draw_curs:
|
||||
mcall 38
|
||||
ret
|
||||
;----------------------------------------------------------
|
||||
;--- процедура рисования рамки ----------------------------
|
||||
;----------------------------------------------------------
|
||||
.draw_border:
|
||||
;--- цвет рамки ---
|
||||
test word ed_flags,ed_focus
|
||||
mov edx,ed_focus_border_color
|
||||
jne @f
|
||||
mov edx,ed_blur_border_color
|
||||
@@:
|
||||
;--- сверху ---
|
||||
mov eax,38
|
||||
mov ebx,ed_left
|
||||
mov ecx,ebx
|
||||
shl ebx,16
|
||||
mov bx,cx
|
||||
add bx,ed_width
|
||||
mov ecx, ed_top
|
||||
mov esi,ecx
|
||||
shl ecx,16
|
||||
mov cx,si
|
||||
mcall
|
||||
;--- снизу ---
|
||||
mov esi,ecx
|
||||
add ecx,ed_height
|
||||
mov ebp,ecx
|
||||
shl ecx,16
|
||||
mov cx,bp
|
||||
mcall
|
||||
;--- слева ---
|
||||
mov cx,si
|
||||
mov ebp,ebx
|
||||
sub bx,ed_width
|
||||
mcall
|
||||
;--- справа ---
|
||||
mov ebx,ebp
|
||||
shl ebx,16
|
||||
mov bx,bp
|
||||
mcall
|
||||
ret
|
||||
;----------------------------------------------------------
|
||||
;--- проверка, зашел ли курсор за границы и, если надо, ---
|
||||
;--- изменяем смещение ------------------------------------
|
||||
;--- если смещение было установка флага ed_offset_cl иначе
|
||||
; если ничего не изменилось то выставление ed_offset_fl
|
||||
; в общей битовой маррице состояния компонентов word ed_flags
|
||||
;----------------------------------------------------------
|
||||
.check_offset:
|
||||
pusha
|
||||
mov ecx,ed_pos
|
||||
mov ebx,ed_offset
|
||||
cmp ebx,ecx
|
||||
ja .sub_8
|
||||
|
||||
push ebx
|
||||
call .get_n ;получим кол-во символов в паре регистров edx:eax
|
||||
pop ebx
|
||||
mov edx,ebx
|
||||
add edx,eax ;ed_offset+width editbox
|
||||
inc edx ;необходимо для номального положения курсора в крайней левой позиции
|
||||
cmp edx,ecx
|
||||
ja @f
|
||||
|
||||
mov edx,ed_size
|
||||
cmp edx,ecx
|
||||
je .add_end
|
||||
|
||||
sub edx,ecx
|
||||
cmp edx,8
|
||||
jbe .add_8
|
||||
add ebx,8
|
||||
jmp .chk_d
|
||||
|
||||
.sub_8: cmp ecx,0
|
||||
je .sub_min
|
||||
cmp ebx,8
|
||||
jbe .sub_min
|
||||
sub ebx,8 ;ebx=ed_offset
|
||||
jmp .chk_d
|
||||
.sub_min:
|
||||
xor ebx,ebx
|
||||
jmp .chk_d
|
||||
|
||||
.add_end:sub edx,eax
|
||||
mov ebx,edx
|
||||
jmp .chk_d
|
||||
.add_8: add ebx,edx
|
||||
.chk_d: mov ed_offset,ebx
|
||||
call .draw_bg
|
||||
and word ed_flags,ed_offset_cl
|
||||
edit_ex
|
||||
@@:
|
||||
or word ed_flags,ed_offset_fl
|
||||
edit_ex
|
||||
}
|
||||
|
||||
macro use_key_func
|
||||
{
|
||||
;Обработка Shift для снятия выделения неизвестной области
|
||||
.shift: ;;;;;;;SHIFT
|
||||
test word ed_flags,ed_shift
|
||||
je .f_exit
|
||||
|
||||
@@: mov ebp,shift_color
|
||||
or word ed_flags,ed_shift_bac ;установка флага, выделенной области
|
||||
mov ebx,dword ed_shift_pos
|
||||
call .sh_cl_
|
||||
jmp .draw_cursor_text
|
||||
;;;;;;;;;;;;;;;;;;;;;
|
||||
.f_exit:call .check_offset
|
||||
and word ed_flags,ed_shift_cl
|
||||
call .enable_null
|
||||
jmp .draw_cursor_text
|
||||
.sh_cl_:
|
||||
;;;;;;SHIFT end
|
||||
;обработка очистки, при левом - правом движении выделения
|
||||
;для обработки снятия выделения
|
||||
;входные параметры ebp=color ebx=ed_shift_pos
|
||||
mov eax,dword ed_pos
|
||||
cmp eax,ebx
|
||||
|
||||
jae .sh_n
|
||||
push eax ;меньшее в eax
|
||||
push ebx ;большее
|
||||
jmp .sh_n1
|
||||
;если иначе
|
||||
.sh_n: push ebx
|
||||
push eax
|
||||
.sh_n1:
|
||||
call .check_offset
|
||||
call .get_n
|
||||
mov edx,eax ;size of ed_box
|
||||
mov ecx,ed_offset
|
||||
add eax,ecx ;eax = w_off= ed_offset+width
|
||||
mov edx,eax ;save
|
||||
pop ebx ;большее
|
||||
pop eax ;меньшее
|
||||
|
||||
cmp eax,ecx ;сравнение с меньшего с offset.
|
||||
jae .f_f ;если больше
|
||||
xor eax,eax
|
||||
cmp edx,ebx ;cравним размер w_off с большим
|
||||
jb @f
|
||||
sub ebx,ecx
|
||||
jmp .nxt_f
|
||||
@@: mov ebx,edx
|
||||
sub ebx,ecx
|
||||
jmp .nxt_f
|
||||
.f_f:
|
||||
sub eax,ecx
|
||||
cmp edx,ebx ;cравним размер w_off с большим
|
||||
jle @f
|
||||
sub ebx,ecx
|
||||
sub ebx,eax
|
||||
jmp .nxt_f
|
||||
@@:
|
||||
mov ebx,edx
|
||||
sub ebx,ecx
|
||||
sub ebx,eax
|
||||
.nxt_f:
|
||||
mov edx,ebx
|
||||
lea ebx,[eax*2+eax]
|
||||
shl ebx,1
|
||||
add ebx,ed_left
|
||||
inc ebx
|
||||
shl ebx,16
|
||||
lea ecx,[edx*2+edx]
|
||||
shl ecx,1
|
||||
mov bx,cx
|
||||
inc ebx
|
||||
mov edx,ebp;shift_color
|
||||
|
||||
call .draw_bg_eax
|
||||
@@: call .enable_null
|
||||
ret
|
||||
;;;;;;;;;;;;;;;;;;;;;
|
||||
;Установка- снятие выделения в один символ
|
||||
;;;;;;;;;;;;;;;;;;;;;
|
||||
.drw_sim:
|
||||
mov eax,dword ed_pos
|
||||
call .draw_rectangle ;нарисовать прямоугольник с заданным цветом
|
||||
jmp @b
|
||||
;;;;;;;;;;;;;;;;;;;;;
|
||||
;Фукция установки выделения при движения влево и вправо и нажатии shift
|
||||
;Логика:
|
||||
;;;;;;;;;;
|
||||
.draw_wigwag:
|
||||
;функция установки переменных
|
||||
mov ebp,shift_color
|
||||
call .clear_cursor
|
||||
|
||||
or word ed_flags,ed_shift_bac ;установка флага, выделенной области
|
||||
mov ebp,shift_color
|
||||
mov eax,dword ed_pos
|
||||
test word ed_flags,ed_left_fl
|
||||
jz .low
|
||||
jmp @f
|
||||
;;;;;;;;;;
|
||||
;Фукция удаления выделения при движения влево и вправо и нажатии shift
|
||||
;Логика:
|
||||
;;;;;;;;;;
|
||||
.draw_wigwag_cl:
|
||||
;функция установки переменных
|
||||
mov ebp,ed_color
|
||||
call .clear_cursor
|
||||
|
||||
mov ebp,ed_color
|
||||
mov eax,dword ed_pos
|
||||
test word ed_flags,ed_left_fl
|
||||
jz .low
|
||||
@@: call .draw_rectangle ;нарисовать прямоугольник закрашиваемой области
|
||||
ret
|
||||
.low: dec eax
|
||||
jmp @b
|
||||
;входной параметр ebx - ed_pos
|
||||
.sh_first_sh:
|
||||
test word ed_flags,ed_shift
|
||||
je @f
|
||||
mov dword ed_shift_pos_old,ebx
|
||||
test word ed_flags,ed_shift_on
|
||||
jne @f
|
||||
mov dword ed_shift_pos,ebx
|
||||
or word ed_flags,ed_shift_on
|
||||
@@: ret
|
||||
;Обработка крайних положений в editbox при нажатом shift
|
||||
;производит снятие выделение, если нет shift
|
||||
;иначе вообще выходит
|
||||
.sh_st_of:
|
||||
test word ed_flags,ed_shift
|
||||
jne @f
|
||||
test word ed_flags,ed_shift_bac
|
||||
je @f
|
||||
mov ebp,ed_color
|
||||
mov ebx,dword ed_shift_pos
|
||||
call .sh_cl_ ;очистка выделеного фрагмента
|
||||
and word ed_flags,ed_shift_cl ; очистка от того что убрали выделение
|
||||
jmp .draw_cursor_text
|
||||
@@:
|
||||
and word ed_flags,ed_shift_off
|
||||
edit_ex
|
||||
;проверка состояния shift был ли он нажат раньше?
|
||||
.sh_enable:
|
||||
test word ed_flags,ed_shift
|
||||
jne .sh_ext_en ;нарисовать закрашеный прямоугольник
|
||||
|
||||
test word ed_flags,ed_shift_bac
|
||||
je @f
|
||||
call .check_offset
|
||||
|
||||
mov ebp,ed_color
|
||||
mov ebx,dword ed_shift_pos
|
||||
call .sh_cl_ ;очистка выделеного фрагмента
|
||||
call .draw_wigwag_cl
|
||||
and word ed_flags,ed_shift_cl ; 1вар не нужно
|
||||
ret
|
||||
|
||||
@@: mov ebp,ed_color
|
||||
call .clear_cursor
|
||||
call .check_offset
|
||||
ret
|
||||
.sh_ext_en:
|
||||
call .check_offset
|
||||
test word ed_flags,ed_offset_fl
|
||||
je @f
|
||||
;Рисование закрашеных прямоугольников и очистка их
|
||||
mov eax,dword ed_shift_pos
|
||||
mov ebx,dword ed_pos
|
||||
mov ecx,dword ed_shift_pos_old
|
||||
;проверка и рисование закрашеных областей
|
||||
cmp eax,ecx
|
||||
je .1_shem
|
||||
jb .smaller
|
||||
cmp ecx,ebx
|
||||
ja .1_shem
|
||||
call .draw_wigwag_cl ;clear
|
||||
jmp .sh_e_end
|
||||
.smaller:
|
||||
cmp ecx,ebx
|
||||
jb .1_shem
|
||||
call .draw_wigwag_cl ;clear
|
||||
jmp .sh_e_end
|
||||
;alike =
|
||||
.1_shem: call .draw_wigwag
|
||||
.sh_e_end: and word ed_flags,ed_shift_off
|
||||
ret
|
||||
@@: mov ebp,shift_color
|
||||
mov ebx,dword ed_shift_pos
|
||||
call .sh_cl_
|
||||
jmp .sh_e_end
|
||||
;функция для обработки shift при нажатии home and end
|
||||
.sh_home_end:
|
||||
mov ebp,ed_color
|
||||
call .clear_cursor
|
||||
test word ed_flags,ed_shift_bac
|
||||
je @f
|
||||
mov ebp,ed_color
|
||||
mov ebx,dword ed_shift_pos_old
|
||||
call .sh_cl_
|
||||
|
||||
@@: test word ed_flags,ed_shift
|
||||
je .sh_exit_ ;выйти
|
||||
mov ebp,shift_color
|
||||
mov ebx,dword ed_shift_pos
|
||||
call .sh_cl_
|
||||
or word ed_flags,ed_shift_bac ;установка флага, выделенной области
|
||||
jmp .sh_e_end
|
||||
.sh_exit_: call .check_offset
|
||||
ret
|
||||
;функция внесения 0 по адресу ed_size+1
|
||||
.enable_null:
|
||||
pusha
|
||||
mov eax,ed_size
|
||||
mov ebx,ed_text
|
||||
test eax,eax
|
||||
add eax,ebx
|
||||
jne @f
|
||||
inc eax
|
||||
@@: xor ebx,ebx
|
||||
mov [eax],bl
|
||||
edit_ex
|
||||
;- удаление символа
|
||||
;Входные данные edx=ed_size;ecx=ed_pos
|
||||
.del_char:
|
||||
mov esi,ed_text
|
||||
test word ed_flags,ed_shift_on
|
||||
je @f
|
||||
mov eax,dword ed_shift_pos
|
||||
mov ebx,esi
|
||||
cmp eax,ecx
|
||||
jae .dh_n
|
||||
|
||||
mov ed_pos,eax ;что бы не было убегания курсора
|
||||
mov ebp,ecx
|
||||
sub ebp,eax
|
||||
add ebx,eax ;eax меньше
|
||||
sub edx,ecx
|
||||
add esi,ecx
|
||||
|
||||
mov dword ed_shift_pos,ebp
|
||||
jmp .del_ch_sh
|
||||
;если иначе
|
||||
.dh_n:
|
||||
mov ebp,eax
|
||||
sub ebp,ecx
|
||||
add ebx,ecx
|
||||
sub edx,eax
|
||||
add esi,eax
|
||||
mov dword ed_shift_pos,ebp
|
||||
jmp .del_ch_sh
|
||||
|
||||
@@: add esi,ecx ;указатель + смещение к реальному буфферу
|
||||
mov ebx,esi
|
||||
inc esi
|
||||
cld
|
||||
|
||||
sub edx,ecx
|
||||
.del_ch_sh:
|
||||
|
||||
push edi
|
||||
mov edi,ebx
|
||||
@@:
|
||||
lodsb
|
||||
stosb
|
||||
dec edx
|
||||
jns @b
|
||||
|
||||
pop edi
|
||||
ret
|
||||
;вычислить закрашиваемую область
|
||||
;соглашение в ebp - передается ed_size
|
||||
.clear_bg:
|
||||
call .get_n ;получить размер в символах ширины компонента
|
||||
push eax
|
||||
mov ebx,ed_offset
|
||||
add eax,ebx ;eax = w_off= ed_offset+width
|
||||
mov ebx,ebp ;ed_size
|
||||
|
||||
cmp eax,ebx
|
||||
jb @f
|
||||
mov eax,ed_pos
|
||||
sub ebx,eax
|
||||
mov ecx,ed_offset
|
||||
sub eax,ecx
|
||||
jmp .nxt
|
||||
@@: mov ebx,ed_pos
|
||||
push ebx
|
||||
sub eax,ebx
|
||||
mov ebx,eax ;It is don't optimal
|
||||
|
||||
pop eax ;ed_pos
|
||||
mov ecx,ed_offset
|
||||
sub eax,ecx
|
||||
.nxt:
|
||||
mov ebp,eax ;проверка на выход закрашиваемой области за пределы длины
|
||||
add ebp,ebx
|
||||
pop edx
|
||||
cmp ebp,edx
|
||||
je @f
|
||||
inc ebx
|
||||
|
||||
@@: mov edx,ebx
|
||||
lea ebx,[eax*2+eax]
|
||||
shl ebx,1
|
||||
add ebx,ed_left
|
||||
inc ebx
|
||||
shl ebx,16
|
||||
lea ecx,[edx*2+edx]
|
||||
shl ecx,1
|
||||
mov bx,cx
|
||||
mov edx,ed_color
|
||||
call .draw_bg_eax
|
||||
ret
|
||||
;;;;;;;;;;;;;;;;;;;
|
||||
;;; Обработка примитивов
|
||||
;;;;;;;;;;;;;;;;;;;;
|
||||
;Нарисовать прямоугольник, цвет передается в ebp
|
||||
;входные параметры:
|
||||
;eax=dword ed_pos
|
||||
;ebp=-цвет ed_color or shift_color
|
||||
.draw_rectangle:
|
||||
mov ecx,dword ed_offset
|
||||
sub eax,ecx
|
||||
lea ebx,[eax*2+eax]
|
||||
shl ebx,1
|
||||
inc ebx
|
||||
add ebx,ed_left
|
||||
shl ebx,16
|
||||
mov bx,6
|
||||
mov edx,ebp
|
||||
call .draw_bg_eax
|
||||
ret
|
||||
;;;;;;;;;;;;;;;;;;
|
||||
;;Проверка нажат ли shift
|
||||
;;;;;;;;;;;;;;;;;;
|
||||
.check_shift:
|
||||
pusha ;сохраним все регистры
|
||||
mcall 66,3,1
|
||||
test al,0x03
|
||||
je @f
|
||||
or word ed_flags,ed_shift ;установим флаг
|
||||
@@:edit_ex
|
||||
}
|
||||
;макрос клавиш на которые происходит реакция
|
||||
macro use_key_process backspase,delete,left,right,home,end,insert
|
||||
{
|
||||
if backspase eq
|
||||
else
|
||||
cmp ah,8
|
||||
jz .backspace
|
||||
end if
|
||||
if delete eq
|
||||
else
|
||||
cmp ah,0xb6
|
||||
jz .delete
|
||||
end if
|
||||
if left eq
|
||||
else
|
||||
cmp ah,176
|
||||
jz .left
|
||||
end if
|
||||
if right eq
|
||||
else
|
||||
cmp ah,179
|
||||
jz .right
|
||||
end if
|
||||
if home eq
|
||||
else
|
||||
cmp ah,180
|
||||
jz .home
|
||||
end if
|
||||
if home eq
|
||||
else
|
||||
cmp ah,181
|
||||
jz .end
|
||||
end if
|
||||
if insert eq
|
||||
else
|
||||
cmp ah,185 ;insert
|
||||
jz .insert
|
||||
end if
|
||||
}
|
||||
macro use_key_no_process up,down,esc
|
||||
{
|
||||
if up eq
|
||||
else
|
||||
cmp ah,177
|
||||
jz .no_figure
|
||||
end if
|
||||
if down eq
|
||||
else
|
||||
cmp ah,178
|
||||
jz .no_figure
|
||||
end if
|
||||
if esc eq
|
||||
else
|
||||
cmp ah,27 ;ESC - клавиша ))
|
||||
jz .no_figure
|
||||
end if
|
||||
}
|
||||
|
||||
macro use_key_figures_only
|
||||
{
|
||||
test word ed_flags,ed_figure_only ; только цифры ?
|
||||
jz @f
|
||||
cmp ah,'0'
|
||||
jb .no_figure
|
||||
cmp ah,'9'
|
||||
ja .no_figure
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
; Макрос выхода
|
||||
macro edit_ex
|
||||
{
|
||||
popa
|
||||
popa
|
||||
ret
|
||||
}
|
||||
macro debug
|
||||
|
||||
Reference in new issue
Block a user