Subversion Repositories Kolibri OS

Rev

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