Subversion Repositories Kolibri OS

Rev

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

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