Subversion Repositories Kolibri OS

Rev

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