Subversion Repositories Kolibri OS

Rev

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