Subversion Repositories Kolibri OS

Rev

Rev 6965 | Rev 6994 | 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:
423
        push    dword 'X'  ; this value need below to determine which action is used
424
        jmp     edit_box_key.ctrl_c.pushed
425
 
6788 IgorA 426
edit_box_key.ctrl_c:
6968 0CodErr 427
        push    dword 'C'  ; this value need below to determine which action is used
428
.pushed:
6788 IgorA 429
; add memory area
430
        mov     ecx,ed_size
431
        add     ecx,3*4
432
        mcall   SF_SYS_MISC,SSF_MEM_ALLOC
433
; building the clipboard slot header
434
        xor     ecx,ecx
435
        mov     [eax+4],ecx ; type 'text'
436
        inc     ecx
437
        mov     [eax+8],ecx ; cp866 text encoding
6965 0CodErr 438
        mov     ecx,ed_pos
439
        movzx   ebx,word ed_shift_pos
440
        sub     ecx,ebx
441
.abs: ; make ecx = abs(ecx)
442
	       neg     ecx
443
	       jl	     .abs
6788 IgorA 444
        add     ecx,3*4
445
        mov     [eax],ecx
6965 0CodErr 446
        sub     ecx,3*4
447
        mov     edx,ed_pos
448
        movzx   ebx,word ed_shift_pos
449
        cmp     edx,ebx
450
        jle     @f
451
        mov     edx,ebx
452
@@:
6788 IgorA 453
; copy data
454
        mov     esi,ed_text
6965 0CodErr 455
        add     esi,edx
6788 IgorA 456
        push    edi
457
        mov     edi,eax
458
        add     edi,3*4
459
        cld
460
        rep     movsb
461
        pop     edi
462
; put slot to the kernel clipboard
463
        mov     edx,eax
464
        mov     ecx,[edx]
465
        push    eax
466
        mcall   SF_CLIPBOARD,SSF_WRITE_CB
467
        pop     ecx
468
; remove unnecessary memory area
469
        mcall   SF_SYS_MISC,SSF_MEM_FREE
470
.exit:
6968 0CodErr 471
        pop     eax        ; determine current action (ctrl+X or ctrl+C)
472
        cmp     eax, 'X'
473
        je      edit_box_key.delete
6788 IgorA 474
        jmp     edit_box.editbox_exit
475
 
476
edit_box_key.ctrl_v:
477
        mcall   SF_CLIPBOARD,SSF_GET_SLOT_COUNT
478
; no slots of clipboard ?
479
        test    eax,eax
480
        jz      .exit
481
; main list area not found ?
482
        inc     eax
483
        test    eax,eax
484
        jz      .exit
485
        sub     eax,2
486
        mov     ecx,eax
487
        mcall   SF_CLIPBOARD,SSF_READ_CB
488
; main list area not found ?
489
        inc     eax
490
        test    eax,eax
491
        jz      .exit
492
; error ?
493
        sub     eax,2
494
        test    eax,eax
495
        jz      .exit
496
        inc     eax
497
; check contents of container
498
        mov     ebx,[eax+4]
499
; check for text
500
        test    ebx,ebx
501
        jnz     .no_valid_text
502
        mov     ebx,[eax+8]
503
; check for cp866
504
        cmp     bl,1
505
        jnz     .no_valid_text
506
        mov     ecx,[eax]
507
        sub     ecx,3*4
6965 0CodErr 508
; in ecx size of string to insert
509
        add     ecx,ed_size
510
        mov     edx,ed_max
511
        sub     edx,2 ; 2 reserved for edit_box
512
        cmp     ecx,edx
6788 IgorA 513
        jb      @f
6965 0CodErr 514
        mov     ecx,edx
6788 IgorA 515
@@:
516
        mov     esi,eax
517
        add     esi,3*4
6965 0CodErr 518
        push    eax edi
519
;---------------------------------------;
6788 IgorA 520
        mov     ed_size,ecx
6965 0CodErr 521
        inc     ecx
522
        mcall   SF_SYS_MISC,SSF_MEM_ALLOC
523
        push    eax ; save mem pointer
524
 
525
        mov     edx, ed_max
526
        sub     edx, 3 ; +1 for StrInsert, +2 as reserved for edit_box
527
 
528
        push   dword ed_text ; Dst
529
        push   esi           ; Src
530
        push   dword ed_pos  ; Pos in Dst
531
        push   edx           ; DstMax
532
        push   eax           ; TmpBuf
533
        call   StrInsert
534
 
535
        pop    eax ; restore mem pointer
536
        mcall   SF_SYS_MISC,SSF_MEM_FREE
537
;---------------------------------------;
538
;        mov     edi,ed_text
539
;        cld
540
;@@:
541
;        lodsb
542
;        cmp     al,0x0d ; EOS (end of string)
543
;        je      .replace
544
;        cmp     al,0x0a ; EOS (end of string)
545
;        jne     .continue
546
;.replace:
547
;        mov     al,0x20 ; space
548
;.continue:
549
;        stosb
550
;        dec     ecx
551
;        jnz     @b
6788 IgorA 552
        pop     edi eax
553
.no_valid_text:
554
; remove unnecessary memory area
555
        mov     ecx,eax
556
        mcall   SF_SYS_MISC,SSF_MEM_FREE
557
.exit:
558
        jmp     edit_box.draw_bg_cursor_text
559
 
1032 Lrz 560
;==========================================================
561
;=== обработка мыши =======================================
562
;==========================================================
563
;save for stdcall ebx,esi,edi,ebp
6788 IgorA 564
align 16
1032 Lrz 565
edit_box_mouse:
6675 pathoswith 566
        pushad
567
        mov     edi,[esp+36]
5679 hidnplayr 568
        test    word ed_flags,ed_disabled
569
        jnz     edit_box.editbox_exit
6788 IgorA 570
 
1032 Lrz 571
;----------------------------------------------------------
572
;--- получаем состояние кнопок мыши -----------------------
573
;----------------------------------------------------------
6788 IgorA 574
        mcall   SF_MOUSE_GET,SSF_BUTTON
1032 Lrz 575
;----------------------------------------------------------
576
;--- проверяем состояние ----------------------------------
577
;----------------------------------------------------------
578
        test    eax,1
579
        jnz     edit_box_mouse.mouse_left_button
580
        and     word ed_flags,ed_mouse_on_off
6675 pathoswith 581
        mov     ebx,ed_mouse_variable
5679 hidnplayr 582
        push    0
583
        pop     dword [ebx]
1032 Lrz 584
        jmp     edit_box.editbox_exit
6675 pathoswith 585
 
1032 Lrz 586
.mouse_left_button:
587
;----------------------------------------------------------
588
;--- блокировка от фокусировки в других боксах при попадании на них курсора
589
;----------------------------------------------------------
6675 pathoswith 590
        mov     eax,ed_mouse_variable
5679 hidnplayr 591
        push    dword [eax]
592
        pop     eax
1032 Lrz 593
        test    eax,eax
594
        jz      @f
595
        cmp     eax,edi
596
        je      @f
597
        jmp     edit_box_mouse._blur
598
;----------------------------------------------------------
599
;--- получаем координаты мыши относительно 0 т.е всей области экрана
600
;----------------------------------------------------------
6788 IgorA 601
@@:
602
        mcall   SF_MOUSE_GET,SSF_WINDOW_POSITION
1032 Lrz 603
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
604
;Функция обработки  мышки получение координат и проверка их + выделения
605
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6788 IgorA 606
; Не удерживаем ли мы клавишу мышки, перемещая курсор?
607
        test    word ed_flags,ed_mouse_on
608
        jne     edit_box_mouse.mouse_wigwag
609
; проверяем, попадает ли курсор в edit box
610
        mov     ebx,ed_top
611
        cmp     ax,bx
612
        jl      edit_box_mouse._blur
613
        add     ebx,ed_height
614
        cmp     ax,bx
615
        jg      edit_box_mouse._blur
616
        shr     eax,16
617
        mov     ebx,ed_left
618
        cmp     ax,bx
619
        jl      edit_box_mouse._blur
620
        add     ebx,ed_width
621
        cmp     ax,bx
622
        jg      edit_box_mouse._blur
623
; изменяем позицию курсора
624
        push    eax
625
        mov     ebp,ed_color
626
        call    edit_box.clear_cursor
627
        pop     eax
628
edit_box_mouse._mvpos:
629
        xor     edx,edx
630
        sub     eax,ed_left
631
        div     word ed_char_width
632
        add     eax,ed_offset
633
        cmp     eax,ed_size
634
        jna     edit_box_mouse._mshift
635
        mov     eax,ed_size
636
edit_box_mouse._mshift:
637
; секция обработки shift и выделения по shift
638
        test    word ed_flags,ed_shift_bac
639
        je      @f
640
        mov     ebp,ed_color
641
        movzx   ebx, word ed_shift_pos
642
        push    eax
643
        call    edit_box_key.sh_cl_
644
        and     word ed_flags,ed_shift_bac_cl
645
        pop     eax
646
@@:
647
        test    word ed_flags,ed_mouse_on
648
        jne     @f
649
        mov     ed_shift_pos,ax
650
        or      word  ed_flags,ed_mouse_on
651
        mov     ed_pos,eax
652
        mov     ebx,ed_mouse_variable
653
        push    edi
654
        pop     dword [ebx]
655
        bts     word ed_flags,1
656
        call    edit_box.draw_bg
657
        jmp     edit_box_mouse.m_sh
658
 
659
@@:     cmp     ax,ed_shift_pos
660
        je      edit_box.editbox_exit
661
        mov     ed_pos,eax
662
        call    edit_box.draw_bg
663
        mov     ebp,shift_color
664
        movzx   ebx, word ed_shift_pos
665
        call    edit_box_key.sh_cl_
666
        or      word ed_flags,ed_mous_adn_b
667
edit_box_mouse.m_sh:
668
        call    edit_box.draw_text
669
        call    edit_box.draw_cursor
670
; процедура установки фокуса
671
        jmp     edit_box_mouse.drc
672
 
673
edit_box_mouse._blur:
674
        test    word ed_flags,ed_always_focus
675
        jne     edit_box.editbox_exit
676
        btr     word ed_flags,1 ; если не в фокусе, выходим
677
        jnc     edit_box.editbox_exit
678
        mov     ebp,ed_color
679
        call    edit_box.clear_cursor
680
edit_box_mouse.drc:
681
        call    edit_box.draw_border
682
        jmp     edit_box.editbox_exit
683
 
1032 Lrz 684
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
685
;Общие функции обработки
686
;----------------------------------------------------------
5692 leency 687
;--- процедура прорисовки выделенной части ----------------
1032 Lrz 688
;----------------------------------------------------------
689
edit_box.draw_shift:
690
        test    word ed_flags,ed_shift_bac ;установка флага, выделенной области
691
        jz      @f
692
        mov     ebp,shift_color
6705 0CodErr 693
        movzx   ebx, word ed_shift_pos
1032 Lrz 694
        call    edit_box_key.sh_cl_
695
@@:     ret
696
;----------------------------------------------------------
697
;--- процедура прорисовки текста --------------------------
698
;----------------------------------------------------------
699
edit_box.draw_text:
700
        call    edit_box.get_n
701
        mov     esi,ed_size
6675 pathoswith 702
        sub     esi,ed_offset
1032 Lrz 703
        cmp     eax,esi
6675 pathoswith 704
        jae     @f
5692 leency 705
        mov     esi,eax
6675 pathoswith 706
@@:
707
        test    esi,esi
708
        jz      @f
6788 IgorA 709
        mov     eax,SF_DRAW_TEXT
1032 Lrz 710
        mov     ebx,ed_left
711
        add     ebx,2
712
        shl     ebx,16
713
        add     ebx,ed_top
6677 pathoswith 714
        add     ebx,3
1032 Lrz 715
        mov     ecx,ed_text_color
6675 pathoswith 716
        test    dword ed_flags,ed_pass
717
        jnz     .password
718
        mov     edx,ed_text
719
        add     edx,ed_offset
1032 Lrz 720
        mcall
6675 pathoswith 721
@@:
5692 leency 722
        ret
6675 pathoswith 723
 
724
.password:
725
        mov     ebp,esi
726
        mov     esi,1
727
        mov     edx,txt_pass
3089 IgorA 728
@@:
5679 hidnplayr 729
        mcall
6675 pathoswith 730
        rol     ebx,16
731
        add     ebx,ed_char_width
732
        rol     ebx,16
733
        dec     ebp
734
        jnz     @b
5692 leency 735
        ret
6675 pathoswith 736
 
737
txt_pass db '*'
1032 Lrz 738
;----------------------------------------------------------
739
;--- процедура прорисовки фона ----------------------------
740
;----------------------------------------------------------
741
edit_box.draw_bg:
742
        mov     ebx,ed_left
6675 pathoswith 743
        inc     ebx
744
        shl     ebx,16
745
        add     ebx,ed_width
746
        dec     ebx
1032 Lrz 747
        mov     edx,ed_color
5679 hidnplayr 748
        test    word ed_flags, ed_disabled
6675 pathoswith 749
        jz      edit_box.draw_bg_eax
750
        mov     edx, 0xCACACA   ; TODO: add disabled_color field to editbox struct
1032 Lrz 751
edit_box.draw_bg_eax:
752
        mov     ecx,ed_top
6675 pathoswith 753
        inc     ecx
1032 Lrz 754
        shl     ecx,16
755
        add     ecx,ed_height
6788 IgorA 756
        mcall   SF_DRAW_RECT
6675 pathoswith 757
        ret
758
 
1032 Lrz 759
;----------------------------------------------------------
1858 lev 760
;--- процедура получения количества символов в текущей ширине компонента
1032 Lrz 761
;----------------------------------------------------------
762
edit_box.get_n:
6675 pathoswith 763
        mov     eax,ed_width
764
        sub     eax,4
765
        xor     edx,edx
766
        div     word ed_char_width
767
        ret
768
 
1032 Lrz 769
;----------------------------------------------------------
6705 0CodErr 770
;------------------ Draw Cursor Procedure -----------------
1032 Lrz 771
;----------------------------------------------------------
6705 0CodErr 772
; in: ebp = Color
1032 Lrz 773
edit_box.clear_cursor:
6705 0CodErr 774
        mov     edx, ebp
775
        movzx   ebx, word cl_curs_x
776
        movzx   ecx, word cl_curs_y
1032 Lrz 777
        jmp     edit_box.draw_curs
6675 pathoswith 778
 
1032 Lrz 779
edit_box.draw_cursor:
6705 0CodErr 780
        mov     edx, ed_text_color
781
        mov     eax, ed_pos
782
        sub     eax, ed_offset
783
        mul     dword ed_char_width
784
        mov     ebx, eax
785
        add     ebx, ed_left
786
        inc     ebx
787
        mov     ecx, ed_top
788
        add     ecx, 2
789
        mov     cl_curs_x, bx
790
        mov     cl_curs_y, cx
791
edit_box.draw_curs:
792
        mov     eax, ebx
793
        shl     ebx, 16
794
        or      ebx, eax
795
        mov     eax, ecx
796
        shl     ecx, 16
797
        or      ecx, eax
798
        add     ecx, ed_height
799
        sub     ecx, 3
6788 IgorA 800
        mcall   SF_DRAW_LINE
6675 pathoswith 801
        ret
802
 
1032 Lrz 803
;----------------------------------------------------------
804
;--- процедура рисования рамки ----------------------------
805
;----------------------------------------------------------
806
edit_box.draw_border:
807
        test    word ed_flags,ed_focus
808
        mov     edx,ed_focus_border_color
809
        jne     @f
810
        mov     edx,ed_blur_border_color
811
@@:
812
        mov     ebx,ed_left
813
        mov     ecx,ebx
814
        shl     ebx,16
6677 pathoswith 815
        add     ebx,ecx
1032 Lrz 816
        add     ebx,ed_width
817
        mov     ecx,ed_top
818
        mov     esi,ecx
819
        shl     ecx,16
6677 pathoswith 820
        add     ecx,esi
6788 IgorA 821
        mcall   SF_DRAW_LINE ; top
1032 Lrz 822
        mov     esi,ecx
6677 pathoswith 823
        inc     ecx
1032 Lrz 824
        add     ecx,ed_height
825
        mov     ebp,ecx
826
        shl     ecx,16
827
        mov     cx,bp
6677 pathoswith 828
        mcall   ; bottom
1032 Lrz 829
        mov     cx,si
830
        mov     ebp,ebx
831
        sub     ebx,ed_width
6677 pathoswith 832
        mcall   ; left
1032 Lrz 833
        mov     ebx,ebp
834
        shl     ebx,16
835
        mov     bx,bp
6677 pathoswith 836
        mcall   ; right
6675 pathoswith 837
        ret
838
 
1032 Lrz 839
;----------------------------------------------------------
840
;--- проверка, зашел ли курсор за границы и, если надо, ---
841
;--- изменяем смещение ------------------------------------
1858 lev 842
;--- если смещение было, установка флага ed_offset_cl, иначе,
843
; если ничего не изменилось, то выставление ed_offset_fl
1619 IgorA 844
; в общей битовой матрице состояния компонентов word ed_flags
1032 Lrz 845
;----------------------------------------------------------
846
edit_box.check_offset:
6675 pathoswith 847
        pushad
1032 Lrz 848
        mov     ecx,ed_pos
849
        mov     ebx,ed_offset
850
        cmp     ebx,ecx
851
        ja      edit_box.sub_8
852
        push    ebx
6675 pathoswith 853
        call    edit_box.get_n
1032 Lrz 854
        pop     ebx
855
        mov     edx,ebx
6675 pathoswith 856
        add     edx,eax
857
        inc     edx     ;необходимо для нормального положения курсора в крайней левой позиции
1032 Lrz 858
        cmp     edx,ecx
859
        ja      @f
860
        mov     edx,ed_size
861
        cmp     edx,ecx
862
        je      edit_box.add_end
863
        sub     edx,ecx
864
        cmp     edx,8
865
        jbe     edit_box.add_8
866
        add     ebx,8
867
        jmp     edit_box.chk_d
868
 
6675 pathoswith 869
@@:     or      word ed_flags,ed_offset_fl
870
        popad
871
        ret
872
 
1216 Lrz 873
edit_box.sub_8:
5679 hidnplayr 874
        test    ecx,ecx
6675 pathoswith 875
        jz      @f
1032 Lrz 876
        sub     ebx,8   ;ebx=ed_offset
6675 pathoswith 877
        ja      edit_box.chk_d
878
@@:
1032 Lrz 879
        xor     ebx,ebx
880
        jmp     edit_box.chk_d
881
 
6675 pathoswith 882
edit_box.add_end:
883
        sub     edx,eax
1032 Lrz 884
        mov     ebx,edx
885
        jmp     edit_box.chk_d
6675 pathoswith 886
 
887
edit_box.add_8:
888
        add     ebx,edx
889
edit_box.chk_d:
890
        mov     ed_offset,ebx
1032 Lrz 891
        call    edit_box.draw_bg
892
        and     word ed_flags,ed_offset_cl
6675 pathoswith 893
        popad
894
        ret
1596 Lrz 895
 
6788 IgorA 896
align 4
1619 IgorA 897
proc edit_box_set_text, edit:dword, text:dword
6675 pathoswith 898
        pushad
899
        mov     edi,[edit]
900
        mov     ecx,ed_max
901
        inc     ecx
902
        mov     edi,[text]
903
        xor     al,al
5679 hidnplayr 904
        cld
6675 pathoswith 905
        repne scasb
906
        mov     ecx,edi
907
        mov     edi,[edit]
908
        mov     esi,[text]
909
        sub     ecx,esi
910
        dec     ecx
911
        mov     ed_size,ecx
912
        mov     ed_pos,ecx
913
        and     word ed_flags,ed_shift_cl
914
        mov     edi,ed_text
915
        repne movsb
916
        mov     byte[edi],0
917
        popad
918
        ret
1619 IgorA 919
endp
1032 Lrz 920
 
6788 IgorA 921
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
922
;Функции для работы с key
923
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
924
 
1032 Lrz 925
;Обработка Shift для снятия выделения неизвестной области
6675 pathoswith 926
edit_box_key.shift:
5692 leency 927
        call    edit_box.draw_bg
1032 Lrz 928
        test    word ed_flags,ed_shift
929
        je      edit_box_key.f_exit
5692 leency 930
        mov     ebp,shift_color
1032 Lrz 931
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
6705 0CodErr 932
        movzx   ebx, word ed_shift_pos
1032 Lrz 933
        call    edit_box_key.sh_cl_
934
        jmp     edit_box.draw_cursor_text
6675 pathoswith 935
 
1858 lev 936
edit_box_key.f_exit:
5679 hidnplayr 937
        call    edit_box.check_offset
1032 Lrz 938
        and     word ed_flags,ed_shift_cl
939
        call    edit_box_key.enable_null
940
        jmp     edit_box.draw_cursor_text
6675 pathoswith 941
 
1032 Lrz 942
edit_box_key.sh_cl_:
943
;обработка очистки, при левом - правом движении выделения
944
;для обработки снятия выделения
945
;входные параметры ebp=color ebx=ed_shift_pos
6675 pathoswith 946
        mov     eax,ed_pos
1032 Lrz 947
        cmp     eax,ebx
948
        jae     edit_box_key.sh_n
949
        push    eax  ;меньшее в eax
950
        push    ebx  ;большее
951
        jmp     edit_box_key.sh_n1
6675 pathoswith 952
 
1214 Lrz 953
edit_box_key.sh_n:
5679 hidnplayr 954
        push    ebx
1032 Lrz 955
        push    eax
1858 lev 956
edit_box_key.sh_n1:
1032 Lrz 957
        call    edit_box.check_offset
958
        call    edit_box.get_n
959
        mov     edx,eax ;size of ed_box
960
        mov     ecx,ed_offset
961
        add     eax,ecx ;eax = w_off= ed_offset+width
962
        mov     edx,eax ;save
963
        pop     ebx     ;большее
964
        pop     eax     ;меньшее
1858 lev 965
        cmp     eax,ecx         ;сравнение меньшего с offset.
1032 Lrz 966
        jae     edit_box_key.f_f            ;если больше
967
        xor     eax,eax
968
        cmp     edx,ebx         ;cравним размер w_off с большим
6675 pathoswith 969
        jnb     @f
970
        mov     ebx,edx
971
@@:
1032 Lrz 972
        sub     ebx,ecx
973
        jmp     edit_box_key.nxt_f
6675 pathoswith 974
 
1858 lev 975
edit_box_key.f_f:
1032 Lrz 976
        sub     eax,ecx
977
        cmp     edx,ebx         ;cравним размер w_off с большим
978
        jle     @f
979
        sub     ebx,ecx
980
        sub     ebx,eax
981
        jmp     edit_box_key.nxt_f
6675 pathoswith 982
 
983
@@:     mov     ebx,edx
1032 Lrz 984
        sub     ebx,ecx
985
        sub     ebx,eax
986
edit_box_key.nxt_f:
6675 pathoswith 987
        mul     dword ed_char_width
988
        xchg    eax,ebx
989
        mul     dword ed_char_width
1032 Lrz 990
        add     ebx,ed_left
991
        inc     ebx
992
        shl     ebx,16
6675 pathoswith 993
        inc     eax
994
        mov     bx, ax
995
        mov     edx,ebp ;shift_color
996
        call    edit_box.draw_bg_eax
997
        jmp     edit_box_key.enable_null
1032 Lrz 998
 
999
;Установка- снятие выделения в один символ
1000
edit_box_key.drw_sim:
6675 pathoswith 1001
        mov     eax,ed_pos
1002
        call    edit_box_key.draw_rectangle
1003
        jmp     edit_box_key.enable_null
1004
 
1858 lev 1005
;Функция установки выделения при движении влево и вправо и нажатии shift
1032 Lrz 1006
edit_box_key.draw_wigwag:
1007
        mov     ebp,shift_color
1008
        call    edit_box.clear_cursor
1858 lev 1009
        or      word ed_flags,ed_shift_bac ;установка флага выделенной области
1032 Lrz 1010
        mov     ebp,shift_color
6675 pathoswith 1011
        mov     eax,ed_pos
1032 Lrz 1012
        test    word ed_flags,ed_left_fl
6675 pathoswith 1013
        jnz     edit_box_key.draw_rectangle
1014
        dec     eax
1015
        jmp     edit_box_key.draw_rectangle
1016
 
1858 lev 1017
;Функция удаления выделения при движении влево и вправо и нажатии shift
1032 Lrz 1018
edit_box_key.draw_wigwag_cl:
1019
        mov     ebp,ed_color
1020
        call    edit_box.clear_cursor
1021
        mov     ebp,ed_color
6675 pathoswith 1022
        mov     eax,ed_pos
1032 Lrz 1023
        test    word ed_flags,ed_left_fl
6675 pathoswith 1024
        jnz     edit_box_key.draw_rectangle
1025
        dec     eax
1026
        jmp     edit_box_key.draw_rectangle
1027
 
1032 Lrz 1028
;входной параметр ebx - ed_pos
1029
edit_box_key.sh_first_sh:
1030
        test    word ed_flags,ed_shift
1031
        je      @f
6705 0CodErr 1032
        mov     ed_shift_pos_old,bx
1032 Lrz 1033
        test    word ed_flags,ed_shift_on
1034
        jne     @f
6705 0CodErr 1035
        mov     ed_shift_pos,bx
1032 Lrz 1036
        or      word ed_flags,ed_shift_on
1037
@@:     ret
1038
;Обработка крайних положений в editbox при нажатом shift
1858 lev 1039
;производит снятие выделения, если нет shift
1032 Lrz 1040
;иначе вообще выходит
1041
edit_box_key.sh_st_of:
1042
        test    word ed_flags,ed_shift
1043
        jne     @f
1044
        test    word ed_flags,ed_shift_bac
1045
        je      @f
5692 leency 1046
        call    edit_box.draw_bg
1032 Lrz 1047
        mov     ebp,ed_color
6705 0CodErr 1048
        movzx   ebx, word ed_shift_pos
1032 Lrz 1049
        call    edit_box_key.sh_cl_  ;очистка выделеного фрагмента
1858 lev 1050
        and     word ed_flags,ed_shift_cl ; очистка от того, что убрали выделение
1032 Lrz 1051
        jmp     edit_box.draw_cursor_text
6675 pathoswith 1052
 
1053
@@:     and     word ed_flags,ed_shift_off
1113 diamond 1054
        popad
1055
        ret     4
1858 lev 1056
;проверка состояния shift, был ли он нажат раньше?
1032 Lrz 1057
edit_box_key.sh_enable:
1058
        test    word ed_flags,ed_shift
1858 lev 1059
        jne     edit_box_key.sh_ext_en ;нарисовать закрашенный прямоугольник
1032 Lrz 1060
        test    word ed_flags,ed_shift_bac
1061
        je      @f
1062
        call    edit_box.check_offset
1063
        mov     ebp,ed_color
6705 0CodErr 1064
        movzx   ebx, word ed_shift_pos
1858 lev 1065
        call    edit_box_key.sh_cl_  ;очистка выделенного фрагмента
1066
        call    edit_box_key.draw_wigwag_cl
1067
        and     word ed_flags,ed_shift_cl ; 1вар не нужно
1032 Lrz 1068
        ret
1069
 
1070
@@:     mov     ebp,ed_color
1071
        call    edit_box.clear_cursor
6675 pathoswith 1072
        jmp     edit_box.check_offset
1073
 
1858 lev 1074
edit_box_key.sh_ext_en:
1032 Lrz 1075
        call    edit_box.check_offset
1076
        test    word ed_flags,ed_offset_fl
1077
        je      @f
1858 lev 1078
;Рисование закрашенных прямоугольников и их очистка
6705 0CodErr 1079
        movzx   eax, word ed_shift_pos
6675 pathoswith 1080
        mov     ebx,ed_pos
6705 0CodErr 1081
        movzx   ecx, word ed_shift_pos_old
1858 lev 1082
;проверка и рисование закрашенных областей
1032 Lrz 1083
        cmp     eax,ecx
1084
        je      edit_box_key.1_shem
1085
        jb      edit_box_key.smaller
1086
        cmp     ecx,ebx
1087
        ja      edit_box_key.1_shem
1088
        call    edit_box_key.draw_wigwag_cl ;clear
1089
        jmp     edit_box_key.sh_e_end
6675 pathoswith 1090
 
1032 Lrz 1091
edit_box_key.smaller:
1092
        cmp     ecx,ebx
1093
        jb      edit_box_key.1_shem
1094
        call    edit_box_key.draw_wigwag_cl ;clear
1095
        jmp     edit_box_key.sh_e_end
6675 pathoswith 1096
 
1097
edit_box_key.1_shem:
1098
        call    edit_box_key.draw_wigwag
1099
edit_box_key.sh_e_end:
1100
        and     word ed_flags,ed_shift_off
1032 Lrz 1101
        ret
6675 pathoswith 1102
 
1032 Lrz 1103
@@:     mov     ebp,shift_color
6705 0CodErr 1104
        movzx   ebx, word ed_shift_pos
1032 Lrz 1105
        call    edit_box_key.sh_cl_
1106
        jmp     edit_box_key.sh_e_end
1107
;функция для обработки shift при нажатии home and end
1108
edit_box_key.sh_home_end:
1109
        mov     ebp,ed_color
1110
        call    edit_box.clear_cursor
1111
        test    word ed_flags,ed_shift_bac
1112
        je      @f
1113
        mov     ebp,ed_color
6705 0CodErr 1114
        movzx   ebx, word ed_shift_pos_old
1032 Lrz 1115
        call    edit_box_key.sh_cl_
6675 pathoswith 1116
@@:
1117
        test    word ed_flags,ed_shift
1032 Lrz 1118
        je      edit_box_key.sh_exit_ ;выйти
1119
        mov     ebp,shift_color
6705 0CodErr 1120
        movzx   ebx, word ed_shift_pos
1032 Lrz 1121
        call    edit_box_key.sh_cl_
1122
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
1123
        jmp     edit_box_key.sh_e_end
6675 pathoswith 1124
 
1858 lev 1125
edit_box_key.sh_exit_:
1596 Lrz 1126
        call    edit_box.draw_bg
6675 pathoswith 1127
        jmp     edit_box.check_offset
1128
 
1032 Lrz 1129
;функция внесения 0 по адресу ed_size+1
1130
edit_box_key.enable_null:
1131
        pusha
1132
        mov     eax,ed_size
1133
        mov     ebx,ed_text
1134
        test    eax,eax
1135
        add     eax,ebx
1136
        jne     @f
1137
        inc     eax
1138
@@:     xor     ebx,ebx
1139
        mov     [eax],bl
6675 pathoswith 1140
        popad
1141
        ret
1142
 
1032 Lrz 1143
;- удаление символа
1144
;Входные данные edx=ed_size;ecx=ed_pos
1145
edit_box_key.del_char:
1146
        mov     esi,ed_text
1147
        test    word ed_flags,ed_shift_on
1148
        je      @f
6705 0CodErr 1149
        movzx   eax, word ed_shift_pos
1032 Lrz 1150
        mov     ebx,esi
1151
        cmp     eax,ecx
1152
        jae     edit_box_key.dh_n
1858 lev 1153
        mov     ed_pos,eax      ;чтобы не было убегания курсора
1032 Lrz 1154
        mov     ebp,ecx
1155
        sub     ebp,eax
1858 lev 1156
        add     ebx,eax  ;eax меньше
1032 Lrz 1157
        sub     edx,ecx
1158
        add     esi,ecx
6705 0CodErr 1159
        mov     ed_shift_pos,bp
6675 pathoswith 1160
        jmp     edit_box_key.del_ch_sh
1032 Lrz 1161
 
1858 lev 1162
edit_box_key.dh_n:
1032 Lrz 1163
        mov     ebp,eax
1164
        sub     ebp,ecx
1165
        add     ebx,ecx
1166
        sub     edx,eax
1167
        add     esi,eax
6705 0CodErr 1168
        mov     ed_shift_pos,bp
1032 Lrz 1169
        jmp     edit_box_key.del_ch_sh
1170
 
1858 lev 1171
@@:     add     esi,ecx ;указатель + смещение к реальному буферу
1032 Lrz 1172
        mov     ebx,esi
1173
        inc     esi
1174
        cld
1175
        sub     edx,ecx
1176
edit_box_key.del_ch_sh:
1177
        push    edi
1178
        mov     edi,ebx
1179
@@:
1180
        lodsb
1181
        stosb
6675 pathoswith 1182
        dec     edx
1183
        jns     @b
1184
        pop     edi
1032 Lrz 1185
        ret
1186
;вычислить закрашиваемую область
1187
;соглашение в ebp - передается ed_size
1188
edit_box_key.clear_bg:
1189
        call    edit_box.get_n  ;получить размер в символах ширины компонента
1190
        push    eax
1191
        mov     ebx,ed_offset
1192
        add     eax,ebx ;eax = w_off= ed_offset+width
1193
        mov     ebx,ebp ;ed_size
1194
        cmp     eax,ebx
1195
        jb      @f
1196
        mov     eax,ed_pos
1197
        sub     ebx,eax
1198
        mov     ecx,ed_offset
1199
        sub     eax,ecx
1200
        jmp     edit_box_key.nxt
6675 pathoswith 1201
 
1032 Lrz 1202
@@:     mov     ebx,ed_pos
1203
        push    ebx
1204
        sub     eax,ebx
1858 lev 1205
        mov     ebx,eax ;It is not optimal
1032 Lrz 1206
        pop     eax     ;ed_pos
1207
        mov     ecx,ed_offset
1208
        sub     eax,ecx
1209
edit_box_key.nxt:
1210
        mov     ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
1211
        add     ebp,ebx
1212
        pop     edx
1213
        cmp     ebp,edx
1214
        je      @f
1215
        inc     ebx
6675 pathoswith 1216
@@:
1217
        mul     dword ed_char_width
1218
        xchg    eax,ebx
1219
        mul     dword ed_char_width
1032 Lrz 1220
        add     ebx,ed_left
1221
        inc     ebx
1222
        shl     ebx,16
6675 pathoswith 1223
        inc     eax
1224
        mov     bx, ax
1032 Lrz 1225
        mov     edx,ed_color
6675 pathoswith 1226
        jmp     edit_box.draw_bg_eax
1227
 
1032 Lrz 1228
;;;;;;;;;;;;;;;;;;;
1229
;;; Обработка примитивов
1230
;;;;;;;;;;;;;;;;;;;;
1231
;Нарисовать прямоугольник, цвет передается в ebp
1232
;входные параметры:
1233
;eax=dword ed_pos
1858 lev 1234
;ebp=-цвет ed_color or shift_color
1032 Lrz 1235
edit_box_key.draw_rectangle:
6675 pathoswith 1236
        sub     eax,ed_offset
1237
        mul     dword ed_char_width
1238
        add     eax,ed_left
1239
        inc     eax
1240
        shl     eax,16
1241
        add     eax,ed_char_width
1242
        mov     ebx,eax
1032 Lrz 1243
        mov     edx,ebp
6675 pathoswith 1244
        jmp     edit_box.draw_bg_eax
1245
 
1032 Lrz 1246
;;;;;;;;;;;;;;;;;;
1247
;;Проверка нажат ли shift
1248
;;;;;;;;;;;;;;;;;;
4601 mario79 1249
edit_box_key.check_shift_ctrl_alt:
6675 pathoswith 1250
        pusha
6788 IgorA 1251
        mcall   SF_KEYBOARD,SSF_GET_CONTROL_KEYS
4601 mario79 1252
        test    al,11b
1032 Lrz 1253
        je      @f
4601 mario79 1254
        or      word ed_flags,ed_shift   ;установим флаг Shift
1255
@@:
1256
        and     word ed_flags,ed_ctrl_off ; очистим флаг Ctrl
5679 hidnplayr 1257
        test    al,1100b
4601 mario79 1258
        je      @f
1259
        or      word ed_flags,ed_ctrl_on   ;установим флаг Ctrl
1260
@@:
1261
        and     word ed_flags,ed_alt_off ; очистим флаг Alt
5679 hidnplayr 1262
        test    al,110000b
4601 mario79 1263
        je      @f
1264
        or      word ed_flags,ed_alt_on   ;установим флаг Alt
6675 pathoswith 1265
@@:
1266
        popad
1267
        ret
1032 Lrz 1268
 
6788 IgorA 1269
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1270
;Функции для работы с mouse
1271
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1032 Lrz 1272
edit_box_mouse.mouse_wigwag:
5692 leency 1273
        push    eax
1274
        call    edit_box.draw_bg
1275
        call    edit_box.draw_shift
1276
        pop     eax
6675 pathoswith 1277
        or      word ed_flags,ed_shift_bac+ed_shift_on+ed_shift
1278
;Обработка положения выделенного текста, когда происходит выход за пределы editbox
1279
        test    eax,eax
1280
        js      edit_box_mouse.mleft
1032 Lrz 1281
        shr     eax,16
6675 pathoswith 1282
        sub     eax,ed_left
1283
        jc      edit_box_mouse.mleft
1284
        cmp     ed_width,eax
1285
        jc      edit_box_mouse.mright
1032 Lrz 1286
        xor     edx,edx
6675 pathoswith 1287
        div     word ed_char_width
1288
;Обработка положения выделенного текста, в пределах области editbox
1032 Lrz 1289
;Получили координаты в eax мышки, т.е. куда она переместилась
1858 lev 1290
;Рисование закрашенных прямоугольников и их очистка
6675 pathoswith 1291
        add     eax,ed_offset
1292
        cmp     eax,ed_size
1032 Lrz 1293
        ja      edit_box_mouse.mwigvag
1858 lev 1294
edit_box_mouse.mdraw:
6675 pathoswith 1295
        mov     ed_pos,eax
1858 lev 1296
;Рисование закрашенных прямоугольников и их очистка
6705 0CodErr 1297
        movzx   ecx, word ed_shift_pos
1298
        movzx   ebx, word ed_shift_pos_old
1299
        mov     ed_shift_pos_old,ax
1858 lev 1300
;проверка и рисование закрашенных областей
6675 pathoswith 1301
        cmp     ecx,ebx
1302
        je      edit_box_mouse.m1_shem  ;движения не было ранее
1303
        jb      edit_box_mouse.msmaller ;было движение ->
1304
        cmp     ebx,eax
1305
        ja      edit_box_mouse.m1_shem  ;было движение <-
1306
        je      edit_box_mouse.mwigvag
1307
        mov     ebp,ed_color
1308
        call    edit_box_key.sh_cl_     ;очистить область c ed_pos ed_shift_pos_old
1032 Lrz 1309
        jmp     edit_box_mouse.mwigvag
6675 pathoswith 1310
 
1032 Lrz 1311
edit_box_mouse.msmaller:
1312
        cmp     ebx,eax
1313
        jb      edit_box_mouse.m1_shem
1314
        mov     ebp,ed_color
1315
        call    edit_box_key.sh_cl_
1316
        jmp     edit_box_mouse.mwigvag
6675 pathoswith 1317
 
1858 lev 1318
edit_box_mouse.m1_shem:
1032 Lrz 1319
        mov     ebp,shift_color
1320
        mov     ebx,ecx
1321
        call    edit_box_key.sh_cl_
1322
edit_box_mouse.mwigvag:
1323
        and     word ed_flags,ed_shift_mcl
1324
        jmp     edit_box.draw_cursor_text
6675 pathoswith 1325
 
1032 Lrz 1326
edit_box_mouse.mleft:
1327
        mov     eax,ed_pos
1858 lev 1328
        cmp     eax,0
6675 pathoswith 1329
        jbe     edit_box_mouse.mwigvag
1032 Lrz 1330
        dec     eax
1331
        call    edit_box.check_offset
1332
        push    eax
6705 0CodErr 1333
        movzx   ebx, word ed_shift_pos
1032 Lrz 1334
        mov     ebp,shift_color
1335
        call    edit_box_key.sh_cl_
1336
        pop     eax
1337
        jmp     edit_box_mouse.mdraw
6675 pathoswith 1338
 
1032 Lrz 1339
edit_box_mouse.mright:
1340
        mov     eax,ed_pos
1341
        mov     ebx,ed_size
1342
        cmp     eax,ebx
1343
        jae     edit_box_mouse.mwigvag
1344
        inc     eax
1345
        call    edit_box.check_offset
6705 0CodErr 1346
        movzx   ebx, word ed_shift_pos
1032 Lrz 1347
        mov     ebp,shift_color
1348
        push    eax
1349
        call    edit_box_key.sh_cl_
1350
        pop     eax
1858 lev 1351
        jmp     edit_box_mouse.mdraw
1032 Lrz 1352
 
6675 pathoswith 1353
 
1354
ed_struc_size=84