Subversion Repositories Kolibri OS

Rev

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

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