Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
806 Lrz 1
;Макрос для вывода основных функций которые испльзуются боксом
2
macro use_general_func
3
{
4
;debug_func
5
;----------------------------------------------------------
6
;--- процедура прорисовки выделеной части -----------------
7
;----------------------------------------------------------
8
edit_box.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    edit_box_key.sh_cl_
14
@@:     ret
15
;----------------------------------------------------------
16
;--- процедура прорисовки текста --------------------------
17
;----------------------------------------------------------
18
edit_box.draw_text:
19
;--- вычисляем, сколько помещается символов ---
20
;--- чтобы мусор не рисовать ---
21
        call    edit_box.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
34
        add     ebx,ed_top
35
        mov     ecx,ed_text_color
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
edit_box.draw_bg:
48
        mov     ebx,ed_left
49
        add     ebx,1
50
        mov     edx,ed_color
51
        shl     ebx,16
52
        add     ebx,ed_width
53
        sub     ebx,1
54
edit_box.draw_bg_eax:
55
        mov     ecx,ed_top
56
        mov     eax,13
57
        add     ecx,1
58
        shl     ecx,16
59
        add     ecx,ed_height
60
        dec     ecx
61
        mcall
62
ret
63
;----------------------------------------------------------
64
;--- процедура получения количества символов в текущей щирине компонента
65
;----------------------------------------------------------
66
edit_box.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
edit_box.clear_cursor:
78
        mov     edx,ebp
79
        mov     ebx,cl_curs_x
80
        mov     ecx,cl_curs_y
81
        jmp     edit_box.draw_curs
82
edit_box.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
91
        add     ebx,ed_left
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
102
        add     ecx,ed_height-4
103
 
104
        mov     cl_curs_x,ebx
105
        mov     cl_curs_y,ecx
106
edit_box.draw_curs:
107
        mcall   38
108
ret
109
;----------------------------------------------------------
110
;--- процедура рисования рамки ----------------------------
111
;----------------------------------------------------------
112
edit_box.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
125
        add     ebx,ed_width
126
        mov     ecx,ed_top
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
141
        sub     ebx,ed_width
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
edit_box.check_offset:
830 Lrz 157
pushad
806 Lrz 158
        mov     ecx,ed_pos
159
        mov     ebx,ed_offset
160
        cmp     ebx,ecx
161
        ja      edit_box.sub_8
162
 
163
        push    ebx
164
        call    edit_box.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      edit_box.add_end
175
 
176
        sub     edx,ecx
177
        cmp     edx,8
178
        jbe     edit_box.add_8
179
        add     ebx,8
180
        jmp     edit_box.chk_d
181
 
182
edit_box.sub_8: cmp     ecx,0
183
        je      edit_box.sub_min
184
        cmp     ebx,8
185
        jbe     edit_box.sub_min
186
        sub     ebx,8   ;ebx=ed_offset
187
        jmp     edit_box.chk_d
188
edit_box.sub_min:
189
        xor     ebx,ebx
190
        jmp     edit_box.chk_d
191
 
192
edit_box.add_end:sub    edx,eax
193
        mov     ebx,edx
194
        jmp     edit_box.chk_d
195
edit_box.add_8: add     ebx,edx
196
edit_box.chk_d: mov     ed_offset,ebx
197
        call    edit_box.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
edit_box_key.shift: ;;;;;;;SHIFT
209
        test    word ed_flags,ed_shift
210
        je      edit_box_key.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    edit_box_key.sh_cl_
216
        jmp     edit_box.draw_cursor_text
217
;;;;;;;;;;;;;;;;;;;;;
218
edit_box_key.f_exit:    call   edit_box.check_offset
219
        and     word ed_flags,ed_shift_cl
220
        call    edit_box_key.enable_null
221
        jmp     edit_box.draw_cursor_text
222
edit_box_key.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     edit_box_key.sh_n
231
        push    eax  ;меньшее в eax
232
        push    ebx  ;большее
233
        jmp     edit_box_key.sh_n1
234
                     ;если иначе
235
edit_box_key.sh_n:  push    ebx
236
        push    eax
237
edit_box_key.sh_n1:
238
        call    edit_box.check_offset
239
        call    edit_box.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     edit_box_key.f_f            ;если больше
249
        xor     eax,eax
250
        cmp     edx,ebx         ;cравним размер w_off с большим
251
        jb      @f
252
        sub     ebx,ecx
253
        jmp     edit_box_key.nxt_f
254
@@:     mov     ebx,edx
255
        sub     ebx,ecx
256
        jmp     edit_box_key.nxt_f
257
edit_box_key.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     edit_box_key.nxt_f
264
@@:
265
        mov     ebx,edx
266
        sub     ebx,ecx
267
        sub     ebx,eax
268
edit_box_key.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    edit_box.draw_bg_eax
282
@@:     call    edit_box_key.enable_null
283
        ret
284
;;;;;;;;;;;;;;;;;;;;;
285
;Установка- снятие выделения в один символ
286
;;;;;;;;;;;;;;;;;;;;;
287
edit_box_key.drw_sim:
288
        mov     eax,dword       ed_pos
289
        call    edit_box_key.draw_rectangle   ;нарисовать прямоугольник с заданным цветом
290
        jmp     @b
291
;;;;;;;;;;;;;;;;;;;;;
292
;Фукция установки выделения при движения влево и вправо и нажатии shift
293
;Логика:
294
;;;;;;;;;;
295
edit_box_key.draw_wigwag:
296
;функция установки переменных
297
        mov     ebp,shift_color
298
        call    edit_box.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      edit_box_key.low
305
        jmp     @f
306
;;;;;;;;;;
307
;Фукция удаления выделения при движения влево и вправо и нажатии shift
308
;Логика:
309
;;;;;;;;;;
310
edit_box_key.draw_wigwag_cl:
311
;функция установки переменных
312
        mov     ebp,ed_color
313
        call    edit_box.clear_cursor
314
 
315
        mov     ebp,ed_color
316
        mov     eax,dword       ed_pos
317
        test    word ed_flags,ed_left_fl
318
        jz      edit_box_key.low
319
@@:     call    edit_box_key.draw_rectangle  ;нарисовать прямоугольник закрашиваемой области
320
        ret
321
edit_box_key.low:   dec     eax
322
        jmp     @b
323
;входной параметр ebx - ed_pos
324
edit_box_key.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
edit_box_key.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    edit_box_key.sh_cl_  ;очистка выделеного фрагмента
344
        and     word ed_flags,ed_shift_cl ; очистка от того что убрали выделение
345
        jmp     edit_box.draw_cursor_text
346
@@:
347
        and     word ed_flags,ed_shift_off
348
edit_ex
349
;проверка состояния shift был ли он нажат раньше?
350
edit_box_key.sh_enable:
351
        test    word ed_flags,ed_shift
352
        jne     edit_box_key.sh_ext_en ;нарисовать закрашеный прямоугольник
353
 
354
        test    word ed_flags,ed_shift_bac
355
        je      @f
356
        call    edit_box.check_offset
357
 
358
        mov     ebp,ed_color
359
        mov     ebx,dword       ed_shift_pos
360
        call    edit_box_key.sh_cl_  ;очистка выделеного фрагмента
361
        call    edit_box_key.draw_wigwag_cl
362
        and     word ed_flags,ed_shift_cl ; 1вар не нужно
363
        ret
364
 
365
@@:     mov     ebp,ed_color
366
        call    edit_box.clear_cursor
367
        call    edit_box.check_offset
368
        ret
369
edit_box_key.sh_ext_en:
370
        call    edit_box.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      edit_box_key.1_shem
380
        jb      edit_box_key.smaller
381
        cmp     ecx,ebx
382
        ja      edit_box_key.1_shem
383
        call    edit_box_key.draw_wigwag_cl ;clear
384
        jmp     edit_box_key.sh_e_end
385
edit_box_key.smaller:
386
        cmp     ecx,ebx
387
        jb      edit_box_key.1_shem
388
        call    edit_box_key.draw_wigwag_cl ;clear
389
        jmp     edit_box_key.sh_e_end
390
;alike  =
391
edit_box_key.1_shem:        call   edit_box_key.draw_wigwag
392
edit_box_key.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    edit_box_key.sh_cl_
397
        jmp     edit_box_key.sh_e_end
398
;функция для обработки shift при нажатии home and end
399
edit_box_key.sh_home_end:
400
        mov     ebp,ed_color
401
        call    edit_box.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    edit_box_key.sh_cl_
407
 
408
@@:     test    word ed_flags,ed_shift
409
        je      edit_box_key.sh_exit_ ;выйти
410
        mov     ebp,shift_color
411
        mov     ebx,dword       ed_shift_pos
412
        call    edit_box_key.sh_cl_
413
        or      word ed_flags,ed_shift_bac ;установка флага, выделенной области
414
        jmp     edit_box_key.sh_e_end
415
edit_box_key.sh_exit_:      call    edit_box.check_offset
416
        ret
417
;функция внесения 0 по адресу ed_size+1
418
edit_box_key.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
edit_box_key.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     edit_box_key.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     edit_box_key.del_ch_sh
449
                     ;если иначе
450
edit_box_key.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     edit_box_key.del_ch_sh
458
 
459
@@:     add     esi,ecx ;указатель + смещение к реальному буфферу
460
        mov     ebx,esi
461
        inc     esi
462
        cld
463
 
464
        sub     edx,ecx
465
edit_box_key.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
edit_box_key.clear_bg:
480
        call    edit_box.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     edit_box_key.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
edit_box_key.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    edit_box.draw_bg_eax
520
        ret
521
;;;;;;;;;;;;;;;;;;;
522
;;; Обработка примитивов
523
;;;;;;;;;;;;;;;;;;;;
524
;Нарисовать прямоугольник, цвет передается в ebp
525
;входные параметры:
526
;eax=dword ed_pos
527
;ebp=-цвет ed_color or shift_color
528
edit_box_key.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
536
        add     ebx,6
537
        mov     edx,ebp
538
        call    edit_box.draw_bg_eax
539
        ret
540
;;;;;;;;;;;;;;;;;;
541
;;Проверка нажат ли shift
542
;;;;;;;;;;;;;;;;;;
543
edit_box_key.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      edit_box_key.backspace
558
end if
559
if delete eq
560
else
561
        cmp     ah,0xb6
562
        jz      edit_box_key.delete
563
end if
564
if left eq
565
else
566
        cmp     ah,176
567
        jz      edit_box_key.left
568
end if
569
if right eq
570
else
571
        cmp     ah,179
572
        jz      edit_box_key.right
573
end if
574
if home eq
575
else
576
        cmp     ah,180
577
        jz      edit_box_key.home
578
end if
579
if home eq
580
else
581
        cmp     ah,181
582
        jz      edit_box_key.end
583
end if
584
if insert eq
585
else
586
        cmp     ah,185  ;insert
587
        jz      edit_box_key.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
595
        jz      edit_box.editbox_exit
596
end if
597
if down eq
598
else
599
        cmp     ah,178
600
        jz      edit_box.editbox_exit
601
end if
602
if esc eq
603
else
604
        cmp     ah,27   ;ESC - клавиша ))
605
        jz      edit_box.editbox_exit
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'
614
        jb      edit_box.editbox_exit
615
        cmp     ah,'9'
616
        ja      edit_box.editbox_exit
617
@@:
618
}
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
626
        mov     ecx, ed_pos
627
        pusha
628
;;;;;;;;;;;;;;;;;;;;;
629
;clear input arrea
630
        mov     ebp,ed_color
631
        mov     ebx,dword       ed_shift_pos
632
        call    edit_box_key.sh_cl_
633
        mov     ebp,ed_size
634
        call    edit_box_key.clear_bg
635
;;;;;;;;;;;;;;;;;;;;;
636
        popa
637
        call    edit_box_key.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     edit_box.editbox_exit
654
@@:     mov     ebx, ed_pos
655
        cmp     ebx,edx
656
        jl      @f ; если меньше или равно
657
        jmp     edit_box.editbox_exit
658
 
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
667
 
668
        cmp     ecx,ebx         ;Если у нас позиция курсора = текущему размеру напечатанных символов т.е. курсор стоит в конце
669
        je      edit_box_key.In_k
670
 
671
        test    word [ebp+40],ed_insert ;IF insert is enable  т.к. edi изменен адресуем через ebp
672
        jne     edit_box_key.ins_v
673
;clear
674
pusha
675
        mov     edi,ebp
676
        mov     ebp,ed_size
677
        call    edit_box_key.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
edit_box_key.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    edit_box_key.draw_all2
699
        jmp     edit_box_key.shift
700
}
701
macro use_work_key
702
{
703
edit_box_key.insert: test   word ed_flags,ed_insert ;not    word ed_insert
704
         je     @f
705
         and    word ed_flags,ed_insert_cl
706
 
707
        jmp     edit_box.editbox_exit
708
@@:
709
        or      word ed_flags,ed_insert
710
        jmp     edit_box.editbox_exit
711
edit_box_key.ins_v:
712
        dec     dword [ebp+42];ed_size    ;processing is insert
713
        sub     esi,ecx
714
        add     esi,ebx
715
        mov     edi,esi
716
;clear
717
pusha
718
        mov     edi,ebp
719
        mov     ebp,ed_pos
720
        call    edit_box_key.clear_bg
721
popa
722
        jmp     edit_box_key.In_k
723
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
724
edit_box_key.delete:
725
        mov     edx,ed_size
726
        mov     ecx,ed_pos
727
        cmp     edx,ecx
728
        jg      edit_box_key.bac_del
729
        test    word ed_flags,ed_shift_on
730
        jne     edit_box_key.del_bac
731
edit_ex
732
edit_box_key.bac_del:
733
        call    edit_box_key.del_char
734
        jmp     edit_box_key.draw_all
735
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
736
;--- нажата клавиша backspace ---
737
edit_box_key.backspace:
738
        ; проверяем, курсор у левого края ?
739
        mov     ecx,ed_pos
740
        test    ecx,ecx
741
        jnz     edit_box_key.del_bac
742
        test    word ed_flags,ed_shift_on
743
        jne     edit_box_key.bac_del
744
 
745
edit_ex
746
edit_box_key.del_bac:
747
        mov     edx,ed_size
748
        cmp     edx,ecx ;if ed_pos=ed_size
749
        je      @f
750
        dec     ecx
751
        call    edit_box_key.del_char
752
@@:     test    word ed_flags,ed_shift_on
753
        jne     edit_box_key.bac_del
754
        dec      dword ed_pos
755
edit_box_key.draw_all:
756
        push    edit_box_key.shift;.draw_cursor_text;eax
757
 
758
        test    word ed_flags,ed_shift_on
759
        je      @f
760
        mov     eax,dword ed_shift_pos
761
        mov     ebx,ed_size
762
        sub     ebx,eax
763
        mov     ed_size,ebx
764
 
765
        mov     ebp,ed_color
766
        call    edit_box.clear_cursor
767
        call    edit_box.check_offset
768
        call    edit_box.draw_bg
769
        ret
770
@@:     dec      dword ed_size
771
 
772
edit_box_key.draw_all2:
773
        and    word ed_flags,ed_shift_cl
774
        mov     ebp,ed_color
775
        call    edit_box.clear_cursor
776
        call    edit_box.check_offset
777
        mov     ebp,ed_size
778
        call    edit_box_key.clear_bg
779
        ret
780
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
781
;--- нажата клавиша left ---
782
edit_box_key.left:  mov     ebx,ed_pos
783
        test    ebx,ebx
784
        jz      edit_box_key.sh_st_of
785
        or      word ed_flags,ed_left_fl
786
        call    edit_box_key.sh_first_sh
787
        dec      dword ed_pos
788
        call    edit_box_key.sh_enable
789
        jmp     edit_box.draw_cursor_text
790
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
791
;--- нажата клавиша right ---
792
edit_box_key.right: mov     ebx,ed_pos
793
        cmp     ebx,ed_size
794
        je      edit_box_key.sh_st_of
795
        and     word ed_flags,ed_right_fl
796
        call    edit_box_key.sh_first_sh
797
        inc     dword  ed_pos
798
        call    edit_box_key.sh_enable
799
        jmp     edit_box.draw_cursor_text
800
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
801
edit_box_key.home:
802
        mov     ebx,ed_pos
803
        test    ebx,ebx
804
        jz      edit_box_key.sh_st_of
805
        call    edit_box_key.sh_first_sh
806
        xor     eax,eax
807
        mov     ed_pos,eax
808
        call    edit_box_key.sh_home_end
809
        jmp     edit_box.draw_cursor_text
810
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
811
edit_box_key.end:
812
        mov     ebx,ed_pos
813
        cmp     ebx,dword ed_size
814
        je      edit_box_key.sh_st_of
815
        call    edit_box_key.sh_first_sh
816
        mov     eax,ed_size
817
        mov     ed_pos,eax
818
        call    edit_box_key.sh_home_end
819
        jmp     edit_box.draw_cursor_text
820
}
821
 
822
macro use_mouse_func
823
{
824
;----------------------------------------------------------
825
;--- Обработка .mouse_wigwag
826
;----------------------------------------------------------
827
edit_box_mouse.mouse_wigwag:
828
        shr     eax,16
829
        or      word ed_flags,ed_shift_bac+ed_shift_on+ed_shift
830
;;;;;;;;;;;;;;;;;;
831
;;процедура обработки положения выделенного текста, когда происходит выход за пределы editbox
832
;;;;;;;;;;;;;;;;;;
830 Lrz 833
        test    ax,0x8000
834
        jnz     edit_box_mouse.mleft
806 Lrz 835
 
830 Lrz 836
        mov     ebx,ed_left
806 Lrz 837
        cmp     eax,ebx
838
        jb      edit_box_mouse.mleft
839
 
840
        add     ebx,ed_width
841
        cmp     eax,ebx
842
        ja      edit_box_mouse.mright
843
 
844
        sub     ebx,ed_width
845
 
846
        xor     edx,edx
847
        sub     eax,ebx ; вычтим из координат мышки по оси х координаты до editbox по оси х
848
        mov     ebx,6
849
        div     ebx
850
;;;;;;;;;;;;;;;;;;
851
;;процедура обработки положения выделенного текста, в пределах области editbox
852
;;;;;;;;;;;;;;;;;;
853
;Получили координаты в eax мышки, т.е. куда она переместилась
854
;Рисование закрашеных прямоугольников и очистка их
855
        add     eax,ed_offset   ;добавим смещение
856
        cmp     eax,dword ed_size       ;если вышли за пределы, то ничего не делать
857
        ja      edit_box_mouse.mwigvag
858
edit_box_mouse.mdraw:
859
        mov     dword   ed_pos,eax ;сохраним новое значение
860
;Рисование закрашеных прямоугольников и очистка их
861
        mov     ecx,dword       ed_shift_pos
862
        mov     ebx,dword       ed_shift_pos_old
863
        mov     dword   ed_shift_pos_old,eax    ;внесем новое значение старой позиции курсора
864
;проверка и рисование закрашеных областей
865
        cmp     ecx,ebx         ;выясняем куда было движение на один шаг назад
866
        je      edit_box_mouse.m1_shem        ;движения не было ранее
867
        jb      edit_box_mouse.msmaller       ;движение было ->
868
        cmp     ebx,eax         ;движение было до этого <- и тут мы проверяем сейчас куда движение происходит
869
        ja      edit_box_mouse.m1_shem        ;если было движение <- то нужно закрасить область
870
        je      edit_box_mouse.mwigvag        ;если изменения не было, то ничего не делать
871
        mov     ebp,ed_color    ;тут нужно очистить область c ed_pos ed_shift_pos_old
872
;входные параметры ebp=color ebx=ed_shift_pos
873
        call    edit_box_key.sh_cl_
874
        jmp     edit_box_mouse.mwigvag
875
edit_box_mouse.msmaller:
876
        cmp     ebx,eax
877
        jb      edit_box_mouse.m1_shem
878
        mov     ebp,ed_color
879
;входные параметры ebp=color ebx=ed_shift_pos
880
        call    edit_box_key.sh_cl_
881
        jmp     edit_box_mouse.mwigvag
882
;alike  =
883
edit_box_mouse.m1_shem:
884
        mov     ebp,shift_color
885
;входные параметры ebp=color ebx=ed_shift_pos
886
        mov     ebx,ecx
887
        call    edit_box_key.sh_cl_
888
        jmp     edit_box_mouse.mwigvag
889
edit_box_mouse.mwigvag:
890
        and     word ed_flags,ed_shift_mcl
891
        jmp     edit_box.draw_cursor_text
892
;       popa
893
;       ret
894
edit_box_mouse.mleft:
895
        mov     eax,ed_pos
896
        cmp     eax,0
897
        jbe      edit_box_mouse.mwigvag
898
        dec     eax
899
        call    edit_box.check_offset
900
        push    eax
901
        mov     ebx,ed_shift_pos
902
        mov     ebp,shift_color
903
        call    edit_box_key.sh_cl_
904
        pop     eax
905
        jmp     edit_box_mouse.mdraw
906
edit_box_mouse.mright:
907
        mov     eax,ed_pos
908
        mov     ebx,ed_size
909
        cmp     eax,ebx
910
        jae     edit_box_mouse.mwigvag
911
        inc     eax
912
        call    edit_box.check_offset
913
        mov     ebx,ed_shift_pos
914
        mov     ebp,shift_color
915
        push    eax
916
        call    edit_box_key.sh_cl_
917
        pop     eax
918
        jmp     edit_box_mouse.mdraw
919
}
920
 
921
macro use_work_mouse
922
;----------------------------------------------------------
923
;--- А не удерживаем ли мы клавишу мышки, перемещая курсор, во все разные стороны?
924
;----------------------------------------------------------
925
{
926
        test    word ed_flags,ed_mouse_on
927
        jne     edit_box_mouse.mouse_wigwag
928
;----------------------------------------------------------
929
;--- проверяем, попадает ли курсор в edit box -------------
930
;----------------------------------------------------------
830 Lrz 931
        mov     ebx,ed_top
806 Lrz 932
        cmp     ax,bx
933
        jl      edit_box_mouse._blur;.mouse_end_no_focus
830 Lrz 934
 
806 Lrz 935
        add     ebx,ed_height
936
        cmp     ax,bx
937
        jg      edit_box_mouse._blur;.mouse_end_no_focus
938
 
939
        shr     eax,16
940
 
830 Lrz 941
        mov     ebx,ed_left
806 Lrz 942
        cmp     ax,bx
943
        jl      edit_box_mouse._blur;.mouse_end_no_focus
944
 
945
        add     ebx,ed_width
830 Lrz 946
 
806 Lrz 947
        cmp     ax,bx
830 Lrz 948
        jg      edit_box_mouse._blur;.mouse_end_no_focus
949
 
806 Lrz 950
;--- изменяем позицию курсора ---
951
        push    eax
952
        mov     ebp,ed_color
953
        call    edit_box.clear_cursor
954
        pop     eax
955
edit_box_mouse._mvpos:
956
        xor     edx,edx
957
        sub     eax,ed_left
830 Lrz 958
 
806 Lrz 959
        mov     ebx,6
960
        div     bx
961
        add     eax,ed_offset
962
        cmp     eax,ed_size
963
        jna     edit_box_mouse._mshift
964
        mov     eax,ed_size
830 Lrz 965
 
806 Lrz 966
edit_box_mouse._mshift:
967
;;;;;;;
968
;;Секция обработки shift и выделения по shift
969
;;;;;;;
970
        test    word ed_flags,ed_shift_bac
971
        je      @f
972
        mov     ebp,dword       ed_color
973
        mov     ebx,dword ed_shift_pos
974
        push    eax
975
        call    edit_box_key.sh_cl_
976
        and     word ed_flags,ed_shift_bac_cl
977
        pop     eax
978
@@:
979
        test    word ed_flags,ed_mouse_on
980
        jne     @f
981
 
982
        mov     dword ed_shift_pos,eax
983
        or      word  ed_flags,ed_mouse_on
984
        mov     dword ed_pos,eax
985
        mov     dword [mouse_flag],edi          ;установим идентификатор
986
        bts     word ed_flags,1                 ;установка фокуса
987
        jmp     edit_box_mouse.m_sh
988
@@:
989
        cmp     eax,dword ed_shift_pos  ;если позиции не изменились
990
        je      edit_box.editbox_exit
991
        mov     ed_pos,eax
992
        mov     ebp,dword shift_color
993
        mov     ebx,dword ed_shift_pos
994
        call    edit_box_key.sh_cl_
995
        or      word ed_flags,ed_mous_adn_b     ;установим бит что мы выделили +shift_on +
996
edit_box_mouse.m_sh:  call    edit_box.draw_text
997
        call    edit_box.draw_cursor
998
;----------------------------------------------------------
999
;--- процедура установки фокуса ---------------------------
1000
;----------------------------------------------------------
1001
        jmp     edit_box_mouse.drc
1002
edit_box_mouse._blur:
1003
        test    word ed_flags,ed_always_focus
1004
        jne     edit_box.editbox_exit
1005
        btr     word ed_flags,1 ; если не в фокусе, выходим
1006
        jnc     edit_box.editbox_exit
1007
 
1008
        mov     ebp,ed_color
1009
        call    edit_box.clear_cursor
1010
edit_box_mouse.drc:   call    edit_box.draw_border
1011
        jmp     edit_box.editbox_exit
1012
}
1013
 
1014
 
1015
; Макрос выхода
1016
macro edit_ex
1017
{
830 Lrz 1018
popad
806 Lrz 1019
ret
1020
}
1021
macro debug
1022
{
1023
        ;-----------  отладка
1024
        pushad
1025
;        mov     dword [ed_buffer.2],0
1026
;        mov     eax,edi
1027
        mov eax,dword [ed_buffer.2]
1028
        mov edi,ed_buffer.3
1029
        call .str
1030
        ;рисование фона
1031
        mov eax,13
1032
        mov ebx,178*65536+70
1033
        mov ecx,28*65536+10
1034
        xor edx,edx
1035
        int 0x40
1036
        ;вывод значения на экран
1037
        mov eax,4
1038
        mov ebx,180*65536+30
1039
        mov ecx,0x10DDBBCC
1040
        mov edx,ed_buffer.3
1041
        mov esi,8
1042
        int 0x40
1043
        popad
1044
        ;----------- отладка
1045
}
1046
macro   debug_func
1047
{
1048
.str:
1049
        mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
1050
         ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
1051
        cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
1052
        jb @f
1053
        xor edx,edx  ;очистить edx
1054
        div ecx      ;разделить - остаток в edx
1055
        push edx     ;положить в стек
1056
        ;dec edi             ;смещение необходимое для записи с конца строки
1057
        call .str;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
1058
        pop eax
1059
        @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
1060
        ;sbb al,$69  ;- честно данная инструкция меня заставляет задуматься т.е. я не знаю как это работает
1061
        ;das        ;после данной команды как бы происходит уменьшение al на 66h  (в книге написано другое)
1062
        or al,0x30  ;данная команда короче  чем две выше
1063
        stosb       ;записать элемент из регистра al в ячеку памяти es:edi
1064
 
1065
        ret         ;вернуться чень интересный ход т.к. пока в стеке храниться кол-во вызовов то столько раз мы и будем вызываться
1066
}
1067
 
1068
;;;;;;;;;;;;;;;
1069
;For LibGui
1070
;;;;;;;;;;;;;;;
1071
macro srt_ed_libgui
1072
{
1073
ed_width        equ [EditBox.ed_width]            ;ширина компонента
1074
ed_left         equ [EditBox.ed_left]             ;положение по оси х
1075
ed_top          equ [EditBox.ed_top]              ;положение по оси у
1076
ed_color        equ [EditBox.ed_color]            ;цвет фона компонента
1077
shift_color     equ [EditBox.shift_color]         ;=0x6a9480
1078
ed_focus_border_color   equ [EditBox.ed_focus_border_color]   ;цвет рамки компонента
1079
ed_blur_border_color    equ [EditBox.ed_blur_border_color]    ;цвет не активного компонента
1080
ed_text_color   equ [EditBox.ed_text_color]       ;цвет текста
1081
ed_max          equ [EditBox.ed_max]              ;кол-во символов которые можно максимально ввести
1082
ed_text         equ [EditBox.ed_text]             ;указатель на буфер
1083
ed_flags        equ [EditBox.ed_flags]            ;флаги
1084
ed_size equ [EditBox.ed_size]                     ;кол-во символов
1085
ed_pos  equ [EditBox.ed_poz]                      ;позиция курсора
1086
ed_offset       equ [EditBox.ed_offset]           ;смещение
1087
cl_curs_x       equ [EditBox.cl_curs_x]           ;предыдущее координата курсора по х
1088
cl_curs_y       equ [EditBox.cl_curs_y]           ;предыдущее координата курсора по у
1089
ed_shift_pos    equ [EditBox.ed_shift_pos]        ;положение курсора
1090
ed_shift_pos_old equ [EditBox.ed_shift_pos_old]   ;старое положение курсора
1091
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1092
;Bit mask from editbox
1093
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1094
ed_figure_only= 1000000000000000b   ;одни символы
1095
ed_always_focus= 100000000000000b
1096
ed_focus=                     10b   ;фокус приложения
1097
ed_shift_on=                1000b   ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift
1098
ed_shift_on_off=1111111111110111b
1099
ed_shift=                    100b   ;включается при нажатии на shift т.е. если нажимаю
1100
ed_shift_off=   1111111111111011b
1101
ed_shift_bac=              10000b   ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение
1102
ed_shift_bac_cl=1111111111101111b   ;очистка при удалении выделения
1103
ed_shift_cl=    1111111111100011b
1104
ed_shift_mcl=   1111111111111011b
1105
ed_left_fl=               100000b
1106
ed_right_fl=    1111111111011111b
1107
ed_offset_fl=            1000000b
1108
ed_offset_cl=   1111111110111111b
1109
ed_insert=              10000000b
1110
ed_insert_cl=   1111111101111111b
1111
ed_mouse_on =          100000000b
1112
ed_mous_adn_b=         100011000b
1113
ed_mouse_on_off=1111111011111111b
1114
ed_height=24 ; высота
1115
}
1116
 
1117
ed_struc_size=72
1118
struc  edit_box width,left,top,color,shift_color,focus_border_color,\
1119
       blur_border_color,text_color,max,text,flags,size,pos
1120
{
1121
.width dd width
1122
.left dd left
1123
.top dd top
1124
.color dd color
1125
.shift_color dd shift_color
1126
.focus_border_color dd focus_border_color
1127
.blur_border_color dd blur_border_color
1128
.text_color dd text_color
1129
.max dd max
1130
.text dd text
1131
.flags dd flags+0
1132
.size dd size+0
1133
.pos dd pos+0
1134
.offset dd 0
1135
.cl_curs_x dd 0
1136
.cl_curs_y dd 0
1137
.shift   dd 0
1138
.shift_old   dd 0
1139
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1140
;Bit mask from editbox
1141
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1142
ed_figure_only= 1000000000000000b   ;одни символы
1143
ed_always_focus= 100000000000000b
1144
ed_focus=                     10b   ;фокус приложения
1145
ed_shift_on=                1000b   ;если не установлен -значит впервые нажат shift,если был установлен, значит мы уже что - то делали удерживая shift
1146
ed_shift_on_off=1111111111110111b
1147
ed_shift=                    100b   ;включается при нажатии на shift т.е. если нажимаю
1148
ed_shift_off=   1111111111111011b
1149
ed_shift_bac=              10000b   ;бит для очистки выделеного shift т.е. при установке говорит что есть выделение
1150
ed_shift_bac_cl=1111111111101111b   ;очистка при удалении выделения
1151
ed_shift_cl=    1111111111100011b
1152
ed_shift_mcl=   1111111111111011b
1153
ed_left_fl=               100000b
1154
ed_right_fl=    1111111111011111b
1155
ed_offset_fl=            1000000b
1156
ed_offset_cl=   1111111110111111b
1157
ed_insert=              10000000b
1158
ed_insert_cl=   1111111101111111b
1159
ed_mouse_on =          100000000b
1160
ed_mous_adn_b=         100011000b
1161
ed_mouse_on_off=1111111011111111b
1162
ed_height=14 ; высота
1163
 
1164
}