Subversion Repositories Kolibri OS

Rev

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

  1. struct TBOX
  2.   x      dw ?
  3.   width  dw ?
  4.   y      dw ?
  5.   height dw ?
  6.   sel.x  db ?
  7.   pos.x  db ?
  8.   ofs.x  db ?
  9.   length db ?
  10.   text   rb 255
  11. ends
  12.  
  13. virtual at ebp
  14.   tbox TBOX
  15. end virtual
  16.  
  17. tb.pos.x        db ?
  18. tb.sel.x        db ?
  19. tb.sel.selected db ?
  20.  
  21. func textbox.get_width
  22.         push    ebx edx
  23.         movzx   eax,[tbox.width-2]
  24.         add     eax,-6
  25.         xor     edx,edx
  26.         mov     ebx,6
  27.         div     ebx
  28.         movzx   ebx,[tbox.length]
  29.         cmp     eax,ebx
  30.         jle     @f
  31.         mov     eax,ebx
  32.     @@: pop     edx ebx
  33.         ret
  34. endf
  35.  
  36. func textbox.delete_selection
  37.         cmp     [tb.sel.selected],0
  38.         je      .exit.2
  39.         pushad
  40.         movzx   ecx,[tbox.length]
  41.         sub     cl,[tb.sel.x]
  42.         lea     eax,[tbox.text]
  43.         movzx   esi,[tb.pos.x]
  44.         movzx   edi,[tb.sel.x]
  45.         add     esi,eax
  46.         add     edi,eax
  47.         mov     eax,esi
  48.         sub     eax,edi
  49.         sub     [tbox.length],al
  50.         cld
  51.         rep     movsb
  52.  
  53.   .exit:
  54.         mov     al,[tb.sel.x]
  55.         mov     [tbox.pos.x],al
  56.         mov     [tbox.sel.x],al
  57.         popad
  58.         clc
  59.         ret
  60.  
  61.   .exit.2:
  62.         stc
  63.         ret
  64. endf
  65.  
  66. func textbox.draw ; TBOX* ebp
  67.         call    textbox.get_width
  68.         movzx   ebx,[tbox.pos.x]
  69.         sub     bl,[tbox.ofs.x]
  70.         sub     ebx,eax
  71.         jle     @f
  72.         mov     bl,[tbox.pos.x]
  73.         sub     bl,al
  74.         mov     [tbox.ofs.x],bl
  75.     @@:
  76.         mov     [tb.sel.selected],0
  77.         mov     al,[tbox.pos.x]
  78.         mov     ah,[tbox.sel.x]
  79.         cmp     al,ah
  80.         je      @f
  81.         inc     [tb.sel.selected]
  82.         ja      @f
  83.         xchg    al,ah
  84.     @@: mov     [tb.pos.x],al
  85.         mov     [tb.sel.x],ah
  86.  
  87.         mcall   13,dword[tbox.x],dword[tbox.y],[color_tbl+4*5];[sc.work]
  88.         mov     edx,[cl_3d_inset]
  89.         call    draw_framerect
  90.  
  91.         call    textbox.get_width
  92.         mov     esi,eax
  93.         mov     edi,eax
  94.  
  95.         cmp     ebp,[focused_tb]
  96.         je      @f
  97.         mov     ebx,dword[tbox.x]
  98.         mov     bx,[tbox.y+2]
  99.         movzx   eax,[tbox.height-2]
  100.         shr     eax,1
  101.         add     eax,4*65536-4
  102.         add     ebx,eax
  103.         lea     edx,[tbox.text]
  104. ;       movzx   esi,[tbox.length]
  105.         mcall   4,,[color_tbl+4*0];[sc.work_text]
  106.         ret
  107.  
  108.     @@: movzx   eax,[tb.pos.x]
  109.         cmp     al,[tb.sel.x]
  110.         je      @f
  111.         sub     al,[tbox.ofs.x]
  112.         jz      @f
  113.         movzx   ebx,[tb.sel.x]
  114.         sub     bl,[tbox.ofs.x]
  115.         jge     .lp1
  116.         xor     ebx,ebx
  117.   .lp1: push    eax ebx
  118.         sub     eax,ebx
  119.         mov     ecx,edi
  120.         sub     ecx,ebx
  121.         cmp     eax,ecx
  122.         jbe     .lp2
  123.         mov     eax,ecx
  124.   .lp2: imul    eax,6
  125.         imul    ebx,6
  126.         movzx   ecx,[tbox.x+2]
  127.         add     ecx,3
  128. ;       sub     eax,ebx
  129.         add     ebx,ecx
  130.         shl     ebx,16
  131.         add     ebx,eax
  132.         movzx   ecx,[tbox.height-2]
  133.         shr     ecx,1
  134.         add     cx,[tbox.y+2]
  135.         shl     ecx,16
  136.         add     ecx,-5*65536+10
  137.         mcall   13,,,[color_tbl+4*7];0x0000007F
  138.  
  139.         mov     esi,[esp]
  140.         lea     edx,[tbox.text]
  141.         movzx   eax,[tbox.ofs.x]
  142.         add     edx,eax
  143.         mov     ebx,dword[tbox.x]
  144.         mov     bx,[tbox.y+2]
  145.         movzx   eax,[tbox.height-2]
  146.         shr     eax,1
  147.         add     eax,4*65536-4
  148.         add     ebx,eax
  149.         mov     eax,4
  150.         or      esi,esi
  151.         jz      .lp3
  152.         mcall   ,,[color_tbl+4*0];[sc.work_text]
  153.   .lp3: sub     edi,esi
  154.         jnz     .lp4
  155.         add     esp,8
  156.         jmp     .exit
  157.   .lp4:
  158.         add     edx,esi
  159.         imul    esi,6*65536
  160.         add     ebx,esi
  161.         pop     ecx esi
  162.         sub     esi,ecx
  163.         cmp     esi,edi
  164.         jbe     .lp5
  165.         mov     esi,edi
  166.   .lp5:
  167.         mcall   ,,[color_tbl+4*6];0x00FFFFFF
  168.         sub     edi,esi
  169.         jz      .exit
  170.         add     edx,esi
  171.         imul    esi,6*65536
  172.         add     ebx,esi
  173.         lea     ecx,[tbox.text]
  174. ;        sub     ecx,edx
  175. ;        add     edi,ecx
  176.         mcall   ,,[color_tbl+4*0],,edi;[sc.work_text],,edi
  177.         jmp     .exit
  178.  
  179.     @@: lea     edx,[tbox.text]
  180.         movzx   eax,[tbox.ofs.x]
  181.         add     edx,eax
  182.         mov     ebx,dword[tbox.x]
  183.         mov     bx,[tbox.y+2]
  184.         movzx   eax,[tbox.height-2]
  185.         shr     eax,1
  186.         add     eax,4*65536-4
  187.         add     ebx,eax
  188.         movzx   eax,[tbox.ofs.x]
  189.         call    textbox.get_width
  190.         mov     esi,eax
  191.         mcall   4,,[color_tbl+4*0];[sc.work_text]
  192.  
  193.   .exit:
  194.         movzx   ebx,[tbox.pos.x]
  195.         movzx   eax,[tbox.ofs.x]
  196.         sub     ebx,eax
  197.         imul    ebx,6
  198.         movzx   eax,[tbox.x+2]
  199.         add     eax,3
  200.         add     ebx,eax
  201.         push    bx
  202.         shl     ebx,16
  203.         pop     bx
  204.         movzx   ecx,[tbox.height-2]
  205.         shr     ecx,1
  206.         add     cx,[tbox.y+2]
  207.         push    cx
  208.         shl     ecx,16
  209.         pop     cx
  210.         add     ecx,-5*65536+4
  211.         mcall   38,,,0x01000000
  212.         add     ebx,0x00010001
  213.         mcall
  214.         ret
  215. endf
  216.  
  217. func textbox.key
  218.         mov     ebp,[focused_tb]
  219.         mov     esi,accel_table_textbox
  220.   .acc: cmp     ebx,[esi]
  221.         jne     @f
  222.         call    dword[esi+4]
  223.         jmp     .exit.2
  224.     @@: add     esi,8
  225.         cmp     byte[esi],0
  226.         jne     .acc
  227.  
  228.         test    byte[shi+2],0x06
  229.         jnz     .exit
  230.         cmp     [tbox.length],255
  231.         je      .exit
  232.  
  233.         movzx   eax,[chr]
  234.         movzx   eax,[eax+key0]
  235.         or      al,al
  236.         jz      .exit
  237.         mov     al,[eax+key1]
  238.         cmp     [tb_casesen],0
  239.         je      @f
  240.         cmp     al,$60
  241.         jle     @f
  242.         add     al,[add_table-$60+eax]
  243.     @@:
  244.         call    textbox.delete_selection
  245.  
  246.         mov     ecx,255
  247.         sub     cl,[tbox.pos.x]
  248.         lea     edi,[tbox.text]
  249.         add     edi,255
  250.         lea     esi,[edi-1]
  251.         std
  252.         rep     movsb
  253.         stosb
  254.         cld
  255.         inc     [tbox.length]
  256.         call    key.tb.right
  257.  
  258.   .exit.2:
  259.         call    textbox.draw
  260.   .exit:
  261.         ret
  262. endf
  263.  
  264. textbox.mouse:
  265.         ret
  266.  
  267. func key.tb.bkspace
  268.         call    textbox.delete_selection
  269.         jnc     @f
  270.  
  271.         cmp     [tbox.pos.x],0
  272.         je      @f
  273.         call    key.tb.left
  274.         jmp     key.tb.del.direct
  275.  
  276.     @@: ret
  277. endf
  278.  
  279. func key.tb.home
  280.         xor     al,al
  281.         mov     [tbox.pos.x],al
  282.         mov     [tbox.sel.x],al
  283.         mov     [tbox.ofs.x],al
  284.         ret
  285. endf
  286.  
  287. func key.tb.left
  288.         mov     al,[tbox.pos.x]
  289.         mov     [tbox.sel.x],al
  290.         dec     al
  291.         js      @f
  292.         mov     [tbox.pos.x],al
  293.         mov     [tbox.sel.x],al
  294.         cmp     [tbox.ofs.x],al
  295.         jl      @f
  296.         sub     [tbox.ofs.x],8
  297.         jge     @f
  298.         mov     [tbox.ofs.x],0
  299.     @@: ret
  300. endf
  301.  
  302. func key.tb.right
  303.         call    textbox.get_width
  304.         mov     bl,[tbox.pos.x]
  305.         mov     [tbox.sel.x],bl
  306.         inc     bl
  307.         cmp     bl,[tbox.length]
  308.         ja      @f
  309.         mov     [tbox.pos.x],bl
  310.         mov     [tbox.sel.x],bl
  311.         sub     bl,[tbox.ofs.x]
  312.         cmp     bl,al
  313.         jbe     @f
  314.         inc     [tbox.ofs.x]
  315.     @@: ret
  316. endf
  317.  
  318. func key.tb.end
  319.         call    textbox.get_width
  320.         movzx   ebx,[tbox.length]
  321.         mov     [tbox.pos.x],bl
  322.         mov     [tbox.sel.x],bl
  323.         sub     ebx,eax
  324.         jge     @f
  325.         xor     bl,bl
  326.     @@: mov     [tbox.ofs.x],bl
  327.         ret
  328. endf
  329.  
  330. func key.tb.del
  331.         call    textbox.delete_selection
  332.         jnc     @f
  333.   .direct:
  334.         movzx   ecx,[tbox.length]
  335.         sub     cl,[tbox.pos.x]
  336.         jz      @f
  337.         lea     eax,[tbox.text]
  338.         movzx   edi,[tbox.pos.x]
  339.         add     edi,eax
  340.         lea     esi,[edi+1]
  341.         dec     [tbox.length]
  342.         cld
  343.         rep     movsb
  344.  
  345.     @@: ret
  346. endf
  347.  
  348. func key.tb.shift_home
  349.         xor     al,al
  350.         mov     [tbox.pos.x],al
  351.         mov     [tbox.ofs.x],al
  352.         ret
  353. endf
  354.  
  355. func key.tb.shift_left
  356.         mov     al,[tbox.pos.x]
  357.         dec     al
  358.         js      @f
  359.         mov     [tbox.pos.x],al
  360.         cmp     [tbox.ofs.x],al
  361.         jl      @f
  362.         sub     [tbox.ofs.x],8
  363.         jge     @f
  364.         mov     [tbox.ofs.x],0
  365.     @@: ret
  366. endf
  367.  
  368. func key.tb.shift_right
  369.         call    textbox.get_width
  370.         mov     bl,[tbox.pos.x]
  371.         inc     bl
  372.         cmp     bl,[tbox.length]
  373.         ja      @f
  374.         mov     [tbox.pos.x],bl
  375.         sub     bl,[tbox.ofs.x]
  376.         cmp     bl,al
  377.         jbe     @f
  378.         inc     [tbox.ofs.x]
  379.     @@: ret
  380. endf
  381.  
  382. func key.tb.shift_end
  383.         call    textbox.get_width
  384.         movzx   ebx,[tbox.length]
  385.         mov     [tbox.pos.x],bl
  386.         sub     ebx,eax
  387.         jge     @f
  388.         xor     bl,bl
  389.     @@: mov     [tbox.ofs.x],bl
  390.         ret
  391. endf
  392.