Subversion Repositories Kolibri OS

Rev

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