forked from KolibriOS/kolibrios
Tinypad from 0.6.0.0
git-svn-id: svn://kolibrios.org@178 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
390
programs/develop/tinypad/trunk/tp-tbox.asm
Normal file
390
programs/develop/tinypad/trunk/tp-tbox.asm
Normal file
@@ -0,0 +1,390 @@
|
||||
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
|
Reference in New Issue
Block a user