Subversion Repositories Kolibri OS

Rev

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

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