Subversion Repositories Kolibri OS

Rev

Rev 295 | 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.         cmp     edx,ecx
  300.         je      .add_end
  301.  
  302.         sub     edx,ecx
  303.         cmp     edx,8
  304.         jbe     .add_8
  305.         add     ebx,8
  306.         jmp     .chk_d
  307.  
  308. .sub_8: cmp     ecx,0
  309.         je      .sub_min
  310.         cmp     ebx,8
  311.         jbe     .sub_min
  312.         sub     ebx,8   ;ebx=ed_offset
  313.         jmp     .chk_d
  314. .sub_min:
  315.         xor     ebx,ebx
  316.         jmp     .chk_d
  317.  
  318. .add_end:sub    edx,eax
  319.         mov     ebx,edx
  320.         jmp     .chk_d
  321. .add_8: add     ebx,edx
  322.  
  323. ;       ;-----------  отладка
  324. ;       pushad
  325. ;       mov     [data_of_code],0
  326. ;       mov eax,ebx;ed_offset
  327. ;       mov edi,data_of_code
  328. ;       call .str
  329. ;       ;рисование фона
  330. ;       mov eax,13
  331. ;       mov ebx,178*65536+36
  332. ;       mov ecx,28*65536+10
  333. ;       xor edx,edx
  334. ;       int 0x40
  335. ;       ;вывод значения на экран
  336. ;       mov eax,4
  337. ;       mov ebx,180*65536+30
  338. ;       mov ecx,0x10DDBBCC
  339. ;       mov edx,data_of_code
  340. ;       mov esi,4
  341. ;       int 0x40
  342. ;       popad
  343. ;       ;----------- отладка
  344.  
  345. .chk_d: mov     ed_offset,ebx
  346.  
  347.         call    .draw_bg
  348.         mov     dword [esp+28],-1
  349.         popad
  350.         ret
  351.  
  352. @@:
  353.         mov     dword [esp+28],0
  354.         popad
  355.         ret
  356.  
  357.  
  358. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  359. ;       mov     ebx,eax
  360. ;       mov     eax,ed_pos
  361. ;       xor     edx,edx
  362. ;       idiv    ebx
  363. ;       xor     edx,edx
  364. ;       imul    eax,ebx
  365. ;       mov     ed_offset,eax
  366. ;       pop     ebx
  367. ;       cmp     ax,bx
  368. ;       je      @f
  369. ;;;;;;;; данные для закрашивания всей полосы прямоугольника
  370. ;       mov     ebx,ed_left
  371. ;       inc     ebx
  372. ;       shl     ebx,16
  373. ;       mov     bx,ed_width
  374. ;       dec     ebx
  375. ;       mov     edx,ed_color
  376. ;       call    .draw_bg_eax
  377. ;       mov     dword [esp+28],0
  378. ;@@:    popad
  379. ;       ret
  380. ;==========================================================
  381. ;=== обработка клавиатуры =================================
  382. ;==========================================================
  383. .key:
  384. pusha
  385.         test    word ed_flags,ed_focus ; если не в фокусе, выходим
  386.         je     .no_figure ;@f
  387.  
  388.         xor     ecx,ecx
  389.         push    eax    
  390.         inc     ecx
  391.         mov     eax,66
  392.         mov     ebx,3
  393.         int     0x40
  394.         test    al,0x03
  395.         je      @f
  396.         or      word ed_flags,ed_shift
  397.  
  398. @@:     pop     eax
  399. ;----------------------------------------------------------
  400. ;--- проверяем, что нажато --------------------------------
  401. ;----------------------------------------------------------
  402.         cmp     ah,8
  403.         jz      .backspace
  404.         cmp     ah,0xb6
  405.         jz      .delete
  406.         cmp     ah,176
  407.         jz      .left
  408.         cmp     ah,179
  409.         jz      .right
  410.         cmp     ah,180
  411.         jz      .home
  412.         cmp     ah,181
  413.         jz      .end
  414.         cmp     ah,185  ;insert
  415.         jz      .insert
  416. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  417. ;Заглушка на обработку клавиш вверх и вниз
  418. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;   
  419.         cmp     ah,177
  420.         jz      .no_figure
  421.         cmp     ah,178
  422.         jz      .no_figure
  423.         cmp     ah,27   ;ESC - клавиша ))
  424.         jz      .no_figure
  425. ;--- нажата другая клавиша ---
  426.         test    word ed_flags,ed_figure_only  ; только цифры ?
  427.         jz      @f
  428.         cmp     ah,'0'
  429.         jb      .no_figure
  430.         cmp     ah,'9'
  431.         ja      .no_figure
  432.  
  433.  
  434. ;проверка на shift
  435.         test    word ed_flags,ed_shift_on
  436.         je      @f
  437.         ;Входные данные edx=ed_size;ecx=ed_pos
  438.         push    eax
  439.         mov     edx,ed_size
  440.         mov     ecx,ed_pos
  441.         call    .del_char
  442. ;;;;
  443.         mov     eax,ed_shift_pos
  444.         mov     ebx,ed_size
  445.         sub     ebx,eax
  446.         mov     ed_size,ebx
  447.         pop     eax
  448.  
  449.         ; проверяем, находится ли курсор в конце
  450. @@:     mov     ecx,ed_size
  451.         mov     edx, ed_max
  452.         cmp     ecx,edx
  453.         jae     .no_figure
  454.         mov     ebx, ed_pos
  455.         cmp     ebx,edx
  456.         jl      @f ; если меньше или равно
  457. .no_figure:
  458.         popa
  459.         ret
  460. .insert: test   word ed_flags,ed_insert ;not    word ed_insert
  461.          je     .insert_1
  462.          and    word ed_flags,ed_insert_cl
  463.         jmp     .no_figure
  464. .insert_1:
  465.         or      word ed_flags,ed_insert
  466.         jmp     .no_figure
  467. .ins_v:
  468.         pop     eax edi
  469.         dec     dword ed_size    ;processing is insert
  470.         push    edi eax
  471.         sub     esi,ecx
  472.         add     esi,ebx
  473.         mov     edi,esi
  474.         jmp     .In_k
  475. @@:     ; сдвигаем символы после курсора вправо
  476.         mov     ecx,ed_size
  477.         push    edi eax
  478.         mov     ebp,edi
  479.         mov     esi,ed_text     ; Указатель на буфер
  480.                                 ;Будем работать со строкой
  481.         add     esi,ecx         ;add ed_size добавим max size
  482.         mov     edi,esi
  483.  
  484.         cmp     ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
  485.         je      .In_k
  486.  
  487.         test    word [ebp+36],ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
  488.         jne     .ins_v
  489.  
  490.         sub     ecx,ebx         ;Найдем кол-во символов для передвижения.
  491.         inc     edi             ;Сместим наши символы в право
  492.         std
  493.         inc     ecx
  494.    @@: 
  495.         ;--------
  496.         lodsb
  497.         stosb
  498.         ;--------
  499.         loop    @b
  500. .In_k:  cld
  501.         pop eax
  502.         mov al,ah
  503.         stosb
  504.         pop edi
  505. ; вставляем код клавиши туда, где курсор
  506.         ; увеличиваем значение размера и позиции
  507.         inc      dword ed_size
  508.         inc      dword ed_pos
  509.         call    .draw_all2
  510.         jmp     .shift;.draw_cursor_text
  511. .delete:       
  512.         mov     edx,ed_size
  513.         mov     ecx,ed_pos
  514.         cmp     edx,ecx
  515.         jg      .bac_del
  516.         test    word ed_flags,ed_shift_on
  517.         jne     .del_bac
  518.         popa
  519.         ret
  520. .bac_del:      
  521.         call    .del_char
  522.         jmp     .draw_all
  523.        
  524. ;--- нажата клавиша backspace ---
  525. .backspace:
  526.         ; проверяем, курсор у левого края ?
  527.         mov     edx,ed_size
  528.         mov     ecx,ed_pos
  529.         test    ecx,ecx
  530.         jnz     .del_bac
  531.         test    word ed_flags,ed_shift_on
  532.         jne     .bac_del
  533.        
  534.         ;jmp    @b
  535.  
  536.         popa
  537.         ret
  538. .del_bac:
  539.         cmp     edx,ecx ;if ed_pos=ed_size
  540.         je      @f
  541.         dec     ecx
  542.         call    .del_char
  543. @@:     test    word ed_flags,ed_shift_on
  544.         jne     .bac_del
  545.         dec      dword ed_pos
  546.  
  547. .draw_all:
  548.         push    .shift;.draw_cursor_text;eax
  549.  
  550.         test    word ed_flags,ed_shift_on
  551.         je      @f
  552.         mov     eax,ed_shift_pos
  553.         mov     ebx,ed_size
  554.         sub     ebx,eax
  555.         mov     ed_size,ebx
  556.         jmp     .draw_all2
  557.  
  558. @@:     dec      dword ed_size
  559.  
  560. .draw_all2:
  561.         and    word ed_flags,ed_shift_cl
  562.         call    .clear_cursor
  563.         call    .check_offset
  564. ;;;;;;;;;;;;;;;
  565.         cmp     eax,0
  566.         je      @f
  567.         call    .draw_bg
  568.         ret
  569. ;;;;;;;;;;;;;;;
  570. @@:     call    .get_n
  571.         push    eax
  572.         mov     ebx,ed_offset
  573.         add     eax,ebx ;eax = w_off= ed_offset+width
  574.         mov     ebx,ed_size
  575.        
  576.         cmp     eax,ebx
  577.         jb      @f
  578.         mov     eax,ed_pos
  579.         sub     ebx,eax
  580.         mov     ecx,ed_offset
  581.         sub     eax,ecx
  582.         jmp     .nxt
  583. @@:     mov     ebx,ed_pos
  584.         push    ebx
  585.         sub     eax,ebx
  586.         mov     ebx,eax ;It is don't optimal
  587.        
  588.         pop     eax     ;ed_pos
  589.         mov     ecx,ed_offset
  590.         sub     eax,ecx
  591.  
  592. .nxt:
  593.         mov     ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
  594.         add     ebp,ebx
  595.         pop     edx
  596.         cmp     ebp,edx
  597.         je      @f
  598.         inc     ebx
  599.  
  600. @@:     mov     edx,ebx
  601.         lea     ebx,[eax*2+eax]
  602.         shl     ebx,1
  603.         add     ebx,ed_left
  604.         inc     ebx
  605.         shl     ebx,16
  606.         lea     ecx,[edx*2+edx]
  607.         shl     ecx,1  
  608.         mov     bx,cx
  609.         mov     edx,ed_color
  610.         call    .draw_bg_eax
  611.         ret
  612. ;       jmp     .shift
  613. ;--- нажата клавиша left ---
  614. .left:  call    .sh_enable
  615.         mov     ebx,ed_pos
  616.         test    ebx,ebx
  617.         jz      .nd_k
  618.         call    .clear_cursor
  619.         dec      dword ed_pos
  620.         jmp     .nd_k
  621. ;--- нажата клавиша right ---
  622. .right: call    .sh_enable
  623.         mov     ebx,ed_pos
  624.         cmp     ebx,ed_size
  625.         je      .nd_k
  626.         call    .clear_cursor
  627.         inc     dword  ed_pos
  628.         jmp     .nd_k
  629. .home:  call    .sh_enable
  630.         mov     ebx,ed_pos
  631.         test    ebx,ebx
  632.         jz      .nd_k
  633.         call    .clear_cursor
  634.         xor     eax,eax
  635.         mov     ed_pos,eax
  636.         jmp     .nd_k
  637.  
  638. .end:   call    .sh_enable
  639.         mov     ebx,ed_pos
  640.         cmp     ebx,dword ed_size
  641.         je      .nd_k
  642.         call    .clear_cursor
  643.         mov     eax,ed_size
  644.         mov     ed_pos,eax
  645. .nd_k:  call    .check_offset
  646.         ;test   eax,eax
  647.         ;jz     .draw_bg_cursor_text
  648.         call    .draw_cursor
  649.  
  650. .shift: ;;;;;;;SHIFT
  651.                
  652.         call    .draw_bg        ;не оптимально
  653.         test      word ed_flags,ed_shift
  654.         je      .f_exit
  655. ;;;;;;SHIFT end
  656.         mov     eax,dword       ed_pos
  657.         mov     ebx,dword       ed_shift_pos
  658.         cmp     eax,ebx
  659.         jae     .sh_n
  660.         push    eax  ;меньшее в eax
  661.         push    ebx  ;большее
  662.         jmp     .sh_n1
  663.                      ;если иначе
  664. .sh_n:  push    ebx  
  665.         push    eax
  666. .sh_n1:
  667. ;        jmp    .draw_all2
  668. ;;;;;;;;;;;;;;;;;;;;;;;;;
  669.         ;call   .clear_cursor
  670.         call    .check_offset
  671.         call    .get_n
  672.         mov     edx,eax ;size of ed_box
  673. ;       push    eax
  674.         mov     ecx,ed_offset
  675.         add     eax,ecx ;eax = w_off= ed_offset+width
  676.         mov     ebp,eax ;save
  677.         pop     ebx     ;большее
  678.         pop     eax     ;меньшее
  679.  
  680.        
  681.         cmp     eax,ecx         ;сравнение с меньшего с offset.
  682.         jae     .f_f            ;если больше
  683.         xor     eax,eax
  684.         cmp     ebp,ebx         ;cравним размер w_off с большим
  685.         jb      @f
  686.         sub     ebx,ecx
  687.         jmp     .nxt_f
  688. @@:     mov     ebx,ebp
  689.         sub     ebx,ecx
  690.         jmp     .nxt_f
  691.  
  692. .f_f:  
  693.         sub     eax,ecx
  694.         cmp     ebp,ebx         ;cравним размер w_off с большим
  695.         jle     @f
  696.         sub     ebx,ecx
  697.         sub     ebx,eax
  698.         jmp     .nxt_f
  699. @@:
  700.         mov     ebx,ebp
  701.         sub     ebx,ecx
  702.         sub     ebx,eax
  703. .nxt_f:
  704.         mov     edx,ebx
  705.         lea     ebx,[eax*2+eax]
  706.         shl     ebx,1
  707.         add     ebx,ed_left
  708.         inc     ebx
  709.         shl     ebx,16
  710.         lea     ecx,[edx*2+edx]
  711.         shl     ecx,1  
  712.         mov     bx,cx
  713.         mov     edx,shift_color
  714.         call    .draw_bg_eax
  715.         and    word ed_flags,1111111111111011b
  716.         jmp     .draw_cursor_text
  717. ;;;;;;;;;;;;;;;;;;;;;
  718.  
  719. .f_exit:        and    word ed_flags,ed_shift_cl
  720.         jmp     .draw_cursor_text
  721.  
  722. ;проверка состояния shift был ли он нажат раньше?
  723. .sh_enable:
  724.         test    word ed_flags,ed_shift
  725.         je      @f
  726.         test    word ed_flags,ed_shift_on
  727.         jne     .sh_ext_en
  728.         push    dword ed_pos
  729.         pop     dword ed_shift_pos
  730.         or      word ed_flags,ed_shift_on
  731.         ret
  732.  
  733. @@:     and     word ed_flags,ed_shift_cl
  734. .sh_ext_en:     ret
  735.  
  736.         ;- удаление символа
  737.         ;Входные данные edx=ed_size;ecx=ed_pos
  738. .del_char:
  739.         mov     esi,ed_text
  740.  
  741.  
  742.         test    word ed_flags,ed_shift_on
  743.         je      @f
  744.         mov     eax,dword ed_shift_pos
  745.         mov     ebx,esi
  746.         cmp     eax,ecx
  747.         jae     .dh_n
  748.  
  749.         mov     ed_pos,eax      ;что бы не было убегания курсора
  750.         mov     ebp,ecx
  751.         sub     ebp,eax
  752.         add     ebx,eax  ;eax меньше
  753.         sub     edx,ecx
  754.         add     esi,ecx
  755.  
  756.  
  757.         mov     ed_shift_pos,ebp
  758.         jmp     .del_ch_sh
  759.                      ;если иначе
  760. .dh_n:  
  761.         mov     ebp,eax
  762.         sub     ebp,ecx
  763.         add     ebx,ecx
  764.         sub     edx,eax
  765.         add     esi,eax
  766.         mov     ed_shift_pos,ebp
  767.         jmp     .del_ch_sh
  768.  
  769. @@:     add     esi,ecx ;указатель + смещение к реальному буфферу
  770.         mov     ebx,esi
  771.         inc     esi
  772.         cld
  773.  
  774.         sub     edx,ecx
  775. .del_ch_sh:
  776.  
  777.         push    edi
  778.         mov     edi,ebx
  779. @@:
  780.         lodsb
  781.         stosb
  782.         dec edx
  783.         jns @b
  784.        
  785.         pop edi
  786.         ret
  787. ;==========================================================
  788. ;=== обработка мыши =======================================
  789. ;==========================================================
  790. .mouse:
  791. pusha
  792. ;----------------------------------------------------------
  793. ;--- получаем состояние кнопок мыши -----------------------
  794. ;----------------------------------------------------------
  795.         mov     eax,37
  796.         mov     ebx,2
  797.         int     0x40
  798. ;----------------------------------------------------------
  799. ;--- проверяем состояние ----------------------------------
  800. ;----------------------------------------------------------
  801.         test    eax,1
  802.         jnz     .mouse_left_button
  803. @@:     popa
  804.         ret
  805.  
  806. .mouse_left_button:
  807. ;----------------------------------------------------------
  808. ;--- получаем координаты мыши -----------------------------
  809. ;----------------------------------------------------------
  810.         mov     eax,37
  811.         xor     ebx,ebx
  812.         inc     ebx
  813.         int     0x40
  814. ;----------------------------------------------------------
  815. ;--- проверяем, попадает ли курсор в edit box -------------
  816. ;----------------------------------------------------------
  817.         mov     ebx,ed_top
  818.         cmp     ax,bx
  819.         jl      ._blur;.mouse_end_no_focus
  820.  
  821.         add     bx,ed_height
  822.         cmp     ax,bx
  823.         jg      ._blur;.mouse_end_no_focus
  824.  
  825.         shr     eax,16
  826.  
  827.         mov     bx,ed_left
  828.         cmp     ax,bx
  829.         jl      ._blur;.mouse_end_no_focus
  830.  
  831.         add     bx,ed_width
  832.         cmp     ax,bx
  833.         jg      ._blur;.mouse_end_no_focus
  834. ;--- изменяем позицию курсора ---
  835.         push    eax
  836.         call    .clear_cursor
  837.         pop     eax
  838.         xor     dx,dx
  839.         sub     ax,ed_left
  840.         add     ax,2
  841.         mov     bx,6
  842.         div     bx
  843.         add     ax,ed_offset
  844.         cmp     ax,ed_size
  845.         jna      @f
  846.         mov     ax,ed_size
  847. @@:
  848.         mov     ed_pos,ax
  849.         call    .check_offset
  850.         call    .draw_cursor
  851. ;----------------------------------------------------------
  852. ;--- процедура установки фокуса ---------------------------
  853. ;----------------------------------------------------------
  854.         bts     word ed_flags,1
  855.         jc      .mouse_pressed
  856.         call    .draw_cursor
  857.         call    .draw_border
  858. .mouse_pressed:
  859. popa
  860. ret
  861. ;.mouse_end_no_focus:
  862. ;        call    .blur
  863. ;popa
  864. ;ret
  865. ;.blur:
  866. ;pusha
  867. ._blur:
  868.         btr     word ed_flags,1 ; если не в фокусе, выходим
  869.         jnc     @f
  870.         call    .clear_cursor
  871.         call    .draw_border
  872. @@:
  873. popa
  874. ret
  875.  
  876. ;----------------------------------------------------------
  877. ;--- процедура размывания фокуса --------------------------
  878. ;----------------------------------------------------------
  879. ;.blur:
  880. ;pusha
  881. ;._blur:
  882.         ;btr     ed_flags,1
  883.         ;jnc     @f
  884.         ;call    .draw_border
  885.         ;call    .clear_cursor
  886. ;@@:
  887. ;popa
  888. ;ret
  889. }
  890. ed_figure_only=1000000000000000b
  891. ed_focus=10b
  892. ed_shift_on=1000b
  893. ed_shift=100b
  894. ed_shift_cl=1111111111110011b
  895. macro draw_edit_boxes start,end
  896. {
  897.         mov     edi,start
  898.         mov     ecx,((end-start)/ed_struc_size)
  899. @@:
  900.         call    edit_box.draw
  901.         add     edi,ed_struc_size
  902.         loop    @b
  903. }
  904.  
  905. macro mouse_edit_boxes start,end
  906. {
  907.         mov     edi,start
  908.         mov     ecx,((end-start)/ed_struc_size)
  909. @@:
  910.         call    edit_box.mouse
  911.         add     edi,ed_struc_size
  912.         loop    @b
  913. }
  914.  
  915. macro key_edit_boxes start,end
  916. {
  917.         mov     edi,start
  918.         mov     ecx,((end-start)/ed_struc_size)
  919. @@:
  920.         call    edit_box.key
  921.         add     edi,ed_struc_size
  922.         loop    @b
  923. }
  924. ed_struc_size=62
  925. struc  edit_box width,left,top,color,focus_border_color,\
  926.        blur_border_color,text_color,max,text,flags,size
  927. {
  928. .width dd width
  929. .left dd left
  930. .top dd top
  931. .color dd color
  932. .focus_border_color dd focus_border_color
  933. .blur_border_color dd blur_border_color
  934. .text_color dd text_color
  935. .max dd max
  936. .text dd text
  937. .flags dw flags+0
  938. .size dd size+0
  939. .pos dd 0
  940. .offset dd 0
  941. .cl_curs_x dd 0
  942. .cl_curs_y dd 0
  943. .shift     dd 0
  944. }
  945.  
  946. macro edit_boxes_set_sys_color start,end,color_table
  947. {
  948.         mov     edi,start
  949.         mov     ecx,((end-start)/ed_struc_size)
  950.         mov     esi,color_table
  951. @@:
  952.         mov     eax,[esi+36]
  953.         mov     ebx,[esi+20]
  954.         mov     ed_focus_border_color,eax
  955.         shr     bh,1
  956.         shr     bl,1
  957.         shr     ah,1
  958.         shr     al,1
  959.         add     ah,bh
  960.         add     al,bl
  961.         ror     eax,16
  962.         ror     ebx,16
  963.         shr     bl,1
  964.         shr     al,1
  965.         add     al,bl
  966.         ror     eax,16
  967.         mov     ed_blur_border_color,eax
  968.         add     edi,ed_struc_size
  969.         loop    @b
  970. }