Subversion Repositories Kolibri OS

Rev

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