Subversion Repositories Kolibri OS

Rev

Rev 645 | Rev 1031 | 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
}
590
macro use_key_no_process  up,down,esc
591
{
592
if up eq
593
else
594
        cmp     ah,177
507 Lrz 595
        jz      .editbox_exit
483 Lrz 596
end if
597
if down eq
598
else
599
        cmp     ah,178
507 Lrz 600
        jz      .editbox_exit
483 Lrz 601
end if
602
if esc eq
603
else
604
        cmp     ah,27   ;ESC - клавиша ))
507 Lrz 605
        jz      .editbox_exit
483 Lrz 606
end if
607
}
608
 
609
macro use_key_figures_only
610
{
611
        test    word ed_flags,ed_figure_only  ; только цифры ?
612
        jz      @f
613
        cmp     ah,'0'
507 Lrz 614
        jb      .editbox_exit
483 Lrz 615
        cmp     ah,'9'
507 Lrz 616
        ja      .editbox_exit
617
@@:
483 Lrz 618
}
507 Lrz 619
macro are_key_shift_press
620
{
621
        test    word ed_flags,ed_shift_on
622
        je      @f
623
        ;Входные данные edx=ed_size;ecx=ed_pos
624
        push    eax
625
        mov     edx,ed_size
583 Lrz 626
        mov     ecx, ed_pos
507 Lrz 627
        pusha
628
;;;;;;;;;;;;;;;;;;;;;
583 Lrz 629
;clear input arrea
507 Lrz 630
        mov     ebp,ed_color
631
        mov     ebx,dword       ed_shift_pos
632
        call    .sh_cl_
583 Lrz 633
        mov     ebp,ed_size
634
        call    .clear_bg
507 Lrz 635
;;;;;;;;;;;;;;;;;;;;;
636
        popa
637
        call    .del_char
638
;;;;
639
        mov     eax,dword ed_shift_pos
640
        mov     ebx,ed_size
641
        sub     ebx,eax
642
        mov     ed_size,ebx
643
        pop     eax
644
@@:
645
}
646
macro are_key_cur_end
647
{
648
        mov     ecx,ed_size
649
        mov     edx, ed_max
650
        test    word ed_flags,ed_insert
651
        jne     @f
652
        cmp     ecx,edx
653
        jae     .editbox_exit
654
@@:     mov     ebx, ed_pos
655
        cmp     ebx,edx
656
        jl      @f ; если меньше или равно
657
        jmp     .editbox_exit
483 Lrz 658
 
507 Lrz 659
@@:     ; сдвигаем символы после курсора вправо
660
        mov     ecx,ed_size
661
        push    edi eax
662
        mov     ebp,edi
663
        mov     esi,ed_text     ; Указатель на буфер
664
                                ;Будем работать со строкой
665
        add     esi,ecx         ;add ed_size добавим max size
666
        mov     edi,esi
483 Lrz 667
 
507 Lrz 668
        cmp     ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
669
        je      .In_k
483 Lrz 670
 
507 Lrz 671
        test    word [ebp+40],ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
672
        jne     .ins_v
673
;clear
674
pusha
675
        mov     edi,ebp
676
        mov     ebp,ed_size
677
        call    .clear_bg
678
popa
679
        sub     ecx,ebx         ;Найдем кол-во символов для передвижения.
680
        inc     edi             ;Сместим наши символы в право
681
        std
682
        inc     ecx
683
   @@:
684
        ;--------
685
        lodsb
686
        stosb
687
        ;--------
688
        loop    @b
689
.In_k:  cld
690
        pop eax
691
        mov al,ah
692
        stosb
693
        pop edi
694
; вставляем код клавиши туда, где курсор
695
        ; увеличиваем значение размера и позиции
696
        inc      dword ed_size
697
        inc      dword ed_pos
698
        call    .draw_all2
699
        jmp     .shift
700
}
701
macro use_work_key
702
{
703
.insert: test   word ed_flags,ed_insert ;not    word ed_insert
704
         je     @f
705
         and    word ed_flags,ed_insert_cl
706
        jmp     .editbox_exit
707
@@:
708
        or      word ed_flags,ed_insert
709
        jmp     .editbox_exit
710
.ins_v:
711
        dec     dword [ebp+42];ed_size    ;processing is insert
712
        sub     esi,ecx
713
        add     esi,ebx
714
        mov     edi,esi
715
;clear
716
pusha
717
        mov     edi,ebp
718
        mov     ebp,ed_pos
719
        call    .clear_bg
720
popa
721
        jmp     .In_k
722
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
723
.delete:
724
        mov     edx,ed_size
725
        mov     ecx,ed_pos
726
        cmp     edx,ecx
727
        jg      .bac_del
728
        test    word ed_flags,ed_shift_on
729
        jne     .del_bac
730
edit_ex
731
.bac_del:
732
        call    .del_char
733
        jmp     .draw_all
734
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
735
;--- нажата клавиша backspace ---
736
.backspace:
737
        ; проверяем, курсор у левого края ?
738
        mov     ecx,ed_pos
739
        test    ecx,ecx
740
        jnz     .del_bac
741
        test    word ed_flags,ed_shift_on
742
        jne     .bac_del
483 Lrz 743
 
507 Lrz 744
edit_ex
745
.del_bac:
746
        mov     edx,ed_size
747
        cmp     edx,ecx ;if ed_pos=ed_size
748
        je      @f
749
        dec     ecx
750
        call    .del_char
751
@@:     test    word ed_flags,ed_shift_on
752
        jne     .bac_del
753
        dec      dword ed_pos
754
.draw_all:
755
        push    .shift;.draw_cursor_text;eax
483 Lrz 756
 
507 Lrz 757
        test    word ed_flags,ed_shift_on
758
        je      @f
759
        mov     eax,dword ed_shift_pos
760
        mov     ebx,ed_size
761
        sub     ebx,eax
762
        mov     ed_size,ebx
483 Lrz 763
 
507 Lrz 764
        mov     ebp,ed_color
765
        call    .clear_cursor
766
        call    .check_offset
767
        call    .draw_bg
768
        ret
769
@@:     dec      dword ed_size
483 Lrz 770
 
507 Lrz 771
.draw_all2:
772
        and    word ed_flags,ed_shift_cl
773
        mov     ebp,ed_color
774
        call    .clear_cursor
775
        call    .check_offset
776
        mov     ebp,ed_size
777
        call    .clear_bg
778
        ret
779
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
780
;--- нажата клавиша left ---
781
.left:  mov     ebx,ed_pos
782
        test    ebx,ebx
783
        jz      .sh_st_of
784
        or      word ed_flags,ed_left_fl
785
        call    .sh_first_sh
786
        dec      dword ed_pos
787
        call    .sh_enable
788
        jmp     .draw_cursor_text
789
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
790
;--- нажата клавиша right ---
791
.right: mov     ebx,ed_pos
792
        cmp     ebx,ed_size
793
        je      .sh_st_of
794
        and     word ed_flags,ed_right_fl
795
        call    .sh_first_sh
796
        inc     dword  ed_pos
797
        call    .sh_enable
798
        jmp     .draw_cursor_text
799
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
800
.home:
801
        mov     ebx,ed_pos
802
        test    ebx,ebx
803
        jz      .sh_st_of
804
        call    .sh_first_sh
805
        xor     eax,eax
806
        mov     ed_pos,eax
807
        call    .sh_home_end
808
        jmp     .draw_cursor_text
809
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
810
.end:
811
        mov     ebx,ed_pos
812
        cmp     ebx,dword ed_size
813
        je      .sh_st_of
814
        call    .sh_first_sh
815
        mov     eax,ed_size
816
        mov     ed_pos,eax
817
        call    .sh_home_end
818
        jmp     .draw_cursor_text
819
}
820
 
830 Lrz 821
macro use_mouse_func
507 Lrz 822
{
823
;----------------------------------------------------------
824
;--- Обработка .mouse_wigwag
825
;----------------------------------------------------------
826
.mouse_wigwag:
827
        shr     eax,16
828
        or      word ed_flags,ed_shift_bac+ed_shift_on+ed_shift
829
;;;;;;;;;;;;;;;;;;
830
;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox
831
;;;;;;;;;;;;;;;;;;
830 Lrz 832
        test    ax,0x8000
833
        jnz     .mleft
834
 
835
        mov     ebx,ed_left
507 Lrz 836
        cmp     eax,ebx
837
        jb      .mleft
838
 
839
        add     ebx,ed_width
840
        cmp     eax,ebx
841
        ja      .mright
842
 
843
        sub     ebx,ed_width
844
 
845
        xor     edx,edx
846
        sub     eax,ebx ; вычтим из координат мышки по оси х координаты до editbox по оси х
847
        mov     ebx,6
848
        div     ebx
849
;;;;;;;;;;;;;;;;;;
850
;;процедура обработки положения выделенного текста, в пределах области editbox
851
;;;;;;;;;;;;;;;;;;
852
;Получили координаты в eax мышки, т.е. куда она переместилась
853
;Рисование закрашеных прямоугольников и очистка их
854
        add     eax,ed_offset   ;добавим смещение
855
        cmp     eax,dword ed_size       ;если вышли за пределы, то ничего не делать
856
        ja      .mwigvag
857
.mdraw:
858
        mov     dword   ed_pos,eax ;сохраним новое значение
859
;Рисование закрашеных прямоугольников и очистка их
860
        mov     ecx,dword       ed_shift_pos
861
        mov     ebx,dword       ed_shift_pos_old
862
        mov     dword   ed_shift_pos_old,eax    ;внесем новое значение старой позиции курсора
863
;проверка и рисование закрашеных областей
864
        cmp     ecx,ebx         ;выясняем куда было движение на один шаг назад
865
        je      .m1_shem        ;движения не было ранее
866
        jb      .msmaller       ;движение было ->
867
        cmp     ebx,eax         ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит
868
        ja      .m1_shem        ;если было движение <- то нужно закрасить область
869
        je      .mwigvag        ;если изменения не было, то ничего не делать
870
        mov     ebp,ed_color    ;тут нужно очистить область c ed_pos ed_shift_pos_old
871
;входные параметры ebp=color ebx=ed_shift_pos
872
        call    .sh_cl_
873
        jmp     .mwigvag
874
.msmaller:
875
        cmp     ebx,eax
876
        jb      .m1_shem
877
        mov     ebp,ed_color
878
;входные параметры ebp=color ebx=ed_shift_pos
879
        call    .sh_cl_
880
        jmp     .mwigvag
881
;alike  =
882
.m1_shem:
883
        mov     ebp,shift_color
884
;входные параметры ebp=color ebx=ed_shift_pos
885
        mov     ebx,ecx
886
        call    .sh_cl_
887
        jmp     .mwigvag
888
.mwigvag:
889
        and     word ed_flags,ed_shift_mcl
890
        jmp     .draw_cursor_text
891
;       popa
892
;       ret
893
.mleft:
830 Lrz 894
 
507 Lrz 895
        mov     eax,ed_pos
896
        cmp     eax,0
897
        jbe      .mwigvag
898
        dec     eax
899
        call    .check_offset
900
        push    eax
901
        mov     ebx,ed_shift_pos
902
        mov     ebp,shift_color
903
        call    .sh_cl_
904
        pop     eax
905
        jmp     .mdraw
906
.mright:
907
        mov     eax,ed_pos
908
        mov     ebx,ed_size
909
        cmp     eax,ebx
910
        jae     .mwigvag
911
        inc     eax
912
        call    .check_offset
913
        mov     ebx,ed_shift_pos
914
        mov     ebp,shift_color
915
        push    eax
916
        call    .sh_cl_
917
        pop     eax
918
        jmp     .mdraw
919
}
920
 
830 Lrz 921
macro use_work_mouse
507 Lrz 922
;----------------------------------------------------------
923
;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны?
924
;----------------------------------------------------------
925
{
926
        test    word ed_flags,ed_mouse_on
927
        jne     .mouse_wigwag
928
;----------------------------------------------------------
929
;--- проверяем, попадает ли курсор в edit box -------------
930
;----------------------------------------------------------
830 Lrz 931
 
932
        mov     ebx,ed_top
507 Lrz 933
        cmp     ax,bx
934
        jl      ._blur;.mouse_end_no_focus
830 Lrz 935
 
507 Lrz 936
        add     ebx,ed_height
937
        cmp     ax,bx
938
        jg      ._blur;.mouse_end_no_focus
939
 
940
        shr     eax,16
941
 
830 Lrz 942
        mov     ebx,ed_left
507 Lrz 943
        cmp     ax,bx
944
        jl      ._blur;.mouse_end_no_focus
945
 
946
        add     ebx,ed_width
830 Lrz 947
 
507 Lrz 948
        cmp     ax,bx
830 Lrz 949
        jg      ._blur;.mouse_end_no_focus
950
 
507 Lrz 951
;--- изменяем позицию курсора ---
952
        push    eax
953
        mov     ebp,ed_color
954
        call    .clear_cursor
955
        pop     eax
956
._mvpos:
830 Lrz 957
 
507 Lrz 958
        xor     edx,edx
959
        sub     eax,ed_left
830 Lrz 960
 
507 Lrz 961
        mov     ebx,6
962
        div     bx
963
        add     eax,ed_offset
964
        cmp     eax,ed_size
965
        jna     ._mshift
966
        mov     eax,ed_size
967
._mshift:
968
;;;;;;;
969
;;Секция обработки shift и выделения по shift
970
;;;;;;;
971
        test    word ed_flags,ed_shift_bac
972
        je      @f
973
        mov     ebp,dword       ed_color
974
        mov     ebx,dword ed_shift_pos
975
        push    eax
976
        call    .sh_cl_
977
        and     word ed_flags,ed_shift_bac_cl
978
        pop     eax
979
@@:
980
        test    word ed_flags,ed_mouse_on
981
        jne     @f
982
 
983
        mov     dword ed_shift_pos,eax
984
        or      word  ed_flags,ed_mouse_on
985
        mov     dword ed_pos,eax
986
        mov     dword [mouse_flag],edi          ;установим идентификатор
987
        bts     word ed_flags,1                 ;установка фокуса
988
        jmp     .m_sh
989
@@:
990
        cmp     eax,dword ed_shift_pos  ;если позиции не изменились
991
        je      .editbox_exit
992
        mov     ed_pos,eax
993
        mov     ebp,dword shift_color
994
        mov     ebx,dword ed_shift_pos
995
        call    .sh_cl_
996
        or      word ed_flags,ed_mous_adn_b     ;установим бит что мы выделили +shift_on +
997
.m_sh:  call    .draw_text
998
        call    .draw_cursor
999
;----------------------------------------------------------
1000
;--- процедура установки фокуса ---------------------------
1001
;----------------------------------------------------------
1002
        jmp     .drc
1003
._blur:
1004
        test    word ed_flags,ed_always_focus
1005
        jne     .editbox_exit
1006
        btr     word ed_flags,1 ; если не в фокусе, выходим
1007
        jnc     .editbox_exit
1008
 
1009
        mov     ebp,ed_color
1010
        call    .clear_cursor
1011
.drc:   call    .draw_border
1012
        jmp     .editbox_exit
1013
}
1014
 
1015
 
461 Lrz 1016
; Макрос выхода
1017
macro edit_ex
1018
{
830 Lrz 1019
popad
461 Lrz 1020
ret
1021
}
1022
macro debug
1023
{
1024
        ;-----------  отладка
1025
        pushad
1026
;        mov     dword [ed_buffer.2],0
1027
;        mov     eax,edi
1028
        mov eax,dword [ed_buffer.2]
1029
        mov edi,ed_buffer.3
1030
        call .str
1031
        ;рисование фона
1032
        mov eax,13
1033
        mov ebx,178*65536+70
1034
        mov ecx,28*65536+10
1035
        xor edx,edx
1036
        int 0x40
1037
        ;вывод значения на экран
1038
        mov eax,4
1039
        mov ebx,180*65536+30
1040
        mov ecx,0x10DDBBCC
1041
        mov edx,ed_buffer.3
1042
        mov esi,8
1043
        int 0x40
1044
        popad
1045
        ;----------- отладка
1046
}
1047
macro   debug_func
1048
{
1049
.str:
1050
        mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
1051
         ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1052
        cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
1053
        jb @f
1054
        xor edx,edx  ;очистить edx
1055
        div ecx      ;разделить - остаток в edx
1056
        push edx     ;положить в стек
1057
        ;dec edi             ;смещение необходимое для записи с конца строки
1058
        call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1059
        pop eax
1060
        @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
1061
        ;sbb al,$69  ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
1062
        ;das        ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
1063
        or al,0x30  ;данная команда короче  чем две выше
1064
        stosb       ;записать элемент из регистра al в ячеку памяти es:edi
1065
 
1066
        ret         ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
583 Lrz 1067
}
1068
 
1069
;;;;;;;;;;;;;;;
1070
;For LibGui
1071
;;;;;;;;;;;;;;;
1072
macro srt_ed_libgui
1073
{
1074
ed_width        equ [EditBox.ed_width]            ;ширина компонента
1075
ed_left         equ [EditBox.ed_left]             ;положение по оси х
1076
ed_top          equ [EditBox.ed_top]              ;положение по оси у
1077
ed_color        equ [EditBox.ed_color]            ;цвет фона компонента
1078
shift_color     equ [EditBox.shift_color]         ;=0x6a9480
1079
ed_focus_border_color   equ [EditBox.ed_focus_border_color]   ;цвет рамки компонента
1080
ed_blur_border_color    equ [EditBox.ed_blur_border_color]    ;цвет не активного компонента
1081
ed_text_color   equ [EditBox.ed_text_color]       ;цвет текста
1082
ed_max          equ [EditBox.ed_max]              ;кол-во символов которые можно максимально ввести
1083
ed_text         equ [EditBox.ed_text]             ;указатель на буфер
1084
ed_flags        equ [EditBox.ed_flags]            ;флаги
1085
ed_size equ [EditBox.ed_size]                     ;кол-во символов
1086
ed_pos  equ [EditBox.ed_poz]                      ;позиция курсора
1087
ed_offset       equ [EditBox.ed_offset]           ;смещение
1088
cl_curs_x       equ [EditBox.cl_curs_x]           ;предыдущее координата курсора по х
1089
cl_curs_y       equ [EditBox.cl_curs_y]           ;предыдущее координата курсора по у
1090
ed_shift_pos    equ [EditBox.ed_shift_pos]        ;положение курсора
1091
ed_shift_pos_old equ [EditBox.ed_shift_pos_old]   ;старое положение курсора
1092
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1093
;Bit mask from editbox
1094
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1095
ed_figure_only= 1000000000000000b   ;одни символы
1096
ed_always_focus= 100000000000000b
1097
ed_focus=                     10b   ;фокус приложения
1098
ed_shift_on=                1000b   ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift
1099
ed_shift_on_off=1111111111110111b
1100
ed_shift=                    100b   ;включается при нажатии на shift т.е. если нажимаю
1101
ed_shift_off=   1111111111111011b
1102
ed_shift_bac=              10000b   ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение
1103
ed_shift_bac_cl=1111111111101111b   ;очистка при удалении выделения
1104
ed_shift_cl=    1111111111100011b
1105
ed_shift_mcl=   1111111111111011b
1106
ed_left_fl=               100000b
1107
ed_right_fl=    1111111111011111b
1108
ed_offset_fl=            1000000b
1109
ed_offset_cl=   1111111110111111b
1110
ed_insert=              10000000b
1111
ed_insert_cl=   1111111101111111b
1112
ed_mouse_on =          100000000b
1113
ed_mous_adn_b=         100011000b
1114
ed_mouse_on_off=1111111011111111b
1115
ed_height=14 ; высота
461 Lrz 1116
}