Subversion Repositories Kolibri OS

Rev

Rev 1832 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1832 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
;Проверка нажат 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
}