Subversion Repositories Kolibri OS

Rev

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

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