Subversion Repositories Kolibri OS

Rev

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

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