Subversion Repositories Kolibri OS

Rev

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

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