Subversion Repositories Kolibri OS

Rev

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

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