Subversion Repositories Kolibri OS

Rev

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

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