Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
31 halyavin 1
;
51 mikedld 2
;    UNIFORM WINDOW COLOURS & SKIN
31 halyavin 3
;
4
;    Compile with FASM for Menuet
5
;
6
;    < russian edition by Ivan Poddubny >
51 mikedld 7
;    < skin selection by Mike Semenyako >
3435 mario79 8
;******************************************************************************
9
; last update:  01/04/2013
10
; written by:   Marat Zakiyanov aka Mario79, aka Mario
11
; changes:      select colors with ColorDialog
12
;               some redesign of the look of the program
13
;******************************************************************************
1611 mario79 14
; last update:  10/09/2010
15
; written by:   Marat Zakiyanov aka Mario79, aka Mario
16
; changes:      select path with OpenDialog
31 halyavin 17
;******************************************************************************
3271 mario79 18
	use32
19
	org 0
20
	db 'MENUET01'	; identifier
21
	dd 1		; header version
22
	dd START	; start address
3435 mario79 23
	dd IM_END	; file size
24
	dd I_END	; memory
3271 mario79 25
	dd stacktop	; stack pointer
7937 leency 26
	dd app_param	; parameters
3271 mario79 27
	dd cur_dir_path	; path to file
28
 
1611 mario79 29
include 'lang.inc'
7639 leency 30
include '../../../proc32.inc'
1702 Lrz 31
include '../../../config.inc'		;for nightbuild
1611 mario79 32
include '../../../macros.inc'
7937 leency 33
include '../../../string.inc'
7639 leency 34
include '../../../dll.inc'
1611 mario79 35
include 'kglobals.inc'
36
include 'unpacker.inc'
9568 IgorA 37
include '../../../KOSfuncs.inc'
38
include '../../../load_lib.mac'
1611 mario79 39
	@use_library
31 halyavin 40
;******************************************************************************
3435 mario79 41
;--------------------------------------
51 mikedld 42
struct SKIN_HEADER
485 heavyiron 43
  ident   dd ?
44
  version dd ?
45
  params  dd ?
46
  buttons dd ?
47
  bitmaps dd ?
51 mikedld 48
ends
3435 mario79 49
;--------------------------------------
51 mikedld 50
struct SKIN_PARAMS
485 heavyiron 51
  skin_height    dd ?
52
  margin.right   dw ?
53
  margin.left    dw ?
54
  margin.bottom  dw ?
55
  margin.top     dw ?
56
  colors.inner   dd ?
57
  colors.outer   dd ?
58
  colors.frame   dd ?
59
  colors_1.inner dd ?
60
  colors_1.outer dd ?
61
  colors_1.frame dd ?
62
  dtp.size       dd ?
63
  dtp.data       db 40 dup (?)
51 mikedld 64
ends
3435 mario79 65
;--------------------------------------
51 mikedld 66
struct SKIN_BUTTONS
485 heavyiron 67
  type     dd ?
68
  pos:
69
    left   dw ?
70
    top    dw ?
71
  size:
8992 leency 72
    w  dw ?
485 heavyiron 73
    height dw ?
51 mikedld 74
ends
3435 mario79 75
;--------------------------------------
51 mikedld 76
struct SKIN_BITMAPS
485 heavyiron 77
  kind  dw ?
78
  type  dw ?
79
  _data  dd ?
51 mikedld 80
ends
3435 mario79 81
;--------------------------------------
82
frame_1:
83
  .x      = 5
8992 leency 84
  .y      = area.y + area.height + 20
85
  .w  = area.w + 217
86
  .height = 65
3435 mario79 87
;--------------------------------------
88
frame_2:
8992 leency 89
  .x      = frame_1.x
90
  .y      = frame_1.y + frame_1.height + 20
91
  .w  = frame_1.w
92
  .height = frame_1.height
1611 mario79 93
;---------------------------------------------------------------------
8992 leency 94
win:
95
  .w = frame_2.w + frame_2.x + frame_2.x + 9
96
  .h = frame_2.y + frame_2.height + 10
97
;---------------------------------------------------------------------
3271 mario79 98
START:		; start of execution
99
;---------------------------------------------------------------------
9641 IgorA 100
	mcall	SF_SYS_MISC,SSF_HEAP_INIT
1611 mario79 101
 
102
	test	eax,eax
103
	jz	close
104
 
7639 leency 105
stdcall dll.Load,LibIniImportTable
1611 mario79 106
load_libraries l_libs_start,end_l_libs
107
 
108
;if return code =-1 then exit, else nornary work
109
	inc	eax
110
	test	eax,eax
111
	jz	close
112
;---------------------------------------------------------------------
7937 leency 113
; set default pathes
7938 leency 114
	stdcall string.copy, default_skin, skin_info
115
	stdcall string.copy, default_dtp, dtp_name
1611 mario79 116
;---------------------------------------------------------------------
7937 leency 117
; check app param
118
	stdcall string.length, app_param
119
	add eax, app_param
120
	mov ecx, [eax-4]
9641 IgorA 121
	or ecx, 0x20202000 ;letters to lowercase
7937 leency 122
	cmp ecx, '.skn'
123
	je  load_skin_from_param
124
	cmp ecx, '.dtp'
9632 leency 125
	je load_dtp_from_param
126
	jmp no_param
7937 leency 127
 
128
load_dtp_from_param:
7938 leency 129
	stdcall string.copy, app_param, dtp_name
7937 leency 130
	call   load_dtp_file.1
131
	jmp    skin_path_ready
132
 
133
load_skin_from_param:
7938 leency 134
	stdcall string.copy, app_param, skin_info
7937 leency 135
	call    load_skin_file.2
136
	jmp     skin_path_ready
137
 
138
no_param:
9641 IgorA 139
	mcall	SF_STYLE_SETTINGS,SSF_GET_COLORS,color_table,4*10	; get current colors
7937 leency 140
	call	load_skin_file.2
141
 
1611 mario79 142
skin_path_ready:
143
;---------------------------------------------------------------------
144
;OpenDialog	initialisation
3271 mario79 145
	push	dword OpenDialog_data
146
	call	[OpenDialog_Init]
1611 mario79 147
 
3271 mario79 148
	push	dword OpenDialog_data2
149
	call	[OpenDialog_Init]
3435 mario79 150
;--------------------------------------------------------------------
151
;init_ColorDialog	ColorDialog_data
152
	push    dword ColorDialog_data
153
	call    [ColorDialog_Init]
154
;--------------------------------------------------------------------
1611 mario79 155
; prepare for PathShow
156
	push	dword PathShow_data_1
157
	call	[PathShow_prepare]
158
 
159
	push	dword PathShow_data_2
160
	call	[PathShow_prepare]
161
;---------------------------------------------------------------------
31 halyavin 162
red:
3271 mario79 163
	call	draw_window		; at first, draw the window
164
;---------------------------------------------------------------------
31 halyavin 165
still:
9641 IgorA 166
	mcall	SF_WAIT_EVENT
31 halyavin 167
 
3271 mario79 168
	dec	eax	; redraw request ?
169
	jz	red
3435 mario79 170
 
3271 mario79 171
	dec	eax	; key in buffer ?
172
	jz	key
3435 mario79 173
 
3271 mario79 174
	dec	eax	; button in buffer ?
175
	jz	button
31 halyavin 176
 
3271 mario79 177
	jmp	still
178
;---------------------------------------------------------------------
179
key:		; key
9641 IgorA 180
	mcall	SF_GET_KEY
3271 mario79 181
	jmp	still
182
;---------------------------------------------------------------------
183
button:		; button
9641 IgorA 184
	mcall	SF_GET_BUTTON
31 halyavin 185
 
3271 mario79 186
 	cmp	ah,12	; load file
187
 	jne	no_load
31 halyavin 188
 
7937 leency 189
	call	load_dtp_file
3271 mario79 190
	call	draw_window
191
 	jmp	still
192
;--------------------------------------
193
no_load:
194
 	cmp	ah,13	; save file
195
 	jne	no_save
31 halyavin 196
 
3271 mario79 197
	call	save_file
198
 	jmp	still
199
;--------------------------------------
200
no_save:
201
 	cmp	ah,14	; set 3d buttons
202
 	jne	no_3d
31 halyavin 203
 
9641 IgorA 204
	mcall	SF_STYLE_SETTINGS,SSF_SET_BUTTON_STYLE,1
7639 leency 205
	invoke  ini_set_int, aIni, aSectionSkn, aButtonStyle, 1
3271 mario79 206
 	jmp	doapply
207
;--------------------------------------
208
no_3d:
209
 	cmp	ah,15	; set flat buttons
210
 	jne	no_flat
31 halyavin 211
 
7639 leency 212
	invoke  ini_set_int, aIni, aSectionSkn, aButtonStyle, 0
9641 IgorA 213
	mcall	SF_STYLE_SETTINGS,SSF_SET_BUTTON_STYLE, 0
3271 mario79 214
;--------------------------------------
484 diamond 215
doapply:
9641 IgorA 216
	mcall	SF_STYLE_SETTINGS,SSF_APPLY, 0
3271 mario79 217
 	jmp	still
218
;--------------------------------------
219
no_flat:
220
 	cmp	ah,16	; apply
221
 	jne	no_apply
222
;--------------------------------------
223
apply_direct:
9641 IgorA 224
	mcall	SF_STYLE_SETTINGS,SSF_SET_COLORS,color_table,10*4
3271 mario79 225
 	jmp	doapply
226
;--------------------------------------
227
 no_apply:
228
 	cmp	ah,17	; load skin file
229
 	jne	no_load_skin
31 halyavin 230
 
3271 mario79 231
	call	load_skin_file
232
	call	draw_window
233
 	jmp	still
234
;--------------------------------------
235
no_load_skin:
236
 	cmp	ah,18	; apply skin
237
 	jne	no_apply_skin
31 halyavin 238
 
3271 mario79 239
 	cmp	[skin_info],0
240
 	je	no_apply_skin
51 mikedld 241
 
9641 IgorA 242
	mcall	SF_STYLE_SETTINGS,SSF_SET_SKIN,skin_info
3271 mario79 243
	call	draw_window
244
 	jmp	still
245
;--------------------------------------
246
no_apply_skin:
247
	cmp	ah,31
248
	jb	no_new_colour
51 mikedld 249
 
3271 mario79 250
	cmp	ah,41
251
	jg	no_new_colour
252
 
3435 mario79 253
;---------------------------------------------------------------------
254
.start_ColorDialog:
255
	push    dword ColorDialog_data
256
	call    [ColorDialog_Start]
257
; 2 - use another method/not found program
258
	cmp	[ColorDialog_data.status],2
259
	je	still
260
; 1 - OK, color selected
261
	cmp	[ColorDialog_data.status],1
262
	jne	still
263
;---------------------------------------------------------------------
264
 
3271 mario79 265
	shr	eax,8
266
	sub	eax,31
267
	shl	eax,2
3435 mario79 268
	mov	ebx,[ColorDialog_data.color]
269
	and	ebx,0xffffff	; temporary for ColorDialog!!!!!!!!!!
3271 mario79 270
	mov	[eax+color_table],ebx
271
 	cmp	dword[not_packed_area+SKIN_HEADER.ident],'SKIN'
272
 	jne	@f
31 halyavin 273
 
3271 mario79 274
	mov	edi,[not_packed_area+SKIN_HEADER.params]
275
	mov	dword[edi+not_packed_area+SKIN_PARAMS.dtp.data+eax],ebx
276
	call	draw_skin
277
;--------------------------------------
278
@@:
279
	call	draw_colours
280
 	jmp	still
281
;--------------------------------------
282
no_new_colour:
283
	cmp	ah,1	; terminate
284
	jnz	noid1
285
;--------------------------------------
1611 mario79 286
close:
3271 mario79 287
	or	eax,-1
288
	mcall
289
;--------------------------------------
290
noid1:
291
 	jmp	still
292
;---------------------------------------------------------------------
7937 leency 293
load_dtp_file:
1611 mario79 294
;---------------------------------------------------------------------
295
; invoke OpenDialog
296
	mov	[OpenDialog_data.type],dword 0
3271 mario79 297
	push	dword OpenDialog_data
298
	call	[OpenDialog_Start]
1611 mario79 299
	cmp	[OpenDialog_data.status],1
300
	je	.1
301
	ret
302
.1:
303
; prepare for PathShow
304
	push	dword PathShow_data_1
305
	call	[PathShow_prepare]
31 halyavin 306
 
1611 mario79 307
	call	draw_PathShow
308
;---------------------------------------------------------------------
7937 leency 309
.2:
3271 mario79 310
	xor	eax, eax
311
	mov	ebx, read_info
312
	mov	dword [ebx], eax	; subfunction: read
313
	mov	dword [ebx+4], eax	; offset (low dword)
314
	mov	dword [ebx+8], eax	; offset (high dword)
315
	mov	dword [ebx+12], 40     ; read colors file: 4*10 bytes
316
	mov	dword [ebx+16], color_table ; address
9641 IgorA 317
	mcall	SF_FILE
3271 mario79 318
	ret
1611 mario79 319
;---------------------------------------------------------------------
320
load_skin_file:
321
;---------------------------------------------------------------------
322
; invoke OpenDialog
3271 mario79 323
	push	dword OpenDialog_data2
324
	call	[OpenDialog_Start]
1611 mario79 325
	cmp	[OpenDialog_data2.status],1
326
	je	.1
327
	ret
328
.1:
329
; prepare for PathShow
330
	push	dword PathShow_data_2
331
	call	[PathShow_prepare]
31 halyavin 332
 
1611 mario79 333
	call	draw_PathShow
334
;---------------------------------------------------------------------
335
.2:
3271 mario79 336
	xor	eax,eax
337
	mov	ebx,read_info2
338
	mov	dword [ebx], eax	; subfunction: read
339
	mov	dword [ebx+4], eax	; offset (low dword)
340
	mov	dword [ebx+8], eax	; offset (high dword)
341
	mov	dword [ebx+12], 32*1024 ; read: max 32 KBytes
342
	mov	dword [ebx+16], file_load_area ; address
9641 IgorA 343
	mcall	SF_FILE
31 halyavin 344
 
3271 mario79 345
	mov	esi, file_load_area
179 mikedld 346
 
3271 mario79 347
	cmp	dword [esi], 'KPCK'
348
	jnz	notpacked
31 halyavin 349
 
3271 mario79 350
	cmp	dword [esi+4], 32*1024 ; max 32 KBytes
351
	ja	doret
51 mikedld 352
 
3271 mario79 353
	push	unpack_area
354
	push	esi
355
	call	unpack
356
	mov	esi,unpack_area
357
;--------------------------------------
358
notpacked:
359
 	cmp	[esi+SKIN_HEADER.ident],dword 'SKIN'
360
 	jne	doret
51 mikedld 361
 
3271 mario79 362
	mov	edi,not_packed_area
363
	mov	ecx,0x8000/4
364
	rep	movsd
51 mikedld 365
 
3271 mario79 366
	mov	ebp,not_packed_area
367
	mov	esi,[ebp+SKIN_HEADER.params]
368
	add	esi,ebp
369
	lea	esi,[esi+SKIN_PARAMS.dtp.data]
370
	mov	edi,color_table
371
	mov	ecx,10
372
	rep	movsd
373
;--------------------------------------
374
doret:
375
	ret
1611 mario79 376
;---------------------------------------------------------------------
377
save_file:
378
;---------------------------------------------------------------------
379
; invoke OpenDialog
380
	mov	[OpenDialog_data.type],dword 1
3271 mario79 381
	push	dword OpenDialog_data
382
	call	[OpenDialog_Start]
1611 mario79 383
	cmp	[OpenDialog_data.status],1
384
	je	.1
385
	ret
386
.1:
387
; prepare for PathShow
388
	push	dword PathShow_data_1
389
	call	[PathShow_prepare]
31 halyavin 390
 
1611 mario79 391
	call	draw_PathShow
392
;---------------------------------------------------------------------
3271 mario79 393
	xor	eax,eax
394
	mov	ebx,write_info
395
	mov	[ebx],dword 2			; subfunction: write
396
	and	[ebx+4],eax			; (reserved)
397
	and	[ebx+8],eax			; (reserved)
398
	mov	[ebx+12],dword 10*4		; bytes to write
399
	mov	[ebx+16],dword color_table	; address
9641 IgorA 400
	mcall	SF_FILE
3271 mario79 401
	ret
1611 mario79 402
;---------------------------------------------------------------------
3435 mario79 403
draw_button_row:
8992 leency 404
	mov	edx,0x40000000 + 31		; BUTTON ROW
405
	mov	ebx,(area.w+18)*65536+29
406
	mov	ecx,9*65536+15
3435 mario79 407
	mov	eax,8
408
;-----------------------------------
409
.newb:
410
	mcall
8992 leency 411
	add	ecx,22*65536
3435 mario79 412
	inc	edx
8992 leency 413
	cmp	edx,0x40000000 + 40
3435 mario79 414
	jbe	.newb
3271 mario79 415
	ret
3435 mario79 416
;---------------------------------------------------------------------
417
draw_button_row_of_texts:
8992 leency 418
	mov	ebx,(area.w+49)*65536+9	; ROW OF TEXTS
3435 mario79 419
	mov	ecx,[w_work_text]
8992 leency 420
	add ecx,0x10000000
3435 mario79 421
	mov	edx,text
422
	mov	esi,32
423
	mov	eax,4
424
;-----------------------------------
425
.newline:
426
	mcall
8992 leency 427
	add	ebx,22
3435 mario79 428
	add	edx,32
429
	cmp	[edx],byte 'x'
430
	jne	.newline
431
	ret
432
;---------------------------------------------------------------------
31 halyavin 433
draw_colours:
3271 mario79 434
	pusha
435
	mov	esi,color_table
8992 leency 436
	mov	ebx,(area.w+19)*65536+28
3435 mario79 437
	mov	ecx,10*65536+14
438
	mov	eax,13
3472 mario79 439
	mov	[frame_data.draw_text_flag],dword 0
3271 mario79 440
;--------------------------------------
441
newcol:
442
	mov	edx,[esi]
3435 mario79 443
	mcall
3472 mario79 444
 
445
	push	ebx ecx
446
 
447
	sub	ebx,2 shl 16
448
	add	bx,4
449
	sub	ecx,2 shl 16
450
	add	cx,4
451
 
452
	mov	[frame_data.x],ebx
453
	mov	[frame_data.y],ecx
454
 
455
	push	dword frame_data
456
	call	[Frame_draw]
457
 
458
	pop	ecx ebx
459
 
8992 leency 460
	add	ecx,22*65536
3271 mario79 461
	add	esi,4
3435 mario79 462
	cmp	esi,color_table+4*9
3271 mario79 463
	jbe	newcol
31 halyavin 464
 
3271 mario79 465
	popa
466
	ret
2068 mario79 467
;----------------------------------------------------------------------
1611 mario79 468
draw_PathShow:
469
	pusha
9641 IgorA 470
	mcall	SF_DRAW_RECT,,,0xffffff
471
	mcall	SF_DRAW_RECT,,,0xffffff
1611 mario79 472
; draw for PathShow
473
	push	dword PathShow_data_1
474
	call	[PathShow_draw]
475
 
476
	push	dword PathShow_data_2
477
	call	[PathShow_draw]
478
	popa
479
	ret
480
;---------------------------------------------------------------------
31 halyavin 481
;   *********************************************
482
;   *******  WINDOW DEFINITIONS AND DRAW ********
483
;   *********************************************
484
draw_window:
9641 IgorA 485
	mcall	SF_REDRAW,SSF_BEGIN_DRAW
486
	mcall	SF_STYLE_SETTINGS,SSF_GET_COLORS,app_colours,10*4
487
	mcall	SF_GET_SCREEN_SIZE
488
	mcall	SF_STYLE_SETTINGS,SSF_GET_SKIN_HEIGHT
3435 mario79 489
	mov	[current_skin_high],eax
2068 mario79 490
; DRAW WINDOW
491
	xor	eax,eax		; function 0 : define and draw window
492
	xor	esi,esi
493
	mov	edx,[w_work]	; color of work area RRGGBB,8->color
3435 mario79 494
	or	edx,0x34000000
8992 leency 495
	mov	ecx,50 shl 16 + win.h
3435 mario79 496
	add	ecx,[current_skin_high]
8992 leency 497
	mcall	,<110, win.w>,,,,title
31 halyavin 498
 
9641 IgorA 499
	mcall	SF_THREAD_INFO,procinfo,-1
2068 mario79 500
 
501
	mov	eax,[procinfo+70] ;status of window
502
	test	eax,100b
503
	jne	.end
3271 mario79 504
 
3435 mario79 505
;if lang eq ru
51 mikedld 506
  load_w  = (5*2+6*9)
507
  save_w  = (5*2+6*9)
508
  flat_w  = (5*2+6*7)
509
  apply_w = (5*2+6*9)
3435 mario79 510
;else
511
;  load_w  = (5*2+6*6)
512
;  save_w  = (5*2+6*8)
513
;  flat_w  = (5*2+6*4)
514
;  apply_w = (5*2+6*7)
515
;end if
516
;-----------------------------------
517
; select color DTP frame
518
; LOAD BUTTON	; button 12
9641 IgorA 519
	mcall	SF_DEFINE_BUTTON,,,12,[w_work_button]
2068 mario79 520
; SAVE BUTTON
521
	add	ebx,(load_w+2)*65536-load_w+save_w
522
	inc	edx
3435 mario79 523
	mcall		; button 13
524
; APPLY BUTTON
8992 leency 525
	mov	ebx,(frame_1.x + frame_1.w - apply_w - 15)*65536+apply_w
9641 IgorA 526
	mcall	SF_DEFINE_BUTTON,,,16	; button 17
3435 mario79 527
; select color DTP button text
9641 IgorA 528
	mcall	SF_DRAW_TEXT,,[w_work_button_text],t1,t1.size
3435 mario79 529
;-----------------------------------
530
; select skin frame
531
; LOAD SKIN BUTTON	; button 17
9641 IgorA 532
	mcall	SF_DEFINE_BUTTON,,,17,[w_work_button]
2068 mario79 533
; 3D
3435 mario79 534
	mov	ebx,(frame_2.x+155)*65536+34
535
	mcall	,,,14	; button 14
2068 mario79 536
; FLAT
3435 mario79 537
	add	ebx,36*65536-34+flat_w
2068 mario79 538
	inc	edx
3435 mario79 539
	mcall		; button 15
2068 mario79 540
; APPLY SKIN BUTTON
8992 leency 541
	mov	ebx,(frame_2.x + frame_2.w - apply_w -15)*65536+apply_w
3435 mario79 542
	mcall	,,,18		; button 18
543
; select skin button text
9641 IgorA 544
	mcall	SF_DRAW_TEXT,,[w_work_button_text],t2,t2.size
3435 mario79 545
;-----------------------------------
546
	call	draw_button_row
547
	call	draw_button_row_of_texts
548
	call	draw_colours
2068 mario79 549
;-----------------------------------
8992 leency 550
	mov	[frame_data.x],dword frame_1.x shl 16+frame_1.w
3472 mario79 551
	mov	[frame_data.y],dword frame_1.y shl 16+frame_1.height
552
	mov	[frame_data.text_pointer],dword select_dtp_text
553
	mov	eax,[w_work]
554
	mov	[frame_data.font_backgr_color],eax
555
	mov	eax,[w_work_text]
556
	mov	[frame_data.font_color],eax
557
	mov	[frame_data.draw_text_flag],dword 1
558
 
559
	push	dword frame_data
560
	call	[Frame_draw]
561
;-----------------------------------
8992 leency 562
	mov	[frame_data.x],dword frame_2.x shl 16+frame_2.w
3472 mario79 563
	mov	[frame_data.y],dword frame_2.y shl 16+frame_2.height
564
	mov	[frame_data.text_pointer],dword select_skin_text
31 halyavin 565
 
3472 mario79 566
	push	dword frame_data
567
	call	[Frame_draw]
2068 mario79 568
;-----------------------------------
3435 mario79 569
	call	draw_PathShow
570
;-----------------------------------
2068 mario79 571
	cmp	dword[not_packed_area+SKIN_HEADER.ident],'SKIN'
572
	jne	@f
573
	call	draw_skin
574
@@:
575
.end:
9641 IgorA 576
	mcall	SF_REDRAW,SSF_END_DRAW
2068 mario79 577
	ret
3435 mario79 578
;-----------------------------------------------------------------------------
579
include 'drawskin.inc'
580
;-----------------------------------------------------------------------------
31 halyavin 581
; DATA AREA
3435 mario79 582
;-----------------------------------------------------------------------------
583
include 'idata.inc'
584
;-----------------------------------------------------------------------------
585
IM_END:
586
;-----------------------------------------------------------------------------
587
include 'udata.inc'
588
;-----------------------------------------------------------------------------
31 halyavin 589
I_END:
3435 mario79 590
;-----------------------------------------------------------------------------