Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1032 Lrz 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;Basic macros for use editbox                             ;
3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4
 
1228 Lrz 5
 
6
macro use_editbox_draw
7
{
8
edit_box:
1032 Lrz 9
.draw:
10
        pushad
11
;--- рисуем рамку ---
12
        mov     edi,dword [esp+36]
13
        call    .draw_border            ; Функция стабильна
14
.draw_bg_cursor_text:
15
;--- изменяем смещение, если надо ---
16
        call    .check_offset           ;вычисление позиции курсора стабильна
17
;--- рисуем внутреннюю область ---
18
        call    .draw_bg                ;нарисовать прямоугольник рабочей области
19
;---- рисуем выделение, по shift если есть
20
        call    .draw_shift
21
.draw_cursor_text:
22
;--- рисуем курсор ---
23
        ;--- может его не надо рисовать ----
24
        test    word ed_flags,ed_focus
1214 Lrz 25
        jz     	@f
1032 Lrz 26
        call    .draw_cursor
27
@@:
28
        call    .draw_text
29
;        ret
30
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
31
;Общий выход из editbox для всех функций и пост обработчиков;;
32
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
33
.editbox_exit:
34
        popad
35
        ret 4
36
}
37
 
38
 
39
macro use_editbox_key
40
{
41
;==========================================================
42
;=== обработка клавиатуры =================================
43
;==========================================================
44
edit_box_key:
45
pushad
46
        mov     edi,dword [esp+36]
47
        test    word ed_flags,ed_focus ; если не в фокусе, выходим
48
        je      edit_box.editbox_exit
49
        test    word ed_flags,ed_mouse_on
50
        jne     edit_box.editbox_exit
51
 
3358 mario79 52
;--------------------------------------
53
; this code for Win-keys, works with
54
; kernel SVN r.3356 or later
55
	push	eax
56
	push	ebx
57
	mcall	66,3
58
	test	ax,0x200	; LWin
59
	jnz	.win_key_pressed
60
	test	ax,0x400	; RWin
61
	jz	@f
62
.win_key_pressed:
63
	pop	ebx
64
	pop	eax
65
	jmp	edit_box.editbox_exit
66
@@:
67
	pop	ebx
68
	pop	eax
69
;--------------------------------------
1032 Lrz 70
;Проверка нажат shift ?
71
        call    edit_box_key.check_shift
72
;----------------------------------------------------------
73
;--- проверяем, что нажато --------------------------------
74
;----------------------------------------------------------
3130 IgorA 75
        cmp     ah,8
76
        jz      edit_box_key.backspace
77
        cmp     ah,0xb6
78
        jz      edit_box_key.delete
79
        cmp     ah,176
80
        jz      edit_box_key.left
81
        cmp     ah,179
82
        jz      edit_box_key.right
83
        cmp     ah,180
84
        jz      edit_box_key.home
85
        cmp     ah,181
86
        jz      edit_box_key.end
87
        cmp     ah,185  ;insert
88
        jz      edit_box_key.insert
1032 Lrz 89
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
90
;Заглушка на обработку клавиш вверх и вниз т.е. при обнаружении этих кодов происходит выход из обработчика
91
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
92
use_key_no_process   up,down,esc,enter,tab,numl,capsl,scrolll
93
;--- нажата другая клавиша ---
94
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1858 lev 95
;Проверка установлен ли флаг при котором нужно выводить только цифры в нужном боксе, если такой необходимости нет, нужно закоментировать макрос
1032 Lrz 96
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
97
use_key_figures_only
98
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1858 lev 99
;проверка на shift, был ли нажат
1032 Lrz 100
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
101
are_key_shift_press
102
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103
; проверяем, находится ли курсор в конце + дальнейшая обработка
104
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
105
are_key_cur_end
106
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1858 lev 107
;Обработка клавиш insert,delete.backspace,home,end,left,right
1032 Lrz 108
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
109
use_work_key
110
}
111
 
112
macro use_editbox_mouse
113
{
114
;==========================================================
115
;=== обработка мыши =======================================
116
;==========================================================
117
;save for stdcall ebx,esi,edi,ebp
118
edit_box_mouse:
119
pushad
120
        mov     edi,dword [esp+36]
121
;debug
122
;----------------------------------------------------------
123
;--- получаем состояние кнопок мыши -----------------------
124
;----------------------------------------------------------
125
        mcall   37,2
126
;----------------------------------------------------------
127
;--- проверяем состояние ----------------------------------
128
;----------------------------------------------------------
129
        test    eax,1
130
        jnz     edit_box_mouse.mouse_left_button
131
        and     word ed_flags,ed_mouse_on_off
1214 Lrz 132
	mov	ebx,dword ed_mouse_variable
133
	push	0
134
	pop	dword [ebx]
135
;        mov     dword [ebx],ebx
1032 Lrz 136
        jmp     edit_box.editbox_exit
137
.mouse_left_button:
138
;----------------------------------------------------------
139
;--- блокировка от фокусировки в других боксах при попадании на них курсора
140
;----------------------------------------------------------
1214 Lrz 141
        mov     eax,dword ed_mouse_variable
142
	push	dword [eax]
143
	pop	eax
1032 Lrz 144
        test    eax,eax
145
        jz      @f
146
        cmp     eax,edi
147
        je      @f
148
        jmp     edit_box_mouse._blur
149
;----------------------------------------------------------
150
;--- получаем координаты мыши относительно 0 т.е всей области экрана
151
;----------------------------------------------------------
152
@@:     mcall   37,1
153
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
154
;Функция обработки  мышки получение координат и проверка их + выделения
155
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
156
use_work_mouse
157
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
158
;Общие функции обработки
159
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
160
use_general_func
161
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
162
;Функции для работы с key
163
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
164
use_key_func
165
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
166
;Функции для работы с mouse
167
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1858 lev 168
use_mouse_func
1032 Lrz 169
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
170
;Bit mask from editbox
171
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
172
}
173
 
174
 
175
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
176
;ниже расположены функции которыми реализуется весь алгоритм
177
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1858 lev 178
;Макрос для вывода основных функций которые используются боксом
1032 Lrz 179
macro use_general_func
180
{
181
;debug_func
182
;----------------------------------------------------------
1858 lev 183
;--- процедура прорисовки выделенной части -----------------
1032 Lrz 184
;----------------------------------------------------------
185
edit_box.draw_shift:
186
        test    word ed_flags,ed_shift_bac ;установка флага, выделенной области
187
        jz      @f
188
        mov     ebp,shift_color
189
        mov     ebx,dword       ed_shift_pos
190
        call    edit_box_key.sh_cl_
191
@@:     ret
192
;----------------------------------------------------------
193
;--- процедура прорисовки текста --------------------------
194
;----------------------------------------------------------
195
edit_box.draw_text:
196
;--- вычисляем, сколько помещается символов ---
197
;--- чтобы мусор не рисовать ---
198
        call    edit_box.get_n
199
        mov     esi,ed_size
200
        mov     ebx,ed_offset
201
        sub     esi,ebx
202
        cmp     eax,esi
203
        jae     @F
204
        mov     esi,eax         ;чтобы не выходить за пределы экрана
1858 lev 205
;--- рисуем текст ---
1032 Lrz 206
@@:     mov     eax,4
207
        mov     ebx,ed_left
208
        mov     edx,ed_offset
209
        add     ebx,2
210
        shl     ebx,16
211
        add     ebx,ed_top
212
        mov     ecx,ed_text_color
213
        add     ebx,4
214
        add     edx,ed_text
3089 IgorA 215
		test    word ed_flags,ed_pass
216
		jz      @f
217
		call    edit_box.draw_password
218
		jmp     .end_f
219
@@:
1032 Lrz 220
        mcall
3089 IgorA 221
.end_f:
1032 Lrz 222
ret
3089 IgorA 223
 
224
txt_pass db '*',0
225
 
226
proc edit_box.draw_password
227
locals
228
	s_len dw ? ;длина выводимого текста
229
endl
3090 IgorA 230
	cmp esi,1
231
	jl .end_f ;если строка пустая
3089 IgorA 232
	mov [s_len],si
233
	xor esi,esi
234
	inc esi