Subversion Repositories Kolibri OS

Rev

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

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