Subversion Repositories Kolibri OS

Rev

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