Subversion Repositories Kolibri OS

Rev

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