Subversion Repositories Kolibri OS

Rev

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

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