Rev 1328 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1277 | IgorA | 1 | ; макрос для системной библиотеки box_lib.obj |
2 | ; элемент TreeList для Kolibri OS |
||
1328 | IgorA | 3 | ; файл последний раз изменялся 23.12.2009 IgorA |
1277 | IgorA | 4 | ; на код применена GPL2 лицензия |
5 | |||
6 | |||
7 | sizeof.TreeList equ 20 |
||
1283 | IgorA | 8 | ;struct TreeList |
9 | ; type dw ? ;+ 0 тип элемента, или индекс иконки для узла |
||
10 | ; lev db ? ;+ 2 уровень элемента |
||
11 | ; clo db ? ;+ 3 флаг закрытия, или открытия (имеет смысл для родительского узла) |
||
12 | ; perv dd ? ;+ 4 индекс предыдущего элемента |
||
13 | ; next dd ? ;+ 8 индекс последующего элемента |
||
14 | ; tc dd ? ;+12 врем. создания |
||
15 | ; td dd ? ;+16 врем. удаления |
||
16 | ;ends |
||
1277 | IgorA | 17 | |
1283 | IgorA | 18 | tl_info_size equ word[edi +4] ;размер данных выделяемых для каждого узла (пользовательськие данные + текст для подписи) |
1277 | IgorA | 19 | tl_style equ dword[edi+10] ;стили элемента |
1283 | IgorA | 20 | tl_data_nodes equ dword[edi+14] ;указатель на структуры узлов |
1277 | IgorA | 21 | tl_img_cx equ word[edi+22] ;ширина иконок |
22 | tl_img_cy equ word[edi+24] ;высота иконок |
||
23 | tl_data_img_sys equ dword[edi+26] ;указатель на системные изображения (стрелки, плюсики) |
||
24 | tl_ch_tim equ dword[edi+30] ;количество изменений в файле |
||
25 | tl_tim_undo equ dword[edi+38] ;количество отмененных действий |
||
26 | tl_cur_pos equ dword[edi+42] ;позиция курсора |
||
27 | tl_col_bkg equ dword[edi+46] ;цвет фона |
||
28 | tl_col_zag equ dword[edi+50] ;цвет заголовка |
||
29 | tl_col_txt equ dword[edi+54] ;цвет текста |
||
30 | tl_box_left equ dword[edi+58] |
||
31 | tl_box_top equ dword[edi+62] |
||
32 | tl_box_width equ dword[edi+66] |
||
33 | tl_box_height equ dword[edi+70] |
||
34 | tl_capt_cy equ word[edi+74] ;высота подписи |
||
1303 | IgorA | 35 | tl_info_capt_offs equ word[edi+76] ;сдвиг для начала текста (подписи узла) |
36 | tl_info_capt_len equ word[edi+78] ;длинна текста подписи узла (если = 0 то до конца структуры) |
||
1277 | IgorA | 37 | tl_el_focus equ dword[edi+80] ;указатель на структуру элемента в фокусе |
38 | tl_p_scrol equ dword[edi+84] ;указатель на структуру скроллинга |
||
39 | tl_on_press equ dword[edi+96] ;указатель на функцию, которая вызывается при нажатии Enter |
||
40 | |||
41 | ;константы стиля |
||
42 | tl_key_no_edit equ 1b ;элемент нельзя редактировать на клавиатуре (изменять уровни, удалять) |
||
43 | tl_draw_par_line equ 10b ;рисовать линии к родительскому узлу |
||
44 | tl_list_box_mode equ 100b ;стиль не отображает уровни (как в ListBox все одного уровня) |
||
45 | |||
1303 | IgorA | 46 | ;константы для функций |
47 | tl_err_save_memory_size equ 10b ;не хватает памяти для сохранения элемента |
||
48 | tl_err_load_caption equ 1b ;в памяти нет заголовка 'tree' |
||
49 | tl_err_load_info_size equ 100b ;не совпадает размер информационной структуры при открытии |
||
50 | tl_load_mode_add equ 0x20000 ;опция считывания в режиме добавления информации |
||
51 | tl_save_load_heder_size equ 26 ;размер заголовка для записи/чтения элементов |
||
52 | |||
1283 | IgorA | 53 | ;data_info dd ? ;+ 0 указатель на основные даные |
54 | ;info_max_count dd ? ;+ 6 максимальное колличество структур |
||
55 | ;data_img dd ? ;+18 указатель на изображения |
||
56 | ;ls_tim dd ? ;+34 время последнего сохранения |
||
57 | ;on_activate dd ? ;+92 указатель на функцию при активировании узла |
||
1277 | IgorA | 58 | |
59 | struc tree_list info_size,info_max_count,style, img_cx,img_cy,\ |
||
60 | col_bkg,col_zag,col_txt, box_l,box_t,box_w,box_h, capt_cy,info_capt_offs,\ |
||
1309 | IgorA | 61 | info_capt_len,el_focus, p_scrol,on_press { |
1277 | IgorA | 62 | .data_info dd 0 |
63 | .info_size dw info_size |
||
64 | .info_max_count dd info_max_count |
||
65 | .style dd style |
||
66 | .data_nodes dd 0 |
||
67 | .data_img dd 0 |
||
68 | .img_cx dw img_cx |
||
69 | .img_cy dw img_cy |
||
70 | .data_img_sys dd 0 |
||
71 | .ch_tim dd 0 |
||
72 | .ls_tim dd 0 |
||
73 | .tim_undo dd 0 |
||
74 | .cur_pos dd 0 |
||
75 | .col_bkg dd col_bkg |
||
76 | .col_zag dd col_zag |
||
77 | .col_txt dd col_txt |
||
1303 | IgorA | 78 | .box_left dd box_l |
1277 | IgorA | 79 | .box_top dd box_t |
80 | .box_width dd box_w |
||
81 | .box_height dd box_h |
||
82 | .capt_cy dw capt_cy |
||
1303 | IgorA | 83 | .info_capt_offs dw info_capt_offs |
84 | .info_capt_len dw info_capt_len |
||
1277 | IgorA | 85 | .el_focus dd el_focus |
86 | .p_scrol dd p_scrol |
||
1309 | IgorA | 87 | rb 4 |
1277 | IgorA | 88 | .on_activate dd 0 |
1283 | IgorA | 89 | .on_press dd on_press |
1277 | IgorA | 90 | } |
91 | |||
1382 | diamond | 92 | macro use_tree_list |
93 | { |
||
1277 | IgorA | 94 | ;----------------------------------------------------------------------------- |
95 | ;функция для выделения памяти |
||
96 | ;input: |
||
97 | ; ecx = size data |
||
98 | ;otput: |
||
99 | ; eax = pointer to memory |
||
100 | align 4 |
||
101 | mem_Alloc: |
||
102 | push ebx |
||
103 | mov eax,68 |
||
104 | mov ebx,12 |
||
105 | int 0x40 |
||
106 | pop ebx |
||
107 | ret |
||
108 | ;----------------------------------------------------------------------------- |
||
109 | ;функция для освобождения памяти |
||
110 | ;input: |
||
111 | ; ecx = pointer to memory |
||
112 | align 4 |
||
113 | mem_Free: |
||
114 | push eax ebx |
||
115 | cmp ecx,0 |
||
116 | jz @f |
||
117 | mov eax,68 |
||
118 | mov ebx,13 |
||
119 | int 0x40 |
||
120 | @@: |
||
121 | pop ebx eax |
||
122 | ret |
||
123 | |||
124 | align 4 |
||
125 | tl_data_init: ;выделние памяти для структур списка и основной информации (конструктор) |
||
126 | push ebp |
||
127 | mov ebp,esp |
||
128 | push eax ecx edi |
||
129 | mov edi,dword[ebp+8] |
||
130 | |||
131 | xor ecx,ecx |
||
1283 | IgorA | 132 | mov cx,tl_info_size |
1277 | IgorA | 133 | imul ecx,dword[edi+6] |
134 | call mem_Alloc |
||
135 | mov dword[edi],eax ;копируем указатель на полученую память в структуру |
||
136 | mov dword[edi+18],0 ;обнуляем указатель 'data_img' |
||
137 | mov tl_data_img_sys,0 ;обнуляем указатель 'data_img_sys' |
||
138 | |||
139 | mov ecx,sizeof.TreeList |
||
140 | imul ecx,dword[edi+6] |
||
141 | call mem_Alloc |
||
1283 | IgorA | 142 | mov tl_data_nodes,eax ;копируем указатель на полученую память в структуру |
1277 | IgorA | 143 | |
144 | push dword edi |
||
145 | call tl_info_clear |
||
146 | |||
147 | ;настройки дочернего скроллинга |
||
148 | cmp tl_p_scrol,0 |
||
149 | je @f |
||
150 | mov eax,tl_p_scrol |
||
151 | ;*** цветовые настройки *** |
||
152 | mov ecx,tl_col_bkg |
||
153 | mov dword[eax+28],ecx ;+28 .bckg_col |
||
154 | mov ecx,tl_col_zag |
||
155 | mov dword[eax+32],ecx ;+32 .frnt_col |
||
156 | mov ecx,tl_col_txt |
||
157 | mov dword[eax+36],ecx ;+32 .line_col |
||
158 | ;*** настройки размеров *** |
||
159 | mov ecx,tl_box_left |
||
160 | add ecx,tl_box_width |
||
161 | mov word[eax+2],cx |
||
162 | mov ecx,tl_box_height |
||
163 | mov word[eax+4],cx |
||
164 | mov ecx,tl_box_top |
||
165 | mov word[eax+6],cx |
||
166 | @@: |
||
167 | pop edi ecx eax |
||
168 | pop ebp |
||
169 | ret 4 |
||
170 | |||
171 | align 4 |
||
172 | tl_data_clear: ;очистка памяти элемента (деструктор) |
||
173 | push ebp |
||
174 | mov ebp,esp |
||
175 | push ecx edi |
||
176 | mov edi,dword[ebp+8] |
||
177 | cmp dword[edi+18],0 ;data_img |
||
178 | je @f |
||
179 | mov ecx,dword[edi+18] |
||
180 | call mem_Free ;чистка системных иконок |
||
181 | @@: |
||
182 | cmp tl_data_img_sys,0 |
||
183 | je @f |
||
184 | mov ecx,tl_data_img_sys |
||
185 | call mem_Free ;чистка системных иконок |
||
186 | @@: |
||
187 | mov ecx,dword[edi] |
||
188 | call mem_Free |
||
189 | |||
1283 | IgorA | 190 | mov ecx,tl_data_nodes |
1277 | IgorA | 191 | call mem_Free |
192 | pop edi ecx |
||
193 | pop ebp |
||
194 | ret 4 |
||
195 | |||
196 | align 4 |
||
197 | tl_info_clear: ;очистка списка (информации) |
||
198 | push ebp |
||
199 | mov ebp,esp |
||
200 | push eax ecx edi |
||
201 | mov edi,dword[ebp+8] |
||
202 | mov tl_ch_tim,0 |
||
203 | mov dword[edi+34],0 ;ls_tim |
||
204 | mov tl_tim_undo,0 |
||
205 | mov tl_cur_pos,0 |
||
206 | ;xor ecx,ecx |
||
207 | mov ecx,sizeof.TreeList |
||
208 | imul ecx,dword[edi+6] |
||
1283 | IgorA | 209 | mov eax,tl_data_nodes |
1277 | IgorA | 210 | @@: |
211 | mov byte[eax],0 ;чистим узлы 0-ми |
||
212 | inc eax |
||
213 | loop @b |
||
1283 | IgorA | 214 | mov eax,tl_data_nodes ;указатель на 0-й узел |
215 | mov dword[eax+8],1 ;указатель next в 0-м узле приравниваем к 1 |
||
1303 | IgorA | 216 | |
217 | cmp tl_p_scrol,0 ;обработка скроллинга |
||
218 | je @f |
||
219 | mov eax,tl_p_scrol |
||
220 | mov dword[eax+24],0 ;+24 .position |
||
221 | call tb_scrol_resize |
||
222 | @@: |
||
1277 | IgorA | 223 | pop edi ecx eax |
224 | pop ebp |
||
225 | ret 4 |
||
226 | |||
227 | |||
228 | align 4 |
||
229 | tl_key: ;реакция на клавиатуру |
||
230 | push ebp |
||
231 | mov ebp,esp |
||
1303 | IgorA | 232 | push |