; flat editor interface for Win32 IDE ; Copyright (c) 2001-2014, Tomasz Grysztar. ; All rights reserved. SEGMENT_LENGTH = 100h BLOCK_LENGTH = 400h * SEGMENT_LENGTH SEGMENT_HEADER_LENGTH = 16 SEGMENT_DATA_LENGTH = SEGMENT_LENGTH - SEGMENT_HEADER_LENGTH include '../version.inc' WM_MOUSEHWHEEL = 0x0000020E proc FlatEditor hwnd,wmsg,wparam,lparam locals editor_style dd ? label editor_data include '../variable.inc' editor_font dd ? font_width dd ? font_height dd ? font_overhang dd ? screen_base dd ? screen_offset dd ? screen_width dd ? screen_height dd ? screen_size dd ? line_buffer dd ? line_buffer_size dd ? background_color dd ? text_color dd ? selection_background dd ? selection_text dd ? syntax_proc dd ? syntax_colors dd ? caret_x dd ? caret_y dd ? pan_x dw ? pan_y dw ? menu_handle dd ? menu_window dd ? current_operation db ? last_operation db ? was_selection db ? mouse_select db ? focus db ? macro_operation db ? editor_data_size = $ - editor_data if editor_data_size > SEGMENT_DATA_LENGTH err end if return_value dd ? background_brush dd ? selection_brush dd ? line_number dd ? ps PAINTSTRUCT tm TEXTMETRIC sc SCROLLINFO gestureconfig GESTURECONFIG gestureinfo GESTUREINFO point POINT rect RECT size SIZE char dd ? kbstate rb 100h line_selection db ? clipboard_opened db ? redraw_now db ? notification db ? endl push ebx esi edi invoke GetWindowLong,[hwnd],GWL_STYLE mov [editor_style],eax cmp [wmsg],WM_CREATE je wm_create cmp [wmsg],WM_GETDLGCODE je wm_getdlgcode invoke GetWindowLong,[hwnd],0 or eax,eax jz defwndproc mov [editor_memory],eax lea esi,[eax+SEGMENT_HEADER_LENGTH] lea edi,[editor_data] mov ecx,editor_data_size rep movsb test [editor_style],ES_READONLY jz editor_mode_ok or [editor_mode],FEMODE_READONLY editor_mode_ok: mov [return_value],0 mov [notification],0 mov [redraw_now],0 mov [clipboard_opened],0 cmp [wmsg],WM_DESTROY je wm_destroy cmp [wmsg],WM_PAINT je wm_paint cmp [wmsg],WM_HSCROLL je wm_hscroll cmp [wmsg],WM_VSCROLL je wm_vscroll cmp [wmsg],WM_GESTURE je wm_gesture cmp [wmsg],WM_SIZE je wm_size mov eax,[selection_line] or eax,eax jz no_selection cmp eax,[caret_line] jne selection_present mov eax,[selection_position] cmp eax,[caret_position] je no_selection selection_present: mov [was_selection],1 jmp selection_status_ok no_selection: mov [was_selection],0 selection_status_ok: xor al,al xchg [current_operation],al mov [last_operation],al mov eax,[wmsg] cmp eax,WM_SETFOCUS je wm_setfocus cmp eax,WM_KILLFOCUS je wm_killfocus cmp eax,WM_KEYDOWN je wm_keydown cmp eax,WM_SYSKEYDOWN je wm_syskeydown cmp eax,WM_CHAR je wm_char cmp eax,WM_LBUTTONDOWN je wm_lbuttondown cmp eax,WM_LBUTTONUP je wm_lbuttonup cmp eax,WM_MOUSEMOVE je wm_mousemove cmp eax,WM_LBUTTONDBLCLK je wm_lbuttondblclk cmp eax,WM_MOUSEWHEEL je wm_mousewheel cmp eax,WM_MOUSEHWHEEL je wm_mousehwheel cmp eax,WM_RBUTTONDOWN je wm_rbuttondown cmp eax,WM_COPY je wm_copy cmp eax,WM_CUT je wm_cut cmp eax,WM_PASTE je wm_paste cmp eax,WM_CLEAR je wm_clear cmp eax,WM_SETTEXT je wm_settext cmp eax,WM_GETTEXTLENGTH je wm_gettextlength cmp eax,WM_GETTEXT je wm_gettext cmp eax,WM_SETFONT je wm_setfont cmp eax,WM_GETFONT je wm_getfont cmp eax,WM_UNDO je wm_undo cmp eax,EM_UNDO je wm_undo cmp eax,EM_CANUNDO je em_canundo cmp eax,FEM_REDO je fem_redo cmp eax,FEM_CANREDO je fem_canredo cmp eax,EM_EMPTYUNDOBUFFER je em_emptyundobuffer cmp eax,EM_REPLACESEL je em_replacesel cmp eax,FEM_SETMODE je fem_setmode cmp eax,FEM_GETMODE je fem_getmode cmp eax,FEM_SETSYNTAXHIGHLIGHT je fem_setsyntaxhighlight cmp eax,FEM_SETRIGHTCLICKMENU je fem_setrightclickmenu cmp eax,FEM_GETLINELENGTH je fem_getlinelength cmp eax,FEM_GETLINE je fem_getline cmp eax,FEM_SETPOS je fem_setpos cmp eax,FEM_GETPOS je fem_getpos cmp eax,FEM_FINDFIRST je fem_findfirst cmp eax,FEM_FINDNEXT je fem_findnext cmp eax,FEM_CANFINDNEXT je fem_canfindnext cmp eax,FEM_GETWORDATCARET je fem_getwordatcaret cmp eax,FEM_SETTEXTCOLOR je fem_settextcolor cmp eax,FEM_SETSELCOLOR je fem_setselcolor cmp eax,FEM_BEGINOPERATION je fem_beginoperation cmp eax,FEM_ENDOPERATION je fem_endoperation cmp eax,FEM_MARKUNMODIFIED je fem_setunmodified cmp eax,FEM_ISUNMODIFIED je fem_isunmodified cmp eax,FEM_GETSEARCHTEXT je fem_getsearchtext cmp eax,FEM_GETSEARCHFLAGS je fem_getsearchflags cmp eax,FEM_RELEASESEARCH je fem_releasesearch defwndproc: invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam] jmp finish_wndproc wm_create: call init_editor_memory jc create_failed invoke SetWindowLong,[hwnd],0,[editor_memory] mov [syntax_proc],SyntaxProc mov [syntax_colors],0 mov [macro_operation],0 mov [current_operation],0 mov [focus],0 mov [mouse_select],0 mov [menu_handle],0 mov eax,SEGMENT_DATA_LENGTH*2 mov [line_buffer_size],eax invoke VirtualAlloc,0,eax,MEM_COMMIT,PAGE_READWRITE or eax,eax jz create_failed mov [line_buffer],eax mov [screen_base],0 invoke GetSysColor,COLOR_WINDOW mov [background_color],eax invoke GetSysColor,COLOR_WINDOWTEXT mov [text_color],eax invoke GetSysColor,COLOR_HIGHLIGHT mov [selection_background],eax invoke GetSysColor,COLOR_HIGHLIGHTTEXT mov [selection_text],eax mov eax,[fedit_font] mov [editor_font],eax invoke GetDC,[hwnd] mov ebx,eax invoke SelectObject,ebx,[editor_font] lea edi,[char] mov byte [edi],20h lea eax,[size] invoke GetTextExtentPoint32,ebx,edi,1,eax lea eax,[tm] invoke GetTextMetrics,ebx,eax mov eax,[size.cy] mov [font_height],eax mov eax,[size.cx] mov [font_width],eax mov ecx,[tm.tmMaxCharWidth] sub ecx,eax mov [font_overhang],ecx invoke ReleaseDC,[hwnd],ebx mov [return_value],0 cmp [SetGestureConfig],0 je done mov [gestureconfig.dwID],GID_PAN mov [gestureconfig.dwWant],GC_PAN+GC_PAN_WITH_SINGLE_FINGER_VERTICALLY+GC_PAN_WITH_SINGLE_FINGER_HORIZONTALLY+GC_PAN_WITH_INERTIA mov [gestureconfig.dwBlock],0 lea edx,[gestureconfig] invoke SetGestureConfig,[hwnd],0,1,edx,sizeof.GESTURECONFIG jmp done create_failed: or eax,-1 jmp finish_wndproc wm_destroy: invoke VirtualFree,[line_buffer],0,MEM_RELEASE invoke VirtualFree,[screen_base],0,MEM_RELEASE call release_search_data call release_editor_memory invoke SetWindowLong,[hwnd],0,0 xor eax,eax jmp finish_wndproc wm_getdlgcode: mov eax,DLGC_WANTCHARS+DLGC_WANTARROWS jmp finish_wndproc wm_paint: lea eax,[rect] invoke GetUpdateRect,[hwnd],eax,FALSE or eax,eax jz finish_wndproc cmp [screen_base],0 je finish_wndproc lea eax,[ps] invoke BeginPaint,[hwnd],eax mov ebx,eax invoke CreateSolidBrush,[background_color] mov [background_brush],eax invoke CreateSolidBrush,[selection_background] mov [selection_brush],eax invoke SelectObject,ebx,[editor_font] mov esi,[screen_base] add esi,[screen_offset] mov eax,[screen_width] mul [screen_height] lea edi,[esi+eax] mov [rect.top],0 mov eax,[font_height] mov [rect.bottom],eax mov ecx,[screen_height] paint_screen: push ecx mov [rect.left],0 mov ecx,[screen_width] paint_line: cmp byte [esi],0 je paint_empty_block mov edx,1 mov al,[edi] get_characters_block: cmp edx,ecx je get_color cmp al,[edi+edx] jne get_color cmp byte [esi+edx],0 je get_color inc edx jmp get_characters_block paint_empty_block: mov edx,1 test byte [edi],80h jnz get_empty_selection get_empty_block: cmp edx,ecx je fill_empty_block cmp byte [esi+edx],0 jne fill_empty_block test byte [edi+edx],80h jnz fill_empty_block inc edx jmp get_empty_block fill_empty_block: push ecx edx mov eax,[font_width] mul edx add eax,[rect.left] mov [rect.right],eax lea eax,[rect] invoke FillRect,ebx,eax,[background_brush] jmp paint_next_block get_empty_selection: cmp edx,ecx je fill_empty_selection cmp byte [esi+edx],0 jne fill_empty_selection test byte [edi+edx],80h jz fill_empty_selection inc edx jmp get_empty_selection fill_empty_selection: push ecx edx mov eax,[font_width] mul edx add eax,[rect.left] mov [rect.right],eax lea eax,[rect] invoke FillRect,ebx,eax,[selection_brush] jmp paint_next_block get_color: push ecx edx test byte [edi],80h jnz highlight_color invoke SetBkColor,ebx,[background_color] mov al,[edi] or al,al jnz syntax_color default_color: invoke SetTextColor,ebx,[text_color] jmp color_ok syntax_color: movzx eax,al mov edx,[syntax_colors] or edx,edx jz default_color mov eax,[edx+(eax-1)*4] invoke SetTextColor,ebx,eax jmp color_ok highlight_color: invoke SetBkColor,ebx,[selection_background] invoke SetTextColor,ebx,[selection_text] color_ok: mov ecx,[esp] mov eax,[font_width] mul ecx add eax,[rect.left] mov [rect.right],eax lea eax,[rect] invoke DrawText,ebx,esi,ecx,eax,DT_LEFT+DT_NOPREFIX+DT_SINGLELINE paint_next_block: pop edx ecx sub ecx,edx add esi,edx add edi,edx mov eax,[rect.right] mov [rect.left],eax or ecx,ecx jnz paint_line mov eax,[font_height] add [rect.top],eax add [rect.bottom],eax pop ecx dec ecx jnz paint_screen invoke DeleteObject,[background_brush] invoke DeleteObject,[selection_brush] lea eax,[ps] invoke EndPaint,[hwnd],eax xor eax,eax jmp finish_wndproc wm_setfocus: or [focus],-1 call create_caret mov [notification],FEN_SETFOCUS cmp [was_selection],0 je done jmp moved_window wm_killfocus: mov [focus],0 invoke DestroyCaret mov [notification],FEN_KILLFOCUS cmp [was_selection],0 je done jmp moved_window wm_hscroll: mov [sc.cbSize],sizeof.SCROLLINFO mov [sc.fMask],SIF_ALL lea eax,[sc] invoke GetScrollInfo,[hwnd],SB_HORZ,eax movzx eax,word [wparam] cmp eax,SB_LINEUP je hscroll_left cmp eax,SB_LINEDOWN je hscroll_right cmp eax,SB_THUMBTRACK je hscroll_pos cmp eax,SB_PAGEUP je hscroll_wleft cmp eax,SB_PAGEDOWN je hscroll_wright hscroll_ignore: jmp done hscroll_left: cmp [window_position],0 je hscroll_ignore dec [window_position] jmp moved_window hscroll_right: mov eax,[maximum_position] sub eax,[sc.nPage] cmp [window_position],eax jge hscroll_ignore inc [window_position] jmp moved_window hscroll_pos: movzx eax,word [wparam+2] mov [window_position],eax jmp moved_window hscroll_wleft: mov eax,[sc.nPage] sub [window_position],eax jnc moved_window mov [window_position],0 jmp moved_window hscroll_wright: mov eax,[sc.nPage] mov ecx,[maximum_position] sub ecx,eax add [window_position],eax cmp [window_position],ecx jbe moved_window mov [window_position],ecx jmp moved_window wm_vscroll: mov [sc.cbSize],sizeof.SCROLLINFO mov [sc.fMask],SIF_ALL lea eax,[sc] invoke GetScrollInfo,[hwnd],SB_VERT,eax movzx eax,word [wparam] cmp eax,SB_LINEUP je vscroll_up cmp eax,SB_LINEDOWN je vscroll_down cmp eax,SB_THUMBTRACK je vscroll_pos cmp eax,SB_PAGEUP je vscroll_pageup cmp eax,SB_PAGEDOWN je vscroll_pagedown vscroll_ignore: jmp done vscroll_up: mov esi,[window_line] mov esi,[esi+4] or esi,esi jz vscroll_ignore dec [window_line_number] mov [window_line],esi jmp moved_window vscroll_down: mov eax,[sc.nPos] add eax,[sc.nPage] cmp eax,[sc.nMax] ja vscroll_ignore mov esi,[window_line] vscroll_skip_line: mov esi,[esi] btr esi,0 jc vscroll_skip_line or esi,esi jz vscroll_ignore inc [window_line_number] mov [window_line],esi jmp moved_window vscroll_pos: mov eax,[sc.nTrackPos] call find_line or esi,esi jz vscroll_ignore mov [window_line],esi mov [window_line_number],ecx jmp moved_window vscroll_pageup: mov esi,[window_line] mov ecx,[sc.nPage] scrolling_up: mov eax,[esi+4] or eax,eax jz scroll_ok dec [window_line_number] mov esi,eax loop scrolling_up jmp scroll_ok vscroll_pagedown: mov esi,[window_line] mov eax,[sc.nPos] add eax,[sc.nPage] mov ecx,[sc.nMax] sub ecx,eax inc ecx cmp ecx,[sc.nPage] jbe scrolling_down mov ecx,[sc.nPage] scrolling_down: mov eax,esi scroll_one_line: mov eax,[eax] test eax,eax jz scroll_ok btr eax,0 jc scroll_one_line or eax,eax jz scroll_ok inc [window_line_number] mov esi,eax loop scrolling_down scroll_ok: mov [window_line],esi jmp moved_window wm_gesture: cmp [GetGestureInfo],0 je defwndproc mov [gestureinfo.cbSize],sizeof.GESTUREINFO lea edx,[gestureinfo] invoke GetGestureInfo,[lparam],edx test eax,eax jz defwndproc cmp [gestureinfo.dwID],GID_PAN jne defwndproc invoke CloseGestureInfoHandle,[lparam] mov eax,[gestureinfo.dwFlags] test eax,GF_BEGIN jnz begin_panning mov ax,[gestureinfo.ptsLocation.x] sub ax,[pan_x] cwde cdq idiv [font_width] sub [gestureinfo.ptsLocation.x],dx sub [window_position],eax cmp [window_position],0 jl horizontal_home jmp horizontal_pan_ok horizontal_home: mov [window_position],0 horizontal_pan_ok: mov ax,[gestureinfo.ptsLocation.y] sub ax,[pan_y] cwde cdq idiv [font_height] sub [gestureinfo.ptsLocation.y],dx mov ecx,eax mov eax,dword [gestureinfo.ptsLocation] mov dword [pan_x],eax mov esi,[window_line] cmp ecx,0 jz moved_window jg scrolling_up neg ecx jmp scrolling_down begin_panning: mov eax,dword [gestureinfo.ptsLocation] mov dword [pan_x],eax jmp done wm_mousewheel: test [editor_style],FES_TIMESCROLL jz space_scroll lea ebx,[kbstate] invoke GetKeyboardState,ebx test [kbstate+VK_MENU],80h jz space_scroll test [kbstate+VK_CONTROL],80h jnz time_scroll space_scroll: mov esi,[window_line] mov ecx,[wheel_scroll_lines] cmp ecx,-1 jne calculate_scroll mov [sc.cbSize],sizeof.SCROLLINFO mov [sc.fMask],SIF_PAGE push eax lea eax,[sc] invoke GetScrollInfo,[hwnd],SB_VERT,eax pop eax mov ecx,[sc.nPage] calculate_scroll: mov eax,[wparam] sar eax,16 imul ecx mov ecx,120 idiv ecx mov ecx,eax cmp ecx,0 jg scrolling_up neg ecx jnz scrolling_down jmp done time_scroll: test [editor_mode],FEMODE_READONLY jnz ignore test [editor_mode],FEMODE_NOUNDO jnz enable_undo move_through_time: cmp word [wparam+2],0 jge backward_in_time neg word [wparam+2] jmp forward_in_time backward_in_time: sub word [wparam+2],120 jc time_scroll_done mov eax,[undo_data] test eax,eax jz time_scroll_done call undo_changes jmp backward_in_time forward_in_time: sub word [wparam+2],120 jc time_scroll_done mov eax,[redo_data] test eax,eax jz time_scroll_done call redo_changes jmp forward_in_time time_scroll_done: call create_caret mov [last_operation],0 jmp text_changed wm_mousehwheel: lea eax,[sc] invoke GetScrollInfo,[hwnd],SB_HORZ,eax mov esi,[window_line] cmp [wparam],0 jl hscroll_left jg hscroll_right jmp done wm_size: call update_positions mov eax,[screen_width] mul [screen_height] mov [screen_size],eax mov [screen_offset],0 shl eax,2 or eax,eax jz screen_allocated mov ebx,eax mov eax,[screen_base] or eax,eax jz screen_released invoke VirtualFree,eax,0,MEM_RELEASE screen_released: invoke VirtualAlloc,0,ebx,MEM_COMMIT,PAGE_READWRITE screen_allocated: mov [screen_base],eax call update_screen lea ebx,[rect] invoke GetClientRect,[hwnd],ebx invoke InvalidateRect,[hwnd],ebx,FALSE jmp done wm_keydown: lea ebx,[kbstate] invoke GetKeyboardState,ebx cmp [was_selection],0 jne process_key mov eax,[caret_line] mov [selection_line],eax mov eax,[caret_position] mov [selection_position],eax mov eax,[caret_line_number] mov [selection_line_number],eax process_key: mov eax,[wparam] cmp eax,VK_LEFT je left_key cmp eax,VK_RIGHT je right_key cmp eax,VK_UP je up_key cmp eax,VK_DOWN je down_key cmp eax,VK_BACK je backspace_key cmp eax,VK_HOME je home_key cmp eax,VK_END je end_key cmp eax,VK_PGUP je pgup_key cmp eax,VK_PGDN je pgdn_key cmp eax,VK_APPS je menu_key cmp eax,VK_INSERT je ins_key cmp eax,VK_DELETE je del_key cmp eax,VK_F6 je f6_key test [kbstate+VK_CONTROL],80h jz convert_to_ascii cmp eax,'Y' je ctrl_y_key convert_to_ascii: mov ax,word [lparam+2] and eax,7Fh lea ebx,[kbstate] lea edx,[char] invoke ToAscii,[wparam],eax,ebx,edx,FALSE cmp eax,2 je two_characters or eax,eax jz ignore jg process_character test [editor_style],FES_REVIVEDEADKEYS je ignore lea edx,[char] invoke ToAscii,VK_SPACE,0,ebx,edx,FALSE jmp process_character two_characters: movzx eax,byte [char+1] invoke PostMessage,[hwnd],WM_CHAR,eax,1 shl 31 process_character: mov al,byte [char] cmp al,20h jae character cmp al,0Dh je character cmp al,9 je character jmp ignore left_key: test [kbstate+VK_MENU],80h jnz scroll_left test [kbstate+VK_CONTROL],80h jnz word_left cmp [caret_position],0 jle moved_caret dec [caret_position] jmp moved_caret right_key: test [kbstate+VK_MENU],80h jnz scroll_right test [kbstate+VK_CONTROL],80h jnz word_right mov eax,[caret_position] cmp eax,[maximum_position] jae moved_caret inc [caret_position] jmp moved_caret up_key: test [kbstate+VK_MENU],80h jnz scroll_up call move_line_up jmp moved_caret down_key: test [kbstate+VK_MENU],80h jnz scroll_down call move_line_down jmp moved_caret home_key: test [kbstate+VK_CONTROL],80h jnz screen_home mov [caret_position],0 jmp moved_caret end_key: test [kbstate+VK_CONTROL],80h jnz screen_end call move_to_line_end jmp moved_caret screen_home: mov eax,[window_line] mov [caret_line],eax mov eax,[window_line_number] mov [caret_line_number],eax jmp moved_caret screen_end: mov eax,[window_line_number] add eax,[window_height] dec eax call find_line mov [caret_line],esi mov [caret_line_number],ecx jmp moved_caret pgup_key: test [kbstate+VK_CONTROL],80h jnz text_home call move_page_up jmp moved_caret pgdn_key: test [kbstate+VK_CONTROL],80h jnz text_end call move_page_down jmp moved_caret text_home: mov eax,[first_line] mov [caret_line],eax mov [caret_line_number],1 jmp moved_caret text_end: or eax,-1 call find_line mov [caret_line],esi mov [caret_line_number],ecx jmp moved_caret word_left: call move_to_previous_word jmp moved_caret word_right: call get_caret_segment call move_to_next_word jmp moved_caret scroll_left: cmp [window_position],0 je scroll_done dec [window_position] jmp scroll_done scroll_right: inc [window_position] jmp scroll_done scroll_up: mov esi,[window_line] mov esi,[esi+4] or esi,esi jz scroll_done mov [window_line],esi dec [window_line_number] jmp scroll_done scroll_down: mov esi,[window_line] find_next_window_line: mov esi,[esi] btr esi,0 jc find_next_window_line or esi,esi jz scroll_done mov [window_line],esi inc [window_line_number] scroll_done: cmp [was_selection],0 jne moved_window mov [selection_line],0 jmp moved_window ins_key: test [kbstate+VK_MENU],80h jnz switch_blocks test [kbstate+VK_CONTROL],80h jnz wm_copy test [kbstate+VK_SHIFT],80h jnz wm_paste xor [editor_mode],FEMODE_OVERWRITE mov [notification],FEN_MODECHANGE call create_caret cmp [was_selection],1 je done mov [selection_line],0 jmp done del_key: test [editor_mode],FEMODE_READONLY jnz ignore test [kbstate+VK_CONTROL],80h jnz wm_clear test [kbstate+VK_SHIFT],80h jnz wm_cut cmp [was_selection],0 je no_selection_on_del test [editor_style],FES_SECURESEL jz wm_clear no_selection_on_del: mov esi,[caret_line] test [editor_mode],FEMODE_OVERWRITE jnz delete_char call check_line_length cmp ecx,[caret_position] ja delete_char cmp dword [esi],0 je ignore call make_undopoint call cut_line_break call finish_edit jmp text_altered delete_char: mov [current_operation],VK_DELETE cmp [last_operation],VK_DELETE jne undopoint_for_delete mov eax,[unmodified_state] cmp eax,[undo_data] jne undo_delete_ok or [unmodified_state],-1 undopoint_for_delete: call make_undopoint undo_delete_ok: call delete_character call finish_edit jmp text_altered backspace_key: test [editor_mode],FEMODE_READONLY jnz ignore test [kbstate+VK_MENU],80h jnz undo_key cmp [was_selection],0 je no_selection_to_clear test [editor_style],FES_SECURESEL jz wm_clear no_selection_to_clear: cmp [caret_position],0 je line_back test [kbstate+VK_CONTROL],80h jnz word_back mov [current_operation],VK_BACK cmp [last_operation],VK_BACK jne backspace_undopoint mov eax,[unmodified_state] cmp eax,[undo_data] jne undo_backspace_ok or [unmodified_state],-1 jmp undo_backspace_ok backspace_undopoint: call make_undopoint undo_backspace_ok: dec [caret_position] call delete_character call finish_edit jmp text_altered line_back: test [editor_mode],FEMODE_OVERWRITE jnz ignore mov esi,[caret_line] mov esi,[esi+4] or esi,esi jz ignore call make_undopoint mov [caret_line],esi dec [caret_line_number] call check_line_length mov [caret_position],ecx call cut_line_break call finish_edit jmp text_altered word_back: call make_undopoint push [caret_position] mov esi,[caret_line] xor eax,eax xchg eax,[esi+4] push eax call move_to_previous_word pop eax mov esi,[caret_line] mov [esi+4],eax pop ecx sub ecx,[caret_position] call delete_from_line call finish_edit jmp text_altered character: test [editor_mode],FEMODE_READONLY jnz ignore cmp al,0Dh je enter_key cmp al,9 je tab_key cmp [was_selection],0 je no_selection_to_replace call make_undopoint test [editor_style],FES_SECURESEL jnz character_undo_ok push eax call delete_block pop eax call put_character call finish_edit jmp text_altered no_selection_to_replace: mov [current_operation],VK_SPACE cmp [last_operation],VK_SPACE jne character_undopoint mov edx,[unmodified_state] cmp edx,[undo_data] jne character_undo_ok or [unmodified_state],-1 jmp character_undo_ok character_undopoint: call make_undopoint character_undo_ok: call put_character call finish_edit jmp text_altered tab_key: test [editor_mode],FEMODE_READONLY jnz ignore call make_undopoint cmp [was_selection],0 je tab_securesel test [editor_style],FES_SECURESEL jnz tab_securesel call delete_block tab_securesel: call tabulate call finish_edit jmp text_altered enter_key: test [editor_mode],FEMODE_READONLY jnz ignore call make_undopoint cmp [was_selection],0 je enter_secureselection_ok test [editor_style],FES_SECURESEL jnz enter_secureselection_ok call delete_block enter_secureselection_ok: call carriage_return test [editor_mode],FEMODE_OVERWRITE jnz text_altered call finish_edit jmp text_altered ctrl_y_key: test [editor_mode],FEMODE_READONLY jnz ignore call make_undopoint call remove_line jmp text_altered f6_key: test [editor_mode],FEMODE_READONLY jnz ignore call make_undopoint call duplicate_line jmp text_altered menu_key: cmp [menu_handle],0 je ignore lea ebx,[point] mov eax,[caret_x] mov [ebx+POINT.x],eax mov eax,[caret_y] add eax,[font_height] mov [ebx+POINT.y],eax invoke ClientToScreen,[hwnd],ebx invoke TrackPopupMenu,[menu_handle],TPM_RIGHTBUTTON,[ebx+POINT.x],[ebx+POINT.y],0,[menu_window],0 jmp ignore wm_syskeydown: lea ebx,[kbstate] invoke GetKeyboardState,ebx mov eax,[wparam] cmp eax,VK_INSERT je switch_blocks cmp eax,VK_LEFT je scroll_left cmp eax,VK_RIGHT je scroll_right cmp eax,VK_UP je scroll_up cmp eax,VK_DOWN je scroll_down cmp eax,VK_BACK je undo_key mov al,[last_operation] mov [current_operation],al jmp defwndproc switch_blocks: xor [editor_mode],FEMODE_VERTICALSEL mov [notification],FEN_MODECHANGE cmp [was_selection],0 je ignore jmp moved_window wm_char: test [lparam],1 shl 31 jz ignore mov eax,[wparam] jmp character wm_lbuttondown: cmp [focus],0 jne focus_ok invoke SetFocus,[hwnd] mov esi,[editor_memory] add esi,SEGMENT_HEADER_LENGTH lea edi,[editor_data] mov ecx,editor_data_size rep movsb focus_ok: lea ebx,[kbstate] invoke GetKeyboardState,ebx cmp [was_selection],0 jne selection_ok mov eax,[caret_line] mov [selection_line],eax mov eax,[caret_position] mov [selection_position],eax mov eax,[caret_line_number] mov [selection_line_number],eax selection_ok: call get_mouse_position invoke SetCapture,[hwnd] or [mouse_select],-1 jmp moved_caret get_mouse_position: mov ax,word [lparam] cwde cdq test [editor_style],FES_CONSOLECARET jnz get_mouse_column test [editor_mode],FEMODE_OVERWRITE jnz get_mouse_column mov ebx,[font_width] shr ebx,1 adc eax,ebx get_mouse_column: idiv [font_width] add eax,[window_position] cmp eax,[maximum_position] jg mouse_out_of_line cmp eax,0 jge click_position_ok xor eax,eax jmp click_position_ok mouse_out_of_line: mov eax,[maximum_position] click_position_ok: mov [caret_position],eax mov ax,word [lparam+2] cwde cdq idiv [font_height] add eax,[window_line_number] cmp eax,0 jg click_line_ok mov eax,1 click_line_ok: call find_line mov [caret_line],esi mov [caret_line_number],ecx retn wm_lbuttonup: invoke ReleaseCapture mov [mouse_select],0 jmp done wm_mousemove: cmp [mouse_select],0 je ignore cmp [was_selection],0 jne select mov eax,[caret_line] mov ebx,[caret_line_number] mov [selection_line],eax mov [selection_line_number],ebx mov eax,[caret_position] mov [selection_position],eax select: call get_mouse_position jmp moved_selection wm_lbuttondblclk: mov [mouse_select],0 call get_mouse_position call get_word_at_caret mov [selection_position],edx add edx,ecx mov [caret_position],edx mov eax,[caret_line] mov [selection_line],eax mov eax,[caret_line_number] mov [selection_line_number],eax jmp moved_selection wm_rbuttondown: cmp [menu_handle],0 je ignore lea eax,[point] invoke GetCursorPos,eax invoke TrackPopupMenu,[menu_handle],TPM_RIGHTBUTTON,[point.x],[point.y],0,[menu_window],0 jmp ignore wm_copy: cmp [was_selection],0 je ignore call copy_to_clipboard jmp ignore copy_to_clipboard: call get_block_length inc ecx invoke GlobalAlloc,GMEM_MOVEABLE+GMEM_DDESHARE,ecx mov ebx,eax invoke GlobalLock,ebx mov edi,eax push ebx call copy_block pop ebx invoke GlobalUnlock,ebx invoke OpenClipboard,[hwnd] invoke EmptyClipboard invoke SetClipboardData,CF_TEXT,ebx or eax,eax jz copy_failed invoke CloseClipboard retn copy_failed: invoke GlobalFree,ebx retn wm_cut: test [editor_mode],FEMODE_READONLY jnz ignore cmp [was_selection],0 je ignore call copy_to_clipboard wm_clear: test [editor_mode],FEMODE_READONLY jnz ignore cmp [was_selection],0 je ignore call make_undopoint call delete_block mov [selection_line],0 jmp text_changed wm_paste: test [editor_mode],FEMODE_READONLY jnz ignore call make_undopoint cmp [was_selection],0 je paste_secureselection_ok test [editor_style],FES_SECURESEL jnz paste_secureselection_ok call delete_block paste_secureselection_ok: invoke OpenClipboard,NULL invoke GetClipboardData,CF_TEXT or eax,eax jnz do_paste invoke CloseClipboard jmp ignore do_paste: or [clipboard_opened],-1 push eax invoke GlobalLock,dword [esp] mov esi,eax call insert_block jc paste_failed pop ebx invoke GlobalUnlock,ebx invoke CloseClipboard mov [clipboard_opened],0 test [editor_style],FES_SECURESEL jz no_selection_after_paste mov eax,[caret_line] mov ecx,[caret_line_number] mov edx,[caret_position] xchg eax,[selection_line] xchg ecx,[selection_line_number] xchg edx,[selection_position] mov [caret_line],eax mov [caret_line_number],ecx mov [caret_position],edx jmp text_changed no_selection_after_paste: mov [selection_line],0 jmp text_changed paste_failed: call undo_changes pop ebx invoke GlobalUnlock,ebx invoke CloseClipboard mov [clipboard_opened],0 jmp text_changed wm_settext: mov esi,[lparam] call set_text mov [return_value],TRUE jmp text_changed wm_gettextlength: mov esi,[first_line] count_text_length: mov eax,[esi+8] add [return_value],eax skip_counted_line_segments: mov esi,[esi] or esi,esi jz ignore btr esi,0 jc skip_counted_line_segments add [return_value],2 jmp count_text_length wm_gettext: mov esi,[first_line] mov edi,[lparam] sub [wparam],1 jc ignore mov [line_number],0 copy_text: inc [line_number] mov ecx,[esi+8] test [editor_style],FES_OPTIMALFILL jz direct_copy cmp ecx,8 jb direct_copy push edi ecx mov edi,[line_buffer] xor edx,edx call copy_from_line push esi mov esi,[line_buffer] mov edi,[line_buffer] add edi,[peak_line_length] mov ebx,edi mov ecx,[esp+4] xor al,al rep stosb mov ecx,[esp+4] invoke syntax_proc,esi,ecx,ebx pop esi ecx edi mov eax,[return_value] add eax,ecx cmp eax,[wparam] jbe optimal_fill_size_ok mov ecx,[wparam] sub eax,[return_value] optimal_fill_size_ok: push esi edi mov esi,[line_buffer] mov ebx,[peak_line_length] jecxz optimal_fill_done xor edx,edx optimal_fill: lodsb cmp al,20h jne store_character cmp byte [esi-1+ebx],0 jne store_character mov eax,esi sub eax,[line_buffer] test eax,111b jz store_tab inc edx mov al,20h stosb loop optimal_fill jmp optimal_fill_done store_tab: mov al,20h or edx,edx jz store_character sub edi,edx mov al,9 store_character: stosb xor edx,edx loop optimal_fill optimal_fill_done: pop eax neg eax add eax,edi add [return_value],eax pop esi jmp line_copied direct_copy: mov eax,[return_value] add eax,ecx cmp eax,[wparam] jbe direct_copy_size_ok mov ecx,[wparam] sub eax,[return_value] direct_copy_size_ok: add [return_value],ecx xor edx,edx call copy_from_line line_copied: or esi,esi jz text_copied mov ecx,[return_value] add ecx,2 cmp ecx,[wparam] ja text_copied mov ax,0A0Dh stosw mov [return_value],ecx cmp ecx,[wparam] jne copy_text text_copied: xor al,al stosb jmp ignore fem_getlinelength: mov esi,[caret_line] mov eax,[wparam] or eax,eax jz return_length call find_line cmp ecx,[wparam] je return_length or [return_value],-1 jmp ignore return_length: mov ecx,[esi+8] mov [return_value],ecx jmp ignore fem_getline: mov esi,[caret_line] mov eax,[wparam] or eax,eax jz get_line_contents call find_line cmp ecx,[wparam] jne ignore get_line_contents: mov ecx,[esi+8] mov [return_value],ecx mov edi,[lparam] xor edx,edx call copy_from_line xor al,al stosb jmp ignore wm_setfont: mov esi,[wparam] or esi,esi jnz get_metrics mov esi,[fedit_font] get_metrics: invoke GetDC,[hwnd] mov ebx,eax invoke SelectObject,ebx,esi lea edi,[char] mov byte [edi],20h lea eax,[size] invoke GetTextExtentPoint32,ebx,edi,1,eax lea eax,[tm] invoke GetTextMetrics,ebx,eax invoke ReleaseDC,[hwnd],ebx test [tm.tmPitchAndFamily],TMPF_FIXED_PITCH jnz ignore mov [return_value],esi mov [editor_font],esi mov eax,[size.cy] mov [font_height],eax mov eax,[size.cx] mov [font_width],eax mov ecx,[tm.tmMaxCharWidth] sub ecx,eax mov [font_overhang],ecx mov eax,[lparam] mov [redraw_now],al cmp [focus],0 je wm_size call create_caret jmp wm_size wm_getfont: mov eax,[editor_font] cmp eax,[fedit_font] je ignore mov [return_value],eax jmp ignore wm_undo: test [editor_mode],FEMODE_READONLY jnz ignore test [editor_mode],FEMODE_NOUNDO jnz enable_undo mov eax,[undo_data] test eax,eax jz ignore call undo_changes call create_caret mov [last_operation],0 jmp text_changed enable_undo: and [editor_mode],not FEMODE_NOUNDO jmp ignore em_canundo: test [editor_mode],FEMODE_READONLY jnz ignore mov eax,[undo_data] or eax,eax jz ignore mov [return_value],TRUE jmp ignore undo_key: test [kbstate+VK_SHIFT],80h jz wm_undo fem_redo: test [editor_mode],FEMODE_READONLY jnz ignore cmp [redo_data],0 je ignore call redo_changes call create_caret mov [last_operation],0 jmp text_changed fem_canredo: test [editor_mode],FEMODE_READONLY jnz ignore mov eax,[redo_data] or eax,eax jz ignore mov [return_value],TRUE jmp ignore fem_isunmodified: mov eax,[undo_data] cmp eax,[unmodified_state] jne ignore mov [return_value],TRUE jmp ignore em_emptyundobuffer: call clear_redo_data call clear_undo_data jmp ignore fem_setunmodified: mov eax,[undo_data] mov [unmodified_state],eax jmp ignore em_replacesel: test [editor_mode],FEMODE_VERTICALSEL + FEMODE_OVERWRITE + FEMODE_READONLY jnz ignore cmp [undo_data],0 je replacesel_undopoint cmp [wparam],0 je replace_undo_ok replacesel_undopoint: call make_undopoint replace_undo_ok: cmp [was_selection],0 je simple_replace push [caret_line_number] push [caret_position] call delete_block pop edx ecx cmp ecx,[caret_line_number] jne simple_replace cmp edx,[caret_position] jne simple_replace mov esi,[lparam] call insert_block mov esi,[caret_line] mov ecx,[caret_line_number] mov edx,[caret_position] xchg esi,[selection_line] xchg ecx,[selection_line_number] xchg edx,[selection_position] mov [caret_line],esi mov [caret_line_number],ecx mov [caret_position],edx jmp text_changed simple_replace: mov esi,[lparam] call insert_block jmp text_changed fem_setmode: mov eax,[wparam] xchg [editor_mode],eax cmp eax,[editor_mode] je ignore mov [notification],FEN_MODECHANGE call create_caret cmp [was_selection],0 jne moved_window jmp done fem_getmode: mov eax,[editor_mode] mov [return_value],eax jmp ignore fem_setsyntaxhighlight: mov eax,[wparam] mov ebx,[lparam] mov [syntax_colors],eax mov [syntax_proc],ebx or eax,eax jnz wm_size mov [syntax_proc],SyntaxProc jmp wm_size fem_setrightclickmenu: mov eax,[wparam] mov ebx,[lparam] mov [menu_handle],eax mov [menu_window],ebx jmp ignore fem_settextcolor: mov eax,[wparam] mov ebx,[lparam] mov [text_color],eax mov [background_color],ebx jmp wm_size fem_setselcolor: mov eax,[wparam] mov ebx,[lparam] mov [selection_text],eax mov [selection_background],ebx jmp wm_size fem_setpos: mov edi,[wparam] virtual at edi pos FEPOS end virtual cmp [selection_line],0 jne selection_current_ok mov eax,[caret_line] mov [selection_line],eax mov eax,[caret_line_number] mov [selection_line_number],eax mov eax,[caret_position] mov [selection_position],eax selection_current_ok: mov eax,[pos.selectionLine] or eax,eax jz selection_line_ok call find_line mov [selection_line],esi mov [selection_line_number],ecx selection_line_ok: mov eax,[pos.selectionPosition] sub eax,1 jc selection_position_set mov [selection_position],eax selection_position_set: mov eax,[pos.caretLine] or eax,eax jz caret_line_ok call find_line mov [caret_line],esi mov [caret_line_number],ecx caret_line_ok: mov eax,[pos.caretPosition] sub eax,1 jc moved_selection mov [caret_position],eax jmp moved_selection fem_getpos: mov edi,[wparam] mov eax,[caret_line_number] mov [pos.selectionLine],eax mov [pos.caretLine],eax mov eax,[caret_position] inc eax mov [pos.selectionPosition],eax mov [pos.caretPosition],eax cmp [selection_line],0 je ignore mov eax,[selection_line_number] mov [pos.selectionLine],eax mov eax,[selection_position] inc eax mov [pos.selectionPosition],eax jmp ignore fem_findfirst: mov esi,[lparam] mov eax,[wparam] call find_first jnc show_found_text jmp ignore fem_findnext: call find_next jc ignore show_found_text: mov [return_value],TRUE cmp [macro_operation],0 jne moved_selection mov eax,[caret_position] xchg eax,[selection_position] mov [caret_position],eax call update_window call let_caret_appear call update_positions mov eax,[caret_position] xchg eax,[selection_position] mov [caret_position],eax jmp moved_selection fem_getsearchtext: call get_search_text_length mov edx,[lparam] jc store_required_buffer_size inc ecx cmp ecx,[edx] ja store_required_buffer_size mov edi,[wparam] call get_search_text mov [return_value],TRUE jmp ignore store_required_buffer_size: mov [edx],ecx jmp ignore fem_getsearchflags: cmp [search_data],0 je ignore mov eax,[search_flags] mov [return_value],eax jmp ignore fem_releasesearch: call release_search_data jmp ignore fem_canfindnext: cmp [search_data],0 je ignore mov [return_value],TRUE jmp ignore fem_getwordatcaret: cmp [wparam],0 je ignore call get_word_at_caret mov edi,[lparam] mov eax,[wparam] dec eax jz word_copied cmp ecx,eax jbe copy_word mov ecx,eax copy_word: mov [return_value],ecx mov esi,[caret_line] call copy_from_line word_copied: xor al,al stosb jmp ignore fem_beginoperation: test [editor_mode],FEMODE_READONLY jnz ignore mov [macro_operation],1 call store_status_for_undo jmp done fem_endoperation: test [editor_mode],FEMODE_READONLY jnz ignore xor al,al xchg al,[macro_operation] test al,2 jnz text_changed test al,4 jz update_all mov [notification],FEN_POSCHANGE jmp update_all moved_caret: test [kbstate+VK_SHIFT],80h jnz moved_selection mov [selection_line],0 moved_selection: cmp [macro_operation],0 jne position_changed_by_macro_operation mov [notification],FEN_POSCHANGE jmp update_all moved_window: call update_positions jmp refresh text_altered: mov [selection_line],0 text_changed: cmp [macro_operation],0 jne text_changed_by_macro_operation mov [notification],FEN_TEXTCHANGE mov eax,[peak_line_length] xor edx,edx mov ebx,SEGMENT_DATA_LENGTH div ebx inc eax mul ebx shl eax,1 cmp eax,[line_buffer_size] je update_all mov [line_buffer_size],eax invoke VirtualAlloc,0,[line_buffer_size],MEM_COMMIT,PAGE_READWRITE or eax,eax jz memory_shortage xchg [line_buffer],eax invoke VirtualFree,eax,0,MEM_RELEASE update_all: cmp [macro_operation],0 jne done call update_window call let_caret_appear call update_positions refresh: cmp [macro_operation],0 jne done cmp [screen_base],0 je wm_size mov eax,[screen_size] shl eax,1 xor [screen_offset],eax call update_screen mov esi,[screen_base] mov eax,[screen_size] lea edi,[esi+eax*2] mov [rect.top],0 mov edx,[font_height] mov [rect.bottom],edx mov ecx,[screen_height] refresh_screen: push ecx mov ebx,[screen_size] mov edx,[font_width] xor eax,eax mov [rect.left],eax mov [rect.right],eax mov ecx,[screen_width] refresh_line: mov al,[esi] mov ah,[esi+ebx] cmp al,[edi] jne refresh_changed cmp ah,[edi+ebx] jne refresh_changed inc esi inc edi add [rect.left],edx add [rect.right],edx loop refresh_line jmp refresh_next_line refresh_changed: mov al,[esi] mov ah,[esi+ebx] inc esi add [rect.right],edx cmp al,[edi] jne changed_more cmp ah,[edi+ebx] jne changed_more inc edi jmp invalidate changed_more: inc edi loop refresh_changed invalidate: push ecx edx push [rect.right] mov eax,[font_overhang] sub [rect.left],eax add [rect.right],eax lea edx,[rect] invoke InvalidateRect,[hwnd],edx,FALSE pop eax mov [rect.left],eax mov [rect.right],eax pop edx ecx jecxz refresh_next_line loop refresh_line refresh_next_line: mov eax,[font_height] add [rect.top],eax add [rect.bottom],eax pop ecx dec ecx jnz refresh_screen jmp done position_changed_by_macro_operation: or [macro_operation],4 jmp done text_changed_by_macro_operation: or [macro_operation],2 jmp done ignore: mov dl,[last_operation] mov [current_operation],dl cmp [was_selection],0 jne done mov [selection_line],0 done: cmp [focus],0 je caret_ok call update_caret_position caret_ok: lea esi,[editor_data] mov edi,[editor_memory] add edi,SEGMENT_HEADER_LENGTH mov ecx,editor_data_size rep movsb cmp [notification],0 je notification_ok invoke GetWindowLong,[hwnd],GWL_HWNDPARENT mov edi,eax invoke GetWindowLong,[hwnd],GWL_ID movzx ebx,[notification] shl ebx,16 or eax,ebx invoke SendMessage,edi,WM_COMMAND,eax,[hwnd] notification_ok: cmp [redraw_now],0 je redraw_ok invoke UpdateWindow,[hwnd] redraw_ok: mov eax,[return_value] finish_wndproc: pop edi esi ebx ret not_enough_memory: lea esp,[editor_memory-10h] mov [notification],FEN_OUTOFMEMORY or [return_value],-1 cmp [clipboard_opened],0 je ignore invoke CloseClipboard mov [clipboard_opened],0 jmp ignore get_memory: invoke VirtualAlloc,0,ecx,MEM_COMMIT,PAGE_READWRITE mov ebx,eax retn release_memory: invoke VirtualFree,ebx,0,MEM_RELEASE retn make_undopoint: cmp [macro_operation],0 jne undopoint_ok call store_status_for_undo undopoint_ok: retn update_positions: lea eax,[rect] invoke GetClientRect,[hwnd],eax mov eax,[rect.right] sub eax,[rect.left] cdq div [font_width] mov [window_width],eax add edx,-1 adc eax,0 mov [screen_width],eax mov eax,[rect.bottom] sub eax,[rect.top] cdq div [font_height] mov [window_height],eax add edx,-1 adc eax,0 mov [screen_height],eax call update_window setup_vscroll: mov ecx,[lines_count] mov [sc.cbSize],sizeof.SCROLLINFO mov [sc.fMask],SIF_DISABLENOSCROLL+SIF_RANGE+SIF_PAGE+SIF_POS mov [sc.nMin],1 mov [sc.nMax],ecx mov eax,[window_height] mov [sc.nPage],eax mov edx,[window_line_number] mov [sc.nPos],edx test [editor_style],WS_VSCROLL jz setup_hscroll lea eax,[sc] invoke SetScrollInfo,[hwnd],SB_VERT,eax,TRUE setup_hscroll: mov ecx,[maximum_position] mov [sc.nMin],0 mov [sc.nMax],ecx mov eax,[window_width] mov [sc.nPage],eax mov edx,[window_position] mov [sc.nPos],edx test [editor_style],WS_HSCROLL jz setup_caret lea eax,[sc] invoke SetScrollInfo,[hwnd],SB_HORZ,eax,TRUE setup_caret: mov eax,[font_width] mov edx,[caret_position] sub edx,[window_position] imul eax,edx mov [caret_x],eax mov eax,[font_height] mov edx,[caret_line_number] sub edx,[window_line_number] imul eax,edx mov [caret_y],eax retn create_caret: xor eax,eax test [editor_mode],FEMODE_OVERWRITE jnz block_caret test [editor_style],FES_CONSOLECARET jnz console_caret invoke CreateCaret,[hwnd],NULL,0,[font_height] jmp show_caret block_caret: invoke CreateCaret,[hwnd],NULL,[font_width],[font_height] jmp show_caret console_caret: invoke CreateCaret,[hwnd],NULL,[font_width],2 show_caret: invoke ShowCaret,[hwnd] update_caret_position: mov eax,[caret_y] test [editor_mode],FEMODE_OVERWRITE jnz set_position test [editor_style],FES_CONSOLECARET jz set_position add eax,[font_height] sub eax,2 set_position: invoke SetCaretPos,[caret_x],eax retn update_screen: mov edi,[screen_base] or edi,edi jz screen_prepared add edi,[screen_offset] mov ebx,[screen_size] add ebx,edi push ebx mov ecx,[screen_height] mov edx,[window_line_number] mov [line_number],edx mov esi,[window_line] prepare_screen: push ecx test byte [esi],1 jnz prepare_long_line push esi add esi,SEGMENT_HEADER_LENGTH mov ecx,SEGMENT_DATA_LENGTH call prepare_line pop esi mov esi,[esi] jmp prepare_next_line prepare_long_line: push edi mov edi,[line_buffer] xor eax,eax combine_long_line_segments: add esi,SEGMENT_HEADER_LENGTH mov ecx,SEGMENT_DATA_LENGTH rep movsb add eax,SEGMENT_DATA_LENGTH mov esi,[esi-SEGMENT_LENGTH] btr esi,0 jc combine_long_line_segments mov ecx,eax mov eax,esi mov esi,edi sub esi,ecx pop edi push eax call prepare_line pop esi prepare_next_line: inc [line_number] pop ecx dec ecx jz prepare_selection or esi,esi jnz prepare_screen prepare_empty_lines: imul ecx,[screen_width] xor al,al mov edx,ecx rep stosb xchg edi,ebx mov ecx,edx rep stosb prepare_selection: pop ebx test [editor_style],ES_NOHIDESEL jnz hideselection_ok cmp [focus],0 je screen_prepared hideselection_ok: cmp [selection_line],0 je screen_prepared mov eax,[window_line_number] mov esi,[selection_line_number] mov edi,[caret_line_number] sub esi,eax sub edi,eax mov ecx,[window_position] mov eax,[selection_position] mov edx,[caret_position] sub eax,ecx sub edx,ecx cmp esi,edi jle selection_boundaries_ok xchg esi,edi xchg eax,edx selection_boundaries_ok: mov ecx,[screen_height] cmp edi,0 jl screen_prepared cmp esi,ecx jge screen_prepared cmp esi,edi je prepare_vsel test [editor_mode],FEMODE_VERTICALSEL jz prepare_hsel prepare_vsel: cmp eax,edx jle vselection_boundaries_ok xchg eax,edx vselection_boundaries_ok: cmp esi,0 jge vselection_start_ok xor esi,esi vselection_start_ok: inc edi cmp edi,ecx jle vselection_end_ok mov edi,ecx vselection_end_ok: mov ecx,[screen_width] cmp edx,0 jl screen_prepared cmp eax,ecx jge screen_prepared cmp eax,0 jge vselection_line_start_ok xor eax,eax vselection_line_start_ok: cmp edx,ecx jle vselection_line_end_ok mov edx,ecx vselection_line_end_ok: mov ecx,edi sub ecx,esi imul esi,[screen_width] add ebx,esi prepare_vselection_line: push eax ecx mov edi,ebx mov ecx,edx sub ecx,eax lea edi,[ebx+eax] mov al,80h rep stosb add ebx,[screen_width] pop ecx eax loop prepare_vselection_line jmp screen_prepared prepare_hsel: cmp esi,0 jge hselection_start_ok xor esi,esi xor eax,eax hselection_start_ok: cmp edi,ecx jl hselection_end_ok mov edi,ecx xor edx,edx hselection_end_ok: inc esi mov ecx,edi sub ecx,esi imul ecx,[screen_width] imul esi,[screen_width] lea edi,[ebx+esi] neg eax add eax,[screen_width] cmp eax,0 jle hselection_start_line_ok sub edi,eax add ecx,eax sub eax,[screen_width] jle hselection_start_line_ok add edi,eax sub ecx,eax hselection_start_line_ok: cmp edx,0 jle hselection_end_line_ok add ecx,edx sub edx,[screen_width] jle hselection_end_line_ok sub ecx,edx hselection_end_line_ok: mov al,80h rep stosb screen_prepared: retn prepare_line: push edi ecx mov ecx,[esp] mov edi,[line_buffer] add edi,ecx shr ecx,2 xor eax,eax rep stosd mov ecx,[esp] sub edi,ecx invoke syntax_proc,esi,ecx,edi mov edx,edi pop eax edi push esi edx mov edx,[window_position] lea esi,[esi+edx] sub eax,edx jnc line_position_ok xor eax,eax jmp line_length_ok line_position_ok: cmp eax,[screen_width] jbe line_length_ok mov eax,[screen_width] line_length_ok: mov ecx,eax rep movsb pop esi add esi,edx mov ecx,eax xchg edi,ebx rep movsb xchg edi,ebx pop esi cmp eax,[screen_width] jb after_end_of_line retn after_end_of_line: mov ecx,[screen_width] sub ecx,eax xor al,al mov edx,ecx rep stosb xchg edi,ebx mov ecx,edx rep stosb xchg edi,ebx retn include '..\memory.inc' include '..\navigate.inc' include '..\edit.inc' include '..\blocks.inc' include '..\search.inc' include '..\undo.inc' endp proc SyntaxProc lpLine,uChars,lpColors ret endp