Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 296 → Rev 297

/programs/develop/tinypad/trunk/tp-editor.asm
17,11 → 17,11
mov [cur_editor.Gutter.Visible],0
test [options],OPTS_LINENUMS
jnz @f
xor eax,eax ;! mov eax,2+LCHGW
xor eax,eax
jmp .lp1
@@: inc [cur_editor.Gutter.Visible]
mov edi,p_info+100
mov eax,[cur_editor.Lines.Count] ;! eax,[lines]
mov eax,[cur_editor.Lines.Count]
mov ecx,10
call uint2str
lea eax,[edi-p_info-100]
30,7 → 30,7
mov eax,3
@@: imul eax,6
add eax,8
.lp1: mov [cur_editor.Gutter.Width],eax ;! [left_ofs],eax
.lp1: mov [cur_editor.Gutter.Width],eax
mov [left_ofs],eax
 
mov eax,[cur_editor.Bounds.Right]
131,8 → 131,10
add ebx,(-SCRLW)*65536+SCRLW
mov ecx,[cur_editor.Bounds.Top-2]
mov cx,SCRLW
cmp [bot_mode],0
jne @f
mcall 8,,,'VSL' or 0x40000000
pushad
@@: pushad
sar ebx,16
sar ecx,16
push ebx ecx SCRLW SCRLW
152,8 → 154,10
mov ecx,[cur_editor.Bounds.Bottom]
shl ecx,16
add ecx,(-SCRLW*2)*65536+SCRLW
cmp [bot_mode],0
jne @f
mcall ,,,'VSG' or 0x40000000
pushad
@@: pushad
sar ebx,16
sar ecx,16
push ebx ecx SCRLW SCRLW
236,8 → 240,10
mov ecx,[cur_editor.Bounds.Bottom]
shl ecx,16
add ecx,(-SCRLW)*65536+SCRLW
cmp [bot_mode],0
jne @f
mcall 8,,,'HSL' or 0x40000000
pushad
@@: pushad
sar ebx,16
sar ecx,16
push ebx ecx SCRLW SCRLW
256,8 → 262,10
mov ebx,[cur_editor.Bounds.Right]
shl ebx,16
add ebx,(-SCRLW*2)*65536+SCRLW
cmp [bot_mode],0
jne @f
mcall 8,,,'HSG' or 0x40000000
pushad
@@: pushad
sar ebx,16
sar ecx,16
push ebx ecx SCRLW SCRLW
333,6 → 341,82
endf
 
;-----------------------------------------------------------------------------
func draw_editor_text.part ;///// DRAW EDITOR TEXT (PARTLY) //////////////////
;-----------------------------------------------------------------------------
; EAX = start line
; EBX = end line
;-----------------------------------------------------------------------------
cmp [cur_editor.Lines],0
jne @f
ret
@@: push eax
mov eax,[cur_editor.Bounds.Bottom]
sub eax,[cur_editor.Bounds.Top]
cmp eax,LINEH
pop eax
jge @f
ret
@@:
mov ebp,cur_editor
call init_sel_vars
call check_bottom_right
 
pushad
 
push eax
mov eax,[cur_editor.Bounds.Left]
add eax,[cur_editor.Gutter.Width]
add eax,LCHGW+3
mov [left_ofs],eax
mov eax,[cur_editor.Bounds.Top]
add eax,3
mov [top_ofs],eax
pop eax
 
cmp [lines.scr],0
jle .exit
 
cmp eax,ebx
jle @f
xchg eax,ebx
@@: cmp eax,[cur_editor.TopLeft.Y]
jge @f
mov eax,[cur_editor.TopLeft.Y]
@@: mov ecx,[cur_editor.TopLeft.Y]
add ecx,[lines.scr]
cmp ebx,ecx
jl @f
dec ecx
mov ebx,ecx
@@: cmp eax,ebx
jg .exit
 
mov ecx,eax
push eax
call get_line_offset
 
.start:
mov ecx,ebx
sub ecx,eax
inc ecx
 
mov ebx,[top_ofs]
add ebx,[left_ofs-2]
sub eax,[cur_editor.TopLeft.Y]
imul eax,LINEH
add ebx,eax
 
imul ebp,[cur_editor.TopLeft.X],6*65536
mov [draw_blines],0
 
jmp draw_editor_text.next_line
 
.exit:
popad
ret
endf
 
;-----------------------------------------------------------------------------
func draw_editor_text ;///// DRAW EDITOR TEXT ////////////////////////////////
;-----------------------------------------------------------------------------
cmp [cur_editor.Lines],0
344,6 → 428,7
jge @f
ret
@@:
mov ebp,cur_editor
call init_sel_vars
call check_bottom_right
 
360,7 → 445,7
mov ebx,[top_ofs]
add ebx,[left_ofs-2]
 
mov ecx,[cur_editor.TopLeft.Y] ;! ecx,[top_line]
mov ecx,[cur_editor.TopLeft.Y]
push ecx
call get_line_offset
 
371,7 → 456,8
jle .exit
add esp,-4
 
imul ebp,[cur_editor.TopLeft.X],6*65536 ;! ebp,[left_col],6*65536
imul ebp,[cur_editor.TopLeft.X],6*65536
mov [draw_blines],1
 
.next_line:
 
381,7 → 467,6
shl ecx,16
mov cl,LINEH
mov ebx,[cur_editor.Bounds.Right]
;sub ebx,[cur_editor.Bounds.Left]
add ebx,-SCRLW
add ebx,[left_ofs-2]
sub ebx,[left_ofs]
389,7 → 474,7
 
; selection (text background)
mov [in_sel],0
mov edx,[color_tbl+4*5]
mov edx,[color_tbl.back]
mov eax,[esp+4*2]
cmp eax,[sel.begin.y]
jl .lp6
402,7 → 487,7
cmp eax,[sel.end.y]
je .lp5
.lp2: mov eax,[sel.begin.x]
sub eax,[cur_editor.TopLeft.X] ;! eax,[left_col]
sub eax,[cur_editor.TopLeft.X]
jle .lp6.2
cmp eax,[columns.scr]
jge .lp6
414,7 → 499,7
add ebx,[left_ofs]
add ebx,-2
rol ebx,16
mov edx,[color_tbl+4*7]
mov edx,[color_tbl.back.sel]
mcall 13
popad
mov bx,ax
424,7 → 509,7
cmp eax,[sel.end.y]
je .lp5
.lp4: mov eax,[sel.end.x]
sub eax,[cur_editor.TopLeft.X] ;! eax,[left_col]
sub eax,[cur_editor.TopLeft.X]
jle .lp6
cmp eax,[columns.scr]
jg .lp6.2
432,7 → 517,7
pushad
sub bx,ax
rol ebx,16
add eax,[left_ofs];OLEFT-1
add eax,[left_ofs]
add eax,-2
mov bx,ax
rol ebx,16
439,11 → 524,11
mcall 13
popad
inc eax
mov edx,[color_tbl+4*7]
mov edx,[color_tbl.back.sel]
mov bx,ax
mov [in_sel],3
jmp .lp6
.lp5: mov eax,[cur_editor.TopLeft.X] ;! eax,[left_col]
.lp5: mov eax,[cur_editor.TopLeft.X]
cmp eax,[sel.begin.x]
jge .lp4
add eax,[columns.scr]
452,7 → 537,7
mov eax,[sel.begin.x]
cmp eax,[sel.end.x]
je .lp6
sub eax,[cur_editor.TopLeft.X] ;! eax,[left_col]
sub eax,[cur_editor.TopLeft.X]
imul eax,6
pushad
mov ebx,[sel.end.x]
463,7 → 548,7
add eax,[left_ofs]
mov bx,ax
rol ebx,16
mov edx,[color_tbl+4*7]
mov edx,[color_tbl.back.sel]
mcall 13
movzx eax,bx
sar ebx,16
475,7 → 560,7
add ax,word[left_ofs]
add ax,-2
mov bx,ax
mov edx,[color_tbl+4*5]
mov edx,[color_tbl.back]
mcall 13
popad
mov bx,ax
483,7 → 568,7
jmp .lp6
 
.lp6.2:
mov edx,[color_tbl+4*7]
mov edx,[color_tbl.back.sel]
inc [in_sel]
.lp6:
mcall 13
491,13 → 576,13
lodsd
 
pushad
mov edx,[color_tbl+4*5]
mov edx,[color_tbl.back]
test eax,0x00010000
jz @f
mov edx,[color_tbl+4*8]
mov edx,[color_tbl.line.moded]
test eax,0x00020000
jz @f
mov edx,[color_tbl+4*9]
mov edx,[color_tbl.line.saved]
@@: mov ebx,[left_ofs]
 
add ebx,-LCHGW-2;-4
513,12 → 598,12
or eax,eax
ja .next_block
add esp,4*2
jmp .exit ; .draw_cursor
jmp .exit
 
.next_block:
 
push esi ecx
call get_next_part
call .get_next_part
pop ebx
 
push ecx
526,30 → 611,28
 
push esi ebx
mov eax,ebx
sub ebx,[cur_editor.TopLeft.X] ;! ebx,[left_col]
sub ebx,[cur_editor.TopLeft.X]
cmp ebx,[columns.scr]
jge .skip_t
add ebx,esi
jle .skip_t
mov ebx,[esp+8+4*2] ;// 4*2=esi+ebx
sub eax,[cur_editor.TopLeft.X] ;! eax,[left_col]
sub eax,[cur_editor.TopLeft.X]
jge .qqq
sub edx,eax
add esi,eax
; mov eax,OLEFT*65536
xor eax,eax
jmp .qqq2
.qqq:
; inc eax
imul eax,6*65536
.qqq2:
and ebx,0x0000FFFF
add eax,[left_ofs-2];OLEFT*65536
add eax,[left_ofs-2]
add ebx,eax
 
mov eax,[esp] ; ebx
add eax,[esp+4] ; esi
sub eax,[cur_editor.TopLeft.X] ;! eax,[left_col]
sub eax,[cur_editor.TopLeft.X]
sub eax,[columns.scr]
jle .qweqwe
sub esi,eax
573,7 → 656,7
mov esi,[sel.begin.x]
sub esi,[esp]
pushad
mov ecx,[cur_editor.TopLeft.X] ;! ecx,[left_col]
mov ecx,[cur_editor.TopLeft.X]
sub ecx,[esp+4*8]
jle @f
sub esi,ecx
585,7 → 668,7
add bx,si
rol ebx,16
mov esi,eax
mov ecx,[color_tbl+4*6]
mov ecx,[color_tbl.text.sel]
mcall 4
popad
jmp .draw_t
603,7 → 686,7
sub eax,[esp]
push ebx
mov ebx,[esp+4]
sub ebx,[cur_editor.TopLeft.X] ;! ebx,[left_col]
sub ebx,[cur_editor.TopLeft.X]
jge .ya2.1
add eax,ebx
.ya2.1:
610,7 → 693,7
pop ebx
pushad
mov esi,eax
mov ecx,[color_tbl+4*6]
mov ecx,[color_tbl.text.sel]
mcall 4
popad
sub esi,eax
635,7 → 718,7
sub esi,[esp]
push eax
mov eax,[esp+4]
sub eax,[cur_editor.TopLeft.X] ;! eax,[left_col]
sub eax,[cur_editor.TopLeft.X]
jge .nt3.1
add esi,eax
.nt3.1:
647,7 → 730,7
add ebx,esi
mov esi,[sel.end.x]
sub esi,[sel.begin.x]
mov ecx,[color_tbl+4*6]
mov ecx,[color_tbl.text.sel]
sub eax,esi
push eax
mcall 4
665,17 → 748,17
cmp eax,[sel.end.x]
jge .ya2
;---[ block inside selection ]-----------------(-
.ya4: mov ecx,[color_tbl+4*6]
.ya4: mov ecx,[color_tbl.text.sel]
;----------------------------------------------)-
 
.draw_t:
mcall 4;[esp+8]
mcall 4
.skip_t:
pop eax eax ; ebx esi
imul eax,6
add [esp+4*2+2],ax
pop ecx esi
cmp ecx,[cur_line_len];LINE_WIDTH
cmp ecx,[cur_line_len]
jl .next_block
 
pop ebx ecx
682,7 → 765,7
and ebx,0x0000FFFF
add ebx,[left_ofs-2]
add ebx,LINEH
add esi,[cur_line_len];LINE_WIDTH
add esi,[cur_line_len]
inc dword[esp]
dec ecx
jg .next_line
689,6 → 772,8
 
.exit:
 
cmp [draw_blines],0
je .exit.2
mov eax,[cur_editor.Bounds.Left]
add eax,[cur_editor.Gutter.Width]
inc eax
697,7 → 782,7
mov bx,word[cur_editor.Bounds.Right]
sub bx,ax
add ebx,-SCRLW
mov edx,[color_tbl+4*5]
mov edx,[color_tbl.back]
mov eax,13
mov ecx,[esp-8]
add ecx,LINEH
719,6 → 804,7
add ecx,-(SCRLW-1)*65536+SCRLW-1
mcall
 
.exit.2:
popad
add esp,4
ret
725,6 → 811,124
endf
 
;-----------------------------------------------------------------------------
func draw_editor_text.get_next_part ;/////////////////////////////////////////
;-----------------------------------------------------------------------------
; Input:
; ECX = current letter
; ESI = string
; Output:
; ECX = color
; EDX = string
; ESI = length
;-----------------------------------------------------------------------------
cmp [cur_editor.AsmMode],0
je .plain.text
xor ebx,ebx
mov edx,ecx
add esi,ecx
mov edi,symbols
mov al,[esi]
cmp al,';'
je .comment
mov ecx,symbols.size
repne scasb
je .symbol
cmp al,'$'
jne @f
mov edi,symbols
mov al,[esi+1]
mov ecx,symbols.size
repne scasb
je .not_symbol
jmp .number
@@: cmp al,'0'
jb @f
cmp al,'9'
jbe .number
@@: cmp al,"'"
je .string
cmp al,'"'
je .string
.not_symbol:
inc ebx
inc edx
cmp edx,[cur_line_len]
jge @f
mov edi,symbols
mov al,[esi+ebx]
cmp al,';'
je @f
mov ecx,symbols.size
repne scasb
jne .not_symbol
@@: mov ecx,edx
mov edx,esi
mov esi,ebx
mov eax,[color_tbl.text]
ret
.symbol:
inc ebx
inc edx
cmp edx,[cur_line_len]
jge @f
mov edi,symbols
mov al,[esi+ebx]
mov ecx,symbols.size
repne scasb
je .symbol
@@: mov ecx,edx
mov edx,esi
mov esi,ebx
mov eax,[color_tbl.symbol]
ret
.comment:
neg edx
add edx,[cur_line_len]
xchg edx,esi
mov ecx,[cur_line_len]
mov eax,[color_tbl.comment]
ret
.number:
inc ebx
inc edx
cmp edx,[cur_line_len]
jge @f
mov edi,symbols
mov al,[esi+ebx]
cmp al,';'
je @f
mov ecx,symbols.size
repne scasb
jne .number
@@: mov ecx,edx
mov edx,esi
mov esi,ebx
mov eax,[color_tbl.number]
ret
.string:
inc ebx
inc edx
cmp edx,[cur_line_len]
jge @f
cmp [esi+ebx],al
jne .string
inc ebx
inc edx
@@:
mov ecx,edx
mov edx,esi
mov esi,ebx
mov eax,[color_tbl.string]
ret
.plain.text:
mov edx,[cur_line_len]
xchg edx,esi
mov ecx,[cur_line_len]
mov eax,[color_tbl.text]
ret
endf
 
;-----------------------------------------------------------------------------
func draw_editor_caret ;///// DRAW EDITOR TEXT CARET /////////////////////////
;-----------------------------------------------------------------------------
cmp [bot_mode],0
781,3 → 985,188
pop ecx ebx
ret
endf
 
REDRAW_TEXT = 00000001b
REDRAW_HSCROLL = 00000010b
REDRAW_VSCROLL = 00000100b
REDRAW_ONELINE = 00001000b
REDRAW_TWOLINES = 00010000b
 
;-----------------------------------------------------------------------------
func editor_check_for_changes ;///// EDITOR CHANGES CHECKER //////////////////
;-----------------------------------------------------------------------------
call .check_cursor_visibility
 
xor edx,edx
 
mov eax,[cur_editor.TopLeft.Y]
cmp eax,[checker_ed.TopLeft.Y]
je @f
or dl,REDRAW_TEXT+REDRAW_VSCROLL
@@: mov eax,[cur_editor.TopLeft.X]
cmp eax,[checker_ed.TopLeft.X]
je @f
or dl,REDRAW_TEXT+REDRAW_HSCROLL
@@: or dl,dl
jnz .redraw
 
mov eax,[cur_editor.Caret.Y]
cmp eax,[checker_ed.Caret.Y]
je @f
or dl,REDRAW_TWOLINES
@@: mov eax,[cur_editor.Caret.X]
cmp eax,[checker_ed.Caret.X]
je @f
or dl,REDRAW_ONELINE
@@: mov ebp,cur_editor
call init_sel_vars
mov al,[sel.selected]
mov ebp,checker_ed
call init_sel_vars
cmp al,[sel.selected]
je @f
cmp al,0
je .clear_sel
jmp .draw_sel
@@: cmp al,0
jne .redraw_sel
 
or dl,dl
jz .exit
test dl,REDRAW_TWOLINES
jz .one_line
push edx
mov eax,[checker_ed.Caret.Y]
mov ebx,eax
call draw_editor_text.part
pop edx
.one_line:
mov eax,[cur_editor.Caret.Y]
mov ebx,eax
call draw_editor_text.part
call draw_editor_caret
jmp .exit
 
.clear_sel:
;// use checker_ed
mov eax,[sel.begin.y]
mov ebx,[sel.end.y]
push eax ebx
call draw_editor_text.part
pop edx ecx
mov eax,[cur_editor.Caret.Y]
cmp eax,ecx
jb @f
cmp eax,edx
jbe .lp1
@@: mov ebx,eax
call draw_editor_text.part
.lp1: call draw_editor_caret
jmp .exit
 
.draw_sel:
;// use cur_editor
mov ebp,cur_editor
call init_sel_vars
mov eax,[sel.begin.y]
mov ebx,[sel.end.y]
push eax ebx
call draw_editor_text.part
pop edx ecx
mov eax,[checker_ed.Caret.Y]
cmp eax,ecx
jb @f
cmp eax,edx
jbe .lp2
@@: mov ebx,eax
call draw_editor_text.part
.lp2: call draw_editor_caret
jmp .exit
 
.redraw_sel:
;// use checker_ed and cur_editor
mov eax,[checker_ed.Caret.Y]
mov ebx,[cur_editor.Caret.Y]
cmp eax,ebx
jb @f
xchg eax,ebx
@@: call draw_editor_text.part
call draw_editor_caret
jmp .exit
 
.redraw:
push edx
call draw_editor_gutter
call draw_editor_text
call draw_editor_caret
test byte[esp],REDRAW_VSCROLL
jz @f
call draw_editor_vscroll
@@: pop edx
test dl,REDRAW_HSCROLL
jz @f
call draw_editor_hscroll
@@: jmp .exit
 
.exit:
mov esi,cur_editor
mov edi,checker_ed
mov ecx,sizeof.EDITOR/4
cld
rep movsd
ret
 
.check_cursor_visibility:
push eax ebx
.chk_y:
mov eax,[cur_editor.Caret.Y]
or eax,eax
jge @f
mov [cur_editor.Caret.Y],0
jmp .chk_dy
@@: cmp eax,[cur_editor.Lines.Count]
jl .chk_dy
mov eax,[cur_editor.Lines.Count]
dec eax
mov [cur_editor.Caret.Y],eax
.chk_dy:
mov eax,[cur_editor.TopLeft.Y]
cmp eax,[cur_editor.Caret.Y]
jle @f
m2m [cur_editor.TopLeft.Y],[cur_editor.Caret.Y]
@@: add eax,[lines.scr]
cmp eax,[cur_editor.Caret.Y]
jg .chk_x
mov eax,[cur_editor.Caret.Y]
sub eax,[lines.scr]
inc eax
mov [cur_editor.TopLeft.Y],eax
.chk_x:
mov eax,[cur_editor.Caret.X]
or eax,eax
jge @f
mov [cur_editor.Caret.X],0
jmp .chk_dx
@@: cmp eax,[cur_editor.Columns.Count]
jl .chk_dx
mov eax,[cur_editor.Columns.Count]
mov [cur_editor.Caret.X],eax
.chk_dx:
mov eax,[cur_editor.TopLeft.X]
cmp eax,[cur_editor.Caret.X]
jle @f
m2m [cur_editor.TopLeft.X],[cur_editor.Caret.X]
@@: add eax,[columns.scr]
cmp eax,[cur_editor.Caret.X]
jg @f
mov eax,[cur_editor.Caret.X]
sub eax,[columns.scr]
inc eax
mov [cur_editor.TopLeft.X],eax
@@: cmp [mev],MEV_LDOWN
jne @f
push [cur_editor.Caret.X] [cur_editor.Caret.Y]
pop [cur_editor.SelStart.Y] [cur_editor.SelStart.X]
@@: pop ebx eax
ret
endf