Subversion Repositories Kolibri OS

Rev

Rev 348 | 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
350 Lrz 74
ed_insert=100000b
75
ed_insert_cl=1111111111011111b
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:
350 Lrz 282
pusha
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
350 Lrz 347
popa
295 Lrz 348
	ret
349
 
350
@@:
351
	mov	dword [esp+28],0
350 Lrz 352
popa
295 Lrz 353
	ret
354
;==========================================================
355
;=== обработка клавиатуры =================================
356
;==========================================================
357
.key:
358
pusha
359
	test	word ed_flags,ed_focus ; если не в фокусе, выходим
350 Lrz 360
	je      @b
295 Lrz 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
350 Lrz 413
 
292 Lrz 414
	push	eax
415
	mov	edx,ed_size
416
	mov	ecx,ed_pos
350 Lrz 417
	pusha
418
 
419
	cmp	edx,ecx
420
	jne	.sh_cl
343 Lrz 421
;clear
348 Lrz 422
	mov	ebp,ed_color
423
        call	.sh_cl_
350 Lrz 424
        jmp	.sh_nxt
425
.sh_cl: mov	ebp,edx ;ed_size
426
        call	.clear_bg
427
 
428
.sh_nxt: popa
429
	call	.del_char
430
 
292 Lrz 431
;;;;
432
        mov	eax,ed_shift_pos
433
        mov	ebx,ed_size
434
	sub	ebx,eax
435
	mov	ed_size,ebx
436
	pop	eax
437
 
438
        ; проверяем, находится ли курсор в конце
439
@@:	mov	ecx,ed_size
234 Lrz 440
	mov	edx, ed_max
343 Lrz 441
	test	word ed_flags,ed_insert
442
	jne	@f
289 Lrz 443
	cmp	ecx,edx
444
	jae	.no_figure
343 Lrz 445
@@:	mov	ebx, ed_pos
234 Lrz 446
	cmp	ebx,edx
447
	jl	@f ; если меньше или равно
448
.no_figure:
449
	popa
450
	ret
292 Lrz 451
.insert: test	word ed_flags,ed_insert	;not 	word ed_insert
452
         je     .insert_1
453
         and	word ed_flags,ed_insert_cl
454
	jmp	.no_figure
455
.insert_1:
456
	or	word ed_flags,ed_insert
234 Lrz 457
        jmp	.no_figure
292 Lrz 458
.ins_v:
306 Lrz 459
	dec	dword [ebp+38];ed_size    ;processing is insert
234 Lrz 460
	sub	esi,ecx
461
	add	esi,ebx
462
        mov	edi,esi
343 Lrz 463
;clear
464
pusha
465
	mov	edi,ebp
466
	mov	ebp,ed_pos
467
	call	.clear_bg
468
popa
234 Lrz 469
	jmp	.In_k
470
@@:     ; сдвигаем символы после курсора вправо
471
	mov	ecx,ed_size
472
	push	edi eax
292 Lrz 473
	mov	ebp,edi
234 Lrz 474
	mov	esi,ed_text     ; Указатель на буфер
475
				;Будем работать со строкой
476
	add	esi,ecx		;add ed_size добавим max size
477
	mov	edi,esi
478
 
479
       	cmp 	ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
480
	je	.In_k
481
 
292 Lrz 482
	test	word [ebp+36],ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
483
	jne	.ins_v
343 Lrz 484
;clear
485
pusha
486
	mov	edi,ebp
487
	mov	ebp,ed_size
488
	call	.clear_bg
489
popa
292 Lrz 490
 
343 Lrz 491
 
234 Lrz 492
	sub	ecx,ebx         ;Найдем кол-во символов для передвижения.
493
	inc	edi		;Сместим наши символы в право
494
	std
495
	inc 	ecx
496
   @@:
497
	;--------
498
	lodsb
499
	stosb
500
	;--------
501
	loop	@b
502
.In_k:	cld
503
	pop eax
504
	mov al,ah
505
	stosb
506
	pop edi
507
; вставляем код клавиши туда, где курсор
508
	; увеличиваем значение размера и позиции
509
	inc	 dword ed_size
295 Lrz 510
	inc	 dword ed_pos
234 Lrz 511
	call	.draw_all2
295 Lrz 512
	jmp	.shift;.draw_cursor_text
234 Lrz 513
.delete:
514
	mov	edx,ed_size
515
	mov	ecx,ed_pos
516
	cmp	edx,ecx
292 Lrz 517
	jg	.bac_del
289 Lrz 518
	test	word ed_flags,ed_shift_on
519
	jne	.del_bac
234 Lrz 520
	popa
521
	ret
289 Lrz 522
.bac_del:
292 Lrz 523
	call 	.del_char
234 Lrz 524
	jmp 	.draw_all
525
 
526
;--- нажата клавиша backspace ---
527
.backspace:
528
	; проверяем, курсор у левого края ?
529
	mov	edx,ed_size
530
	mov	ecx,ed_pos
531
	test	ecx,ecx
292 Lrz 532
	jnz	.del_bac
289 Lrz 533
        test	word ed_flags,ed_shift_on
534
        jne	.bac_del
234 Lrz 535
	popa
536
	ret
289 Lrz 537
.del_bac:
292 Lrz 538
	cmp	edx,ecx	;if ed_pos=ed_size
234 Lrz 539
	je	@f
540
	dec	ecx
541
	call 	.del_char
289 Lrz 542
@@:     test	word ed_flags,ed_shift_on
543
        jne	.bac_del
234 Lrz 544
	dec	 dword ed_pos
545
 
546
.draw_all:
343 Lrz 547
       	push	.shift;.draw_cursor_text;eax
289 Lrz 548
 
549
        test	word ed_flags,ed_shift_on
550
        je	@f
551
        mov	eax,ed_shift_pos
552
        mov	ebx,ed_size
553
	sub	ebx,eax
554
	mov	ed_size,ebx
555
 
343 Lrz 556
	call	.clear_cursor
557
	call	.check_offset
558
        call	.draw_bg
559
 
560
	ret
561
 
289 Lrz 562
@@:	dec	 dword ed_size
563
 
234 Lrz 564
.draw_all2:
290 Lrz 565
	and    word ed_flags,ed_shift_cl
234 Lrz 566
	call	.clear_cursor
567
	call	.check_offset
343 Lrz 568
	mov	ebp,ed_size
569
	call	.clear_bg
295 Lrz 570
	ret
343 Lrz 571
	;jmp	.shift
234 Lrz 572
;--- нажата клавиша left ---
289 Lrz 573
.left:  call	.sh_enable
574
	mov	ebx,ed_pos
234 Lrz 575
	test	ebx,ebx
576
	jz	.nd_k
577
	call	.clear_cursor
578
	dec	 dword ed_pos
579
	jmp	.nd_k
580
;--- нажата клавиша right ---
289 Lrz 581
.right: call	.sh_enable
582
	mov	ebx,ed_pos
234 Lrz 583
	cmp	ebx,ed_size
584
	je	.nd_k
585
	call	.clear_cursor
586
	inc	dword  ed_pos
587
	jmp	.nd_k
289 Lrz 588
.home:  call	.sh_enable
589
	mov	ebx,ed_pos
234 Lrz 590
	test	ebx,ebx
591
	jz	.nd_k
592
	call	.clear_cursor
593
	xor	eax,eax
594
	mov	ed_pos,eax
595
	jmp	.nd_k
596
 
289 Lrz 597
.end:   call	.sh_enable
598
	mov	ebx,ed_pos
234 Lrz 599
	cmp	ebx,dword ed_size
292 Lrz 600
	je	.nd_k
234 Lrz 601
	call	.clear_cursor
602
	mov	eax,ed_size
603
	mov	ed_pos,eax
604
.nd_k:	call	.check_offset
282 Lrz 605
	;test	eax,eax
606
	;jz	.draw_bg_cursor_text
234 Lrz 607
	call	.draw_cursor
282 Lrz 608
 
348 Lrz 609
.shift: ;;;;;;;SHIFT
610
	test      word ed_flags,ed_shift
611
        je	.f_exit
343 Lrz 612
 
348 Lrz 613
	mov	ebp,shift_color
614
	call	.sh_cl_
615
        jmp	.draw_cursor_text
616
;;;;;;;;;;;;;;;;;;;;;
343 Lrz 617
 
348 Lrz 618
.f_exit: and    word ed_flags,ed_shift_cl
619
        call	.enable_null
620
	jmp	.draw_cursor_text
343 Lrz 621
 
348 Lrz 622
.sh_cl_:
282 Lrz 623
;;;;;;SHIFT end
348 Lrz 624
;для обработки снятия выделения
625
	or	word ed_flags,ed_shift_bac
282 Lrz 626
	mov 	eax,dword	ed_pos
627
	mov	ebx,dword	ed_shift_pos
628
	cmp	eax,ebx
629
	jae	.sh_n
630
	push	eax  ;меньшее в eax
631
	push	ebx  ;большее
632
	jmp	.sh_n1
633
	             ;если иначе
634
.sh_n: 	push	ebx
635
	push	eax
636
.sh_n1:
637
	call	.check_offset
638
	call	.get_n
639
	mov	edx,eax	;size of ed_box
640
;	push	eax
641
	mov	ecx,ed_offset
642
	add	eax,ecx	;eax = w_off= ed_offset+width
348 Lrz 643
	mov	edx,eax ;save
282 Lrz 644
	pop	ebx     ;большее
645
	pop	eax     ;меньшее
646
 
647
 
648
	cmp	eax,ecx         ;сравнение с меньшего с offset.
649
	jae	.f_f            ;если больше
650
	xor	eax,eax
348 Lrz 651
	cmp	edx,ebx		;cравним размер w_off с большим
282 Lrz 652
	jb	@f
653
	sub	ebx,ecx
654
	jmp     .nxt_f
348 Lrz 655
@@:	mov	ebx,edx
282 Lrz 656
	sub	ebx,ecx
657
	jmp     .nxt_f
658
 
659
.f_f:
660
	sub	eax,ecx
348 Lrz 661
	cmp	edx,ebx		;cравним размер w_off с большим
282 Lrz 662
	jle	@f
663
	sub	ebx,ecx
664
	sub	ebx,eax
665
	jmp     .nxt_f
234 Lrz 666
@@:
348 Lrz 667
	mov	ebx,edx
282 Lrz 668
	sub	ebx,ecx
669
	sub	ebx,eax
670
.nxt_f:
289 Lrz 671
	mov	edx,ebx
282 Lrz 672
	lea	ebx,[eax*2+eax]
673
	shl	ebx,1
674
	add	ebx,ed_left
675
	inc	ebx
676
	shl	ebx,16
677
	lea	ecx,[edx*2+edx]
678
	shl	ecx,1
679
	mov	bx,cx
348 Lrz 680
 
681
	mov	edx,ebp;shift_color
682
 
282 Lrz 683
	call	.draw_bg_eax
684
	and    word ed_flags,1111111111111011b
343 Lrz 685
	call	.enable_null
348 Lrz 686
	ret
282 Lrz 687
 
289 Lrz 688
 
292 Lrz 689
;проверка состояния shift был ли он нажат раньше?
289 Lrz 690
.sh_enable:
691
	test    word ed_flags,ed_shift
692
	je	@f
693
	test	word ed_flags,ed_shift_on
292 Lrz 694
	jne	.sh_ext_en
289 Lrz 695
       	push	dword ed_pos
696
	pop	dword ed_shift_pos
697
	or	word ed_flags,ed_shift_on
292 Lrz 698
	ret
289 Lrz 699
 
348 Lrz 700
@@:     test    word ed_flags,ed_shift_bac
701
        je      @f
702
	mov	ebp,ed_color
703
	call	.sh_cl_  ;очистка выделеного фрагмента
704
@@:	and	word ed_flags,ed_shift_cl
705
;	ret
706
.sh_ext_en:
343 Lrz 707
        	ret
708
;функция внесения 0 по адресу ed_size+1
709
.enable_null:
710
        pusha
711
        mov	eax,ed_size
712
	mov	ebx,ed_text
713
	add	eax,ebx
714
	inc	eax
715
	xor	ebx,ebx
716
	mov 	[eax],bl
717
	popa
718
	ret
719
 
234 Lrz 720
        ;- удаление символа
289 Lrz 721
	;Входные данные edx=ed_size;ecx=ed_pos
234 Lrz 722
.del_char:
723
	mov     esi,ed_text
289 Lrz 724
        test	word ed_flags,ed_shift_on
725
        je	@f
726
	mov	eax,dword ed_shift_pos
727
	mov	ebx,esi
728
        cmp	eax,ecx
729
	jae	.dh_n
730
 
731
	mov	ed_pos,eax	;что бы не было убегания курсора
732
	mov	ebp,ecx
733
	sub	ebp,eax
734
	add	ebx,eax  ;eax меньше
735
	sub	edx,ecx
234 Lrz 736
	add	esi,ecx
737
 
289 Lrz 738
 
739
	mov	ed_shift_pos,ebp
740
        jmp	.del_ch_sh
741
	             ;если иначе
742
.dh_n:
743
	mov	ebp,eax
744
	sub	ebp,ecx
745
	add	ebx,ecx
746
	sub	edx,eax
747
	add	esi,eax
748
	mov	ed_shift_pos,ebp
749
	jmp	.del_ch_sh
750
 
751
@@:	add	esi,ecx ;указатель + смещение к реальному буфферу
234 Lrz 752
	mov	ebx,esi
753
	inc 	esi
754
	cld
755
 
756
	sub	edx,ecx
289 Lrz 757
.del_ch_sh:
758
 
234 Lrz 759
	push 	edi
760
	mov 	edi,ebx
761
@@:
762
	lodsb
763
	stosb
289 Lrz 764
	dec edx
234 Lrz 765
	jns @b
766
 
767
	pop edi
768
	ret
343 Lrz 769
 
770
;вычислить закрашиваемую область
771
;соглашение в ebp - передается ed_size
772
.clear_bg:
773
	call	.get_n  ;получить размер в символах ширины компонента
774
	push	eax
775
	mov	ebx,ed_offset
776
	add	eax,ebx	;eax = w_off= ed_offset+width
777
	mov	ebx,ebp ;ed_size
778
 
779
	cmp	eax,ebx
780
	jb	@f
781
	mov	eax,ed_pos
782
	sub	ebx,eax
783
	mov	ecx,ed_offset
784
	sub	eax,ecx
785
	jmp	.nxt
786
@@:	mov	ebx,ed_pos
787
	push	ebx
788
	sub	eax,ebx
789
	mov	ebx,eax	;It is don't optimal
790
 
791
	pop	eax	;ed_pos
792
       	mov	ecx,ed_offset
793
	sub	eax,ecx
794
 
795
.nxt:
796
	mov	ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
797
	add	ebp,ebx
798
	pop	edx
799
	cmp	ebp,edx
800
	je	@f
801
	inc	ebx
802
 
803
@@:     mov	edx,ebx
804
	lea	ebx,[eax*2+eax]
805
	shl	ebx,1
806
	add	ebx,ed_left
807
	inc	ebx
808
	shl	ebx,16
809
	lea	ecx,[edx*2+edx]
810
	shl	ecx,1
811
	mov	bx,cx
812
	mov	edx,ed_color
813
	call	.draw_bg_eax
814
	ret
815
 
816
 
234 Lrz 817
;==========================================================
818
;=== обработка мыши =======================================
819
;==========================================================
820
.mouse:
821
pusha
822
;----------------------------------------------------------
823
;--- получаем состояние кнопок мыши -----------------------
824
;----------------------------------------------------------
825
	mov	eax,37
826
	mov	ebx,2
827
	int	0x40
828
;----------------------------------------------------------
829
;--- проверяем состояние ----------------------------------
830
;----------------------------------------------------------
831
	test	eax,1
832
	jnz	.mouse_left_button
348 Lrz 833
	popa
234 Lrz 834
	ret
835
 
836
.mouse_left_button:
837
;----------------------------------------------------------
838
;--- получаем координаты мыши -----------------------------
839
;----------------------------------------------------------
840
	mov	eax,37
841
	xor	ebx,ebx
842
	inc	ebx
843
	int	0x40
844
;----------------------------------------------------------
845
;--- проверяем, попадает ли курсор в edit box -------------
846
;----------------------------------------------------------
847
	mov	ebx,ed_top
848
	cmp	ax,bx
849
	jl	._blur;.mouse_end_no_focus
850
 
851
	add	bx,ed_height
852
	cmp	ax,bx
853
	jg	._blur;.mouse_end_no_focus
854
 
855
	shr	eax,16
856
 
857
	mov	bx,ed_left
858
	cmp	ax,bx
859
	jl	._blur;.mouse_end_no_focus
860
 
861
	add	bx,ed_width
862
	cmp	ax,bx
863
	jg	._blur;.mouse_end_no_focus
864
;--- изменяем позицию курсора ---
865
	push	eax
866
	call	.clear_cursor
867
	pop	eax
868
	xor	dx,dx
869
	sub	ax,ed_left
870
	add	ax,2
871
	mov	bx,6
872
	div	bx
873
	add	ax,ed_offset
874
	cmp	ax,ed_size
875
	jna	 @f
876
	mov	ax,ed_size
877
@@:
878
	mov	ed_pos,ax
879
	call	.check_offset
880
	call	.draw_cursor
292 Lrz 881
;----------------------------------------------------------
882
;--- процедура установки фокуса ---------------------------
883
;----------------------------------------------------------
884
	bts	word ed_flags,1
348 Lrz 885
	jc	@f
292 Lrz 886
	call	.draw_cursor
348 Lrz 887
	jmp	.drc
888
 
889
 
234 Lrz 890
._blur:
306 Lrz 891
	test	word ed_flags,ed_always_focus
892
	jne	@f
292 Lrz 893
	btr	word ed_flags,1 ; если не в фокусе, выходим
894
	jnc     @f
234 Lrz 895
	call	.clear_cursor
348 Lrz 896
.drc:	call	.draw_border
234 Lrz 897
@@:
898
popa
899
ret
900
 
901
;----------------------------------------------------------
902
;--- процедура размывания фокуса --------------------------
903
;----------------------------------------------------------
904
;.blur:
905
;pusha
906
;._blur:
907
	;btr     ed_flags,1
908
	;jnc     @f
909
	;call    .draw_border
910
	;call    .clear_cursor
911
;@@:
912
;popa
913
;ret
914
}
915
ed_figure_only=1000000000000000b
306 Lrz 916
ed_always_focus=100000000000000b
234 Lrz 917
ed_focus=10b
282 Lrz 918
ed_shift_on=1000b
919
ed_shift=100b
348 Lrz 920
ed_shift_bac=10000b
921
ed_shift_cl=1111111111100011b
234 Lrz 922
macro draw_edit_boxes start,end
923
{
924
	mov	edi,start
925
	mov	ecx,((end-start)/ed_struc_size)
926
@@:
927
	call	edit_box.draw
928
	add	edi,ed_struc_size
929
	loop	@b
930
}
931
 
932
macro mouse_edit_boxes start,end
933
{
934
	mov	edi,start
935
	mov	ecx,((end-start)/ed_struc_size)
936
@@:
937
	call	edit_box.mouse
938
	add	edi,ed_struc_size
939
	loop	@b
940
}
941
 
942
macro key_edit_boxes start,end
943
{
944
	mov	edi,start
945
	mov	ecx,((end-start)/ed_struc_size)
946
@@:
947
	call	edit_box.key
948
	add	edi,ed_struc_size
949
	loop	@b
950
}
292 Lrz 951
ed_struc_size=62
234 Lrz 952
struc  edit_box width,left,top,color,focus_border_color,\
953
       blur_border_color,text_color,max,text,flags,size
954
{
955
.width dd width
956
.left dd left
957
.top dd top
958
.color dd color
959
.focus_border_color dd focus_border_color
960
.blur_border_color dd blur_border_color
961
.text_color dd text_color
962
.max dd max
282 Lrz 963
.text dd text
964
.flags dw flags+0
234 Lrz 965
.size dd size+0
966
.pos dd 0
967
.offset dd 0
968
.cl_curs_x dd 0
969
.cl_curs_y dd 0
282 Lrz 970
.shift	   dd 0
234 Lrz 971
}
972
 
973
macro edit_boxes_set_sys_color start,end,color_table
974
{
975
	mov	edi,start
976
	mov	ecx,((end-start)/ed_struc_size)
977
	mov	esi,color_table
978
@@:
979
	mov	eax,[esi+36]
980
	mov	ebx,[esi+20]
981
	mov	ed_focus_border_color,eax
982
	shr	bh,1
983
	shr	bl,1
984
	shr	ah,1
985
	shr	al,1
986
	add	ah,bh
987
	add	al,bl
988
	ror	eax,16
989
	ror	ebx,16
990
	shr	bl,1
991
	shr	al,1
992
	add	al,bl
993
	ror	eax,16
994
	mov	ed_blur_border_color,eax
995
	add	edi,ed_struc_size
996
	loop	@b
306 Lrz 997
}
998
 
999
macro draw_edit_box ed_ptr
1000
{
1001
        mov     edi,ed_ptr
1002
        call    edit_box.draw
1003
}
1004
 
1005
macro mouse_edit_box ed_ptr
1006
{
1007
        mov     edi,ed_ptr
1008
        call    edit_box.mouse
1009
}
1010
 
1011
macro key_edit_box ed_ptr
1012
{
1013
        mov     edi,ed_ptr
1014
        call    edit_box.key
234 Lrz 1015
}