Subversion Repositories Kolibri OS

Rev

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

  1. ; <Lrz> 26.01.2007 нормальная работа компанента исправил фукцию .check_offset
  2. ; <Lrz> 24.01.2007 пофиксел баги вызваные не правильным кодом )).
  3. ; <Lrz> 22.01.2007 избавился от глюков при работе с выделением и удаление, корректная работа клавишей del & backspase
  4. ; <Lrz> 20.01.2007 реализовал выделение текста по shift
  5. ; <Lrz> 12.12.2006 реализовал поддержку кнопки insert и сегодя компонент почти работает!!!!
  6. ; <Lrz> 07.12.2006 продолжается работа над переработкой компонента,изменениям подверглись многие функции, переработан вывод текста, а така же алгоритм внесения символов.
  7. ; <Lrz> 03.09.2006 по возможности отказался от 16 битной арифметики, добавил новые баги
  8. ; <Lrz> 09.08.2006 произведена оптимизация работы конпок DEL и Backspace, уменьшен размер выполняемого кода.
  9. ; <Lrz> 21.07.2006 добавлена функция кнопки Del, теперь можно удалять символы при помощи данной клавиши
  10. ; Автор: Евтихов Максим (Maxxxx32) email: maxxxxm@mail.ru
  11. ; Дата последних изменений: 13.06.06 10:40
  12. ;  Напишите в исходном коде своей программы use_edit_box,
  13. ; это вставит необходимые процедуры в код вашей программы.
  14. ;  Процедуры:
  15. ;   edit_box.draw - полная перерисовка;
  16. ;   edit_box.key - обработка клавиатуры;
  17. ;   edit_box.mouse - обработка мыши;
  18. ;   edit_box.focus - установка фокуса;
  19. ;   edit_box.blur - его размывание;
  20. ;   edit_box.get_n - получить количество прорисовываемых символов.
  21. ;  При вызове любых из этих процедур в регистре edi следует
  22. ; оставить указатель на структуру.
  23. ;  Пример структуры:
  24. ; some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text
  25. ; длина, высота, верх, цвет фона, цвет рамки, если выбран,
  26. ; цвет рамки, если не выбран, максимальное количество символов,
  27. ; указатель на буфер, где будут хранится символы. Буфер должен
  28. ; оканчиваться нулем, например если максимальное количество 255:
  29. ;  some_edit_text:
  30. ;       rb      256 ;255+1
  31.  
  32. ;  Пример вызова процедуры:
  33. ;       mov     edi,some_edit
  34. ;       call    edit_box.draw
  35.  
  36. ;  При вызове процедуры edit_box.key код клавиши должен
  37. ; находится в ah, то есть перед вызовом этой процедуры надо вызвать
  38. ; 2-ую сисемную функцию, например:
  39. ;       mov     eax,2
  40. ;       int     0x40
  41. ;       mov     edi,some_edit1
  42. ;       call    edit_box.key
  43. ;       mov     edi,some_edit2
  44. ;       call    edit_box.key
  45. ;  Перед вызовом обработчика мыши следует проверить, является ли окно
  46. ; активным.
  47. ;  Если щелчок мыши был пройзведен за пределами edit box
  48. ; фокус теряется.
  49. macro use_edit_box
  50. {
  51. edit_box:
  52. ed_width        equ [edi]               ;ширина компонента
  53. ed_left         equ [edi+4]             ;положение по оси х
  54. ed_top          equ [edi+8]             ;положение по оси у
  55. ed_color        equ [edi+12]            ;цвет фона компонента
  56. ed_focus_border_color   equ [edi+16]    ;цвет рамки компонента
  57. ed_blur_border_color    equ [edi+20]    ;цвет не активного компонента
  58. ed_text_color   equ [edi+24]            ;цвет текста
  59. ed_max          equ [edi+28]                    ;кол-во символов которые можно максимально ввести
  60. ed_text         equ [edi+32]                    ;указатель на буфер
  61. ed_flags        equ [edi+36]            ;флаги
  62. ed_size equ [edi+38]                    ;кол-во символов
  63. ed_pos  equ [edi+42]                    ;позиция курсора
  64. ed_offset       equ [edi+46]            ;смещение
  65. cl_curs_x       equ [edi+50]            ;предыдущее координата курсора по х
  66. cl_curs_y       equ [edi+54]            ;предыдущее координата курсора по у
  67. ed_shift_pos    equ [edi+58]
  68. ed_height=14 ; высота
  69. shift_color=0x6a9480
  70. ed_insert=10000b
  71. ed_insert_cl=1111111111101111b
  72. ;==========================================================
  73. ;=== процедура прорисовки =================================
  74. ;==========================================================
  75. .draw:
  76. pusha
  77. ;--- рисуем рамку ---
  78.         call    .draw_border            ; Функция стабильна
  79. .draw_bg_cursor_text:
  80. ;--- изменяем смещение, если надо ---
  81.         call    .check_offset           ;вычисление позиции курсора стабильна
  82. ;--- рисуем внутреннюю область ---
  83.         call    .draw_bg                ;нарисовать прямоугольник рабочей области
  84. .draw_cursor_text:
  85. ;--- рисуем курсор ---
  86.         ;--- может его не надо рисовать ----
  87.         test    word ed_flags,ed_focus
  88.         je      @f
  89.         call    .draw_cursor
  90. @@:
  91.         call    .draw_text
  92. popa
  93. ret
  94.  
  95. ;.str:
  96. ;       mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
  97. ;        ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
  98. ;       cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
  99. ;       jb @f
  100. ;       xor edx,edx  ;очистить edx
  101. ;       div ecx      ;разделить - остаток в edx
  102. ;       push edx     ;положить в стек
  103. ;       ;dec edi             ;смещение необходимое для записи с конца строки
  104. ;       call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
  105. ;       pop eax
  106. ;       @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
  107. ;       ;sbb al,$69  ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
  108. ;       ;das        ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
  109. ;       or al,0x30  ;данная команда короче  чем две выше
  110. ;       stosb       ;записать элемент из регистра al в ячеку памяти es:edi
  111. ;
  112. ;       ret         ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
  113.  
  114. ;----------------------------------------------------------
  115. ;--- процедура прорисовки текста --------------------------
  116. ;----------------------------------------------------------
  117. .draw_text:
  118. ;--- вычисляем, сколько помещается символов ---
  119. ;--- чтобы мусор не рисовать ---
  120.         call    .get_n
  121.         mov     esi,ed_size
  122.         mov     ebx,ed_offset
  123.         sub     esi,ebx
  124.         cmp     eax,esi
  125.         jae     @F
  126.         mov     esi,eax         ;чтобы не выходить за пределы экрана
  127. ;--- рисуем текст ---
  128. @@:     mov     eax,4
  129.         mov     ebx,ed_left
  130.         add     ebx,2
  131.         shl     ebx,16
  132.         mov     bx,ed_top
  133.         add     ebx,4
  134.         mov     ecx,ed_text_color
  135.         mov     edx,ed_offset
  136.         add     edx,ed_text
  137.         int     0x40
  138. ret
  139. ;----------------------------------------------------------
  140. ;--- процедура прорисовки фона ----------------------------
  141. ;входные данные
  142. ;eax
  143. ;edx - color
  144. ;----------------------------------------------------------
  145. .draw_bg_eax:
  146. ;pusha
  147.         mov     ecx,ed_top
  148.         add     ecx,1
  149.         shl     ecx,16
  150.         mov     cx,13
  151.         mov     eax,13
  152.         int     0x40
  153. ;popa
  154. ret
  155.  
  156.         jmp     @f
  157. .draw_bg:
  158. ;pusha
  159.         mov     ebx,ed_left
  160.         add     ebx,1
  161.         shl     ebx,16
  162.         mov     bx,ed_width
  163.         sub     ebx,1
  164.  
  165. @@:
  166.         mov     ecx,ed_top
  167.         add     ecx,1
  168.         shl     ecx,16
  169.         mov     cx,ed_height
  170.         sub     ecx,1
  171.  
  172.         mov     edx,ed_color
  173.         mov     eax,13
  174.         int     0x40
  175. ;popa
  176. ret
  177.  
  178. ;----------------------------------------------------------
  179. ;--- процедура получения количества символов в текущей щирине компонента --------------
  180. ;----------------------------------------------------------
  181. .get_n:
  182.         xor     edx,edx   ;результат распологается в паре edx:eax в eax - остаток
  183.         mov     eax,ed_width    ;получем ширину компонента
  184.         sub     eax,4           ;вычтим 4
  185.         mov     ebx,6           ;загрузми делитель
  186.         div     ebx             ;размделим на 6
  187. ret
  188.  
  189. ;----------------------------------------------------------
  190. ;--- процедура рисования курсора --------------------------
  191. ;----------------------------------------------------------
  192. .clear_cursor:
  193.         mov     edx,ed_color
  194.         test    word ed_flags,ed_shift
  195.         je      @f
  196.         mov     edx,shift_color
  197. @@:    
  198.         mov     ebx,cl_curs_x
  199.         mov     ecx,cl_curs_y
  200.         jmp     .draw_curs
  201. .draw_cursor:
  202.  
  203.         mov     edx,ed_text_color
  204. @@:
  205.         mov     ebx,ed_pos
  206.         mov     ecx,ed_offset
  207.         sub     ebx,ecx
  208.  
  209.         lea     ebx,[ebx*2+ebx]
  210.         shl     ebx,1
  211.         ;imul   ebx,6
  212.         add     bx,ed_left
  213.         inc     ebx
  214.         mov     ebp,ebx
  215.         ;push   bx
  216.         shl     ebx,16
  217.         mov     bx,bp
  218.         ;pop    bx
  219.         mov     ecx,ed_top
  220.         add     ecx,2
  221.         mov     ebp,ecx
  222.        
  223.         shl     ecx,16
  224.         mov     cx,bp
  225.         add     cx,ed_height-4
  226.        
  227.         mov     cl_curs_x,ebx
  228.         mov     cl_curs_y,ecx
  229. .draw_curs:              
  230.         mov     eax,38
  231.         int     0x40
  232. ret
  233.  
  234. ;----------------------------------------------------------
  235. ;--- процедура рисования рамки ----------------------------
  236. ;----------------------------------------------------------
  237. .draw_border:
  238. ;--- цвет рамки ---
  239.         test    dword ed_flags,ed_focus
  240.         mov     edx,ed_focus_border_color
  241.         jne     @f
  242.         mov     edx,ed_blur_border_color
  243. @@:
  244. ;--- сверху ---
  245.         mov     eax,38
  246.         mov     ebx,ed_left
  247.         mov     ecx,ebx
  248.         shl     ebx,16
  249.         mov     bx,cx
  250.         add     bx,ed_width
  251.         mov     ecx, ed_top
  252.         mov     esi,ecx
  253.         shl     ecx,16
  254.         mov     cx,si
  255.         int     0x40
  256.  
  257. ;--- снизу ---
  258.         mov     esi,ecx
  259.         add     ecx,ed_height
  260.         mov     ebp,ecx
  261.         shl     ecx,16
  262.         mov     cx,bp
  263.         int     0x40
  264.  
  265. ;--- слева ---
  266.         mov     cx,si
  267.         mov     ebp,ebx
  268.         sub     bx,ed_width
  269.         int     0x40
  270.  
  271. ;--- справа ---
  272.         mov     ebx,ebp
  273.         shl     ebx,16
  274.         mov     bx,bp
  275.         int     0x40
  276. ret
  277. ;----------------------------------------------------------
  278. ;--- проверка, зашел ли курсор за границы и, если надо, ---
  279. ;--- изменяем смещение ------------------------------------
  280. ;--- eax = 1, если не изменилось или eax = 0, если
  281. ; изменилось
  282. ;----------------------------------------------------------
  283. .check_offset:
  284.         pushad
  285.         mov     ecx,ed_pos
  286.         mov     ebx,ed_offset
  287.         cmp     ebx,ecx
  288.         ja      .sub_8
  289.  
  290.         push    ebx
  291.         call    .get_n                  ;получим кол-во символов в паре регистров edx:eax
  292.         pop     ebx
  293.         mov     edx,ebx
  294.         add     edx,eax         ;ed_offset+width editbox
  295.         cmp     edx,ecx
  296.         ja      @f
  297.  
  298.         mov     edx,ed_size
  299.         sub     edx,eax
  300.         cmp     edx,8
  301.         jbe     .add_8
  302.         mov     ebx,edx
  303. ;       add     ebx,8
  304.         jmp     .chk_d
  305.  
  306. .sub_8: cmp     ecx,0
  307.         je      .sub_min
  308.         cmp     ebx,8
  309.         jbe     .sub_min
  310.         sub     ebx,8   ;ebx=ed_offset
  311.         jmp     .chk_d
  312. .sub_min:
  313.         xor     ebx,ebx
  314.         jmp     .chk_d
  315.  
  316. .add_8: mov     ebx,edx
  317. ;       ;-----------  отладка
  318. ;       pushad
  319. ;       mov     [data_of_code],0
  320. ;       mov eax,ebx;ed_offset
  321. ;       mov edi,data_of_code
  322. ;       call .str
  323. ;       ;рисование фона
  324. ;       mov eax,13
  325. ;       mov ebx,178*65536+36
  326. ;       mov ecx,28*65536+10
  327. ;       xor edx,edx
  328. ;       int 0x40
  329. ;       ;вывод значения на экран
  330. ;       mov eax,4
  331. ;       mov ebx,180*65536+30
  332. ;       mov ecx,0x10DDBBCC
  333. ;       mov edx,data_of_code
  334. ;       mov esi,4
  335. ;       int 0x40
  336. ;       popad
  337. ;       ;----------- отладка
  338.  
  339. .chk_d: mov     ed_offset,ebx
  340.  
  341.         call    .draw_bg
  342.         mov     dword [esp+28],-1
  343.         popad
  344.         ret
  345.  
  346. @@:
  347.         mov     dword [esp+28],0
  348.         popad
  349.         ret
  350.  
  351.  
  352. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  353. ;       mov     ebx,eax
  354. ;       mov     eax,ed_pos
  355. ;       xor     edx,edx
  356. ;       idiv    ebx
  357. ;       xor     edx,edx
  358. ;       imul    eax,ebx
  359. ;       mov     ed_offset,eax
  360. ;       pop     ebx
  361. ;       cmp     ax,bx
  362. ;       je      @f
  363. ;;;;;;;; данные для закрашивания всей полосы прямоугольника
  364. ;       mov     ebx,ed_left
  365. ;       inc     ebx
  366. ;       shl     ebx,16
  367. ;       mov     bx,ed_width
  368. ;       dec     ebx
  369. ;       mov     edx,ed_color
  370. ;       call    .draw_bg_eax
  371. ;       mov     dword [esp+28],0
  372. ;@@:    popad
  373. ;       ret
  374. ;==========================================================
  375. ;=== обработка клавиатуры =================================
  376. ;==========================================================
  377. .key:
  378. pusha
  379.         test    word ed_flags,ed_focus ; если не в фокусе, выходим
  380.         je     .no_figure ;@f
  381.  
  382.         xor     ecx,ecx
  383.         push    eax    
  384.         inc     ecx
  385.         mov     eax,66
  386.         mov     ebx,3
  387.         int     0x40
  388.         test    al,0x03
  389.         je      @f
  390.         or      word ed_flags,ed_shift
  391.  
  392. @@:     pop     eax
  393. ;----------------------------------------------------------
  394. ;--- проверяем, что нажато --------------------------------
  395. ;----------------------------------------------------------
  396.         cmp     ah,8
  397.         jz      .backspace
  398.         cmp     ah,0xb6
  399.         jz      .delete
  400.         cmp     ah,176
  401.         jz      .left
  402.         cmp     ah,179
  403.         jz      .right
  404.         cmp     ah,180
  405.         jz      .home
  406.         cmp     ah,181
  407.         jz      .end
  408.         cmp     ah,185  ;insert
  409.         jz      .insert
  410. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  411. ;Заглушка на обработку клавиш вверх и вниз
  412. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
  413.         cmp     ah,177
  414.         jz      .no_figure
  415.         cmp     ah,178
  416.         jz      .no_figure
  417.         cmp     ah,27   ;ESC - клавиша ))
  418.         jz      .no_figure
  419. ;--- нажата другая клавиша ---
  420.         test    word ed_flags,ed_figure_only  ; только цифры ?
  421.         jz      @f
  422.         cmp     ah,'0'
  423.         jb      .no_figure
  424.         cmp     ah,'9'
  425.         ja      .no_figure
  426.  
  427.  
  428. ;проверка на shift
  429.         test    word ed_flags,ed_shift_on
  430.         je      @f
  431.         ;Входные данные edx=ed_size;ecx=ed_pos
  432.         push    eax
  433.         mov     edx,ed_size
  434.         mov     ecx,ed_pos
  435.         call    .del_char
  436. ;;;;
  437.         mov     eax,ed_shift_pos
  438.         mov     ebx,ed_size
  439.         sub     ebx,eax
  440.         mov     ed_size,ebx
  441.         pop     eax
  442.  
  443.         ; проверяем, находится ли курсор в конце
  444. @@:     mov     ecx,ed_size
  445.         mov     edx, ed_max
  446.         cmp     ecx,edx
  447.         jae     .no_figure
  448.         mov     ebx, ed_pos
  449.         cmp     ebx,edx
  450.         jl      @f ; если меньше или равно
  451. .no_figure:
  452.         popa
  453.         ret
  454. .insert: test   word ed_flags,ed_insert ;not    word ed_insert
  455.          je     .insert_1
  456.          and    word ed_flags,ed_insert_cl
  457.         jmp     .no_figure
  458. .insert_1:
  459.         or      word ed_flags,ed_insert
  460.         jmp     .no_figure
  461. .ins_v:
  462.         pop     eax edi
  463.         dec     dword ed_size    ;processing is insert
  464.         push    edi eax
  465.         sub     esi,ecx
  466.         add     esi,ebx
  467.         mov     edi,esi
  468.         jmp     .In_k
  469. @@:     ; сдвигаем символы после курсора вправо
  470.         mov     ecx,ed_size
  471.         push    edi eax
  472.         mov     ebp,edi
  473.         mov     esi,ed_text     ; Указатель на буфер
  474.                                 ;Будем работать со строкой
  475.         add     esi,ecx         ;add ed_size добавим max size
  476.         mov     edi,esi
  477.  
  478.         cmp     ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
  479.         je      .In_k
  480.  
  481.         test    word [ebp+36],ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
  482.         jne     .ins_v
  483.  
  484.         sub     ecx,ebx         ;Найдем кол-во символов для передвижения.
  485.         inc     edi             ;Сместим наши символы в право
  486.         std
  487.         inc     ecx
  488.    @@: 
  489.         ;--------
  490.         lodsb
  491.         stosb
  492.         ;--------
  493.         loop    @b
  494. .In_k:  cld
  495.         pop eax
  496.         mov al,ah
  497.         stosb
  498.         pop edi
  499. ; вставляем код клавиши туда, где курсор
  500.         ; увеличиваем значение размера и позиции
  501.         inc      dword ed_size
  502.         inc      dword ed_pos
  503.         call    .draw_all2
  504.         jmp     .shift;.draw_cursor_text
  505. .delete:       
  506.         mov     edx,ed_size
  507.         mov     ecx,ed_pos
  508.         cmp     edx,ecx
  509.         jg      .bac_del
  510.         test    word ed_flags,ed_shift_on
  511.         jne     .del_bac
  512.         popa
  513.         ret
  514. .bac_del:      
  515.         call    .del_char
  516.         jmp     .draw_all
  517.        
  518. ;--- нажата клавиша backspace ---
  519. .backspace:
  520.         ; проверяем, курсор у левого края ?
  521.         mov     edx,ed_size
  522.         mov     ecx,ed_pos
  523.         test    ecx,ecx
  524.         jnz     .del_bac
  525.         test    word ed_flags,ed_shift_on
  526.         jne     .bac_del
  527.        
  528.         ;jmp    @b
  529.  
  530.         popa
  531.         ret
  532. .del_bac:
  533.         cmp     edx,ecx ;if ed_pos=ed_size
  534.         je      @f
  535.         dec     ecx
  536.         call    .del_char
  537. @@:     test    word ed_flags,ed_shift_on
  538.         jne     .bac_del
  539.         dec      dword ed_pos
  540.  
  541. .draw_all:
  542.         push    .shift;.draw_cursor_text;eax
  543.  
  544.         test    word ed_flags,ed_shift_on
  545.         je      @f
  546.         mov     eax,ed_shift_pos
  547.         mov     ebx,ed_size
  548.         sub     ebx,eax
  549.         mov     ed_size,ebx
  550.         jmp     .draw_all2
  551.  
  552. @@:     dec      dword ed_size
  553.  
  554. .draw_all2:
  555.         and    word ed_flags,ed_shift_cl
  556.         call    .clear_cursor
  557.         call    .check_offset
  558. ;;;;;;;;;;;;;;;
  559.         cmp     eax,0
  560.         je      @f
  561.         call    .draw_bg
  562.         ret
  563. ;;;;;;;;;;;;;;;
  564. @@:     call    .get_n
  565.         push    eax
  566.         mov     ebx,ed_offset
  567.         add     eax,ebx ;eax = w_off= ed_offset+width
  568.         mov     ebx,ed_size
  569.        
  570.         cmp     eax,ebx
  571.         jb      @f
  572.         mov     eax,ed_pos
  573.         sub     ebx,eax
  574.         mov     ecx,ed_offset
  575.         sub     eax,ecx
  576.         jmp     .nxt
  577. @@:     mov     ebx,ed_pos
  578.         push    ebx
  579.         sub     eax,ebx
  580.         mov     ebx,eax ;It is don't optimal
  581.        
  582.         pop     eax     ;ed_pos
  583.         mov     ecx,ed_offset
  584.         sub     eax,ecx
  585.  
  586. .nxt:
  587.         mov     ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
  588.         add     ebp,ebx
  589.         pop     edx
  590.         cmp     ebp,edx
  591.         je      @f
  592.         inc     ebx
  593.  
  594. @@:     mov     edx,ebx
  595.         lea     ebx,[eax*2+eax]
  596.         shl     ebx,1
  597.         add     ebx,ed_left
  598.         inc     ebx
  599.         shl     ebx,16
  600.         lea     ecx,[edx*2+edx]
  601.         shl     ecx,1  
  602.         mov     bx,cx
  603.         mov     edx,ed_color
  604.         call    .draw_bg_eax
  605.         ret
  606. ;       jmp     .shift
  607. ;--- нажата клавиша left ---
  608. .left:  call    .sh_enable
  609.         mov     ebx,ed_pos
  610.         test    ebx,ebx
  611.         jz      .nd_k
  612.         call    .clear_cursor
  613.         dec      dword ed_pos
  614.         jmp     .nd_k
  615. ;--- нажата клавиша right ---
  616. .right: call    .sh_enable
  617.         mov     ebx,ed_pos
  618.         cmp     ebx,ed_size
  619.         je      .nd_k
  620.         call    .clear_cursor
  621.         inc     dword  ed_pos
  622.         jmp     .nd_k
  623. .home:  call    .sh_enable
  624.         mov     ebx,ed_pos
  625.         test    ebx,ebx
  626.         jz      .nd_k
  627.         call    .clear_cursor
  628.         xor     eax,eax
  629.         mov     ed_pos,eax
  630.         jmp     .nd_k
  631.  
  632. .end:   call    .sh_enable
  633.         mov     ebx,ed_pos
  634.         cmp     ebx,dword ed_size
  635.         je      .nd_k
  636.         call    .clear_cursor
  637.         mov     eax,ed_size
  638.         mov     ed_pos,eax
  639. .nd_k:  call    .check_offset
  640.         ;test   eax,eax
  641.         ;jz     .draw_bg_cursor_text
  642.         call    .draw_cursor
  643.  
  644. .shift: ;;;;;;;SHIFT
  645.                
  646.         call    .draw_bg        ;не оптимально
  647.         test      word ed_flags,ed_shift
  648.         je      .f_exit
  649. ;;;;;;SHIFT end
  650.         mov     eax,dword       ed_pos
  651.         mov     ebx,dword       ed_shift_pos
  652.         cmp     eax,ebx
  653.         jae     .sh_n
  654.         push    eax  ;меньшее в eax
  655.         push    ebx  ;большее
  656.         jmp     .sh_n1
  657.                      ;если иначе
  658. .sh_n:  push    ebx  
  659.         push    eax
  660. .sh_n1:
  661. ;        jmp    .draw_all2
  662. ;;;;;;;;;;;;;;;;;;;;;;;;;
  663.         ;call   .clear_cursor
  664.         call    .check_offset
  665.         call    .get_n
  666.         mov     edx,eax ;size of ed_box
  667. ;       push    eax
  668.         mov     ecx,ed_offset
  669.         add     eax,ecx ;eax = w_off= ed_offset+width
  670.         mov     ebp,eax ;save
  671.         pop     ebx     ;большее
  672.         pop     eax     ;меньшее
  673.  
  674.        
  675.         cmp     eax,ecx         ;сравнение с меньшего с offset.
  676.         jae     .f_f            ;если больше
  677.         xor     eax,eax
  678.         cmp     ebp,ebx         ;cравним размер w_off с большим
  679.         jb      @f
  680.         sub     ebx,ecx
  681.         jmp     .nxt_f
  682. @@:     mov     ebx,ebp
  683.         sub     ebx,ecx
  684.         jmp     .nxt_f
  685.  
  686. .f_f:  
  687.         sub     eax,ecx
  688.         cmp     ebp,ebx         ;cравним размер w_off с большим
  689.         jle     @f
  690.         sub     ebx,ecx
  691.         sub     ebx,eax
  692.         jmp     .nxt_f
  693. @@:
  694.         mov     ebx,ebp
  695.         sub     ebx,ecx
  696.         sub     ebx,eax
  697. .nxt_f:
  698.         mov     edx,ebx
  699.         lea     ebx,[eax*2+eax]
  700.         shl     ebx,1
  701.         add     ebx,ed_left
  702.         inc     ebx
  703.         shl     ebx,16
  704.         lea     ecx,[edx*2+edx]
  705.         shl     ecx,1  
  706.         mov     bx,cx
  707.         mov     edx,shift_color
  708.         call    .draw_bg_eax
  709.         and    word ed_flags,1111111111111011b
  710.         jmp     .draw_cursor_text
  711. ;;;;;;;;;;;;;;;;;;;;;
  712.  
  713. .f_exit:        and    word ed_flags,ed_shift_cl
  714.         jmp     .draw_cursor_text
  715.  
  716. ;проверка состояния shift был ли он нажат раньше?
  717. .sh_enable:
  718.         test    word ed_flags,ed_shift
  719.         je      @f
  720.         test    word ed_flags,ed_shift_on
  721.         jne     .sh_ext_en
  722.         push    dword ed_pos
  723.         pop     dword ed_shift_pos
  724.         or      word ed_flags,ed_shift_on
  725.         ret
  726.  
  727. @@:     and     word ed_flags,ed_shift_cl
  728. .sh_ext_en:     ret
  729.  
  730.         ;- удаление символа
  731.         ;Входные данные edx=ed_size;ecx=ed_pos
  732. .del_char:
  733.         mov     esi,ed_text
  734.  
  735.  
  736.         test    word ed_flags,ed_shift_on
  737.         je      @f
  738.         mov     eax,dword ed_shift_pos
  739.         mov     ebx,esi
  740.         cmp     eax,ecx
  741.         jae     .dh_n
  742.  
  743.         mov     ed_pos,eax      ;что бы не было убегания курсора
  744.         mov     ebp,ecx
  745.         sub     ebp,eax
  746.         add     ebx,eax  ;eax меньше
  747.         sub     edx,ecx
  748.         add     esi,ecx
  749.  
  750.  
  751.         mov     ed_shift_pos,ebp
  752.         jmp     .del_ch_sh
  753.                      ;если иначе
  754. .dh_n:  
  755.         mov     ebp,eax
  756.         sub     ebp,ecx
  757.         add     ebx,ecx
  758.         sub     edx,eax
  759.         add     esi,eax
  760.         mov     ed_shift_pos,ebp
  761.         jmp     .del_ch_sh
  762.  
  763. @@:     add     esi,ecx ;указатель + смещение к реальному буфферу
  764.         mov     ebx,esi
  765.         inc     esi
  766.         cld
  767.  
  768.         sub     edx,ecx
  769. .del_ch_sh:
  770.  
  771.         push    edi
  772.         mov     edi,ebx
  773. @@:
  774.         lodsb
  775.         stosb
  776.         dec edx
  777.         jns @b
  778.        
  779.         pop edi
  780.         ret
  781. ;==========================================================
  782. ;=== обработка мыши =======================================
  783. ;==========================================================
  784. .mouse:
  785. pusha
  786. ;----------------------------------------------------------
  787. ;--- получаем состояние кнопок мыши -----------------------
  788. ;----------------------------------------------------------
  789.         mov     eax,37
  790.         mov     ebx,2
  791.         int     0x40
  792. ;----------------------------------------------------------
  793. ;--- проверяем состояние ----------------------------------
  794. ;----------------------------------------------------------
  795.         test    eax,1
  796.         jnz     .mouse_left_button
  797. @@:     popa
  798.         ret
  799.  
  800. .mouse_left_button:
  801. ;----------------------------------------------------------
  802. ;--- получаем координаты мыши -----------------------------
  803. ;----------------------------------------------------------
  804.         mov     eax,37
  805.         xor     ebx,ebx
  806.         inc     ebx
  807.         int     0x40
  808. ;----------------------------------------------------------
  809. ;--- проверяем, попадает ли курсор в edit box -------------
  810. ;----------------------------------------------------------
  811.         mov     ebx,ed_top
  812.         cmp     ax,bx
  813.         jl      ._blur;.mouse_end_no_focus
  814.  
  815.         add     bx,ed_height
  816.         cmp     ax,bx
  817.         jg      ._blur;.mouse_end_no_focus
  818.  
  819.         shr     eax,16
  820.  
  821.         mov     bx,ed_left
  822.         cmp     ax,bx
  823.         jl      ._blur;.mouse_end_no_focus
  824.  
  825.         add     bx,ed_width
  826.         cmp     ax,bx
  827.         jg      ._blur;.mouse_end_no_focus
  828. ;--- изменяем позицию курсора ---
  829.         push    eax
  830.         call    .clear_cursor
  831.         pop     eax
  832.         xor     dx,dx
  833.         sub     ax,ed_left
  834.         add     ax,2
  835.         mov     bx,6
  836.         div     bx
  837.         add     ax,ed_offset
  838.         cmp     ax,ed_size
  839.         jna      @f
  840.         mov     ax,ed_size
  841. @@:
  842.         mov     ed_pos,ax
  843.         call    .check_offset
  844.         call    .draw_cursor
  845. ;----------------------------------------------------------
  846. ;--- процедура установки фокуса ---------------------------
  847. ;----------------------------------------------------------
  848.         bts     word ed_flags,1
  849.         jc      .mouse_pressed
  850.         call    .draw_cursor
  851.         call    .draw_border
  852. .mouse_pressed:
  853. popa
  854. ret
  855. ;.mouse_end_no_focus:
  856. ;        call    .blur
  857. ;popa
  858. ;ret
  859. ;.blur:
  860. ;pusha
  861. ._blur:
  862.         btr     word ed_flags,1 ; если не в фокусе, выходим
  863.         jnc     @f
  864.         call    .clear_cursor
  865.         call    .draw_border
  866. @@:
  867. popa
  868. ret
  869.  
  870. ;----------------------------------------------------------
  871. ;--- процедура размывания фокуса --------------------------
  872. ;----------------------------------------------------------
  873. ;.blur:
  874. ;pusha
  875. ;._blur:
  876.         ;btr     ed_flags,1
  877.         ;jnc     @f
  878.         ;call    .draw_border
  879.         ;call    .clear_cursor
  880. ;@@:
  881. ;popa
  882. ;ret
  883. }
  884. ed_figure_only=1000000000000000b
  885. ed_focus=10b
  886. ed_shift_on=1000b
  887. ed_shift=100b
  888. ed_shift_cl=1111111111110011b
  889. macro draw_edit_boxes start,end
  890. {
  891.         mov     edi,start
  892.         mov     ecx,((end-start)/ed_struc_size)
  893. @@:
  894.         call    edit_box.draw
  895.         add     edi,ed_struc_size
  896.         loop    @b
  897. }
  898.  
  899. macro mouse_edit_boxes start,end
  900. {
  901.         mov     edi,start
  902.         mov     ecx,((end-start)/ed_struc_size)
  903. @@:
  904.         call    edit_box.mouse
  905.         add     edi,ed_struc_size
  906.         loop    @b
  907. }
  908.  
  909. macro key_edit_boxes start,end
  910. {
  911.         mov     edi,start
  912.         mov     ecx,((end-start)/ed_struc_size)
  913. @@:
  914.         call    edit_box.key
  915.         add     edi,ed_struc_size
  916.         loop    @b
  917. }
  918. ed_struc_size=62
  919. struc  edit_box width,left,top,color,focus_border_color,\
  920.        blur_border_color,text_color,max,text,flags,size
  921. {
  922. .width dd width
  923. .left dd left
  924. .top dd top
  925. .color dd color
  926. .focus_border_color dd focus_border_color
  927. .blur_border_color dd blur_border_color
  928. .text_color dd text_color
  929. .max dd max
  930. .text dd text
  931. .flags dw flags+0
  932. .size dd size+0
  933. .pos dd 0
  934. .offset dd 0
  935. .cl_curs_x dd 0
  936. .cl_curs_y dd 0
  937. .shift     dd 0
  938. }
  939.  
  940. macro edit_boxes_set_sys_color start,end,color_table
  941. {
  942.         mov     edi,start
  943.         mov     ecx,((end-start)/ed_struc_size)
  944.         mov     esi,color_table
  945. @@:
  946.         mov     eax,[esi+36]
  947.         mov     ebx,[esi+20]
  948.         mov     ed_focus_border_color,eax
  949.         shr     bh,1
  950.         shr     bl,1
  951.         shr     ah,1
  952.         shr     al,1
  953.         add     ah,bh
  954.         add     al,bl
  955.         ror     eax,16
  956.         ror     ebx,16
  957.         shr     bl,1
  958.         shr     al,1
  959.         add     al,bl
  960.         ror     eax,16
  961.         mov     ed_blur_border_color,eax
  962.         add     edi,ed_struc_size
  963.         loop    @b
  964. }