Subversion Repositories Kolibri OS

Rev

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

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