Subversion Repositories Kolibri OS

Rev

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