Subversion Repositories Kolibri OS

Rev

Rev 289 | 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:
290 Lrz 472
	and    word ed_flags,ed_shift_cl
234 Lrz 473
	call	.clear_cursor
474
	call	.check_offset
475
	call	.get_n
476
	push	eax
477
	mov	ebx,ed_offset
478
	add	eax,ebx	;eax = w_off= ed_offset+width
289 Lrz 479
	mov	ebx,ed_size
234 Lrz 480
 
481
	cmp	eax,ebx
482
	jb	@f
289 Lrz 483
	mov	eax,ed_pos
234 Lrz 484
	sub	ebx,eax
485
	mov	ecx,ed_offset
486
	sub	eax,ecx
487
	jmp	.nxt
289 Lrz 488
@@:	mov	ebx,ed_pos
234 Lrz 489
	push	ebx
490
	sub	eax,ebx
282 Lrz 491
	mov	ebx,eax	;It is don't optimal
234 Lrz 492
 
493
	pop	eax	;ed_pos
494
       	mov	ecx,ed_offset
495
	sub	eax,ecx
496
 
497
.nxt:
498
	mov	ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
499
	add	ebp,ebx
500
	pop	edx
501
	cmp	ebp,edx
502
	je	@f
503
	inc	ebx
504
 
505
@@:     mov	edx,ebx
506
	lea	ebx,[eax*2+eax]
507
	shl	ebx,1
508
	add	ebx,ed_left
509
	inc	ebx
510
	shl	ebx,16
511
	lea	ecx,[edx*2+edx]
512
	shl	ecx,1
513
	mov	bx,cx
289 Lrz 514
	mov	edx,ed_color
234 Lrz 515
	call	.draw_bg_eax
289 Lrz 516
	ret
517
;	jmp	.shift
234 Lrz 518
;--- нажата клавиша left ---
289 Lrz 519
.left:  call	.sh_enable
520
	mov	ebx,ed_pos
234 Lrz 521
	test	ebx,ebx
522
	jz	.nd_k
523
	call	.clear_cursor
524
	dec	 dword ed_pos
525
	jmp	.nd_k
526
;--- нажата клавиша right ---
289 Lrz 527
.right: call	.sh_enable
528
	mov	ebx,ed_pos
234 Lrz 529
	cmp	ebx,ed_size
530
	je	.nd_k
531
	call	.clear_cursor
532
	inc	dword  ed_pos
533
	jmp	.nd_k
289 Lrz 534
.home:  call	.sh_enable
535
	mov	ebx,ed_pos
234 Lrz 536
	test	ebx,ebx
537
	jz	.nd_k
538
	call	.clear_cursor
539
	xor	eax,eax
540
	mov	ed_pos,eax
541
	jmp	.nd_k
542
 
289 Lrz 543
.end:   call	.sh_enable
544
	mov	ebx,ed_pos
234 Lrz 545
	cmp	ebx,dword ed_size
546
	je	@f
547
	call	.clear_cursor
548
	mov	eax,ed_size
549
	mov	ed_pos,eax
550
.nd_k:	call	.check_offset
282 Lrz 551
	;test	eax,eax
552
	;jz	.draw_bg_cursor_text
234 Lrz 553
	call	.draw_cursor
282 Lrz 554
 
555
.shift: ;;;;;;;SHIFT
556
 
557
    	call	.draw_bg
558
	test      word ed_flags,ed_shift
559
        je	.f_exit
560
;;;;;;SHIFT end
561
	mov 	eax,dword	ed_pos
562
	mov	ebx,dword	ed_shift_pos
563
	cmp	eax,ebx
564
	jae	.sh_n
565
	push	eax  ;меньшее в eax
566
	push	ebx  ;большее
567
	jmp	.sh_n1
568
	             ;если иначе
569
.sh_n: 	push	ebx
570
	push	eax
571
.sh_n1:
572
;        jmp	.draw_all2
573
;;;;;;;;;;;;;;;;;;;;;;;;;
574
	;call	.clear_cursor
575
	call	.check_offset
576
	call	.get_n
577
	mov	edx,eax	;size of ed_box
578
;	push	eax
579
	mov	ecx,ed_offset
580
	add	eax,ecx	;eax = w_off= ed_offset+width
581
	mov	ebp,eax ;save
582
	pop	ebx     ;большее
583
	pop	eax     ;меньшее
584
 
585
 
586
	cmp	eax,ecx         ;сравнение с меньшего с offset.
587
	jae	.f_f            ;если больше
588
	xor	eax,eax
589
	cmp	ebp,ebx		;cравним размер w_off с большим
590
	jb	@f
591
	sub	ebx,ecx
592
	jmp     .nxt_f
593
@@:	mov	ebx,ebp
594
	sub	ebx,ecx
595
	jmp     .nxt_f
596
 
597
.f_f:
598
	sub	eax,ecx
599
	cmp	ebp,ebx		;cравним размер w_off с большим
600
	jle	@f
601
	sub	ebx,ecx
602
	sub	ebx,eax
603
	jmp     .nxt_f
234 Lrz 604
@@:
282 Lrz 605
	mov	ebx,ebp
606
	sub	ebx,ecx
607
	sub	ebx,eax
608
.nxt_f:
289 Lrz 609
	mov	edx,ebx
282 Lrz 610
	lea	ebx,[eax*2+eax]
611
	shl	ebx,1
612
	add	ebx,ed_left
613
	inc	ebx
614
	shl	ebx,16
615
	lea	ecx,[edx*2+edx]
616
	shl	ecx,1
617
	mov	bx,cx
289 Lrz 618
	mov	edx,shift_color
282 Lrz 619
	call	.draw_bg_eax
620
	and    word ed_flags,1111111111111011b
621
        jmp	.draw_cursor_text
622
;;;;;;;;;;;;;;;;;;;;;
623
 
624
.f_exit:	and    word ed_flags,ed_shift_cl
625
        jmp	.draw_cursor_text
289 Lrz 626
 
627
.sh_enable:
628
	test    word ed_flags,ed_shift
629
	je	@f
630
	test	word ed_flags,ed_shift_on
631
	jne	@f
632
       	push	dword ed_pos
633
	pop	dword ed_shift_pos
634
	or	word ed_flags,ed_shift_on
635
@@:	ret
636
 
234 Lrz 637
        ;- удаление символа
289 Lrz 638
	;Входные данные edx=ed_size;ecx=ed_pos
234 Lrz 639
.del_char:
640
	mov     esi,ed_text
289 Lrz 641
 
642
 
643
        test	word ed_flags,ed_shift_on
644
        je	@f
645
	mov	eax,dword ed_shift_pos
646
	mov	ebx,esi
647
        cmp	eax,ecx
648
	jae	.dh_n
649
 
650
	mov	ed_pos,eax	;что бы не было убегания курсора
651
	mov	ebp,ecx
652
	sub	ebp,eax
653
	add	ebx,eax  ;eax меньше
654
	sub	edx,ecx
234 Lrz 655
	add	esi,ecx
656
 
289 Lrz 657
 
658
	mov	ed_shift_pos,ebp
659
        jmp	.del_ch_sh
660
	             ;если иначе
661
.dh_n:
662
	mov	ebp,eax
663
	sub	ebp,ecx
664
	add	ebx,ecx
665
	sub	edx,eax
666
	add	esi,eax
667
	mov	ed_shift_pos,ebp
668
	jmp	.del_ch_sh
669
 
670
@@:	add	esi,ecx ;указатель + смещение к реальному буфферу
234 Lrz 671
	mov	ebx,esi
672
	inc 	esi
673
	cld
674
 
675
	sub	edx,ecx
289 Lrz 676
.del_ch_sh:
677
	;-----------  отладка
678
	pushad
679
	mov	[data_of_code],0
680
	mov eax,ed_pos;word ed_flags
681
	mov edi,data_of_code
682
	call .str
683
	;рисование фона
684
	mov eax,13
685
	mov ebx,178*65536+36
686
	mov ecx,28*65536+10
687
	xor edx,edx
688
	int 0x40
689
	;вывод значения на экран
690
	mov eax,4
691
	mov ebx,180*65536+30
692
	mov ecx,0x10DDBBCC
693
	mov edx,data_of_code
694
	mov esi,4
695
	int 0x40
696
	popad
697
	;----------- отладка
698
 
234 Lrz 699
	push 	edi
700
	mov 	edi,ebx
701
@@:
702
	lodsb
703
	stosb
289 Lrz 704
	dec edx
234 Lrz 705
	jns @b
706
 
707
	pop edi
708
	ret
709
;==========================================================
710
;=== обработка мыши =======================================
711
;==========================================================
712
.mouse:
713
pusha
714
;----------------------------------------------------------
715
;--- получаем состояние кнопок мыши -----------------------
716
;----------------------------------------------------------
717
	mov	eax,37
718
	mov	ebx,2
719
	int	0x40
720
;----------------------------------------------------------
721
;--- проверяем состояние ----------------------------------
722
;----------------------------------------------------------
723
	test	eax,1
724
	jnz	.mouse_left_button
725
@@:     popa
726
	ret
727
 
728
.mouse_left_button:
729
;----------------------------------------------------------
730
;--- получаем координаты мыши -----------------------------
731
;----------------------------------------------------------
732
	mov	eax,37
733
	xor	ebx,ebx
734
	inc	ebx
735
	int	0x40
736
;----------------------------------------------------------
737
;--- проверяем, попадает ли курсор в edit box -------------
738
;----------------------------------------------------------
739
	mov	ebx,ed_top
740
	cmp	ax,bx
741
	jl	._blur;.mouse_end_no_focus
742
 
743
	add	bx,ed_height
744
	cmp	ax,bx
745
	jg	._blur;.mouse_end_no_focus
746
 
747
	shr	eax,16
748
 
749
	mov	bx,ed_left
750
	cmp	ax,bx
751
	jl	._blur;.mouse_end_no_focus
752
 
753
	add	bx,ed_width
754
	cmp	ax,bx
755
	jg	._blur;.mouse_end_no_focus
756
;--- изменяем позицию курсора ---
757
	push	eax
758
	call	.clear_cursor
759
	pop	eax
760
	xor	dx,dx
761
	sub	ax,ed_left
762
	add	ax,2
763
	mov	bx,6
764
	div	bx
765
	add	ax,ed_offset
766
	cmp	ax,ed_size
767
	jna	 @f
768
	mov	ax,ed_size
769
@@:
770
	mov	ed_pos,ax
771
	call	.check_offset
772
	call	.draw_cursor
773
	call	.focus
774
 
775
.mouse_pressed:
776
popa
777
ret
778
;.mouse_end_no_focus:
779
;        call    .blur
780
;popa
781
;ret
782
;----------------------------------------------------------
783
;--- процедура установки фокуса ---------------------------
784
;----------------------------------------------------------
785
.blur:
786
pusha
787
._blur:
282 Lrz 788
	btr	dword ed_flags,1
234 Lrz 789
	jnc	@f
790
	call	.clear_cursor
791
	jmp	.blur_end
792
.focus:
793
pusha
282 Lrz 794
	bts	dword ed_flags,1
234 Lrz 795
	jc	@f
796
	call	.draw_cursor
797
.blur_end:
798
	call	.draw_border
799
@@:
800
popa
801
ret
802
 
803
;----------------------------------------------------------
804
;--- процедура размывания фокуса --------------------------
805
;----------------------------------------------------------
806
;.blur:
807
;pusha
808
;._blur:
809
	;btr     ed_flags,1
810
	;jnc     @f
811
	;call    .draw_border
812
	;call    .clear_cursor
813
;@@:
814
;popa
815
;ret
816
}
817
ed_figure_only=1000000000000000b
818
ed_focus=10b
282 Lrz 819
ed_shift_on=1000b
820
ed_shift=100b
290 Lrz 821
ed_shift_cl=1111111111110011b
234 Lrz 822
macro draw_edit_boxes start,end
823
{
824
	mov	edi,start
825
	mov	ecx,((end-start)/ed_struc_size)
826
@@:
827
	call	edit_box.draw
828
	add	edi,ed_struc_size
829
	loop	@b
830
}
831
 
832
macro mouse_edit_boxes start,end
833
{
834
	mov	edi,start
835
	mov	ecx,((end-start)/ed_struc_size)
836
@@:
837
	call	edit_box.mouse
838
	add	edi,ed_struc_size
839
	loop	@b
840
}
841
 
842
macro key_edit_boxes start,end
843
{
844
	mov	edi,start
845
	mov	ecx,((end-start)/ed_struc_size)
846
@@:
847
	call	edit_box.key
848
	add	edi,ed_struc_size
849
	loop	@b
850
}
282 Lrz 851
ed_struc_size=64
234 Lrz 852
struc  edit_box width,left,top,color,focus_border_color,\
853
       blur_border_color,text_color,max,text,flags,size
854
{
855
.width dd width
856
.left dd left
857
.top dd top
858
.color dd color
859
.focus_border_color dd focus_border_color
860
.blur_border_color dd blur_border_color
861
.text_color dd text_color
862
.max dd max
282 Lrz 863
.text dd text
864
.flags dw flags+0
234 Lrz 865
.size dd size+0
866
.pos dd 0
867
.offset dd 0
868
.cl_curs_x dd 0
869
.cl_curs_y dd 0
870
.insert	   dw 0
282 Lrz 871
.shift	   dd 0
234 Lrz 872
}
873
 
874
macro edit_boxes_set_sys_color start,end,color_table
875
{
876
	mov	edi,start
877
	mov	ecx,((end-start)/ed_struc_size)
878
	mov	esi,color_table
879
@@:
880
	mov	eax,[esi+36]
881
	mov	ebx,[esi+20]
882
	mov	ed_focus_border_color,eax
883
	shr	bh,1
884
	shr	bl,1
885
	shr	ah,1
886
	shr	al,1
887
	add	ah,bh
888
	add	al,bl
889
	ror	eax,16
890
	ror	ebx,16
891
	shr	bl,1
892
	shr	al,1
893
	add	al,bl
894
	ror	eax,16
895
	mov	ed_blur_border_color,eax
896
	add	edi,ed_struc_size
897
	loop	@b
898
}