Subversion Repositories Kolibri OS

Rev

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

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