Rev 1283 | 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 |
||
1285 | IgorA | 3 | ; файл последний раз изменялся 24.11.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] ;высота подписи |
||
1283 | IgorA | 35 | tl_info_capt_offs equ dword[edi+76] ;сдвиг для начала текста (подписи узла) |
1277 | IgorA | 36 | tl_el_focus equ dword[edi+80] ;указатель на структуру элемента в фокусе |
37 | tl_p_scrol equ dword[edi+84] ;указатель на структуру скроллинга |
||
38 | tl_sb_draw equ dword[edi+88] ;указатель на функцию перерисовывающую скроллинг |
||
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 | |||
1283 | IgorA | 46 | ;data_info dd ? ;+ 0 указатель на основные даные |
47 | ;info_max_count dd ? ;+ 6 максимальное колличество структур |
||
48 | ;data_img dd ? ;+18 указатель на изображения |
||
49 | ;ls_tim dd ? ;+34 время последнего сохранения |
||
50 | ;on_activate dd ? ;+92 указатель на функцию при активировании узла |
||
1277 | IgorA | 51 | |
52 | struc tree_list info_size,info_max_count,style, img_cx,img_cy,\ |
||
53 | col_bkg,col_zag,col_txt, box_l,box_t,box_w,box_h, capt_cy,info_capt_offs,\ |
||
1283 | IgorA | 54 | el_focus, p_scrol,p_sb_draw,on_press { |
1277 | IgorA | 55 | .data_info dd 0 |
56 | .info_size dw info_size |
||
57 | .info_max_count dd info_max_count |
||
58 | .style dd style |
||
59 | .data_nodes dd 0 |
||
60 | .data_img dd 0 |
||
61 | .img_cx dw img_cx |
||
62 | .img_cy dw img_cy |
||
63 | .data_img_sys dd 0 |
||
64 | .ch_tim dd 0 |
||
65 | .ls_tim dd 0 |
||
66 | .tim_undo dd 0 |
||
67 | .cur_pos dd 0 |
||
68 | .col_bkg dd col_bkg |
||
69 | .col_zag dd col_zag |
||
70 | .col_txt dd col_txt |
||
71 | .box_lert dd box_l |
||
72 | .box_top dd box_t |
||
73 | .box_width dd box_w |
||
74 | .box_height dd box_h |
||
75 | .capt_cy dw capt_cy |
||
76 | .info_capt_offs dd info_capt_offs |
||
77 | .el_focus dd el_focus |
||
78 | .p_scrol dd p_scrol |
||
79 | .p_sb_draw dd p_sb_draw |
||
80 | .on_activate dd 0 |
||
1283 | IgorA | 81 | .on_press dd on_press |
1277 | IgorA | 82 | } |
83 | |||
84 | ;----------------------------------------------------------------------------- |
||
85 | ;функция для выделения памяти |
||
86 | ;input: |
||
87 | ; ecx = size data |
||
88 | ;otput: |
||
89 | ; eax = pointer to memory |
||
90 | align 4 |
||
91 | mem_Alloc: |
||
92 | push ebx |
||
93 | mov eax,68 |
||
94 | mov ebx,12 |
||
95 | int 0x40 |
||
96 | pop ebx |
||
97 | ret |
||
98 | ;----------------------------------------------------------------------------- |
||
99 | ;функция для освобождения памяти |
||
100 | ;input: |
||
101 | ; ecx = pointer to memory |
||
102 | align 4 |
||
103 | mem_Free: |
||
104 | push eax ebx |
||
105 | cmp ecx,0 |
||
106 | jz @f |
||
107 | mov eax,68 |
||
108 | mov ebx,13 |
||
109 | int 0x40 |
||
110 | @@: |
||
111 | pop ebx eax |
||
112 | ret |
||
113 | |||
114 | macro use_tree_list |
||
115 | { |
||
116 | align 4 |
||
117 | tl_data_init: ;выделние памяти для структур списка и основной информации (конструктор) |
||
118 | push ebp |
||
119 | mov ebp,esp |
||
120 | push eax ecx edi |
||
121 | mov edi,dword[ebp+8] |
||
122 | |||
123 | xor ecx,ecx |
||
1283 | IgorA | 124 | mov cx,tl_info_size |
1277 | IgorA | 125 | imul ecx,dword[edi+6] |
126 | call mem_Alloc |
||
127 | mov dword[edi],eax ;копируем указатель на полученую память в структуру |
||
128 | mov dword[edi+18],0 ;обнуляем указатель 'data_img' |
||
129 | mov tl_data_img_sys,0 ;обнуляем указатель 'data_img_sys' |
||
130 | |||
131 | mov ecx,sizeof.TreeList |
||
132 | imul ecx,dword[edi+6] |
||
133 | call mem_Alloc |
||
1283 | IgorA | 134 | mov tl_data_nodes,eax ;копируем указатель на полученую память в структуру |
1277 | IgorA | 135 | |
136 | push dword edi |
||
137 | call tl_info_clear |
||
138 | |||
139 | ;настройки дочернего скроллинга |
||
140 | cmp tl_p_scrol,0 |
||
141 | je @f |
||
142 | mov eax,tl_p_scrol |
||
143 | ;*** цветовые настройки *** |
||
144 | mov ecx,tl_col_bkg |
||
145 | mov dword[eax+28],ecx ;+28 .bckg_col |
||
146 | mov ecx,tl_col_zag |
||
147 | mov dword[eax+32],ecx ;+32 .frnt_col |
||
148 | mov ecx,tl_col_txt |
||
149 | mov dword[eax+36],ecx ;+32 .line_col |
||
150 | ;*** настройки размеров *** |
||
151 | mov ecx,tl_box_left |
||
152 | add ecx,tl_box_width |
||
153 | mov word[eax+2],cx |
||
154 | mov ecx,tl_box_height |
||
155 | mov word[eax+4],cx |
||
156 | mov ecx,tl_box_top |
||
157 | mov word[eax+6],cx |
||
158 | @@: |
||
159 | pop edi ecx eax |
||
160 | pop ebp |
||
161 | ret 4 |
||
162 | |||
163 | align 4 |
||
164 | tl_data_clear: ;очистка памяти элемента (деструктор) |
||
165 | push ebp |
||
166 | mov ebp,esp |
||
167 | push ecx edi |
||
168 | mov edi,dword[ebp+8] |
||
169 | cmp dword[edi+18],0 ;data_img |
||
170 | je @f |
||
171 | mov ecx,dword[edi+18] |
||
172 | call mem_Free ;чистка системных иконок |
||
173 | @@: |
||
174 | cmp tl_data_img_sys,0 |
||
175 | je @f |
||
176 | mov ecx,tl_data_img_sys |
||
177 | call mem_Free ;чистка системных иконок |
||
178 | @@: |
||
179 | mov ecx,dword[edi] |
||
180 | call mem_Free |
||
181 | |||
1283 | IgorA | 182 | mov ecx,tl_data_nodes |
1277 | IgorA | 183 | call mem_Free |
184 | pop edi ecx |
||
185 | pop ebp |
||
186 | ret 4 |
||
187 | |||
188 | align 4 |
||
189 | tl_info_clear: ;очистка списка (информации) |
||
190 | push ebp |
||
191 | mov ebp,esp |
||
192 | push eax ecx edi |
||
193 | mov edi,dword[ebp+8] |
||
194 | mov tl_ch_tim,0 |
||
195 | mov dword[edi+34],0 ;ls_tim |
||
196 | mov tl_tim_undo,0 |
||
197 | mov tl_cur_pos,0 |
||
198 | ;xor ecx,ecx |
||
199 | mov ecx,sizeof.TreeList |
||
200 | imul ecx,dword[edi+6] |
||
1283 | IgorA | 201 | mov eax,tl_data_nodes |
1277 | IgorA | 202 | @@: |
203 | mov byte[eax],0 ;чистим узлы 0-ми |
||
204 | inc eax |
||
205 | loop @b |
||
1283 | IgorA | 206 | mov eax,tl_data_nodes ;указатель на 0-й узел |
207 | mov dword[eax+8],1 ;указатель next в 0-м узле приравниваем к 1 |
||
1277 | IgorA | 208 | call tb_scrol_resize ;обработка скроллинга |
209 | pop edi ecx eax |
||
210 | pop ebp |
||
211 | ret 4 |
||
212 | |||
213 | |||
214 | align 4 |
||
215 | tl_key: ;реакция на клавиатуру |
||
216 | push ebp |
||
217 | mov ebp,esp |
||
218 | push ebx edi |
||
219 | mov edi,dword[ebp+8] |
||
220 | |||
221 | mov ebx,tl_el_focus |
||
222 | cmp dword[ebx],edi |
||
223 | jne .no_focus ;элемент не в фокусе |
||
224 | |||
225 | xor bx,bx |
||
226 | cmp ah,13 ;Enter |
||
227 | jne @f |
||
228 | cmp tl_on_press,0 |
||
229 | je @f |
||
230 | call tl_on_press |
||
231 | @@: |
||
232 | cmp ah,32 ;Space |
||
233 | jne @f |
||
234 | push dword edi |
||
235 | call tl_node_close_open |
||
236 | @@: |
||
237 | cmp ah,178 ;Up |
||
238 | jne @f |
||
239 | push dword edi |
||
240 | call tl_cur_perv |
||
241 | @@: |
||
242 | cmp ah,177 ;Down |
||
243 | jne @f |
||
244 | push dword edi |
||
245 |