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