Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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