Subversion Repositories Kolibri OS

Rev

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