Subversion Repositories Kolibri OS

Rev

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