Subversion Repositories Kolibri OS

Rev

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