Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
404 Lrz 1
;  09.03.2007 Дописал управление mouse + shift  выделение и перемещение
396 Lrz 2
;  07.03.2007 Дописал управление с shift home + end усправил несколько багов
391 Lrz 3
;  06.03.2007 Переписал полностью алгоритм управления shift
348 Lrz 4
;  15.02.2007 улучшение снятия выделения и перерисовки очищаемой области, значительно приятнее работает компонент
5
;  13.02.2007 убрал по возможности мерцание, улучшена обработка перерисовки фона
6
; добавил фитчу внесения 0х0 по адресу ed_size иначе у Maxxx32 были несостыковки в коде. Причина в том, что оптимизация была сведена к тому, что я не чистил символы в буфере, когда удалял, я просто их не выводил, и потом, когда вносился новый символ, он попросту затирал уже имеющийся. Если бы, программа обрабатывала конец строки по ed_size, проблемы не возникло. Но сейчас этот недостаток исправлен.
306 Lrz 7
;  01.02.2007 доработка edit_box, исправил баги.
295 Lrz 8
;  26.01.2007 нормальная работа компанента исправил фукцию .check_offset
9
;  24.01.2007 пофиксел баги вызваные не правильным кодом )).
289 Lrz 10
;  22.01.2007 избавился от глюков при работе с выделением и удаление, корректная работа клавишей del & backspase
11
;  20.01.2007 реализовал выделение текста по shift
234 Lrz 12
;  12.12.2006 реализовал поддержку кнопки insert и сегодя компонент почти работает!!!!
13
;  07.12.2006 продолжается работа над переработкой компонента,изменениям подверглись многие функции, переработан вывод текста, а така же алгоритм внесения символов.
14
;  03.09.2006 по возможности отказался от 16 битной арифметики, добавил новые баги
15
;  09.08.2006 произведена оптимизация работы конпок DEL и Backspace, уменьшен размер выполняемого кода.
16
;  21.07.2006 добавлена функция кнопки Del, теперь можно удалять символы при помощи данной клавиши
17
; Автор: Евтихов Максим (Maxxxx32) email: maxxxxm@mail.ru
18
; Дата последних изменений: 13.06.06 10:40
19
;  Напишите в исходном коде своей программы use_edit_box,
20
; это вставит необходимые процедуры в код вашей программы.
21
;  Процедуры:
22
;   edit_box.draw - полная перерисовка;
23
;   edit_box.key - обработка клавиатуры;
24
;   edit_box.mouse - обработка мыши;
25
;   edit_box.focus - установка фокуса;
26
;   edit_box.blur - его размывание;
27
;   edit_box.get_n - получить количество прорисовываемых символов.
28
;  При вызове любых из этих процедур в регистре edi следует
29
; оставить указатель на структуру.
30
;  Пример структуры:
31
; some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text
32
; длина, высота, верх, цвет фона, цвет рамки, если выбран,
33
; цвет рамки, если не выбран, максимальное количество символов,
34
; указатель на буфер, где будут хранится символы. Буфер должен
35
; оканчиваться нулем, например если максимальное количество 255:
36
;  some_edit_text:
37
;       rb      256 ;255+1
38
 
39
;  Пример вызова процедуры:
40
;       mov     edi,some_edit
41
;       call    edit_box.draw
42
 
43
;  При вызове процедуры edit_box.key код клавиши должен
44
; находится в ah, то есть перед вызовом этой процедуры надо вызвать
45
; 2-ую сисемную функцию, например:
46
;       mov     eax,2
47
;       int     0x40
48
;       mov     edi,some_edit1
49
;       call    edit_box.key
50
;       mov     edi,some_edit2
51
;       call    edit_box.key
52
;  Перед вызовом обработчика мыши следует проверить, является ли окно
53
; активным.
54
;  Если щелчок мыши был пройзведен за пределами edit box
55
; фокус теряется.
56
macro use_edit_box
57
{
58
edit_box:
59
ed_width	equ [edi]		;ширина компонента
60
ed_left 	equ [edi+4]             ;положение по оси х
61
ed_top		equ [edi+8]             ;положение по оси у
62
ed_color	equ [edi+12]		;цвет фона компонента
63
ed_focus_border_color	equ [edi+16]	;цвет рамки компонента
64
ed_blur_border_color	equ [edi+20]    ;цвет не активного компонента
65
ed_text_color	equ [edi+24]            ;цвет текста
282 Lrz 66
ed_max		equ [edi+28]                    ;кол-во символов которые можно максимально ввести
67
ed_text 	equ [edi+32]                    ;указатель на буфер
68
ed_flags	equ [edi+36]            ;флаги
69
ed_size equ [edi+38]                    ;кол-во символов
70
ed_pos	equ [edi+42]                    ;позиция курсора
71
ed_offset	equ [edi+46]            ;смещение
72
cl_curs_x	equ [edi+50]		;предыдущее координата курсора по х
73
cl_curs_y	equ [edi+54]		;предыдущее координата курсора по у
396 Lrz 74
ed_shift_pos	equ [edi+58]            ;положение курсора
75
ed_shift_pos_old equ [edi+62]           ;старое положение курсора
234 Lrz 76
;==========================================================
77
;=== процедура прорисовки =================================
78
;==========================================================
79
.draw:
80
pusha
81
;--- рисуем рамку ---
82
	call	.draw_border		; Функция стабильна
83
.draw_bg_cursor_text:
84
;--- изменяем смещение, если надо ---
85
	call	.check_offset		;вычисление позиции курсора стабильна
86
;--- рисуем внутреннюю область ---
87
	call	.draw_bg                ;нарисовать прямоугольник рабочей области
402 Lrz 88
;---- рисуем выделение, по shift если есть
89
	call	.draw_shift
234 Lrz 90
.draw_cursor_text:
91
;--- рисуем курсор ---
92
	;--- может его не надо рисовать ----
282 Lrz 93
	test	word ed_flags,ed_focus
234 Lrz 94
	je	@f
95
	call	.draw_cursor
96
@@:
97
	call	.draw_text
98
popa
99
ret
100
;----------------------------------------------------------
402 Lrz 101
;--- процедура прорисовки выделеной части -----------------
102
;----------------------------------------------------------
103
.draw_shift:
104
	test	word ed_flags,ed_shift_bac ;установка флага, выделенной области
105
	jz	@f
106
        mov	ebp,shift_color
107
        mov	ebx,dword	ed_shift_pos
108
	call	.sh_cl_
109
@@:	ret
110
 
111
 
112
;----------------------------------------------------------
234 Lrz 113
;--- процедура прорисовки текста --------------------------
114
;----------------------------------------------------------
115
.draw_text:
116
;--- вычисляем, сколько помещается символов ---
117
;--- чтобы мусор не рисовать ---
118
	call 	.get_n
119
	mov	esi,ed_size
120
        mov	ebx,ed_offset
121
	sub	esi,ebx
122
	cmp	eax,esi
123
	jae	@F
124
	mov	esi,eax		;чтобы не выходить за пределы экрана
402 Lrz 125
;--- рисуем текст ---
234 Lrz 126
@@: 	mov	eax,4
127
	mov	ebx,ed_left
306 Lrz 128
	mov	edx,ed_offset
234 Lrz 129
	add	ebx,2
130
	shl	ebx,16
131
	mov	bx,ed_top
132
	add	ebx,4
133
	mov	ecx,ed_text_color
134
	add	edx,ed_text
135
	int	0x40
136
ret
137
;----------------------------------------------------------
138
;--- процедура прорисовки фона ----------------------------
139
;входные данные
140
;eax
292 Lrz 141
;edx - color
234 Lrz 142
;----------------------------------------------------------
343 Lrz 143
;вход только цвет edx
234 Lrz 144
.draw_bg:
145
	mov	ebx,ed_left
146
	add	ebx,1
147
	shl	ebx,16
148
	mov	bx,ed_width
149
	sub	ebx,1
391 Lrz 150
       	mov	edx,ed_color
151
.draw_bg_eax:
234 Lrz 152
	mov	ecx,ed_top
306 Lrz 153
	mov	eax,13
234 Lrz 154
	add	ecx,1
155
	shl	ecx,16
156
	mov	cx,ed_height
391 Lrz 157
	dec	ecx
306 Lrz 158
        int	0x40
234 Lrz 159
ret
160
 
161
;----------------------------------------------------------
162
;--- процедура получения количества символов в текущей щирине компонента --------------
163
;----------------------------------------------------------
164
.get_n:
306 Lrz 165
	mov	eax,ed_width	;получем ширину компонента
234 Lrz 166
	xor	edx,edx   ;результат распологается в паре edx:eax в eax - остаток
167
	sub	eax,4		;вычтим 4
168
	mov	ebx,6		;загрузми делитель
169
	div	ebx		;размделим на 6
170
ret
171
;----------------------------------------------------------
172
;--- процедура рисования курсора --------------------------
173
;----------------------------------------------------------
391 Lrz 174
;входные ebp- цвет
234 Lrz 175
.clear_cursor:
391 Lrz 176
	mov	edx,ebp
234 Lrz 177
	mov	ebx,cl_curs_x
178
	mov	ecx,cl_curs_y
179
	jmp	.draw_curs
180
.draw_cursor:
181
	mov	edx,ed_text_color
182
	mov	ebx,ed_pos
183
	mov	ecx,ed_offset
184
	sub	ebx,ecx
185
 
186
	lea     ebx,[ebx*2+ebx]
187
	shl     ebx,1
188
	;imul	ebx,6
189
	add	bx,ed_left
306 Lrz 190
	mov	ecx,ed_top
234 Lrz 191
	inc	ebx
306 Lrz 192
	add	ecx,2
234 Lrz 193
	mov	ebp,ebx
194
	shl	ebx,16
195
	mov	bx,bp
196
	mov	ebp,ecx
197
 
198
	shl	ecx,16
199
	mov	cx,bp
200
	add	cx,ed_height-4
201
 
202
	mov	cl_curs_x,ebx
203
	mov	cl_curs_y,ecx
204
.draw_curs:
205
	mov	eax,38
206
	int	0x40
207
ret
208
;----------------------------------------------------------
209
;--- процедура рисования рамки ----------------------------
210
;----------------------------------------------------------
211
.draw_border:
212
;--- цвет рамки ---
396 Lrz 213
	test	word ed_flags,ed_focus
234 Lrz 214
	mov	edx,ed_focus_border_color
215
	jne     @f
216
	mov	edx,ed_blur_border_color
217
@@:
218
;--- сверху ---
219
	mov	eax,38
220
	mov	ebx,ed_left
221
	mov 	ecx,ebx
222
	shl	ebx,16
223
	mov	bx,cx
224
	add	bx,ed_width
225
	mov	ecx, ed_top
226
	mov	esi,ecx
227
	shl	ecx,16
228
	mov	cx,si
229
	int	0x40
230
 
231
;--- снизу ---
232
	mov	esi,ecx
233
	add	ecx,ed_height
234
	mov	ebp,ecx
235
	shl	ecx,16
236
	mov	cx,bp
237
	int	0x40
238
 
239
;--- слева ---
240
	mov	cx,si
241
	mov	ebp,ebx
242
	sub	bx,ed_width
243
	int	0x40
244
 
245
;--- справа ---
246
	mov	ebx,ebp
247
	shl	ebx,16
248
	mov	bx,bp
249
	int	0x40
250
ret
251
;----------------------------------------------------------
252
;--- проверка, зашел ли курсор за границы и, если надо, ---
253
;--- изменяем смещение ------------------------------------
296 Lrz 254
;--- eax = -1, если не изменилось или eax = 0, если
234 Lrz 255
; изменилось
256
;----------------------------------------------------------
257
.check_offset:
350 Lrz 258
pusha
295 Lrz 259
	mov	ecx,ed_pos
260
	mov	ebx,ed_offset
261
	cmp	ebx,ecx
262
	ja	.sub_8
263
 
264
	push	ebx
234 Lrz 265
	call	.get_n			;получим кол-во символов в паре регистров edx:eax
266
	pop	ebx
295 Lrz 267
	mov	edx,ebx
268
	add	edx,eax		;ed_offset+width editbox
269
	cmp	edx,ecx
270
	ja	@f
271
 
272
	mov	edx,ed_size
296 Lrz 273
	cmp	edx,ecx
274
	je      .add_end
275
 
276
	sub	edx,ecx
295 Lrz 277
	cmp	edx,8
278
	jbe	.add_8
296 Lrz 279
	add	ebx,8
295 Lrz 280
	jmp	.chk_d
281
 
282
.sub_8: cmp	ecx,0
283
	je	.sub_min
284
	cmp	ebx,8
285
        jbe	.sub_min
286
	sub	ebx,8	;ebx=ed_offset
287
	jmp	.chk_d
288
.sub_min:
289
        xor	ebx,ebx
290
	jmp	.chk_d
291
 
296 Lrz 292
.add_end:sub	edx,eax
293
	mov	ebx,edx
294
	jmp	.chk_d
295
.add_8:	add	ebx,edx
295 Lrz 296
.chk_d:	mov	ed_offset,ebx
297
	call    .draw_bg
396 Lrz 298
	and	word ed_flags,ed_offset_cl
350 Lrz 299
popa
295 Lrz 300
	ret
301
@@:
396 Lrz 302
	or	word ed_flags,ed_offset_fl
350 Lrz 303
popa
295 Lrz 304
	ret
305
;==========================================================
306
;=== обработка клавиатуры =================================
307
;==========================================================
308
.key:
309
pusha
310
	test	word ed_flags,ed_focus ; если не в фокусе, выходим
350 Lrz 311
	je      @b
343 Lrz 312
;Проверка на нажаты shift
404 Lrz 313
        call	.check_shift
234 Lrz 314
;----------------------------------------------------------
315
;--- проверяем, что нажато --------------------------------
316
;----------------------------------------------------------
317
	cmp	ah,8
318
	jz	.backspace
319
	cmp	ah,0xb6
320
	jz	.delete
321
	cmp	ah,176
322
	jz	.left
323
	cmp	ah,179
324
	jz	.right
325
	cmp	ah,180
326
	jz	.home
327
	cmp	ah,181
328
	jz	.end
329
	cmp	ah,185	;insert
330
	jz	.insert
331
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
332
;Заглушка на обработку клавиш вверх и вниз
333
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
334
	cmp	ah,177
335
        jz	.no_figure
336
	cmp	ah,178
337
	jz	.no_figure
338
	cmp	ah,27   ;ESC - клавиша ))
339
	jz	.no_figure
340
;--- нажата другая клавиша ---
341
	test	word ed_flags,ed_figure_only  ; только цифры ?
342
	jz	@f
343
	cmp	ah,'0'
344
	jb	.no_figure
345
	cmp	ah,'9'
346
	ja	.no_figure
292 Lrz 347
;проверка на shift
306 Lrz 348
@@:	test	word ed_flags,ed_shift_on
292 Lrz 349
	je	@f
350
	;Входные данные edx=ed_size;ecx=ed_pos
351
	push	eax
352
	mov	edx,ed_size
353
	mov	ecx,ed_pos
350 Lrz 354
	pusha
343 Lrz 355
;clear
391 Lrz 356
	mov	ebp,edx ;ed_size
357
        call	.clear_bg
358
       	mov	ebp,ed_color
396 Lrz 359
	mov	ebx,dword	ed_shift_pos
348 Lrz 360
        call	.sh_cl_
350 Lrz 361
 
391 Lrz 362
.sh_nxt:popa
350 Lrz 363
	call	.del_char
292 Lrz 364
;;;;
391 Lrz 365
        mov	eax,dword ed_shift_pos
292 Lrz 366
        mov	ebx,ed_size
367
	sub	ebx,eax
368
	mov	ed_size,ebx
369
	pop	eax
370
        ; проверяем, находится ли курсор в конце
371
@@:	mov	ecx,ed_size
234 Lrz 372
	mov	edx, ed_max
343 Lrz 373
	test	word ed_flags,ed_insert
374
	jne	@f
289 Lrz 375
	cmp	ecx,edx
376
	jae	.no_figure
343 Lrz 377
@@:	mov	ebx, ed_pos
234 Lrz 378
	cmp	ebx,edx
379
	jl	@f ; если меньше или равно
380
.no_figure:
381
	popa
382
	ret
292 Lrz 383
.insert: test	word ed_flags,ed_insert	;not 	word ed_insert
384
         je     .insert_1
385
         and	word ed_flags,ed_insert_cl
386
	jmp	.no_figure
387
.insert_1:
388
	or	word ed_flags,ed_insert
234 Lrz 389
        jmp	.no_figure
292 Lrz 390
.ins_v:
306 Lrz 391
	dec	dword [ebp+38];ed_size    ;processing is insert
234 Lrz 392
	sub	esi,ecx
393
	add	esi,ebx
394
        mov	edi,esi
343 Lrz 395
;clear
396
pusha
397
	mov	edi,ebp
398
	mov	ebp,ed_pos
399
	call	.clear_bg
400
popa
234 Lrz 401
	jmp	.In_k
402
@@:     ; сдвигаем символы после курсора вправо
403
	mov	ecx,ed_size
404
	push	edi eax
292 Lrz 405
	mov	ebp,edi
234 Lrz 406
	mov	esi,ed_text     ; Указатель на буфер
407
				;Будем работать со строкой
408
	add	esi,ecx		;add ed_size добавим max size
409
	mov	edi,esi
410
 
411
       	cmp 	ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
412
	je	.In_k
413
 
292 Lrz 414
	test	word [ebp+36],ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
415
	jne	.ins_v
343 Lrz 416
;clear
417
pusha
418
	mov	edi,ebp
419
	mov	ebp,ed_size
420
	call	.clear_bg
421
popa
234 Lrz 422
	sub	ecx,ebx         ;Найдем кол-во символов для передвижения.
423
	inc	edi		;Сместим наши символы в право
424
	std
425
	inc 	ecx
426
   @@:
427
	;--------
428
	lodsb
429
	stosb
430
	;--------
431
	loop	@b
432
.In_k:	cld
433
	pop eax
434
	mov al,ah
435
	stosb
436
	pop edi
437
; вставляем код клавиши туда, где курсор
438
	; увеличиваем значение размера и позиции
439
	inc	 dword ed_size
295 Lrz 440
	inc	 dword ed_pos
234 Lrz 441
	call	.draw_all2
295 Lrz 442
	jmp	.shift;.draw_cursor_text
234 Lrz 443
.delete:
444
	mov	edx,ed_size
445
	mov	ecx,ed_pos
446
	cmp	edx,ecx
292 Lrz 447
	jg	.bac_del
289 Lrz 448
	test	word ed_flags,ed_shift_on
449
	jne	.del_bac
234 Lrz 450
	popa
451
	ret
289 Lrz 452
.bac_del:
292 Lrz 453
	call 	.del_char
234 Lrz 454
	jmp 	.draw_all
455
 
456
;--- нажата клавиша backspace ---
457
.backspace:
458
	; проверяем, курсор у левого края ?
459
	mov	edx,ed_size
460
	mov	ecx,ed_pos
461
	test	ecx,ecx
292 Lrz 462
	jnz	.del_bac
289 Lrz 463
        test	word ed_flags,ed_shift_on
464
        jne	.bac_del
234 Lrz 465
	popa
466
	ret
289 Lrz 467
.del_bac:
292 Lrz 468
	cmp	edx,ecx	;if ed_pos=ed_size
234 Lrz 469
	je	@f
470
	dec	ecx
471
	call 	.del_char
289 Lrz 472
@@:     test	word ed_flags,ed_shift_on
473
        jne	.bac_del
234 Lrz 474
	dec	 dword ed_pos
475
 
476
.draw_all:
343 Lrz 477
       	push	.shift;.draw_cursor_text;eax
289 Lrz 478
 
479
        test	word ed_flags,ed_shift_on
480
        je	@f
391 Lrz 481
        mov	eax,dword ed_shift_pos
289 Lrz 482
        mov	ebx,ed_size
483
	sub	ebx,eax
484
	mov	ed_size,ebx
485
 
391 Lrz 486
	mov	ebp,ed_color
343 Lrz 487
	call	.clear_cursor
488
	call	.check_offset
489
        call	.draw_bg
490
	ret
289 Lrz 491
@@:	dec	 dword ed_size
492
 
234 Lrz 493
.draw_all2:
290 Lrz 494
	and    word ed_flags,ed_shift_cl
391 Lrz 495
	mov	ebp,ed_color
234 Lrz 496
	call	.clear_cursor
497
	call	.check_offset
343 Lrz 498
	mov	ebp,ed_size
499
	call	.clear_bg
295 Lrz 500
	ret
234 Lrz 501
;--- нажата клавиша left ---
391 Lrz 502
.left:  mov	ebx,ed_pos
234 Lrz 503
	test	ebx,ebx
391 Lrz 504
	jz	.sh_st_of
505
	or	word ed_flags,ed_left_fl
506
	call	.sh_first_sh
234 Lrz 507
	dec	 dword ed_pos
391 Lrz 508
	call	.sh_enable
509
	jmp	.draw_cursor_text
234 Lrz 510
;--- нажата клавиша right ---
391 Lrz 511
.right:	mov	ebx,ed_pos
234 Lrz 512
	cmp	ebx,ed_size
391 Lrz 513
	je	.sh_st_of
514
	and	word ed_flags,ed_right_fl
515
	call	.sh_first_sh
234 Lrz 516
	inc	dword  ed_pos
391 Lrz 517
	call	.sh_enable
518
	jmp	.draw_cursor_text
519
.home:
289 Lrz 520
	mov	ebx,ed_pos
234 Lrz 521
	test	ebx,ebx
391 Lrz 522
	jz	.sh_st_of
523
	call	.sh_first_sh
234 Lrz 524
	xor	eax,eax
525
	mov	ed_pos,eax
391 Lrz 526
	call	.sh_home_end
527
 	jmp	.draw_cursor_text
528
.end:
289 Lrz 529
	mov	ebx,ed_pos
234 Lrz 530
	cmp	ebx,dword ed_size
391 Lrz 531
	je	.sh_st_of
396 Lrz 532
	call	.sh_first_sh
234 Lrz 533
	mov	eax,ed_size
534
	mov	ed_pos,eax
391 Lrz 535
	call	.sh_home_end
536
	jmp	.draw_cursor_text
537
;Обработка Shift для снятия выделения неизвестной области
348 Lrz 538
.shift: ;;;;;;;SHIFT
391 Lrz 539
	test    word ed_flags,ed_shift
348 Lrz 540
        je	.f_exit
343 Lrz 541
 
391 Lrz 542
@@:	mov	ebp,shift_color
543
	or	word ed_flags,ed_shift_bac ;установка флага, выделенной области
396 Lrz 544
	mov	ebx,dword	ed_shift_pos
348 Lrz 545
	call	.sh_cl_
546
        jmp	.draw_cursor_text
547
;;;;;;;;;;;;;;;;;;;;;
391 Lrz 548
.f_exit:call	.check_offset
396 Lrz 549
	and     word ed_flags,ed_shift_cl
348 Lrz 550
        call	.enable_null
551
	jmp	.draw_cursor_text
552
.sh_cl_:
282 Lrz 553
;;;;;;SHIFT end
391 Lrz 554
;обработка очистки, при левом - правом движении выделения
348 Lrz 555
;для обработки снятия выделения
396 Lrz 556
;входные параметры ebp=color ebx=ed_shift_pos
282 Lrz 557
	mov 	eax,dword	ed_pos
558
	cmp	eax,ebx
559
	jae	.sh_n
560
	push	eax  ;меньшее в eax
561
	push	ebx  ;большее
562
	jmp	.sh_n1
563
	             ;если иначе
564
.sh_n: 	push	ebx
565
	push	eax
566
.sh_n1:
567
	call	.check_offset
568
	call	.get_n
569
	mov	edx,eax	;size of ed_box
570
	mov	ecx,ed_offset
571
	add	eax,ecx	;eax = w_off= ed_offset+width
348 Lrz 572
	mov	edx,eax ;save
282 Lrz 573
	pop	ebx     ;большее
574
	pop	eax     ;меньшее
575
 
576
	cmp	eax,ecx         ;сравнение с меньшего с offset.
577
	jae	.f_f            ;если больше
578
	xor	eax,eax
348 Lrz 579
	cmp	edx,ebx		;cравним размер w_off с большим
282 Lrz 580
	jb	@f
581
	sub	ebx,ecx
582
	jmp     .nxt_f
348 Lrz 583
@@:	mov	ebx,edx
282 Lrz 584
	sub	ebx,ecx
585
	jmp     .nxt_f
586
.f_f:
587
	sub	eax,ecx
348 Lrz 588
	cmp	edx,ebx		;cравним размер w_off с большим
282 Lrz 589
	jle	@f
590
	sub	ebx,ecx
591
	sub	ebx,eax
592
	jmp     .nxt_f
234 Lrz 593
@@:
348 Lrz 594
	mov	ebx,edx
282 Lrz 595
	sub	ebx,ecx
596
	sub	ebx,eax
597
.nxt_f:
289 Lrz 598
	mov	edx,ebx
282 Lrz 599
	lea	ebx,[eax*2+eax]
600
	shl	ebx,1
601
	add	ebx,ed_left
602
	inc	ebx
603
	shl	ebx,16
604
	lea	ecx,[edx*2+edx]
605
	shl	ecx,1
606
	mov	bx,cx
391 Lrz 607
	inc	ebx
348 Lrz 608
	mov	edx,ebp;shift_color
609
 
282 Lrz 610
	call	.draw_bg_eax
396 Lrz 611
@@:	call	.enable_null
348 Lrz 612
	ret
391 Lrz 613
;;;;;;;;;;;;;;;;;;;;;
614
;Установка- снятие выделения в один символ
615
;;;;;;;;;;;;;;;;;;;;;
616
.drw_sim:
617
	mov	eax,dword	ed_pos
618
	call    .draw_rectangle   ;нарисовать прямоугольник с заданным цветом
619
        jmp     @b
620
;;;;;;;;;;;;;;;;;;;;;
621
;Фукция установки выделения при движения влево и вправо и нажатии shift
622
;Логика:
623
;;;;;;;;;;
624
.draw_wigwag:
625
;функция установки переменных
626
	mov	ebp,shift_color
627
	call	.clear_cursor
289 Lrz 628
 
391 Lrz 629
	or	word ed_flags,ed_shift_bac ;установка флага, выделенной области
630
	mov	ebp,shift_color
631
	mov 	eax,dword	ed_pos
632
	test	word ed_flags,ed_left_fl
633
	jz      .low
634
	jmp	@f
635
;;;;;;;;;;
636
;Фукция удаления выделения при движения влево и вправо и нажатии shift
637
;Логика:
638
;;;;;;;;;;
639
.draw_wigwag_cl:
640
;функция установки переменных
641
	mov	ebp,ed_color
642
	call	.clear_cursor
643
 
644
	mov	ebp,ed_color
645
	mov 	eax,dword	ed_pos
646
	test	word ed_flags,ed_left_fl
647
	jz      .low
648
@@:     call	.draw_rectangle  ;нарисовать прямоугольник закрашиваемой области
649
	ret
650
.low:   dec	eax
651
        jmp	@b
652
;входной параметр ebx - ed_pos
653
.sh_first_sh:
289 Lrz 654
	test    word ed_flags,ed_shift
655
	je	@f
391 Lrz 656
	mov	dword ed_shift_pos_old,ebx
289 Lrz 657
	test	word ed_flags,ed_shift_on
391 Lrz 658
	jne	@f
659
	mov	dword ed_shift_pos,ebx
660
       	or	word ed_flags,ed_shift_on
661
@@:    	ret
662
;Обработка крайних положений в editbox при нажатом shift
663
;производит снятие выделение, если нет shift
664
;иначе вообще выходит
665
.sh_st_of:
666
	test    word ed_flags,ed_shift
667
	jne	@f
668
	test    word ed_flags,ed_shift_bac
348 Lrz 669
        je      @f
391 Lrz 670
       	mov	ebp,ed_color
396 Lrz 671
	mov	ebx,dword	ed_shift_pos
391 Lrz 672
	call	.sh_cl_  ;очистка выделеного фрагмента
673
	and	word ed_flags,ed_shift_cl ; очистка от того что убрали выделение
674
	jmp     .draw_cursor_text
675
@@:
676
        and	word ed_flags,ed_shift_off
677
	popa
678
	ret
679
 
680
;проверка состояния shift был ли он нажат раньше?
681
.sh_enable:
682
	test    word ed_flags,ed_shift
683
	jne	.sh_ext_en ;нарисовать закрашеный прямоугольник
684
 
685
	test    word ed_flags,ed_shift_bac
686
        je      @f
687
       	call	.check_offset
688
 
348 Lrz 689
	mov	ebp,ed_color
396 Lrz 690
	mov	ebx,dword	ed_shift_pos
348 Lrz 691
	call	.sh_cl_  ;очистка выделеного фрагмента
391 Lrz 692
	call	.draw_wigwag_cl
693
	and	word ed_flags,ed_shift_cl ; 1вар не нужно
694
	ret
695
 
696
@@:     mov	ebp,ed_color
697
	call	.clear_cursor
698
	call	.check_offset
699
	ret
348 Lrz 700
.sh_ext_en:
391 Lrz 701
       	call	.check_offset
396 Lrz 702
	test	word ed_flags,ed_offset_fl
402 Lrz 703
	je	@f
391 Lrz 704
;Рисование закрашеных прямоугольников и очистка их
705
        mov 	eax,dword	ed_shift_pos
706
	mov	ebx,dword	ed_pos
707
	mov	ecx,dword	ed_shift_pos_old
708
;проверка и рисование закрашеных областей
709
	cmp	eax,ecx
710
	je	.1_shem
711
	jb      .smaller
712
        cmp	ecx,ebx
713
        ja	.1_shem
714
        call	.draw_wigwag_cl ;clear
715
	jmp	.sh_e_end
716
.smaller:
717
        cmp	ecx,ebx
718
        jb	.1_shem
719
        call	.draw_wigwag_cl ;clear
720
	jmp	.sh_e_end
721
;alike  =
722
.1_shem: call	.draw_wigwag
723
.sh_e_end:	and	word ed_flags,ed_shift_off
724
	ret
725
@@:	mov	ebp,shift_color
396 Lrz 726
	mov	ebx,dword	ed_shift_pos
391 Lrz 727
	call	.sh_cl_
728
	jmp	.sh_e_end
729
;функция для обработки shift при нажатии home and end
730
.sh_home_end:
731
	mov	ebp,ed_color
732
	call	.clear_cursor
733
	test    word ed_flags,ed_shift_bac
734
        je      @f
735
	mov	ebp,ed_color
396 Lrz 736
	mov	ebx,dword	ed_shift_pos_old
391 Lrz 737
	call	.sh_cl_
738
 
739
@@:	test    word ed_flags,ed_shift
402 Lrz 740
	je	.sh_exit_ ;выйти
391 Lrz 741
        mov	ebp,shift_color
396 Lrz 742
        mov	ebx,dword	ed_shift_pos
391 Lrz 743
	call	.sh_cl_
744
	or	word ed_flags,ed_shift_bac ;установка флага, выделенной области
745
	jmp	.sh_e_end
396 Lrz 746
.sh_exit_: 	call	.check_offset
747
	ret
343 Lrz 748
;функция внесения 0 по адресу ed_size+1
749
.enable_null:
750
        pusha
751
        mov	eax,ed_size
752
	mov	ebx,ed_text
753
	add	eax,ebx
754
	inc	eax
755
	xor	ebx,ebx
756
	mov 	[eax],bl
757
	popa
758
	ret
396 Lrz 759
;- удаление символа
760
;Входные данные edx=ed_size;ecx=ed_pos
234 Lrz 761
.del_char:
762
	mov     esi,ed_text
289 Lrz 763
        test	word ed_flags,ed_shift_on
764
        je	@f
765
	mov	eax,dword ed_shift_pos
766
	mov	ebx,esi
767
        cmp	eax,ecx
768
	jae	.dh_n
769
 
770
	mov	ed_pos,eax	;что бы не было убегания курсора
771
	mov	ebp,ecx
772
	sub	ebp,eax
773
	add	ebx,eax  ;eax меньше
774
	sub	edx,ecx
234 Lrz 775
	add	esi,ecx
776
 
391 Lrz 777
	mov	dword ed_shift_pos,ebp
289 Lrz 778
        jmp	.del_ch_sh
779
	             ;если иначе
780
.dh_n:
781
	mov	ebp,eax
782
	sub	ebp,ecx
783
	add	ebx,ecx
784
	sub	edx,eax
785
	add	esi,eax
391 Lrz 786
	mov	dword ed_shift_pos,ebp
289 Lrz 787
	jmp	.del_ch_sh
788
 
789
@@:	add	esi,ecx ;указатель + смещение к реальному буфферу
234 Lrz 790
	mov	ebx,esi
791
	inc 	esi
792
	cld
793
 
794
	sub	edx,ecx
289 Lrz 795
.del_ch_sh:
796
 
234 Lrz 797
	push 	edi
798
	mov 	edi,ebx
799
@@:
800
	lodsb
801
	stosb
289 Lrz 802
	dec edx
234 Lrz 803
	jns @b
804
 
805
	pop edi
806
	ret
343 Lrz 807
;вычислить закрашиваемую область
808
;соглашение в ebp - передается ed_size
809
.clear_bg:
810
	call	.get_n  ;получить размер в символах ширины компонента
811
	push	eax
812
	mov	ebx,ed_offset
813
	add	eax,ebx	;eax = w_off= ed_offset+width
814
	mov	ebx,ebp ;ed_size
815
 
816
	cmp	eax,ebx
817
	jb	@f
818
	mov	eax,ed_pos
819
	sub	ebx,eax
820
	mov	ecx,ed_offset
821
	sub	eax,ecx
822
	jmp	.nxt
823
@@:	mov	ebx,ed_pos
824
	push	ebx
825
	sub	eax,ebx
826
	mov	ebx,eax	;It is don't optimal
827
 
828
	pop	eax	;ed_pos
829
       	mov	ecx,ed_offset
830
	sub	eax,ecx
831
.nxt:
832
	mov	ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
833
	add	ebp,ebx
834
	pop	edx
835
	cmp	ebp,edx
836
	je	@f
837
	inc	ebx
838
 
839
@@:     mov	edx,ebx
840
	lea	ebx,[eax*2+eax]
841
	shl	ebx,1
842
	add	ebx,ed_left
843
	inc	ebx
844
	shl	ebx,16
845
	lea	ecx,[edx*2+edx]
846
	shl	ecx,1
847
	mov	bx,cx
848
	mov	edx,ed_color
849
	call	.draw_bg_eax
850
	ret
391 Lrz 851
;;;;;;;;;;;;;;;;;;;
852
;;; Обработка примитивов
853
;;;;;;;;;;;;;;;;;;;;
854
;Нарисовать прямоугольник, цвет передается в ebp
855
;входные параметры:
856
;eax=dword ed_pos
857
;ebp=-цвет ed_color or shift_color
858
.draw_rectangle:
859
	mov	ecx,dword ed_offset
860
	sub     eax,ecx
861
        lea	ebx,[eax*2+eax]
862
	shl	ebx,1
863
	inc	ebx
864
	add	ebx,ed_left
865
	shl	ebx,16
866
	mov	bx,6
867
	mov	edx,ebp
868
	call	.draw_bg_eax
869
	ret
404 Lrz 870
;;;;;;;;;;;;;;;;;;
871
;;Проверка нажат ли shift
872
;;;;;;;;;;;;;;;;;;
873
.check_shift:
874
pusha   ;сохраним все регистры
875
	xor	ecx,ecx
876
	inc	ecx
877
	mov	eax,66
878
	mov	ebx,3
879
	int	0x40
880
	test	al,0x03
881
	je	@f
882
        or      word ed_flags,ed_shift   ;установим флаг
883
@@:     popa	   ;восстановим регистры
884
	ret
885
 
234 Lrz 886
;==========================================================
887
;=== обработка мыши =======================================
888
;==========================================================
889
.mouse:
890
pusha
891
;----------------------------------------------------------
892
;--- получаем состояние кнопок мыши -----------------------
893
;----------------------------------------------------------
894
	mov	eax,37
895
	mov	ebx,2
896
	int	0x40
897
;----------------------------------------------------------
898
;--- проверяем состояние ----------------------------------
899
;----------------------------------------------------------
900
	test	eax,1
901
	jnz	.mouse_left_button
348 Lrz 902
	popa
234 Lrz 903
	ret
904
 
905
.mouse_left_button:
906
;----------------------------------------------------------
907
;--- получаем координаты мыши -----------------------------
908
;----------------------------------------------------------
909
	mov	eax,37
910
	xor	ebx,ebx
911
	inc	ebx
912
	int	0x40
913
;----------------------------------------------------------
914
;--- проверяем, попадает ли курсор в edit box -------------
915
;----------------------------------------------------------
916
	mov	ebx,ed_top
917
	cmp	ax,bx
918
	jl	._blur;.mouse_end_no_focus
919
 
920
	add	bx,ed_height
921
	cmp	ax,bx
922
	jg	._blur;.mouse_end_no_focus
923
 
924
	shr	eax,16
925
 
926
	mov	bx,ed_left
927
	cmp	ax,bx
928
	jl	._blur;.mouse_end_no_focus
929
 
930
	add	bx,ed_width
931
	cmp	ax,bx
932
	jg	._blur;.mouse_end_no_focus
933
;--- изменяем позицию курсора ---
934
	push	eax
391 Lrz 935
	mov	ebp,ed_color
234 Lrz 936
	call	.clear_cursor
937
	pop	eax
938
	xor	dx,dx
939
	sub	ax,ed_left
940
	add	ax,2
941
	mov	bx,6
942
	div	bx
943
	add	ax,ed_offset
944
	cmp	ax,ed_size
945
	jna	 @f
946
	mov	ax,ed_size
947
@@:
404 Lrz 948
;;;;;;;
949
;;Секция обработки shift и выделения по shift
950
;;;;;;;
951
        test    word ed_flags,ed_shift_bac
402 Lrz 952
        je      @f
953
	mov	ebp,dword	ed_color
954
	mov	ebx,dword ed_shift_pos
955
	push	eax
956
	call	.sh_cl_
404 Lrz 957
	and	word ed_flags,ed_shift_bac_cl
402 Lrz 958
	pop	eax
959
 
404 Lrz 960
@@:     call	.check_shift	;проверим нажат ли shift
961
 
962
	test    word ed_flags,ed_shift
963
        je	._msh_exit
964
 	test	word ed_flags,ed_shift_on
965
	jne     @f
966
 
967
        push	dword ed_pos
968
        pop	dword ed_shift_pos
969
	or	word ed_flags,ed_shift_on
402 Lrz 970
@@:
971
        mov	ed_pos,eax
404 Lrz 972
	mov	ebp,dword shift_color
973
	mov	ebx,dword ed_shift_pos
402 Lrz 974
	call	.sh_cl_
975
	or      word ed_flags,ed_shift_bac	;установим бит что мы выделили
976
	jmp	.m_sh
404 Lrz 977
._msh_exit:
978
 	mov	ed_pos,eax
979
        mov	dword ed_shift_pos,eax
980
 
402 Lrz 981
.m_sh:  call	.draw_text
234 Lrz 982
	call	.draw_cursor
404 Lrz 983
 
984
 
985
	and	word ed_flags,ed_shift_off	;выключим в любом случае shift
292 Lrz 986
;----------------------------------------------------------
987
;--- процедура установки фокуса ---------------------------
988
;----------------------------------------------------------
989
	bts	word ed_flags,1
348 Lrz 990
	jc	@f
292 Lrz 991
	call	.draw_cursor
348 Lrz 992
	jmp	.drc
234 Lrz 993
._blur:
306 Lrz 994
	test	word ed_flags,ed_always_focus
995
	jne	@f
292 Lrz 996
	btr	word ed_flags,1 ; если не в фокусе, выходим
997
	jnc     @f
402 Lrz 998
 
391 Lrz 999
	mov	ebp,ed_color
234 Lrz 1000
	call	.clear_cursor
348 Lrz 1001
.drc:	call	.draw_border
234 Lrz 1002
@@:
1003
popa
1004
ret
1005
 
1006
;----------------------------------------------------------
1007
;--- процедура размывания фокуса --------------------------
1008
;----------------------------------------------------------
1009
;.blur:
1010
;pusha
1011
;._blur:
1012
	;btr     ed_flags,1
1013
	;jnc     @f
1014
	;call    .draw_border
1015
	;call    .clear_cursor
1016
;@@:
1017
;popa
1018
;ret
1019
}
396 Lrz 1020
ed_figure_only= 1000000000000000b   ;одни символы
391 Lrz 1021
ed_always_focus= 100000000000000b
396 Lrz 1022
ed_focus=                     10b   ;фокус приложения
391 Lrz 1023
ed_shift_on=                1000b   ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift
1024
ed_shift=                    100b   ;включается при нажатии на shift т.е. если нажимаю
1025
ed_shift_off=   1111111111111011b
1026
ed_shift_bac=              10000b   ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение
404 Lrz 1027
ed_shift_bac_cl=1111111111101111b   ;очистка при удалении выделения
391 Lrz 1028
ed_shift_cl=    1111111111100011b
1029
ed_left_fl=               100000b
1030
ed_right_fl=    1111111111011111b
396 Lrz 1031
ed_offset_fl=            1000000b
1032
ed_offset_cl=   1111111110111111b
391 Lrz 1033
ed_insert=              10000000b
1034
ed_insert_cl=   1111111101111111b
1035
ed_height=14 ; высота
1036
shift_color=0x6a9480
234 Lrz 1037
macro draw_edit_boxes start,end
1038
{
1039
	mov	edi,start
1040
	mov	ecx,((end-start)/ed_struc_size)
1041
@@:
1042
	call	edit_box.draw
1043
	add	edi,ed_struc_size
1044
	loop	@b
1045
}
1046
 
1047
macro mouse_edit_boxes start,end
1048
{
1049
	mov	edi,start
1050
	mov	ecx,((end-start)/ed_struc_size)
1051
@@:
1052
	call	edit_box.mouse
1053
	add	edi,ed_struc_size
1054
	loop	@b
1055
}
1056
 
1057
macro key_edit_boxes start,end
1058
{
1059
	mov	edi,start
1060
	mov	ecx,((end-start)/ed_struc_size)
1061
@@:
1062
	call	edit_box.key
1063
	add	edi,ed_struc_size
1064
	loop	@b
1065
}
391 Lrz 1066
ed_struc_size=66
234 Lrz 1067
struc  edit_box width,left,top,color,focus_border_color,\
404 Lrz 1068
       blur_border_color,text_color,max,text,flags,size
234 Lrz 1069
{
1070
.width dd width
1071
.left dd left
1072
.top dd top
1073
.color dd color
1074
.focus_border_color dd focus_border_color
1075
.blur_border_color dd blur_border_color
1076
.text_color dd text_color
1077
.max dd max
282 Lrz 1078
.text dd text
1079
.flags dw flags+0
403 Lrz 1080
.size dd size+0
234 Lrz 1081
.pos dd 0
1082
.offset dd 0
1083
.cl_curs_x dd 0
1084
.cl_curs_y dd 0
391 Lrz 1085
.shift   dd 0
1086
.shift_old   dd 0
234 Lrz 1087
}
1088
 
402 Lrz 1089
 
234 Lrz 1090
macro edit_boxes_set_sys_color start,end,color_table
1091
{
1092
	mov	edi,start
1093
	mov	ecx,((end-start)/ed_struc_size)
1094
	mov	esi,color_table
1095
@@:
1096
	mov	eax,[esi+36]
1097
	mov	ebx,[esi+20]
1098
	mov	ed_focus_border_color,eax
1099
	shr	bh,1
1100
	shr	bl,1
1101
	shr	ah,1
1102
	shr	al,1
1103
	add	ah,bh
1104
	add	al,bl
1105
	ror	eax,16
1106
	ror	ebx,16
1107
	shr	bl,1
1108
	shr	al,1
1109
	add	al,bl
1110
	ror	eax,16
1111
	mov	ed_blur_border_color,eax
1112
	add	edi,ed_struc_size
1113
	loop	@b
306 Lrz 1114
}
1115
 
1116
macro draw_edit_box ed_ptr
1117
{
1118
        mov     edi,ed_ptr
1119
        call    edit_box.draw
1120
}
1121
 
1122
macro mouse_edit_box ed_ptr
1123
{
1124
        mov     edi,ed_ptr
1125
        call    edit_box.mouse
1126
}
1127
 
1128
macro key_edit_box ed_ptr
1129
{
1130
        mov     edi,ed_ptr
1131
        call    edit_box.key
234 Lrz 1132
}