Subversion Repositories Kolibri OS

Rev

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