Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
468 Lrz 1
; SEE YOU File FAQ.txt and HISTORY. Good Like!
461 Lrz 2
;;;;;;;;;;;;;;;;;;
3
include 'editbox.mac'    ;макрос который должен облегчить жизнь :) специально для editbox
4
;;;;;;;;;;;;;;;;;;
468 Lrz 5
macro use_edit_box structure_of_potock,scr_h,scr_w
234 Lrz 6
{
7
edit_box:
461 Lrz 8
ed_width        equ [edi]               ;ширина компонента
9
ed_left         equ [edi+4]             ;положение по оси х
10
ed_top          equ [edi+8]             ;положение по оси у
11
ed_color        equ [edi+12]            ;цвет фона компонента
468 Lrz 12
shift_color     equ [edi+16]            ;=0x6a9480
461 Lrz 13
ed_focus_border_color   equ [edi+20]    ;цвет рамки компонента
14
ed_blur_border_color    equ [edi+24]    ;цвет не активного компонента
15
ed_text_color   equ [edi+28]            ;цвет текста
16
ed_max          equ [edi+32]                    ;кол-во символов которые можно максимально ввести
17
ed_text         equ [edi+36]                    ;указатель на буфер
18
ed_flags        equ [edi+40]            ;флаги
19
ed_size equ [edi+42]                    ;кол-во символов
20
ed_pos  equ [edi+46]                    ;позиция курсора
21
ed_offset       equ [edi+50]            ;смещение
22
cl_curs_x       equ [edi+54]            ;предыдущее координата курсора по х
23
cl_curs_y       equ [edi+58]            ;предыдущее координата курсора по у
24
ed_shift_pos    equ [edi+62]            ;положение курсора
25
ed_shift_pos_old equ [edi+66]           ;старое положение курсора
234 Lrz 26
;==========================================================
27
;=== процедура прорисовки =================================
28
;==========================================================
29
.draw:
30
pusha
31
;--- рисуем рамку ---
461 Lrz 32
        call    .draw_border            ; Функция стабильна
234 Lrz 33
.draw_bg_cursor_text:
34
;--- изменяем смещение, если надо ---
461 Lrz 35
        call    .check_offset           ;вычисление позиции курсора стабильна
234 Lrz 36
;--- рисуем внутреннюю область ---
461 Lrz 37
        call    .draw_bg                ;нарисовать прямоугольник рабочей области
402 Lrz 38
;---- рисуем выделение, по shift если есть
461 Lrz 39
        call    .draw_shift
234 Lrz 40
.draw_cursor_text:
41
;--- рисуем курсор ---
461 Lrz 42
        ;--- может его не надо рисовать ----
43
        test    word ed_flags,ed_focus
44
        je     @f
45
        call    .draw_cursor
234 Lrz 46
@@:
461 Lrz 47
        call    .draw_text
48
edit_ex
49
 
50
;debug_func
234 Lrz 51
;----------------------------------------------------------
402 Lrz 52
;--- процедура прорисовки выделеной части -----------------
53
;----------------------------------------------------------
54
.draw_shift:
461 Lrz 55
        test    word ed_flags,ed_shift_bac ;установка флага, выделенной области
56
        jz      @f
57
        mov     ebp,shift_color
58
        mov     ebx,dword       ed_shift_pos
59
        call    .sh_cl_
60
@@:     ret
402 Lrz 61
;----------------------------------------------------------
234 Lrz 62
;--- процедура прорисовки текста --------------------------
63
;----------------------------------------------------------
64
.draw_text:
65
;--- вычисляем, сколько помещается символов ---
66
;--- чтобы мусор не рисовать ---
461 Lrz 67
        call    .get_n
68
        mov     esi,ed_size
69
        mov     ebx,ed_offset
70
        sub     esi,ebx
71
        cmp     eax,esi
72
        jae     @F
73
        mov     esi,eax         ;чтобы не выходить за пределы экрана
402 Lrz 74
;--- рисуем текст ---
461 Lrz 75
@@:     mov     eax,4
76
        mov     ebx,ed_left
77
        mov     edx,ed_offset
78
        add     ebx,2
79
        shl     ebx,16
80
        mov     bx,ed_top
81
        add     ebx,4
82
        mov     ecx,ed_text_color
83
        add     edx,ed_text
84
        int     0x40
234 Lrz 85
ret
86
;----------------------------------------------------------
87
;--- процедура прорисовки фона ----------------------------
88
;входные данные
89
;eax
292 Lrz 90
;edx - color
234 Lrz 91
;----------------------------------------------------------
343 Lrz 92
;вход только цвет edx
234 Lrz 93
.draw_bg:
461 Lrz 94
        mov     ebx,ed_left
95
        add     ebx,1
96
        shl     ebx,16
97
        mov     bx,ed_width
98
        sub     ebx,1
99
        mov     edx,ed_color
391 Lrz 100
.draw_bg_eax:
461 Lrz 101
        mov     ecx,ed_top
102
        mov     eax,13
103
        add     ecx,1
104
        shl     ecx,16
105
        mov     cx,ed_height
106
        dec     ecx
107
        int     0x40
234 Lrz 108
ret
109
 
110
;----------------------------------------------------------
111
;--- процедура получения количества символов в текущей щирине компонента --------------
112
;----------------------------------------------------------
113
.get_n:
461 Lrz 114
        mov     eax,ed_width    ;получем ширину компонента
115
        xor     edx,edx   ;результат распологается в паре edx:eax в eax - остаток
116
        sub     eax,4           ;вычтим 4
117
        mov     ebx,6           ;загрузми делитель
118
        div     ebx             ;размделим на 6
234 Lrz 119
ret
120
;----------------------------------------------------------
121
;--- процедура рисования курсора --------------------------
122
;----------------------------------------------------------
391 Lrz 123
;входные ebp- цвет
234 Lrz 124
.clear_cursor:
461 Lrz 125
        mov     edx,ebp
126
        mov     ebx,cl_curs_x
127
        mov     ecx,cl_curs_y
128
        jmp     .draw_curs
234 Lrz 129
.draw_cursor:
468 Lrz 130
        mov     edx,ed_text_color
461 Lrz 131
        mov     ebx,ed_pos
132
        mov     ecx,ed_offset
133
        sub     ebx,ecx
234 Lrz 134
 
461 Lrz 135
        lea     ebx,[ebx*2+ebx]
136
        shl     ebx,1
137
        ;imul   ebx,6
138
        add     bx,ed_left
139
        mov     ecx,ed_top
140
        inc     ebx
141
        add     ecx,2
142
        mov     ebp,ebx
143
        shl     ebx,16
144
        mov     bx,bp
145
        mov     ebp,ecx
146
 
147
        shl     ecx,16
148
        mov     cx,bp
149
        add     cx,ed_height-4
150
 
151
        mov     cl_curs_x,ebx
152
        mov     cl_curs_y,ecx
153
.draw_curs:
154
        mov     eax,38
155
        int     0x40
234 Lrz 156
ret
157
;----------------------------------------------------------
158
;--- процедура рисования рамки ----------------------------
159
;----------------------------------------------------------
160
.draw_border:
161
;--- цвет рамки ---
461 Lrz 162
        test    word ed_flags,ed_focus
163
        mov     edx,ed_focus_border_color
164
        jne     @f
165
        mov     edx,ed_blur_border_color
234 Lrz 166
@@:
167
;--- сверху ---
461 Lrz 168
        mov     eax,38
169
        mov     ebx,ed_left
170
        mov     ecx,ebx
171
        shl     ebx,16
172
        mov     bx,cx
173
        add     bx,ed_width
174
        mov     ecx, ed_top
175
        mov     esi,ecx
176
        shl     ecx,16
177
        mov     cx,si
178
        int     0x40
234 Lrz 179
 
180
;--- снизу ---
461 Lrz 181
        mov     esi,ecx
182
        add     ecx,ed_height
183
        mov     ebp,ecx
184
        shl     ecx,16
185
        mov     cx,bp
186
        int     0x40
234 Lrz 187
 
188
;--- слева ---
461 Lrz 189
        mov     cx,si
190
        mov     ebp,ebx
191
        sub     bx,ed_width
192
        int     0x40
234 Lrz 193
 
194
;--- справа ---
461 Lrz 195
        mov     ebx,ebp
196
        shl     ebx,16
197
        mov     bx,bp
198
        int     0x40
234 Lrz 199
ret
200
;----------------------------------------------------------
201
;--- проверка, зашел ли курсор за границы и, если надо, ---
202
;--- изменяем смещение ------------------------------------
296 Lrz 203
;--- eax = -1, если не изменилось или eax = 0, если
234 Lrz 204
; изменилось
205
;----------------------------------------------------------
206
.check_offset:
350 Lrz 207
pusha
461 Lrz 208
        mov     ecx,ed_pos
209
        mov     ebx,ed_offset
210
        cmp     ebx,ecx
211
        ja      .sub_8
295 Lrz 212
 
461 Lrz 213
        push    ebx
214
        call    .get_n                  ;получим кол-во символов в паре регистров edx:eax
215
        pop     ebx
216
        mov     edx,ebx
217
        add     edx,eax         ;ed_offset+width editbox
218
        inc     edx             ;необходимо для номального положения курсора в крайней левой позиции
219
        cmp     edx,ecx
220
        ja      @f
295 Lrz 221
 
461 Lrz 222
        mov     edx,ed_size
223
        cmp     edx,ecx
224
        je      .add_end
296 Lrz 225
 
461 Lrz 226
        sub     edx,ecx
227
        cmp     edx,8
228
        jbe     .add_8
229
        add     ebx,8
230
        jmp     .chk_d
295 Lrz 231
 
461 Lrz 232
.sub_8: cmp     ecx,0
233
        je      .sub_min
234
        cmp     ebx,8
235
        jbe     .sub_min
236
        sub     ebx,8   ;ebx=ed_offset
237
        jmp     .chk_d
295 Lrz 238
.sub_min:
461 Lrz 239
        xor     ebx,ebx
240
        jmp     .chk_d
295 Lrz 241
 
461 Lrz 242
.add_end:sub    edx,eax
243
        mov     ebx,edx
244
        jmp     .chk_d
245
.add_8: add     ebx,edx
246
.chk_d: mov     ed_offset,ebx
247
        call    .draw_bg
248
        and     word ed_flags,ed_offset_cl
249
edit_ex
295 Lrz 250
@@:
461 Lrz 251
        or      word ed_flags,ed_offset_fl
252
edit_ex
295 Lrz 253
;==========================================================
254
;=== обработка клавиатуры =================================
255
;==========================================================
256
.key:
257
pusha
461 Lrz 258
        test    word ed_flags,ed_focus ; если не в фокусе, выходим
259
        je      @b
343 Lrz 260
;Проверка на нажаты shift
461 Lrz 261
        call    .check_shift
234 Lrz 262
;----------------------------------------------------------
263
;--- проверяем, что нажато --------------------------------
264
;----------------------------------------------------------
461 Lrz 265
        cmp     ah,8
266
        jz      .backspace
267
        cmp     ah,0xb6
268
        jz      .delete
269
        cmp     ah,176
270
        jz      .left
271
        cmp     ah,179
272
        jz      .right
273
        cmp     ah,180
274
        jz      .home
275
        cmp     ah,181
276
        jz      .end
277
        cmp     ah,185  ;insert
278
        jz      .insert
234 Lrz 279
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
280
;Заглушка на обработку клавиш вверх и вниз
461 Lrz 281
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
282
        cmp     ah,177
283
        jz      .no_figure
284
        cmp     ah,178
285
        jz      .no_figure
286
        cmp     ah,27   ;ESC - клавиша ))
287
        jz      .no_figure
234 Lrz 288
;--- нажата другая клавиша ---
461 Lrz 289
        test    word ed_flags,ed_figure_only  ; только цифры ?
290
        jz      @f
291
        cmp     ah,'0'
292
        jb      .no_figure
293
        cmp     ah,'9'
294
        ja      .no_figure
292 Lrz 295
;проверка на shift
461 Lrz 296
@@:     test    word ed_flags,ed_shift_on
297
        je      @f
298
        ;Входные данные edx=ed_size;ecx=ed_pos
299
        push    eax
300
        mov     edx,ed_size
301
        mov     ecx,ed_pos
302
        pusha
343 Lrz 303
;clear
461 Lrz 304
        mov     ebp,edx ;ed_size
305
        call    .clear_bg
306
        mov     ebp,ed_color
307
        mov     ebx,dword       ed_shift_pos
308
        call    .sh_cl_
350 Lrz 309
 
391 Lrz 310
.sh_nxt:popa
461 Lrz 311
        call    .del_char
292 Lrz 312
;;;;
461 Lrz 313
        mov     eax,dword ed_shift_pos
314
        mov     ebx,ed_size
315
        sub     ebx,eax
316
        mov     ed_size,ebx
317
        pop     eax
292 Lrz 318
        ; проверяем, находится ли курсор в конце
461 Lrz 319
@@:     mov     ecx,ed_size
320
        mov     edx, ed_max
321
        test    word ed_flags,ed_insert
322
        jne     @f
323
        cmp     ecx,edx
324
        jae     .no_figure
325
@@:     mov     ebx, ed_pos
326
        cmp     ebx,edx
327
        jl      @f ; если меньше или равно
234 Lrz 328
.no_figure:
461 Lrz 329
edit_ex
330
.insert: test   word ed_flags,ed_insert ;not    word ed_insert
292 Lrz 331
         je     .insert_1
461 Lrz 332
         and    word ed_flags,ed_insert_cl
333
        jmp     .no_figure
292 Lrz 334
.insert_1:
461 Lrz 335
        or      word ed_flags,ed_insert
336
        jmp     .no_figure
292 Lrz 337
.ins_v:
461 Lrz 338
        dec     dword [ebp+42];ed_size    ;processing is insert
339
        sub     esi,ecx
340
        add     esi,ebx
341
        mov     edi,esi
343 Lrz 342
;clear
343
pusha
461 Lrz 344
        mov     edi,ebp
345
        mov     ebp,ed_pos
346
        call    .clear_bg
343 Lrz 347
popa
461 Lrz 348
        jmp     .In_k
234 Lrz 349
@@:     ; сдвигаем символы после курсора вправо
461 Lrz 350
        mov     ecx,ed_size
351
        push    edi eax
352
        mov     ebp,edi
353
        mov     esi,ed_text     ; Указатель на буфер
354
                                ;Будем работать со строкой
355
        add     esi,ecx         ;add ed_size добавим max size
356
        mov     edi,esi
234 Lrz 357
 
461 Lrz 358
        cmp     ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
359
        je      .In_k
234 Lrz 360
 
461 Lrz 361
        test    word [ebp+40],ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
362
        jne     .ins_v
343 Lrz 363
;clear
364
pusha
461 Lrz 365
        mov     edi,ebp
366
        mov     ebp,ed_size
367
        call    .clear_bg
343 Lrz 368
popa
461 Lrz 369
        sub     ecx,ebx         ;Найдем кол-во символов для передвижения.
370
        inc     edi             ;Сместим наши символы в право
371
        std
372
        inc     ecx
373
   @@:
374
        ;--------
375
        lodsb
376
        stosb
377
        ;--------
378
        loop    @b
379
.In_k:  cld
380
        pop eax
381
        mov al,ah
382
        stosb
383
        pop edi
234 Lrz 384
; вставляем код клавиши туда, где курсор
461 Lrz 385
        ; увеличиваем значение размера и позиции
386
        inc      dword ed_size
387
        inc      dword ed_pos
388
        call    .draw_all2
389
        jmp     .shift;.draw_cursor_text
390
.delete:
391
        mov     edx,ed_size
392
        mov     ecx,ed_pos
393
        cmp     edx,ecx
394
        jg      .bac_del
395
        test    word ed_flags,ed_shift_on
396
        jne     .del_bac
397
edit_ex
398
.bac_del:
399
        call    .del_char
400
        jmp     .draw_all
234 Lrz 401
 
402
;--- нажата клавиша backspace ---
403
.backspace:
461 Lrz 404
        ; проверяем, курсор у левого края ?
405
        mov     ecx,ed_pos
406
        test    ecx,ecx
407
        jnz     .del_bac
408
        test    word ed_flags,ed_shift_on
409
        jne     .bac_del
410
 
411
edit_ex
289 Lrz 412
.del_bac:
461 Lrz 413
        mov     edx,ed_size
414
        cmp     edx,ecx ;if ed_pos=ed_size
415
        je      @f
416
        dec     ecx
417
        call    .del_char
418
@@:     test    word ed_flags,ed_shift_on
419
        jne     .bac_del
420
        dec      dword ed_pos
234 Lrz 421
.draw_all:
461 Lrz 422
        push    .shift;.draw_cursor_text;eax
289 Lrz 423
 
461 Lrz 424
        test    word ed_flags,ed_shift_on
425
        je      @f
426
        mov     eax,dword ed_shift_pos
427
        mov     ebx,ed_size
428
        sub     ebx,eax
429
        mov     ed_size,ebx
289 Lrz 430
 
461 Lrz 431
        mov     ebp,ed_color
432
        call    .clear_cursor
433
        call    .check_offset
434
        call    .draw_bg
435
        ret
436
@@:     dec      dword ed_size
289 Lrz 437
 
234 Lrz 438
.draw_all2:
461 Lrz 439
        and    word ed_flags,ed_shift_cl
440
        mov     ebp,ed_color
441
        call    .clear_cursor
442
        call    .check_offset
443
        mov     ebp,ed_size
444
        call    .clear_bg
445
        ret
234 Lrz 446
;--- нажата клавиша left ---
461 Lrz 447
.left:  mov     ebx,ed_pos
448
        test    ebx,ebx
449
        jz      .sh_st_of
450
        or      word ed_flags,ed_left_fl
451
        call    .sh_first_sh
452
        dec      dword ed_pos
453
        call    .sh_enable
454
        jmp     .draw_cursor_text
234 Lrz 455
;--- нажата клавиша right ---
461 Lrz 456
.right: mov     ebx,ed_pos
457
        cmp     ebx,ed_size
458
        je      .sh_st_of
459
        and     word ed_flags,ed_right_fl
460
        call    .sh_first_sh
461
        inc     dword  ed_pos
462
        call    .sh_enable
463
        jmp     .draw_cursor_text
391 Lrz 464
.home:
461 Lrz 465
        mov     ebx,ed_pos
466
        test    ebx,ebx
467
        jz      .sh_st_of
468
        call    .sh_first_sh
469
        xor     eax,eax
470
        mov     ed_pos,eax
471
        call    .sh_home_end
472
        jmp     .draw_cursor_text
391 Lrz 473
.end:
461 Lrz 474
        mov     ebx,ed_pos
475
        cmp     ebx,dword ed_size
476
        je      .sh_st_of
477
        call    .sh_first_sh
478
        mov     eax,ed_size
479
        mov     ed_pos,eax
480
        call    .sh_home_end
481
        jmp     .draw_cursor_text
391 Lrz 482
;Обработка Shift для снятия выделения неизвестной области
348 Lrz 483
.shift: ;;;;;;;SHIFT
461 Lrz 484
        test    word ed_flags,ed_shift
485
        je      .f_exit
343 Lrz 486
 
461 Lrz 487
@@:     mov     ebp,shift_color
488
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
489
        mov     ebx,dword       ed_shift_pos
490
        call    .sh_cl_
491
        jmp     .draw_cursor_text
348 Lrz 492
;;;;;;;;;;;;;;;;;;;;;
461 Lrz 493
.f_exit:call    .check_offset
494
        and     word ed_flags,ed_shift_cl
495
        call    .enable_null
496
        jmp     .draw_cursor_text
348 Lrz 497
.sh_cl_:
282 Lrz 498
;;;;;;SHIFT end
391 Lrz 499
;обработка очистки, при левом - правом движении выделения
348 Lrz 500
;для обработки снятия выделения
396 Lrz 501
;входные параметры ebp=color ebx=ed_shift_pos
461 Lrz 502
        mov     eax,dword       ed_pos
503
        cmp     eax,ebx
439 Lrz 504
 
461 Lrz 505
        jae     .sh_n
506
        push    eax  ;меньшее в eax
507
        push    ebx  ;большее
508
        jmp     .sh_n1
509
                     ;если иначе
510
.sh_n:  push    ebx
511
        push    eax
282 Lrz 512
.sh_n1:
461 Lrz 513
        call    .check_offset
514
        call    .get_n
515
        mov     edx,eax ;size of ed_box
516
        mov     ecx,ed_offset
517
        add     eax,ecx ;eax = w_off= ed_offset+width
518
        mov     edx,eax ;save
519
        pop     ebx     ;большее
520
        pop     eax     ;меньшее
282 Lrz 521
 
461 Lrz 522
        cmp     eax,ecx         ;сравнение с меньшего с offset.
523
        jae     .f_f            ;если больше
524
        xor     eax,eax
525
        cmp     edx,ebx         ;cравним размер w_off с большим
526
        jb      @f
527
        sub     ebx,ecx
528
        jmp     .nxt_f
529
@@:     mov     ebx,edx
530
        sub     ebx,ecx
531
        jmp     .nxt_f
532
.f_f:
533
        sub     eax,ecx
534
        cmp     edx,ebx         ;cравним размер w_off с большим
535
        jle     @f
536
        sub     ebx,ecx
537
        sub     ebx,eax
538
        jmp     .nxt_f
234 Lrz 539
@@:
461 Lrz 540
        mov     ebx,edx
541
        sub     ebx,ecx
542
        sub     ebx,eax
282 Lrz 543
.nxt_f:
461 Lrz 544
        mov     edx,ebx
545
        lea     ebx,[eax*2+eax]
546
        shl     ebx,1
547
        add     ebx,ed_left
548
        inc     ebx
549
        shl     ebx,16
550
        lea     ecx,[edx*2+edx]
551
        shl     ecx,1
552
        mov     bx,cx
553
        inc     ebx
554
        mov     edx,ebp;shift_color
348 Lrz 555
 
461 Lrz 556
        call    .draw_bg_eax
557
@@:     call    .enable_null
558
        ret
391 Lrz 559
;;;;;;;;;;;;;;;;;;;;;
560
;Установка- снятие выделения в один символ
561
;;;;;;;;;;;;;;;;;;;;;
562
.drw_sim:
461 Lrz 563
        mov     eax,dword       ed_pos
564
        call    .draw_rectangle   ;нарисовать прямоугольник с заданным цветом
391 Lrz 565
        jmp     @b
566
;;;;;;;;;;;;;;;;;;;;;
567
;Фукция установки выделения при движения влево и вправо и нажатии shift
568
;Логика:
569
;;;;;;;;;;
570
.draw_wigwag:
571
;функция установки переменных
461 Lrz 572
        mov     ebp,shift_color
573
        call    .clear_cursor
289 Lrz 574
 
461 Lrz 575
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
576
        mov     ebp,shift_color
577
        mov     eax,dword       ed_pos
578
        test    word ed_flags,ed_left_fl
579
        jz      .low
580
        jmp     @f
391 Lrz 581
;;;;;;;;;;
582
;Фукция удаления выделения при движения влево и вправо и нажатии shift
583
;Логика:
584
;;;;;;;;;;
585
.draw_wigwag_cl:
586
;функция установки переменных
461 Lrz 587
        mov     ebp,ed_color
588
        call    .clear_cursor
391 Lrz 589
 
461 Lrz 590
        mov     ebp,ed_color
591
        mov     eax,dword       ed_pos
592
        test    word ed_flags,ed_left_fl
593
        jz      .low
594
@@:     call    .draw_rectangle  ;нарисовать прямоугольник закрашиваемой области
595
        ret
596
.low:   dec     eax
597
        jmp     @b
391 Lrz 598
;входной параметр ebx - ed_pos
599
.sh_first_sh:
461 Lrz 600
        test    word ed_flags,ed_shift
601
        je      @f
602
        mov     dword ed_shift_pos_old,ebx
603
        test    word ed_flags,ed_shift_on
604
        jne     @f
605
        mov     dword ed_shift_pos,ebx
606
        or      word ed_flags,ed_shift_on
607
@@:     ret
391 Lrz 608
;Обработка крайних положений в editbox при нажатом shift
609
;производит снятие выделение, если нет shift
610
;иначе вообще выходит
611
.sh_st_of:
461 Lrz 612
        test    word ed_flags,ed_shift
613
        jne     @f
614
        test    word ed_flags,ed_shift_bac
348 Lrz 615
        je      @f
461 Lrz 616
        mov     ebp,ed_color
617
        mov     ebx,dword       ed_shift_pos
618
        call    .sh_cl_  ;очистка выделеного фрагмента
619
        and     word ed_flags,ed_shift_cl ; очистка от того что убрали выделение
620
        jmp     .draw_cursor_text
391 Lrz 621
@@:
461 Lrz 622
        and     word ed_flags,ed_shift_off
623
edit_ex
391 Lrz 624
;проверка состояния shift был ли он нажат раньше?
625
.sh_enable:
461 Lrz 626
        test    word ed_flags,ed_shift
627
        jne     .sh_ext_en ;нарисовать закрашеный прямоугольник
391 Lrz 628
 
461 Lrz 629
        test    word ed_flags,ed_shift_bac
391 Lrz 630
        je      @f
461 Lrz 631
        call    .check_offset
391 Lrz 632
 
461 Lrz 633
        mov     ebp,ed_color
634
        mov     ebx,dword       ed_shift_pos
635
        call    .sh_cl_  ;очистка выделеного фрагмента
636
        call    .draw_wigwag_cl
637
        and     word ed_flags,ed_shift_cl ; 1вар не нужно
638
        ret
391 Lrz 639
 
461 Lrz 640
@@:     mov     ebp,ed_color
641
        call    .clear_cursor
642
        call    .check_offset
643
        ret
644
.sh_ext_en:
645
        call    .check_offset
646
        test    word ed_flags,ed_offset_fl
647
        je      @f
391 Lrz 648
;Рисование закрашеных прямоугольников и очистка их
461 Lrz 649
        mov     eax,dword       ed_shift_pos
650
        mov     ebx,dword       ed_pos
651
        mov     ecx,dword       ed_shift_pos_old
391 Lrz 652
;проверка и рисование закрашеных областей
461 Lrz 653
        cmp     eax,ecx
654
        je      .1_shem
655
        jb      .smaller
656
        cmp     ecx,ebx
657
        ja      .1_shem
658
        call    .draw_wigwag_cl ;clear
659
        jmp     .sh_e_end
391 Lrz 660
.smaller:
461 Lrz 661
        cmp     ecx,ebx
662
        jb      .1_shem
663
        call    .draw_wigwag_cl ;clear
664
        jmp     .sh_e_end
391 Lrz 665
;alike  =
461 Lrz 666
.1_shem: call   .draw_wigwag
667
.sh_e_end:      and     word ed_flags,ed_shift_off
668
        ret
669
@@:     mov     ebp,shift_color
670
        mov     ebx,dword       ed_shift_pos
671
        call    .sh_cl_
672
        jmp     .sh_e_end
391 Lrz 673
;функция для обработки shift при нажатии home and end
674
.sh_home_end:
461 Lrz 675
        mov     ebp,ed_color
676
        call    .clear_cursor
677
        test    word ed_flags,ed_shift_bac
391 Lrz 678
        je      @f
461 Lrz 679
        mov     ebp,ed_color
680
        mov     ebx,dword       ed_shift_pos_old
681
        call    .sh_cl_
391 Lrz 682
 
461 Lrz 683
@@:     test    word ed_flags,ed_shift
684
        je      .sh_exit_ ;выйти
685
        mov     ebp,shift_color
686
        mov     ebx,dword       ed_shift_pos
687
        call    .sh_cl_
688
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
689
        jmp     .sh_e_end
690
.sh_exit_:      call    .check_offset
691
        ret
343 Lrz 692
;функция внесения 0 по адресу ed_size+1
693
.enable_null:
694
        pusha
461 Lrz 695
        mov     eax,ed_size
696
        mov     ebx,ed_text
468 Lrz 697
        test    eax,eax
461 Lrz 698
        add     eax,ebx
468 Lrz 699
        jne     @f
461 Lrz 700
        inc     eax
701
@@:     xor     ebx,ebx
702
        mov     [eax],bl
703
edit_ex
396 Lrz 704
;- удаление символа
705
;Входные данные edx=ed_size;ecx=ed_pos
234 Lrz 706
.del_char:
461 Lrz 707
        mov     esi,ed_text
708
        test    word ed_flags,ed_shift_on
709
        je      @f
710
        mov     eax,dword ed_shift_pos
711
        mov     ebx,esi
712
        cmp     eax,ecx
713
        jae     .dh_n
289 Lrz 714
 
461 Lrz 715
        mov     ed_pos,eax      ;что бы не было убегания курсора
716
        mov     ebp,ecx
717
        sub     ebp,eax
718
        add     ebx,eax  ;eax меньше
719
        sub     edx,ecx
720
        add     esi,ecx
234 Lrz 721
 
461 Lrz 722
        mov     dword ed_shift_pos,ebp
723
        jmp     .del_ch_sh
724
                     ;если иначе
725
.dh_n:
726
        mov     ebp,eax
727
        sub     ebp,ecx
728
        add     ebx,ecx
729
        sub     edx,eax
730
        add     esi,eax
731
        mov     dword ed_shift_pos,ebp
732
        jmp     .del_ch_sh
289 Lrz 733
 
461 Lrz 734
@@:     add     esi,ecx ;указатель + смещение к реальному буфферу
735
        mov     ebx,esi
736
        inc     esi
737
        cld
234 Lrz 738
 
461 Lrz 739
        sub     edx,ecx
289 Lrz 740
.del_ch_sh:
741
 
461 Lrz 742
        push    edi
743
        mov     edi,ebx
234 Lrz 744
@@:
461 Lrz 745
        lodsb
746
        stosb
747
        dec edx
748
        jns @b
749
 
750
        pop edi
751
        ret
343 Lrz 752
;вычислить закрашиваемую область
753
;соглашение в ebp - передается ed_size
754
.clear_bg:
461 Lrz 755
        call    .get_n  ;получить размер в символах ширины компонента
756
        push    eax
757
        mov     ebx,ed_offset
758
        add     eax,ebx ;eax = w_off= ed_offset+width
759
        mov     ebx,ebp ;ed_size
760
 
761
        cmp     eax,ebx
762
        jb      @f
763
        mov     eax,ed_pos
764
        sub     ebx,eax
765
        mov     ecx,ed_offset
766
        sub     eax,ecx
767
        jmp     .nxt
768
@@:     mov     ebx,ed_pos
769
        push    ebx
770
        sub     eax,ebx
771
        mov     ebx,eax ;It is don't optimal
772
 
773
        pop     eax     ;ed_pos
774
        mov     ecx,ed_offset
775
        sub     eax,ecx
343 Lrz 776
.nxt:
461 Lrz 777
        mov     ebp,eax  ;проверка на выход закрашиваемой области за пределы длины
778
        add     ebp,ebx
779
        pop     edx
780
        cmp     ebp,edx
781
        je      @f
782
        inc     ebx
343 Lrz 783
 
461 Lrz 784
@@:     mov     edx,ebx
785
        lea     ebx,[eax*2+eax]
786
        shl     ebx,1
787
        add     ebx,ed_left
788
        inc     ebx
789
        shl     ebx,16
790
        lea     ecx,[edx*2+edx]
791
        shl     ecx,1
792
        mov     bx,cx
793
        mov     edx,ed_color
794
        call    .draw_bg_eax
795
        ret
391 Lrz 796
;;;;;;;;;;;;;;;;;;;
797
;;; Обработка примитивов
798
;;;;;;;;;;;;;;;;;;;;
799
;Нарисовать прямоугольник, цвет передается в ebp
800
;входные параметры:
801
;eax=dword ed_pos
802
;ebp=-цвет ed_color or shift_color
803
.draw_rectangle:
461 Lrz 804
        mov     ecx,dword ed_offset
805
        sub     eax,ecx
806
        lea     ebx,[eax*2+eax]
807
        shl     ebx,1
808
        inc     ebx
809
        add     ebx,ed_left
810
        shl     ebx,16
811
        mov     bx,6
812
        mov     edx,ebp
813
        call    .draw_bg_eax
814
        ret
404 Lrz 815
;;;;;;;;;;;;;;;;;;
816
;;Проверка нажат ли shift
817
;;;;;;;;;;;;;;;;;;
818
.check_shift:
819
pusha   ;сохраним все регистры
461 Lrz 820
        mcall   66,3,1
821
        test    al,0x03
822
        je      @f
404 Lrz 823
        or      word ed_flags,ed_shift   ;установим флаг
461 Lrz 824
@@:edit_ex
234 Lrz 825
;==========================================================
826
;=== обработка мыши =======================================
827
;==========================================================
828
.mouse:
829
pusha
461 Lrz 830
;debug
234 Lrz 831
;----------------------------------------------------------
832
;--- получаем состояние кнопок мыши -----------------------
461 Lrz 833
;----------------------------------------------------------
834
        mcall   37,2
234 Lrz 835
;----------------------------------------------------------
836
;--- проверяем состояние ----------------------------------
837
;----------------------------------------------------------
461 Lrz 838
        test    eax,1
839
        jnz     .mouse_left_button
840
        and     word ed_flags,ed_mouse_on_off
841
        xor     ebx,ebx
842
        mov     dword [mouse_flag],ebx
843
edit_ex
844
.mouse_left_button:
449 Lrz 845
;----------------------------------------------------------
461 Lrz 846
;--- блокировка от фокусировки в других боксах при попадании на них курсора
449 Lrz 847
;----------------------------------------------------------
461 Lrz 848
        mov     eax,dword [mouse_flag]
849
        test    eax,eax
850
        jz      @f
851
        cmp     eax,edi
852
        je      @f
853
        jmp     ._blur
234 Lrz 854
;----------------------------------------------------------
449 Lrz 855
;--- получаем координаты мыши относительно 0 т.е всей области экрана
856
;----------------------------------------------------------
468 Lrz 857
@@:     mcall   37,0
234 Lrz 858
;----------------------------------------------------------
449 Lrz 859
;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны?
860
;----------------------------------------------------------
461 Lrz 861
        mov     ecx,structure_of_potock
862
        test    word ed_flags,ed_mouse_on
863
        jne     .mouse_wigwag
449 Lrz 864
;----------------------------------------------------------
234 Lrz 865
;--- проверяем, попадает ли курсор в edit box -------------
866
;----------------------------------------------------------
461 Lrz 867
        mov     ebx,dword [ecx+38]
868
        add     ebx,ed_top
468 Lrz 869
if scr_h eq
870
else
871
        add     ebx,scr_h
872
end if
461 Lrz 873
        cmp     ax,bx
874
        jl      ._blur;.mouse_end_no_focus
234 Lrz 875
 
461 Lrz 876
        add     ebx,ed_height
877
        cmp     ax,bx
878
        jg      ._blur;.mouse_end_no_focus
234 Lrz 879
 
461 Lrz 880
        shr     eax,16
234 Lrz 881
 
461 Lrz 882
        mov     ebx,dword [ecx+34]
883
        add     ebx,ed_left
468 Lrz 884
if scr_w eq
885
else
886
        add     ebx,scr_w
887
end if
461 Lrz 888
        cmp     ax,bx
889
        jl      ._blur;.mouse_end_no_focus
234 Lrz 890
 
461 Lrz 891
        add     ebx,ed_width
892
        cmp     ax,bx
893
        jg      ._blur;.mouse_end_no_focus
234 Lrz 894
;--- изменяем позицию курсора ---
461 Lrz 895
        push    eax
896
        mov     ebp,ed_color
897
        call    .clear_cursor
898
        pop     eax
449 Lrz 899
._mvpos:
461 Lrz 900
        mov     ecx,structure_of_potock
901
        mov     ebx,dword [ecx+34]
902
        xor     edx,edx
903
        sub     eax,ed_left
904
        sub     eax,ebx
468 Lrz 905
if scr_w eq
906
else
907
        add     ebx,scr_w
908
        sub     eax,2
909
end if
461 Lrz 910
        mov     ebx,6
911
        div     bx
912
        add     eax,ed_offset
913
        cmp     eax,ed_size
914
        jna     ._mshift
915
        mov     eax,ed_size
449 Lrz 916
._mshift:
404 Lrz 917
;;;;;;;
918
;;Секция обработки shift и выделения по shift
919
;;;;;;;
920
        test    word ed_flags,ed_shift_bac
402 Lrz 921
        je      @f
461 Lrz 922
        mov     ebp,dword       ed_color
923
        mov     ebx,dword ed_shift_pos
924
        push    eax
925
        call    .sh_cl_
926
        and     word ed_flags,ed_shift_bac_cl
927
        pop     eax
439 Lrz 928
@@:
461 Lrz 929
        test    word ed_flags,ed_mouse_on
930
        jne     @f
439 Lrz 931
 
461 Lrz 932
        mov     dword ed_shift_pos,eax
933
        or      word  ed_flags,ed_mouse_on
934
        mov     dword ed_pos,eax
935
        mov     dword [mouse_flag],edi          ;установим идентификатор
936
        bts     word ed_flags,1                 ;установка фокуса
937
        jmp     .m_sh
938
@@:
939
        cmp     eax,dword ed_shift_pos  ;если позиции не изменились
940
        je      .mouse_ex
941
        mov     ed_pos,eax
942
        mov     ebp,dword shift_color
943
        mov     ebx,dword ed_shift_pos
944
        call    .sh_cl_
945
        or      word ed_flags,ed_mous_adn_b     ;установим бит что мы выделили +shift_on +
946
.m_sh:  call    .draw_text
947
        call    .draw_cursor
292 Lrz 948
;----------------------------------------------------------
949
;--- процедура установки фокуса ---------------------------
950
;----------------------------------------------------------
461 Lrz 951
        jmp     .drc
234 Lrz 952
._blur:
461 Lrz 953
        test    word ed_flags,ed_always_focus
954
        jne     .mouse_ex
955
        btr     word ed_flags,1 ; если не в фокусе, выходим
956
        jnc     .mouse_ex
402 Lrz 957
 
461 Lrz 958
        mov     ebp,ed_color
959
        call    .clear_cursor
960
.drc:   call    .draw_border
449 Lrz 961
.mouse_ex:
962
 
461 Lrz 963
edit_ex
234 Lrz 964
;----------------------------------------------------------
965
;--- процедура размывания фокуса --------------------------
966
;----------------------------------------------------------
967
;.blur:
968
;pusha
969
;._blur:
461 Lrz 970
        ;btr     ed_flags,1
971
        ;jnc     @f
972
        ;call    .draw_border
973
        ;call    .clear_cursor
234 Lrz 974
;@@:
461 Lrz 975
;edit_ex
976
 
977
;----------------------------------------------------------
978
;--- Обработка .mouse_wigwag
979
;----------------------------------------------------------
980
.mouse_wigwag:
981
        shr     eax,16
463 Lrz 982
        or      word ed_flags,ed_shift_bac+ed_shift_on+ed_shift
461 Lrz 983
;;;;;;;;;;;;;;;;;;
984
;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox
985
;;;;;;;;;;;;;;;;;;
986
        mov     ecx,structure_of_potock
987
        mov     ebx,dword [ecx+34]
988
        add     ebx,ed_left
468 Lrz 989
if scr_w eq
990
else
991
        add     ebx,scr_w
992
end if
993
        cmp     eax,ebx
994
        jb      .mleft
461 Lrz 995
 
468 Lrz 996
        add     ebx,ed_width
997
        cmp     eax,ebx
998
        ja      .mright
461 Lrz 999
 
468 Lrz 1000
        sub     ebx,ed_width
461 Lrz 1001
 
1002
        xor     edx,edx
1003
        sub     eax,ebx ; вычтим из координат мышки по оси х координаты до editbox по оси х
1004
        mov     ebx,6
1005
        div     ebx
1006
;;;;;;;;;;;;;;;;;;
1007
;;процедура обработки положения выделенного текста, в пределах области editbox
1008
;;;;;;;;;;;;;;;;;;
1009
;Получили координаты в eax мышки, т.е. куда она переместилась
1010
;Рисование закрашеных прямоугольников и очистка их
468 Lrz 1011
        add     eax,ed_offset   ;добавим смещение
1012
        cmp     eax,dword ed_size       ;если вышли за пределы, то ничего не делать
1013
        ja      .mwigvag
461 Lrz 1014
.mdraw:
1015
        mov     dword   ed_pos,eax ;сохраним новое значение
1016
;Рисование закрашеных прямоугольников и очистка их
468 Lrz 1017
        mov     ecx,dword       ed_shift_pos
461 Lrz 1018
        mov     ebx,dword       ed_shift_pos_old
1019
        mov     dword   ed_shift_pos_old,eax    ;внесем новое значение старой позиции курсора
1020
;проверка и рисование закрашеных областей
1021
        cmp     ecx,ebx         ;выясняем куда было движение на один шаг назад
1022
        je      .m1_shem        ;движения не было ранее
1023
        jb      .msmaller       ;движение было ->
1024
        cmp     ebx,eax         ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит
1025
        ja      .m1_shem        ;если было движение <- то нужно закрасить область
468 Lrz 1026
        je      .mwigvag        ;если изменения не было, то ничего не делать
461 Lrz 1027
        mov     ebp,ed_color    ;тут нужно очистить область c ed_pos ed_shift_pos_old
1028
;входные параметры ebp=color ebx=ed_shift_pos
1029
        call    .sh_cl_
1030
        jmp     .mwigvag
1031
.msmaller:
1032
        cmp     ebx,eax
1033
        jb      .m1_shem
1034
        mov     ebp,ed_color
1035
;входные параметры ebp=color ebx=ed_shift_pos
1036
        call    .sh_cl_
1037
        jmp     .mwigvag
1038
;alike  =
1039
.m1_shem:
1040
        mov     ebp,shift_color
1041
;входные параметры ebp=color ebx=ed_shift_pos
468 Lrz 1042
        mov     ebx,ecx
461 Lrz 1043
        call    .sh_cl_
1044
        jmp     .mwigvag
1045
.mwigvag:
1046
        and     word ed_flags,ed_shift_mcl
468 Lrz 1047
        jmp     .draw_cursor_text
461 Lrz 1048
;       popa
1049
;       ret
1050
.mleft:
468 Lrz 1051
        mov     eax,ed_pos
1052
        cmp     eax,0
1053
        jbe      .mwigvag
1054
        dec     eax
1055
        call    .check_offset
1056
        push    eax
1057
        mov     ebx,ed_shift_pos
1058
        mov     ebp,shift_color
1059
        call    .sh_cl_
1060
        pop     eax
1061
        jmp     .mdraw
461 Lrz 1062
.mright:
468 Lrz 1063
        mov     eax,ed_pos
1064
        mov     ebx,ed_size
1065
        cmp     eax,ebx
1066
        jae     .mwigvag
1067
        inc     eax
1068
        call    .check_offset
1069
        mov     ebx,ed_shift_pos
1070
        mov     ebp,shift_color
1071
        push    eax
1072
        call    .sh_cl_
1073
        pop     eax
1074
        jmp     .mdraw
461 Lrz 1075
 
234 Lrz 1076
}
396 Lrz 1077
ed_figure_only= 1000000000000000b   ;одни символы
391 Lrz 1078
ed_always_focus= 100000000000000b
396 Lrz 1079
ed_focus=                     10b   ;фокус приложения
391 Lrz 1080
ed_shift_on=                1000b   ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift
439 Lrz 1081
ed_shift_on_off=1111111111110111b
391 Lrz 1082
ed_shift=                    100b   ;включается при нажатии на shift т.е. если нажимаю
1083
ed_shift_off=   1111111111111011b
1084
ed_shift_bac=              10000b   ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение
404 Lrz 1085
ed_shift_bac_cl=1111111111101111b   ;очистка при удалении выделения
391 Lrz 1086
ed_shift_cl=    1111111111100011b
463 Lrz 1087
ed_shift_mcl=   1111111111111011b
391 Lrz 1088
ed_left_fl=               100000b
1089
ed_right_fl=    1111111111011111b
396 Lrz 1090
ed_offset_fl=            1000000b
1091
ed_offset_cl=   1111111110111111b
391 Lrz 1092
ed_insert=              10000000b
1093
ed_insert_cl=   1111111101111111b
439 Lrz 1094
ed_mouse_on =          100000000b
446 Lrz 1095
ed_mous_adn_b=         100011000b
439 Lrz 1096
ed_mouse_on_off=1111111011111111b
391 Lrz 1097
ed_height=14 ; высота
468 Lrz 1098
macro draw_edit_boxes start,_end,use_f9,structure_of_potock
234 Lrz 1099
{
468 Lrz 1100
if use_f9 eq
1101
else
1102
        mcall   9,structure_of_potock,-1
1103
end if
461 Lrz 1104
        mov     edi,start
468 Lrz 1105
        mov     ecx,((_end-start)/ed_struc_size)
234 Lrz 1106
@@:
461 Lrz 1107
        call    edit_box.draw
1108
        add     edi,ed_struc_size
1109
        loop    @b
234 Lrz 1110
}
1111
 
468 Lrz 1112
macro mouse_edit_boxes start,_end
234 Lrz 1113
{
461 Lrz 1114
        mov     edi,start
468 Lrz 1115
        mov     ecx,((_end-start)/ed_struc_size)
234 Lrz 1116
@@:
461 Lrz 1117
        call    edit_box.mouse
1118
        add     edi,ed_struc_size
1119
        loop    @b
234 Lrz 1120
}
1121
 
1122
macro key_edit_boxes start,end
1123
{
461 Lrz 1124
        mov     edi,start
1125
        mov     ecx,((end-start)/ed_struc_size)
234 Lrz 1126
@@:
461 Lrz 1127
        call    edit_box.key
1128
        add     edi,ed_struc_size
1129
        loop    @b
234 Lrz 1130
}
461 Lrz 1131
ed_struc_size=70
1132
struc  edit_box width,left,top,color,shift_color,focus_border_color,\
1133
       blur_border_color,text_color,max,text,flags,size,pos
234 Lrz 1134
{
1135
.width dd width
1136
.left dd left
1137
.top dd top
1138
.color dd color
461 Lrz 1139
.shift_color dd shift_color
234 Lrz 1140
.focus_border_color dd focus_border_color
1141
.blur_border_color dd blur_border_color
1142
.text_color dd text_color
1143
.max dd max
282 Lrz 1144
.text dd text
1145
.flags dw flags+0
403 Lrz 1146
.size dd size+0
461 Lrz 1147
.pos dd pos+0
234 Lrz 1148
.offset dd 0
1149
.cl_curs_x dd 0
1150
.cl_curs_y dd 0
391 Lrz 1151
.shift   dd 0
1152
.shift_old   dd 0
234 Lrz 1153
}
1154
 
402 Lrz 1155
 
234 Lrz 1156
macro edit_boxes_set_sys_color start,end,color_table
1157
{
461 Lrz 1158
        mov     edi,start
1159
        mov     ecx,((end-start)/ed_struc_size)
1160
        mov     esi,color_table
234 Lrz 1161
@@:
461 Lrz 1162
        mov     eax,[esi+36]
1163
        mov     ebx,[esi+20]
1164
        mov     ed_focus_border_color,eax
1165
        shr     bh,1
1166
        shr     bl,1
1167
        shr     ah,1
1168
        shr     al,1
1169
        add     ah,bh
1170
        add     al,bl
1171
        ror     eax,16
1172
        ror     ebx,16
1173
        shr     bl,1
1174
        shr     al,1
1175
        add     al,bl
1176
        ror     eax,16
1177
        mov     ed_blur_border_color,eax
1178
        add     edi,ed_struc_size
1179
        loop    @b
306 Lrz 1180
}
1181
 
468 Lrz 1182
macro draw_edit_box ed_ptr,use_f9,structure_of_potock
306 Lrz 1183
{
468 Lrz 1184
if use_f9 eq
1185
else
1186
        mcall   9,structure_of_potock,-1
1187
end if
306 Lrz 1188
        mov     edi,ed_ptr
1189
        call    edit_box.draw
1190
}
1191
 
1192
macro mouse_edit_box ed_ptr
1193
{
1194
        mov     edi,ed_ptr
1195
        call    edit_box.mouse
1196
}
1197
 
1198
macro key_edit_box ed_ptr
1199
{
1200
        mov     edi,ed_ptr
1201
        call    edit_box.key
468 Lrz 1202
}
1203
macro default_box ed_ptr
1204
{
1205
pusha
1206
;	xor	eax,eax
1207
;	mov 	ed_shift_pos,eax
1208
;	mov	ed_shift_pos_old,eax
1209
	and	word ed_flags,ed_shift_cl
1210
;	mov	ed_offset,eax
1211
popa
234 Lrz 1212
}