Subversion Repositories Kolibri OS

Rev

Rev 1792 | Details | Compare with Previous | Last modification | View Log | RSS feed

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