Subversion Repositories Kolibri OS

Rev

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

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