Subversion Repositories Kolibri OS

Rev

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

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