Subversion Repositories Kolibri OS

Rev

Rev 1717 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1714 IgorA 1
;
2
; в этом файле собраны функции нужные для создания и
3
; работы окна со свойствами объекта
4
;
5
 
6
prop_edits_top equ 25
7
prop_edits_height equ 18
8
prop_wnd_width equ 520 ;ширина окна со свойствами объекта
9
 
10
prop_wnd_run db 0 ;переменная следящая за тем что-бы не запускать больше 1-го окна со свойствами одновременно
11
 
12
;даное окно (процесс) вызываеться функцией on_file_object_select
13
align 4
14
prop_start:
15
pushad
16
	mcall 40,0x27 ;маска ожидаемых событий
17
 
1717 IgorA 18
	call init_obj_count_txt_props ;получаем число используемых полей
19
 
1714 IgorA 20
	; настройка текстовых полей
21
	xor ebx,ebx
22
	mov edi,edit2
23
	@@:
24
		stdcall set_obj_win_param, ebx,edi
25
		inc ebx
26
		add edi,ed_struc_size
27
		cmp edi,prop_wnd_edits_end
28
		jl @b
29
 
30
	; настройка списка объектов, определяющих типы переменных
31
	stdcall dword[tl_data_init], tree3
32
	cmp byte[err_ini0],1
33
	je @f
34
		mov dword[tree3.data_img],bmp_icon
35
	@@:
36
	mov eax,dword[icon_tl_sys]
37
	mov dword[tree3.data_img_sys],eax
38
 
39
	mov edx,[foc_obj]
1717 IgorA 40
	cmp dword[edx],C_VAR
1714 IgorA 41
	jne .sel_end
42
 
5917 IgorA 43
	stdcall [tl_node_poi_get_info], tree2,0
1714 IgorA 44
	@@:
5917 IgorA 45
		cmp eax,0
1714 IgorA 46
		je @f
5917 IgorA 47
		mov edx,eax
48
		stdcall [tl_node_poi_get_data], tree2,edx
49
		mov esi,eax ;получаем данные узла
1714 IgorA 50
;------ добавление объекта в список -------------------------------------------
51
		mov ebx,[foc_obj]
52
		cmp ebx,esi
53
		je .add_end ;избегаем циклической ссылки
1717 IgorA 54
		mov ebx,dword[esi]
55
		cmp ebx,C_TDF
1714 IgorA 56
		je .add_beg
1717 IgorA 57
		cmp ebx,C_STR
1714 IgorA 58
		je .add_beg
59
			jmp .add_end
60
		.add_beg:
61
			stdcall get_obj_id,esi
62
			mov edi,u_object
63
			mov dword[edi],eax
64
			add edi,4
1717 IgorA 65
			add esi,u_object.txt-u_object ;переходим на имя объекта
1714 IgorA 66
			mov ecx,MAX_LEN_OBJ_TXT
67
			cld
68
			rep movsb
69
 
70
			call find_obj_in_opt ;edi = pointer to ObjOpt struct
71
			mov cx,word[edi+obj_opt.img-obj_opt]
72
			cmp cx,0
73
			jge .zero
74
				xor cx,cx ;что-бы не глючило с отрицательным индексом
75
			.zero:
76
			shl ecx,16 ;в ecx индекс иконки
77
 
5917 IgorA 78
			stdcall dword[tl_node_add], tree3,ecx,u_object ;структура u_object в данном случае не соблюдается, она нужна просто как память для вставки
1714 IgorA 79
			stdcall dword[tl_cur_next], tree3 ;переносим курсор вниз, что-бы не поменялся порядок
80
		.add_end:
81
;-------
5917 IgorA 82
		stdcall [tl_node_poi_get_next_info], tree2,edx
83
		mov edx,eax ;переходим к следущему узлу
1714 IgorA 84
		jmp @b
85
	@@:
86
 
87
	;ставим курсор на нужную позицию
88
	mov edx,[foc_obj] ;берем указатель на объект
89
	cmp edx,0
90
	je .sel_end
91
		mov edx,dword[edx+u_object.typid-u_object]
92
		stdcall [tl_cur_beg],tree3
93
		@@:
94
			stdcall [tl_node_get_data],tree3
95
			cmp eax,0
96
			je .sel_end
97
			cmp dword[eax],edx
98
			je .sel_end ;если нашли указатель
99
			stdcall [tl_cur_next],tree3
100
		jmp @b
101
	.sel_end:
102
 
103
	;чистка подписей
104
	mov dword[ch1.text],ch_text
105
	mov dword[ch2.text],ch_text
106
	mov dword[ch3.text],ch_text
107
	mov dword[ch4.text],ch_text
108
 
109
	;установка новых подписей
110
	mov esi,[foc_obj] ;берем указатель на объект
1717 IgorA 111
	mov ebx,dword[esi]
1714 IgorA 112
	call find_obj_in_opt
113
	mov edi,dword[edi+obj_opt.bit_prop-obj_opt]
114
	cmp edi,0
115
	je .no_bit_capts ;если 1-е битовое свойство пустое, то в цикл не заходим
116
	mov edx,ch1.text
117
	xor al,al ;0 - символ конца строки
118
	add edi,obj_opt
119
	@@:
120
		mov [edx],edi ;записываем текст в check_box
121
		xor ecx,ecx
122
		dec ecx ;ecx - число просматриваемых байт
123
		cld
124
		repne scasb ;ищем конец строки (al=0)
125
		cmp byte[edi],0
126
		je .no_bit_capts ;если следующей строки нет выход из цикла
127
 
128
		add edx,ch_struc_size
129
		cmp edx,check_boxes_end
130
		jl @b
131
	.no_bit_capts:
132
 
133
	;установка флажков
134
	mov esi,[foc_obj] ;берем указатель на объект
135
	mov edx,ch1.flags
136
	xor eax,eax
137
	@@:
138
		bt dword[esi+u_object.modif-u_object],eax
139
		jc .flag_set
140
			btr dword[edx],1 ;снимаем галочку
141
			jmp .end_set
142
		.flag_set:
143
			bts dword[edx],1 ;ставим галочку (ch_flag_en = 10b = 2^1)
144
		.end_set:
145
 
146
		inc eax
147
		add edx,ch_struc_size
148
		cmp edx,check_boxes_end
149
	jl @b
150
 
151
	init_checkboxes2 check_boxes,check_boxes_end
152
	check_boxes_set_sys_color2 check_boxes,check_boxes_end,sc
153
popad
154
 
155
align 4
156
prop_red_win:
157
pushad
158
	mcall 12,1
159
 
160
	xor eax,eax
161
	mov edi,hed
162
	mov edx,[foc_obj] ;берем указатель на объект
163
	cmp edx,0
164
	je @f
1717 IgorA 165
		mov ebx,dword[edx]
1714 IgorA 166
		call find_obj_in_opt
167
		add edi,obj_opt.info-obj_opt ;edi - подпись (название объекта)
168
	@@:
169
	mov ebx,30*65536+prop_wnd_width
170
	mov ecx,50*65536+250
171
	mov edx,0xffffd0
172
	or  edx,0x33000000
173
	int 0x40
174
 
175
	mov edx,[foc_obj] ;берем указатель на объект
176
	cmp edx,0
177
	je .exit_fun
178
 
179
		mov eax,8 ;кнопка для сохранения изменений
180
		mov ebx,prop_wnd_width-18-20
181
		shl ebx,16
182
		add ebx,18
183
		mov ecx,3
184
		shl ecx,16
185
		add ecx,18
186
		mov edx,10
187
		mov esi,0xd040
188
		int 0x40
189
 
190
		ror ebx,16 ;вычисляем координаты для иконки
191
		ror ecx,16
192
		and ebx,0xffff
193
		and ecx,0xffff
194
		inc ebx
195
		inc ecx
196
		stdcall draw_icon, 17,ebx,ecx ;17 - save
197
 
198
		mov edi,edit2
1717 IgorA 199
		mov ecx,[obj_count_txt_props]
200
		cld
1714 IgorA 201
		.cycle:
1717 IgorA 202
			stdcall [edit_box_draw], edi
1714 IgorA 203
			add edi,ed_struc_size
1717 IgorA 204
		loop .cycle
1714 IgorA 205
 
206
		cmp [err_ini0],1
207
		je .exit_fun
208
		cmp [err_ini1],1
209
		je .exit_fun
210
 
211
		mov edx,[foc_obj] ;берем указатель на объект
212
		xor ebx,ebx ;номер поля
213
		.draw_column:
214
			mov eax,ebx
215
			imul eax,prop_edits_height
216
			add eax,prop_edits_top
217
			stdcall draw_obj_icon,[edx],ebx,eax
218
			stdcall draw_obj_caption,[edx],ebx,eax
219
 
220
			inc ebx
221
			cmp ebx,MAX_OPT_FIELDS
222
			jl .draw_column
223
 
1717 IgorA 224
		cmp dword[edx],C_VAR
1714 IgorA 225
		jne .no_tree
226
			mov dword[w_scr_t3.all_redraw],1
227
			stdcall [tl_draw], tree3
228
		.no_tree:
229
 
230
		checkboxes_draw2 check_boxes,check_boxes_end
231
 
232
	.exit_fun:
233
	mcall 12,2
234
popad
235
 
1717 IgorA 236
;не отрывать эту функцию от предыдущей
1714 IgorA 237
align 4
238
prop_still:
239
	pushad
240
	mcall 10
241
 
242
	cmp al,1 ;изм. положение окна
243
	jz prop_red_win
244
	cmp al,2
245
	jne @f
246
		call prop_key
247
	@@:
248
	cmp al,3
249
	jz prop_button
250
	cmp al,6
251
	jne @f
252
		call prop_mouse
253
	@@:
254
	popad
255
	jmp prop_still
256
 
1717 IgorA 257
;в цикле пробегаем по всем полям со свойствами,
258
;что-бы посчитать число используемых полей
1714 IgorA 259
align 4
1717 IgorA 260
init_obj_count_txt_props:
261
pushad
262
	mov edx,[foc_obj] ;берем указатель на объект
263
	xor ebx,ebx
264
	mov edi,edit2
265
	.cycle:
266
		stdcall get_obj_text_len_col, edx,ebx ;eax - длинна поля
267
		cmp eax,1
268
		jl @f ;выход из цикла если поле не используеться
269
		inc ebx
270
 
271
		add edi,ed_struc_size
272
		cmp edi,prop_wnd_edits_end
273
		jl .cycle
274
	@@:
275
	mov [obj_count_txt_props],ebx
276
popad
277
	ret
278
 
279
;вывод текстовых подписей для полей со свойствами
280
align 4
281
proc draw_obj_caption, o_type:dword,n_col:dword, coord_y:dword
282
	pushad
283
	stdcall get_obj_text_len_col, [foc_obj], [n_col] ;eax - длинна поля
284
	cmp eax,1
285
	jl .no_draw
286
 
287
	xor ebx,ebx
288
	mov ebx,dword[o_type]
289
	call find_obj_in_opt
290
 
291
	mov edx,edi
292
	add edx,obj_opt.caption-obj_opt
293
 
294
	mov eax,[n_col]
295
	mov ebx,143 ;отступ слева
296
	shl ebx,16
297
	add ebx,dword[coord_y]
298
	add ebx,3
299
	mov ecx,0 ;text color
300
 
301
	mov esi,edx
302
	.beg_found:
303
		cmp byte[esi],0
304
		je .end_found
305
		cmp byte[esi],'*'
306
		je @f
307
		inc esi
308
		jmp .beg_found
309
	@@:
310
	cmp eax,0
311
	je .end_found
312
		dec eax
313
		inc esi
314
		mov edx,esi ;переключаем начало строки на след. подпись
315
		jmp .beg_found
316
	.end_found:
317
	cmp esi,edx
318
	jle .no_draw
319
		sub esi,edx ;esi = text len
320
		mov eax,4
321
		int 0x40
322
	.no_draw:
323
	popad
324
	ret
325
endp
326
 
327
align 4
328
proc set_obj_win_param, col:dword, edit:dword
329
	pushad
330
		stdcall get_obj_text_col, [foc_obj], [col] ;edx - text
331
		stdcall get_obj_text_len_col, [foc_obj], [col] ;eax - длинна поля
332
		mov edi,[edit]
333
		cmp eax,1
334
		jl @f
335
			dec eax
336
			mov ed_max,eax ;ed_max = edi+.max
337
			mov ed_focus_border_color, dword 0xff
338
			mov ed_blur_border_color, dword 0x808080
339
			stdcall [edit_box_set_text], edi,edx ;обновляем editbox
340
			jmp .end_f
341
		@@:
342
			mov ed_max,dword MAX_LEN_OBJ_TXT
343
			;stdcall [edit_box_set_text], edi,txt_null
344
		.end_f:
345
	popad
346
	ret
347
endp
348
 
349
align 4
1714 IgorA 350
prop_key:
1717 IgorA 351
push eax ecx edi
1714 IgorA 352
	mcall 2
353
	mov edi,edit2
1717 IgorA 354
	mov ecx,[obj_count_txt_props]
355
	cld
1714 IgorA 356
	.cycle:
357
		stdcall [edit_box_key], edi
358
		add edi,ed_struc_size
1717 IgorA 359
	loop .cycle
1714 IgorA 360
 
1717 IgorA 361
	mov edi,dword[foc_obj]
362
	cmp dword[edi],C_VAR
1714 IgorA 363
	jne @f
364
		stdcall [tl_key], tree3
365
	@@:
1717 IgorA 366
pop edi ecx eax
1714 IgorA 367
	ret
368
 
369
align 4
370
prop_mouse:
1717 IgorA 371
	push ecx edi
1714 IgorA 372
	mov edi,edit2
1717 IgorA 373
	mov ecx,[obj_count_txt_props]
374
	cld
1714 IgorA 375
	.cycle:
376
		stdcall [edit_box_mouse], edi
377
		add edi,ed_struc_size
1717 IgorA 378
	loop .cycle
1714 IgorA 379
 
1717 IgorA 380
	mov edi,dword[foc_obj]
381
	cmp dword[edi],C_VAR
1714 IgorA 382
	jne @f
383
		stdcall [tl_mouse], tree3
384
	@@:
385
 
386
	checkboxes_mouse2 check_boxes,check_boxes_end
1717 IgorA 387
	pop edi ecx
1714 IgorA 388
	ret
389
 
390
align 4
391
prop_button:
392
	mcall 17 ;получить код нажатой кнопки
393
 
394
	cmp ah,10
395
	jne @f
396
		call but_element_change
397
		mov ah,1 ;для закрытия окна
398
	@@:
399
 
400
	cmp ah,1
401
	jne prop_still
402
.exit:
403
	mov dword[tree3.data_img],0 ;чистим указатели на иконки что-бы их не удалил деструктор
404
	mov dword[tree3.data_img_sys],0 ;т. к. они еще используються в других элементах
405
	stdcall dword[tl_data_clear], tree3
406
	mov byte[prop_wnd_run],0 ;обнуляем счетчик окон
407
	mcall -1 ;выход из программы
408
 
409
;дерево с объектами в пользовательском файле
410
tree3 tree_list sizeof.object,(MAX_CED_OBJECTS shr 2)+2, tl_key_no_edit+tl_list_box_mode,\
411
	16,16, 0xffffff,0xb0d0ff,0xd000ff, 320,30,165,125, 0,4,MAX_LEN_OBJ_TXT, el_focus,\
412
	w_scr_t3,0
413
 
414
align 4
415
w_scr_t3:
416
.size_x     dw 16 ;+0
417
rb 2+2+2
418
.btn_high   dd 15 ;+8
419
.type	    dd 1  ;+12
420
.max_area   dd 100  ;+16
421
rb 4+4
422
.bckg_col   dd 0xeeeeee ;+28
423
.frnt_col   dd 0xbbddff ;+32
424
.line_col   dd 0  ;+36
425
rb 4+2+2
426
.run_x:
427
rb 2+2+2+2+4+4+4+4+4+4
428
.all_redraw dd 0 ;+80
429
.ar_offset  dd 1 ;+84
430
 
431
check_boxes:
432
ch1 check_box2 (320 shl 16+11),(160 shl 16 +11),5,0xffffff,0,0x80000000,ch_text,ch_flag_en+ch_flag_middle
433
ch2 check_box2 (320 shl 16+11),(175 shl 16 +11),5,0xffffff,0,0x80000000,ch_text,ch_flag_en+ch_flag_middle
434
ch3 check_box2 (320 shl 16+11),(190 shl 16 +11),5,0xffffff,0,0x80000000,ch_text,ch_flag_en+ch_flag_middle
435
ch4 check_box2 (320 shl 16+11),(205 shl 16 +11),5,0xffffff,0,0x80000000,ch_text,ch_flag_en+ch_flag_middle
436
check_boxes_end:
437
 
438
ch_text db 0