Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
282 Lrz 1
;  19.01.2007 реализовал выделение текста по shift
234 Lrz 2
;  12.12.2006 реализовал поддержку кнопки insert и сегодя компонент почти работает!!!!
3
;  07.12.2006 продолжается работа над переработкой компонента,изменениям подверглись многие функции, переработан вывод текста, а така же алгоритм внесения символов.
4
;  03.09.2006 по возможности отказался от 16 битной арифметики, добавил новые баги
5
;  09.08.2006 произведена оптимизация работы конпок DEL и Backspace, уменьшен размер выполняемого кода.
6
;  21.07.2006 добавлена функция кнопки Del, теперь можно удалять символы при помощи данной клавиши
7
; Автор: Евтихов Максим (Maxxxx32) email: maxxxxm@mail.ru
8
; Дата последних изменений: 13.06.06 10:40
9
;  Напишите в исходном коде своей программы use_edit_box,
10
; это вставит необходимые процедуры в код вашей программы.
11
;  Процедуры:
12
;   edit_box.draw - полная перерисовка;
13
;   edit_box.key - обработка клавиатуры;
14
;   edit_box.mouse - обработка мыши;
15
;   edit_box.focus - установка фокуса;
16
;   edit_box.blur - его размывание;
17
;   edit_box.get_n - получить количество прорисовываемых символов.
18
;  При вызове любых из этих процедур в регистре edi следует
19
; оставить указатель на структуру.
20
;  Пример структуры:
21
; some_edit edit_box 100,10,30,0x00ffffff,0,0x00aaaaaa,0,255,some_edit_text
22
; длина, высота, верх, цвет фона, цвет рамки, если выбран,
23
; цвет рамки, если не выбран, максимальное количество символов,
24
; указатель на буфер, где будут хранится символы. Буфер должен
25
; оканчиваться нулем, например если максимальное количество 255:
26
;  some_edit_text:
27
;       rb      256 ;255+1
28
 
29
;  Пример вызова процедуры:
30
;       mov     edi,some_edit
31
;       call    edit_box.draw
32
 
33
;  При вызове процедуры edit_box.key код клавиши должен
34
; находится в ah, то есть перед вызовом этой процедуры надо вызвать
35
; 2-ую сисемную функцию, например:
36
;       mov     eax,2
37
;       int     0x40
38
;       mov     edi,some_edit1
39
;       call    edit_box.key
40
;       mov     edi,some_edit2
41
;       call    edit_box.key
42
;  Перед вызовом обработчика мыши следует проверить, является ли окно
43
; активным.
44
;  Если щелчок мыши был пройзведен за пределами edit box
45
; фокус теряется.
46
macro use_edit_box
47
{
48
edit_box:
49
ed_width	equ [edi]		;ширина компонента
50
ed_left 	equ [edi+4]             ;положение по оси х
51
ed_top		equ [edi+8]             ;положение по оси у
52
ed_color	equ [edi+12]		;цвет фона компонента
53
ed_focus_border_color	equ [edi+16]	;цвет рамки компонента
54
ed_blur_border_color	equ [edi+20]    ;цвет не активного компонента
55
ed_text_color	equ [edi+24]            ;цвет текста
282 Lrz 56
ed_max		equ [edi+28]                    ;кол-во символов которые можно максимально ввести
57
ed_text 	equ [edi+32]                    ;указатель на буфер
58
ed_flags	equ [edi+36]            ;флаги
59
ed_size equ [edi+38]                    ;кол-во символов
60
ed_pos	equ [edi+42]                    ;позиция курсора
61
ed_offset	equ [edi+46]            ;смещение
62
cl_curs_x	equ [edi+50]		;предыдущее координата курсора по х
63
cl_curs_y	equ [edi+54]		;предыдущее координата курсора по у
64
ed_insert	equ [edi+58]		;word
65
ed_shift_pos	equ [edi+60]
234 Lrz 66
ed_height=14 ; высота
282 Lrz 67
shift_color=0x6a9480
234 Lrz 68
;==========================================================
69
;=== процедура прорисовки =================================
70
;==========================================================
71
.draw:
72
pusha
73
;--- рисуем рамку ---
74
	call	.draw_border		; Функция стабильна
75
.draw_bg_cursor_text:
76
;--- изменяем смещение, если надо ---
77
	call	.check_offset		;вычисление позиции курсора стабильна
78
;--- рисуем внутреннюю область ---
79
	call	.draw_bg                ;нарисовать прямоугольник рабочей области
80
.draw_cursor_text:
81
;--- рисуем курсор ---
82
	;--- может его не надо рисовать ----
282 Lrz 83
	test	word ed_flags,ed_focus
234 Lrz 84
	je	@f
85
	call	.draw_cursor
86
@@:
87
	call	.draw_text
88
popa
89
ret
90
 
282 Lrz 91
.str:
92
	mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
93
	 ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
94
	cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
95
	jb @f
96
	xor edx,edx  ;очистить edx
97
	div ecx      ;разделить - остаток в edx
98
	push edx     ;положить в стек
99
	;dec edi	     ;смещение необходимое для записи с конца строки
100
 	call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
101
	pop eax
102
	@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
103
	;sbb al,$69  ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
104
	;das	    ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
105
	or al,0x30  ;данная команда короче  чем две выше
106
	stosb	    ;записать элемент из регистра al в ячеку памяти es:edi
107
 
108
	ret	    ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
109
 
234 Lrz 110
;----------------------------------------------------------
111
;--- процедура прорисовки текста --------------------------
112
;----------------------------------------------------------
113
.draw_text:
114
;--- вычисляем, сколько помещается символов ---
115
;--- чтобы мусор не рисовать ---
116
	call 	.get_n
117
	mov	esi,ed_size
118
        mov	ebx,ed_offset
119
	sub	esi,ebx
120
	cmp	eax,esi
121
	jae	@F
122
	mov	esi,eax		;чтобы не выходить за пределы экрана
123
;--- рисуем текст ---
124
@@: 	mov	eax,4
125
	mov	ebx,ed_left
126
	add	ebx,2
127
	shl	ebx,16
128
	mov	bx,ed_top
129
	add	ebx,4
130
	mov	ecx,ed_text_color
131
	mov	edx,ed_offset
132
	add	edx,ed_text
133
	int	0x40
134
ret
135
;----------------------------------------------------------
136
;--- процедура прорисовки фона ----------------------------
137
;входные данные
138
;eax
139
;----------------------------------------------------------
140
.draw_bg_eax:
282 Lrz 141
;pusha
234 Lrz 142
	mov	ecx,ed_top
143
	add	ecx,1
144
	shl	ecx,16
145
	mov	cx,13
146
;	sub	ecx,1
282 Lrz 147
	mov	edx,[esp+4]	;color
148
;	mov	edx,ed_color
234 Lrz 149
	mov	eax,13
150
	int	0x40
282 Lrz 151
;popa
152
ret 4
234 Lrz 153
 
154
	jmp	@f
155
.draw_bg:
282 Lrz 156
;pusha
234 Lrz 157
	mov	ebx,ed_left
158
	add	ebx,1
159
	shl	ebx,16
160
	mov	bx,ed_width
161
	sub	ebx,1
162
 
163
@@:
164
	mov	ecx,ed_top
165
	add	ecx,1
166
	shl	ecx,16
167
	mov	cx,ed_height
168
	sub	ecx,1
169
 
170
	mov	edx,ed_color
171
	mov	eax,13
172
	int	0x40
282 Lrz 173
;popa
234 Lrz 174
ret
175
 
176
;----------------------------------------------------------
177
;--- процедура получения количества символов в текущей щирине компонента --------------
178
;----------------------------------------------------------
179
.get_n:
180
	xor	edx,edx   ;результат распологается в паре edx:eax в eax - остаток
181
	mov	eax,ed_width	;получем ширину компонента
182
	sub	eax,4		;вычтим 4
183
	mov	ebx,6		;загрузми делитель
184
	div	ebx		;размделим на 6
185
ret
186
 
187
;----------------------------------------------------------
188
;--- процедура рисования курсора --------------------------
189
;----------------------------------------------------------
190
.clear_cursor:
191
	mov	edx,ed_color
282 Lrz 192
        test    word ed_flags,ed_shift
193
	je	@f
194
       	mov	edx,shift_color
195
@@:
234 Lrz 196
	mov	ebx,cl_curs_x
197
	mov	ecx,cl_curs_y
198
	jmp	.draw_curs
199
.draw_cursor:
282 Lrz 200
 
234 Lrz 201
	mov	edx,ed_text_color
202
@@:
203
	mov	ebx,ed_pos
204
	mov	ecx,ed_offset
205
	sub	ebx,ecx
206
 
207
	lea     ebx,[ebx*2+ebx]
208
	shl     ebx,1
209
	;imul	ebx,6
210
	add	bx,ed_left
211
	inc	ebx
212
	mov	ebp,ebx
213
	;push	bx
214
	shl	ebx,16
215
	mov	bx,bp
216
	;pop	bx
217
	mov	ecx,ed_top
218
	add	ecx,2
219
	mov	ebp,ecx
220
 
221
	shl	ecx,16
222
	mov	cx,bp
223
	add	cx,ed_height-4
224
 
225
	mov	cl_curs_x,ebx
226
	mov	cl_curs_y,ecx
227
.draw_curs:
228
	mov	eax,38
229
	int	0x40
230
ret
231
 
232
;----------------------------------------------------------
233
;--- процедура рисования рамки ----------------------------
234
;----------------------------------------------------------
235
.draw_border:
236
;--- цвет рамки ---
282 Lrz 237
	test	dword ed_flags,ed_focus
234 Lrz 238
	mov	edx,ed_focus_border_color
239
	jne     @f
240
	mov	edx,ed_blur_border_color
241
@@:
242
;--- сверху ---
243
	mov	eax,38
244
	mov	ebx,ed_left
245
	mov 	ecx,ebx
246
	shl	ebx,16
247
	mov	bx,cx
248
	add	bx,ed_width
249
	mov	ecx, ed_top
250
	mov	esi,ecx
251
	shl	ecx,16
252
	mov	cx,si
253
	int	0x40
254
 
255
;--- снизу ---
256
	mov	esi,ecx
257
	add	ecx,ed_height
258
	mov	ebp,ecx
259
	shl	ecx,16
260
	mov	cx,bp
261
	int	0x40
262
 
263
;--- слева ---
264
	mov	cx,si
265
	mov	ebp,ebx
266
	sub	bx,ed_width
267
	int	0x40
268
 
269
;--- справа ---
270
	mov	ebx,ebp
271
	shl	ebx,16
272
	mov	bx,bp
273
	int	0x40
274
ret
275
;----------------------------------------------------------
276
;--- проверка, зашел ли курсор за границы и, если надо, ---
277
;--- изменяем смещение ------------------------------------
278
;--- eax = 1, если не изменилось или eax = 0, если
279
; изменилось
280
;----------------------------------------------------------
281
.check_offset:
282
	pushad
283
	push	dword ed_offset          ;сохраним смещение
284
	call	.get_n			;получим кол-во символов в паре регистров edx:eax
285
	mov	ebx,eax
286
	mov	eax,ed_pos
287
	xor 	edx,edx
288
	idiv	ebx
289
	xor 	edx,edx
290
	imul    eax,ebx
291
	mov	ed_offset,eax
292
	pop	ebx
293
	cmp	ax,bx
294
	je	@f
295
;;;;;;;; данные для закрашивания всей полосы прямоугольника
296
	mov	ebx,ed_left
297
	inc	ebx
298
	shl	ebx,16
299
	mov	bx,ed_width
300
	dec 	ebx
282 Lrz 301
	push	dword ed_color
234 Lrz 302
	call    .draw_bg_eax
303
	mov	dword [esp+28],0
304
@@:	popad
305
	ret
306
;==========================================================
307
;=== обработка клавиатуры =================================
308
;==========================================================
309
.key:
310
pusha
282 Lrz 311
	test	word ed_flags,ed_focus ; если не в фокусе, выходим
234 Lrz 312
	je     .no_figure ;@f
282 Lrz 313
 
314
	push	eax
315
	mov	ecx,1
316
	mov	eax,66
317
	mov	ebx,3
318
	int	0x40
319
	xor	ebx,ebx
320
	test	al,0x03
321
	je	@f
322
        or      word ed_flags,ed_shift
323
 
324
@@:     pop	eax
234 Lrz 325
;----------------------------------------------------------
326
;--- проверяем, что нажато --------------------------------
327
;----------------------------------------------------------
328
	cmp	ah,8
329
	jz	.backspace
330
	cmp	ah,0xb6
331
	jz	.delete
332
	cmp	ah,176
333
	jz	.left
334
	cmp	ah,179
335
	jz	.right
336
	cmp	ah,180
337
	jz	.home
338
	cmp	ah,181
339
	jz	.end
340
	cmp	ah,185	;insert
341
	jz	.insert
342
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
343
;Заглушка на обработку клавиш вверх и вниз
344
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
345
	cmp	ah,177
346
        jz	.no_figure
347
	cmp	ah,178
348
	jz	.no_figure
349
	cmp	ah,27   ;ESC - клавиша ))
350
	jz	.no_figure
351
;--- нажата другая клавиша ---
352
	test	word ed_flags,ed_figure_only  ; только цифры ?
353
	jz	@f
354
	cmp	ah,'0'
355
	jb	.no_figure
356
	cmp	ah,'9'
357
	ja	.no_figure
358
@@:        ; проверяем, находится ли курсор в конце
359
	mov	edx, ed_max
360
	mov	ebx, ed_pos
361
	cmp	ebx,edx
362
	jl	@f ; если меньше или равно
363
.no_figure:
364
	popa
365
	ret
366
.insert: not 	word ed_insert
282 Lrz 367
 
234 Lrz 368
        jmp	.no_figure
369
.ins_v:
370
	pop	eax edi
371
	dec	dword ed_size    ;processing is insert
372
	push	edi eax
373
	sub	esi,ecx
374
	add	esi,ebx
375
        mov	edi,esi
376
	jmp	.In_k
377
@@:     ; сдвигаем символы после курсора вправо
378
	mov	ecx,ed_size
379
	push	edi eax
380
	mov	esi,ed_text     ; Указатель на буфер
381
 
382
	movzx	eax,word ed_insert
383
				;Будем работать со строкой
384
	add	esi,ecx		;add ed_size добавим max size
385
	mov	edi,esi
386
 
387
       	cmp 	ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
388
	je	.In_k
389
	cmp	ax,-1 ;IF insert is enable
390
	je	.ins_v
391
 
392
	sub	ecx,ebx         ;Найдем кол-во символов для передвижения.
393
	inc	edi		;Сместим наши символы в право
394
	std
395
	inc 	ecx
396
   @@:
397
	;--------
398
	lodsb
399
	stosb
400
	;--------
401
	loop	@b
402
.In_k:	cld
403
	pop eax
404
	mov al,ah
405
	stosb
406
	pop edi
407
; вставляем код клавиши туда, где курсор
408
	; увеличиваем значение размера и позиции
409
	inc	 dword ed_size
282 Lrz 410
 
411
	push	dword	ed_pos
412
	push	dword	ed_size
413
;	push	.return
234 Lrz 414
	call	.draw_all2
415
	inc	 dword ed_pos
282 Lrz 416
;.return:
234 Lrz 417
	jmp    .draw_cursor_text
418
.delete:
282 Lrz 419
 
234 Lrz 420
	mov	edx,ed_size
421
	mov	ecx,ed_pos
422
 
423
	cmp	edx,ecx
424
	jg	@f
425
	popa
426
	ret
427
 
428
@@:	call 	.del_char
429
	jmp 	.draw_all
430
 
431
;--- нажата клавиша backspace ---
432
.backspace:
433
	; проверяем, курсор у левого края ?
434
	mov	edx,ed_size
435
	mov	ecx,ed_pos
436
	test	ecx,ecx
437
	jnz	@f
438
	popa
439
	ret
440
 
441
@@:	cmp	edx,ecx	;if ed_pos=ed_size
442
	je	@f
443
	dec	ecx
444
	call 	.del_char
445
@@:
446
	dec	 dword ed_pos
447
 
448
.draw_all:
282 Lrz 449
	push	dword	ed_pos
450
	push	dword	ed_size
234 Lrz 451
	push	.draw_cursor_text;eax
452
	dec	 dword ed_size
453
.draw_all2:
454
	call	.clear_cursor
455
	call	.check_offset
456
	call	.get_n
457
	push	eax
458
	mov	ebx,ed_offset
459
	add	eax,ebx	;eax = w_off= ed_offset+width
282 Lrz 460
	mov	ebx,[esp+8]	;ed_size
234 Lrz 461
 
462
	cmp	eax,ebx
463
	jb	@f
282 Lrz 464
	mov	eax,[esp+12]	;	ed_pos
234 Lrz 465
	sub	ebx,eax
466
	mov	ecx,ed_offset
467
	sub	eax,ecx
468
	jmp	.nxt
282 Lrz 469
@@:	mov	ebx,[esp+12];ed_pos
234 Lrz 470
	push	ebx
471
	sub	eax,ebx
282 Lrz 472
	mov	ebx,eax	;It is don't optimal
234 Lrz 473
 
474
	pop	eax	;ed_pos
475
       	mov	ecx,ed_offset
476
	sub	eax,ecx
477
 
478
.nxt:
479
	mov	ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
480
	add	ebp,ebx
481
	pop	edx
482
	cmp	ebp,edx
483
	je	@f
484
	inc	ebx
485
 
486
@@:     mov	edx,ebx
487
	lea	ebx,[eax*2+eax]
488
	shl	ebx,1
489
	add	ebx,ed_left
490
	inc	ebx
491
	shl	ebx,16
492
	lea	ecx,[edx*2+edx]
493
	shl	ecx,1
494
	mov	bx,cx
282 Lrz 495
	push	dword ed_color
234 Lrz 496
	call	.draw_bg_eax
282 Lrz 497
	ret     8
234 Lrz 498
;--- нажата клавиша left ---
282 Lrz 499
.left:  test    word ed_flags,ed_shift
500
	je	@f
501
	test	word ed_flags,ed_shift_on
502
	jne	@f
503
       	push	dword ed_pos
504
	pop	dword ed_shift_pos
505
	or	word ed_flags,ed_shift_on
506
@@:     mov	ebx,ed_pos
234 Lrz 507
	test	ebx,ebx
508
	jz	.nd_k
509
	call	.clear_cursor
510
	dec	 dword ed_pos
511
	jmp	.nd_k
512
;--- нажата клавиша right ---
513
.right:
282 Lrz 514
	test    word ed_flags,ed_shift
515
	je	@f
516
	test	word ed_flags,ed_shift_on
517
	jne	@f
518
       	push	dword ed_pos
519
	pop	dword ed_shift_pos
520
	or	word ed_flags,ed_shift_on
521
@@:	mov	ebx,ed_pos
234 Lrz 522
	cmp	ebx,ed_size
523
	je	.nd_k
524
	call	.clear_cursor
525
	inc	dword  ed_pos
526
	jmp	.nd_k
527
.home:
282 Lrz 528
;	test    word ed_flags,ed_shift
529
;	je	@f
530
 ;      	push	dword ed_pos
531
;	pop	dword ed_shift_pos
532
@@:	mov	ebx,ed_pos
234 Lrz 533
	test	ebx,ebx
534
	jz	.nd_k
535
	call	.clear_cursor
536
	xor	eax,eax
537
	mov	ed_pos,eax
538
	jmp	.nd_k
539
 
540
.end:
282 Lrz 541
;	test    word ed_flags,ed_shift
542
;	je	@f
543
 ;      	push	dword ed_pos
544
;	pop	dword ed_shift_pos
545
@@:	mov	ebx,ed_pos
234 Lrz 546
	cmp	ebx,dword ed_size
547
	je	@f
548
	call	.clear_cursor
549
	mov	eax,ed_size
550
	mov	ed_pos,eax
551
.nd_k:	call	.check_offset
282 Lrz 552
	;test	eax,eax
553
	;jz	.draw_bg_cursor_text
234 Lrz 554
	call	.draw_cursor
282 Lrz 555
 
556
.shift: ;;;;;;;SHIFT
557
	;-----------  отладка
558
	pushad
559
	mov	[data_of_code],0
560
	mov ax,word ed_flags
561
	mov edi,data_of_code
562
	call .str
563
	;рисование фона
564
	mov eax,13
565
	mov ebx,178*65536+36
566
	mov ecx,28*65536+10
567
	xor edx,edx
568
	int 0x40
569
	;вывод значения на экран
570
	mov eax,4
571
	mov ebx,180*65536+30
572
	mov ecx,0x10DDBBCC
573
	mov edx,data_of_code
574
	mov esi,4
575
	int 0x40
576
	popad
577
	;----------- отладка
578
 
579
    	call	.draw_bg
580
	test      word ed_flags,ed_shift
581
        je	.f_exit
582
;;;;;;SHIFT end
583
	mov 	eax,dword	ed_pos
584
	mov	ebx,dword	ed_shift_pos
585
	cmp	eax,ebx
586
	jae	.sh_n
587
	push	eax  ;меньшее в eax
588
	push	ebx  ;большее
589
	jmp	.sh_n1
590
	             ;если иначе
591
.sh_n: 	push	ebx
592
	push	eax
593
.sh_n1:
594
;        jmp	.draw_all2
595
;;;;;;;;;;;;;;;;;;;;;;;;;
596
	;call	.clear_cursor
597
	call	.check_offset
598
	call	.get_n
599
	mov	edx,eax	;size of ed_box
600
;	push	eax
601
	mov	ecx,ed_offset
602
	add	eax,ecx	;eax = w_off= ed_offset+width
603
	mov	ebp,eax ;save
604
	pop	ebx     ;большее
605
	pop	eax     ;меньшее
606
 
607
 
608
	cmp	eax,ecx         ;сравнение с меньшего с offset.
609
	jae	.f_f            ;если больше
610
	xor	eax,eax
611
	cmp	ebp,ebx		;cравним размер w_off с большим
612
	jb	@f
613
	sub	ebx,ecx
614
	jmp     .nxt_f
615
@@:	mov	ebx,ebp
616
	sub	ebx,ecx
617
	jmp     .nxt_f
618
 
619
.f_f:
620
	sub	eax,ecx
621
	cmp	ebp,ebx		;cравним размер w_off с большим
622
	jle	@f
623
	sub	ebx,ecx
624
	sub	ebx,eax
625
	jmp     .nxt_f
234 Lrz 626
@@:
282 Lrz 627
	mov	ebx,ebp
628
	sub	ebx,ecx
629
	sub	ebx,eax
630
.nxt_f:
631
;	mov	ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
632
;	add	ebp,ebx
633
;	pop	edx
634
;	cmp	ebp,edx
635
;	je	.ff
636
;	inc	ebx
637
 
638
.ff:     mov	edx,ebx
639
	lea	ebx,[eax*2+eax]
640
	shl	ebx,1
641
	add	ebx,ed_left
642
	inc	ebx
643
	shl	ebx,16
644
	lea	ecx,[edx*2+edx]
645
	shl	ecx,1
646
	mov	bx,cx
647
;	mov	ebp,ed_color
648
;	not	ebp
649
	push	dword shift_color
650
	call	.draw_bg_eax
651
;	pop	edx
652
;	or	word ed_flags,ed_shift
653
	and    word ed_flags,1111111111111011b
654
        jmp	.draw_cursor_text
655
;;;;;;;;;;;;;;;;;;;;;
656
 
657
.f_exit:	and    word ed_flags,ed_shift_cl
658
        jmp	.draw_cursor_text
659
@@:
234 Lrz 660
popa
661
ret
662
        ;- удаление символа
663
.del_char:
664
	mov     esi,ed_text
665
	add	esi,ecx
666
 
667
	mov	ebx,esi
668
	inc 	esi
669
	cld
670
 
671
	sub	edx,ecx
672
	mov	ecx,edx
673
	push 	edi
674
	mov 	edi,ebx
675
@@:
676
	lodsb
677
	stosb
678
	dec ecx
679
	jns @b
680
 
681
	pop edi
682
	ret
683
;==========================================================
684
;=== обработка мыши =======================================
685
;==========================================================
686
.mouse:
687
pusha
688
;----------------------------------------------------------
689
;--- получаем состояние кнопок мыши -----------------------
690
;----------------------------------------------------------
691
	mov	eax,37
692
	mov	ebx,2
693
	int	0x40
694
;----------------------------------------------------------
695
;--- проверяем состояние ----------------------------------
696
;----------------------------------------------------------
697
	test	eax,1
698
	jnz	.mouse_left_button
699
@@:     popa
700
	ret
701
 
702
.mouse_left_button:
703
;----------------------------------------------------------
704
;--- получаем координаты мыши -----------------------------
705
;----------------------------------------------------------
706
	mov	eax,37
707
	xor	ebx,ebx
708
	inc	ebx
709
	int	0x40
710
;----------------------------------------------------------
711
;--- проверяем, попадает ли курсор в edit box -------------
712
;----------------------------------------------------------
713
	mov	ebx,ed_top
714
	cmp	ax,bx
715
	jl	._blur;.mouse_end_no_focus
716
 
717
	add	bx,ed_height
718
	cmp	ax,bx
719
	jg	._blur;.mouse_end_no_focus
720
 
721
	shr	eax,16
722
 
723
	mov	bx,ed_left
724
	cmp	ax,bx
725
	jl	._blur;.mouse_end_no_focus
726
 
727
	add	bx,ed_width
728
	cmp	ax,bx
729
	jg	._blur;.mouse_end_no_focus
730
;--- изменяем позицию курсора ---
731
	push	eax
732
	call	.clear_cursor
733
	pop	eax
734
	xor	dx,dx
735
	sub	ax,ed_left
736
	add	ax,2
737
	mov	bx,6
738
	div	bx
739
	add	ax,ed_offset
740
	cmp	ax,ed_size
741
	jna	 @f
742
	mov	ax,ed_size
743
@@:
744
	mov	ed_pos,ax
745
	call	.check_offset
746
	call	.draw_cursor
747
	call	.focus
748
 
749
.mouse_pressed:
750
popa
751
ret
752
;.mouse_end_no_focus:
753
;        call    .blur
754
;popa
755
;ret
756
;----------------------------------------------------------
757
;--- процедура установки фокуса ---------------------------
758
;----------------------------------------------------------
759
.blur:
760
pusha
761
._blur:
282 Lrz 762
	btr	dword ed_flags,1
234 Lrz 763
	jnc	@f
764
	call	.clear_cursor
765
	jmp	.blur_end
766
.focus:
767
pusha
282 Lrz 768
	bts	dword ed_flags,1
234 Lrz 769
	jc	@f
770
	call	.draw_cursor
771
.blur_end:
772
	call	.draw_border
773
@@:
774
popa
775
ret
776
 
777
;----------------------------------------------------------
778
;--- процедура размывания фокуса --------------------------
779
;----------------------------------------------------------
780
;.blur:
781
;pusha
782
;._blur:
783
	;btr     ed_flags,1
784
	;jnc     @f
785
	;call    .draw_border
786
	;call    .clear_cursor
787
;@@:
788
;popa
789
;ret
790
}
791
ed_figure_only=1000000000000000b
792
ed_focus=10b
282 Lrz 793
ed_shift_on=1000b
794
ed_shift=100b
795
ed_shift_cl=0011b
234 Lrz 796
macro draw_edit_boxes start,end
797
{
798
	mov	edi,start
799
	mov	ecx,((end-start)/ed_struc_size)
800
@@:
801
	call	edit_box.draw
802
	add	edi,ed_struc_size
803
	loop	@b
804
}
805
 
806
macro mouse_edit_boxes start,end
807
{
808
	mov	edi,start
809
	mov	ecx,((end-start)/ed_struc_size)
810
@@:
811
	call	edit_box.mouse
812
	add	edi,ed_struc_size
813
	loop	@b
814
}
815
 
816
macro key_edit_boxes start,end
817
{
818
	mov	edi,start
819
	mov	ecx,((end-start)/ed_struc_size)
820
@@:
821
	call	edit_box.key
822
	add	edi,ed_struc_size
823
	loop	@b
824
}
282 Lrz 825
ed_struc_size=64
234 Lrz 826
struc  edit_box width,left,top,color,focus_border_color,\
827
       blur_border_color,text_color,max,text,flags,size
828
{
829
.width dd width
830
.left dd left
831
.top dd top
832
.color dd color
833
.focus_border_color dd focus_border_color
834
.blur_border_color dd blur_border_color
835
.text_color dd text_color
836
.max dd max
282 Lrz 837
.text dd text
838
.flags dw flags+0
234 Lrz 839
.size dd size+0
840
.pos dd 0
841
.offset dd 0
842
.cl_curs_x dd 0
843
.cl_curs_y dd 0
844
.insert	   dw 0
282 Lrz 845
.shift	   dd 0
234 Lrz 846
}
847
 
848
macro edit_boxes_set_sys_color start,end,color_table
849
{
850
	mov	edi,start
851
	mov	ecx,((end-start)/ed_struc_size)
852
	mov	esi,color_table
853
@@:
854
	mov	eax,[esi+36]
855
	mov	ebx,[esi+20]
856
	mov	ed_focus_border_color,eax
857
	shr	bh,1
858
	shr	bl,1
859
	shr	ah,1
860
	shr	al,1
861
	add	ah,bh
862
	add	al,bl
863
	ror	eax,16
864
	ror	ebx,16
865
	shr	bl,1
866
	shr	al,1
867
	add	al,bl
868
	ror	eax,16
869
	mov	ed_blur_border_color,eax
870
	add	edi,ed_struc_size
871
	loop	@b
872
}