Subversion Repositories Kolibri OS

Rev

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

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