Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
6972 IgorA 1
; элемент TreeList для библиотеки box_lib.obj
5911 IgorA 2
; на код применена GPL2 лицензия
6972 IgorA 3
; последняя модификация 12.09.2017 IgorA
1277 IgorA 4
 
5
 
6972 IgorA 6
struct TreeNode
7
	type dw ? ;+ 0 тип элемента, или индекс иконки для узла
8
	level db ? ;+ 2 уровень элемента
9
	close db ? ;+ 3 флаг закрытия, или открытия (имеет смысл для родительского узла)
10
	perv dd ? ;+ 4 индекс предыдущего элемента
11
	next dd ? ;+ 8 индекс последующего элемента
12
	t_create dd ? ;+12 врем. создания
13
	t_delete dd ? ;+16 врем. удаления
14
ends
1277 IgorA 15
 
5879 IgorA 16
 
5911 IgorA 17
;выделние памяти для структур списка и основной информации (конструктор)
6972 IgorA 18
align 16
5879 IgorA 19
proc tl_data_init uses eax ecx edi, tlist:dword
6972 IgorA 20
	mov edi,[tlist]
1277 IgorA 21
 
5879 IgorA 22
	xor ecx,ecx
23
	mov cx,tl_info_size
24
	imul ecx,tl_info_max_count
25
	invoke mem.alloc,ecx
5911 IgorA 26
	mov tl_data_info,eax ;копируем указатель на полученую память в структуру
27
	mov tl_data_img,0  ;обнуляем указатель 'data_img'
28
	mov tl_data_img_sys,0 ;обнуляем указатель 'data_img_sys'
1277 IgorA 29
 
6972 IgorA 30
	mov ecx,sizeof.TreeNode
5879 IgorA 31
	imul ecx,tl_info_max_count
32
	invoke mem.alloc,ecx
5911 IgorA 33
	mov tl_data_nodes,eax ;копируем указатель на полученую память в структуру
1277 IgorA 34
 
5879 IgorA 35
	stdcall tl_info_clear, edi
1277 IgorA 36
 
5911 IgorA 37
	;настройки дочернего скроллинга
38
	cmp tl_p_scroll,0
5879 IgorA 39
	je @f
5911 IgorA 40
		mov eax,tl_p_scroll
41
		;*** цветовые настройки ***
5879 IgorA 42
		mov ecx,tl_col_bkg
43
		mov dword[eax+sb_offs_bckg_col],ecx
44
		mov ecx,tl_col_zag
45
		mov dword[eax+sb_offs_frnt_col],ecx
46
		mov ecx,tl_col_txt
47
		mov dword[eax+sb_offs_line_col],ecx
5911 IgorA 48
		;*** настройки размеров ***
5879 IgorA 49
		mov ecx,tl_box_left
50
		add ecx,tl_box_width
51
		mov word[eax+2],cx
52
		mov ecx,tl_box_height
53
		mov word[eax+4],cx
54
		mov ecx,tl_box_top
55
		mov word[eax+6],cx
56
	@@:
57
	ret
58
endp
1277 IgorA 59
 
5911 IgorA 60
;очистка памяти элемента (деструктор)
1277 IgorA 61
align 4
5948 IgorA 62
proc tl_data_clear uses eax edi, tlist:dword
6972 IgorA 63
	mov edi,[tlist]
1464 IgorA 64
	cmp tl_data_img,0
65
	je @f
5911 IgorA 66
		invoke mem.free,tl_data_img ;чистка системных иконок
1464 IgorA 67
	@@:
68
	cmp tl_data_img_sys,0
69
	je @f
5911 IgorA 70
		invoke mem.free,tl_data_img_sys ;чистка системных иконок
1464 IgorA 71
	@@:
5879 IgorA 72
	invoke mem.free,tl_data_info
1489 IgorA 73
	invoke mem.free,tl_data_nodes
1464 IgorA 74
	ret
75
endp
1277 IgorA 76
 
5911 IgorA 77
;очистка списка (информации)
1277 IgorA 78
align 4
5879 IgorA 79
proc tl_info_clear uses eax ecx edi, tlist:dword
6972 IgorA 80
	mov edi,[tlist]
5879 IgorA 81
	mov tl_ch_tim,0
82
	mov tl_tim_undo,0
83
	mov tl_cur_pos,0
6972 IgorA 84
	mov ecx,sizeof.TreeNode
5879 IgorA 85
	imul ecx,tl_info_max_count
86
	mov eax,tl_data_nodes
87
	@@:
5911 IgorA 88
		mov byte[eax],0 ;чистим узлы 0-ми
5879 IgorA 89
		inc eax
90
		loop @b
5911 IgorA 91
	mov eax,tl_data_nodes ;указатель на 0-й узел
6972 IgorA 92
	mov dword[eax+TreeNode.next],1 ;указатель next в 0-м узле приравниваем к 1
1303 IgorA 93
 
5911 IgorA 94
	cmp tl_p_scroll,0 ;обработка скроллинга
5879 IgorA 95
	je @f
5911 IgorA 96
		mov eax,tl_p_scroll
5879 IgorA 97
		mov dword[eax+sb_offs_position],0
98
		call tb_scrol_resize
99
	@@:
100
	ret
101
endp
1277 IgorA 102
 
5911 IgorA 103
;реакция на клавиатуру
1277 IgorA 104
align 4
5879 IgorA 105
proc tl_key uses ebx ecx edi, tlist:dword
6972 IgorA 106
	mov edi,[tlist]
1277 IgorA 107
 
5879 IgorA 108
	mov ebx,tl_el_focus
6972 IgorA 109
	cmp [ebx],edi
5911 IgorA 110
	jne .no_focus ;элемент не в фокусе
1277 IgorA 111
 
5879 IgorA 112
	push eax
6972 IgorA 113
	mcall SF_KEYBOARD,SSF_GET_INPUT_MODE ;получить режим ввода с клавиатуры
1303 IgorA 114
 
5879 IgorA 115
	lea ecx,[tl_key_scan]
5911 IgorA 116
	cmp eax,1 ;1 = сканкоды
5879 IgorA 117
	je @f
118
		lea ecx,[tl_key_ascii]
119
	@@:
120
	pop eax
1303 IgorA 121
 
5879 IgorA 122
	xor bx,bx
123
	cmp ah,byte[ecx] ;Enter
124
	jne @f
125
	cmp tl_on_press,0
126
	je @f
5948 IgorA 127
		call tl_on_press
5879 IgorA 128
	@@:
129
	cmp ah,byte[ecx+1] ;Space
130
	jne @f
131
		stdcall tl_node_close_open, edi
132
	@@:
133
	cmp ah,byte[ecx+2] ;Up
134
	jne @f
135
		stdcall tl_cur_perv, edi
136
	@@:
137
	cmp ah,byte[ecx+3] ;Down
138
	jne @f
139
		stdcall tl_cur_next, edi
140
	@@:
141
	cmp ah,byte[ecx+7] ;Page Up
142
	jne @f
143
		stdcall tl_cur_page_up, edi
144
	@@:
145
	cmp ah,byte[ecx+8] ;Page Down
146
	jne @f
147
		stdcall tl_cur_page_down, edi
148
	@@:
1277 IgorA 149
 
5879 IgorA 150
	bt tl_style,0 ;tl_key_no_edit
151
	jc .no_edit
152
		cmp ah,byte[ecx+4] ;Left
153
		jne @f
154
			stdcall tl_node_lev_dec, edi
155
			mov bx,1
156
		@@:
157
		cmp ah,byte[ecx+5] ;Right
158
		jne @f
159
			stdcall tl_node_lev_inc, edi
160
			mov bx,1
161
		@@:
162
		cmp ah,byte[ecx+6] ;Delete
163
		jne @f
164
			stdcall tl_node_delete, edi
165
			mov bx,1
166
		@@:
167
	.no_edit:
1277 IgorA 168
 
5879 IgorA 169
	cmp bx,1
170
	jne .no_focus
171
		stdcall tl_draw, edi
172
	.no_focus:
173
	ret
174
endp
1277 IgorA 175
 
5911 IgorA 176
;реакция на мышь
1277 IgorA 177
align 4
5879 IgorA 178
proc tl_mouse, tlist:dword
179
	pushad
6972 IgorA 180
	mov edi,[tlist]
1277 IgorA 181
 
6972 IgorA 182
	mcall SF_MOUSE_GET,SSF_WINDOW_POSITION ;координаты мыши относительно окна
1277 IgorA 183
 
5879 IgorA 184
	mov ebx,tl_box_left
185
	shl ebx,16
5911 IgorA 186
	cmp eax,ebx ;левая граница окна
187
	jl .no_in_wnd ;.test_scroll не применяем
5879 IgorA 188
		shr ebx,16
189
		add ebx,tl_box_width
190
		shl ebx,16
5911 IgorA 191
		cmp eax,ebx ;правая граница окна
5879 IgorA 192
		jg .test_scroll
1277 IgorA 193
 
5879 IgorA 194
		mov ebx,tl_box_top
195
		add ebx,tl_box_height
5911 IgorA 196
		cmp ax,bx ;нижняя граница окна
5879 IgorA 197
		jg .test_scroll
1277 IgorA 198
 
5879 IgorA 199
		sub ebx,tl_box_height
200
		add bx,tl_capt_cy
5911 IgorA 201
		cmp ax,bx ;верхняя граница окна + высота подписи
5879 IgorA 202
		jl .test_scroll
1277 IgorA 203
 
5914 IgorA 204
push eax ebx
6972 IgorA 205
	mcall SF_MOUSE_GET,SSF_SCROLL_DATA
5948 IgorA 206
	mov edx,eax
207
	xor	ecx,ecx
5914 IgorA 208
	test eax,eax
209
	jz .mouse_next
210
	test ax,0x8000
211
	jnz .decr
212
	shr eax,16
213
	test ax,0x8000
214
	jnz .decr_1
215
 
216
	mov cx,dx ;dx = mouse scroll data vertical
217
	test ecx,ecx
218
	jnz @f
219
	shr edx,16
220
	mov cx,dx ;dx = mouse scroll data horizontal
221
	test ecx,ecx
222
	jz .mouse_next
223
@@:
224
	stdcall tl_cur_next, edi
6972 IgorA 225
	loop @r
5914 IgorA 226
	jmp .mouse_next
5948 IgorA 227
;------------------------------------------------
5914 IgorA 228
.decr: ;вертикальная прокрутка отрицательная
229
	mov bx,ax ;ax = mouse scroll data vertical
230
	jmp @f
231
.decr_1: ;горизонтальная прокрутка отрицательная
232
	mov bx,ax ;ax = mouse scroll data horizontal
233
@@:
234
	mov ecx,0xffff
235
	sub ecx,ebx
236
	inc ecx
237
@@:
238
	stdcall tl_cur_perv, edi
6972 IgorA 239
	loop @r
5948 IgorA 240
;------------------------------------------------
5914 IgorA 241
.mouse_next:
242
 
6972 IgorA 243
		mcall SF_MOUSE_GET,SSF_BUTTON
5879 IgorA 244
		bt eax,0 ;left mouse button press
6972 IgorA 245
pop ebx eax
5879 IgorA 246
		jae .no_draw
1390 IgorA 247
 
5879 IgorA 248
		mov esi,tl_el_focus
6972 IgorA 249
		mov [esi],edi ;set focus
1390 IgorA 250
 
5879 IgorA 251
		; if '+' or '-' press
252
		mov esi,eax
253
		shr esi,16
254
		sub esi,tl_box_left ;esi = mouse x coord in element window
1283 IgorA 255
 
5879 IgorA 256
		and eax,0xffff
6972 IgorA 257
		sub eax,ebx
5879 IgorA 258
		xor edx,edx
6972 IgorA 259
		movzx ecx,tl_img_cy
5879 IgorA 260
		div ecx
5911 IgorA 261
		cmp tl_p_scroll,0 ;учитываем скроллинг
5879 IgorA 262
		je @f
5911 IgorA 263
			mov edx,tl_p_scroll
6972 IgorA 264
			add eax,[edx+sb_offs_position] ;добавляем скроллинг на верху
5879 IgorA 265
		@@:
1277 IgorA 266
 
5879 IgorA 267
		mov ecx,eax
268
		call tl_get_node_count ;eax = node count
269
		cmp eax,ecx
270
		jl @f
5911 IgorA 271
			mov eax,ecx ;если курсор не вышел за пределы узлов, восстанавливаем старое значение eax
5879 IgorA 272
		@@:
1277 IgorA 273
 
5911 IgorA 274
		cmp eax,tl_cur_pos ;если новое значение курсора совпало с предыдущим
275
		je @f ;то не стираем курсор
5879 IgorA 276
		push esi
277
			mov esi,tl_box_top
278
			add esi,tl_box_height ;esi = coord bottom border
5911 IgorA 279
			call tl_draw_null_cursor ;стираем курсор
5879 IgorA 280
		pop esi
281
		@@:
1277 IgorA 282
 
5879 IgorA 283
		mov tl_cur_pos,eax
1277 IgorA 284
 
5879 IgorA 285
		; if '+' or '-' press
286
		call tl_get_cur_node_index ;eax = node index
287
		cmp eax,2
5911 IgorA 288
		jl .no_open_close ;курсор стоит на пустом месте, без узлов
6972 IgorA 289
		imul eax,sizeof.TreeNode
5879 IgorA 290
		add eax,tl_data_nodes
291
		xor bx,bx
6972 IgorA 292
		mov bl,byte[eax+TreeNode.level] ;сохраняем уровень текущего узла
5911 IgorA 293
		inc bx ;+ поле для курсора
1277 IgorA 294
 
5879 IgorA 295
		cmp si,tl_img_cx
5911 IgorA 296
		jl .no_open_close ;мышей попали на левое поле для курсора, где точно нет '+' и '-'
5879 IgorA 297
			mov eax,esi
298
			xor edx,edx
299
			xor ecx,ecx
300
			mov cx,tl_img_cx
301
			div ecx
1277 IgorA 302
 
5879 IgorA 303
			cmp ax,bx
304
			jne .no_open_close
1277 IgorA 305
 
5879 IgorA 306
			stdcall tl_node_close_open, edi
307
		.no_open_close:
1277 IgorA 308
 
5879 IgorA 309
		mov esi,tl_box_top
310
		add esi,tl_box_height ;esi = coord bottom border
5911 IgorA 311
		call tl_draw_cursor ;перерисовка курсора
5879 IgorA 312
		call tl_draw_caption_cur_pos
313
		jmp .no_draw
1309 IgorA 314
;--- mouse event for children scrollbar ----------------------------------------
315
.test_scroll:
5911 IgorA 316
	mov edx,tl_p_scroll
6972 IgorA 317
	or edx,edx
318
	jz .no_in_wnd ;пользователь не создал дочернего скроллинга
5879 IgorA 319
		shr ebx,16
320
		add bx,word[edx] ;+0 .size_x
321
		shl ebx,16
5911 IgorA 322
		cmp eax,ebx ;правая граница окна
5879 IgorA 323
		jg .no_in_wnd
1309 IgorA 324
 
6972 IgorA 325
		mov eax,[edx+sb_offs_max_area]
326
		cmp eax,[edx+sb_offs_cur_area]
5911 IgorA 327
		jbe .no_in_wnd ;все узлы попадают в окно скроллинга
5879 IgorA 328
			stdcall scroll_bar_vertical.mouse, edx ;scrollbar_ver_mouse
1309 IgorA 329
 
5879 IgorA 330
			cmp dword[edx+sb_offs_redraw],0
5948 IgorA 331
			je @f
5879 IgorA 332
				mov dword[edx+sb_offs_redraw],0
5911 IgorA 333
				stdcall tl_draw, edi ;произошли изменения скроллинга
5879 IgorA 334
			@@:
335
			cmp dword[edx+sb_offs_delta2],0
5911 IgorA 336
			jne .no_draw ;попали на скроллинг - не снимаем фокус с TreeList
1309 IgorA 337
;-------------------------------------------------------------------------------
6972 IgorA 338
	.no_in_wnd: ;не попали в окно - потеря фокуса (при условии что фокус был на данном эелементе)
339
	mcall SF_MOUSE_GET,SSF_BUTTON
340
	or eax,eax ;ничего не нажали eax=0
341
	jz .no_draw
5879 IgorA 342
		mov ebx,tl_el_focus
6972 IgorA 343
		cmp [ebx],edi
5911 IgorA 344
		jne .no_draw ;элемент не в фокусе
5879 IgorA 345
			mov dword[ebx],0 ;reset focus
346
			mov esi,tl_box_top
347
			add esi,tl_box_height ;esi = coord bottom border
5911 IgorA 348
			call tl_draw_cursor ;рисуем курсор с потеряным фокусом
5879 IgorA 349
	.no_draw:
1277 IgorA 350
 
5879 IgorA 351
	popad
352
	ret
353
endp
1277 IgorA 354
 
5911 IgorA 355
;отмена действия
1277 IgorA 356
align 4
5879 IgorA 357
proc tl_info_undo uses eax edi, tlist:dword
6972 IgorA 358
	mov edi,[tlist]
5879 IgorA 359
	mov eax,tl_tim_undo
360
	cmp tl_ch_tim,eax
361
	jbe @f
362
		inc tl_tim_undo
5911 IgorA 363
		call tb_scrol_resize ;обработка скроллинга
5879 IgorA 364
	@@:
365
	ret
366
endp
1277 IgorA 367
 
5911 IgorA 368
;повтор действия
1277 IgorA 369
align 4
5879 IgorA 370
proc tl_info_redo uses edi, tlist:dword
6972 IgorA 371
	mov edi,[tlist]
5879 IgorA 372
	cmp tl_tim_undo,1
373
	jl @f
374
		dec tl_tim_undo
5911 IgorA 375
		call tb_scrol_resize ;обработка скроллинга
5879 IgorA 376
	@@:
377
	ret
378
endp
1277 IgorA 379
 
5911 IgorA 380
;удаление отмененных действий
381
;внутренняя функция, не для экспорта
1277 IgorA 382
align 4
5879 IgorA 383
tl_info_set_undo:
5948 IgorA 384
	cmp tl_tim_undo,1
385
	jl .no_work
1277 IgorA 386
 
5948 IgorA 387
	push eax ebx ecx edx
388
	mov edx,tl_data_nodes
389
	mov ecx,edx
6972 IgorA 390
	add ecx,sizeof.TreeNode
5948 IgorA 391
	call tl_move_next ;long i=node[0].next;
6972 IgorA 392
 
5948 IgorA 393
	mov eax,tl_tim_undo
394
	sub tl_ch_tim,eax ;ch_tim-=tim_undo;
6972 IgorA 395
 
5948 IgorA 396
	cmp edx,ecx
397
	jle @f
398
		;if(node[i].tc>ch_tim){ // если создание символа было отменено
6972 IgorA 399
		mov eax,tl_ch_tim
400
		cmp [edx+TreeNode.t_create],eax
5948 IgorA 401
		jle .no_u1
6972 IgorA 402
			mov dword[edx+TreeNode.t_create],0
403
			mov dword[edx+TreeNode.t_delete],0
1277 IgorA 404
 
6972 IgorA 405
			mov ebx, [edx+TreeNode.perv]
406
			imul ebx,sizeof.TreeNode
5948 IgorA 407
			add ebx, tl_data_nodes ;.next
6972 IgorA 408
			push dword[edx+TreeNode.next] ;node[node[i].perv].next=node[i].next;
409
			pop dword[ebx+TreeNode.next]
1277 IgorA 410
 
6972 IgorA 411
			mov ebx, [edx+TreeNode.next]
412
			imul ebx,sizeof.TreeNode
5948 IgorA 413
			add ebx, tl_data_nodes ;.perv
6972 IgorA 414
			push dword[edx+TreeNode.perv] ;node[node[i].next].perv=node[i].perv;
415
			pop dword[ebx+TreeNode.perv]
5948 IgorA 416
		.no_u1:
1277 IgorA 417
 
5948 IgorA 418
		;else if(node[i].td>ch_tim) node[i].td=0; // если удаление символа было отменено
6972 IgorA 419
		cmp [edx+TreeNode.t_delete],eax
5948 IgorA 420
		jle .no_u2
6972 IgorA 421
			mov dword[edx+TreeNode.t_delete],0
5948 IgorA 422
		.no_u2:
423
		call tl_move_next
424
		jmp @b
425
	@@:
426
	mov tl_tim_undo,0
427
	pop edx ecx ebx eax
428
	.no_work:
429
	ret
1277 IgorA 430
 
5911 IgorA 431
;вывод списка на экран
1277 IgorA 432
align 4
5879 IgorA 433
proc tl_draw, tlist:dword
5948 IgorA 434
	pushad
435
	;draw dir_list main rect
6972 IgorA 436
	mov edi,[tlist]
5948 IgorA 437
	mov ebx,tl_box_left
438
	shl ebx,16
439
	add ebx,tl_box_width
440
	mov ecx,tl_box_top
441
	shl ecx,16
442
	mov cx,tl_capt_cy
443
	mov edx,tl_col_zag
6972 IgorA 444
	mcall SF_DRAW_RECT ;draw window caption
1277 IgorA 445
 
5948 IgorA 446
	add ecx,tl_box_top
447
	shl ecx,16
448
	add ecx,tl_box_height
449
	sub cx,tl_capt_cy
6972 IgorA 450
	mcall ,,,tl_col_bkg ;draw window client rect
1277 IgorA 451
 
5948 IgorA 452
	cmp tl_capt_cy,9 ;9 - minimum caption height
453
	jl @f
454
	mov ebx,edi ;calculate cursor position
455
	mov eax,tl_cur_pos
456
	inc eax
6972 IgorA 457
	lea edi,[txt_capt_cur.v]
458
	stdcall tl_convert_to_str, 5
1309 IgorA 459
 
5948 IgorA 460
	mov edi,ebx
461
	mov eax,tl_tim_undo
6972 IgorA 462
	lea edi,[txt_capt_otm.v]
463
	stdcall tl_convert_to_str, 5
5948 IgorA 464
	mov edi,ebx ;restore edi
1309 IgorA 465
 
6972 IgorA 466
	mov eax,SF_DRAW_TEXT ;captions
5948 IgorA 467
	mov ebx,tl_box_left
468
	shl ebx,16
469
	add ebx,5*65536+3
470
	add ebx,tl_box_top
471
	mov ecx,tl_col_txt
472
	or  ecx,0x80000000
473
	lea edx,[txt_capt_cur]
474
	int 0x40
1277 IgorA 475
 
5948 IgorA 476
	mov ebx,tl_box_left
477
	shl ebx,16
478
	add ebx,100*65536+3
479
	add ebx,tl_box_top
480
	lea edx,[txt_capt_otm]
481
	int 0x40
482
	@@:
1277 IgorA 483
 
5948 IgorA 484
	;cycle to nodes
485
	xor eax,eax
486
	mov edx,tl_data_nodes
487
	mov ecx,edx
6972 IgorA 488
	add ecx,sizeof.TreeNode
1277 IgorA 489
 
5948 IgorA 490
	;*** пропуск узлов, которые промотаны скроллингом ***
491
	cmp tl_p_scroll,0 ;если есть указатель на скроллинг
492
	je .end_c1
493
		mov esi,tl_p_scroll
494
		cmp dword[esi+sb_offs_position],0 ;если скроллинг на верху, выходим
495
		je .end_c1
496
		@@:
497
			call tl_iterat_next
498
			cmp edx,ecx
499
			jle .end_draw
500
			inc eax
501
			cmp eax,dword[esi+sb_offs_position]
502
			jl @b
503
	.end_c1:
1277 IgorA 504
 
5948 IgorA 505
	xor eax,eax
506
	mov esi,tl_box_top
507
	add esi,tl_box_height ;esi = coord bottom border
508
	@@:
509
		call tl_iterat_next
510
		cmp edx,ecx
511
		jle @f
512
		call tl_draw_node
513
		inc eax
514
		jmp @b
515
	@@:
1277 IgorA 516
 
5948 IgorA 517
	call tl_draw_cursor
1390 IgorA 518
 
5948 IgorA 519
	mov edi,tl_p_scroll ;рисуем дочерний скроллинг
520
	cmp edi,0    ;для того что-бы его не пришлось рисовать в пользовательской программе
521
	je .end_draw ;если нет скроллинга выходим
522
		stdcall scroll_bar_vertical.draw, edi
523
	.end_draw:
524
	popad
525
	ret
5879 IgorA 526
endp
1277 IgorA 527
 
5911 IgorA 528
;переход на следущий видимый узел (пропуская закрытые)
1277 IgorA 529
;input:
530
; ecx = pointer to 1 node struct
6972 IgorA 531
; edx = pointer to node struct
1277 IgorA 532
; edi = pointer to 'TreeList' struct
1285 IgorA 533
;output:
534
; edx = pointer to next node struct
1277 IgorA 535
align 4
5879 IgorA 536
tl_iterat_next:
5948 IgorA 537
	push bx
538
	mov bl,0x7f
6972 IgorA 539
	cmp byte[edx+TreeNode.close],1
5948 IgorA 540
	jne @f
6972 IgorA 541
		mov bl,byte[edx+TreeNode.level]
5948 IgorA 542
	@@:
1277 IgorA 543
 
5948 IgorA 544
	cmp tl_tim_undo,0
545
	je .else
1277 IgorA 546
 
5948 IgorA 547
	push eax
548
	.beg0:
549
		call tl_move_next
550
		cmp edx,ecx
551
		jle @f
552
		call tl_node_not_vis ;пропуск удаленных и отмененных
553
		cmp al,1
554
		je .beg0
6972 IgorA 555
		cmp bl,byte[edx+TreeNode.level] ;пропуск закрытых
5948 IgorA 556
		jl .beg0
557
		@@:
558
	pop eax
559
	pop bx
560
	ret
1277 IgorA 561
 
5948 IgorA 562
	.else:
563
		call tl_move_next
564
		cmp edx,ecx
565
		jle .endif
6972 IgorA 566
		cmp dword[edx+TreeNode.t_delete],0 ;пропуск удаленных
5948 IgorA 567
		jne .else
6972 IgorA 568
		cmp bl,byte[edx+TreeNode.level] ;пропуск закрытых
5948 IgorA 569
		jl .else
570
	.endif:
571
	pop bx
572
	ret
1277 IgorA 573
 
5911 IgorA 574
;переход на следущий видимый узел (и на закрытые тоже)
1277 IgorA 575
;input:
576
; ecx = pointer to 1 node struct
6972 IgorA 577
; edx = pointer to node struct
1277 IgorA 578
; edi = pointer to 'TreeList' struct
5879 IgorA 579
;output:
580
; edx = pointer to next visible node struct
1277 IgorA 581
align 4
5879 IgorA 582
tl_iterat_next_all:
5948 IgorA 583
	cmp tl_tim_undo,0
584
	je .else
1277 IgorA 585
 
5948 IgorA 586
	push eax
587
	@@:
588
		call tl_move_next
589
		cmp edx,ecx
590
		jle @f
591
		call tl_node_not_vis
592
		cmp al,1
593
		je @b
594
	@@:
595
	pop eax
596
	ret
597
	.else:
598
		call tl_move_next
599
		cmp edx,ecx
600
		jle .endif
6972 IgorA 601
		cmp dword[edx+TreeNode.t_delete],0 ;td -> time delete
5948 IgorA 602
		jne .else
603
	.endif:
604
	ret
1277 IgorA 605
 
5911 IgorA 606
;переход на предыдущий видимый узел (пропуская закрытые)
1277 IgorA 607
;input:
608
; ecx = pointer to 1 node struct
6972 IgorA 609
; edx = pointer to node struct
1277 IgorA 610
; edi = pointer to 'TreeList' struct
611
align 4
6972 IgorA 612
proc tl_iterat_perv uses eax
5948 IgorA 613
	cmp tl_tim_undo,0
614
	je .beg1
1277 IgorA 615
 
5948 IgorA 616
	.beg0:
617
		call tl_move_perv
618
		cmp edx,ecx
619
		jle @f
620
		call tl_node_not_vis ;пропуск удаленных и отмененных
621
		cmp al,1
622
		je .beg0
1277 IgorA 623
 
5948 IgorA 624
	.beg1:
625
		call tl_move_perv
626
		cmp edx,ecx
627
		jle @f
6972 IgorA 628
		cmp dword[edx+TreeNode.t_delete],0 ;td = 'time delete' -> пропуск удаленных
5948 IgorA 629
		jne .beg1
1309 IgorA 630
 
5948 IgorA 631
	@@:
6972 IgorA 632
	call tl_move_max_clo_par
5948 IgorA 633
	ret
6972 IgorA 634
endp
1277 IgorA 635
 
5911 IgorA 636
;находит родительский закрытый узел максимального уровня
1277 IgorA 637
;input:
6972 IgorA 638
; edx = pointer to node struct
1277 IgorA 639
; edi = pointer to 'TreeList' struct
640
;output:
1309 IgorA 641
; edx = pointer closed parent node with maximum level
642
align 4
5879 IgorA 643
proc tl_move_max_clo_par uses eax ebx
5948 IgorA 644
	mov eax,edx
645
	xor ebx,ebx
646
	.beg:
647
		call tl_move_par
6972 IgorA 648
		cmp byte[edx+TreeNode.close],1 ;родительский узел закрыт ?
5948 IgorA 649
		jne @f
650
			mov eax,edx
651
		@@:
652
		cmp ebx,edx
653
		je .end_f
654
			mov ebx,edx
655
			jmp .beg
656
	.end_f:
657
	mov edx,eax
658
	ret
5879 IgorA 659
endp
1309 IgorA 660
 
661
;input:
6972 IgorA 662
; edx = pointer to node struct
1309 IgorA 663
; edi = pointer to 'TreeList' struct
664
;output:
1277 IgorA 665
; edx = pointer to next node struct
666
align 4
667
tl_move_next:
6972 IgorA 668
	mov edx,[edx+TreeNode.next]
669
	imul edx,sizeof.TreeNode
5911 IgorA 670
	add edx,tl_data_nodes
671
	ret
1277 IgorA 672
 
673
;input:
6972 IgorA 674
; edx = pointer to node struct
1277 IgorA 675
; edi = pointer to 'TreeList' struct
676
;output:
677
; edx = pointer to perv node struct
678
align 4
679
tl_move_perv:
6972 IgorA 680
	mov edx,[edx+TreeNode.perv]
681
	imul edx,sizeof.TreeNode
5911 IgorA 682
	add edx,tl_data_nodes
683
	ret
1277 IgorA 684
 
5911 IgorA 685
;передвигаемся на родительский узел, если такого нет, то оставляем старое значение указателя
1277 IgorA 686
;input:
6972 IgorA 687
; ecx = pointer to 1 node struct
688
; edx = pointer to node struct
1309 IgorA 689
; edi = pointer to 'TreeList' struct
690
;output:
691
; edx = pointer to parent node struct
692
align 4
5879 IgorA 693
tl_move_par:
6972 IgorA 694
	cmp byte[edx+TreeNode.level],0
5911 IgorA 695
	je .end_f ;узел 0-го уровня не может быть дочерним
5879 IgorA 696
	push eax ebx esi
697
	mov esi,edx ;copy node pointer (edx)
6972 IgorA 698
	mov bl,byte[edx+TreeNode.level]
5879 IgorA 699
	@@:
700
		call tl_move_perv
701
		cmp edx,ecx
5911 IgorA 702
		jle @f ;все выше стоящие узлы не родительские
703
		call tl_node_not_vis ;пропуск удаленных и отмененных
5879 IgorA 704
		cmp al,1
705
		je @b
6972 IgorA 706
		cmp byte[edx+TreeNode.level],bl
5911 IgorA 707
		jl .end_0 ;удачно нашли родительский узел
5879 IgorA 708
		jmp @b
709
	@@:
710
		mov esi,ebx ;restore node pointer
711
	.end_0:
712
	pop esi ebx eax
713
	.end_f:
714
	ret
1309 IgorA 715
 
5911 IgorA 716
;проверяет видимый ли указанный узел с учетом: добавлений, удалений, отмен действий
1309 IgorA 717
;input:
6972 IgorA 718
; edx = pointer to node struct
1277 IgorA 719
; edi = pointer to 'TreeList' struct
720
;output:
721
; al = 1 if sumbol not visible
1283 IgorA 722
; (node[i].td+tim_Undo<=ch_tim && node[i].td) || (node[i].tc>ch_tim-tim_Undo)
1277 IgorA 723
align 4
5879 IgorA 724
tl_node_not_vis:
6972 IgorA 725
	cmp dword[edx+TreeNode.t_delete],0
5948 IgorA 726
	je @f
6972 IgorA 727
	mov eax,[edx+TreeNode.t_delete] ;eax=node[i].td
5948 IgorA 728
	add eax,tl_tim_undo
729
	cmp eax,tl_ch_tim
730
	jg @f
731
		mov al,1
732
		ret
733
	@@:
1277 IgorA 734
 
5948 IgorA 735
	mov eax,tl_ch_tim
736
	sub eax,tl_tim_undo
6972 IgorA 737
	cmp [edx+TreeNode.t_create],eax ;time create
5948 IgorA 738
	jle @f
739
		mov al,1
740
		ret
741
	@@:
742
	xor al,al
743
	ret
1277 IgorA 744
 
5911 IgorA 745
;рисуем курсор на экране
1277 IgorA 746
;input:
747
; edi = pointer to TreeInfo struct
748
; esi = coord bottom border
749
align 4
5879 IgorA 750
proc tl_draw_cursor uses eax ebx ecx edx esi
751
	call tl_get_display_cur_pos ;eax = cursor pos in screen
752
	cmp eax,0
5911 IgorA 753
	jl .end_f ;курсор находится выше окна, в области прокрученной скроллингом
1277 IgorA 754
 
5911 IgorA 755
	cmp tl_data_img_sys,0 ;смотрим есть ли указатель на картинку системных иконок
5879 IgorA 756
	jne @f
757
		mov ebx,tl_box_left
758
		shl ebx,16
759
		mov bx,tl_img_cx
6972 IgorA 760
		movzx ecx,tl_img_cy
5879 IgorA 761
		imul ecx,eax
762
		add ecx,tl_box_top
763
		add cx,tl_capt_cy
1277 IgorA 764
 
5879 IgorA 765
		;crop image if on the border
5911 IgorA 766
		cmp esi,ecx ;если курсор внизу и его вообще не видно
5879 IgorA 767
		jl .end_f
1277 IgorA 768
 
5879 IgorA 769
		sub esi,ecx
770
		shl ecx,16
771
		mov cx,tl_img_cy
772
		cmp si,tl_img_cy
773
		jge .crop0
5911 IgorA 774
			mov cx,si ;если курсор виден частично (попал на нижнюю границу)
5879 IgorA 775
		.crop0:
1277 IgorA 776
 
5879 IgorA 777
		mov edx,tl_col_txt
6972 IgorA 778
		mcall SF_DRAW_RECT ;рисуем простой прямоугольник, т.к. нет системных иконок
5879 IgorA 779
		jmp .end_f
780
	@@:
781
	mov ebx,tl_data_img_sys
782
	imul ax,tl_img_cy
783
	mov edx,tl_box_left
784
	shl edx,16
785
	mov dx,ax
786
	add edx,tl_box_top
787
	add dx,tl_capt_cy
1277 IgorA 788
 
5911 IgorA 789
	mov ecx,tl_el_focus ;проверяем в фокусе элемент или нет
5879 IgorA 790
	cmp dword[ecx],edi
791
	je .focus
5911 IgorA 792
		;если не в фокусе сдвигаем координаты на иконку не активного курсора
6972 IgorA 793
		movzx ecx,tl_img_cx
794
		movzx eax,tl_img_cy
5879 IgorA 795
		imul eax,ecx
796
		imul eax,4*3 ;4=icon index 3=rgb
797
		add ebx,eax
798
	.focus:
1309 IgorA 799
 
5879 IgorA 800
	mov cx,tl_img_cx
801
	shl ecx,16
802
	mov cx,tl_img_cy
1309 IgorA 803
 
5879 IgorA 804
	;crop image if on the border
5911 IgorA 805
	cmp si,dx ;если курсор внизу и его вообще не видно
5879 IgorA 806
	jl .end_f
1277 IgorA 807
 
5879 IgorA 808
		sub si,dx
809
		cmp si,tl_img_cy
810
		jge .crop1
5911 IgorA 811
			mov cx,si ;если курсор виден частично (попал на нижнюю границу)
5879 IgorA 812
		.crop1:
1277 IgorA 813
 
6972 IgorA 814
		mcall SF_PUT_IMAGE ;рисуем иконку курсора
5879 IgorA 815
	.end_f:
816
	ret
817
endp
1277 IgorA 818
 
5911 IgorA 819
;стираем курсор на экране
1277 IgorA 820
;input:
821
; edi = pointer to TreeInfo struct
822
; esi = coord bottom border
823
align 4
5879 IgorA 824
proc tl_draw_null_cursor uses eax ebx ecx edx esi
5948 IgorA 825
	call tl_get_display_cur_pos ;eax = cursor pos in screen
826
	cmp eax,0
827
	jl .end_f ;курсор находится выше окна, в области прокрученной скроллингом
828
		mov ebx,tl_box_left
829
		shl ebx,16
830
		mov bx,tl_img_cx
6972 IgorA 831
		movzx ecx,tl_img_cy
5948 IgorA 832
		imul ecx,eax
833
		add ecx,tl_box_top
834
		add cx,tl_capt_cy
1277 IgorA 835
 
5948 IgorA 836
		;crop image if on the border
837
		cmp esi,ecx ;если курсор внизу и его вообще не видно
838
		jl .end_f
1277 IgorA 839
 
5948 IgorA 840
		sub esi,ecx
841
		shl ecx,16
842
		mov cx,tl_img_cy
843
		cmp si,tl_img_cy
844
		jge @f
845
			mov cx,si ;если курсор виден частично (попал на нижнюю границу)
846
		@@:
6972 IgorA 847
		mcall SF_DRAW_RECT,,,tl_col_bkg ;рисуем простой прямоугольник с фоновым цветом
5948 IgorA 848
	.end_f:
849
	ret
5879 IgorA 850
endp
1277 IgorA 851
 
5911 IgorA 852
;берет позицию курсора, относительно экрана
1277 IgorA 853
;input:
854
; edi = pointer to TreeInfo struct
855
;output:
856
; eax = index
857
align 4
5879 IgorA 858
tl_get_display_cur_pos:
5948 IgorA 859
	mov eax,tl_cur_pos
860
	cmp tl_p_scroll,0
861
	je @f
862
		push ebx
863
		mov ebx,tl_p_scroll
864
		mov ebx,dword[ebx+sb_offs_position]
865
		sub eax,ebx ;отнимаем позицию скроллинга
866
		pop ebx
867
	@@:
868
	ret
1277 IgorA 869
 
5911 IgorA 870
;рисует узел с: картинкой, подписью, иконкой открытия/закрытия и линиями к родит. узлу
1277 IgorA 871
;input:
5948 IgorA 872
; eax = node position (0, ..., max_nodes-scroll_pos) не до tl_box_height/tl_img_cy
6972 IgorA 873
; edx = pointer to node struct
1401 IgorA 874
; edi = pointer to 'TreeList' struct
1277 IgorA 875
; esi = coord of bottom border
876
align 4
5879 IgorA 877
proc tl_draw_node uses eax ebx ecx edx esi
5911 IgorA 878
	mov ebx,1 ;1 - место под курсор
1714 IgorA 879
	bt tl_style,2 ;tl_list_box_mode
880
	jc @f
5911 IgorA 881
		inc ebx ;+1 - место под знак +,-
6972 IgorA 882
		add bl,byte[edx+TreeNode.level] ;добавляем уровень элемента для его учета в левом отступе иконки
1714 IgorA 883
	@@:
884
	imul bx,tl_img_cx
885
	add ebx,tl_box_left
1277 IgorA 886
 
1714 IgorA 887
	shl ebx,16
888
	mov bx,tl_img_cx
6972 IgorA 889
	movzx ecx,tl_img_cy
1714 IgorA 890
	imul ecx,eax
5948 IgorA 891
	add cx,tl_capt_cy
892
	jc .end_draw ;когда много узлов, то может быть переполнение координаты cx
1714 IgorA 893
	add ecx,tl_box_top
1277 IgorA 894
 
1714 IgorA 895
	;crop image if on the border
5911 IgorA 896
	cmp esi,ecx ;если узел внизу и его вообще не видно
1714 IgorA 897
	jl .end_draw
1277 IgorA 898
 
1714 IgorA 899
	sub esi,ecx
900
	shl ecx,16
901
	mov cx,tl_img_cy
902
	cmp si,tl_img_cy
903
	jge @f
5911 IgorA 904
		mov cx,si ;если узел виден частично (попал на нижнюю границу)
905
		jmp .crop ;пропускаем рисование надписи, которая скорее всего тоже вылезет за нижнюю границу
1714 IgorA 906
	@@:
907
		call tl_draw_node_caption
908
	.crop:
909
	mov esi,ecx ;save ecx
1277 IgorA 910
 
6972 IgorA 911
	push edx
1714 IgorA 912
	cmp tl_data_img,0
913
	jne .draw_img_n
6972 IgorA 914
		mcall SF_DRAW_RECT,,,tl_col_txt ;draw node rect
915
		jmp @f
1714 IgorA 916
	.draw_img_n:
6972 IgorA 917
	push ebx esi
918
		movzx esi,word[edx+TreeNode.type] ;get icon type
1714 IgorA 919
		mov edx,ebx
920
		ror ecx,16
921
		mov dx,cx
922
		mov cx,bx
923
		ror ecx,16
924
		mov ebx,3 ;rgb = 3 bytes
925
		imul bx,tl_img_cx
926
		imul bx,tl_img_cy
927
		imul ebx,esi ;esi = icon index
928
		add ebx,tl_data_img
1277 IgorA 929
 
6972 IgorA 930
		mcall SF_PUT_IMAGE ;draw node icon '-'
931
	pop esi ebx
1714 IgorA 932
	@@:
6972 IgorA 933
	pop edx
1277 IgorA 934
 
6972 IgorA 935
	mov al,byte[edx+TreeNode.level] ;draw minus '-'
1714 IgorA 936
	mov ecx,tl_data_nodes
6972 IgorA 937
	add ecx,sizeof.TreeNode
1277 IgorA 938
 
1714 IgorA 939
	mov ah,10 ;get icon index '+' or '-' ?
6972 IgorA 940
	cmp byte[edx+TreeNode.close],1
1714 IgorA 941
	jne .close
942
		dec ah
943
	.close:
1277 IgorA 944
 
5911 IgorA 945
	call tl_draw_node_icon_opn_clo ;рисование иконки открытого или закрытого узла
1714 IgorA 946
	bt tl_style,1
947
	jae .end_draw
5911 IgorA 948
		call tl_draw_node_icon_par_lin ;рисование линии к родительскому элементу
949
		call tl_draw_node_icon_par_lin_up ;рисование вертикальной линии к родительскому элементу
1714 IgorA 950
	.end_draw:
951
	ret
5879 IgorA 952
endp
1277 IgorA 953
 
5911 IgorA 954
;рисует иконки открытого или закрытого узла (обычно + или -)
1277 IgorA 955
;input:
5911 IgorA 956
; al = уровень элемента
1277 IgorA 957
; ecx = pointer to 1 node struct
6972 IgorA 958
; edx = pointer to node struct
1277 IgorA 959
;...
960
align 4
5879 IgorA 961
proc tl_draw_node_icon_opn_clo uses eax ebx ecx edx esi
5948 IgorA 962
	inc al
963
	call tl_iterat_next_all ;get next visible item
964
	cmp edx,ecx
965
	jle @f
966
		mov ecx,esi ;load ecx
6972 IgorA 967
		cmp al,byte[edx+TreeNode.level]
5948 IgorA 968
		jne @f
969
		ror ebx,16
970
		sub bx,tl_img_cx
971
		ror ebx,16
972
		cmp tl_data_img_sys,0
973
		jne .draw_img_s
6972 IgorA 974
			mcall SF_DRAW_RECT,,,tl_col_txt ;draw minus rect, if not system icons
5948 IgorA 975
			jmp @f
976
		.draw_img_s:
977
		mov ecx,esi ;load ecx
978
		mov edx,ebx
979
		ror ecx,16
980
		mov dx,cx
981
		mov cx,bx
982
		ror ecx,16
983
		mov ebx,3 ;rgb = 3 bytes
984
		imul bx,tl_img_cx
985
		imul bx,tl_img_cy
986
		shr eax,8
987
		and eax,0xff
988
		imul ebx,eax ;eax = icon index
989
		add ebx,tl_data_img_sys
6972 IgorA 990
		mcall SF_PUT_IMAGE ;draw minus icon '-'
5948 IgorA 991
	@@:
992
	ret
5879 IgorA 993
endp
1277 IgorA 994
 
5911 IgorA 995
;рисование линии к родительскому элементу
1277 IgorA 996
;input:
5911 IgorA 997
; al = уровень элемента
1401 IgorA 998
; ecx = pointer to 1 node struct
6972 IgorA 999
; edx = pointer to node struct
1277 IgorA 1000
;...
1001
align 4
5879 IgorA 1002
tl_draw_node_icon_par_lin:
6972 IgorA 1003
	cmp byte[edx+TreeNode.close],1
5948 IgorA 1004
	je .close
6972 IgorA 1005
	or al,al
1006
	jz .close
5948 IgorA 1007
	push eax ebx ecx edx esi
1008
		call tl_iterat_next_all ;get next visible item
1009
		cmp edx,ecx
1010
		jle .line3 ;if end of list
6972 IgorA 1011
			cmp al,byte[edx+TreeNode.level]
5948 IgorA 1012
			jne .line3 ;jg ???
1013
			mov eax,3 ;line in middle element
1014
			jmp .line2
1015
		.line3:
1016
			mov eax,6 ;line in end element
1017
		.line2:
1277 IgorA 1018
 
5948 IgorA 1019
		mov ecx,esi ;load ecx
1020
		ror ebx,16
1021
		sub bx,tl_img_cx
1022
		ror ebx,16
1023
		cmp tl_data_img_sys,0
1024
		jne .draw_img_s
6972 IgorA 1025
			mcall SF_DRAW_RECT,,,tl_col_txt ;draw minus rect, if not system icons
5948 IgorA 1026
			jmp @f
1027
		.draw_img_s:
1028
		mov edx,ebx
1029
		ror ecx,16
1030
		mov dx,cx
1031
		mov cx,bx
1032
		ror ecx,16
1033
		mov ebx,3 ;rgb = 3 bytes
1034
		imul bx,tl_img_cx
1035
		imul bx,tl_img_cy
1277 IgorA 1036
 
5948 IgorA 1037
		imul ebx,eax ;eax = icon index
1038
		add ebx,tl_data_img_sys
6972 IgorA 1039
		mcall SF_PUT_IMAGE ;draw line icon
1040
		@@:
5948 IgorA 1041
	pop esi edx ecx ebx eax
1042
	.close:
1043
	ret
1277 IgorA 1044
 
1045
 
1401 IgorA 1046
;input:
5911 IgorA 1047
; al = уровень элемента
5948 IgorA 1048
; ebx = (node.left shl 16) + tl_img_cx
1401 IgorA 1049
; ecx = pointer to 1 node struct
6972 IgorA 1050
; edx = pointer to node struct
1401 IgorA 1051
; edi = pointer to 'TreeList' struct
1309 IgorA 1052
align 4
5948 IgorA 1053
proc tl_draw_node_icon_par_lin_up uses eax ebx ecx edx esi
1054
	cmp tl_data_img_sys,0 ;if not image
1055
	je @f
6972 IgorA 1056
	or al,al
1057
	jz @f
5948 IgorA 1058
		xor esi,esi ;в si будем насчитывать кол-во иконок, нужных для прорисовки линии
5911 IgorA 1059
;--- цикл для вычисления колличества вертикальных линий ---
5948 IgorA 1060
		.cycle0:
1061
			call tl_iterat_perv ;get perv visible item
1062
			cmp edx,ecx
1063
			jle .cycle1 ;if begin of list
1309 IgorA 1064
 
6972 IgorA 1065
			cmp byte[edx+TreeNode.level],al
5948 IgorA 1066
			jle .cycle0end ;уровень верхнего элемента не требует прорисовки
1067
			inc si
1068
			jmp .cycle0
1069
		.cycle0end:
6972 IgorA 1070
		or si,si ;si = кол-во иконок линии которые нужно нарисовать сверху
1071
		jz @f
5948 IgorA 1072
		shl esi,16
1309 IgorA 1073
 
5948 IgorA 1074
		pop ecx ;esi->ecx
1075
		push ecx ;save esi
1309 IgorA 1076
 
5948 IgorA 1077
		ror ebx,16
1078
		sub bx,tl_img_cx
1079
		ror ebx,16
1309 IgorA 1080
 
5948 IgorA 1081
		mov edx,ebx
1082
		ror ecx,16
1083
		mov dx,cx
1084
		mov cx,bx
1085
		ror ecx,16
1086
		mov cx,tl_img_cy ;restore size y (if crop)
1087
		mov ebx,3 ;rgb = 3 bytes
1088
		imul bx,tl_img_cx
1089
		imul bx,tl_img_cy
1090
		add ebx,tl_data_img_sys
1309 IgorA 1091
 
5948 IgorA 1092
		add esi,tl_box_top
1093
		add si,tl_capt_cy ;si = верхняя граница окна
6972 IgorA 1094
		mov eax,SF_PUT_IMAGE
5911 IgorA 1095
;--- цикл для рисования вертикальной линии ---
5948 IgorA 1096
		.cycle1:
1097
		sub dx,tl_img_cy ;поднимаем координату y вверх
1098
		cmp dx,si
1099
		jl @f
1100
			cmp esi,0x10000
1101
			jl @f
1102
			int 0x40 ;draw line icon
1103
			sub esi,0x10000 ;уменьшаем счетчик иконок
1104
		jmp .cycle1
1105
	@@:
1106
	ret
1107
endp
1309 IgorA 1108
 
1277 IgorA 1109
;input:
1110
; edi = pointer to TreeInfo struct
1111
;output:
1112
; eax = rows
1113
align 4
1114
tl_get_rows_count:
5948 IgorA 1115
	push ecx edx
1116
		mov eax,tl_box_height
1117
		sub ax,tl_capt_cy
6972 IgorA 1118
		movzx ecx,tl_img_cy
5948 IgorA 1119
		xor edx,edx
1120
		div ecx
1121
	pop edx ecx
1122
	ret
1277 IgorA 1123
 
1124
;input:
1125
; eax = node position
5911 IgorA 1126
; ebx = [координата по оси x]*65536 + [img_cx]
1127
; ecx = [координата по оси y]*65536 + [img_cy]
6972 IgorA 1128
; edx = pointer to node struct
1277 IgorA 1129
; edi = pointer to TreeInfo struct
1130
align 4
5948 IgorA 1131
proc tl_draw_node_caption uses ebx ecx edx esi
1132
	xor esi,esi
1133
	mov si,tl_info_size
1134
	cmp si,tl_info_capt_offs
1135
	jle @f ;if caption size <= 0
1136
		push eax
1137
			call tl_get_node_index ;eax = node index
1138
			imul esi,eax
1139
		pop eax
1140
		add si,tl_info_capt_offs
1141
		add esi,tl_data_info
1142
		mov edx,esi
1277 IgorA 1143
 
5948 IgorA 1144
		shr ebx,16
1145
		add bx,tl_img_cx ;сдвигаем надпись по горизонтали --->
1146
		add bx,3 ;отступ
1147
		;bx = coord.x
1148
		call tl_strlen ;eax = strlen
1149
		call tl_get_draw_text_len
1150
		mov cx,bx
1151
		ror ecx,16
1152
		mov ebx,ecx
1153
		add bx,tl_img_cy ;выравнивиние по нижней границе иконки
1154
		sub bx,9 ;отнимаем высоту текста
1155
		mov ecx,tl_col_txt
1156
		and ecx,0xffffff
6972 IgorA 1157
		mcall SF_DRAW_TEXT
5948 IgorA 1158
	@@:
1159
	ret
1160
endp
1277 IgorA 1161
 
1162
;input:
1163
; eax = strlen
1164
; ebx = text coord x
1165
;output:
1166
; esi = text len
1167
align 4
5948 IgorA 1168
proc tl_get_draw_text_len uses eax ecx edx
1169
	mov esi,eax ;берем длинну строки
1170
	mov eax,tl_box_left
1171
	add eax,tl_box_width
1172
	cmp eax,ebx
1173
	jle .text_null ;если подпись полностью вся за экраном
1174
		sub eax,ebx
1175
		xor edx,edx
1176
		mov ecx,6 ;ширина системного шрифта
1177
		div ecx ;смотрим сколько символов может поместиться на экране
1178
		cmp esi,eax
1179
		jl @f
1180
			mov esi,eax ;если длинна текста меньше, чем все место под строку
1181
			jmp @f
1182
	.text_null:
1183
	xor esi,esi
1184
	@@:
1185
	ret
1186
endp
1277 IgorA 1187
 
1188
;input:
1189
; esi = pointer to string
1190
;output:
1191
; eax = strlen
1192
align 4
1193
tl_strlen:
5948 IgorA 1194
	mov eax,esi
1195
	@@:
1196
		cmp byte[eax],0
1197
		je @f
1198
		inc eax
1199
		jmp @b
1200
	@@:
1201
	sub eax,esi
1202
	ret
1277 IgorA 1203
 
5911 IgorA 1204
;добавить узел
1277 IgorA 1205
;input:
5911 IgorA 1206
; tlist - указатель на структуру листа
1207
; n_opt - опции добавления
1208
; n_info - указатель на добавляемые данные
1277 IgorA 1209
align 4
5911 IgorA 1210
proc tl_node_add uses eax ebx ecx edx edi, tlist:dword, n_opt:dword, n_info:dword
6972 IgorA 1211
	mov edi,[tlist]
1277 IgorA 1212
 
5948 IgorA 1213
	call tl_info_set_undo
1277 IgorA 1214
 
6972 IgorA 1215
	mov ebx,sizeof.TreeNode
5948 IgorA 1216
	imul ebx,tl_info_max_count
1217
	add ebx,tl_data_nodes
1277 IgorA 1218
;--
5948 IgorA 1219
	call tl_get_cur_node_index ;eax=po_t
6972 IgorA 1220
	imul eax,sizeof.TreeNode
5948 IgorA 1221
	add eax,tl_data_nodes
1222
	mov edx,eax
1223
	call tl_move_perv
1224
	call tl_get_node_index ;eax = index of pointer [edx]
1277 IgorA 1225
;--
6972 IgorA 1226
	mov edx,sizeof.TreeNode
5948 IgorA 1227
	shl edx,1
1228
	add edx,tl_data_nodes
1229
	@@: ;for(i=2;i
6972 IgorA 1230
		cmp dword[edx+TreeNode.t_create],0
5948 IgorA 1231
		jne .u0
6972 IgorA 1232
		cmp dword[edx+TreeNode.t_delete],0
5948 IgorA 1233
		jne .u0
1277 IgorA 1234
 
5948 IgorA 1235
		inc tl_ch_tim
1236
		mov ecx,dword[n_opt]
1237
		ror ecx,16 ;cx = type
6972 IgorA 1238
		mov word[edx+TreeNode.type],cx
5948 IgorA 1239
		rol ecx,8 ;cl = close|open
6972 IgorA 1240
		mov byte[edx+TreeNode.close],cl ;node[i].clo
1241
		mov byte[edx+TreeNode.level],0 ;node[i].lev=0
5948 IgorA 1242
		bt tl_style,2 ;tl_list_box_mode
1243
		jc .l_box_m
1244
			mov cl,byte[n_opt]
6972 IgorA 1245
			mov byte[edx+TreeNode.level],cl ;node[i].lev
5948 IgorA 1246
		.l_box_m:
1247
		push tl_ch_tim       ;node[i].tc=ch_tim;
6972 IgorA 1248
		pop dword[edx+TreeNode.t_create]
1249
		mov [edx+TreeNode.perv],eax ;node[i].perv=po_t;
5948 IgorA 1250
		;*** copy node data ***
1251
		push esi
1252
		xor ecx,ecx
1253
		mov cx,tl_info_size
1254
		mov esi,ecx
1277 IgorA 1255
 
5948 IgorA 1256
		push eax
1257
			call tl_get_node_index ;eax = node index
1258
			imul esi,eax
1259
		pop eax
1260
		add esi,tl_data_info
1261
		mov edi,dword[n_info] ;pointer to node data
1262
		xchg edi,esi
1263
		rep movsb
1277 IgorA 1264
 
5948 IgorA 1265
		mov esi,edi
6972 IgorA 1266
		mov edi,[tlist] ;restore edi
5948 IgorA 1267
		mov cx,tl_info_capt_offs
1268
		cmp cx,tl_info_size
1269
		jge .no_text_data
1270
		cmp tl_info_capt_len,0 ;проверяем есть ли ограничение на длинну строки
1271
		je .no_len_ogran
1272
			add cx,tl_info_capt_len
1273
			and ecx,0xffff
1274
			add esi,ecx
1275
			mov cx,tl_info_size
1276
			sub esi,ecx
1277
		.no_len_ogran:
1278
		dec esi
1279
		mov byte[esi],0
1280
		.no_text_data:
1281
		pop esi ;restore esi
1277 IgorA 1282
 
5948 IgorA 1283
		mov ecx,eax
6972 IgorA 1284
		imul ecx,sizeof.TreeNode
5948 IgorA 1285
		add ecx,tl_data_nodes ; *** ecx = node[po_t] ***
6972 IgorA 1286
		add ecx,TreeNode.next ; *** ecx = node[po_t].next ***
5948 IgorA 1287
		push dword[ecx] ;node[i].next=node[po_t].next;
6972 IgorA 1288
		pop dword[edx+TreeNode.next]
1277 IgorA 1289
 
5948 IgorA 1290
		call tl_get_node_index ;*** eax = i ***
1291
		cmp eax,tl_info_max_count
1292
		jge .u0
1293
			mov [ecx],eax ;node[po_t].next=i; // ссылки перенаправляем
6972 IgorA 1294
			mov ecx,[edx+TreeNode.next] ; *** ecx = node[i].next ***
1295
			imul ecx,sizeof.TreeNode
5948 IgorA 1296
			add ecx,tl_data_nodes ; *** ecx = node[node[i].next] ***
6972 IgorA 1297
			mov [ecx+TreeNode.perv],eax ;node[node[i].next].perv=i;
1277 IgorA 1298
 
5948 IgorA 1299
			call tb_scrol_resize ;обработка скроллинга
1300
			jmp @f
1301
		.u0:
6972 IgorA 1302
		add edx,sizeof.TreeNode
5948 IgorA 1303
		cmp edx,ebx ;enf of node memory ?
1304
		jle @b
1305
	@@:
5879 IgorA 1306
	ret
1307
endp
1277 IgorA 1308
 
1309
;input:
1310
; edi = pointer to TreeInfo struct
1311
align 4
5879 IgorA 1312
proc tb_scrol_resize uses eax ecx edx
5911 IgorA 1313
	cmp tl_p_scroll,0 ;обработка скроллинга
5948 IgorA 1314
	je @f
1315
		call tl_get_node_count ;eax = node count
1316
		mov ecx,eax
1317
		call tl_get_rows_count
1318
		cmp ecx,eax
1319
		jg .ye_sb
1320
			xor ecx,ecx
1321
		.ye_sb:
1322
		mov edx,tl_p_scroll
1323
		mov dword[edx+sb_offs_cur_area],eax
1324
		mov dword[edx+sb_offs_max_area],ecx
5879 IgorA 1325
		stdcall scroll_bar_vertical.draw,edx
5948 IgorA 1326
	@@:
1327
	ret
5879 IgorA 1328
endp
1277 IgorA 1329
 
1330
;input:
5879 IgorA 1331
;n_info - pointer to node info
1277 IgorA 1332
align 4
5911 IgorA 1333
proc tl_node_set_data uses eax ecx edx edi esi, tlist:dword, n_info:dword
6972 IgorA 1334
	mov edi,[tlist]
5948 IgorA 1335
	call tl_get_cur_node_index ;eax=po_t
1336
	cmp eax,2
1337
	jl @f
1338
		xor ecx,ecx
1339
		mov cx,tl_info_size
1340
		imul eax,ecx
1341
		add eax,tl_data_info
1342
		mov edi,eax
1343
		mov esi,dword[n_info] ;pointer to node data
1344
		rep movsb
1277 IgorA 1345
 
5948 IgorA 1346
		mov esi,edi
6972 IgorA 1347
		mov edi,[tlist] ;restore edi
5948 IgorA 1348
		mov cx,tl_info_capt_offs
1349
		cmp cx,tl_info_size
1350
		jge .no_text_data
1351
			mov ax,tl_info_capt_len ;проверяем есть ли ограничение на длинну текста
6972 IgorA 1352
			or ax,ax
1353
			jz .no_limit
5948 IgorA 1354
				add cx,ax ;cx = tl_info_capt_offs + tl_info_capt_len
1355
				and ecx,0xffff
1356
				xor eax,eax
1357
				mov ax,tl_info_size
1358
				cmp eax,ecx
1359
				jl .no_limit ;пользователь задал слишком большую длинну текста
1360
				add esi,ecx
1361
				sub esi,eax
1362
			.no_limit:
1363
			dec esi
1364
			mov byte[esi],0 ;обнуляем последний символ подписи, что-бы не глючило если пользователь задал неправильную структуру
1365
		.no_text_data:
1366
	@@:
5879 IgorA 1367
	ret
1368
endp
1277 IgorA 1369
 
5911 IgorA 1370
;взять указатель на данные узла под курсором
1277 IgorA 1371
;input:
5911 IgorA 1372
; tlist - pointer to 'TreeList' struct
1373
;output:
1374
; eax - pointer to node data
1277 IgorA 1375
align 4
5911 IgorA 1376
proc tl_node_get_data uses ecx edi, tlist:dword
6972 IgorA 1377
	mov edi,[tlist]
5911 IgorA 1378
	call tl_get_cur_node_index ;eax=po_t
1379
	cmp eax,2
1380
	jl @f
1381
		movzx ecx,tl_info_size
1382
		imul eax,ecx
1383
		add eax,tl_data_info
1384
		jmp .end_f ;return node data pointer
1385
	@@:
1386
	xor eax,eax
1387
	.end_f:
1277 IgorA 1388
  ret
5911 IgorA 1389
endp
1277 IgorA 1390
 
5911 IgorA 1391
;взять указатель на структуру узла в указанной позиции
1277 IgorA 1392
;input:
5911 IgorA 1393
; tlist - pointer to 'TreeList' struct
1394
; node_ind - node index
1395
;output:
1396
; eax - pointer to node info
1277 IgorA 1397
align 4
5914 IgorA 1398
proc tl_node_poi_get_info uses ebx ecx edx edi, tlist:dword, node_ind:dword
6972 IgorA 1399
	mov edi,[tlist]
5911 IgorA 1400
	mov ebx,dword[node_ind]
1277 IgorA 1401
 
5911 IgorA 1402
	;cycle to nodes
5914 IgorA 1403
	mov edx,tl_data_nodes
1404
	mov ecx,edx
6972 IgorA 1405
	add ecx,sizeof.TreeNode
5911 IgorA 1406
	@@:
1407
		call tl_iterat_next_all
5914 IgorA 1408
		cmp edx,ecx
5911 IgorA 1409
		jle @f
1410
		dec ebx
1411
		cmp ebx,0
1412
		jg @b
1413
		jmp .find
1414
	@@:
5914 IgorA 1415
		xor edx,edx
5911 IgorA 1416
	.find:
5914 IgorA 1417
	mov eax,edx
5911 IgorA 1418
	ret
1419
endp
1277 IgorA 1420
 
5911 IgorA 1421
;взять указатель на следущую структуру узла
1277 IgorA 1422
;input:
5911 IgorA 1423
; tlist - pointer to 'TreeList' struct
1424
; node_p - node param struct
1425
;output:
1426
; eax - pointer to next node struct
1277 IgorA 1427
align 4
5911 IgorA 1428
proc tl_node_poi_get_next_info uses ecx edx edi, tlist:dword, node_p:dword
6972 IgorA 1429
	mov edi,[tlist]
5911 IgorA 1430
	mov edx,dword[node_p]
1277 IgorA 1431
 
5911 IgorA 1432
	mov ecx,tl_data_nodes
6972 IgorA 1433
	add ecx,sizeof.TreeNode
1277 IgorA 1434
 
5911 IgorA 1435
	call tl_iterat_next_all
1436
	cmp edx,ecx
1437
	jg @f
1438
		xor edx,edx
1439
	@@:
1440
	mov eax,edx
1441
	ret
1442
endp
1277 IgorA 1443
 
5911 IgorA 1444
;взять указатель на данные узла
1277 IgorA 1445
;input:
5911 IgorA 1446
; tlist - pointer to 'TreeList' struct
1447
; node_p - node param struct
1448
;output:
1449
; eax - pointer
1277 IgorA 1450
align 4
5911 IgorA 1451
proc tl_node_poi_get_data uses ecx edx edi, tlist:dword, node_p:dword
6972 IgorA 1452
	mov edi,[tlist]
5911 IgorA 1453
	mov edx,dword[node_p]
1277 IgorA 1454
 
5948 IgorA 1455
	call tl_get_node_index ;eax = node index
1456
	cmp eax,2
1457
	jl @f
1458
		xor ecx,ecx
1459
		mov cx,tl_info_size
1460
		imul eax,ecx
5911 IgorA 1461
		add eax,tl_data_info
1462
		jmp .end_f ;return node data pointer
5948 IgorA 1463
	@@:
5911 IgorA 1464
		xor eax,eax ;возвращаем 0 в случае не удачного поиска
1465
	.end_f:
1466
	ret
1467
endp
1277 IgorA 1468
 
5911 IgorA 1469
;берет позицию под курсором
1277 IgorA 1470
;input:
1471
; edi = pointer 'tl' struct
1472
;output:
1473
; eax = index of current node
1474
align 4
5879 IgorA 1475
proc tl_get_cur_node_index uses ecx edx
5911 IgorA 1476
	;cycle to nodes
1477
	xor eax,eax
1478
	mov edx,tl_data_nodes
1479
	mov ecx,edx
6972 IgorA 1480
	add ecx,sizeof.TreeNode
5911 IgorA 1481
	@@:
1482
		call tl_iterat_next
1483
		cmp edx,ecx
1484
		jle @f
1485
		cmp eax,tl_cur_pos
1486
		je @f
1487
		inc eax
1488
		jmp @b
1489
	@@:
1490
	mov eax,edx
1491
	sub eax,tl_data_nodes
1492
	xor edx,edx
6972 IgorA 1493
	mov ecx,sizeof.TreeNode
5911 IgorA 1494
	div ecx
1495
	ret
5879 IgorA 1496
endp
1277 IgorA 1497
 
5911 IgorA 1498
;берет позицию указанного символа
1277 IgorA 1499
;input:
1500
; edx = pointer node memory
1501
; edi = pointer 'tl' struct
1502
;output:
1503
; eax = struct index of current node
1504
align 4
5879 IgorA 1505
tl_get_node_index:
5911 IgorA 1506
	push ecx edx
1507
	mov eax,edx
1508
	sub eax,tl_data_nodes
1509
	xor edx,edx
6972 IgorA 1510
	mov ecx,sizeof.TreeNode
5911 IgorA 1511
	div ecx
1512
	pop edx ecx
1513
	ret
1277 IgorA 1514
 
5911 IgorA 1515
;удалить узел
1277 IgorA 1516
align 4
5879 IgorA 1517
proc tl_node_delete uses eax edx edi, tlist:dword
6972 IgorA 1518
	mov edi,[tlist]
5911 IgorA 1519
	call tl_get_cur_node_index ;eax=po_t
1520
	cmp eax,2
1521
	jl @f
6972 IgorA 1522
		imul eax,sizeof.TreeNode
5911 IgorA 1523
		add eax,tl_data_nodes
1524
		mov edx,eax
1525
		inc tl_ch_tim
1526
		mov eax,tl_ch_tim
6972 IgorA 1527
		mov dword[edx+TreeNode.t_delete],eax
5911 IgorA 1528
		call tb_scrol_resize ;обработка скроллинга
1529
	@@:
5879 IgorA 1530
	ret
1531
endp
1277 IgorA 1532
 
5911 IgorA 1533
;поставить курсор на первый узел
1277 IgorA 1534
align 4
5879 IgorA 1535
proc tl_cur_beg uses edi, tlist:dword
6972 IgorA 1536
	mov edi,[tlist]
5911 IgorA 1537
	mov tl_cur_pos,0
1538
	cmp tl_p_scroll,0
1539
	je @f
1540
		mov edi,tl_p_scroll
1541
		mov dword[edi+sb_offs_position],0
5879 IgorA 1542
		stdcall scroll_bar_vertical.draw, edi
5911 IgorA 1543
	@@:
5879 IgorA 1544
	ret
1545
endp
1277 IgorA 1546
 
5911 IgorA 1547
;перенести курсор на 1 позицию ниже
1277 IgorA 1548
align 4
5879 IgorA 1549
proc tl_cur_next uses eax ebx edi esi, tlist:dword
6972 IgorA 1550
	mov edi,[tlist]
5948 IgorA 1551
	call tl_get_node_count ;eax = node count
1552
	cmp tl_cur_pos,eax
1553
	jge .no_redraw
1554
		mov esi,tl_box_top
1555
		add esi,tl_box_height ;esi = coord bottom border
1556
		call tl_draw_null_cursor ;стираем курсор
1557
		inc tl_cur_pos
1277 IgorA 1558
 
5948 IgorA 1559
		cmp tl_p_scroll,0 ;if not scrol struct
1560
		je @f
1561
		call tl_get_rows_count ;eax = rows count
1562
		mov ebx,tl_p_scroll
1563
		add eax,dword[ebx+sb_offs_position]
1564
		cmp tl_cur_pos,eax
1565
		jl @f
1566
			inc dword[ebx+sb_offs_position]
1567
			stdcall scroll_bar_vertical.draw,ebx
1568
			stdcall tl_draw,dword[tlist] ;полная перерисовка окна
1569
			jmp .no_redraw
1570
		@@:
6972 IgorA 1571
		mov edi,[tlist] ;restore edi
5948 IgorA 1572
		call tl_draw_cursor ;перерисовка курсора
1573
		call tl_draw_caption_cur_pos
1574
	.no_redraw:
5879 IgorA 1575
	ret
1576
endp
1277 IgorA 1577
 
5911 IgorA 1578
;берет число всех видимых узлов (не считая закрытых дочерних)
1277 IgorA 1579
;input:
1580
; edi = pointer 'tl' struct
1581
;output:
1582
; eax = struct index of current node
1583
align 4
5879 IgorA 1584
tl_get_node_count:
5911 IgorA 1585
push ecx edx
1586
	;cycle to nodes
1587
	xor eax,eax
1588
	mov edx,tl_data_nodes
1589
	mov ecx,edx
6972 IgorA 1590
	add ecx,sizeof.TreeNode
5911 IgorA 1591
	@@:
1592
		call tl_iterat_next
1593
		cmp edx,ecx
1594
		jle @f
1595
		inc eax
1596
		jmp @b
1597
	@@:
1598
pop edx ecx
1599
	ret
1277 IgorA 1600
 
5911 IgorA 1601
;берет число всех видимых узлов (считая закрытые дочерние)
1303 IgorA 1602
;input:
1603
; edi = pointer 'tl' struct
1604
;output:
1605
; eax = struct index of current node
1277 IgorA 1606
align 4
5879 IgorA 1607
tl_get_node_count_all:
5911 IgorA 1608
push ecx edx
1609
	;cycle to nodes
1610
	xor eax,eax
1611
	mov edx,tl_data_nodes
1612
	mov ecx,edx
6972 IgorA 1613
	add ecx,sizeof.TreeNode
5911 IgorA 1614
	@@:
1615
		call tl_iterat_next_all
1616
		cmp edx,ecx
1617
		jle @f
1618
		inc eax
1619
		jmp @b
1620
	@@:
1621
pop edx ecx
1622
	ret
1303 IgorA 1623
 
5911 IgorA 1624
;перенести курсор на 1 позицию выше
1303 IgorA 1625
align 4
5879 IgorA 1626
proc tl_cur_perv uses eax edi esi, tlist:dword
6972 IgorA 1627
	mov edi,[tlist]
5911 IgorA 1628
	cmp tl_cur_pos,0
1629
	je .no_redraw
1630
		mov esi,tl_box_top
1631
		add esi,tl_box_height ;esi = coord bottom border
1632
		call tl_draw_null_cursor ;стираем курсор
1633
		dec tl_cur_pos ;двигаем курсор вверх
1277 IgorA 1634
 
5911 IgorA 1635
		cmp tl_p_scroll,0 ;если есть указатель на скроллинг
1636
		je @f
1637
		mov eax,tl_p_scroll
1638
		cmp dword[eax+sb_offs_position],0 ;если скроллинг на верху, выходим
1639
		je @f
1640
		mov edi,tl_cur_pos
1641
		cmp edi,dword[eax+sb_offs_position] ;если курсор ушел выше скроллинга, тогда опускаем скроллинг
1642
		jge @f
1643
			dec dword[eax+sb_offs_position]
1644
			stdcall scroll_bar_vertical.draw, eax
1645
			stdcall tl_draw, dword[tlist] ;полная перерисовка окна
1646
			jmp .no_redraw
1647
		@@:
6972 IgorA 1648
			mov edi,[tlist] ;restore edi
5911 IgorA 1649
			call tl_draw_cursor ;перерисовка курсора
1650
			call tl_draw_caption_cur_pos
1651
	.no_redraw:
5879 IgorA 1652
	ret
1653
endp
1277 IgorA 1654
 
5911 IgorA 1655
;перенести курсор на 1 страницу выше
1277 IgorA 1656
align 4
5879 IgorA 1657
proc tl_cur_page_up uses eax edi esi, tlist:dword
6972 IgorA 1658
	mov edi,[tlist]
1303 IgorA 1659
 
5948 IgorA 1660
	cmp tl_p_scroll,0 ;если есть указатель на скроллинг
1661
	je .no_redraw
1662
		mov esi,tl_p_scroll
1663
		call tl_get_rows_count ;eax = rows count
1303 IgorA 1664
 
5948 IgorA 1665
		cmp tl_cur_pos,0
1666
		jne @f
1667
		cmp dword[esi+sb_offs_position],0 ;если скроллинг на верху, выходим
1668
		jne @f
1669
			jmp .no_redraw
1670
		@@:
1671
		cmp tl_cur_pos,eax ;проверяем позицию курсора и кол-во сток на странице
1672
		jl @f ;если меньше, то приравниваем к 0, что-бы не отнять больше чем надо
1673
			sub tl_cur_pos,eax
1674
			jmp .cursor
1675
		@@:
1676
			mov tl_cur_pos,0
1677
		.cursor:
1678
		cmp dword[esi+sb_offs_position],eax
1679
		jl @f
1680
			sub dword[esi+sb_offs_position],eax
1681
			jmp .scroll
1682
		@@:
1683
		mov dword[esi+sb_offs_position],0
1684
		.scroll:
1685
		;перерисовки окна и скроллинга
1686
		stdcall tl_draw, edi ;draw window
1687
		stdcall scroll_bar_vertical.draw, esi
1688
	.no_redraw:
5879 IgorA 1689
	ret
1690
endp
1303 IgorA 1691
 
5911 IgorA 1692
;перенести курсор на 1 страницу ниже
1303 IgorA 1693
align 4
5879 IgorA 1694
proc tl_cur_page_down uses eax ebx ecx edi esi, tlist:dword
5911 IgorA 1695
;eax - кол-во строк на странице
1696
;ebx - макс. позиция курсора
1697
;ecx - макс. позиция скроллинга
6972 IgorA 1698
	mov edi,[tlist]
5948 IgorA 1699
	cmp tl_p_scroll,0 ;если есть указатель на скроллинг
1700
	je .no_redraw
1701
		mov esi,tl_p_scroll
1702
		call tl_get_node_count ;eax = node count
1703
		mov ebx,eax
1704
		call tl_get_rows_count ;eax = rows count
1303 IgorA 1705
 
5948 IgorA 1706
		mov ecx,ebx
1707
		inc ecx ;если нижний узел виден на половину
1708
		cmp ecx,eax ;if (ecx>eax) { ecx=ecx-eax } else { ecx=0 }
1709
		jl @f
1710
			sub ecx,eax ;уменьшаем максимальную позицию скроллинга, так что-бы были видны последние узлы
1711
			jmp .control
1712
		@@:
1713
			xor ecx,ecx ;ecx=0 - все узлы влазят в экран, скроллинг не нужен
1714
		.control:
1303 IgorA 1715
 
5948 IgorA 1716
		cmp tl_cur_pos,ebx ;курсор внизу ?
1717
		jl @f
1718
		cmp dword[esi+sb_offs_position],ecx ;скроллинг внизу ?
1719
		jl @f
1720
			jmp .no_redraw
1721
		@@:
1722
		add tl_cur_pos,eax ;перемещаем курсор
1723
		cmp tl_cur_pos,ebx
1724
		jl @f
1725
			mov tl_cur_pos,ebx
1726
		@@:
1727
		add dword[esi+sb_offs_position],eax ;перемещаем скроллинг
1728
		cmp dword[esi+sb_offs_position],ecx
1729
		jl @f
1730
			mov dword[esi+sb_offs_position],ecx
1731
		@@:
1303 IgorA 1732
 
5948 IgorA 1733
		;перерисовки окна и скроллинга
1734
		stdcall tl_draw, edi ;draw window
1735
		stdcall scroll_bar_vertical.draw, esi
1736
	.no_redraw:
5879 IgorA 1737
	ret
1738
endp
1303 IgorA 1739
 
5911 IgorA 1740
;открыть/закрыть узел (работает с узлами которые имеют дочерние узлы)
1303 IgorA 1741
align 4
5879 IgorA 1742
proc tl_node_close_open uses eax edx edi, tlist:dword
6972 IgorA 1743
	mov edi,[tlist]
5911 IgorA 1744
	call tl_get_cur_node_index ;eax = позиция узла на котором стоит курсор
1745
	cmp eax,2 ;курсор стоит на узле ?
1746
	jl @f
6972 IgorA 1747
		imul eax,sizeof.TreeNode
5911 IgorA 1748
		add eax,tl_data_nodes
1749
		;eax = указатель на структуру узла выбранного курсором
1750
		push eax
1751
			stdcall tl_node_poi_get_next_info, edi,eax
1752
			mov edx,eax ;edx = указатель на структуру узла который идет после узла eax
1753
		pop eax
6972 IgorA 1754
		or edx,edx ;есть ли узлы ниже выбранного нами ?
1755
		jz @f
1756
			mov dl,byte[edx+TreeNode.level] ;берем уровень нижнего узла
1757
			cmp byte[eax+TreeNode.level],dl
5911 IgorA 1758
			jge @f ;если нижние узлы меньшего уровня, значит они не дочерние, конец функции
6972 IgorA 1759
				xor byte[eax+TreeNode.close],1 ;*** открытие/закрытие узла ***
5911 IgorA 1760
				call tb_scrol_resize ;обработка скроллинга
1277 IgorA 1761
 
5911 IgorA 1762
				stdcall tl_draw, edi ;обновление окна
1763
	@@:
5879 IgorA 1764
	ret
1765
endp
1277 IgorA 1766
 
5911 IgorA 1767
;увеличить уровень
1277 IgorA 1768
align 4
5879 IgorA 1769
proc tl_node_lev_inc uses eax ecx edx edi, tlist:dword
6972 IgorA 1770
	mov edi,[tlist]
5911 IgorA 1771
	bt tl_style,2 ;tl_list_box_mode
1772
	jc @f
1773
	call tl_get_cur_node_index ;eax=po_t
1774
	cmp eax,2
1775
	jl @f
1776
		mov ecx,tl_data_nodes
6972 IgorA 1777
		imul eax,sizeof.TreeNode
1778
		add eax,ecx ;eax = pointer to node struct
1779
		add ecx,sizeof.TreeNode ;ecx = pointer to 1 node struct
1401 IgorA 1780
 
5911 IgorA 1781
		mov edx,eax
1782
		call tl_iterat_perv ;проверяем есть ли верхний узел
1783
		cmp edx,ecx
1784
		jle @f ;если верхнего узла нет то текущий узел не двигаем
6972 IgorA 1785
		mov cl,byte[edx+TreeNode.level] ;берем уровень родительского узла
5911 IgorA 1786
		inc cl ;добавляем 1 и получаем максимальное значение
6972 IgorA 1787
		cmp byte[eax+TreeNode.level],cl
5911 IgorA 1788
		jge @f
6972 IgorA 1789
			inc byte[eax+TreeNode.level] ;увеличиваем значение узла
5911 IgorA 1790
	@@:
5879 IgorA 1791
	ret
1792
endp
1277 IgorA 1793
 
5911 IgorA 1794
;уменьшить уровень
1277 IgorA 1795
align 4
5879 IgorA 1796
proc tl_node_lev_dec uses eax edi, tlist:dword
6972 IgorA 1797
	mov edi,[tlist]
5911 IgorA 1798
	call tl_get_cur_node_index ;eax=po_t
1799
	cmp eax,2
1800
	jl @f
6972 IgorA 1801
		imul eax,sizeof.TreeNode
5911 IgorA 1802
		add eax,tl_data_nodes
1803
		cmp byte[eax+2],0
1804
		je @f
1805
		dec byte[eax+2]
1806
	@@:
5879 IgorA 1807
	ret
1808
endp
1277 IgorA 1809
 
5911 IgorA 1810
;перемещаем узел вверх
1285 IgorA 1811
align 4
5914 IgorA 1812
proc tl_node_move_up tlist:dword
1813
pushad
6972 IgorA 1814
	mov edi,[tlist]
5911 IgorA 1815
	call tl_get_cur_node_index ;eax=po_t
1816
	cmp eax,2
1817
	jl @f
1818
		mov ebx,eax ;copy index of node struct
1819
		mov edx,tl_data_nodes
1820
		mov ecx,edx
6972 IgorA 1821
		add ecx,sizeof.TreeNode
1822
		imul eax,sizeof.TreeNode
5911 IgorA 1823
		add eax,edx ;eax = pointer to 2 node struct
1824
		mov edx,eax ;edx = pointer to 2 node struct
1825
		mov esi,eax ;esi = pointer to 2 node struct
1826
		call tl_iterat_perv ;edx = pointer to 1 node struct
1827
		call tl_get_node_index ;eax = index of 1 node struct
1828
		cmp edx,ecx
1829
		jle @f
6972 IgorA 1830
			cmp dword[edx+TreeNode.next],ebx
5911 IgorA 1831
			jne .po8
1832
				call tl_node_move_po6 ;узлы идут подряд меняем 6 ссылок
1833
				jmp .cur_mov
1834
			.po8:
1835
				call tl_node_move_po8 ;узлы идут не подряд меняем 8 ссылок
1836
			.cur_mov:
1837
				push dword edi
1838
				call tl_cur_perv
1839
				push dword edi
1840
				call tl_draw
1841
	@@:
5914 IgorA 1842
popad
5879 IgorA 1843
	ret
1844
endp
1285 IgorA 1845
 
5911 IgorA 1846
;перемещаем узел вниз
1285 IgorA 1847
align 4
5914 IgorA 1848
proc tl_node_move_down tlist:dword
1849
pushad
6972 IgorA 1850
	mov edi,[tlist]
5911 IgorA 1851
	call tl_get_cur_node_index ;eax=po_t
1852
	cmp eax,2
1853
	jl @f
1854
		mov ebx,eax ;copy index of node struct
1855
		mov edx,tl_data_nodes
1856
		mov ecx,edx
6972 IgorA 1857
		add ecx,sizeof.TreeNode
1858
		imul eax,sizeof.TreeNode
5911 IgorA 1859
		add eax,edx ;eax = pointer to 1 node struct
1860
		mov edx,eax ;edx = pointer to 1 node struct
1861
		mov esi,eax ;esi = pointer to 1 node struct
1862
		call tl_iterat_next ;edx = pointer to 2 node struct
1863
		call tl_get_node_index ;eax = index of 2 node struct
1864
		cmp edx,ecx
1865
		jle @f
6972 IgorA 1866
			cmp dword[esi+TreeNode.next],eax
5911 IgorA 1867
			jne .po8
1868
				xchg eax,ebx ;меняе порядок следования заменяемых узлов
1869
				xchg edx,esi
1870
				call tl_node_move_po6 ;узлы идут подряд меняем 6 ссылок
1871
				jmp .cur_mov
1872
			.po8: ;а тут порядок следования узлов не меняем
1873
				call tl_node_move_po8 ;узлы идут не подряд меняем 8 ссылок
1874
			.cur_mov:
1875
				stdcall tl_cur_next, edi
1876
				stdcall tl_draw, edi
1877
	@@:
5879 IgorA 1878
	ret
5914 IgorA 1879
popad
5879 IgorA 1880
endp
1285 IgorA 1881
 
1882
align 4
1883
tl_node_move_po6:
5914 IgorA 1884
	mov ecx,edx ;save node pointer
1885
	call tl_move_perv
6972 IgorA 1886
	mov dword[edx+TreeNode.next],ebx
1285 IgorA 1887
 
5914 IgorA 1888
	mov edx,esi
1889
	call tl_move_next
6972 IgorA 1890
	mov dword[edx+TreeNode.perv],eax
5914 IgorA 1891
	mov edx,ecx ;restore node pointer
1285 IgorA 1892
 
6972 IgorA 1893
	mov ecx,dword[edx+TreeNode.perv]
1894
	mov dword[esi+TreeNode.perv],ecx
1895
	mov ecx,dword[esi+TreeNode.next]
1896
	mov dword[edx+TreeNode.next],ecx
1285 IgorA 1897
 
6972 IgorA 1898
	mov dword[edx+TreeNode.perv],ebx
1899
	mov dword[esi+TreeNode.next],eax
5914 IgorA 1900
	ret
1285 IgorA 1901
 
1902
;input
1903
;eax = index 1 node struct
1904
;ebx = index 2 node struct
1905
;edx = pointer 1 node struct
1906
;esi = pointer 2 node struct
1907
;edi = pointer to 'TreeList' struct
1908
;output:
1909
;eax = ?
1910
;ebx = ?
1911
;ecx = ?
1912
align 4
1913
tl_node_move_po8:
5914 IgorA 1914
	mov ecx,edx ;save node pointer
1915
	call tl_move_perv
6972 IgorA 1916
	mov dword[edx+TreeNode.next],ebx
5914 IgorA 1917
	mov edx,ecx
1918
	call tl_move_next
6972 IgorA 1919
	mov dword[edx+TreeNode.perv],ebx
5914 IgorA 1920
	mov edx,esi
1921
	call tl_move_perv
6972 IgorA 1922
	mov dword[edx+TreeNode.next],eax
5914 IgorA 1923
	mov edx,esi
1924
	call tl_move_next
6972 IgorA 1925
	mov dword[edx+TreeNode.perv],eax
5914 IgorA 1926
	mov edx,ecx ;restore node pointer
1285 IgorA 1927
 
6972 IgorA 1928
	mov eax,dword[edx+TreeNode.perv]
1929
	mov ebx,dword[esi+TreeNode.perv]
5914 IgorA 1930
	xchg eax,ebx
6972 IgorA 1931
	mov dword[edx+TreeNode.perv],eax
1932
	mov dword[esi+TreeNode.perv],ebx
1933
 
1934
	mov eax,dword[edx+TreeNode.next]
1935
	mov ebx,dword[esi+TreeNode.next]
5914 IgorA 1936
	xchg eax,ebx
6972 IgorA 1937
	mov dword[edx+TreeNode.next],eax
1938
	mov dword[esi+TreeNode.next],ebx
5914 IgorA 1939
	ret
1285 IgorA 1940
 
1941
;input:
1942
; edi = pointer to 'TreeList' struct
1943
align 4
1944
tl_draw_caption_cur_pos:
5911 IgorA 1945
	cmp tl_capt_cy,9 ;9 - minimum caption height
1946
	jl @f
1947
	pushad
1948
		mov ebx,edi ;calculate cursor position
1949
		mov eax,tl_cur_pos
1950
		inc eax
6972 IgorA 1951
		lea edi,[txt_capt_cur.v]
1952
		stdcall tl_convert_to_str, 5
5911 IgorA 1953
		mov edi,ebx
1309 IgorA 1954
 
5911 IgorA 1955
		mov ebx,tl_box_left
1956
		shl ebx,16
1957
		add ebx,5*65536+3
1958
		add ebx,tl_box_top
1959
		mov ecx,tl_col_txt
1960
		or  ecx,0xc0000000 ;0x40000000 закрашивать фон цветом edi
1961
		lea edx,[txt_capt_cur]
1962
		mov edi,tl_col_zag
6972 IgorA 1963
		mcall SF_DRAW_TEXT ;captions
5911 IgorA 1964
	popad
1965
	@@:
1966
	ret
1285 IgorA 1967
 
1303 IgorA 1968
;input:
5911 IgorA 1969
; tlist - pointer to 'TreeList' struct
1970
; opt - options: 0 - first element, 1 - add next element
1971
; h_mem - pointer to memory
1972
; mem_size - memory size
1303 IgorA 1973
;output:
5911 IgorA 1974
; eax - error code
1303 IgorA 1975
align 4
5911 IgorA 1976
proc tl_save_mem uses ebx ecx edx edi esi, tlist:dword, opt:dword, h_mem:dword, mem_size:dword
6972 IgorA 1977
	mov esi,[h_mem]
1978
	mov edi,[tlist]
1303 IgorA 1979
 
5911 IgorA 1980
	cmp dword[opt],0 ;add mode
1981
	je @f
1982
		stdcall tl_get_mem_size, edi,esi ;eax = размер ранее сохранённых данных
1983
		add esi,eax
1984
	@@:
1303 IgorA 1985
 
5911 IgorA 1986
	xor ebx,ebx
1987
	mov bx,tl_info_size
1303 IgorA 1988
 
5911 IgorA 1989
	call tl_get_node_count_all ;eax = all node count
1303 IgorA 1990
 
5911 IgorA 1991
	mov ecx,eax  ;вычисляем сколько памяти должно быть заполнено
1992
	imul ecx,ebx ;умножаем на размер структуры узла
1993
	add ecx,tl_save_load_heder_size+1 ;element header +1 end element sumbol
1994
	add ecx,esi  ;добавляем указатель на начало памяти (с учетом ранее записанных структур)
1995
	sub ecx,dword[h_mem] ;отнимаем указатель на начало памяти (без ранее записанных структур)
1996
	cmp ecx,dword[mem_size] ;ecx = element memory size
1997
	jg .err_mem_size
1303 IgorA 1998
 
5911 IgorA 1999
		;save tree params (in header)
2000
		mov dword[esi],'tree'
2001
		mov word[esi+4],bx
2002
		mov dword[esi+6],eax ;element count
1303 IgorA 2003
 
5911 IgorA 2004
		mov eax,tl_style
2005
		mov dword[esi+10],eax
1303 IgorA 2006
 
5911 IgorA 2007
		mov eax,tl_cur_pos
2008
		mov dword[esi+14],eax
1303 IgorA 2009
 
5911 IgorA 2010
		mov ax,tl_info_capt_offs
2011
		mov word[esi+18],ax
1303 IgorA 2012
 
5911 IgorA 2013
		mov ax,tl_info_capt_len
2014
		mov word[esi+20],ax
1303 IgorA 2015
 
5911 IgorA 2016
		;copy scroll position
2017
		mov edx,tl_p_scroll
2018
		mov eax,dword[edx+sb_offs_position]
2019
		mov dword[esi+22],eax
1309 IgorA 2020
 
5911 IgorA 2021
		add esi,tl_save_load_heder_size ;add header size
1309 IgorA 2022
 
5911 IgorA 2023
		;cycle to nodes
2024
		mov edx,tl_data_nodes
2025
		mov ecx,edx
6972 IgorA 2026
		add ecx,sizeof.TreeNode
5911 IgorA 2027
		@@:
2028
			call tl_iterat_next_all
2029
			cmp edx,ecx
2030
			jle @f
2031
		;save node params
2032
		call tl_get_node_index ;eax = index of pointer [edx]
2033
		mov dword[esi],eax
1303 IgorA 2034
 
5911 IgorA 2035
		add esi,4
6972 IgorA 2036
		mov eax,dword[edx+TreeNode.type] ;eax = (type; level; close)
5911 IgorA 2037
		mov dword[esi],eax
2038
		add esi,4
1303 IgorA 2039
 
5911 IgorA 2040
			stdcall tl_node_poi_get_data, edi,edx ;eax - pointer node data
1303 IgorA 2041
 
5911 IgorA 2042
		;call tl_node_copy_data
2043
		push ecx edi
2044
		mov edi,eax
2045
		mov ecx,ebx
2046
		xchg esi,edi
2047
		rep movsb
2048
		mov esi,edi
2049
		pop edi ecx
2050
		;add esi,ebx
2051
		jmp @b
2052
	@@:
2053
	mov byte[esi],0 ;end of 'treelist'
2054
		xor eax,eax ;return error code
2055
	jmp @f
2056
	.err_mem_size:
2057
		mov eax,tl_err_save_memory_size
2058
	@@:
2059
	ret
2060
endp
1303 IgorA 2061
 
2062
;input:
5911 IgorA 2063
; tlist - pointer to 'TreeList' struct
2064
; opt   - options: element index + (2*(add mode)+(init mode)) shl 16
2065
; h_mem - pointer to memory
2066
; mem_size - memory size
2067
;   размер памяти, пока не используется (назначался для контроля)
2068
;   для его использования нужно доработать функцию
1303 IgorA 2069
;output:
5911 IgorA 2070
; eax - error code
2071
;memory header format:
2072
;  +0 - (4) 'tree'
2073
;  +4 - (2) info size
2074
;  +6 - (4) count nodes
2075
; +10 - (4) tlist style
2076
; +14 - (4) cursor pos
2077
; +18 - (2) info capt offs
2078
; +20 - (2) info capt len
2079
; +22 - (4) scroll pos
2080
;memory data format:
2081
; +26 - (info size + 8) * count nodes
1303 IgorA 2082
align 4
5911 IgorA 2083
proc tl_load_mem uses ebx ecx edx edi esi, tlist:dword, opt:dword, h_mem:dword, mem_size:dword
2084
locals
2085
	er_code dd ?
2086
endl
6972 IgorA 2087
	mov esi,[h_mem]
2088
	mov edi,[tlist]
1303 IgorA 2089
 
5911 IgorA 2090
	mov dword[er_code],0 ;return error code
1303 IgorA 2091
 
6972 IgorA 2092
	mov ecx,[opt]
2093
	or cx,cx ;load in array mode
2094
	jz @f
5911 IgorA 2095
		;stdcall tl_get_mem_size, esi,edi ;берем размер ранее сохранённых данных
2096
		;add esi,eax
2097
		and ecx,0xffff
2098
		cld
2099
		.beg_cycle:
2100
			cmp dword[esi],'tree'
2101
			jne .no_tree
6972 IgorA 2102
			movzx ebx,word[esi+4]
5911 IgorA 2103
			add bx,8
2104
			imul ebx,dword[esi+6]
2105
			add ebx,tl_save_load_heder_size
2106
			add esi,ebx
2107
			loop .beg_cycle
2108
	@@:
1303 IgorA 2109
 
5911 IgorA 2110
	cmp dword[esi],'tree'
2111
	jne .no_tree
2112
		bt dword[opt],17 ;load in add mode
2113
		jc @f
6972 IgorA 2114
			stdcall tl_info_clear, edi
5911 IgorA 2115
		@@:
1303 IgorA 2116
 
5911 IgorA 2117
		xor ebx,ebx
2118
		mov bx,word[esi+4] ;info_size
2119
		cmp bx,tl_info_size
2120
		je @f
2121
			or dword[er_code],tl_err_load_info_size
2122
		@@:
6972 IgorA 2123
		mov ecx,[esi+6] ;count nodes
5911 IgorA 2124
		cmp ecx,1
2125
		jl .end_f
2126
		mov edx,esi ;save header pointer
2127
		add esi,tl_save_load_heder_size
1303 IgorA 2128
 
5879 IgorA 2129
		cld
2130
		@@: ;load node params
5911 IgorA 2131
			mov eax,dword[esi+4]
6972 IgorA 2132
			ror eax,16 ;eax - options (type; level; close)
5911 IgorA 2133
			add esi,8
2134
			stdcall tl_node_add, edi,eax,esi
5879 IgorA 2135
			stdcall tl_cur_next, edi
1303 IgorA 2136
;...
5911 IgorA 2137
			add esi,ebx
2138
			loop @b
1303 IgorA 2139
 
5911 IgorA 2140
		bt dword[opt],17 ;load in add mode
2141
		jc .no_tree
2142
			mov eax,dword[edx+14] ;set cursor pos
2143
			mov tl_cur_pos,eax
2144
			mov ebx,tl_p_scroll
6972 IgorA 2145
			or ebx,ebx
2146
			jz .end_f
5911 IgorA 2147
				mov eax,dword[edx+22] ;set scroll pos
2148
				mov dword[ebx+sb_offs_position],eax
5879 IgorA 2149
				stdcall scroll_bar_vertical.draw, ebx
5911 IgorA 2150
				jmp .end_f
2151
	.no_tree:
2152
	mov dword[er_code],tl_err_load_caption
2153
	.end_f:
2154
	mov eax,dword[er_code]
2155
	ret
2156
endp
1303 IgorA 2157
 
5911 IgorA 2158
;берет размер памяти занятой функцией tl_save_mem при сохранении элементов
1328 IgorA 2159
;output:
5911 IgorA 2160
; eax - error code
1328 IgorA 2161
align 4
5911 IgorA 2162
proc tl_get_mem_size uses ebx edi, tlist:dword, h_mem:dword
6972 IgorA 2163
	mov edi,[tlist]
2164
	mov eax,[h_mem]
5911 IgorA 2165
	@@:
2166
		cmp dword[eax],'tree'
2167
		jne @f
2168
		xor ebx,ebx
2169
		mov bx,word[eax+4]
2170
		add bx,8 ;размер дополнительной информации об узле (индекс записи; индекс иконки, уровень, ...)
2171
		imul ebx,dword[eax+6]
2172
		add ebx,tl_save_load_heder_size
2173
		add eax,ebx
2174
		jmp @b
2175
	@@:
2176
	sub eax,dword[h_mem] ;отнимаем указатель на начало памяти
2177
		;и получаем размер блока памяти
2178
	ret
2179
endp
1328 IgorA 2180
 
2181
 
1303 IgorA 2182
;ascii scan key
2183
;  13    28 Enter
2184
;  32    57 Space
2185
; 178    72 Up
2186
; 177    80 Down
2187
; 176    75 Left
2188
; 179    77 Right
2189
; 182    83 Delete
2190
; 184    73 Pg Up
2191
; 183    81 Pg Dn
2192
 
2193
tl_key_ascii db 13,32,178,177,176,179,182,184,183
2194
tl_key_scan  db 28,57, 72, 80, 75, 77, 83, 73, 81
2195
 
6972 IgorA 2196
txt_capt_cur: db 'Строка '
2197
.v: db '     ',0
2198
txt_capt_otm: db 'Отмены '
2199
.v: db '     ',0
1309 IgorA 2200
 
6972 IgorA 2201
;description:
2202
; преревод числа в ASCII строку
1309 IgorA 2203
;input:
2204
; eax = value
2205
; edi = string buffer
2206
align 4
6972 IgorA 2207
proc tl_convert_to_str, len:dword
2208
pushad
2209
	mov esi,[len]
2210
	add esi,edi
2211
	dec esi
2212
	call .str
2213
popad
5911 IgorA 2214
	ret
6972 IgorA 2215
endp
1309 IgorA 2216
 
2217
align 4
2218
.str:
6972 IgorA 2219
	mov ecx,10 ;задается система счисления
5948 IgorA 2220
	cmp eax,ecx  ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
2221
	jb @f
2222
		xor edx,edx ;очистить edx
2223
		div ecx     ;разделить - остаток в edx
2224
		push edx    ;положить в стек
2225
		call .str   ;вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
2226
		pop eax
6972 IgorA 2227
	@@:
2228
	cmp edi,esi
2229
	jge @f
2230
		or al,0x30  ;добавляем символ '0'
2231
		stosb       ;записать al в ячеку памяти [edi]
2232
		mov byte[edi],0
2233
	@@:
2234
	ret