Subversion Repositories Kolibri OS

Rev

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

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