Subversion Repositories Kolibri OS

Rev

Rev 4487 | Rev 5579 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. diff16 'tp-key.asm',0,$
  2.  
  3. key:
  4.         mov     ecx,1
  5.         mcall   66,3            ; Get status of the control keys
  6.         mov     [shi],eax
  7.         xor     ebx,ebx
  8.         test    al,0x03         ; Left or right shift
  9.         jz      @f
  10.         or      ebx,KM_SHIFT
  11.     @@: test    al,0x0C         ; Left or right control
  12.         jz      @f
  13.         or      ebx,KM_CTRL
  14.     @@: test    al,0x10         ; Left alt
  15.         jz      @f
  16.         or      ebx,KM_ALT
  17.     @@: mov     edx,ebx
  18.         test    al,0x03
  19.         jz      @f
  20.         inc     cl
  21.     @@:
  22.         mcall   2
  23.         cmp     al,0
  24.         jne     still.skip_write
  25.         shr     eax,8
  26. ;--------------------------------------
  27. ; this code for Win-keys, works with
  28. ; kernel SVN r.3356 or later
  29.         test    [shi],0x200     ; LWin
  30.         jnz     still.skip_write
  31.         test    [shi],0x400     ; RWin
  32.         jnz     still.skip_write
  33. ;--------------------------------------
  34.         cmp     al,224
  35.         jne     @f
  36.         mov     [ext],0x01
  37.         jmp     still.skip_write
  38.     @@: cmp     al,225
  39.         jne     @f
  40.         mov     [ext],0x02
  41.         jmp     still.skip_write
  42.     @@:
  43.         mov     ah,[ext]
  44.         mov     [ext],0
  45.  
  46.         mov     esi,numpad_table_off
  47.         test    [shi], 0x00000080 ; NumLock is on?
  48.         jz      .num
  49.         mov     esi,numpad_table_on
  50.   .num: cmp     eax,[esi]
  51.         jne     @f
  52.         mov     eax,[esi+4]
  53.         mov     ebx,eax
  54.         or      eax,edx
  55.         shr     ebx,8
  56.         or      ebx,0x0000FFFF
  57.         and     eax,ebx
  58.         mov     ecx,eax
  59.         shr     ecx,16
  60.         and     cl,1
  61.         inc     cl
  62.         jmp     .lp0
  63.     @@: add     esi,8
  64.         cmp     dword[esi],0
  65.         jne     .num
  66.  
  67.         or      eax,edx
  68.  
  69.   .lp0: test    al,0x80
  70.         jnz     still.skip_write
  71. ;--------------------------------------
  72. ; it is CAPS LOCK correct processing for chars
  73.         test    [shi], 0x00000040 ; CAPS LOCK is on?
  74.         jz      .no_caps_lock
  75.         cmp     ecx,1
  76.         jnz     @f
  77.         inc     ecx
  78.         jmp     .no_caps_lock
  79. @@:
  80.         cmp     ecx,2
  81.         jnz     .no_caps_lock
  82.         dec     ecx
  83. .no_caps_lock:
  84. ;--------------------------------------
  85. ; alt gr pressed?
  86.         test    [shi], 0x00000020
  87.         jz      .no_alt_gr
  88.         mov     ecx, 3
  89.   .no_alt_gr:
  90. ;--------------------------------------
  91.         push    eax
  92.         mcall   26,2,,key1
  93.         pop     eax
  94.  
  95.         mov     [chr],eax
  96.  
  97.         cmp     [bot_mode],0
  98.         je      @f
  99.         mov     ebx,eax
  100.         mov     al,2
  101.         call    [bot_dlg_handler]
  102.         jmp     still.skip_write
  103.     @@:
  104.  
  105.         mov     esi,accel_table_main
  106.   .acc: cmp     eax,[esi]
  107.         jne     @f
  108.         test    [secure_sel],1
  109.         jz      .lp1
  110.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  111.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  112.   .lp1: mov     [s_status],0
  113.         call    dword[esi+4]
  114.         call    editor_check_for_changes
  115.         jmp     still
  116.     @@: add     esi,8
  117.         cmp     dword[esi],0
  118.         jne     .acc
  119.  
  120.         test    [chr],KM_CTRLALT
  121.         jnz     still.skip_write
  122.  
  123.         mov     [s_status],0
  124.  
  125.         movzx   eax,byte[chr]
  126.         movzx   eax,[eax+key0]
  127.         or      al,al
  128.         jz      still.skip_write
  129.         movzx   eax,[eax+key1]
  130.         push    eax
  131.  
  132.         test    [secure_sel],1
  133.         jz      .lp2
  134.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  135.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  136.         jmp     .put
  137.   .lp2: call    delete_selection
  138.  
  139.         test    [auto_braces],1
  140.         jz      .put
  141.         cmp     al,'['
  142.         jne     @f
  143.         mov     al,']'
  144.         call    .lp3
  145.         dec     [cur_editor.Caret.X]
  146.         jmp     .put
  147.     @@: cmp     al,'('
  148.         jne     @f
  149.         mov     al,')'
  150.         call    .lp3
  151.         dec     [cur_editor.Caret.X]
  152.         jmp     .put
  153.     @@: cmp     al,'{'
  154.         jne     .put
  155.         mov     al,'}'
  156.         call    .lp3
  157.         dec     [cur_editor.Caret.X]
  158.  
  159.   .put: pop     eax
  160.         push    still editor_check_for_changes
  161.         inc     [cur_editor.SelStart.X]
  162.   .lp3: push    [cur_editor.Caret.X] eax
  163.         inc     dword[esp+4]
  164.         mov     eax,1
  165.         jmp     key.tab.direct
  166.  
  167. ;-----------------------------------------------------------------------------
  168. proc key.ctrl_a ;///// SELECT ALL DOCUMENT ///////////////////////////////////
  169. ;-----------------------------------------------------------------------------
  170.         xor     eax,eax
  171.         mov     [cur_editor.SelStart.X],eax
  172.         mov     [cur_editor.SelStart.Y],eax
  173.         mov     ecx,[cur_editor.Lines.Count]
  174.         dec     ecx
  175.         mov     [cur_editor.Caret.Y],ecx
  176.         call    get_line_offset
  177.         call    get_real_length
  178.         mov     [cur_editor.Caret.X],eax
  179.         call    draw_editor
  180.         ret
  181. endp
  182.  
  183. ;-----------------------------------------------------------------------------
  184. proc key.ctrl_o ;///// ENTER OPEN FILENAME ///////////////////////////////////
  185. ;-----------------------------------------------------------------------------
  186.         mov     [bot_mode2],0
  187.  
  188.   .direct:
  189.         cmp     [bot_mode2], 2
  190.         je      .ask
  191.         mov     [s_status],s_enter_filename
  192.         jmp     .ask1
  193.  
  194.    .ask:
  195.         mov     [s_status],s_ask_save
  196.   .ask1:
  197.         mov     [bot_mode],1
  198.         mov     [bot_dlg_height],16*2+4*2-1
  199.         mov     [bot_dlg_handler],osdlg_handler
  200.         mov     [focused_tb],tb_opensave
  201.  
  202.     @@: mov     al,[tb_opensave.length]
  203.         mov     [tb_opensave.pos.x],al
  204.         mov     [tb_opensave.sel.x],0
  205.         mov     [tb_casesen],0;1
  206.         call    drawwindow
  207.         ret
  208. endp
  209.  
  210. ;-----------------------------------------------------------------------------
  211. proc key.ctrl_s ;///// ENTER SAVE FILENAME ///////////////////////////////////
  212. ;-----------------------------------------------------------------------------
  213.         cmp     [cur_editor.FilePath], 0
  214.         je      key.shift_ctrl_s
  215.         cmp     [cur_editor.Modified],0
  216.         je      .exit
  217.         call    save_file
  218.         call    drawwindow
  219.   .exit:
  220.         ret
  221.  
  222.     key.shift_ctrl_s:
  223.         mov     [bot_mode2],1
  224.         jmp     key.ctrl_o.direct
  225. endp
  226.  
  227. ;-----------------------------------------------------------------------------
  228. proc key.ctrl_n ;///// CREATE NEW FILE (TAB) /////////////////////////////////
  229. ;-----------------------------------------------------------------------------
  230.         call    create_tab
  231.         ret
  232. endp
  233.  
  234. ;-----------------------------------------------------------------------------
  235. proc key.ctrl_f ;///// ENTER KEYWORD TO FIND /////////////////////////////////
  236. ;-----------------------------------------------------------------------------
  237.         mov     [bot_mode2],0
  238.         mov     [bot_dlg_height],16*2+4*2-1
  239.  
  240.         mov     [s_status],s_enter_text_to_find
  241.  
  242.   .direct:
  243.         mov     [bot_mode],1
  244.         mov     [bot_dlg_handler],finddlg_handler
  245.         mov     [focused_tb],tb_find
  246.  
  247.         mov     ecx,[s_search.size]
  248.         mov     [tb_find.length],cl
  249.         jecxz   @f
  250.         mov     esi,s_search
  251.         mov     edi,tb_find.text
  252.         cld
  253.         rep     movsb
  254.  
  255.     @@: mov     al,[tb_find.length]
  256.         mov     [tb_find.pos.x],al
  257.         mov     [tb_find.sel.x],0
  258.         mov     [tb_casesen],0
  259.         call    drawwindow
  260.         ret
  261. endp
  262.  
  263. proc key.ctrl_h
  264.         mov     [bot_mode2],1
  265.         mov     [bot_dlg_height],16*3+4*2+1
  266.  
  267.         mov     [s_status],s_enter_text_to_replace
  268.  
  269.         jmp     key.ctrl_f.direct
  270. endp
  271.  
  272. proc key.ctrl_g
  273.         ret
  274. @^
  275.         mov     [bot_mode2],0
  276.         mov     [bot_dlg_height],16*2+4*2-1
  277.  
  278.         mov     [bot_mode],1
  279.         mov     [bot_dlg_handler],gotodlg_handler
  280.         mov     [focused_tb],tb_gotorow
  281.  
  282.         mov     al,[tb_gotorow.length]
  283.         mov     [tb_gotorow.pos.x],al
  284.         mov     [tb_gotorow.sel.x],0
  285.         mov     [tb_casesen],0
  286.         call    drawwindow
  287.         ret
  288. ^@
  289. endp
  290.  
  291. ;-----------------------------------------------------------------------------
  292. proc key.ctrl_left ;///// GO TO PREVIOUS WORD ////////////////////////////////
  293. ;-----------------------------------------------------------------------------
  294.         call    clear_selection
  295.  
  296. ;-----------------------------------------------------------------------------
  297.      key.shift_ctrl_left: ;///// GO TO PREVIOUS WORD, WITH SELECTION /////////
  298. ;-----------------------------------------------------------------------------
  299.         mov     ebx,[cur_editor.Caret.Y]
  300.         mov     edx,[cur_editor.Caret.X]
  301.         cld
  302.         mov     ecx,ebx
  303.         call    get_line_offset
  304.   .lp1: cmp     edx,[esi+EDITOR_LINE_DATA.Size]
  305.         jle     @f
  306.         mov     edx,[esi+EDITOR_LINE_DATA.Size]
  307.     @@: dec     edx
  308.         jl      .nx1
  309.         add     esi,sizeof.EDITOR_LINE_DATA
  310.         add     esi,edx
  311.         mov     ecx,edx
  312.     @@: push    ecx
  313.         mov     edi,symbols_ex
  314.         mov     ecx,symbols_ex.size+symbols.size
  315.         mov     al,[esi]
  316.         dec     esi
  317.         repne   scasb
  318.         pop     ecx
  319.         jne     @f
  320.         dec     edx
  321.         dec     ecx
  322.         jnz     @b
  323.   .nx1: dec     ebx
  324.         js      .exit.2
  325.         mov     ecx,ebx
  326.         call    get_line_offset
  327.         mov     edx,[esi+EDITOR_LINE_DATA.Size]
  328.         dec     edx
  329.         jmp     .lp1
  330.     @@:
  331.         mov     ecx,ebx
  332.         call    get_line_offset
  333.   .lp2: cmp     edx,[esi+EDITOR_LINE_DATA.Size]
  334.         jle     @f
  335.         mov     edx,[esi+EDITOR_LINE_DATA.Size]
  336.     @@: or      edx,edx
  337.         jl      .nx2
  338.         add     esi,sizeof.EDITOR_LINE_DATA
  339.         add     esi,edx
  340.     @@: mov     edi,symbols_ex
  341.         mov     ecx,symbols_ex.size+symbols.size
  342.         mov     al,[esi]
  343.         dec     esi
  344.         repne   scasb
  345.         je      @f
  346.         dec     edx
  347.         jns     @b
  348.         jmp     @f
  349.   .nx2: dec     ebx
  350.         js      .exit.2
  351.         mov     ecx,ebx
  352.         call    get_line_offset
  353.         mov     edx,[esi+EDITOR_LINE_DATA.Size]
  354.         dec     edx
  355.         jmp     .lp2
  356.     @@:
  357.         inc     edx
  358.         mov     [cur_editor.Caret.Y],ebx
  359.         mov     [cur_editor.Caret.X],edx
  360.         test    [chr],KM_SHIFT
  361.         jnz     @f
  362.         mov     [cur_editor.SelStart.Y],ebx
  363.         mov     [cur_editor.SelStart.X],edx
  364.     @@: sub     ebx,[cur_editor.TopLeft.Y]
  365.         jge     @f
  366.         add     [cur_editor.TopLeft.Y],ebx
  367.     @@: mov     eax,edx
  368.         sub     eax,[cur_editor.TopLeft.X]
  369.         cmp     eax,[columns.scr]
  370.         jl      @f
  371.         sub     eax,[columns.scr]
  372.         inc     eax
  373.         add     [cur_editor.TopLeft.X],eax
  374.         jmp     .exit
  375.     @@: cmp     edx,[cur_editor.TopLeft.X]
  376.         jge     .exit
  377.         mov     [cur_editor.TopLeft.X],edx
  378.   .exit:
  379.         call    editor_check_for_changes
  380.   .exit.2:
  381.         ret
  382. endp
  383.  
  384. ;-----------------------------------------------------------------------------
  385. proc key.ctrl_right ;///// GO TO NEXT WORD ///////////////////////////////////
  386. ;-----------------------------------------------------------------------------
  387.         call    clear_selection
  388.  
  389. ;-----------------------------------------------------------------------------
  390.      key.shift_ctrl_right: ;///// GO TO NEXT WORD, WITH SELECTION ////////////
  391. ;-----------------------------------------------------------------------------
  392.         mov     ebx,[cur_editor.Caret.Y]
  393.         mov     edx,[cur_editor.Caret.X]
  394.         cld
  395.   .lp1: mov     ecx,ebx
  396.         call    get_line_offset
  397.         mov     ecx,[esi+EDITOR_LINE_DATA.Size]
  398.         cmp     edx,ecx
  399.         jge     .nx1
  400.         add     esi,sizeof.EDITOR_LINE_DATA
  401.         add     esi,edx
  402.         sub     ecx,edx
  403.     @@: push    ecx
  404.         mov     edi,symbols_ex
  405.         mov     ecx,symbols_ex.size+symbols.size
  406.         lodsb
  407.         repne   scasb
  408.         pop     ecx
  409.         je      @f
  410.         inc     edx
  411.         dec     ecx
  412.         jnz     @b
  413.   .nx1: inc     ebx
  414.         cmp     ebx,[cur_editor.Lines.Count]
  415.         jge     .exit.2
  416.         xor     edx,edx
  417.         jmp     .lp1
  418.     @@:
  419.  
  420.   .lp2: mov     ecx,ebx
  421.         call    get_line_offset
  422.         mov     ecx,[esi+EDITOR_LINE_DATA.Size]
  423.         cmp     edx,ecx
  424.         jge     .nx2
  425.         add     esi,sizeof.EDITOR_LINE_DATA
  426.         add     esi,edx
  427.         sub     ecx,edx
  428.     @@: push    ecx
  429.         mov     edi,symbols_ex
  430.         mov     ecx,symbols_ex.size+symbols.size
  431.         lodsb
  432.         repne   scasb
  433.         pop     ecx
  434.         jne     @f
  435.         inc     edx
  436.         dec     ecx
  437.         jnz     @b
  438.   .nx2: inc     ebx
  439.         cmp     ebx,[cur_editor.Lines.Count]
  440.         jge     .exit.2
  441.         xor     edx,edx
  442.         jmp     .lp2
  443.     @@:
  444.         mov     [cur_editor.Caret.Y],ebx
  445.         mov     [cur_editor.Caret.X],edx
  446.         test    [chr],KM_SHIFT
  447.         jnz     @f
  448.         mov     [cur_editor.SelStart.Y],ebx
  449.         mov     [cur_editor.SelStart.X],edx
  450.     @@: sub     ebx,[cur_editor.TopLeft.Y]
  451.         cmp     ebx,[lines.scr]
  452.         jl      @f
  453.         sub     ebx,[lines.scr]
  454.         inc     ebx
  455.         add     [cur_editor.TopLeft.Y],ebx
  456.     @@: mov     eax,edx
  457.         sub     eax,[cur_editor.TopLeft.X]
  458.         cmp     eax,[columns.scr]
  459.         jl      @f
  460.         sub     eax,[columns.scr]
  461.         inc     eax
  462.         add     [cur_editor.TopLeft.X],eax
  463.         jmp     .exit
  464.     @@: cmp     edx,[cur_editor.TopLeft.X]
  465.         jge     .exit
  466.         mov     [cur_editor.TopLeft.X],edx
  467.   .exit:
  468.         call    editor_check_for_changes
  469.   .exit.2:
  470.         ret
  471. endp
  472.  
  473. ;-----------------------------------------------------------------------------
  474. proc key.ctrl_x
  475.         cmp     [sel.selected],0
  476.         je      @f
  477.         call    key.ctrl_c
  478.         call    key.del
  479.         mov     [cur_editor.Modified],1
  480.     @@: ret
  481. endp
  482.  
  483. ;-----------------------------------------------------------------------------
  484. proc key.ctrl_c
  485.         mov     [copy_size],0
  486.         cmp     [sel.selected],0
  487.         je      .exit
  488.  
  489.         call    get_selection_size
  490.         push    eax
  491.         stdcall mem.ReAlloc,[copy_buf],eax
  492.         mov     [copy_buf],eax
  493.         pop     eax
  494.         stdcall mem.ReAlloc,[clipboard_buf],eax
  495.         mov     [clipboard_buf],eax
  496.  
  497.         cld
  498.         mov     eax,[sel.begin.y]
  499.         cmp     eax,[sel.end.y]
  500.         je      .single_line
  501.         mov     ecx,[sel.begin.y]
  502.         call    get_line_offset
  503.         inc     ecx
  504.         push    ecx
  505.         mov     edi,[copy_buf]
  506.         call    get_real_length
  507.         sub     eax,[sel.begin.x]
  508.         jge     @f
  509.         xor     eax,eax
  510.     @@: add     esi,[sel.begin.x]
  511.         add     esi,sizeof.EDITOR_LINE_DATA
  512.         mov     [edi+EDITOR_LINE_DATA.Size],eax
  513.         add     edi,sizeof.EDITOR_LINE_DATA
  514.         mov     ecx,eax
  515.         jecxz   @f
  516.         rep     movsb
  517.     @@: mov     ecx,[sel.end.y]
  518.         call    get_line_offset
  519.         pop     ecx
  520.         cmp     ecx,[sel.end.y]
  521.         je      @f
  522.         mov     eax,esi
  523.         call    get_line_offset
  524.         sub     eax,esi
  525.         mov     ecx,eax
  526.         rep     movsb
  527.         mov     ecx,[sel.end.y]
  528.     @@: call    get_line_offset
  529.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  530.         add     esi,sizeof.EDITOR_LINE_DATA
  531.         cmp     eax,[sel.end.x]
  532.         jle     @f
  533.         mov     eax,[sel.end.x]
  534.     @@: mov     ebx,edi
  535.         mov     [edi+EDITOR_LINE_DATA.Size],eax
  536.         add     edi,sizeof.EDITOR_LINE_DATA
  537.         mov     ecx,eax
  538.         jecxz   @f
  539.         rep     movsb
  540.         sub     eax,[sel.end.x]
  541.         jz      @f
  542.         neg     eax
  543.         mov     ecx,eax
  544.         add     [ebx],eax
  545.         mov     al,' '
  546.         rep     stosb
  547.     @@: sub     edi,[copy_buf]
  548.         mov     [copy_size],edi
  549.         mov     eax,[sel.end.y]
  550.         sub     eax,[sel.begin.y]
  551.         inc     eax
  552.         mov     [copy_count],eax
  553.         call    put_to_clipboard
  554.   .exit:
  555.         ret
  556.  
  557.   .single_line:
  558.         mov     eax,[sel.end.x]
  559.         sub     eax,[sel.begin.x]
  560.         mov     edi,[copy_buf]
  561.         mov     [edi+EDITOR_LINE_DATA.Size],eax
  562.         add     edi,sizeof.EDITOR_LINE_DATA
  563.         mov     ecx,[sel.begin.y]
  564.         call    get_line_offset
  565.         mov     ebx,[sel.begin.x]
  566.         mov     ecx,[sel.end.x]
  567.         cmp     ebx,[esi+EDITOR_LINE_DATA.Size]
  568.         jge     .add_spaces
  569.         cmp     ecx,[esi+EDITOR_LINE_DATA.Size]
  570.         jle     .lp1
  571.         mov     ecx,[esi+EDITOR_LINE_DATA.Size]
  572.   .lp1: sub     ecx,[sel.begin.x]
  573.         sub     eax,ecx
  574.         lea     esi,[esi+ebx+sizeof.EDITOR_LINE_DATA]
  575.         rep     movsb
  576.  
  577.   .add_spaces:
  578.         mov     ecx,eax
  579.         mov     al,' '
  580.         jecxz   @b
  581.         rep     stosb
  582.         jmp     @b
  583. endp
  584.  
  585. ;-----------------------------------------------------------------------------
  586. proc key.ctrl_v
  587.         cmp     [replace_mode],0
  588.         jne     @f
  589.         call    get_from_clipboard
  590. @@:
  591.         cmp     [copy_size],0
  592.         je      .exit
  593.  
  594.         call    delete_selection
  595.  
  596.         mov     eax,[copy_size]
  597.         call    editor_realloc_lines
  598.  
  599.         mov     ebx,[cur_editor.Lines.Size]
  600.         add     ebx,[copy_size]
  601.         mov     [cur_editor.Lines.Size],ebx
  602.         stdcall mem.ReAlloc,[cur_editor.Lines],ebx
  603.         mov     [cur_editor.Lines],eax
  604.  
  605.         mov     ecx,[cur_editor.Caret.Y]
  606.         call    get_line_offset
  607.         pushd   [esi+EDITOR_LINE_DATA.Size] esi
  608.         mov     ecx,[cur_editor.Caret.X]
  609.         call    line_add_spaces
  610.         add     [esp],eax
  611.         add     esi,eax
  612.         mov     ecx,[copy_size]
  613.         sub     ecx,sizeof.EDITOR_LINE_DATA
  614.         mov     edi,[cur_editor.Lines]
  615.         add     edi,[cur_editor.Lines.Size] ;*** add edi,[edi-4]
  616.         dec     edi
  617.         mov     eax,esi
  618.         mov     esi,edi
  619.         sub     esi,ecx
  620.         lea     ecx,[eax+sizeof.EDITOR_LINE_DATA]
  621.         add     ecx,[cur_editor.Caret.X]
  622.         neg     ecx
  623.         lea     ecx,[esi+ecx+1]
  624.         std
  625.         rep     movsb
  626.  
  627.         mov     ecx,[copy_count]
  628.         dec     ecx
  629.         jz      .single_line
  630.  
  631.         cld
  632.         pop     edi
  633.         add     edi,sizeof.EDITOR_LINE_DATA
  634.         mov     esi,[copy_buf]
  635.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  636.         add     esi,sizeof.EDITOR_LINE_DATA
  637.  
  638.         mov     ebx,[cur_editor.Caret.X]
  639.         add     eax,ebx
  640.         mov     [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],eax
  641.         mov     [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  642.         sub     eax,ebx
  643.         call    .check_columns
  644.         add     edi,ebx
  645.     @@: push    ecx
  646.         mov     ecx,eax
  647.         rep     movsb
  648.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  649.         add     esi,sizeof.EDITOR_LINE_DATA
  650.         mov     [edi+EDITOR_LINE_DATA.Size],eax
  651.         mov     [edi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  652.         add     edi,sizeof.EDITOR_LINE_DATA
  653.         pop     ecx
  654.         loop    @b
  655.  
  656.         pop     ecx
  657.         sub     ecx,ebx
  658.         add     [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],ecx
  659.         call    .check_columns
  660.         mov     ecx,eax
  661.         rep     movsb
  662.  
  663.         mov     [cur_editor.Caret.X],eax
  664.         mov     [cur_editor.SelStart.X],eax
  665.         mov     eax,[copy_count]
  666.         dec     eax
  667.         add     [cur_editor.Caret.Y],eax
  668.         add     [cur_editor.SelStart.Y],eax
  669.         add     [cur_editor.Lines.Count],eax
  670.  
  671.         mov     [cur_editor.Modified],1
  672.         jmp     .exit
  673.  
  674.   .single_line:
  675.         cld
  676.         pop     edi
  677.         add     edi,sizeof.EDITOR_LINE_DATA
  678.         mov     esi,[copy_buf]
  679.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  680.         add     esi,sizeof.EDITOR_LINE_DATA
  681.         add     [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],eax
  682.         and     [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
  683.         or      [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  684.         call    .check_columns
  685.         add     edi,[cur_editor.Caret.X]
  686.         add     esp,4
  687.         mov     ecx,eax
  688.         rep     movsb
  689.  
  690.         add     [cur_editor.Caret.X],eax
  691.         add     [cur_editor.SelStart.X],eax
  692.  
  693.         mov     [cur_editor.Modified],1
  694.  
  695.   .exit:
  696.         cmp     [replace_mode],0
  697.         jne     .exit_1
  698.  
  699.         cmp     [copy_size],0
  700.         je      .exit_1
  701. ; remove unnecessary memory area
  702.         xor     eax,eax
  703.         mov     [copy_size],eax
  704.         mov     [copy_count],eax
  705.         stdcall mem.ReAlloc,[copy_buf],eax
  706.         mov     [copy_buf],eax
  707. .exit_1:
  708.         ret
  709.  
  710.   .check_columns:
  711.         push    eax
  712.         mov     eax,[edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size]
  713.         cmp     eax,[cur_editor.Columns.Count]
  714.         jbe     @f
  715.         mov     [cur_editor.Columns.Count],eax
  716.     @@: pop     eax
  717.         ret
  718. endp
  719.  
  720. ;-----------------------------------------------------------------------------
  721. proc key.ctrl_d ;///// INSERT SEPARATOR //////////////////////////////////////
  722. ;-----------------------------------------------------------------------------
  723.         mov     eax,90+sizeof.EDITOR_LINE_DATA
  724.         call    editor_realloc_lines
  725.  
  726.         mov     ecx,[cur_editor.Caret.Y]
  727.         call    get_line_offset
  728.         mov     ebx,esi
  729.  
  730.         mov     ecx,[cur_editor.Lines.Count]
  731.         call    get_line_offset
  732.         lea     edi,[esi+90+sizeof.EDITOR_LINE_DATA]
  733.         lea     ecx,[esi+sizeof.EDITOR_LINE_DATA]
  734.         sub     ecx,ebx
  735.         std
  736.         rep     movsb
  737.  
  738.         lea     edi,[ebx+sizeof.EDITOR_LINE_DATA+1]
  739.         mov     [ebx+EDITOR_LINE_DATA.Size],90
  740.         mov     al,ASEPC
  741.         mov     ecx,79
  742.         cld
  743.         rep     stosb
  744.         mov     al,' '
  745.         mov     ecx,10
  746.         rep     stosb
  747.         mov     byte[ebx+sizeof.EDITOR_LINE_DATA],';'
  748.  
  749.         inc     [cur_editor.Lines.Count]
  750.         inc     [cur_editor.Caret.Y]
  751.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  752.  
  753.         mov     [cur_editor.Modified],1
  754.  
  755.   .exit:
  756.         ret
  757. endp
  758.  
  759. ;-----------------------------------------------------------------------------
  760. proc key.ctrl_y ;///// DELETE CURRENT LINE ///////////////////////////////////
  761. ;-----------------------------------------------------------------------------
  762.         mov     eax,[cur_editor.Caret.Y]
  763.         inc     eax
  764.         cmp     eax,[cur_editor.Lines.Count]
  765.         jge     .exit
  766.  
  767.         mov     ecx,[cur_editor.Caret.Y]
  768.         call    get_line_offset
  769.         mov     edi,esi
  770.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  771.         lea     esi,[esi+eax+sizeof.EDITOR_LINE_DATA]
  772.         push    eax
  773.  
  774.         dec     [cur_editor.Lines.Count]
  775.         mov     ecx,[cur_editor.Lines]
  776.         add     ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
  777.         sub     ecx,esi
  778.         shr     ecx,2
  779.         cld
  780.         rep     movsd
  781.  
  782.         pop     eax
  783.         add     eax,sizeof.EDITOR_LINE_DATA
  784.         neg     eax
  785.         call    editor_realloc_lines
  786.  
  787.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  788.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  789.  
  790.         mov     [cur_editor.Modified],1
  791.  
  792.   .exit:
  793.         ret
  794. endp
  795.  
  796. ;-----------------------------------------------------------------------------
  797. proc key.up ;///// GO TO PREVIOUS LINE ///////////////////////////////////////
  798. ;-----------------------------------------------------------------------------
  799.         call    clear_selection
  800.  
  801. ;-----------------------------------------------------------------------------
  802.      key.shift_up: ;///// GO TO PREVIOUS LINE, WITH SELECTION ////////////////
  803. ;-----------------------------------------------------------------------------
  804.         mov     eax,[cur_editor.Caret.Y]
  805.         dec     eax
  806.         jns     @f
  807.         xor     eax,eax
  808.     @@: mov     ecx,[cur_editor.TopLeft.Y]
  809.         cmp     eax,ecx
  810.         jae     @f
  811.         dec     ecx
  812.         jns     @f
  813.         xor     ecx,ecx
  814.     @@: test    [chr],KM_SHIFT
  815.         jnz     @f
  816.         mov     [cur_editor.SelStart.Y],eax
  817.     @@: mov     [cur_editor.Caret.Y],eax
  818.         mov     [cur_editor.TopLeft.Y],ecx
  819.  
  820.   .exit:
  821.         ret
  822. endp
  823.  
  824. ;-----------------------------------------------------------------------------
  825. proc key.down ;///// GO TO NEXT LINE /////////////////////////////////////////
  826. ;-----------------------------------------------------------------------------
  827.         call    clear_selection
  828.  
  829. ;-----------------------------------------------------------------------------
  830.      key.shift_down: ;///// GO TO NEXT LINE, WITH SELECTION //////////////////
  831. ;-----------------------------------------------------------------------------
  832.  
  833.         mov     eax,[cur_editor.Caret.Y]
  834.         inc     eax
  835.         cmp     eax,[cur_editor.Lines.Count]
  836.         jb      @f
  837.         dec     eax
  838.     @@: mov     ecx,[cur_editor.TopLeft.Y]
  839.         mov     edx,eax
  840.         sub     edx,ecx
  841.         cmp     edx,[lines.scr]
  842.         jb      @f
  843.         inc     ecx
  844.     @@: test    [chr],KM_SHIFT
  845.         jnz     @f
  846.         mov     [cur_editor.SelStart.Y],eax
  847.     @@: mov     [cur_editor.Caret.Y],eax
  848.         mov     [cur_editor.TopLeft.Y],ecx
  849.  
  850.   .exit:
  851.         ret
  852. endp
  853.  
  854. ;-----------------------------------------------------------------------------
  855. proc key.left ;///// GO TO PREVIOUS CHAR /////////////////////////////////////
  856. ;-----------------------------------------------------------------------------
  857.         call    clear_selection
  858.  
  859. ;-----------------------------------------------------------------------------
  860.      key.shift_left: ;///// GO TO PREVIOUS CHAR, WITH SELECTION //////////////
  861. ;-----------------------------------------------------------------------------
  862.         mov     eax,[cur_editor.Caret.X]
  863.         dec     eax
  864.         jns     @f
  865.         inc     eax
  866.     @@: test    [chr],KM_SHIFT
  867.         jnz     @f
  868.         mov     [cur_editor.SelStart.X],eax
  869.     @@: mov     [cur_editor.Caret.X],eax
  870.  
  871.   .exit:
  872.         ret
  873. endp
  874.  
  875. ;-----------------------------------------------------------------------------
  876. proc key.right ;///// GO TO NEXT CHAR ////////////////////////////////////////
  877. ;-----------------------------------------------------------------------------
  878.         call    clear_selection
  879.  
  880. ;-----------------------------------------------------------------------------
  881.      key.shift_right: ;///// GO TO NEXT CHAR, WITH SELECTION /////////////////
  882. ;-----------------------------------------------------------------------------
  883.         mov     eax,[cur_editor.Caret.X]
  884.         inc     eax
  885.         cmp     eax,[cur_editor.Columns.Count]
  886.         jbe     @f
  887.         dec     eax
  888.     @@: test    [chr],KM_SHIFT
  889.         jnz     @f
  890.         mov     [cur_editor.SelStart.X],eax
  891.     @@: mov     [cur_editor.Caret.X],eax
  892.  
  893.   .exit:
  894.         ret
  895. endp
  896.  
  897. ;-----------------------------------------------------------------------------
  898. proc key.pgup ;///// GO TO PREVIOUS PAGE /////////////////////////////////////
  899. ;-----------------------------------------------------------------------------
  900.         call    clear_selection
  901.  
  902. ;-----------------------------------------------------------------------------
  903.      key.shift_pgup: ;///// GO TO PREVIOUS PAGE, WITH SELECTION //////////////
  904. ;-----------------------------------------------------------------------------
  905.         mov     edx,[lines.scr]
  906.         dec     edx
  907.         mov     eax,[cur_editor.Caret.Y]
  908.         mov     ecx,[cur_editor.TopLeft.Y]
  909.         sub     eax,edx
  910.         jns     @f
  911.         xor     eax,eax
  912.     @@: sub     ecx,edx
  913.         jns     @f
  914.         xor     ecx,ecx
  915.     @@: test    [chr],KM_SHIFT
  916.         jnz     @f
  917.         mov     [cur_editor.SelStart.Y],eax
  918.     @@: mov     [cur_editor.Caret.Y],eax
  919.         mov     [cur_editor.TopLeft.Y],ecx
  920.  
  921.   .exit:
  922.         ret
  923. endp
  924.  
  925. ;-----------------------------------------------------------------------------
  926. proc key.pgdn ;///// GO TO NEXT PAGE /////////////////////////////////////////
  927. ;-----------------------------------------------------------------------------
  928.         call    clear_selection
  929.  
  930. ;-----------------------------------------------------------------------------
  931.      key.shift_pgdn: ;///// GO TO NEXT PAGE, WITH SELECTION //////////////////
  932. ;-----------------------------------------------------------------------------
  933.         mov     edx,[lines.scr]
  934.         dec     edx
  935.         mov     eax,[cur_editor.Caret.Y]
  936.         mov     ecx,[cur_editor.TopLeft.Y]
  937.         add     eax,edx
  938.         add     ecx,edx
  939.         cmp     eax,[cur_editor.Lines.Count]
  940.         jb      @f
  941.         mov     eax,[cur_editor.Lines.Count]
  942.         dec     eax
  943.     @@: test    [chr],KM_SHIFT
  944.         jnz     @f
  945.         mov     [cur_editor.SelStart.Y],eax
  946.     @@: mov     [cur_editor.Caret.Y],eax
  947.         mov     [cur_editor.TopLeft.Y],ecx
  948.  
  949.   .exit:
  950.         ret
  951. endp
  952.  
  953. ;-----------------------------------------------------------------------------
  954. proc key.home ;///// GO TO LINE START ////////////////////////////////////////
  955. ;-----------------------------------------------------------------------------
  956.         call    clear_selection
  957.  
  958. ;-----------------------------------------------------------------------------
  959.      key.shift_home: ;///// GO TO LINE START, WITH SELECTION /////////////////
  960. ;-----------------------------------------------------------------------------
  961.         mov     [cur_editor.Caret.X],0
  962.         test    [chr],KM_SHIFT
  963.         jnz     @f
  964.         mov     [cur_editor.SelStart.X],0
  965.     @@:
  966.  
  967.   .exit:
  968.         ret
  969. endp
  970.  
  971. ;-----------------------------------------------------------------------------
  972. proc key.end ;///// GO TO LINE END ///////////////////////////////////////////
  973. ;-----------------------------------------------------------------------------
  974.         call    clear_selection
  975.  
  976. ;-----------------------------------------------------------------------------
  977.      key.shift_end: ;///// GO TO LINE END, WITH SELECTION ////////////////////
  978. ;-----------------------------------------------------------------------------
  979.         mov     ecx,[cur_editor.Caret.Y]
  980.         call    get_line_offset
  981.         call    get_real_length
  982.         mov     [cur_editor.Caret.X],eax
  983.         test    [chr],KM_SHIFT
  984.         jnz     @f
  985.         mov     [cur_editor.SelStart.X],eax
  986.     @@:
  987.  
  988.   .exit:
  989.         ret
  990. endp
  991.  
  992. ;-----------------------------------------------------------------------------
  993. proc key.ctrl_home ;///// GO TO PAGE START ///////////////////////////////////
  994. ;-----------------------------------------------------------------------------
  995.         call    clear_selection
  996.  
  997. ;-----------------------------------------------------------------------------
  998.      key.shift_ctrl_home: ;///// GO TO PAGE START, WITH SELECTION ////////////
  999. ;-----------------------------------------------------------------------------
  1000.         mov     eax,[cur_editor.TopLeft.Y]
  1001.         mov     ecx,eax
  1002.         test    [chr],KM_SHIFT
  1003.         jnz     @f
  1004.         mov     [cur_editor.SelStart.Y],eax
  1005.     @@: mov     [cur_editor.Caret.Y],eax
  1006.         mov     [cur_editor.TopLeft.Y],ecx
  1007.  
  1008.   .exit:
  1009.         ret
  1010. endp
  1011.  
  1012. ;-----------------------------------------------------------------------------
  1013. proc key.ctrl_end ;///// GO TO PAGE END //////////////////////////////////////
  1014. ;-----------------------------------------------------------------------------
  1015.         call    clear_selection
  1016.  
  1017. ;-----------------------------------------------------------------------------
  1018.      key.shift_ctrl_end: ;///// GO TO PAGE END, WITH SELECTION ///////////////
  1019. ;-----------------------------------------------------------------------------
  1020.         mov     ecx,[cur_editor.TopLeft.Y]
  1021.         mov     eax,[lines.scr]
  1022.         cmp     eax,[cur_editor.Lines.Count]
  1023.         jle     @f
  1024.         mov     eax,[cur_editor.Lines.Count]
  1025.     @@: add     eax,ecx
  1026.         dec     eax
  1027.         test    [chr],KM_SHIFT
  1028.         jnz     @f
  1029.         mov     [cur_editor.SelStart.Y],eax
  1030.     @@: mov     [cur_editor.Caret.Y],eax
  1031.         mov     [cur_editor.TopLeft.Y],ecx
  1032.  
  1033.   .exit:
  1034.         ret
  1035. endp
  1036.  
  1037. ;-----------------------------------------------------------------------------
  1038. proc key.ctrl_pgup ;///// GO TO DOCUMENT START ///////////////////////////////
  1039. ;-----------------------------------------------------------------------------
  1040.         call    clear_selection
  1041.  
  1042. ;-----------------------------------------------------------------------------
  1043.      key.shift_ctrl_pgup: ;///// GO TO DOCUMENT START, WITH SELECTION ////////
  1044. ;-----------------------------------------------------------------------------
  1045.         xor     eax,eax
  1046.         mov     [cur_editor.TopLeft.Y],eax
  1047.         mov     [cur_editor.Caret.Y],eax
  1048.         test    [chr],KM_SHIFT
  1049.         jnz     @f
  1050.         mov     [cur_editor.SelStart.Y],eax
  1051.     @@:
  1052.  
  1053.   .exit:
  1054.         ret
  1055. endp
  1056.  
  1057. ;-----------------------------------------------------------------------------
  1058. proc key.ctrl_pgdn ;///// GO TO DOCUMENT END /////////////////////////////////
  1059. ;-----------------------------------------------------------------------------
  1060.         call    clear_selection
  1061.  
  1062. ;-----------------------------------------------------------------------------
  1063.      key.shift_ctrl_pgdn: ;///// GO TO DOCUMENT END, WITH SELECTION //////////
  1064. ;-----------------------------------------------------------------------------
  1065.         mov     eax,[cur_editor.Lines.Count]
  1066.         mov     [cur_editor.Caret.Y],eax
  1067.         sub     eax,[lines.scr]
  1068.         jns     @f
  1069.         xor     eax,eax
  1070.     @@: mov     [cur_editor.TopLeft.Y],eax
  1071.         dec     [cur_editor.Caret.Y]
  1072.         test    [chr],KM_SHIFT
  1073.         jnz     @f
  1074.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  1075.     @@:
  1076.  
  1077.   .exit:
  1078.         ret
  1079. endp
  1080.  
  1081. ;-----------------------------------------------------------------------------
  1082. proc key.del ;///// DELETE NEXT CHAR OR SELECTION ////////////////////////////
  1083. ;-----------------------------------------------------------------------------
  1084.         call    delete_selection
  1085.         jnc     .exit
  1086.  
  1087.         mov     ecx,[cur_editor.Caret.Y]
  1088.         call    get_line_offset
  1089.         and     [esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
  1090.         or      [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1091.         lea     ebx,[esi+sizeof.EDITOR_LINE_DATA]
  1092.         mov     ebp,esi
  1093.  
  1094.         call    get_real_length
  1095.         or      eax,eax
  1096.         je      .line_up
  1097.  
  1098.         mov     ecx,[cur_editor.Caret.X]
  1099.         cmp     ecx,eax
  1100.         jae     .line_up
  1101.         lea     edi,[ebx+ecx]
  1102.         neg     ecx
  1103.         mov     eax,[ebp+EDITOR_LINE_DATA.Size]
  1104.         add     ecx,eax;[ebp]
  1105.         repe    scasb
  1106.         je      .line_up
  1107.  
  1108.         mov     edi,ebx
  1109.         mov     ecx,[cur_editor.Caret.X]
  1110.         add     edi,ecx
  1111.         lea     esi,[edi+1]
  1112.         neg     ecx
  1113.         mov     eax,[ebp+EDITOR_LINE_DATA.Size]
  1114.         add     ecx,eax;[ebp]
  1115.         dec     ecx
  1116.         rep     movsb
  1117.         mov     byte[edi],' '
  1118.  
  1119.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  1120.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  1121.         mov     [cur_editor.Modified],1
  1122.         ret
  1123.  
  1124.   .line_up:
  1125.         mov     eax,[cur_editor.Lines.Count]
  1126.         dec     eax
  1127.         cmp     eax,[cur_editor.Caret.Y]
  1128.         je      .exit
  1129.         mov     edi,[temp_buf]
  1130.         add     edi,sizeof.EDITOR_LINE_DATA
  1131.         mov     esi,ebx
  1132.         mov     ecx,[cur_editor.Caret.X]
  1133.         rep     movsb
  1134.         mov     ecx,[cur_editor.Caret.X]
  1135.         mov     eax,[temp_buf]
  1136.         mov     [eax+EDITOR_LINE_DATA.Size],ecx
  1137.         cmp     ecx,[ebp+EDITOR_LINE_DATA.Size]
  1138.         jbe     @f
  1139.         mov     eax,[ebp+EDITOR_LINE_DATA.Size]
  1140.         sub     ecx,eax
  1141.         sub     edi,ecx
  1142.         mov     al,' '
  1143.         rep     stosb
  1144.     @@: lea     esi,[ebx+sizeof.EDITOR_LINE_DATA]
  1145.         mov     eax,[ebp+EDITOR_LINE_DATA.Size]
  1146.         add     esi,eax
  1147.         mov     ecx,[esi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size]
  1148.         mov     eax,[temp_buf]
  1149.         add     [eax+EDITOR_LINE_DATA.Size],ecx
  1150.         or      [eax+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1151.         rep     movsb
  1152.  
  1153.         mov     ecx,edi
  1154.         sub     ecx,[temp_buf]
  1155.  
  1156.         mov     esi,[temp_buf]
  1157.         call    get_real_length
  1158.         cmp     eax,[cur_editor.Columns.Count]
  1159.         jbe     @f
  1160.         mov     [cur_editor.Columns.Count],eax
  1161.     @@:
  1162.         push    ecx
  1163.         mov     edi,[cur_editor.Lines]
  1164.         add     edi,[cur_editor.Lines.Size] ;*** add edi,[edi-4]
  1165.         dec     edi
  1166.         lea     esi,[edi+sizeof.EDITOR_LINE_DATA*2] ; !!! CHECK THIS !!!
  1167.         sub     esi,ecx
  1168.         mov     eax,[ebp+EDITOR_LINE_DATA.Size]
  1169.         add     esi,eax
  1170.         mov     eax,[ebp+eax+sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size]
  1171.         add     esi,eax
  1172.         lea     ecx,[esi-sizeof.EDITOR_LINE_DATA]
  1173.         sub     ecx,ebp
  1174.         std
  1175.         cmp     esi,edi
  1176.         jb      @f
  1177.         jz      .lp1
  1178.         mov     edi,ebp
  1179.         add     edi,[esp]
  1180.         lea     esi,[ebp+sizeof.EDITOR_LINE_DATA*2] ; !!! CHECK THIS !!!
  1181.         mov     eax,[esi-sizeof.EDITOR_LINE_DATA*2+EDITOR_LINE_DATA.Size] ; !!! CHECK THIS !!!
  1182.         add     esi,eax
  1183.         mov     eax,[esi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size] ; !!! CHECK THIS !!!
  1184.         add     esi,eax
  1185.         mov     ecx,[cur_editor.Lines]
  1186.         add     ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
  1187.         sub     ecx,esi
  1188.         cld
  1189.     @@: rep     movsb
  1190.   .lp1: pop     ecx
  1191.         mov     esi,[temp_buf]
  1192.         mov     edi,ebp
  1193.         cld
  1194.         rep     movsb
  1195.  
  1196.   .ok.dec.lines:
  1197.         dec     [cur_editor.Lines.Count]
  1198.         mov     eax,[cur_editor.Lines.Count]
  1199.         cmp     [cur_editor.Caret.Y],eax
  1200.         jb      @f
  1201.         dec     eax
  1202.         mov     [cur_editor.Caret.Y],eax
  1203.     @@: m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  1204.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  1205.  
  1206.         mov     ecx,[cur_editor.Lines.Count]
  1207.         call    get_line_offset
  1208.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  1209.         lea     esi,[esi+eax+sizeof.EDITOR_LINE_DATA]
  1210.         mov     eax,[cur_editor.Lines]
  1211.         add     eax,[cur_editor.Lines.Size] ;*** add eax,[eax-4]
  1212.         sub     esi,eax
  1213.         lea     eax,[esi+4096]
  1214.         call    editor_realloc_lines
  1215.  
  1216.         mov     [cur_editor.Modified],1
  1217.  
  1218.   .exit:
  1219.         ret
  1220. endp
  1221.  
  1222. ;-----------------------------------------------------------------------------
  1223. proc key.ins ;///// TOGGLE INSERT/OVERWRITE MODE /////////////////////////////
  1224. ;-----------------------------------------------------------------------------
  1225.         xor     [ins_mode],1
  1226.         mov     eax,[cur_editor.Caret.Y]
  1227.         mov     ebx,eax
  1228.         call    draw_editor_text.part
  1229.         call    draw_editor_caret
  1230.         ret
  1231. endp
  1232.  
  1233. ;-----------------------------------------------------------------------------
  1234. proc key.bkspace ;///// DELETE PREVIOUS CHAR OR SELECTION ////////////////////
  1235. ;-----------------------------------------------------------------------------
  1236.         call    delete_selection
  1237.         jnc     key.del.exit
  1238.  
  1239.         mov     eax,[cur_editor.Caret.X]
  1240.         dec     eax
  1241.         js      .line_up
  1242.  
  1243.         dec     [cur_editor.Caret.X]
  1244.         mov     ecx,[cur_editor.Caret.Y]
  1245.         call    get_line_offset
  1246.         and     [esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
  1247.         or      [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1248.  
  1249.         mov     ebx,eax
  1250.         call    get_real_length
  1251.         cmp     eax,[cur_editor.Caret.X]
  1252.         jae     @f
  1253.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  1254.         mov     [cur_editor.Modified],1
  1255.         ret
  1256.  
  1257.     @@: lea     edi,[esi+sizeof.EDITOR_LINE_DATA+ebx]
  1258.         mov     ecx,ebx
  1259.         neg     ecx
  1260.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  1261.         add     ecx,eax
  1262.         dec     ecx
  1263.         lea     esi,[edi+1]
  1264.         cld
  1265.         rep     movsb
  1266.         mov     byte[edi],' '
  1267.  
  1268.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  1269.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  1270.         mov     [cur_editor.Modified],1
  1271.         ret
  1272.  
  1273.   .line_up:
  1274.         cmp     [cur_editor.Caret.Y],0
  1275.         jne     @f
  1276.         ret
  1277.     @@: mov     ecx,[cur_editor.Caret.Y]
  1278.         dec     ecx
  1279.         call    get_line_offset
  1280.         and     [esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
  1281.         or      [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1282.  
  1283.         mov     ebp,esi
  1284.         lea     ebx,[esi+sizeof.EDITOR_LINE_DATA]
  1285.         mov     ecx,[ebp+EDITOR_LINE_DATA.Size]
  1286.     @@: cmp     byte[ebx+ecx-1],' '
  1287.         jne     @f
  1288.         dec     ecx
  1289.         jg      @b
  1290.     @@: mov     [cur_editor.Caret.X],ecx
  1291.         dec     [cur_editor.Caret.Y]
  1292.         cld
  1293.         jmp     key.del.line_up
  1294. endp
  1295.  
  1296. ;-----------------------------------------------------------------------------
  1297. proc key.tab ;///// TABULATE /////////////////////////////////////////////////
  1298. ;-----------------------------------------------------------------------------
  1299.         call    delete_selection
  1300.         mov     eax,[cur_editor.Caret.X]
  1301.  
  1302.         mov     ecx,eax
  1303.         add     eax,ATABW
  1304.         and     eax,not(ATABW-1)
  1305.         push    eax ' '
  1306.         sub     eax,ecx
  1307.   .direct:
  1308.         push    eax
  1309.         call    editor_realloc_lines
  1310.         pop     eax
  1311.         mov     ecx,[cur_editor.Caret.Y]
  1312.         call    get_line_offset
  1313.         and     [esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
  1314.         or      [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1315.  
  1316.         xchg    eax,ecx
  1317.  
  1318.         call    get_real_length
  1319.         cmp     eax,[cur_editor.Caret.X]
  1320.         jae     @f
  1321.         mov     eax,[cur_editor.Caret.X]
  1322.     @@: mov     edx,[esi+EDITOR_LINE_DATA.Size]
  1323.         sub     edx,eax
  1324.         cmp     ecx,edx
  1325.         jl      @f
  1326.         push    eax
  1327.         mov     eax,10
  1328.         call    editor_realloc_lines
  1329.         add     esi,eax
  1330.         pop     eax
  1331.         pushad
  1332.         mov     ecx,[cur_editor.Lines]
  1333.         add     ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
  1334.         dec     ecx
  1335.         mov     edi,ecx
  1336.         add     ecx,-10+1
  1337.         mov     eax,[esi+EDITOR_LINE_DATA.Size]
  1338.         lea     eax,[esi+eax+sizeof.EDITOR_LINE_DATA]
  1339.         sub     ecx,eax
  1340.         lea     esi,[edi-10]
  1341.         std
  1342.         rep     movsb
  1343.         mov     ecx,10
  1344.         mov     al,' '
  1345.         rep     stosb
  1346.         popad
  1347.         add     [esi+EDITOR_LINE_DATA.Size],10
  1348.         jmp     @b
  1349.     @@: lea     ebx,[esi+sizeof.EDITOR_LINE_DATA]
  1350.         push    ecx
  1351.         mov     edi,[esi+EDITOR_LINE_DATA.Size]
  1352.         lea     edi,[ebx+edi-1]
  1353.         mov     esi,edi
  1354.         sub     esi,ecx
  1355.         lea     ecx,[esi+1]
  1356.         sub     ecx,ebx
  1357.         sub     ecx,[cur_editor.Caret.X]
  1358.         std
  1359.         rep     movsb
  1360.   .ok:  pop     ecx
  1361.         pop     eax
  1362.         rep     stosb
  1363.         cld
  1364.         pop     [cur_editor.Caret.X]
  1365.         lea     esi,[ebx-sizeof.EDITOR_LINE_DATA]
  1366.         call    get_real_length
  1367.         cmp     eax,[cur_editor.Caret.X]
  1368.         jae     @f
  1369.         mov     eax,[cur_editor.Caret.X]
  1370.     @@: cmp     eax,[cur_editor.Columns.Count]
  1371.         jbe     @f
  1372.         mov     [cur_editor.Columns.Count],eax
  1373.     @@: m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  1374.         m2m     [cur_editor.SelStart.Y],[cur_editor.Caret.Y]
  1375.         mov     [cur_editor.Modified],1
  1376.  
  1377.   .exit:
  1378.         ret
  1379. endp
  1380.  
  1381. ;-----------------------------------------------------------------------------
  1382. proc key.return ;///// CARRIAGE RETURN ///////////////////////////////////////
  1383. ;-----------------------------------------------------------------------------
  1384.         call    delete_selection
  1385. ; unknown how many times the user wants to press "Enter",
  1386. ; so you should do a little more value
  1387.         mov     eax,14*100
  1388.         call    editor_realloc_lines
  1389.  
  1390.         mov     ecx,[cur_editor.Caret.Y]
  1391.         call    get_line_offset
  1392.  
  1393.         mov     ebx,[cur_editor.Caret.X]
  1394.         cmp     ebx,[esi+EDITOR_LINE_DATA.Size]
  1395.         jb      @f
  1396.         mov     ebx,[esi+EDITOR_LINE_DATA.Size]
  1397.         dec     ebx
  1398.         jns     @f
  1399.         xor     ebx,ebx
  1400.     @@:
  1401.         cld
  1402.  
  1403.         mov     edi,[temp_buf]
  1404.         mov     ebp,esi
  1405.         lea     ecx,[ebx+1]
  1406.     @@: dec     ecx
  1407.         jz      @f
  1408.         cmp     byte[esi+ecx+sizeof.EDITOR_LINE_DATA-1],' '
  1409.         je      @b
  1410.     @@: lea     eax,[ecx+10]
  1411.         mov     [edi+EDITOR_LINE_DATA.Size],eax
  1412.         mov     [edi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1413.         add     edi,sizeof.EDITOR_LINE_DATA
  1414.         jecxz   @f
  1415.         push    esi
  1416.         add     esi,sizeof.EDITOR_LINE_DATA
  1417.         rep     movsb
  1418.         pop     esi
  1419.     @@: mov     al,' '
  1420.         mov     ecx,10
  1421.         rep     stosb
  1422.  
  1423.         mov     ecx,[esi+EDITOR_LINE_DATA.Size]
  1424.         sub     ecx,ebx
  1425.         add     esi,ebx
  1426.         add     esi,sizeof.EDITOR_LINE_DATA
  1427.         inc     ecx
  1428.     @@: dec     ecx
  1429.         jz      @f
  1430.         cmp     byte[esi+ecx-1],' '
  1431.         je      @b
  1432.     @@: jz      .lp1
  1433.     @@: cmp     byte[esi],' '
  1434.         jne     .lp1
  1435.         inc     esi
  1436.         loop    @b
  1437.   .lp1: test    [auto_indent],1
  1438.         jz      .lp2
  1439.         push    edi ecx
  1440.         mov     ecx,[ebp+EDITOR_LINE_DATA.Size]
  1441.         lea     edi,[ebp+sizeof.EDITOR_LINE_DATA]
  1442.         mov     al,' '
  1443.         repe    scasb
  1444.         mov     eax,ecx
  1445.         pop     ecx edi
  1446.         je      .lp2
  1447.         neg     eax
  1448.         mov     edx,[ebp+EDITOR_LINE_DATA.Size]
  1449.         add     eax,edx;[ebp]
  1450.         dec     eax
  1451.         jmp     @f
  1452.   .lp2: xor     eax,eax
  1453.     @@: mov     edx,edi
  1454.         add     edi,sizeof.EDITOR_LINE_DATA
  1455.         mov     [cur_editor.Caret.X],eax
  1456.         jecxz   @f
  1457.         push    ecx
  1458.         mov     ecx,eax
  1459.         mov     al,' '
  1460.         rep     stosb
  1461.         pop     ecx
  1462.     @@: jecxz   @f
  1463.         rep     movsb
  1464.     @@: mov     ecx,10
  1465.         mov     al,' '
  1466.         rep     stosb
  1467.  
  1468.         lea     eax,[edi-sizeof.EDITOR_LINE_DATA]
  1469.         sub     eax,edx
  1470.         mov     [edx+EDITOR_LINE_DATA.Size],eax
  1471.         mov     [edx+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
  1472.  
  1473.         mov     ecx,edi
  1474.         sub     ecx,[temp_buf]
  1475.  
  1476.         push    ecx
  1477.         mov     edi,[cur_editor.Lines]
  1478.         add     edi,[cur_editor.Lines.Size] ;*** add edi,[edi-4]
  1479.         dec     edi
  1480.         lea     esi,[edi+sizeof.EDITOR_LINE_DATA]
  1481.         sub     esi,ecx
  1482.         mov     ecx,[ebp+EDITOR_LINE_DATA.Size]
  1483.         add     esi,ecx
  1484.         lea     ecx,[esi-sizeof.EDITOR_LINE_DATA]
  1485.         sub     ecx,ebp
  1486.         std
  1487.         cmp     esi,edi
  1488.         jb      @f
  1489.         je      .lp3
  1490.         lea     esi,[ebp+sizeof.EDITOR_LINE_DATA]
  1491.         mov     eax,[esp]
  1492.         lea     edi,[esi+eax-sizeof.EDITOR_LINE_DATA]
  1493.         mov     ecx,[ebp+EDITOR_LINE_DATA.Size]
  1494.         add     esi,ecx
  1495.         mov     ecx,[cur_editor.Lines]
  1496.         add     ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
  1497.         sub     ecx,esi
  1498.         cld
  1499.     @@: rep     movsb
  1500.   .lp3: pop     ecx
  1501.         mov     esi,[temp_buf]
  1502.         mov     edi,ebp
  1503.         cld
  1504.         rep     movsb
  1505.  
  1506.         inc     [cur_editor.Caret.Y]
  1507.         inc     [cur_editor.SelStart.Y]
  1508.         inc     [cur_editor.Lines.Count]
  1509.  
  1510.         m2m     [cur_editor.SelStart.X],[cur_editor.Caret.X]
  1511.  
  1512.         mov     [cur_editor.Modified],1
  1513.  
  1514.   .exit:
  1515.         ret
  1516. endp
  1517.  
  1518. ;-----------------------------------------------------------------------------
  1519. proc key.ctrl_tab ;///// SWITCH TO NEXT TAB //////////////////////////////////
  1520. ;-----------------------------------------------------------------------------
  1521.         cmp     [tab_bar.Items.Count],1
  1522.         je      .exit
  1523.         xor     eax,eax
  1524.         mov     ebp,[tab_bar.Items]
  1525.     @@: cmp     ebp,[tab_bar.Current.Ptr]
  1526.         je      @f
  1527.         inc     eax
  1528.         add     ebp,sizeof.TABITEM
  1529.         jmp     @b
  1530.     @@: add     ebp,sizeof.TABITEM
  1531.         inc     eax
  1532.         cmp     eax,[tab_bar.Items.Count]
  1533.         jb      @f
  1534.         mov     ebp,[tab_bar.Items]
  1535.     @@: call    set_cur_tab
  1536.         call    make_tab_visible
  1537.         call    align_editor_in_tab
  1538.         call    draw_editor
  1539.         call    draw_tabctl
  1540.         call    update_caption
  1541.   .exit:
  1542.         ret
  1543. endp
  1544.  
  1545. ;-----------------------------------------------------------------------------
  1546. proc key.shift_ctrl_tab ;///// SWITCH TO PREVIOUS TAB ////////////////////////
  1547. ;-----------------------------------------------------------------------------
  1548.         cmp     [tab_bar.Items.Count],1
  1549.         je      .exit
  1550.         xor     eax,eax
  1551.         mov     ebp,[tab_bar.Items]
  1552.     @@: cmp     ebp,[tab_bar.Current.Ptr]
  1553.         je      @f
  1554.         inc     eax
  1555.         add     ebp,sizeof.TABITEM
  1556.         jmp     @b
  1557.     @@: add     ebp,-sizeof.TABITEM
  1558.         dec     eax
  1559.         jge     @f
  1560.         imul    eax,[tab_bar.Items.Count],sizeof.TABITEM
  1561.         add     eax,[tab_bar.Items]
  1562.         lea     ebp,[eax-sizeof.TABITEM]
  1563.     @@: call    set_cur_tab
  1564.         call    make_tab_visible
  1565.         call    align_editor_in_tab
  1566.         call    draw_editor
  1567.         call    draw_tabctl
  1568.         call    update_caption
  1569.   .exit:
  1570.         ret
  1571. endp
  1572.  
  1573. ;-----------------------------------------------------------------------------
  1574. proc key.ctrl_f4 ;///// CLOSE CURRENT TAB ////////////////////////////////////
  1575. ;-----------------------------------------------------------------------------
  1576.         cmp     [cur_editor.Modified],0
  1577.         je      .close
  1578.         mov     [bot_mode2],2
  1579.         jmp     key.ctrl_o.direct
  1580.  .close:
  1581.         mov     [do_not_draw],1
  1582.         push    [tab_bar.Current.Ptr]
  1583.         cmp     [tab_bar.Items.Count],1
  1584.         jne     @f
  1585.         ;call    create_tab
  1586.         jmp     key.alt_x.close         ; close program
  1587.     @@: pop     ebp
  1588.         call    delete_tab
  1589.         dec     [do_not_draw]
  1590.         call    align_editor_in_tab
  1591.         call    draw_editor
  1592.         call    draw_tabctl
  1593.         call    draw_statusbar
  1594.         ret
  1595. endp
  1596.  
  1597. ;-----------------------------------------------------------------------------
  1598. proc key.shift_f9 ;///// SET DEFAULT TAB /////////////////////////////////////
  1599. ;-----------------------------------------------------------------------------
  1600.         mov     eax,[tab_bar.Current.Ptr]
  1601.         cmp     eax,[tab_bar.Default.Ptr]
  1602.         jne     @f
  1603.         xor     eax,eax
  1604.     @@: mov     [tab_bar.Default.Ptr],eax
  1605.         mov     ebp,[tab_bar.Current.Ptr]
  1606.         call    make_tab_visible
  1607.         cmp     [tab_bar.Style],2
  1608.         jbe     @f
  1609.         call    align_editor_in_tab
  1610.         call    draw_editor
  1611.     @@: call    draw_tabctl
  1612.         ret
  1613. endp
  1614.  
  1615. ;-----------------------------------------------------------------------------
  1616. proc key.f3 ;///// FIND NEXT MATCH ///////////////////////////////////////////
  1617. ;-----------------------------------------------------------------------------
  1618.         call    search
  1619.         jc      @f
  1620.     @@: ret
  1621. endp
  1622.  
  1623. ;-----------------------------------------------------------------------------
  1624. proc key.f9 ;///// COMPILE AND RUN ///////////////////////////////////////////
  1625. ;-----------------------------------------------------------------------------
  1626.         mov     bl,1
  1627.         call    start_fasm
  1628.         ret
  1629. endp
  1630.  
  1631. ;-----------------------------------------------------------------------------
  1632. proc key.f10 ;///// COMPILE AND RUN UNDER DEBUG //////////////////////////////
  1633. ;-----------------------------------------------------------------------------
  1634.         mov     bl,2
  1635.         call    start_fasm
  1636.         ret
  1637. endp
  1638.  
  1639. ;-----------------------------------------------------------------------------
  1640. proc key.ctrl_f9 ;///// COMPILE //////////////////////////////////////////////
  1641. ;-----------------------------------------------------------------------------
  1642.         mov     bl,0
  1643.         call    start_fasm
  1644.         ret
  1645. endp
  1646.  
  1647. ;-----------------------------------------------------------------------------
  1648. proc key.alt_x ;///// EXIT PROGRAM ///////////////////////////////////////////
  1649. ;-----------------------------------------------------------------------------
  1650.         mov     [main_closing],1
  1651.         mov     eax,[tab_bar.Items]
  1652.         mov     [exit_tab_item],eax
  1653.         mov     eax,[tab_bar.Items.Count]
  1654.         mov     [exit_tab_num],eax
  1655.   .direct:
  1656.         call    try_to_close_tabs
  1657.         or      eax,eax
  1658.         jz      @f
  1659.         mov     [bot_mode2],2
  1660.         jmp     key.ctrl_o.direct
  1661.  
  1662.     @@: stdcall save_settings
  1663.  
  1664.   .close:
  1665.         mov     [main_closed],1
  1666.         mcall   -1
  1667. endp
  1668.  
  1669. ;-----------------------------------------------------------------------------
  1670. proc try_to_close_tabs ;///// FIND TABS TO BE SAVED BEFORE CLOSE /////////////
  1671. ;-----------------------------------------------------------------------------
  1672.         push    ecx ebp
  1673.         call    flush_cur_tab
  1674.         mov     ebp,[exit_tab_item] ; [tab_bar.Items]
  1675.         add     ebp,-sizeof.TABITEM
  1676.     @@: dec     [exit_tab_num]
  1677.         js      .ok
  1678.         add     ebp,sizeof.TABITEM
  1679.         mov     al,[ebp+TABITEM.Editor.Modified]
  1680.         cmp     [ebp+TABITEM.Editor.Modified],0
  1681.         je      @b
  1682.         mov     [exit_tab_item],ebp
  1683.         call    set_cur_tab
  1684.         call    make_tab_visible
  1685.         xor     eax,eax
  1686.         inc     eax
  1687.     @@: pop     ebp ecx
  1688.         ret
  1689.   .ok:  xor     eax,eax
  1690.         jmp     @b
  1691. endp
  1692.