Subversion Repositories Kolibri OS

Rev

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

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