Subversion Repositories Kolibri OS

Rev

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

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