Subversion Repositories Kolibri OS

Rev

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

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