Subversion Repositories Kolibri OS

Rev

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

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