Subversion Repositories Kolibri OS

Rev

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