Subversion Repositories Kolibri OS

Rev

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