Subversion Repositories Kolibri OS

Rev

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