Subversion Repositories Kolibri OS

Rev

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

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