Subversion Repositories Kolibri OS

Rev

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

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