kolibrios/programs/develop/tinypad/trunk/tp-tbox.asm

391 lines
6.0 KiB
NASM
Raw Normal View History

struct TBOX
x dw ?
width dw ?
y dw ?
height dw ?
sel.x db ?
pos.x db ?
ofs.x db ?
length db ?
text rb 255
ends
virtual at ebp
tbox TBOX
end virtual
tb.pos.x db ?
tb.sel.x db ?
tb.sel.selected db ?
func textbox.get_width
push ebx edx
movzx eax,[tbox.width-2]
add eax,-6
xor edx,edx
mov ebx,6
div ebx
movzx ebx,[tbox.length]
cmp eax,ebx
jle @f
mov eax,ebx
@@: pop edx ebx
ret
endf
func textbox.delete_selection
cmp [tb.sel.selected],0
je .exit.2
pushad
movzx ecx,[tbox.length]
sub cl,[tb.sel.x]
lea eax,[tbox.text]
movzx esi,[tb.pos.x]
movzx edi,[tb.sel.x]
add esi,eax
add edi,eax
mov eax,esi
sub eax,edi
sub [tbox.length],al
cld
rep movsb
.exit:
mov al,[tb.sel.x]
mov [tbox.pos.x],al
mov [tbox.sel.x],al
popad
clc
ret
.exit.2:
stc
ret
endf
func textbox.draw ; TBOX* ebp
call textbox.get_width
movzx ebx,[tbox.pos.x]
sub bl,[tbox.ofs.x]
sub ebx,eax
jle @f
mov bl,[tbox.pos.x]
sub bl,al
mov [tbox.ofs.x],bl
@@:
mov [tb.sel.selected],0
mov al,[tbox.pos.x]
mov ah,[tbox.sel.x]
cmp al,ah
je @f
inc [tb.sel.selected]
ja @f
xchg al,ah
@@: mov [tb.pos.x],al
mov [tb.sel.x],ah
mcall 13,dword[tbox.x],dword[tbox.y],[color_tbl+4*5];[sc.work]
call draw_framerect
call textbox.get_width
mov esi,eax
mov edi,eax
cmp ebp,[focused_tb]
je @f
mov ebx,dword[tbox.x]
mov bx,[tbox.y+2]
movzx eax,[tbox.height-2]
shr eax,1
add eax,4*65536-4
add ebx,eax
lea edx,[tbox.text]
; movzx esi,[tbox.length]
mcall 4,,[color_tbl+4*0];[sc.work_text]
ret
@@: movzx eax,[tb.pos.x]
cmp al,[tb.sel.x]
je @f
sub al,[tbox.ofs.x]
jz @f
movzx ebx,[tb.sel.x]
sub bl,[tbox.ofs.x]
jge .lp1
xor ebx,ebx
.lp1: push eax ebx
sub eax,ebx
mov ecx,edi
sub ecx,ebx
cmp eax,ecx
jbe .lp2
mov eax,ecx
.lp2: imul eax,6
imul ebx,6
movzx ecx,[tbox.x+2]
add ecx,3
; sub eax,ebx
add ebx,ecx
shl ebx,16
add ebx,eax
movzx ecx,[tbox.height-2]
shr ecx,1
add cx,[tbox.y+2]
shl ecx,16
add ecx,-5*65536+10
mcall 13,,,[color_tbl+4*7];0x0000007F
mov esi,[esp]
lea edx,[tbox.text]
movzx eax,[tbox.ofs.x]
add edx,eax
mov ebx,dword[tbox.x]
mov bx,[tbox.y+2]
movzx eax,[tbox.height-2]
shr eax,1
add eax,4*65536-4
add ebx,eax
mov eax,4
or esi,esi
jz .lp3
mcall ,,[color_tbl+4*0];[sc.work_text]
.lp3: sub edi,esi
jnz .lp4
add esp,8
jmp .exit
.lp4:
add edx,esi
imul esi,6*65536
add ebx,esi
pop ecx esi
sub esi,ecx
cmp esi,edi
jbe .lp5
mov esi,edi
.lp5:
mcall ,,[color_tbl+4*6];0x00FFFFFF
sub edi,esi
jz .exit
add edx,esi
imul esi,6*65536
add ebx,esi
lea ecx,[tbox.text]
; sub ecx,edx
; add edi,ecx
mcall ,,[color_tbl+4*0],,edi;[sc.work_text],,edi
jmp .exit
@@: lea edx,[tbox.text]
movzx eax,[tbox.ofs.x]
add edx,eax
mov ebx,dword[tbox.x]
mov bx,[tbox.y+2]
movzx eax,[tbox.height-2]
shr eax,1
add eax,4*65536-4
add ebx,eax
movzx eax,[tbox.ofs.x]
call textbox.get_width
mov esi,eax
mcall 4,,[color_tbl+4*0];[sc.work_text]
.exit:
movzx ebx,[tbox.pos.x]
movzx eax,[tbox.ofs.x]
sub ebx,eax
imul ebx,6
movzx eax,[tbox.x+2]
add eax,3
add ebx,eax
push bx
shl ebx,16
pop bx
movzx ecx,[tbox.height-2]
shr ecx,1
add cx,[tbox.y+2]
push cx
shl ecx,16
pop cx
add ecx,-5*65536+4
mcall 38,,,0x01000000
add ebx,0x00010001
mcall
ret
endf
func textbox.key
mov ebp,[focused_tb]
mov esi,accel_table_textbox
.acc: cmp ebx,[esi]
jne @f
call dword[esi+4]
jmp .exit.2
@@: add esi,8
cmp byte[esi],0
jne .acc
test byte[shi+2],0x06
jnz .exit
cmp [tbox.length],255
je .exit
movzx eax,[chr]
movzx eax,[eax+key0]
or al,al
jz .exit
mov al,[eax+key1]
cmp [tb_casesen],0
je @f
cmp al,$60
jle @f
add al,[add_table-$60+eax]
@@:
call textbox.delete_selection
mov ecx,255
sub cl,[tbox.pos.x]
lea edi,[tbox.text]
add edi,255
lea esi,[edi-1]
std
rep movsb
stosb
cld
inc [tbox.length]
call key.tb.right
.exit.2:
call textbox.draw
.exit:
ret
endf
textbox.mouse:
ret
func key.tb.bkspace
call textbox.delete_selection
jnc @f
cmp [tbox.pos.x],0
je @f
call key.tb.left
jmp key.tb.del.direct
@@: ret
endf
func key.tb.home
xor al,al
mov [tbox.pos.x],al
mov [tbox.sel.x],al
mov [tbox.ofs.x],al
ret
endf
func key.tb.left
mov al,[tbox.pos.x]
mov [tbox.sel.x],al
dec al
js @f
mov [tbox.pos.x],al
mov [tbox.sel.x],al
cmp [tbox.ofs.x],al
jl @f
sub [tbox.ofs.x],8
jge @f
mov [tbox.ofs.x],0
@@: ret
endf
func key.tb.right
call textbox.get_width
mov bl,[tbox.pos.x]
mov [tbox.sel.x],bl
inc bl
cmp bl,[tbox.length]
ja @f
mov [tbox.pos.x],bl
mov [tbox.sel.x],bl
sub bl,[tbox.ofs.x]
cmp bl,al
jbe @f
inc [tbox.ofs.x]
@@: ret
endf
func key.tb.end
call textbox.get_width
movzx ebx,[tbox.length]
mov [tbox.pos.x],bl
mov [tbox.sel.x],bl
sub ebx,eax
jge @f
xor bl,bl
@@: mov [tbox.ofs.x],bl
ret
endf
func key.tb.del
call textbox.delete_selection
jnc @f
.direct:
movzx ecx,[tbox.length]
sub cl,[tbox.pos.x]
jz @f
lea eax,[tbox.text]
movzx edi,[tbox.pos.x]
add edi,eax
lea esi,[edi+1]
dec [tbox.length]
cld
rep movsb
@@: ret
endf
func key.tb.shift_home
xor al,al
mov [tbox.pos.x],al
mov [tbox.ofs.x],al
ret
endf
func key.tb.shift_left
mov al,[tbox.pos.x]
dec al
js @f
mov [tbox.pos.x],al
cmp [tbox.ofs.x],al
jl @f
sub [tbox.ofs.x],8
jge @f
mov [tbox.ofs.x],0
@@: ret
endf
func key.tb.shift_right
call textbox.get_width
mov bl,[tbox.pos.x]
inc bl
cmp bl,[tbox.length]
ja @f
mov [tbox.pos.x],bl
sub bl,[tbox.ofs.x]
cmp bl,al
jbe @f
inc [tbox.ofs.x]
@@: ret
endf
func key.tb.shift_end
call textbox.get_width
movzx ebx,[tbox.length]
mov [tbox.pos.x],bl
sub ebx,eax
jge @f
xor bl,bl
@@: mov [tbox.ofs.x],bl
ret
endf