Subversion Repositories Kolibri OS

Rev

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