Subversion Repositories Kolibri OS

Rev

Rev 1372 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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