diff16 'tp-editor.asm',0,$ ;----------------------------------------------------------------------------- proc draw_editor ;///// DRAW EDITOR ////////////////////////////////////////// ;----------------------------------------------------------------------------- mov ebx,[cur_editor.Bounds.Left-2] mov bx,word[cur_editor.Bounds.Right] sub bx,word[cur_editor.Bounds.Left] inc ebx mov ecx,[cur_editor.Bounds.Top-2] mov cx,word[cur_editor.Bounds.Bottom] sub cx,word[cur_editor.Bounds.Top] inc ecx mov edx,[cl_3d_inset] call draw_framerect mov [cur_editor.Gutter.Visible],0 test [line_nums],1 jnz @f xor eax,eax jmp .lp1 @@: inc [cur_editor.Gutter.Visible] mov edi,p_info+100 mov eax,[cur_editor.Lines.Count] mov ecx,10 call uint2str lea eax,[edi-p_info-100] cmp eax,3 jae @f mov eax,3 @@: imul eax,[charWidth] add eax,8 .lp1: mov [cur_editor.Gutter.Width],eax mov [left_ofs],eax mov eax,[cur_editor.Bounds.Right] sub eax,[cur_editor.Bounds.Left] sub eax,[cur_editor.Gutter.Width] sub eax,SCRLW+LCHGW+4 js .exit cdq mov ebx,[charWidth] div ebx mov [columns.scr],eax mov eax,[cur_editor.Bounds.Bottom] sub eax,[cur_editor.Bounds.Top] sub eax,SCRLW+3 js .exit cdq mov ebx,[lineHeight] div ebx mov [lines.scr],eax call draw_editor_gutter call draw_editor_vscroll call draw_editor_hscroll call draw_editor_text call draw_editor_caret .exit: ret endp ;----------------------------------------------------------------------------- proc draw_editor_gutter ;///// DRAW EDITOR GUTTER (LEFT PANEL) /////////////// ;----------------------------------------------------------------------------- cmp [cur_editor.Gutter.Visible],0 je .exit add esp,-4*8*2 mov ebx,[cur_editor.Bounds.Left-2] mov bx,word[cur_editor.Gutter.Width] add ebx,0x00010000 mov ecx,[cur_editor.Bounds.Top-2] mov cx,word[cur_editor.Bounds.Bottom] sub cx,word[cur_editor.Bounds.Top] add cx,-SCRLW add ecx,0x00010000 dec cx mcall 13,,,[cl_3d_normal] add bx,word[cur_editor.Bounds.Left] push bx shl ebx,16 pop bx add ecx,[cur_editor.Bounds.Top] mcall 38,,,[cl_3d_inset] add ebx,-2*65536 mov bx,word[cur_editor.Bounds.Top] add bx,3 mov edi,[sc.work_text] mov ecx,[cur_editor.TopLeft.Y] inc ecx mov edx,p_info+100 @@: pushad push eax edx edi mov eax,ecx mov ecx,10 mov edi,edx call uint2str mov esi,edi pop edi edx eax sub esi,edx mov eax,esi imul eax,[charWidth] shl eax,16 sub ebx,eax mov cl, [scale] shl ecx,24 or ecx,edi mcall 4 popad add ebx,[lineHeight] inc ecx cmp ecx,[cur_editor.Lines.Count] jg @f mov esi,ecx sub esi,[cur_editor.TopLeft.Y] cmp esi,[lines.scr] jbe @b @@: add esp,4*8*2 .exit: ret endp ;----------------------------------------------------------------------------- proc draw_editor_vscroll ;///// DRAW EDITOR VERTICAL SCROLL BAR ////////////// ;----------------------------------------------------------------------------- mov ebx,[cur_editor.Bounds.Right] shl ebx,16 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 sar ebx,16 sar ecx,16 push ebx ecx SCRLW SCRLW call draw_3d_panel popad mov eax,8 pushad push 0x18 shr ecx,16 mov bx,cx add ebx,(SCRLW/2-2)*65536+SCRLW/2-3 mcall 4,,[sc.work_text],esp,1 add esp,4 popad 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 sar ebx,16 sar ecx,16 push ebx ecx SCRLW SCRLW call draw_3d_panel popad mov eax,8 pushad push 0x19 shr ecx,16 mov bx,cx add ebx,(SCRLW/2-2)*65536+SCRLW/2-3 mcall 4,,[sc.work_text],esp,1 add esp,4 popad push ebx mov eax,[cur_editor.Lines.Count] mov ebx,[lines.scr] mov ecx,[cur_editor.TopLeft.Y] mov edx,[cur_editor.Bounds.Bottom] sub edx,[cur_editor.Bounds.Top] add edx,-SCRLW*3;+1 call get_scroll_vars mov [cur_editor.VScroll.Top],eax mov [cur_editor.VScroll.Size],ebx pop ebx mov ecx,eax add ecx,[cur_editor.Bounds.Top] add ecx,SCRLW+1 pushad sar ebx,16 push ebx ecx SCRLW [cur_editor.VScroll.Size] dec dword[esp] call draw_3d_panel popad mov eax,13 add ebx,1*65536-1 mov ecx,[cur_editor.Bounds.Top-2] mov cx,word[cur_editor.VScroll.Top] add ecx,(SCRLW+1)*65536 mov edx,[sc.work] or cx,cx jle @f mcall 13 @@: mov ecx,[cur_editor.Bounds.Top] add ecx,[cur_editor.VScroll.Top] add ecx,[cur_editor.VScroll.Size] add ecx,SCRLW+1 mov di,cx shl ecx,16 mov cx,word[cur_editor.Bounds.Bottom] sub cx,di sub cx,SCRLW*2;+1 jle @f mcall @@: rol ebx,16 dec bx push bx rol ebx,16 pop bx mov ecx,[cur_editor.Bounds.Top-2] mov cx,word[cur_editor.Bounds.Bottom] add ecx,(SCRLW)*65536-SCRLW*2-1 mcall 38,,,[cl_3d_inset] ret endp ;----------------------------------------------------------------------------- proc draw_editor_hscroll ;///// DRAW EDITOR HORIZONTAL SCROLL BAR //////////// ;----------------------------------------------------------------------------- mov ebx,[cur_editor.Bounds.Left-2] mov bx,SCRLW 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 sar ebx,16 sar ecx,16 push ebx ecx SCRLW SCRLW call draw_3d_panel popad pushad push 0x1B shr ecx,16 mov bx,cx add ebx,(SCRLW/2-2)*65536+SCRLW/2-3 mcall 4,,[sc.work_text],esp,1 add esp,4 popad 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 sar ebx,16 sar ecx,16 push ebx ecx SCRLW SCRLW call draw_3d_panel popad pushad push 0x1A shr ecx,16 mov bx,cx add ebx,(SCRLW/2-2)*65536+SCRLW/2-3 mcall 4,,[sc.work_text],esp,1 add esp,4 popad push ecx mov eax,[cur_editor.Columns.Count] mov ebx,[columns.scr] mov ecx,[cur_editor.TopLeft.X] mov edx,[cur_editor.Bounds.Right] sub edx,[cur_editor.Bounds.Left] add edx,-(SCRLW*3) call get_scroll_vars mov [cur_editor.HScroll.Top],eax mov [cur_editor.HScroll.Size],ebx pop ecx mov ebx,eax add ebx,[cur_editor.Bounds.Left] add ebx,SCRLW+1 shl ebx,16 mov bx,word[cur_editor.HScroll.Size] pushad sar ecx,16 rol ebx,16 movsx eax,bx sar ebx,16 dec ebx push eax ecx ebx SCRLW call draw_3d_panel popad add ecx,1*65536-1 mov ebx,[cur_editor.Bounds.Left-2] mov bx,word[cur_editor.Bounds.Left] mov bx,word[cur_editor.HScroll.Top] add ebx,(1+SCRLW)*65536 mcall 13,,,[sc.work] mov ebx,[cur_editor.Bounds.Left] add ebx,1+SCRLW add ebx,[cur_editor.HScroll.Top] add ebx,[cur_editor.HScroll.Size] mov di,bx shl ebx,16 mov bx,word[cur_editor.Bounds.Right] sub bx,di sub bx,SCRLW*2 jle @f mcall @@: mov ebx,[cur_editor.Bounds.Left-2] mov bx,word[cur_editor.Bounds.Right] add ebx,(SCRLW)*65536-SCRLW*2-1 rol ecx,16 dec cx push cx rol ecx,16 pop cx mcall 38,,,[cl_3d_inset] ret endp ;----------------------------------------------------------------------------- proc 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,[lineHeight] 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,[lineHeight] add ebx,eax imul ebp,[cur_editor.TopLeft.X],6*65536 mov [draw_blines],0 jmp draw_editor_text.next_line .exit: popad ret endp ;----------------------------------------------------------------------------- proc draw_editor_text ;///// DRAW EDITOR TEXT //////////////////////////////// ;----------------------------------------------------------------------------- cmp [cur_editor.Lines],0 jne @f ret @@: mov eax,[cur_editor.Bounds.Bottom] sub eax,[cur_editor.Bounds.Top] cmp eax,[lineHeight] jge @f ret @@: mov ebp,cur_editor call init_sel_vars call check_bottom_right pushad 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 mov ebx,[top_ofs] add ebx,[left_ofs-2] mov ecx,[cur_editor.TopLeft.Y] push ecx call get_line_offset .start: add esp,4 mov ecx,[lines.scr] or ecx,ecx jle .exit add esp,-4 imul ebp,[cur_editor.TopLeft.X],6*65536 mov [draw_blines],1 .next_line: push ecx ebx mov ecx,ebx shl ecx,16 mov cl,byte[lineHeight] mov ebx,[cur_editor.Bounds.Right] add ebx,-SCRLW add ebx,[left_ofs-2] sub ebx,[left_ofs] add ebx,-2*65536+2 ; selection (text background) mov [in_sel],0 mov edx,[color_tbl.back] mov eax,[esp+4*2] cmp eax,[sel.begin.y] jl .lp6 je .lp1 cmp eax,[sel.end.y] jg .lp6 je .lp3 jmp .lp6.2 .lp1: mov eax,[sel.begin.y] cmp eax,[sel.end.y] je .lp5 .lp2: mov eax,[sel.begin.x] sub eax,[cur_editor.TopLeft.X] jle .lp6.2 cmp eax,[columns.scr] jge .lp6 imul eax,[charWidth] pushad sub bx,ax rol ebx,16 mov bx,ax add ebx,[left_ofs] add ebx,-2 rol ebx,16 mov edx,[color_tbl.back.sel] mcall 13 popad mov bx,ax mov [in_sel],2 jmp .lp6 .lp3: mov eax,[sel.begin.y] cmp eax,[sel.end.y] je .lp5 .lp4: mov eax,[sel.end.x] sub eax,[cur_editor.TopLeft.X] jle .lp6 cmp eax,[columns.scr] jg .lp6.2 imul eax,[charWidth] pushad sub bx,ax rol ebx,16 add eax,[left_ofs] add eax,-2 mov bx,ax rol ebx,16 mcall 13 popad inc eax mov edx,[color_tbl.back.sel] mov bx,ax mov [in_sel],3 jmp .lp6 .lp5: mov eax,[cur_editor.TopLeft.X] cmp eax,[sel.begin.x] jge .lp4 add eax,[columns.scr] cmp eax,[sel.end.x] jl .lp2 mov eax,[sel.begin.x] cmp eax,[sel.end.x] je .lp6 sub eax,[cur_editor.TopLeft.X] imul eax,[charWidth] pushad mov ebx,[sel.end.x] sub ebx,[sel.begin.x] imul ebx,[charWidth] sal ebx,16 dec eax add eax,[left_ofs] mov bx,ax rol ebx,16 mov edx,[color_tbl.back.sel] mcall 13 movzx eax,bx sar ebx,16 add eax,ebx mov ebx,eax sal ebx,16 sub ax,[esp+4*4] neg ax add ax,word[left_ofs] add ax,-2 mov bx,ax mov edx,[color_tbl.back] mcall 13 popad mov bx,ax mov [in_sel],4 jmp .lp6 .lp6.2: mov edx,[color_tbl.back.sel] inc [in_sel] .lp6: mcall 13 pushad mov edx,[color_tbl.back] test [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED jz @f mov edx,[color_tbl.line.moded] test [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_SAVED jz @f mov edx,[color_tbl.line.saved] @@: mov ebx,[left_ofs] add ebx,-LCHGW-2;-4 shl ebx,16 mov bx,LCHGW mcall 13 popad xor ecx,ecx mov eax,[esi+EDITOR_LINE_DATA.Size] mov [cur_line_len],eax add esi,sizeof.EDITOR_LINE_DATA or eax,eax ja .next_block add esp,4*2 jmp .exit .next_block: push esi ecx call .get_next_part pop ebx push ecx mov cl, [scale] shl ecx,24 or ecx,eax push esi ebx mov eax,ebx 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] jge .qqq sub edx,eax add esi,eax xor eax,eax jmp .qqq2 .qqq: imul eax,[charWidth] shl eax,16 .qqq2: and ebx,0x0000FFFF add eax,[left_ofs-2] add ebx,eax mov eax,[esp] ; ebx add eax,[esp+4] ; esi sub eax,[cur_editor.TopLeft.X] sub eax,[columns.scr] jle .qweqwe sub esi,eax .qweqwe: mov al,[in_sel] cmp al,0 je .draw_t dec al jz .ya4 .nt1: dec al jnz .nt2 mov eax,[esp] cmp eax,[sel.begin.x] jge .ya4 add eax,[esp+4] cmp eax,[sel.begin.x] jl .draw_t ;---[ selection crosses block from the right ]-(- .ya1: mov eax,esi mov esi,[sel.begin.x] sub esi,[esp] pushad mov ecx,[cur_editor.TopLeft.X] sub ecx,[esp+4*8] jle @f sub esi,ecx sub [esp+4],ecx @@: sub eax,esi add edx,esi imul esi,[charWidth] rol ebx,16 add bx,si rol ebx,16 mov esi,eax mov cl, [scale] shl ecx,24 or ecx,[color_tbl.text.sel] mcall 4 popad jmp .draw_t ;----------------------------------------------)- .nt2: dec al jnz .nt3 mov eax,[esp] cmp eax,[sel.end.x] jge .draw_t add eax,[esp+4] cmp eax,[sel.end.x] jl .ya4 ;---[ selection crosses block from the left ]--(- .ya2: mov eax,[sel.end.x] sub eax,[esp] push ebx mov ebx,[esp+4] sub ebx,[cur_editor.TopLeft.X] jge .ya2.1 add eax,ebx .ya2.1: pop ebx pushad mov esi,eax mov cl, [scale] shl ecx,24 or ecx,[color_tbl.text.sel] mcall 4 popad sub esi,eax add edx,eax imul eax,[charWidth] shl eax,16 add ebx,eax jmp .draw_t ;----------------------------------------------)- .nt3: mov eax,[esp] cmp eax,[sel.end.x] jge .draw_t cmp eax,[sel.begin.x] jge @f add eax,[esp+4] cmp eax,[sel.begin.x] jl .draw_t cmp eax,[sel.end.x] jl .ya1 ;---[ selection inside block ]-----------------(- mov eax,esi mov esi,[sel.begin.x] sub esi,[esp] push eax mov eax,[esp+4] sub eax,[cur_editor.TopLeft.X] jge .nt3.1 add esi,eax .nt3.1: pop eax sub eax,esi pushad add edx,esi imul esi,[charWidth] shl esi,16 add ebx,esi mov esi,[sel.end.x] sub esi,[sel.begin.x] mov cl, [scale] shl ecx,24 or ecx,[color_tbl.text.sel] sub eax,esi push eax mcall 4 add edx,esi imul esi,[charWidth] shl esi,16 add ebx,esi pop esi mov ecx,[esp+4*6] mcall 4 popad jmp .draw_t ;----------------------------------------------)- @@: add eax,esi dec eax cmp eax,[sel.end.x] jge .ya2 ;---[ block inside selection ]-----------------(- .ya4: mov cl, [scale] shl ecx,24 or ecx,[color_tbl.text.sel] ;----------------------------------------------)- .draw_t: mcall 4 .skip_t: pop eax eax ; ebx esi imul eax,[charWidth] add [esp+4*2+2],ax pop ecx esi cmp ecx,[cur_line_len] jl .next_block pop ebx ecx and ebx,0x0000FFFF add ebx,[left_ofs-2] add ebx,[lineHeight] add esi,[cur_line_len] inc dword[esp] dec ecx jg .next_line .exit: cmp [draw_blines],0 je .exit.2 mov eax,[cur_editor.Bounds.Left] add eax,[cur_editor.Gutter.Width] inc eax mov ebx,eax shl ebx,16 mov bx,word[cur_editor.Bounds.Right] sub bx,ax add ebx,-SCRLW mov edx,[color_tbl.back] mov eax,13 mov ecx,[esp-8] add ecx,[lineHeight] shl ecx,16 mov cx,word[cur_editor.Bounds.Bottom] sub cx,[esp-8] sub cx,word[lineHeight] sub cx,SCRLW js @f mcall @@: mov ecx,[cur_editor.Bounds.Top-2] mov cx,2 add ecx,0x00010000 mcall mov ebx,[cur_editor.Bounds.Right] mov ecx,[cur_editor.Bounds.Bottom] shl ebx,16 shl ecx,16 add ebx,-(SCRLW-1)*65536+SCRLW-1 add ecx,-(SCRLW-1)*65536+SCRLW-1 mcall .exit.2: popad add esp,4 ret endp ;----------------------------------------------------------------------------- proc 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 endp ;----------------------------------------------------------------------------- proc draw_editor_caret ;///// DRAW EDITOR TEXT CARET ///////////////////////// ;----------------------------------------------------------------------------- cmp [bot_mode],0 jne @f mov ebx,[cur_editor.Caret.X] sub ebx,[cur_editor.TopLeft.X] js @f cmp ebx,[columns.scr] ja @f imul ebx,[charWidth] add ebx,[left_ofs] dec ebx push bx shl ebx,16 pop bx mov eax,[cur_editor.Caret.Y] sub eax,[cur_editor.TopLeft.Y] js @f cmp eax,[lines.scr] jge @f imul eax,[lineHeight] add eax,[top_ofs] mov esi,eax shl esi,16 add eax,[lineHeight] sub eax,2 mov si,ax mov ecx,2 cmp [ins_mode],0 jne .lp8 add cl,4 .lp8: push ecx mcall 38,,esi,0x01000000 add ebx,0x00010001 pop ecx loop .lp8 @@: ret endp ;----------------------------------------------------------------------------- proc editor_realloc_lines ;///// ADD $DELTA$ TO LINES SIZE /////////////////// ;----------------------------------------------------------------------------- ; EAX = delta ;----------------------------------------------------------------------------- push ebx ecx mov ebx,[cur_editor.Lines.Size] add ebx,eax mov eax,[cur_editor.Lines] mov [cur_editor.Lines.Size],ebx mov ecx,eax stdcall mem.ReAlloc,eax,ebx mov [cur_editor.Lines],eax sub eax,ecx pop ecx ebx ret endp REDRAW_TEXT = 00000001b REDRAW_HSCROLL = 00000010b REDRAW_VSCROLL = 00000100b REDRAW_ONELINE = 00001000b REDRAW_TWOLINES = 00010000b ;----------------------------------------------------------------------------- proc editor_check_for_changes ;///// EDITOR CHANGES CHECKER ////////////////// ;----------------------------------------------------------------------------- call .check_cursor_visibility .direct: xor edx,edx mov ecx,[cur_editor.Caret.Y] call get_line_offset call get_real_length mov ecx,eax mov eax,[cur_editor.Lines.Count] cmp eax,[checker_ed.Lines.Count] je @f or dl,REDRAW_TEXT+REDRAW_VSCROLL+REDRAW_HSCROLL @@: 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 cmp ecx,[checker_ed_ll] je @f mov [checker_ed_ll],ecx or dl,REDRAW_ONELINE @@: 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: mov [checker_ed_ll],ecx 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 endp