Subversion Repositories Kolibri OS

Rev

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