Subversion Repositories Kolibri OS

Rev

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

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