Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ;Макрос для вывода основных функций которые испльзуются боксом
  2. macro use_general_func
  3. {
  4. ;debug_func
  5. ;----------------------------------------------------------
  6. ;--- процедура прорисовки выделеной части -----------------
  7. ;----------------------------------------------------------
  8. .draw_shift:
  9.         test    word ed_flags,ed_shift_bac ;установка флага, выделенной области
  10.         jz      @f
  11.         mov     ebp,shift_color
  12.         mov     ebx,dword       ed_shift_pos
  13.         call    .sh_cl_
  14. @@:     ret
  15. ;----------------------------------------------------------
  16. ;--- процедура прорисовки текста --------------------------
  17. ;----------------------------------------------------------
  18. .draw_text:
  19. ;--- вычисляем, сколько помещается символов ---
  20. ;--- чтобы мусор не рисовать ---
  21.         call    .get_n
  22.         mov     esi,ed_size
  23.         mov     ebx,ed_offset
  24.         sub     esi,ebx
  25.         cmp     eax,esi
  26.         jae     @F
  27.         mov     esi,eax         ;чтобы не выходить за пределы экрана
  28. ;--- рисуем текст ---                                            
  29. @@:     mov     eax,4
  30.         mov     ebx,ed_left
  31.         mov     edx,ed_offset
  32.         add     ebx,2
  33.         shl     ebx,16
  34.         add     ebx,ed_top
  35.         mov     ecx,ed_text_color
  36.         add     ebx,4
  37.         add     edx,ed_text
  38.         mcall
  39. ret
  40. ;----------------------------------------------------------
  41. ;--- процедура прорисовки фона ----------------------------
  42. ;входные данные
  43. ;eax
  44. ;edx - color
  45. ;----------------------------------------------------------
  46. ;вход только цвет edx
  47. .draw_bg:
  48.         mov     ebx,ed_left
  49.         add     ebx,1
  50.         mov     edx,ed_color
  51.         shl     ebx,16
  52.         add     ebx,ed_width
  53.         sub     ebx,1
  54. .draw_bg_eax:
  55.         mov     ecx,ed_top
  56.         mov     eax,13
  57.         add     ecx,1
  58.         shl     ecx,16
  59.         add     ecx,ed_height
  60.         dec     ecx
  61.         mcall  
  62. ret
  63. ;----------------------------------------------------------
  64. ;--- процедура получения количества символов в текущей щирине компонента
  65. ;----------------------------------------------------------
  66. .get_n:
  67.         mov     eax,ed_width    ;получем ширину компонента
  68.         xor     edx,edx   ;результат распологается в паре edx:eax в eax - остаток
  69.         sub     eax,4           ;вычтим 4
  70.         mov     ebx,6           ;загрузми делитель
  71.         div     ebx             ;размделим на 6
  72. ret
  73. ;----------------------------------------------------------
  74. ;--- процедура рисования курсора --------------------------
  75. ;----------------------------------------------------------
  76. ;входные ebp- цвет
  77. .clear_cursor:
  78.         mov     edx,ebp
  79.         mov     ebx,cl_curs_x
  80.         mov     ecx,cl_curs_y
  81.         jmp     .draw_curs
  82. .draw_cursor:
  83.         mov     edx,ed_text_color
  84.         mov     ebx,ed_pos
  85.         mov     ecx,ed_offset
  86.         sub     ebx,ecx
  87.  
  88.         lea     ebx,[ebx*2+ebx]
  89.         shl     ebx,1
  90.         ;imul   ebx,6
  91.         add     ebx,ed_left
  92.         mov     ecx,ed_top
  93.         inc     ebx
  94.         add     ecx,2
  95.         mov     ebp,ebx
  96.         shl     ebx,16
  97.         mov     bx,bp
  98.         mov     ebp,ecx
  99.        
  100.         shl     ecx,16
  101.         mov     cx,bp
  102.         add     ecx,ed_height-4
  103.        
  104.         mov     cl_curs_x,ebx
  105.         mov     cl_curs_y,ecx
  106. .draw_curs:              
  107.         mcall   38
  108. ret
  109. ;----------------------------------------------------------
  110. ;--- процедура рисования рамки ----------------------------
  111. ;----------------------------------------------------------
  112. .draw_border:
  113. ;--- цвет рамки ---
  114.         test    word ed_flags,ed_focus
  115.         mov     edx,ed_focus_border_color
  116.         jne     @f
  117.         mov     edx,ed_blur_border_color
  118. @@:
  119. ;--- сверху ---
  120.         mov     eax,38
  121.         mov     ebx,ed_left
  122.         mov     ecx,ebx
  123.         shl     ebx,16
  124.         mov     bx,cx
  125.         add     ebx,ed_width
  126.         mov     ecx,ed_top
  127.         mov     esi,ecx
  128.         shl     ecx,16
  129.         mov     cx,si
  130.         mcall
  131. ;--- снизу ---
  132.         mov     esi,ecx
  133.         add     ecx,ed_height
  134.         mov     ebp,ecx
  135.         shl     ecx,16
  136.         mov     cx,bp
  137.         mcall
  138. ;--- слева ---
  139.         mov     cx,si
  140.         mov     ebp,ebx
  141.         sub     ebx,ed_width
  142.         mcall
  143. ;--- справа ---
  144.         mov     ebx,ebp
  145.         shl     ebx,16
  146.         mov     bx,bp
  147.         mcall
  148. ret
  149. ;----------------------------------------------------------
  150. ;--- проверка, зашел ли курсор за границы и, если надо, ---
  151. ;--- изменяем смещение ------------------------------------
  152. ;--- если смещение было установка флага ed_offset_cl иначе
  153. ; если ничего не изменилось то выставление ed_offset_fl
  154. ; в общей битовой маррице состояния компонентов word ed_flags
  155. ;----------------------------------------------------------
  156. .check_offset:
  157. pusha
  158.         mov     ecx,ed_pos
  159.         mov     ebx,ed_offset
  160.         cmp     ebx,ecx
  161.         ja      .sub_8
  162.  
  163.         push    ebx
  164.         call    .get_n                  ;получим кол-во символов в паре регистров edx:eax
  165.         pop     ebx
  166.         mov     edx,ebx
  167.         add     edx,eax         ;ed_offset+width editbox
  168.         inc     edx             ;необходимо для номального положения курсора в крайней левой позиции
  169.         cmp     edx,ecx
  170.         ja      @f
  171.  
  172.         mov     edx,ed_size
  173.         cmp     edx,ecx
  174.         je      .add_end
  175.  
  176.         sub     edx,ecx
  177.         cmp     edx,8
  178.         jbe     .add_8
  179.         add     ebx,8
  180.         jmp     .chk_d
  181.  
  182. .sub_8: cmp     ecx,0
  183.         je      .sub_min
  184.         cmp     ebx,8
  185.         jbe     .sub_min
  186.         sub     ebx,8   ;ebx=ed_offset
  187.         jmp     .chk_d
  188. .sub_min:
  189.         xor     ebx,ebx
  190.         jmp     .chk_d
  191.  
  192. .add_end:sub    edx,eax
  193.         mov     ebx,edx
  194.         jmp     .chk_d
  195. .add_8: add     ebx,edx
  196. .chk_d: mov     ed_offset,ebx
  197.         call    .draw_bg
  198.         and     word ed_flags,ed_offset_cl
  199. edit_ex
  200. @@:
  201.         or      word ed_flags,ed_offset_fl
  202. edit_ex
  203. }
  204.  
  205. macro use_key_func
  206. {
  207. ;Обработка Shift для снятия выделения неизвестной области
  208. .shift: ;;;;;;;SHIFT
  209.         test    word ed_flags,ed_shift
  210.         je      .f_exit
  211.  
  212. @@:     mov     ebp,shift_color
  213.         or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
  214.         mov     ebx,dword       ed_shift_pos
  215.         call    .sh_cl_
  216.         jmp     .draw_cursor_text
  217. ;;;;;;;;;;;;;;;;;;;;;
  218. .f_exit:call    .check_offset
  219.         and     word ed_flags,ed_shift_cl
  220.         call    .enable_null
  221.         jmp     .draw_cursor_text
  222. .sh_cl_:
  223. ;;;;;;SHIFT end
  224. ;обработка очистки, при левом - правом движении выделения
  225. ;для обработки снятия выделения
  226. ;входные параметры ebp=color ebx=ed_shift_pos
  227.         mov     eax,dword       ed_pos
  228.         cmp     eax,ebx
  229.  
  230.         jae     .sh_n
  231.         push    eax  ;меньшее в eax
  232.         push    ebx  ;большее
  233.         jmp     .sh_n1
  234.                      ;если иначе
  235. .sh_n:  push    ebx  
  236.         push    eax
  237. .sh_n1:
  238.         call    .check_offset
  239.         call    .get_n
  240.         mov     edx,eax ;size of ed_box
  241.         mov     ecx,ed_offset
  242.         add     eax,ecx ;eax = w_off= ed_offset+width
  243.         mov     edx,eax ;save
  244.         pop     ebx     ;большее
  245.         pop     eax     ;меньшее
  246.  
  247.         cmp     eax,ecx         ;сравнение с меньшего с offset.
  248.         jae     .f_f            ;если больше
  249.         xor     eax,eax
  250.         cmp     edx,ebx         ;cравним размер w_off с большим
  251.         jb      @f
  252.         sub     ebx,ecx
  253.         jmp     .nxt_f
  254. @@:     mov     ebx,edx
  255.         sub     ebx,ecx
  256.         jmp     .nxt_f
  257. .f_f:  
  258.         sub     eax,ecx
  259.         cmp     edx,ebx         ;cравним размер w_off с большим
  260.         jle     @f
  261.         sub     ebx,ecx
  262.         sub     ebx,eax
  263.         jmp     .nxt_f
  264. @@:
  265.         mov     ebx,edx
  266.         sub     ebx,ecx
  267.         sub     ebx,eax
  268. .nxt_f:
  269.         mov     edx,ebx
  270.         lea     ebx,[eax*2+eax]
  271.         shl     ebx,1
  272.         add     ebx,ed_left
  273.         inc     ebx
  274.         shl     ebx,16
  275.         lea     ecx,[edx*2+edx]
  276.         shl     ecx,1  
  277.         mov     bx,cx
  278.         inc     ebx
  279.         mov     edx,ebp;shift_color
  280.  
  281.         call    .draw_bg_eax
  282. @@:     call    .enable_null
  283.         ret
  284. ;;;;;;;;;;;;;;;;;;;;;
  285. ;Установка- снятие выделения в один символ
  286. ;;;;;;;;;;;;;;;;;;;;;
  287. .drw_sim:
  288.         mov     eax,dword       ed_pos
  289.         call    .draw_rectangle   ;нарисовать прямоугольник с заданным цветом
  290.         jmp     @b
  291. ;;;;;;;;;;;;;;;;;;;;;
  292. ;Фукция установки выделения при движения влево и вправо и нажатии shift
  293. ;Логика:
  294. ;;;;;;;;;;
  295. .draw_wigwag:
  296. ;функция установки переменных
  297.         mov     ebp,shift_color
  298.         call    .clear_cursor
  299.  
  300.         or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
  301.         mov     ebp,shift_color
  302.         mov     eax,dword       ed_pos
  303.         test    word ed_flags,ed_left_fl
  304.         jz      .low
  305.         jmp     @f
  306. ;;;;;;;;;;
  307. ;Фукция удаления выделения при движения влево и вправо и нажатии shift
  308. ;Логика:
  309. ;;;;;;;;;;
  310. .draw_wigwag_cl:
  311. ;функция установки переменных
  312.         mov     ebp,ed_color
  313.         call    .clear_cursor
  314.  
  315.         mov     ebp,ed_color
  316.         mov     eax,dword       ed_pos
  317.         test    word ed_flags,ed_left_fl
  318.         jz      .low
  319. @@:     call    .draw_rectangle  ;нарисовать прямоугольник закрашиваемой области
  320.         ret
  321. .low:   dec     eax
  322.         jmp     @b
  323. ;входной параметр ebx - ed_pos
  324. .sh_first_sh:
  325.         test    word ed_flags,ed_shift
  326.         je      @f
  327.         mov     dword ed_shift_pos_old,ebx
  328.         test    word ed_flags,ed_shift_on
  329.         jne     @f
  330.         mov     dword ed_shift_pos,ebx
  331.         or      word ed_flags,ed_shift_on
  332. @@:     ret
  333. ;Обработка крайних положений в editbox при нажатом shift
  334. ;производит снятие выделение, если нет shift
  335. ;иначе вообще выходит
  336. .sh_st_of:
  337.         test    word ed_flags,ed_shift
  338.         jne     @f
  339.         test    word ed_flags,ed_shift_bac
  340.         je      @f
  341.         mov     ebp,ed_color
  342.         mov     ebx,dword       ed_shift_pos
  343.         call    .sh_cl_  ;очистка выделеного фрагмента
  344.         and     word ed_flags,ed_shift_cl ; очистка от того что убрали выделение
  345.         jmp     .draw_cursor_text
  346. @@:
  347.         and     word ed_flags,ed_shift_off
  348. edit_ex
  349. ;проверка состояния shift был ли он нажат раньше?
  350. .sh_enable:
  351.         test    word ed_flags,ed_shift
  352.         jne     .sh_ext_en ;нарисовать закрашеный прямоугольник
  353.  
  354.         test    word ed_flags,ed_shift_bac
  355.         je      @f
  356.         call    .check_offset
  357.  
  358.         mov     ebp,ed_color
  359.         mov     ebx,dword       ed_shift_pos
  360.         call    .sh_cl_  ;очистка выделеного фрагмента
  361.         call    .draw_wigwag_cl
  362.         and     word ed_flags,ed_shift_cl ; 1вар не нужно
  363.         ret
  364.  
  365. @@:     mov     ebp,ed_color
  366.         call    .clear_cursor
  367.         call    .check_offset
  368.         ret
  369. .sh_ext_en:    
  370.         call    .check_offset
  371.         test    word ed_flags,ed_offset_fl
  372.         je      @f
  373. ;Рисование закрашеных прямоугольников и очистка их
  374.         mov     eax,dword       ed_shift_pos
  375.         mov     ebx,dword       ed_pos
  376.         mov     ecx,dword       ed_shift_pos_old
  377. ;проверка и рисование закрашеных областей
  378.         cmp     eax,ecx
  379.         je      .1_shem
  380.         jb      .smaller
  381.         cmp     ecx,ebx
  382.         ja      .1_shem
  383.         call    .draw_wigwag_cl ;clear
  384.         jmp     .sh_e_end
  385. .smaller:
  386.         cmp     ecx,ebx
  387.         jb      .1_shem
  388.         call    .draw_wigwag_cl ;clear
  389.         jmp     .sh_e_end
  390. ;alike  =
  391. .1_shem: call   .draw_wigwag
  392. .sh_e_end:      and     word ed_flags,ed_shift_off
  393.         ret
  394. @@:     mov     ebp,shift_color
  395.         mov     ebx,dword       ed_shift_pos
  396.         call    .sh_cl_
  397.         jmp     .sh_e_end
  398. ;функция для обработки shift при нажатии home and end
  399. .sh_home_end:
  400.         mov     ebp,ed_color
  401.         call    .clear_cursor
  402.         test    word ed_flags,ed_shift_bac
  403.         je      @f
  404.         mov     ebp,ed_color
  405.         mov     ebx,dword       ed_shift_pos_old
  406.         call    .sh_cl_
  407.  
  408. @@:     test    word ed_flags,ed_shift
  409.         je      .sh_exit_ ;выйти
  410.         mov     ebp,shift_color
  411.         mov     ebx,dword       ed_shift_pos
  412.         call    .sh_cl_
  413.         or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
  414.         jmp     .sh_e_end
  415. .sh_exit_:      call    .check_offset
  416.         ret
  417. ;функция внесения 0 по адресу ed_size+1
  418. .enable_null:
  419.         pusha
  420.         mov     eax,ed_size
  421.         mov     ebx,ed_text
  422.         test    eax,eax
  423.         add     eax,ebx
  424.         jne     @f
  425.         inc     eax
  426. @@:     xor     ebx,ebx
  427.         mov     [eax],bl
  428. edit_ex
  429. ;- удаление символа
  430. ;Входные данные edx=ed_size;ecx=ed_pos
  431. .del_char:
  432.         mov     esi,ed_text
  433.         test    word ed_flags,ed_shift_on
  434.         je      @f
  435.         mov     eax,dword ed_shift_pos
  436.         mov     ebx,esi
  437.         cmp     eax,ecx
  438.         jae     .dh_n
  439.  
  440.         mov     ed_pos,eax      ;что бы не было убегания курсора
  441.         mov     ebp,ecx
  442.         sub     ebp,eax
  443.         add     ebx,eax  ;eax меньше
  444.         sub     edx,ecx
  445.         add     esi,ecx
  446.  
  447.         mov     dword ed_shift_pos,ebp
  448.         jmp     .del_ch_sh
  449.                      ;если иначе
  450. .dh_n:  
  451.         mov     ebp,eax
  452.         sub     ebp,ecx
  453.         add     ebx,ecx
  454.         sub     edx,eax
  455.         add     esi,eax
  456.         mov     dword ed_shift_pos,ebp
  457.         jmp     .del_ch_sh
  458.  
  459. @@:     add     esi,ecx ;указатель + смещение к реальному буфферу
  460.         mov     ebx,esi
  461.         inc     esi
  462.         cld
  463.  
  464.         sub     edx,ecx
  465. .del_ch_sh:
  466.  
  467.         push    edi
  468.         mov     edi,ebx
  469. @@:
  470.         lodsb
  471.         stosb
  472.         dec edx
  473.         jns @b
  474.        
  475.         pop edi
  476.         ret
  477. ;вычислить закрашиваемую область
  478. ;соглашение в ebp - передается ed_size
  479. .clear_bg:
  480.         call    .get_n  ;получить размер в символах ширины компонента
  481.         push    eax
  482.         mov     ebx,ed_offset
  483.         add     eax,ebx ;eax = w_off= ed_offset+width
  484.         mov     ebx,ebp ;ed_size
  485.        
  486.         cmp     eax,ebx
  487.         jb      @f
  488.         mov     eax,ed_pos
  489.         sub     ebx,eax
  490.         mov     ecx,ed_offset
  491.         sub     eax,ecx
  492.         jmp     .nxt
  493. @@:     mov     ebx,ed_pos
  494.         push    ebx
  495.         sub     eax,ebx
  496.         mov     ebx,eax ;It is don't optimal
  497.        
  498.         pop     eax     ;ed_pos
  499.         mov     ecx,ed_offset
  500.         sub     eax,ecx
  501. .nxt:
  502.         mov     ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
  503.         add     ebp,ebx
  504.         pop     edx
  505.         cmp     ebp,edx
  506.         je      @f
  507.         inc     ebx
  508.  
  509. @@:     mov     edx,ebx
  510.         lea     ebx,[eax*2+eax]
  511.         shl     ebx,1
  512.         add     ebx,ed_left
  513.         inc     ebx
  514.         shl     ebx,16
  515.         lea     ecx,[edx*2+edx]
  516.         shl     ecx,1  
  517.         mov     bx,cx
  518.         mov     edx,ed_color
  519.         call    .draw_bg_eax
  520.         ret
  521. ;;;;;;;;;;;;;;;;;;;
  522. ;;; Обработка примитивов
  523. ;;;;;;;;;;;;;;;;;;;;
  524. ;Нарисовать прямоугольник, цвет передается в ebp
  525. ;входные параметры:
  526. ;eax=dword ed_pos
  527. ;ebp=-цвет ed_color or shift_color
  528. .draw_rectangle:
  529.         mov     ecx,dword ed_offset
  530.         sub     eax,ecx
  531.         lea     ebx,[eax*2+eax]
  532.         shl     ebx,1
  533.         inc     ebx
  534.         add     ebx,ed_left
  535.         shl     ebx,16
  536.         add     ebx,6
  537.         mov     edx,ebp
  538.         call    .draw_bg_eax
  539.         ret
  540. ;;;;;;;;;;;;;;;;;;
  541. ;;Проверка нажат ли shift
  542. ;;;;;;;;;;;;;;;;;;
  543. .check_shift:
  544. pusha   ;сохраним все регистры
  545.         mcall   66,3,1
  546.         test    al,0x03
  547.         je      @f
  548.         or      word ed_flags,ed_shift   ;установим флаг
  549. @@:edit_ex
  550. }
  551. ;макрос клавиш на которые происходит реакция
  552. macro use_key_process backspase,delete,left,right,home,end,insert
  553. {
  554. if backspase eq
  555. else
  556.         cmp     ah,8
  557.         jz      .backspace
  558. end if
  559. if delete eq
  560. else
  561.         cmp     ah,0xb6
  562.         jz      .delete
  563. end if
  564. if left eq
  565. else
  566.         cmp     ah,176
  567.         jz      .left
  568. end if
  569. if right eq
  570. else
  571.         cmp     ah,179
  572.         jz      .right
  573. end if
  574. if home eq
  575. else
  576.         cmp     ah,180
  577.         jz      .home
  578. end if
  579. if home eq
  580. else
  581.         cmp     ah,181
  582.         jz      .end
  583. end if
  584. if insert eq
  585. else
  586.         cmp     ah,185  ;insert
  587.         jz      .insert
  588. end if
  589. }
  590. macro use_key_no_process  up,down,esc
  591. {
  592. if up eq
  593. else
  594.         cmp     ah,177
  595.         jz      .editbox_exit
  596. end if
  597. if down eq
  598. else
  599.         cmp     ah,178
  600.         jz      .editbox_exit
  601. end if
  602. if esc eq
  603. else
  604.         cmp     ah,27   ;ESC - клавиша ))
  605.         jz      .editbox_exit
  606. end if
  607. }
  608.  
  609. macro use_key_figures_only
  610. {
  611.         test    word ed_flags,ed_figure_only  ; только цифры ?
  612.         jz      @f
  613.         cmp     ah,'0'
  614.         jb      .editbox_exit
  615.         cmp     ah,'9'
  616.         ja      .editbox_exit
  617. @@:
  618. }
  619. macro are_key_shift_press
  620. {
  621.         test    word ed_flags,ed_shift_on
  622.         je      @f
  623.         ;Входные данные edx=ed_size;ecx=ed_pos
  624.         push    eax
  625.         mov     edx,ed_size
  626.         mov     ecx, ed_pos
  627.         pusha
  628. ;;;;;;;;;;;;;;;;;;;;;
  629. ;clear input arrea
  630.         mov     ebp,ed_color
  631.         mov     ebx,dword       ed_shift_pos
  632.         call    .sh_cl_
  633.         mov     ebp,ed_size
  634.         call    .clear_bg
  635. ;;;;;;;;;;;;;;;;;;;;;
  636.         popa
  637.         call    .del_char
  638. ;;;;
  639.         mov     eax,dword ed_shift_pos
  640.         mov     ebx,ed_size
  641.         sub     ebx,eax
  642.         mov     ed_size,ebx
  643.         pop     eax
  644. @@:
  645. }
  646. macro are_key_cur_end
  647. {
  648.         mov     ecx,ed_size
  649.         mov     edx, ed_max
  650.         test    word ed_flags,ed_insert
  651.         jne     @f
  652.         cmp     ecx,edx
  653.         jae     .editbox_exit
  654. @@:     mov     ebx, ed_pos
  655.         cmp     ebx,edx
  656.         jl      @f ; если меньше или равно
  657.         jmp     .editbox_exit
  658.  
  659. @@:     ; сдвигаем символы после курсора вправо
  660.         mov     ecx,ed_size
  661.         push    edi eax
  662.         mov     ebp,edi
  663.         mov     esi,ed_text     ; Указатель на буфер
  664.                                 ;Будем работать со строкой
  665.         add     esi,ecx         ;add ed_size добавим max size
  666.         mov     edi,esi
  667.  
  668.         cmp     ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
  669.         je      .In_k
  670.  
  671.         test    word [ebp+40],ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
  672.         jne     .ins_v
  673. ;clear
  674. pusha
  675.         mov     edi,ebp
  676.         mov     ebp,ed_size
  677.         call    .clear_bg
  678. popa
  679.         sub     ecx,ebx         ;Найдем кол-во символов для передвижения.
  680.         inc     edi             ;Сместим наши символы в право
  681.         std
  682.         inc     ecx
  683.    @@:  
  684.         ;--------
  685.         lodsb
  686.         stosb
  687.         ;--------
  688.         loop    @b
  689. .In_k:  cld
  690.         pop eax
  691.         mov al,ah
  692.         stosb
  693.         pop edi
  694. ; вставляем код клавиши туда, где курсор
  695.         ; увеличиваем значение размера и позиции
  696.         inc      dword ed_size
  697.         inc      dword ed_pos
  698.         call    .draw_all2
  699.         jmp     .shift
  700. }
  701. macro use_work_key
  702. {
  703. .insert: test   word ed_flags,ed_insert ;not    word ed_insert
  704.          je     @f
  705.          and    word ed_flags,ed_insert_cl
  706.         jmp     .editbox_exit
  707. @@:
  708.         or      word ed_flags,ed_insert
  709.         jmp     .editbox_exit
  710. .ins_v:
  711.         dec     dword [ebp+42];ed_size    ;processing is insert
  712.         sub     esi,ecx
  713.         add     esi,ebx
  714.         mov     edi,esi
  715. ;clear
  716. pusha
  717.         mov     edi,ebp
  718.         mov     ebp,ed_pos
  719.         call    .clear_bg
  720. popa
  721.         jmp     .In_k
  722. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  723. .delete:        
  724.         mov     edx,ed_size
  725.         mov     ecx,ed_pos
  726.         cmp     edx,ecx
  727.         jg      .bac_del
  728.         test    word ed_flags,ed_shift_on
  729.         jne     .del_bac
  730. edit_ex
  731. .bac_del:      
  732.         call    .del_char
  733.         jmp     .draw_all
  734. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;        
  735. ;--- нажата клавиша backspace ---
  736. .backspace:
  737.         ; проверяем, курсор у левого края ?
  738.         mov     ecx,ed_pos
  739.         test    ecx,ecx
  740.         jnz     .del_bac
  741.         test    word ed_flags,ed_shift_on
  742.         jne     .bac_del
  743.  
  744. edit_ex
  745. .del_bac:
  746.         mov     edx,ed_size
  747.         cmp     edx,ecx ;if ed_pos=ed_size
  748.         je      @f
  749.         dec     ecx
  750.         call    .del_char
  751. @@:     test    word ed_flags,ed_shift_on
  752.         jne     .bac_del
  753.         dec      dword ed_pos
  754. .draw_all:
  755.         push    .shift;.draw_cursor_text;eax
  756.  
  757.         test    word ed_flags,ed_shift_on
  758.         je      @f
  759.         mov     eax,dword ed_shift_pos
  760.         mov     ebx,ed_size
  761.         sub     ebx,eax
  762.         mov     ed_size,ebx
  763.  
  764.         mov     ebp,ed_color
  765.         call    .clear_cursor
  766.         call    .check_offset
  767.         call    .draw_bg
  768.         ret
  769. @@:     dec      dword ed_size
  770.  
  771. .draw_all2:
  772.         and    word ed_flags,ed_shift_cl
  773.         mov     ebp,ed_color
  774.         call    .clear_cursor
  775.         call    .check_offset
  776.         mov     ebp,ed_size
  777.         call    .clear_bg
  778.         ret
  779. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  780. ;--- нажата клавиша left ---
  781. .left:  mov     ebx,ed_pos
  782.         test    ebx,ebx
  783.         jz      .sh_st_of
  784.         or      word ed_flags,ed_left_fl
  785.         call    .sh_first_sh
  786.         dec      dword ed_pos
  787.         call    .sh_enable
  788.         jmp     .draw_cursor_text
  789. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  790. ;--- нажата клавиша right ---
  791. .right: mov     ebx,ed_pos
  792.         cmp     ebx,ed_size
  793.         je      .sh_st_of
  794.         and     word ed_flags,ed_right_fl
  795.         call    .sh_first_sh
  796.         inc     dword  ed_pos
  797.         call    .sh_enable
  798.         jmp     .draw_cursor_text
  799. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  800. .home:  
  801.         mov     ebx,ed_pos
  802.         test    ebx,ebx
  803.         jz      .sh_st_of
  804.         call    .sh_first_sh
  805.         xor     eax,eax
  806.         mov     ed_pos,eax
  807.         call    .sh_home_end
  808.         jmp     .draw_cursor_text
  809. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  810. .end:  
  811.         mov     ebx,ed_pos
  812.         cmp     ebx,dword ed_size
  813.         je      .sh_st_of
  814.         call    .sh_first_sh
  815.         mov     eax,ed_size
  816.         mov     ed_pos,eax
  817.         call    .sh_home_end
  818.         jmp     .draw_cursor_text
  819. }
  820.  
  821. macro use_mouse_func scr_w
  822. {
  823. ;----------------------------------------------------------
  824. ;--- Обработка .mouse_wigwag
  825. ;----------------------------------------------------------
  826. .mouse_wigwag:
  827.         shr     eax,16
  828.         or      word ed_flags,ed_shift_bac+ed_shift_on+ed_shift
  829. ;;;;;;;;;;;;;;;;;;
  830. ;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox
  831. ;;;;;;;;;;;;;;;;;;
  832.         mov     ebx,dword [procinfo+34]
  833.         add     ebx,ed_left
  834. if scr_w eq
  835. else
  836.         add     ebx,dword scr_w
  837. end if
  838.         cmp     eax,ebx
  839.         jb      .mleft
  840.  
  841.         add     ebx,ed_width
  842.         cmp     eax,ebx
  843.         ja      .mright
  844.  
  845.         sub     ebx,ed_width
  846.  
  847.         xor     edx,edx
  848.         sub     eax,ebx ; вычтим из координат мышки по оси х координаты до editbox по оси х
  849.         mov     ebx,6
  850.         div     ebx
  851. ;;;;;;;;;;;;;;;;;;
  852. ;;процедура обработки положения выделенного текста, в пределах области editbox
  853. ;;;;;;;;;;;;;;;;;;
  854. ;Получили координаты в eax мышки, т.е. куда она переместилась
  855. ;Рисование закрашеных прямоугольников и очистка их
  856.         add     eax,ed_offset   ;добавим смещение
  857.         cmp     eax,dword ed_size       ;если вышли за пределы, то ничего не делать
  858.         ja      .mwigvag
  859. .mdraw:
  860.         mov     dword   ed_pos,eax ;сохраним новое значение
  861. ;Рисование закрашеных прямоугольников и очистка их
  862.         mov     ecx,dword       ed_shift_pos
  863.         mov     ebx,dword       ed_shift_pos_old
  864.         mov     dword   ed_shift_pos_old,eax    ;внесем новое значение старой позиции курсора
  865. ;проверка и рисование закрашеных областей
  866.         cmp     ecx,ebx         ;выясняем куда было движение на один шаг назад
  867.         je      .m1_shem        ;движения не было ранее
  868.         jb      .msmaller       ;движение было ->
  869.         cmp     ebx,eax         ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит
  870.         ja      .m1_shem        ;если было движение <- то нужно закрасить область
  871.         je      .mwigvag        ;если изменения не было, то ничего не делать
  872.         mov     ebp,ed_color    ;тут нужно очистить область c ed_pos ed_shift_pos_old
  873. ;входные параметры ebp=color ebx=ed_shift_pos
  874.         call    .sh_cl_
  875.         jmp     .mwigvag
  876. .msmaller:
  877.         cmp     ebx,eax
  878.         jb      .m1_shem
  879.         mov     ebp,ed_color
  880. ;входные параметры ebp=color ebx=ed_shift_pos
  881.         call    .sh_cl_
  882.         jmp     .mwigvag
  883. ;alike  =
  884. .m1_shem:
  885.         mov     ebp,shift_color
  886. ;входные параметры ebp=color ebx=ed_shift_pos
  887.         mov     ebx,ecx
  888.         call    .sh_cl_
  889.         jmp     .mwigvag
  890. .mwigvag:
  891.         and     word ed_flags,ed_shift_mcl
  892.         jmp     .draw_cursor_text
  893. ;       popa
  894. ;       ret
  895. .mleft:
  896.         mov     eax,ed_pos
  897.         cmp     eax,0                                        
  898.         jbe      .mwigvag
  899.         dec     eax
  900.         call    .check_offset
  901.         push    eax
  902.         mov     ebx,ed_shift_pos
  903.         mov     ebp,shift_color
  904.         call    .sh_cl_
  905.         pop     eax
  906.         jmp     .mdraw
  907. .mright:
  908.         mov     eax,ed_pos
  909.         mov     ebx,ed_size
  910.         cmp     eax,ebx
  911.         jae     .mwigvag
  912.         inc     eax
  913.         call    .check_offset
  914.         mov     ebx,ed_shift_pos
  915.         mov     ebp,shift_color
  916.         push    eax
  917.         call    .sh_cl_
  918.         pop     eax
  919.         jmp     .mdraw  
  920. }
  921.  
  922. macro use_work_mause scr_h,scr_w
  923. ;----------------------------------------------------------
  924. ;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны?
  925. ;----------------------------------------------------------
  926. {
  927.         test    word ed_flags,ed_mouse_on
  928.         jne     .mouse_wigwag
  929. ;----------------------------------------------------------
  930. ;--- проверяем, попадает ли курсор в edit box -------------
  931. ;----------------------------------------------------------
  932.         mov     ebx,dword [procinfo + 38]
  933.         add     ebx,ed_top
  934. if scr_h eq
  935. else
  936.         add     ebx,scr_h
  937. end if
  938.         cmp     ax,bx
  939.         jl      ._blur;.mouse_end_no_focus
  940.  
  941.         add     ebx,ed_height
  942.         cmp     ax,bx
  943.         jg      ._blur;.mouse_end_no_focus
  944.  
  945.         shr     eax,16
  946.  
  947.         mov     ebx,dword [procinfo + 34]
  948.         add     ebx,ed_left
  949. if scr_w eq
  950. else
  951.         add     ebx,scr_w
  952. end if
  953.         cmp     ax,bx
  954.         jl      ._blur;.mouse_end_no_focus
  955.  
  956.         add     ebx,ed_width
  957.         cmp     ax,bx
  958.         jg      ._blur;.mouse_end_no_focus
  959. ;--- изменяем позицию курсора ---
  960.         push    eax
  961.         mov     ebp,ed_color
  962.         call    .clear_cursor
  963.         pop     eax
  964. ._mvpos:
  965.         mov     ebx,dword [procinfo+ 34]
  966.         xor     edx,edx
  967.         sub     eax,ed_left
  968.         sub     eax,ebx
  969. if scr_w eq
  970. else
  971.         add     ebx,scr_w
  972.         sub     eax,2
  973. end if
  974.         mov     ebx,6
  975.         div     bx
  976.         add     eax,ed_offset
  977.         cmp     eax,ed_size
  978.         jna     ._mshift
  979.         mov     eax,ed_size
  980. ._mshift:
  981. ;;;;;;;
  982. ;;Секция обработки shift и выделения по shift
  983. ;;;;;;;
  984.         test    word ed_flags,ed_shift_bac
  985.         je      @f
  986.         mov     ebp,dword       ed_color
  987.         mov     ebx,dword ed_shift_pos
  988.         push    eax
  989.         call    .sh_cl_
  990.         and     word ed_flags,ed_shift_bac_cl
  991.         pop     eax
  992. @@:    
  993.         test    word ed_flags,ed_mouse_on
  994.         jne     @f
  995.        
  996.         mov     dword ed_shift_pos,eax
  997.         or      word  ed_flags,ed_mouse_on
  998.         mov     dword ed_pos,eax
  999.         mov     dword [mouse_flag],edi          ;установим идентификатор
  1000.         bts     word ed_flags,1                 ;установка фокуса
  1001.         jmp     .m_sh
  1002. @@:            
  1003.         cmp     eax,dword ed_shift_pos  ;если позиции не изменились
  1004.         je      .editbox_exit
  1005.         mov     ed_pos,eax
  1006.         mov     ebp,dword shift_color
  1007.         mov     ebx,dword ed_shift_pos
  1008.         call    .sh_cl_
  1009.         or      word ed_flags,ed_mous_adn_b     ;установим бит что мы выделили +shift_on +
  1010. .m_sh:  call    .draw_text
  1011.         call    .draw_cursor
  1012. ;----------------------------------------------------------
  1013. ;--- процедура установки фокуса ---------------------------
  1014. ;----------------------------------------------------------
  1015.         jmp     .drc
  1016. ._blur:
  1017.         test    word ed_flags,ed_always_focus
  1018.         jne     .editbox_exit
  1019.         btr     word ed_flags,1 ; если не в фокусе, выходим
  1020.         jnc     .editbox_exit
  1021.  
  1022.         mov     ebp,ed_color
  1023.         call    .clear_cursor
  1024. .drc:   call    .draw_border
  1025.         jmp     .editbox_exit
  1026. }
  1027.  
  1028.  
  1029. ; Макрос выхода
  1030. macro edit_ex
  1031. {
  1032. popa          
  1033. ret
  1034. }
  1035. macro debug
  1036. {
  1037.         ;-----------  отладка
  1038.         pushad
  1039. ;        mov     dword [ed_buffer.2],0
  1040. ;        mov     eax,edi
  1041.         mov eax,dword [ed_buffer.2]
  1042.         mov edi,ed_buffer.3
  1043.         call .str
  1044.         ;рисование фона
  1045.         mov eax,13
  1046.         mov ebx,178*65536+70
  1047.         mov ecx,28*65536+10
  1048.         xor edx,edx
  1049.         int 0x40
  1050.         ;вывод значения на экран
  1051.         mov eax,4
  1052.         mov ebx,180*65536+30
  1053.         mov ecx,0x10DDBBCC
  1054.         mov edx,ed_buffer.3
  1055.         mov esi,8
  1056.         int 0x40
  1057.         popad
  1058.         ;----------- отладка
  1059. }
  1060. macro   debug_func
  1061. {
  1062. .str:
  1063.         mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
  1064.          ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
  1065.         cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
  1066.         jb @f
  1067.         xor edx,edx  ;очистить edx
  1068.         div ecx      ;разделить - остаток в edx
  1069.         push edx     ;положить в стек
  1070.         ;dec edi             ;смещение необходимое для записи с конца строки
  1071.         call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
  1072.         pop eax
  1073.         @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
  1074.         ;sbb al,$69  ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
  1075.         ;das        ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
  1076.         or al,0x30  ;данная команда короче  чем две выше
  1077.         stosb       ;записать элемент из регистра al в ячеку памяти es:edi
  1078.  
  1079.         ret         ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
  1080. }
  1081.  
  1082. ;;;;;;;;;;;;;;;
  1083. ;For LibGui
  1084. ;;;;;;;;;;;;;;;
  1085. macro srt_ed_libgui
  1086. {
  1087. ed_width        equ [EditBox.ed_width]            ;ширина компонента
  1088. ed_left         equ [EditBox.ed_left]             ;положение по оси х
  1089. ed_top          equ [EditBox.ed_top]              ;положение по оси у
  1090. ed_color        equ [EditBox.ed_color]            ;цвет фона компонента
  1091. shift_color     equ [EditBox.shift_color]         ;=0x6a9480
  1092. ed_focus_border_color   equ [EditBox.ed_focus_border_color]   ;цвет рамки компонента
  1093. ed_blur_border_color    equ [EditBox.ed_blur_border_color]    ;цвет не активного компонента
  1094. ed_text_color   equ [EditBox.ed_text_color]       ;цвет текста
  1095. ed_max          equ [EditBox.ed_max]              ;кол-во символов которые можно максимально ввести
  1096. ed_text         equ [EditBox.ed_text]             ;указатель на буфер
  1097. ed_flags        equ [EditBox.ed_flags]            ;флаги
  1098. ed_size equ [EditBox.ed_size]                     ;кол-во символов
  1099. ed_pos  equ [EditBox.ed_poz]                      ;позиция курсора
  1100. ed_offset       equ [EditBox.ed_offset]           ;смещение
  1101. cl_curs_x       equ [EditBox.cl_curs_x]           ;предыдущее координата курсора по х
  1102. cl_curs_y       equ [EditBox.cl_curs_y]           ;предыдущее координата курсора по у
  1103. ed_shift_pos    equ [EditBox.ed_shift_pos]        ;положение курсора
  1104. ed_shift_pos_old equ [EditBox.ed_shift_pos_old]   ;старое положение курсора
  1105. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1106. ;Bit mask from editbox
  1107. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1108. ed_figure_only= 1000000000000000b   ;одни символы
  1109. ed_always_focus= 100000000000000b
  1110. ed_focus=                     10b   ;фокус приложения
  1111. ed_shift_on=                1000b   ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift
  1112. ed_shift_on_off=1111111111110111b
  1113. ed_shift=                    100b   ;включается при нажатии на shift т.е. если нажимаю
  1114. ed_shift_off=   1111111111111011b
  1115. ed_shift_bac=              10000b   ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение
  1116. ed_shift_bac_cl=1111111111101111b   ;очистка при удалении выделения
  1117. ed_shift_cl=    1111111111100011b
  1118. ed_shift_mcl=   1111111111111011b
  1119. ed_left_fl=               100000b
  1120. ed_right_fl=    1111111111011111b
  1121. ed_offset_fl=            1000000b
  1122. ed_offset_cl=   1111111110111111b
  1123. ed_insert=              10000000b
  1124. ed_insert_cl=   1111111101111111b
  1125. ed_mouse_on =          100000000b
  1126. ed_mous_adn_b=         100011000b
  1127. ed_mouse_on_off=1111111011111111b
  1128. ed_height=14 ; высота
  1129. }