Subversion Repositories Kolibri OS

Rev

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

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