Subversion Repositories Kolibri OS

Rev

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