Subversion Repositories Kolibri OS

Rev

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