Subversion Repositories Kolibri OS

Rev

Rev 1711 | Rev 1715 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1698 IgorA 1
 
1706 IgorA 2
align 4
1705 IgorA 3
but_obj_move_up:
4
	stdcall [tl_node_move_up], tree2
5
	ret
6
7
 
1706 IgorA 8
align 4
1705 IgorA 9
but_obj_move_down:
10
	stdcall [tl_node_move_down], tree2
11
	ret
12
13
 
1706 IgorA 14
align 4
15
but_obj_copy:
16
push ecx esi edi
17
	stdcall [tl_node_get_data], tree2
18
	pop esi
19
	mov edi,[tree2.data_info] ;данные 0-го узла, используем для копирования
20
	xor ecx,ecx
21
	mov cx,word[tree2.info_size]
22
	cld
23
	rep movsb
24
pop edi esi ecx
25
	ret
26
27
 
28
align 4
29
but_obj_paste:
30
push eax ebx ecx edi
31
		mov eax,[tree2.data_info] ;данные 0-го узла, используем для копирования
32
		mov bl,byte[eax]
33
		call find_obj_in_opt
34
		xor ecx,ecx
35
		mov cx,word[edi+obj_opt.img-obj_opt] ;cx - индекс главной иконки добавляемого объекта
36
		shl ecx,16
37
		stdcall [tl_node_add], eax, ecx, tree2 ;добавляем объект
38
		stdcall [tl_draw], tree2
39
pop edi ecx ebx eax
40
	ret
41
42
 
1698 IgorA 43
;функция обратная к данной on_file_object_select
44
align 4
45
but_element_change:
46
	;foc_obj - указатель на последний выбранный узел в tree2
47
	cmp dword[foc_obj],0
48
	je .err_obj
1714 IgorA 49
		pushad
1698 IgorA 50
		;установка текстовых свойств
1714 IgorA 51
		xor ebx,ebx
1711 IgorA 52
		mov edi,edit2
53
		@@:
1714 IgorA 54
			call get_obj_win_param
1711 IgorA 55
			inc ebx
56
			add edi,ed_struc_size
57
			cmp edi,prop_wnd_edits_end
58
		jl @b
1714 IgorA 59
60
 
61
		mov edx,dword[foc_obj]
62
		mov dword[edx+u_object.typid-u_object],0 ;на случай если ничего не выбрано
63
		stdcall [tl_node_get_data],tree3
64
		pop eax
65
		cmp eax,0
66
		je @f
67
			mov eax,dword[eax] ;берем порядковый номер (в памяти) выбранного объекта
68
			mov dword[edx+u_object.typid-u_object],eax
69
		@@:
70
71
 
72
		mov edi,ch1.flags
73
		mov eax,1
74
		xor ebx,ebx
75
		@@:
76
			bt dword[edi],1 ;почему оно тут не работает я не знаю ... ???
77
			jnc .opt_no_sel
78
				or ebx,eax ;накопление отмеченных опций
79
			.opt_no_sel:
80
			shl eax,1
81
			add edi,ch_struc_size
82
			cmp edi,check_boxes_end
83
		jl @b
84
		mov dword[edx+u_object.modif-u_object],ebx
85
		popad
1698 IgorA 86
	.err_obj:
1714 IgorA 87
	call draw_constructor ;обновляем окно конструктора
1698 IgorA 88
	;call draw_window
1714 IgorA 89
	ret
1698 IgorA 90
91
 
1711 IgorA 92
; ebx - property column
93
; edi - pointer to property editbox
94
align 4
1698 IgorA 95
get_obj_win_param:
1711 IgorA 96
	pushad
97
		mov esi,ed_text
98
		stdcall get_obj_text_col, [foc_obj], ebx ;edx - смещение для текста
99
		stdcall get_obj_text_len_col, [foc_obj], ebx ;eax - длинна поля
100
		cld
1698 IgorA 101
		mov edi,edx
102
		mov ecx,eax
103
		rep movsb
104
	popad
1711 IgorA 105
	ret
1698 IgorA 106
107
 
108
;  obj - pointer to object
109
;  ind - column index
110
;output:
111
;  edx + offset
112
;  edx = 0 if not text
113
align 4
114
proc get_obj_text_col, obj:dword, ind:dword
115
	mov edx,dword[obj]
116
	inc edx ;goto text
117
push ebx
118
	mov ebx,dword[ind]
119
	cmp bx,0
120
	je .end_fun
121
122
 
123
	mov bl,byte[edx-1] ;в bl попадает код объекта
124
125
 
126
	call find_obj_in_opt ;ищем структуру с опциями объекта
127
128
 
129
	dec bh
130
	and ebx,0xff00
131
	shr ebx,7 ;сдвигаем на 7, т.к. нужно значение bh умноженное на 2
132
	add edi,ebx ;+ бывшее bh*2
133
	xor ecx,ecx
134
	mov cx,word[edi] ;ecx - сдиг для искомого поля
135
	add edx,ecx
136
137
 
138
	jg @f
139
		mov edx,0 ;not text
140
	@@:
141
	cmp cx,MAX_LEN_OBJ_TXT
142
	jl @f
143
		mov edx,0 ;not text
144
	@@:
145
146
 
147
	.end_fun:
148
pop ebx
149
	ret
150
endp
151
152
 
153
;  obj - указатель на объект
154
;  ind - номер поля внутри объекта
155
;output:
156
;  eax - длинна текстового поля внутри объекта
157
align 4
158
proc get_obj_text_len_col, obj:dword, ind:dword
159
	xor eax,eax
160
push ebx
161
	mov ebx,dword[ind]
162
	shl ebx,8 ;в bh попадает номер искомой колонки
163
	mov eax,dword[obj]
164
	mov bl,byte[eax] ;в bl попадает код объекта
165
	xor eax,eax
166
167
 
168
	call find_obj_in_opt ;ищем структуру с опциями объекта
169
170
 
171
	and ebx,0xff00
172
	shr ebx,7 ;сдвигаем на 7, т.к. нужно значение bh умноженное на 2
173
	add edi,ebx ;+ бывшее bh*2
174
175
 
176
	cmp ax,0
177
	jg @f
178
		mov eax,MAX_LEN_OBJ_TXT ;последние поля для удобства кодируются 0, а не MAX_LEN_OBJ_TXT, исправляем ситуацию
179
	@@:
180
	cmp dword[ind],0
181
	je .end_fun ;для первого поля сдиг = 0, потому в структуре он не хранится, т.к. известен заранее
182
	sub ax,word[edi-2] ;отнимаем сдиг для искомого поля, получаем длинну поля
183
184
 
185
	jg @f
186
		mov eax,0 ;поле пустое, не используется
187
	@@:
188
	cmp ax,MAX_LEN_OBJ_TXT
189
	jl @f
190
		mov eax,0 ;not text
191
	@@:
192
193
 
194
	.end_fun:
195
pop ebx
196
	ret
197
endp
198
199
 
200
proc draw_obj_icon, o_type:dword,n_col:dword, coord_y:dword
1714 IgorA 201
	pushad
1698 IgorA 202
	xor ebx,ebx
203
	mov bl,byte[o_type]
204
	call find_obj_in_opt
205
206
 
207
	mov ebx,[n_col]
208
	shl ebx,1
209
	add edi,ebx ;move index (+bh)
210
	xor ecx,ecx
211
	mov cx,[edi]
212
213
 
214
	jge @f
215
		jmp .end_fun ;error icon index
216
	@@:
217
218
 
219
	imul ecx,0x300
220
	add ebx,ecx
221
222
 
223
	mov ecx,0x100010 ;ecx - size:16*16
224
	mov edx,3 ;отступ от левого края рамки до иконки
1714 IgorA 225
	shl edx,16
1698 IgorA 226
	add edx,[coord_y]
227
	int 0x40
228
	.end_fun:
229
	popad
230
	ret
231
endp
232
233
 
1714 IgorA 234
align 4
1698 IgorA 235
proc draw_obj_caption, o_type:dword,n_col:dword, coord_y:dword
1714 IgorA 236
	pushad
237
	stdcall get_obj_text_len_col, [foc_obj], [n_col] ;eax - длинна поля
238
	cmp eax,1
239
	jl .no_draw
240
241
 
242
	mov bl,byte[o_type]
243
	call find_obj_in_opt
244
245
 
246
	add edx,obj_opt.caption-obj_opt
247
248
 
249
	mov ebx,150
250
	shl ebx,16
251
	add ebx,dword[coord_y]
252
	add ebx,3
253
	mov ecx,0 ;text color
254
255
 
256
	.beg_found:
257
		cmp byte[esi],0
258
		je .end_found
259
		cmp byte[esi],'*'
260
		je @f
261
		inc esi
262
		jmp .beg_found
263
	@@:
264
	cmp eax,0
265
	je .end_found
266
		dec eax
267
		inc esi
268
		mov edx,esi ;переключаем начало строки на след. подпись
269
		jmp .beg_found
270
	.end_found:
271
	cmp esi,edx
272
	jle .no_draw
273
		sub esi,edx ;esi = text len
274
		mov eax,4
275
		int 0x40
276
	.no_draw:
277
	popad
278
	ret
279
endp
280
281
 
282
proc draw_icon, ind:dword,coord_x:dword,coord_y:dword
1698 IgorA 283
	pushad
284
	mov ecx,[ind]
285
	cmp ecx,0
286
	jl .end_fun
287
		mov ebx,bmp_icon
288
		imul ecx,0x300
289
		add ebx,ecx
290
291
 
292
		mov ecx,0x100010 ;ecx - size:16*16
293
		mov edx,[coord_x]
294
		shl edx,16
295
		add edx,[coord_y]
296
		int 0x40
297
	.end_fun:
298
	popad
299
	ret
300
endp
301
302
 
303
;  bl = cod object
304
;output:
305
;  edi = pointer to option struct
306
align 4
307
find_obj_in_opt:
308
	push ecx
309
	xor ecx,ecx ;find 'bl' in options
310
	mov edi,obj_opt
311
	@@:
312
		cmp bl,[edi] ;find
313
		je @f
314
		inc ecx
315
		cmp ecx,MAX_OBJ_TYPES
316
		je @f ;not find
317
		add edi,sizeof.ObjOpt
318
		jmp @b
319
	@@:
320
	pop ecx
321
	ret
322
323
 
324
 
325
	;нужен для ускорения последущего поиска
326
327
 
328
;eax - указатель на структуру найденного объекта
329
align 4
330
proc find_obj_in_file, o_type:dword
331
push ebx esi
332
	mov ebx,[o_type]
333
	stdcall dword[tl_node_poi_get_info], 0,tree2
334
	pop esi
335
336
 
337
		cmp esi,0
338
		je .find_no
339
340
 
341
		pop eax ;получаем данные узла
342
		cmp eax,0
343
		je .find_no
344
345
 
346
		je .find_yes
347
348
 
349
		pop esi ;переходим к следущему узлу
350
351
 
352
353
 
354
		mov dword[obj_find_last],esi
355
		jmp @f
356
	.find_no:
357
		mov dword[obj_find_last],0
358
		xor eax,eax
359
	@@:
360
pop esi ebx
361
	ret
362
endp
363
364
 
365
;eax - указатель на структуру найденного объекта
366
align 4
367
proc find_obj_in_file_next, o_type:dword
368
push ebx esi
369
	cmp dword[obj_find_last],0
370
	je .find_no
371
372
 
373
374
 
375
	pop esi ;переходим к следущему узлу
376
377
 
378
		cmp esi,0
379
		je .find_no
380
381
 
382
		pop eax ;получаем данные узла
383
		cmp eax,0
384
		je .find_no
385
386
 
387
		je .find_yes
388
389
 
390
		pop esi ;переходим к следущему узлу
391
392
 
393
394
 
395
		mov dword[obj_find_last],esi
396
		jmp @f
397
	.find_no:
398
		mov dword[obj_find_last],0
399
		xor eax,eax
400
	@@:
401
pop esi ebx
402
	ret
403
endp
404
405
 
406
but_show_constructor:
407
	mov byte[show_mode],0
408
	stdcall [buf2d_draw], buf_fon
409
	ret
410
411
 
412
but_show_code:
413
	mov byte[show_mode],1
414
	stdcall [ted_draw], tedit0
415
	ret
416
417
 
418
; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
419
;output:
420
; eax - число
421
align 4
422
proc conv_str_to_int, buf:dword
423
	xor eax,eax
424
	push ebx esi
425
	xor ebx,ebx
426
	mov esi,[buf]
427
	cmp word[esi],'0x'
428
	je .load_digit_16
429
430
 
431
		mov bl,byte[esi]
432
		cmp bl,'0'
433
		jl @f
434
		cmp bl,'9'
435
		jg @f
436
			sub bl,'0'
437
			imul eax,10
438
			add eax,ebx
439
			inc esi
440
			jmp .load_digit_10
441
	jmp @f
442
443
 
444
		add esi,2
445
	.cycle_16:
446
		mov bl,byte[esi]
447
		cmp bl,'0'
448
		jl @f
449
		cmp bl,'f'
450
		jg @f
451
		cmp bl,'9'
452
		jle .us1
453
			cmp bl,'A'
454
			jl @f ;отсеиваем символы >'9' и <'A'
455
		.us1: ;составное условие
456
		cmp bl,'F'
457
		jle .us2
458
			cmp bl,'a'
459
			jl @f ;отсеиваем символы >'F' и <'a'
460
			sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
461
		.us2: ;составное условие
462
			sub bl,'0'
463
			cmp bl,9
464
			jle .cor1
465
				sub bl,7 ;convert 'A' to '10'
466
			.cor1:
467
			shl eax,4
468
			add eax,ebx
469
			inc esi
470
			jmp .cycle_16
471
	@@:
472
473
 
474
	ret
475
endp
476
>