Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ; SEE YOU File FAQ.txt and HISTORY. Good Like!
  2. ;;;;;;;;;;;;;;;;;;
  3. include 'editbox.mac'    ;макрос который должен облегчить жизнь :) специально для editbox
  4. ;;;;;;;;;;;;;;;;;;
  5. macro use_edit_box procinfo,scr_h,scr_w
  6. {
  7. edit_box:
  8. ed_width        equ [edi]               ;ширина компонента
  9. ed_left         equ [edi+4]             ;положение по оси х
  10. ed_top          equ [edi+8]             ;положение по оси у
  11. ed_color        equ [edi+12]            ;цвет фона компонента
  12. shift_color     equ [edi+16]            ;=0x6a9480
  13. ed_focus_border_color   equ [edi+20]    ;цвет рамки компонента
  14. ed_blur_border_color    equ [edi+24]    ;цвет не активного компонента
  15. ed_text_color   equ [edi+28]            ;цвет текста
  16. ed_max          equ [edi+32]                    ;кол-во символов которые можно максимально ввести
  17. ed_text         equ [edi+36]                    ;указатель на буфер
  18. ed_flags        equ [edi+40]            ;флаги
  19. ed_size equ [edi+42]                    ;кол-во символов
  20. ed_pos  equ [edi+46]                    ;позиция курсора
  21. ed_offset       equ [edi+50]            ;смещение
  22. cl_curs_x       equ [edi+54]            ;предыдущее координата курсора по х
  23. cl_curs_y       equ [edi+58]            ;предыдущее координата курсора по у
  24. ed_shift_pos    equ [edi+62]            ;положение курсора
  25. ed_shift_pos_old equ [edi+66]           ;старое положение курсора
  26. ;==========================================================
  27. ;=== процедура прорисовки =================================
  28. ;==========================================================
  29. .draw:
  30. pusha
  31. ;--- рисуем рамку ---
  32.         call    .draw_border            ; Функция стабильна
  33. .draw_bg_cursor_text:
  34. ;--- изменяем смещение, если надо ---
  35.         call    .check_offset           ;вычисление позиции курсора стабильна
  36. ;--- рисуем внутреннюю область ---
  37.         call    .draw_bg                ;нарисовать прямоугольник рабочей области
  38. ;---- рисуем выделение, по shift если есть
  39.         call    .draw_shift
  40. .draw_cursor_text:
  41. ;--- рисуем курсор ---
  42.         ;--- может его не надо рисовать ----
  43.         test    word ed_flags,ed_focus
  44.         je     @f
  45.         call    .draw_cursor
  46. @@:
  47.         call    .draw_text
  48. ;;;;;;;;;;;;;;;;;;;;;;;;;;
  49. ;Общий выход из editbox для всех функций и пост обработчиков
  50. ;;;;;;;;;;;;;;;;;;;;;;;;;;
  51. .editbox_exit:
  52. edit_ex
  53. ;==========================================================
  54. ;=== обработка клавиатуры =================================
  55. ;==========================================================
  56. .key:
  57. pusha
  58.         test    word ed_flags,ed_focus ; если не в фокусе, выходим
  59.         je      .editbox_exit
  60. ;Проверка нажат shift ?
  61.         call    .check_shift
  62. ;----------------------------------------------------------
  63. ;--- проверяем, что нажато --------------------------------
  64. ;----------------------------------------------------------
  65. use_key_process  backspase,delete,left,right,home,end,insert
  66. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  67. ;Заглушка на обработку клавиш вверх и вниз т.е. при обнаружении этих кодов происходит выход из обработчика
  68. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;    
  69. use_key_no_process   up,down,esc
  70. ;--- нажата другая клавиша ---
  71. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  72. ;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе если такойнеобходимости нет нужно закоментировать макрос
  73. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  74. use_key_figures_only
  75. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  76. ;проверка на shift был ли нажат
  77. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  78. are_key_shift_press
  79. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  80. ; проверяем, находится ли курсор в конце + дальнейшая обработка
  81. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  82. are_key_cur_end
  83. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  84. ;Обработка клавиш insert,delete.backspase,home,end,left,right
  85. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  86. use_work_key
  87. ;==========================================================
  88. ;=== обработка мыши =======================================
  89. ;==========================================================
  90. .mouse:
  91. pusha
  92. ;debug
  93. ;----------------------------------------------------------
  94. ;--- получаем состояние кнопок мыши -----------------------
  95. ;----------------------------------------------------------    
  96.         mcall   37,2
  97. ;----------------------------------------------------------
  98. ;--- проверяем состояние ----------------------------------
  99. ;----------------------------------------------------------
  100.         test    eax,1              
  101.         jnz     .mouse_left_button
  102.         and     word ed_flags,ed_mouse_on_off
  103.         xor     ebx,ebx
  104.         mov     dword [mouse_flag],ebx
  105.         jmp     .editbox_exit
  106. .mouse_left_button:
  107. ;----------------------------------------------------------
  108. ;--- блокировка от фокусировки в других боксах при попадании на них курсора
  109. ;----------------------------------------------------------
  110.         mov     eax,dword [mouse_flag]
  111.         test    eax,eax
  112.         jz      @f
  113.         cmp     eax,edi
  114.         je      @f
  115.         jmp     ._blur
  116. ;----------------------------------------------------------
  117. ;--- получаем координаты мыши относительно 0 т.е всей области экрана
  118. ;----------------------------------------------------------
  119. @@:     mcall   37,0
  120. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  121. ;Функция обработки  мышки получение координат и проверка их + выделения
  122. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  123. use_work_mause scr_h,scr_w
  124. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  125. ;Общие функции обработки
  126. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  127. use_general_func
  128. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  129. ;Функции для работы с key
  130. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  131. use_key_func
  132. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  133. ;Функции для работы с mouse
  134. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  135. use_mouse_func scr_w
  136. }
  137. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  138. ;Bit mask from editbox
  139. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  140. ed_figure_only= 1000000000000000b   ;одни символы
  141. ed_always_focus= 100000000000000b
  142. ed_focus=                     10b   ;фокус приложения
  143. ed_shift_on=                1000b   ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift
  144. ed_shift_on_off=1111111111110111b
  145. ed_shift=                    100b   ;включается при нажатии на shift т.е. если нажимаю
  146. ed_shift_off=   1111111111111011b
  147. ed_shift_bac=              10000b   ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение
  148. ed_shift_bac_cl=1111111111101111b   ;очистка при удалении выделения
  149. ed_shift_cl=    1111111111100011b
  150. ed_shift_mcl=   1111111111111011b
  151. ed_left_fl=               100000b
  152. ed_right_fl=    1111111111011111b
  153. ed_offset_fl=            1000000b
  154. ed_offset_cl=   1111111110111111b
  155. ed_insert=              10000000b
  156. ed_insert_cl=   1111111101111111b
  157. ed_mouse_on =          100000000b
  158. ed_mous_adn_b=         100011000b
  159. ed_mouse_on_off=1111111011111111b
  160. ed_height=14 ; высота
  161. macro draw_edit_boxes start,_end,use_f9,procinfo
  162. {
  163. if use_f9 eq
  164. else
  165.         mcall   9,procinfo,-1
  166. end if
  167.         mov     edi,start
  168.         mov     ecx,((_end-start)/ed_struc_size)
  169. @@:
  170.         call    edit_box.draw
  171.         add     edi,ed_struc_size
  172.         loop    @b
  173. }
  174.  
  175. macro mouse_edit_boxes start,_end
  176. {
  177.         mov     edi,start
  178.         mov     ecx,((_end-start)/ed_struc_size)
  179. @@:
  180.         call    edit_box.mouse
  181.         add     edi,ed_struc_size
  182.         loop    @b
  183. }
  184.  
  185. macro key_edit_boxes start,end
  186. {
  187.         mov     edi,start
  188.         mov     ecx,((end-start)/ed_struc_size)
  189. @@:
  190.         call    edit_box.key
  191.         add     edi,ed_struc_size
  192.         loop    @b
  193. }
  194. ed_struc_size=70
  195. struc  edit_box width,left,top,color,shift_color,focus_border_color,\
  196.        blur_border_color,text_color,max,text,flags,size,pos
  197. {
  198. .width dd width
  199. .left dd left
  200. .top dd top
  201. .color dd color
  202. .shift_color dd shift_color
  203. .focus_border_color dd focus_border_color
  204. .blur_border_color dd blur_border_color
  205. .text_color dd text_color
  206. .max dd max
  207. .text dd text
  208. .flags dw flags+0
  209. .size dd size+0
  210. .pos dd pos+0
  211. .offset dd 0
  212. .cl_curs_x dd 0
  213. .cl_curs_y dd 0
  214. .shift   dd 0
  215. .shift_old   dd 0
  216. }
  217.  
  218.  
  219. macro edit_boxes_set_sys_color start,end,color_table
  220. {
  221.         mov     edi,start
  222.         mov     ecx,((end-start)/ed_struc_size)
  223.         mov     esi,color_table
  224. @@:
  225.         mov     eax,[esi+36]
  226.         mov     ebx,[esi+20]
  227.         mov     ed_focus_border_color,eax
  228.         shr     bh,1
  229.         shr     bl,1
  230.         shr     ah,1
  231.         shr     al,1
  232.         add     ah,bh
  233.         add     al,bl
  234.         ror     eax,16
  235.         ror     ebx,16
  236.         shr     bl,1
  237.         shr     al,1
  238.         add     al,bl
  239.         ror     eax,16
  240.         mov     ed_blur_border_color,eax
  241.         add     edi,ed_struc_size
  242.         loop    @b
  243. }
  244.  
  245. macro draw_edit_box ed_ptr,use_f9,procinfo
  246. {
  247. if use_f9 eq
  248. else
  249.         mcall   9,procinfo,-1
  250. end if
  251.         mov     edi,ed_ptr
  252.         call    edit_box.draw
  253. }
  254.  
  255. macro mouse_edit_box ed_ptr
  256. {
  257.         mov     edi,ed_ptr
  258.         call    edit_box.mouse
  259. }
  260.  
  261. macro key_edit_box ed_ptr
  262. {
  263.         mov     edi,ed_ptr
  264.         call    edit_box.key
  265. }
  266. macro default_box ed_ptr
  267. {
  268. pusha
  269. ;       xor     eax,eax
  270. ;       mov     ed_shift_pos,eax
  271. ;       mov     ed_shift_pos_old,eax
  272.         and     word ed_flags,ed_shift_cl
  273. ;       mov     ed_offset,eax
  274. popa
  275. }