Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1277 IgorA 1
; макрос для системной библиотеки box_lib.obj
2
; элемент TreeList для Kolibri OS
3
; файл последний раз изменялся 20.11.2009 IgorA
4
; на код применена GPL2 лицензия
5
 
6
 
7
sizeof.TreeList equ 20
8
 
9
tl_style      equ dword[edi+10] ;стили элемента
10
tl_img_cx     equ  word[edi+22] ;ширина иконок
11
tl_img_cy     equ  word[edi+24] ;высота иконок
12
tl_data_img_sys equ dword[edi+26] ;указатель на системные изображения (стрелки, плюсики)
13
tl_ch_tim     equ dword[edi+30] ;количество изменений в файле
14
tl_tim_undo   equ dword[edi+38] ;количество отмененных действий
15
tl_cur_pos    equ dword[edi+42] ;позиция курсора
16
tl_col_bkg    equ dword[edi+46] ;цвет фона
17
tl_col_zag    equ dword[edi+50] ;цвет заголовка
18
tl_col_txt    equ dword[edi+54] ;цвет текста
19
tl_box_left   equ dword[edi+58]
20
tl_box_top    equ dword[edi+62]
21
tl_box_width  equ dword[edi+66]
22
tl_box_height equ dword[edi+70]
23
tl_capt_cy    equ  word[edi+74] ;высота подписи
24
tl_info_capt_offs equ dword[edi+76]
25
tl_el_focus   equ dword[edi+80] ;указатель на структуру элемента в фокусе
26
tl_p_scrol    equ dword[edi+84] ;указатель на структуру скроллинга
27
tl_sb_draw    equ dword[edi+88] ;указатель на функцию перерисовывающую скроллинг
28
tl_on_press   equ dword[edi+96] ;указатель на функцию, которая вызывается при нажатии Enter
29
 
30
;константы стиля
31
tl_key_no_edit   equ   1b ;элемент нельзя редактировать на клавиатуре (изменять уровни, удалять)
32
tl_draw_par_line equ  10b ;рисовать линии к родительскому узлу
33
tl_list_box_mode equ 100b ;стиль не отображает уровни (как в ListBox все одного уровня)
34
 
35
macro use_tree_list_structs
36
{
37
struct TreeInfo
38
  data_info	 dd ? ;+ 0 указатель на основные даные
39
  info_size	 dw ? ;+ 4 размер информационной структуры (пользовательськие данные + текст для подписи)
40
  info_max_count dd ? ;+ 6 максимальное колличество структур
41
  style 	 dd ? ;+10 стили элемента
42
  data_nodes	 dd ? ;+14 указатель на структуры узлов
43
  data_img	 dd ? ;+18 указатель на изображения
44
  img_cx	 dw ? ;+22 ширина иконок
45
  img_cy	 dw ? ;+24 высота иконок
46
  data_img_sys dd ? ;+26 указатель на системные изображения (стрелки, плюсики)
47
  ch_tim		dd ? ;+30 количество изменений в файле
48
  ls_tim		dd ? ;+34 время последнего сохранения
49
  tim_undo	 dd ? ;+38 количество отмененных действий
50
  cur_pos	 dd ? ;+42 позиция курсора
51
  col_bkg	 dd ? ;+46 цвет фона
52
  col_zag	 dd ? ;+50 цвет заголовка
53
  col_txt	 dd ? ;+54 цвет текста
54
  wndMain	BOX ? ;+58 размер окна для вывода
55
  capt_cy	 dw ? ;+74 высота подписи
56
  info_capt_offs dd ? ;+76 сдвиг для начала текста (подписи узла)
57
  el_focus dd ? ;+80 указатель на структуру элемента в фокусе
58
  p_scrol dd ?  ;+84 указатель на структуру скроллинга
59
  sb_draw dd ?  ;+88 указатель на функцию перерисовывающую скроллинг
60
  on_activate dd ? ;+92 указатель на функцию при активировании узла
61
  on_press dd ? ;+96 указатель на функцию при нажатии Enter
62
ends
63
 
64
struct TreeList
65
  type dw ? ;+ 0 тип элемента, или индекс иконки для узла
66
  lev db ?  ;+ 2 уровень элемента
67
  clo db ?  ;+ 3 флаг закрытия, или открытия (имеет смысл для родительского узла)
68
  perv dd ? ;+ 4 индекс предыдущего элемента
69
  next dd ? ;+ 8 индекс последующего элемента
70
  tc dd ?   ;+12 врем. создания
71
  td dd ?   ;+16 врем. удаления
72
ends
73
}
74
 
75
struc tree_list info_size,info_max_count,style, img_cx,img_cy,\
76
    col_bkg,col_zag,col_txt, box_l,box_t,box_w,box_h, capt_cy,info_capt_offs,\
77
    el_focus, p_scrol,p_sb_draw,fun_enter {
78
  .data_info	dd 0
79
  .info_size	dw info_size
80
  .info_max_count dd info_max_count
81
  .style	    dd style
82
  .data_nodes	dd 0
83
  .data_img	 dd 0
84
  .img_cx	   dw img_cx
85
  .img_cy	   dw img_cy
86
  .data_img_sys	 dd 0
87
  .ch_tim		  dd 0
88
  .ls_tim		  dd 0
89
  .tim_undo	 dd 0
90
  .cur_pos	  dd 0
91
  .col_bkg	  dd col_bkg
92
  .col_zag	  dd col_zag
93
  .col_txt	  dd col_txt
94
  .box_lert   dd box_l
95
  .box_top    dd box_t
96
  .box_width  dd box_w
97
  .box_height dd box_h
98
  .capt_cy	   dw capt_cy
99
  .info_capt_offs dd info_capt_offs
100
  .el_focus dd el_focus
101
  .p_scrol  dd p_scrol
102
  .p_sb_draw dd p_sb_draw
103
  .on_activate dd 0
104
  .on_press dd fun_enter
105
}
106
 
107
;-----------------------------------------------------------------------------
108
;функция для выделения памяти
109
;input:
110
; ecx = size data
111
;otput:
112
; eax = pointer to memory
113
align 4
114
mem_Alloc:
115
  push ebx
116
  mov eax,68
117
  mov ebx,12
118
  int 0x40
119
  pop ebx
120
  ret
121
;-----------------------------------------------------------------------------
122
;функция для освобождения памяти
123
;input:
124
; ecx = pointer to memory
125
align 4
126
mem_Free:
127
  push eax ebx
128
  cmp ecx,0
129
  jz @f
130
    mov eax,68
131
    mov ebx,13
132
    int 0x40
133
  @@:
134
  pop ebx eax
135
  ret
136
 
137
macro use_tree_list
138
{
139
align 4
140
tl_data_init: ;выделние памяти для структур списка и основной информации (конструктор)
141
  push ebp
142
  mov ebp,esp
143
  push eax ecx edi
144
    mov edi,dword[ebp+8]
145
 
146
    xor ecx,ecx
147
    mov cx,word[edi+4]
148
    imul ecx,dword[edi+6]
149
    call mem_Alloc
150
    mov dword[edi],eax ;копируем указатель на полученую память в структуру
151
    mov dword[edi+18],0 ;обнуляем указатель 'data_img'
152
    mov tl_data_img_sys,0 ;обнуляем указатель 'data_img_sys'
153
 
154
    mov ecx,sizeof.TreeList
155
    imul ecx,dword[edi+6]
156
    call mem_Alloc
157
    mov dword[edi+14],eax ;копируем указатель на полученую память в структуру
158
 
159
    push dword edi
160
    call tl_info_clear
161
 
162
    ;настройки дочернего скроллинга
163
    cmp tl_p_scrol,0
164
    je @f
165
      mov eax,tl_p_scrol
166
      ;*** цветовые настройки ***
167
      mov ecx,tl_col_bkg
168
      mov dword[eax+28],ecx ;+28 .bckg_col
169
      mov ecx,tl_col_zag
170
      mov dword[eax+32],ecx ;+32 .frnt_col
171
      mov ecx,tl_col_txt
172
      mov dword[eax+36],ecx ;+32 .line_col
173
      ;*** настройки размеров ***
174
      mov ecx,tl_box_left
175
      add ecx,tl_box_width
176
      mov word[eax+2],cx
177
      mov ecx,tl_box_height
178
      mov word[eax+4],cx
179
      mov ecx,tl_box_top
180
      mov word[eax+6],cx
181
    @@:
182
  pop edi ecx eax
183
  pop ebp
184
  ret 4
185
 
186
align 4
187
tl_data_clear: ;очистка памяти элемента (деструктор)
188
  push ebp
189
  mov ebp,esp
190
    push ecx edi
191
    mov edi,dword[ebp+8]
192
    cmp dword[edi+18],0 ;data_img
193
    je @f
194
      mov ecx,dword[edi+18]
195
      call mem_Free ;чистка системных иконок
196
    @@:
197
    cmp tl_data_img_sys,0
198
    je @f
199
      mov ecx,tl_data_img_sys
200
      call mem_Free ;чистка системных иконок
201
    @@:
202
    mov ecx,dword[edi]
203
    call mem_Free
204
 
205
    mov ecx,dword[edi+14]
206
    call mem_Free
207
    pop edi ecx
208
  pop ebp
209
  ret 4
210
 
211
align 4
212
tl_info_clear: ;очистка списка (информации)
213
  push ebp
214
  mov ebp,esp
215
    push eax ecx edi
216
    mov edi,dword[ebp+8]
217
    mov tl_ch_tim,0
218
    mov dword[edi+34],0 ;ls_tim
219
    mov tl_tim_undo,0
220
    mov tl_cur_pos,0
221
    ;xor ecx,ecx
222
    mov ecx,sizeof.TreeList
223
    imul ecx,dword[edi+6]
224
    mov eax,dword[edi+14]
225
    @@:
226
      mov byte[eax],0 ;чистим узлы 0-ми
227
      inc eax
228
      loop @b
229
    mov eax,dword[edi+14] ;указатель на 1-й узел
230
    mov dword[eax+8],1 ;указатель next в 1-м узле приравниваем к 1
231
    call tb_scrol_resize ;обработка скроллинга
232
    pop edi ecx eax
233
  pop ebp
234
  ret 4
235
 
236
 
237
align 4
238
tl_key: ;реакция на клавиатуру
239
  push ebp
240
  mov ebp,esp
241
    push ebx edi
242
    mov edi,dword[ebp+8]
243
 
244
    mov ebx,tl_el_focus
245
    cmp dword[ebx],edi
246
    jne .no_focus ;элемент не в фокусе
247
 
248
    xor bx,bx
249
    cmp ah,13 ;Enter
250
    jne @f
251
      cmp tl_on_press,0
252
      je @f
253
        call tl_on_press
254
    @@:
255
    cmp ah,32 ;Space
256
    jne @f
257
      push dword edi
258
      call tl_node_close_open
259
    @@:
260
    cmp ah,178 ;Up
261
    jne @f
262
      push dword edi
263
      call tl_cur_perv
264
    @@:
265
    cmp ah,177 ;Down
266
    jne @f
267
      push dword edi
268
      call tl_cur_next
269
    @@:
270
 
271
    bt tl_style,0 ;tl_key_no_edit
272
    jc .no_edit
273
      cmp ah,176 ;Left
274
      jne @f
275
	push dword edi
276
	call tl_node_lev_dec
277
	mov bx,1
278
      @@:
279
      cmp ah,179 ;Right
280
      jne @f
281
	push dword edi
282
	call tl_node_lev_inc
283
	mov bx,1
284
      @@:
285
      cmp ah,182 ;Delete
286
      jne @f
287
	push dword edi
288
	call tl_node_delete
289
	mov bx,1
290
      @@:
291
    .no_edit:
292
 
293
    cmp bx,1
294
    jne .no_focus
295
      push dword edi
296
      call tl_draw
297
    .no_focus:
298
 
299
    pop edi ebx
300
  pop ebp
301
  ret 4
302
 
303
align 4
304
tl_mouse: ;реакция на мышь
305
  push ebp
306
  mov ebp,esp
307
    push eax ebx ecx edx edi esi
308
    mov edi,dword[ebp+8]
309
 
310
    mov eax,37
311
    mov ebx,2
312
    int 0x40
313
 
314
    bt eax,0 ;left mouse button press
315
    jae .no_draw
316
 
317
    mov ebx,tl_el_focus
318
    mov dword[ebx],edi ;set focus
319
 
320
    mov eax,37
321
    mov ebx,1
322
    int 0x40
323
 
324
    mov ebx,tl_box_left
325
    shl ebx,16
326
    cmp eax,ebx ;левая граница окна
327
    jl .no_in_wnd
328
 
329
    mov ebx,tl_box_left
330
    add ebx,tl_box_width
331
    shl ebx,16
332
    cmp eax,ebx ;правая граница окна
333
    jg .no_in_wnd
334
 
335
    mov ebx,tl_box_top
336
    add ebx,tl_box_height
337
    cmp ax,bx ;нижняя граница окна
338
    jg .no_in_wnd
339
 
340
    sub ebx,tl_box_height
341
    add bx,tl_capt_cy
342
    cmp ax,bx ;верхняя граница окна + высота подписи
343
    jl .no_in_wnd
344
 
345
    ; if '+' or '-' press
346
    mov esi,eax
347
    shr esi,16
348
    sub esi,tl_box_left ;esi = mouse x coord in element window
349
 
350
    and eax,0xffff
351
    sub ax,bx
352
    xor edx,edx
353
    xor ecx,ecx
354
    mov cx,tl_img_cy
355
    div ecx
356
    cmp tl_p_scrol,0 ;учитываем скроллинг
357
    je @f
358
      mov edx,tl_p_scrol
359
      add eax,dword[edx+24] ;добавляем скроллинг на верху
360
    @@:
361
 
362
    mov ecx,eax
363
    call tl_get_node_count ;eax = node count
364
    cmp eax,ecx
365
    jl @f
366
      mov eax,ecx ;если курсор не вышел за пределы узлов, восстанавливаем старое значение eax
367
    @@:
368
 
369
    mov ebx,0x80000000 ;ставим флаг для выхода без обновления
370
    cmp eax,tl_cur_pos ;если новое значение курсора совпало с предыдущим
371
    je @f	       ;то можем выйти без обновления окна
372
      xor ebx,ebx
373
    @@:
374
 
375
    mov tl_cur_pos,eax
376
 
377
    ; if '+' or '-' press
378
    call tl_get_cur_node_index ;eax = node index
379
    cmp eax,2
380
    jl .no_open_close ;курсор стоит на пустом месте, без узлов
381
    imul eax,sizeof.TreeList
382
    add eax,dword[edi+14] ;+14 указатель на структуры узлов
383
    xor bx,bx
384
    mov bl,byte[eax+2] ;+2 lev сохраняем уровень текущего узла
385
    inc bx ;+ поле для курсора
386
 
387
    cmp si,tl_img_cx
388
    jl .no_open_close ;мышей попали на левое поле для курсора, где точно нет '+' и '-'
389
      mov eax,esi
390
      xor edx,edx
391
      xor ecx,ecx
392
      mov cx,tl_img_cx
393
      div ecx
394
 
395
      cmp ax,bx
396
      jne .no_open_close
397
 
398
      push dword edi
399
      call tl_node_close_open
400
    .no_open_close:
401
 
402
    bt ebx,31
403
    jc .no_draw
404
      push dword edi
405
      call tl_draw
406
      jmp .no_draw
407
    .no_in_wnd: ;не попали в окно - потеря фокуса
408
      mov ebx,tl_el_focus
409
      mov dword[ebx],0 ;reset focus
410
    .no_draw:
411
 
412
    pop esi edi edx ecx ebx eax
413
  pop ebp
414
  ret 4
415
 
416
align 4
417
tl_info_undo: ;отмена действия
418
  push ebp
419
  mov ebp,esp
420
  push eax edi
421
    mov edi,dword[ebp+8]
422
    mov eax,tl_tim_undo
423
    cmp tl_ch_tim,eax
424
    jbe @f
425
      inc tl_tim_undo
426
      call tb_scrol_resize ;обработка скроллинга
427
    @@:
428
  pop edi eax
429
  pop ebp
430
  ret 4
431
 
432
align 4
433
tl_info_redo: ;повтор действия
434
  push ebp
435
  mov ebp,esp
436
  push edi
437
    mov edi,dword[ebp+8]
438
    cmp tl_tim_undo,1
439
    jl @f
440
      dec tl_tim_undo
441
      call tb_scrol_resize ;обработка скроллинга
442
    @@:
443
  pop edi
444
  pop ebp
445
  ret 4
446
 
447
align 4
448
tl_info_set_undo: ;удаление отмененных действий
449
;  push ebp
450
;  mov ebp,esp
451
;  push edi
452
;    mov edi,dword[ebp+8]
453
 
454
;  mov [dragk],0 ;заканчиваем выделение от клавиатуры
455
  cmp tl_tim_undo,1
456
  jl .no_work
457
 
458
  push eax ebx ecx edx
459
  mov edx,dword[edi+14]
460
  mov ecx,edx
461
  add ecx,sizeof.TreeList
462
  call tl_move_next ;long i=tex[0].next;
463
  mov eax,tl_tim_undo
464
  sub tl_ch_tim,eax ;ch_tim-=tim_undo;
465
  mov eax,tl_ch_tim
466
  cmp [edi+34],eax ;if(ls_tim>ch_tim)
467
  jle @f
468
    mov dword[edi+34],0 ;ls_tim=0
469
  @@:
470
    cmp edx,ecx
471
    jle @f
472
 
473
    ;if(tex[i].tc>ch_tim){ // если создание символа было отменено
474
    cmp dword[edx+12],eax
475
    jle .no_u1
476
      mov dword[edx+12],0
477
      mov dword[edx+16],0
478
 
479
      mov ebx, dword[edx+4]
480
      imul ebx,sizeof.TreeList
481
      add ebx, dword[edi+14] ;.next
482
      push dword[edx+8] ;tex[tex[i].perv].next=tex[i].next;
483
      pop dword[ebx+8]
484
 
485
      mov ebx, dword[edx+8]
486
      imul ebx,sizeof.TreeList
487
      add ebx, dword[edi+14] ;.perv
488
      push dword[edx+4] ;tex[tex[i].next].perv=tex[i].perv;
489
      pop dword[ebx+4]
490
 
491
    .no_u1:
492
 
493
    ;else if(tex[i].td>ch_tim) tex[i].td=0; // если удаление символа было отменено
494
    cmp dword[edx+16],eax
495
    jle .no_u2
496
      mov dword[edx+16],0
497
    .no_u2:
498
 
499
    call tl_move_next
500
    jmp @b
501
  @@:
502
  mov tl_tim_undo,0
503
;  mov eax,[edi+?] ;co_tim
504
;  cmp tl_ch_tim,eax ;ch_tim
505
;  jge @f
506
;    mov [edi+?],0 ;co_tim
507
;  @@:
508
  pop edx ecx ebx eax
509
  .no_work:
510
 
511
;  pop edi
512
;  pop ebp
513
;  ret 4
514
  ret
515
 
516
align 4
517
tl_draw: ;вывод списка на экран
518
  push ebp
519
  mov ebp,esp
520
    push eax ebx ecx edx edi esi
521
    ;draw dir_list main rect
522
    mov edi,dword[ebp+8]
523
    mov ebx,tl_box_left
524
    shl ebx,16
525
    add ebx,tl_box_width
526
    mov ecx,tl_box_top
527
    shl ecx,16
528
    mov cx,tl_capt_cy
529
    mov edx,tl_col_zag
530
    mov eax,13
531
    int 0x40 ;draw window caption
532
 
533
    add ecx,tl_box_top
534
    shl ecx,16
535
    add ecx,tl_box_height
536
    sub cx,tl_capt_cy
537
    mov edx,tl_col_bkg
538
    int 0x40 ;draw window client rect
539
 
540
    cmp tl_capt_cy,9 ;9 - minimum caption height
541
    jl @f
542
    mov eax,4 ;draw text captions
543
    mov ebx,tl_box_left
544
    shl ebx,16
545
    add ebx,5*65536+3
546
    add ebx,tl_box_top
547
    mov ecx,tl_col_txt
548
    or	ecx,0x80000000
549
    lea edx,[txt_capt_cur]
550
    int 0x40
551
 
552
    mov ebx,tl_box_left
553
    shl ebx,16
554
    add ebx,100*65536+3
555
    add ebx,tl_box_top
556
    lea edx,[txt_capt_otm]
557
    int 0x40
558
 
559
    mov eax,47 ;draw
560
    mov ebx,0x40000
561
    mov ecx,tl_cur_pos
562
  inc ecx
563
    mov edx,tl_box_left
564
    shl edx,16
565
    add edx,50*65536+3
566
    add edx,tl_box_top
567
    mov esi,tl_col_txt
568
    int 0x40
569
    mov ecx,tl_tim_undo
570
    mov edx,tl_box_left
571
    shl edx,16
572
    add edx,140*65536+3
573
    add edx,tl_box_top
574
    mov esi,tl_col_txt
575
    int 0x40
576
    @@:
577
 
578
;---debug---
579
;mov ecx,0
580
;@@:
581
;call DebugSymb
582
;inc ecx
583
;cmp ecx,10
584
;jge @f
585
;jmp @b
586
;@@:
587
;---debug---
588
 
589
    ;cycle to nodes
590
    xor eax,eax
591
    mov edx,dword[edi+14] ;+14 указатель на структуры узлов
592
    mov ecx,edx
593
    add ecx,sizeof.TreeList
594
 
595
    ;*** пропуск узлов, которые промотаны скроллингом ***
596
    cmp tl_p_scrol,0 ;если есть указатель на скроллинг
597
    je .end_c1
598
    mov esi,tl_p_scrol
599
    cmp dword[esi+24],0 ;если скроллинг на верху, выходим
600
    je .end_c1
601
      @@:
602
	call tl_iterat_next
603
	cmp edx,ecx
604
	jle .end_draw
605
	inc eax
606
	cmp eax,dword[esi+24]
607
	jge .end_c1
608
	jmp @b
609
    .end_c1:
610
 
611
    xor eax,eax
612
    mov esi,tl_box_top
613
    add esi,tl_box_height ;esi = coord bottom border
614
    @@:
615
      call tl_iterat_next
616
      cmp edx,ecx
617
      jle @f
618
      call tl_draw_node
619
      inc eax
620
      jmp @b
621
    @@:
622
 
623
    call tl_draw_cursor
624
    .end_draw:
625
    pop esi edi edx ecx ebx eax
626
  pop ebp
627
  ret 4
628
 
629
;input:
630
; ecx = pointer to 1 node struct
631
; edx = pointer to some node struct
632
; edi = pointer to 'TreeList' struct
633
align 4
634
tl_iterat_next:
635
  push bx
636
  mov bl,0x7f
637
  cmp byte[edx+3],1
638
  jne @f
639
    mov bl,byte[edx+2]
640
  @@:
641
 
642
  cmp tl_tim_undo,0
643
  je .else
644
 
645
  push eax
646
  .beg0:
647
    call tl_move_next
648
    cmp edx,ecx
649
    jle @f
650
    call tl_node_not_vis ;пропуск удаленных и отмененных
651
    cmp al,1
652
    je .beg0
653
    cmp bl,byte[edx+2] ;пропуск закрытых
654
    jl .beg0
655
  @@:
656
  pop eax
657
  pop bx
658
  ret
659
 
660
  .else:
661
    call tl_move_next
662
    cmp edx,ecx
663
    jle .endif
664
    cmp dword[edx+16],0 ;td = 'time delete' -> пропуск удаленных
665
    jne .else
666
    cmp bl,byte[edx+2] ;пропуск закрытых
667
    jl .else
668
  .endif:
669
  pop bx
670
  ret
671
 
672
;input:
673
; ecx = pointer to 1 node struct
674
; edx = pointer to some node struct
675
; edi = pointer to 'TreeList' struct
676
align 4
677
tl_iterat_next_all:
678
  cmp tl_tim_undo,0
679
  je .else
680
 
681
  push eax
682
  @@:
683
    call tl_move_next
684
    cmp edx,ecx
685
    jle @f
686
    call tl_node_not_vis
687
    cmp al,1
688
    je @b
689
  @@:
690
  pop eax
691
  ret
692
  .else:
693
    call tl_move_next
694
    cmp edx,ecx
695
    jle .endif
696
    cmp dword[edx+16],0 ;td -> time delete
697
    jne .else
698
  .endif:
699
  ret
700
 
701
;input:
702
; ecx = pointer to 1 node struct
703
; edx = pointer to some node struct
704
; edi = pointer to 'TreeList' struct
705
align 4
706
tl_iterat_perv:
707
  push bx
708
  mov bl,0x7f
709
  cmp byte[edx+3],1
710
  jne @f
711
    mov bl,byte[edx+2]
712
  @@:
713
 
714
  cmp tl_tim_undo,0
715
  je .else
716
 
717
  push eax
718
  .beg0:
719
    call tl_move_perv
720
    cmp edx,ecx
721
    jle @f
722
    call tl_node_not_vis ;пропуск удаленных и отмененных
723
    cmp al,1
724
    je .beg0
725
    cmp bl,byte[edx+2] ;пропуск закрытых
726
    jl .beg0
727
  @@:
728
  pop eax
729
  pop bx
730
  ret
731
 
732
  .else:
733
    call tl_move_perv
734
    cmp edx,ecx
735
    jle .endif
736
    cmp dword[edx+16],0 ;td = 'time delete' -> пропуск удаленных
737
    jne .else
738
    cmp bl,byte[edx+2] ;пропуск закрытых
739
    jl .else
740
  .endif:
741
  pop bx
742
  ret
743
 
744
;input:
745
; edx = pointer to some node struct
746
; edi = pointer to 'TreeList' struct
747
;output:
748
; edx = pointer to next node struct
749
align 4
750
tl_move_next:
751
  mov edx,dword[edx+8]
752
  imul edx,sizeof.TreeList
753
  add edx,dword[edi+14]
754
  ret
755
 
756
;input:
757
; edx = pointer to some node struct
758
; edi = pointer to 'TreeList' struct
759
;output:
760
; edx = pointer to perv node struct
761
align 4
762
tl_move_perv:
763
  mov edx,dword[edx+4]
764
  imul edx,sizeof.TreeList
765
  add edx,dword[edi+14]
766
  ret
767
 
768
;input:
769
; edx = pointer to symbol struct
770
; edi = pointer to 'TreeList' struct
771
;output:
772
; al = 1 if sumbol not visible
773
; (tex[i].td+tim_Undo<=ch_tim && tex[i].td) || (tex[i].tc>ch_tim-tim_Undo)
774
align 4
775
tl_node_not_vis:
776
  cmp dword[edx+16],0
777
  je @f
778
  mov eax,dword[edx+16] ;eax=tex[i].td
779
  add eax,tl_tim_undo
780
  cmp eax,tl_ch_tim
781
  jg @f
782
    mov al,1
783
    ret
784
  @@:
785
 
786
  mov eax,tl_ch_tim
787
  sub eax,tl_tim_undo
788
  cmp dword[edx+12],eax ;tc -> time create
789
  jle @f
790
    mov al,1
791
    ret
792
  @@:
793
  xor al,al
794
  ret
795
 
796
 
797
;input:
798
; edi = pointer to TreeInfo struct
799
; esi = coord bottom border
800
align 4
801
tl_draw_cursor: ;рисуем курсор на экране
802
  push eax ebx ecx edx esi
803
    call tl_get_display_cur_pos ;eax = cursor pos in screen
804
    cmp eax,0
805
    jl .end_f ;курсор находится выше окна, в области прокрученной скроллингом
806
 
807
    cmp tl_data_img_sys,0 ;смотрим есть ли указатель на картинку системных иконок
808
    jne @f
809
      mov ebx,tl_box_left
810
      shl ebx,16
811
      mov bx,tl_img_cx
812
      xor ecx,ecx
813
      mov cx,tl_img_cy
814
      imul ecx,eax
815
      add ecx,tl_box_top
816
      add cx,tl_capt_cy
817
 
818
      ;crop image if on the border
819
      cmp esi,ecx ;если курсор внизу и его вообще не видно
820
      jl .end_f
821
 
822
      sub esi,ecx
823
      shl ecx,16
824
      mov cx,tl_img_cy
825
      cmp si,tl_img_cy
826
      jge .crop0
827
        mov cx,si ;если курсор виден частично (попал на нижнюю границу)
828
      .crop0:
829
 
830
      mov edx,tl_col_txt
831
      mov eax,13
832
      int 0x40 ;рисуем простой прямоугольник, т.к. нет системных иконок
833
      jmp .end_f
834
    @@:
835
      mov ebx,tl_data_img_sys
836
      imul ax,tl_img_cy
837
      mov cx,tl_img_cx
838
      shl ecx,16
839
      mov cx,tl_img_cy
840
      mov edx,tl_box_left
841
      shl edx,16
842
      mov dx,ax
843
      add edx,tl_box_top
844
      add dx,tl_capt_cy
845
 
846
      ;crop image if on the border
847
      cmp si,dx ;если курсор внизу и его вообще не видно
848
      jl .end_f
849
 
850
      sub si,dx
851
      cmp si,tl_img_cy
852
      jge .crop1
853
	mov cx,si ;если курсор виден частично (попал на нижнюю границу)
854
      .crop1:
855
 
856
      mov eax,7
857
      int 0x40 ;рисуем иконку курсора
858
    .end_f:
859
  pop esi edx ecx ebx eax
860
  ret
861
 
862
;input:
863
; edi = pointer to TreeInfo struct
864
; esi = coord bottom border
865
align 4
866
tl_draw_null_cursor: ;стираем курсор на экране
867
  push eax ebx ecx edx esi
868
    call tl_get_display_cur_pos ;eax = cursor pos in screen
869
    cmp eax,0
870
    jl .end_f ;курсор находится выше окна, в области прокрученной скроллингом
871
 
872
    mov ebx,tl_box_left
873
    shl ebx,16
874
    mov bx,tl_img_cx
875
    xor ecx,ecx
876
    mov cx,tl_img_cy
877
    imul ecx,eax
878
    add ecx,tl_box_top
879
    add cx,tl_capt_cy
880
 
881
    ;crop image if on the border
882
    cmp esi,ecx ;если курсор внизу и его вообще не видно
883
    jl .end_f
884
 
885
    sub esi,ecx
886
    shl ecx,16
887
    mov cx,tl_img_cy
888
    cmp si,tl_img_cy
889
    jge @f
890
      mov cx,si ;если курсор виден частично (попал на нижнюю границу)
891
    @@:
892
 
893
    mov edx,tl_col_bkg
894
    mov eax,13
895
    int 0x40 ;рисуем простой прямоугольник с фоновым цветом
896
 
897
    .end_f:
898
  pop esi edx ecx ebx eax
899
  ret
900
 
901
;input:
902
; edi = pointer to TreeInfo struct
903
;output:
904
; eax = index
905
align 4
906
tl_get_display_cur_pos: ;берет позицию курсора, относительно экрана
907
   mov eax,tl_cur_pos
908
   cmp tl_p_scrol,0
909
   je @f
910
     push ebx
911
       mov ebx,tl_p_scrol
912
       mov ebx,dword[ebx+24]
913
       sub eax,ebx ;отнимаем позицию скроллинга
914
     pop ebx
915
  @@:
916
  ret
917
 
918
;input:
919
; eax = node position
920
; edx = pointer to some node struct
921
; edi = pointer to TreeInfo struct
922
; esi = coord of bottom border
923
align 4
924
tl_draw_node:
925
  push eax ebx ecx edx esi
926
 
927
    mov ebx,1 ;1 - место под курсор и под знак +,-
928
    bt tl_style,2 ;tl_list_box_mode
929
    jc @f
930
      inc ebx ;+1 - место под знак +,-
931
    @@:
932
    add bl,byte[edx+2];get level
933
    imul bx,tl_img_cx
934
    add ebx,tl_box_left
935
 
936
    shl ebx,16
937
    mov bx,tl_img_cx
938
    xor ecx,ecx
939
    mov cx,tl_img_cy
940
    imul ecx,eax
941
    add ecx,tl_box_top
942
    add cx,tl_capt_cy
943
 
944
    ;crop image if on the border
945
    cmp esi,ecx ;если узел внизу и его вообще не видно
946
    jl .end_draw
947
 
948
    sub esi,ecx
949
    shl ecx,16
950
    mov cx,tl_img_cy
951
    cmp si,tl_img_cy
952
    jge @f
953
      mov cx,si ;если узел виден частично (попал на нижнюю границу)
954
      jmp .crop ;пропускаем рисование надписи, которая скорее всего тоже вылезет за нижнюю границу
955
    @@:
956
      call tl_draw_node_caption
957
    .crop:
958
    mov esi,ecx ;save ecx
959
 
960
    cmp dword[edi+18],0 ;data_img
961
    jne .draw_img_n
962
    push edx
963
      mov edx,tl_col_txt
964
      mov eax,13
965
      int 0x40 ;draw node rect
966
    pop edx
967
    jmp @f
968
    .draw_img_n:
969
    push ebx edx esi
970
      xor esi,esi
971
      mov si,word[edx] ;get icon type
972
      mov edx,ebx
973
      ror ecx,16
974
      mov dx,cx
975
      mov cx,bx
976
      ror ecx,16
977
      mov ebx,3 ;rgb = 3 bytes
978
      imul bx,tl_img_cx
979
      imul bx,tl_img_cy
980
      imul ebx,esi ;esi = icon index
981
      add ebx,dword[edi+18] ;data_img
982
 
983
      mov eax,7
984
      int 0x40 ;draw node icon '-'
985
    pop esi edx ebx
986
    @@:
987
 
988
    mov al,byte[edx+2] ;draw minus '-'
989
    mov ecx,dword[edi+14]
990
    add ecx,sizeof.TreeList
991
 
992
    mov ah,10 ;get icon index '+' or '-' ?
993
    cmp byte[edx+3],1
994
    jne .close
995
      dec ah
996
    .close:
997
 
998
    call tl_draw_node_icon_opn_clo
999
    bt tl_style,1
1000
    jae .end_draw
1001
      call tl_draw_node_icon_par_lin
1002
 
1003
    .end_draw:
1004
  pop esi edx ecx ebx eax
1005
  ret
1006
 
1007
;input:
1008
; ecx = pointer to 1 node struct
1009
;...
1010
align 4
1011
tl_draw_node_icon_opn_clo:
1012
  push eax ebx ecx edx esi
1013
    inc al
1014
    call tl_iterat_next_all ;get next visible item
1015
    cmp edx,ecx
1016
    jle @f
1017
      mov ecx,esi ;load ecx
1018
      cmp al,byte[edx+2]
1019
      jne @f
1020
      ror ebx,16
1021
      sub bx,tl_img_cx
1022
      ror ebx,16
1023
      cmp tl_data_img_sys,0
1024
      jne .draw_img_s
1025
	mov edx,tl_col_txt
1026
	mov eax,13
1027
	int 0x40 ;draw minus rect, if not system icons
1028
	jmp @f
1029
      .draw_img_s:
1030
      mov ecx,esi ;load ecx
1031
      mov edx,ebx
1032
      ror ecx,16
1033
      mov dx,cx
1034
      mov cx,bx
1035
      ror ecx,16
1036
      mov ebx,3 ;rgb = 3 bytes
1037
      imul bx,tl_img_cx
1038
      imul bx,tl_img_cy
1039
      shr eax,8
1040
      and eax,0xff
1041
      imul ebx,eax ;eax = icon index
1042
      add ebx,tl_data_img_sys
1043
      mov eax,7
1044
      int 0x40 ;draw minus icon '-'
1045
    @@:
1046
  pop esi edx ecx ebx eax
1047
  ret
1048
 
1049
;input:
1050
;...
1051
align 4
1052
tl_draw_node_icon_par_lin:
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:
1083
      mov ecx,esi ;load ecx
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
 
1104
;input:
1105
; edi = pointer to TreeInfo struct
1106
;output:
1107
; eax = rows
1108
align 4
1109
tl_get_rows_count:
1110
  push ecx edx
1111
    mov eax,tl_box_height
1112
    sub ax,tl_capt_cy
1113
    xor ecx,ecx
1114
    mov cx,tl_img_cy
1115
    xor edx,edx
1116
    div ecx
1117
  pop edx ecx
1118
  ret
1119
 
1120
;input:
1121
; eax = node position
1122
; ebx = [координата по оси x]*65536 + [img_cx]
1123
; ecx = [координата по оси y]*65536 + [img_cy]
1124
; edx = pointer to some node struct
1125
; edi = pointer to TreeInfo struct
1126
align 4
1127
tl_draw_node_caption:
1128
    push ebx ecx edx esi
1129
 
1130
    xor esi,esi
1131
    mov si,word[edi+4];info_size
1132
    cmp esi,tl_info_capt_offs
1133
    jle @f ;if caption size <= 0
1134
 
1135
    push eax
1136
      call tl_get_node_index ;eax = node index
1137
      imul esi,eax
1138
    pop eax
1139
      add esi,dword[edi]
1140
      add esi,tl_info_capt_offs
1141
      mov edx,esi
1142
 
1143
      shr ebx,16
1144
      add bx,tl_img_cx ;сдвигаем надпись по горизонтали --->
1145
      add bx,3 ;отступ
1146
      ;bx = coord. x
1147
      call tl_strlen ;eax = strlen
1148
      call tl_get_draw_text_len
1149
      mov cx,bx
1150
      ror ecx,16
1151
      mov ebx,ecx
1152
      add bx,tl_img_cy ;выравнивиние по нижней границе иконки
1153
      sub bx,9 ;отнимаем высоту текста
1154
      mov ecx,tl_col_txt
1155
      and ecx,0xffffff
1156
;      or ecx,0x80000000 ;text is ASCIIZ
1157
      mov eax,4
1158
      int 0x40
1159
    @@:
1160
    pop esi edx ecx ebx
1161
  ret
1162
 
1163
;input:
1164
; eax = strlen
1165
; ebx = text coord x
1166
;output:
1167
; esi = text len
1168
align 4
1169
tl_get_draw_text_len:
1170
  push eax ecx edx
1171
    mov esi,eax ;берем длинну строки
1172
 
1173
    mov eax,tl_box_left
1174
    add eax,tl_box_width
1175
    cmp eax,ebx
1176
    jle .text_null ;если подпись полностью вся за экраном
1177
    sub eax,ebx
1178
    xor edx,edx
1179
    mov ecx,6 ;ширина системного шрифта
1180
    div ecx ;смотрим сколько символов может поместиться на экране
1181
 
1182
    cmp esi,eax
1183
    jl @f
1184
      mov esi,eax ;если длинна текста меньше, чем все место под строку
1185
    jmp @f
1186
    .text_null:
1187
      xor esi,esi
1188
    @@:
1189
  pop edx ecx eax
1190
  ret
1191
 
1192
;input:
1193
; esi = pointer to string
1194
;output:
1195
; eax = strlen
1196
align 4
1197
tl_strlen:
1198
  mov eax,esi
1199
  @@:
1200
    cmp byte[eax],0
1201
    je @f
1202
    inc eax
1203
    loop @b
1204
  @@:
1205
  sub eax,esi
1206
  ret
1207
 
1208
;input:
1209
;dword[ebp+ 8] - pointer to node info
1210
;dword[ebp+12] - options
1211
;dword[ebp+16] - pointer to 'TreeList' struct
1212
align 4
1213
tl_node_add: ;добавить узел
1214
  push ebp
1215
  mov ebp,esp
1216
  push eax ebx ecx edx edi
1217
    mov edi,dword[ebp+16]
1218
 
1219
    call tl_info_set_undo
1220
 
1221
    mov ebx,sizeof.TreeList
1222
    imul ebx,dword[edi+6] ;+6 макс. количество узлов
1223
    add ebx,dword[edi+14] ;+14 указатель на структуры узлов
1224
;--
1225
    call tl_get_cur_node_index ;eax=po_t
1226
    imul eax,sizeof.TreeList
1227
    add eax,dword[edi+14] ;+14 указатель на структуры узлов
1228
    mov edx,eax
1229
    call tl_move_perv
1230
    call tl_get_node_index ;eax = index of pointer [edx]
1231
;--
1232
    mov edx,sizeof.TreeList
1233
    shl edx,1
1234
    add edx,dword[edi+14] ;+14 указатель на структуры узлов
1235
    @@: ;for(i=2;i
1236
      cmp dword [edx+12],0
1237
      jne .u0
1238
      cmp dword [edx+16],0
1239
      jne .u0
1240
 
1241
	inc  tl_ch_tim
1242
	push  word[ebp+14] ;get type
1243
	pop   word[edx]
1244
	mov   byte[edx+2], 0 ;node[i].lev=0
1245
	push tl_ch_tim       ;node[i].tc=ch_tim;
1246
	pop  dword[edx+12]
1247
	mov  dword[edx+4], eax ;node[i].perv=po_t;
1248
	;*** copy node data ***
1249
	push esi
1250
	xor ecx,ecx
1251
	mov cx,word[edi+4];info_size
1252
	mov esi,ecx
1253
 
1254
	push eax
1255
	  call tl_get_node_index ;eax = node index
1256
	  imul esi,eax
1257
	pop eax
1258
	add esi,dword[edi]
1259
	mov edi,dword[ebp+8] ;pointer to node data
1260
	xchg edi,esi
1261
	rep movsb
1262
 
1263
	mov esi,edi
1264
	mov edi,dword[ebp+16] ;restore edi
1265
	mov ecx,tl_info_capt_offs
1266
	cmp cx,word[edi+4] ;+4 info_size
1267
	jge .no_text_data
1268
	  dec esi
1269
	  mov byte[esi],0
1270
	.no_text_data:
1271
	pop esi ;restore esi
1272
 
1273
	mov ecx,eax
1274
	imul ecx,sizeof.TreeList
1275
	add ecx,dword[edi+14] ; *** ecx = tex[po_t] ***
1276
	add ecx,8   ; *** ecx = tex[po_t].next ***
1277
	push dword [ecx] ;tex[i].next=tex[po_t].next;
1278
	pop dword [edx+8]
1279
 
1280
	call tl_get_node_index ;*** eax = i ***
1281
	cmp eax,dword[edi+6] ;info_max_count
1282
	jge .u0
1283
 
1284
	mov [ecx],eax ;tex[po_t].next=i; // ссылки перенаправляем
1285
	mov ecx,[edx+8] ; *** ecx = tex[i].next ***
1286
	imul ecx,sizeof.TreeList
1287
	add ecx,dword[edi+14] ; *** ecx = tex[tex[i].next] ***
1288
	mov [ecx+4],eax ;tex[tex[i].next].perv=i;
1289
 
1290
	call tb_scrol_resize ;обработка скроллинга
1291
    jmp @f
1292
      .u0:
1293
      add edx,sizeof.TreeList
1294
      cmp edx,ebx ;enf of node memory ?
1295
      jle @b
1296
    @@:
1297
  pop edi edx ecx ebx eax
1298
  pop ebp
1299
  ret 12
1300
 
1301
;input:
1302
; edi = pointer to TreeInfo struct
1303
align 4
1304
tb_scrol_resize:
1305
  push eax ecx edx
1306
  cmp tl_p_scrol,0 ;обработка скроллинга
1307
  je @f
1308
    call tl_get_node_count ;eax = node count
1309
    mov ecx,eax
1310
    call tl_get_rows_count
1311
    cmp ecx,eax
1312
    jg .ye_sb
1313
      xor ecx,ecx
1314
    .ye_sb:
1315
 
1316
    mov edx,tl_p_scrol
1317
    mov dword[edx+20],eax ;+20 .cur_area
1318
    mov dword[edx+16],ecx ;+16 .max_area
1319
    push dword edx ;pointer to scroll struct
1320
    mov edx,tl_sb_draw ;pointer to scroll draw function
1321
    call dword[edx]
1322
  @@:
1323
  pop edx ecx eax
1324
ret
1325
 
1326
;input:
1327
;dword[ebp+ 8] - pointer to node info
1328
;dword[ebp+12] - pointer to 'TreeList' struct
1329
align 4
1330
tl_node_set_data:
1331
  push ebp
1332
  mov ebp,esp
1333
  push eax ecx edx edi esi
1334
    mov edi,dword[ebp+12]
1335
    call tl_get_cur_node_index ;eax=po_t
1336
    cmp eax,2
1337
    jl @f
1338
      xor ecx,ecx
1339
      mov cx,word[edi+4];info_size
1340
      imul eax,ecx
1341
      add eax,dword[edi]
1342
      mov edi,eax
1343
      mov esi,dword[ebp+8] ;pointer to node data
1344
      rep movsb
1345
 
1346
      mov esi,edi
1347
      mov edi,dword[ebp+12] ;restore edi
1348
      mov ecx,tl_info_capt_offs
1349
      cmp cx,word[edi+4] ;+4 info_size
1350
      jge .no_text_data
1351
	dec esi
1352
	mov byte[esi],0
1353
      .no_text_data:
1354
 
1355
    @@:
1356
  pop esi edi edx ecx eax
1357
  pop ebp
1358
  ret 8
1359
 
1360
;input:
1361
;dword[ebp+ 8] - pointer to 'TreeList' struct
1362
align 4
1363
tl_node_get_data: ;взять указатель на данные узла под курсором
1364
  push ebp
1365
  mov ebp,esp
1366
  push eax ecx edi
1367
    mov edi,dword[ebp+8]
1368
    call tl_get_cur_node_index ;eax=po_t
1369
    mov dword[ebp+8],0 ;if return 0 pointer
1370
    cmp eax,2
1371
    jl @f
1372
      xor ecx,ecx
1373
      mov cx,word[edi+4];info_size
1374
      imul eax,ecx
1375
      add eax,dword[edi]
1376
      mov dword[ebp+8],eax ;return node data pointer
1377
    @@:
1378
  pop edi ecx eax
1379
  pop ebp
1380
  ret
1381
 
1382
;input:
1383
;dword[ebp+ 8] - node index
1384
;dword[ebp+12] - pointer to 'TreeList' struct
1385
align 4
1386
tl_node_poi_get_info: ;взять указатель на структуру узла в указанной позиции
1387
  push ebp
1388
  mov ebp,esp
1389
  push eax ecx edx edi
1390
    mov edi,dword[ebp+12]
1391
    mov eax,dword[ebp+8]
1392
 
1393
    ;cycle to nodes
1394
    mov edx,dword[edi+14] ;+14 указатель на структуры узлов
1395
    mov ecx,edx
1396
    add ecx,sizeof.TreeList
1397
    @@:
1398
      call tl_iterat_next_all
1399
      cmp edx,ecx
1400
      jle @f
1401
      dec eax
1402
      cmp eax,0
1403
      jg @b
1404
      jmp .find
1405
    @@:
1406
      xor edx,edx
1407
    .find:
1408
    mov dword[ebp+12],edx
1409
  pop edi edx ecx eax
1410
  pop ebp
1411
  ret 4
1412
 
1413
;input:
1414
;dword[ebp+ 8] - node param struct
1415
;dword[ebp+12] - pointer to 'TreeList' struct
1416
align 4
1417
tl_node_poi_get_next_info: ;взять указатель на следущую структуру узла
1418
  push ebp
1419
  mov ebp,esp
1420
  push ecx edx edi
1421
    mov edi,dword[ebp+12]
1422
    mov edx,dword[ebp+8]
1423
 
1424
    mov ecx,dword[edi+14] ;+14 указатель на структуры узлов
1425
    add ecx,sizeof.TreeList
1426
 
1427
    call tl_iterat_next_all
1428
    cmp edx,ecx
1429
    jg @f
1430
      xor edx,edx
1431
    @@:
1432
 
1433
    mov dword[ebp+12],edx
1434
  pop edi edx ecx
1435
  pop ebp
1436
  ret 4
1437
 
1438
;input:
1439
;dword[ebp+ 8] - node param struct
1440
;dword[ebp+12] - pointer to 'TreeList' struct
1441
align 4
1442
tl_node_poi_get_data: ;взять указатель на данные узла
1443
  push ebp
1444
  mov ebp,esp
1445
  push eax ecx edi
1446
    mov edi,dword[ebp+12]
1447
    mov edx,dword[ebp+8]
1448
 
1449
    mov dword[ebp+12],0
1450
    call tl_get_node_index ;eax = node index
1451
    cmp eax,2
1452
    jl @f
1453
      xor ecx,ecx
1454
      mov cx,word[edi+4];info_size
1455
      imul eax,ecx
1456
      add eax,dword[edi]
1457
      mov dword[ebp+12],eax ;return node data pointer
1458
    @@:
1459
  pop edi ecx eax
1460
  pop ebp
1461
  ret 4
1462
 
1463
;input:
1464
; edi = pointer 'tl' struct
1465
;output:
1466
; eax = index of current node
1467
align 4
1468
tl_get_cur_node_index: ;берет позицию под курсором
1469
  push ecx edx
1470
    ;cycle to nodes
1471
    xor eax,eax
1472
    mov edx,dword[edi+14] ;+14 указатель на структуры узлов
1473
    mov ecx,edx
1474
    add ecx,sizeof.TreeList
1475
    @@:
1476
      call tl_iterat_next
1477
      cmp edx,ecx
1478
      jle @f
1479
      cmp eax,tl_cur_pos
1480
      je @f
1481
      inc eax
1482
      jmp @b
1483
    @@:
1484
  mov eax,edx
1485
  sub eax,dword[edi+14] ;+14 указатель на структуры узлов
1486
  xor edx,edx
1487
  mov ecx,sizeof.TreeList
1488
  div ecx
1489
  pop edx ecx
1490
  ret
1491
 
1492
;input:
1493
; edx = pointer node memory
1494
; edi = pointer 'tl' struct
1495
;output:
1496
; eax = struct index of current node
1497
align 4
1498
tl_get_node_index: ;берет позицию указанного символа
1499
  push ecx edx
1500
  mov eax,edx
1501
  sub eax,dword[edi+14] ;+14 указатель на структуры узлов
1502
  xor edx,edx
1503
  mov ecx,sizeof.TreeList
1504
  div ecx
1505
  pop edx ecx
1506
  ret
1507
 
1508
align 4
1509
tl_node_delete: ;удалить узел
1510
  push ebp
1511
  mov ebp,esp
1512
  push eax edx edi
1513
    mov edi,dword[ebp+8]
1514
    call tl_get_cur_node_index ;eax=po_t
1515
    cmp eax,2
1516
    jl @f
1517
      imul eax,sizeof.TreeList
1518
      add eax,dword[edi+14] ;+14 указатель на структуры узлов
1519
      mov edx,eax
1520
      inc tl_ch_tim
1521
      mov eax,tl_ch_tim
1522
      mov dword[edx+16],eax
1523
      call tb_scrol_resize ;обработка скроллинга
1524
    @@:
1525
  pop edi edx eax
1526
  pop ebp
1527
  ret 4
1528
 
1529
align 4
1530
tl_cur_beg: ;поставить курсор на первый узел
1531
  push ebp
1532
  mov ebp,esp
1533
  push edi
1534
    mov edi,dword[ebp+8]
1535
    mov tl_cur_pos,0
1536
    cmp tl_p_scrol,0
1537
    je @f
1538
      mov edi,tl_p_scrol
1539
      mov dword[edi+24],0
1540
      push dword edi
1541
      mov edi,dword[ebp+8]
1542
      mov edi,tl_sb_draw
1543
      call dword[edi]
1544
    @@:
1545
  pop edi
1546
 
1547
  pop ebp
1548
  ret 4
1549
 
1550
align 4
1551
tl_cur_next: ;перенести курсор на 1 позицию ниже
1552
  push ebp
1553
  mov ebp,esp
1554
  push eax ebx edi esi
1555
    mov edi,dword[ebp+8]
1556
    call tl_get_node_count ;eax = node count
1557
    ;inc eax
1558
    cmp tl_cur_pos,eax
1559
    jge .no_redraw
1560
      mov esi,tl_box_top
1561
      add esi,tl_box_height ;esi = coord bottom border
1562
      call tl_draw_null_cursor ;стираем курсор
1563
      inc tl_cur_pos
1564
 
1565
    cmp tl_p_scrol,0 ;if not scrol struct
1566
    je @f
1567
    call tl_get_rows_count ;eax = rows count
1568
    mov ebx,tl_p_scrol
1569
    add eax,dword[ebx+24] ;.position +24
1570
    cmp tl_cur_pos,eax
1571
    jl @f
1572
      inc dword[ebx+24] ;.position +24
1573
      push dword ebx
1574
      mov edi,tl_sb_draw ;перерисовка скроллинга
1575
      call dword[edi]
1576
 
1577
      mov edi,dword[ebp+8] ;restore edi
1578
      push dword edi
1579
      call tl_draw ;полная перерисовка окна
1580
      jmp .no_redraw
1581
    @@:
1582
      mov edi,dword[ebp+8] ;restore edi
1583
      call tl_draw_cursor ;перерисовка курсора
1584
    .no_redraw:
1585
  pop esi edi ebx eax
1586
  pop ebp
1587
  ret 4
1588
 
1589
 
1590
;input:
1591
; edi = pointer 'tl' struct
1592
;output:
1593
; eax = struct index of current node
1594
align 4
1595
tl_get_node_count: ;берет число всех видимых узлов (не считая закрытых дочерних)
1596
  push ecx edx
1597
    ;cycle to nodes
1598
    xor eax,eax
1599
    mov edx,dword[edi+14] ;+14 указатель на структуры узлов
1600
    mov ecx,edx
1601
    add ecx,sizeof.TreeList
1602
    @@:
1603
      call tl_iterat_next
1604
      cmp edx,ecx
1605
      jle @f
1606
      inc eax
1607
      jmp @b
1608
    @@:
1609
  pop edx ecx
1610
  ret
1611
 
1612
align 4
1613
tl_cur_perv: ;перенести курсор на 1 позицию выше
1614
  push ebp
1615
  mov ebp,esp
1616
  push eax edi esi
1617
    mov edi,dword[ebp+8]
1618
    cmp tl_cur_pos,0
1619
    je .no_redraw
1620
      mov esi,tl_box_top
1621
      add esi,tl_box_height ;esi = coord bottom border
1622
      call tl_draw_null_cursor ;стираем курсор
1623
      dec tl_cur_pos ;двигаем курсор вверх
1624
 
1625
    cmp tl_p_scrol,0 ;если есть указатель на скроллинг
1626
    je @f
1627
    mov eax,tl_p_scrol
1628
    cmp dword[eax+24],0 ;если скроллинг на верху, выходим
1629
    je @f
1630
    mov edi,tl_cur_pos
1631
    cmp edi,dword[eax+24] ;если курсор ушел выше скроллинга, тогда опускаем скроллинг
1632
    jge @f
1633
      dec dword[eax+24]
1634
      push dword eax
1635
      mov edi,dword[ebp+8]
1636
      mov edi,tl_sb_draw ;.redraw
1637
      call dword[edi]
1638
      mov edi,dword[ebp+8] ;restore edi
1639
      push dword edi
1640
      call tl_draw ;полная перерисовка окна
1641
      jmp .no_redraw
1642
    @@:
1643
      mov edi,dword[ebp+8] ;restore edi
1644
      ;mov esi,tl_box_top
1645
      ;add esi,tl_box_height ;esi = coord bottom border
1646
      call tl_draw_cursor ;перерисовка курсора
1647
    .no_redraw:
1648
  pop esi edi eax
1649
  pop ebp
1650
  ret 4
1651
 
1652
align 4
1653
tl_node_close_open: ;открыть/закрыть узел (работает с узлами которые имеют дочерние узлы)
1654
  push ebp
1655
  mov ebp,esp
1656
  push eax edx edi
1657
    mov edi,dword[ebp+8]
1658
    call tl_get_cur_node_index ;eax = позиция узла на котором стоит курсор
1659
    cmp eax,2 ;курсор стоит на узле ?
1660
    jl @f
1661
      imul eax,sizeof.TreeList
1662
      add eax,dword[edi+14] ;+14 указатель на структуры узлов
1663
      ;eax = указатель на структуру узла выбранного курсором
1664
      push dword edi
1665
      push dword eax
1666
      call tl_node_poi_get_next_info
1667
      pop dword edx ;edx = указатель на структуру узла который идет после узла eax
1668
      cmp edx,0 ;есть ли узлы ниже выбранного нами ?
1669
      je @f
1670
	mov dl,byte[edx+2] ;берем уровень нижнего узла
1671
	cmp byte[eax+2],dl ;+2 = .lev
1672
	jge @f ;если нижние узлы меньшего уровня, значит они не дочерние, конец функции
1673
	  xor byte[eax+3],1 ;+3 = .clo *** открытие/закрытие узла ***
1674
	  call tb_scrol_resize ;обработка скроллинга
1675
 
1676
	  push dword edi
1677
	  call tl_draw ;обновление окна
1678
    @@:
1679
  pop edi edx eax
1680
  pop ebp
1681
  ret 4
1682
 
1683
align 4
1684
tl_node_lev_inc: ;увеличить уровень
1685
  push ebp
1686
  mov ebp,esp
1687
  push eax edx edi
1688
    mov edi,dword[ebp+8]
1689
    bt tl_style,2 ;tl_list_box_mode
1690
    jc @f
1691
    call tl_get_cur_node_index ;eax=po_t
1692
    cmp eax,2
1693
    jl @f
1694
      imul eax,sizeof.TreeList
1695
      add eax,dword[edi+14] ;+14 указатель на структуры узлов
1696
      mov edx,eax
1697
      inc word[edx+2]
1698
    @@:
1699
  pop edi edx eax
1700
  pop ebp
1701
  ret 4
1702
 
1703
align 4
1704
tl_node_lev_dec: ;уменьшить уровень
1705
  push ebp
1706
  mov ebp,esp
1707
  push eax edx edi
1708
    mov edi,dword[ebp+8]
1709
    call tl_get_cur_node_index ;eax=po_t
1710
    cmp eax,2
1711
    jl @f
1712
      imul eax,sizeof.TreeList
1713
      add eax,dword[edi+14] ;+14 указатель на структуры узлов
1714
      mov edx,eax
1715
      cmp word[edx+2],0
1716
      je @f
1717
      dec word[edx+2]
1718
    @@:
1719
  pop edi edx eax
1720
  pop ebp
1721
  ret 4
1722
 
1723
txt_capt_cur db '‘ва®Є ',0
1724
txt_capt_otm db 'Ћв¬Ґ­л',0
1725
}