Subversion Repositories Kolibri OS

Rev

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