
	pro cont_setting_event,ev

common cont_setting,ID,data

WIDGET_CONTROL,ev.id,GET_UVALUE = uv,/hour

x=findgen(Data.Nlevels+2)/(Data.Nlevels+1)

	CASE uv OF

"DONE":		begin
close,/al

if ID.group_leader ne 0L then if WIDGET_INFO(ID.group_leader,/valid) then $
	WIDGET_CONTROL,ID.group_leader,/show

WIDGET_CONTROL,ev.top,/DESTROY

ID=0
		end

"OS":	spawn
"NC":	spawn,'NC'
"VC":	spawn,'VC'

"Save":		begin
	name=pickfile(tit='Please select a file for saving levels',filt='*.lev')
	if name eq '' then return
	widget_control,/hour
	openw,lun,name,/get
	for j=0,n_elements(Data.Levels)-1 do printf,lun,(Data.levels)(j)
	free_lun,lun
		end

"Load":		begin
	name=pickfile(tit='Please select a file for reading levels',filt='*.lev')
	if name eq '' then return
	Data.Mode='custom'
	widget_control,/hour
	openr,lun,name,/get
Read_array=fltarr(50)
Read_string=''
	j=0
		while not eof(lun) do begin
	readf,lun,Read_string
Read_array(j)=Read_string
	j=j+1
		endwhile
	free_lun,lun

data={array:data.array, nlevels:j, levels:Read_array(0:j-1), $
	upper:Data.upper, lower:Data.lower,  show:Data.show,	$
	mode:Data.mode, max:Data.max, min:Data.min, Labels:Data.Labels}

widget_control,ID.Nlevels,set_val=string(j,format='(i2)')


		end

"Nlevels":	begin
widget_control,ev.id,get_val=text
text=text(where(text))
Data.Nlevels=text(0) < 29 > 1
widget_control,ID.Nlevels,set_val=string(Data.nlevels,format='(i2)')

		end

"lin":	Data.Mode="lin"
"sin":	Data.Mode="sin"
"asin":	Data.Mode="asin"
"exp":	Data.Mode="exp"
"log":	Data.Mode="log"

"Upper":	begin
widget_control,ev.id,get_val=text
	text=text(where(text))
Data.Upper=strmid(text(0),7,10) < Data.max
widget_control,ID.Upper,set_val=	$
	strcompress(string(Data.Upper,format="('Upper = ',g11.3)"))
		end

"Lower":	begin
widget_control,ev.id,get_val=text
	text=text(where(text))
Data.Lower=strmid(text(0),7,10) > Data.min
widget_control,ID.Lower,set_val=	$
	strcompress(string(Data.Lower,format="('Lower = ',g11.3)"))
		end

"Levels":	begin
	Data.Mode='custom'
widget_control,ev.id,get_val=text

	text=strcompress(text,/remove_all)
	text=text(where(text))
	text=text(sort(float(text))) > Data.min < Data.max
	text=text(uniq(text))

text=string(text,format='(g11.3)')

data={array:data.array, nlevels:n_elements(text), levels:text, $
	upper:Data.upper, lower:Data.lower,  show:Data.show,	$
	mode:Data.mode, max:Data.max, min:Data.min, Labels:Data.Labels}

widget_control,ID.Nlevels,set_val=string(n_elements(text),format='(i2)')

		end

"Show":		Data.Show=ev.select
"Labels":		Data.Labels=ev.select


ELSE:
	ENDCASE

Dont_plot=(uv eq 'DONE') or (uv eq 'OS') or (uv eq 'VC') or (uv eq 'NC') or $
	(uv eq 'Calculator') or (uv eq 'Xloadct') or (uv eq 'Help') or $
	(uv eq 'Save')


	IF not Dont_plot THEN BEGIN

x=findgen(Data.Nlevels+2)/(Data.Nlevels+1)

	CASE Data.Mode OF

"lin":	Argument=x
"sin":	Argument=0.5*(1+sin((x-0.5)*!pi))
"asin":	Argument=0.5+asin(2*x-1)/!pi
"exp":	Argument=(exp(x)-1)/(exp(1)-1)
"log":	Argument=alog(x+1)/alog(2)

ELSE:
	ENDCASE

	if Data.Mode ne "custom" then begin
levels0=Argument*(Data.upper-Data.lower)+Data.lower
levels=levels0(1:Data.Nlevels)
	endif else begin
levels=Data.levels
levels0=[Data.min,Data.levels,Data.max]
	endelse

data={array:Data.array, nlevels:Data.nlevels, levels:levels, upper:Data.upper, $
	lower:Data.lower, mode:Data.mode, max:Data.max, min:Data.min, $
	Show:Data.show, Labels:Data.Labels}

widget_control,ID.Levels,set_val=strtrim(string(Data.Levels,format='(g11.3)'),2)

wset,ID.Win(0)

plot,levels0,xtickl=-0.02,ytickl=-0.02,xran=[0,Data.Nlevels+1],/xst, $
	yran=[Data.min,Data.max],/yst

for j=0,Data.Nlevels-1 do plots,[0,Data.Nlevels+1],[1.,1.]*levels(j),col=!p.color,/noc

if Data.show then begin
wset,ID.Win(1)
contour,data.array,levels=data.levels,/xst,/yst,fol=Data.Labels,xtickl=-0.02, $
	ytickl=-0.02
endif

empty


	ENDIF



	end

	pro cont_setting,array,levels=levels, follow=follow, $
	group_leader=group_leader

;	Performs interactive pre-definition of contour levels
;	for CONTOUR representation of an array.


common cont_setting,ID,data


	if (size(array))(0) ne 2 then begin
print,'Incorrect input argument. Bye'
return
	endif

maxval=max(array,min=minval)

if n_elements(group_leader) le 0 then group_leader=0L

ID={Draw:[0L,0L], Win:[0L,0L], Nlevels:0L, Levels:0L, Upper:0L, Lower:0L, $
	Show:0L, Labels:0L, group_leader:group_leader}

!x.margin=[10,3]
!y.margin=[4,3]

MainBase=widget_base(/colu,tit='Contour levels setting')

XPdMenu,	['"DONE"	DONE',	$
		'"File"		{',	$
				'"Load"	Load',		$
				'"Save"	Save',		$
							'}',	$
		'"Shell"	{',	$
						'"OS"	OS',	$
						'"NC"	NC',	$
						'"VC"	VC',	$
							'}'], MainBase

Plain_Base=widget_base(MainBase,/row)

LeftBase=widget_base(Plain_Base,/colu)
RightBase=widget_base(Plain_Base,/colu)

label=widget_label(LeftBase,val=strcompress(string(maxval,minval, $
	format="('Max = ',g11.3,';  Min = ',g11.3)")))

bitmap_sin = 	[		$
		[000B, 000B],	$
		[000B, 032B],	$
		[000B, 024B],	$
		[000B, 004B],	$
		[000B, 002B],	$
		[000B, 001B],	$
		[000B, 001B],	$
		[128B, 000B],	$
		[128B, 000B],	$
		[064B, 000B],	$
		[064B, 000B],	$
		[032B, 000B],	$
		[016B, 000B],	$
		[012B, 000B],	$
		[002B, 000B],	$
		[000B, 000B]	$
		]

bitmap_lin = 	[		$
		[000B, 000B],	$
		[000B, 064B],	$
		[000B, 032B],	$
		[000B, 016B],	$
		[000B, 008B],	$
		[000B, 004B],	$
		[000B, 002B],	$
		[000B, 001B],	$
		[128B, 000B],	$
		[064B, 000B],	$
		[032B, 000B],	$
		[016B, 000B],	$
		[008B, 000B],	$
		[004B, 000B],	$
		[002B, 000B],	$
		[000B, 000B]	$
		]

bitmap_asin = 	[		$
		[000B, 000B],	$
		[000B, 064B],	$
		[000B, 064B],	$
		[000B, 032B],	$
		[000B, 016B],	$
		[000B, 008B],	$
		[000B, 006B],	$
		[128B, 001B],	$
		[064B, 000B],	$
		[032B, 000B],	$
		[016B, 000B],	$
		[008B, 000B],	$
		[008B, 000B],	$
		[004B, 000B],	$
		[004B, 000B],	$
		[000B, 000B]	$
		]

bitmap_exp = 	[		$
		[000B, 000B],	$
		[000B, 016B],	$
		[000B, 016B],	$
		[000B, 016B],	$
		[000B, 016B],	$
		[000B, 008B],	$
		[000B, 008B],	$
		[000B, 008B],	$
		[000B, 004B],	$
		[000B, 004B],	$
		[000B, 002B],	$
		[000B, 001B],	$
		[128B, 000B],	$
		[096B, 000B],	$
		[030B, 000B],	$
		[000B, 000B]	$
		]

bitmap_log = 	[		$
		[000B, 000B],	$
		[000B, 000B],	$
		[000B, 112B],	$
		[000B, 014B],	$
		[128B, 001B],	$
		[064B, 000B],	$
		[032B, 000B],	$
		[016B, 000B],	$
		[008B, 000B],	$
		[008B, 000B],	$
		[004B, 000B],	$
		[004B, 000B],	$
		[002B, 000B],	$
		[002B, 000B],	$
		[002B, 000B],	$
		[000B, 000B]	$
		]

button_base=widget_base(LeftBase,/row,/frame)

label=widget_label(button_base,val=' Shape: ')

button_lin=widget_button(button_base,val=bitmap_lin,uval='lin')
button_sin=widget_button(button_base,val=bitmap_sin,uval='sin')
button_asin=widget_button(button_base,val=bitmap_asin,uval='asin')
button_exp=widget_button(button_base,val=bitmap_exp,uval='exp')
button_log=widget_button(button_base,val=bitmap_log,uval='log')

label=widget_label(button_base,val=' Number: ')

; ************* Initial data

if n_elements(follow) le 0 then follow=0

	if n_elements(levels) le 0 then begin
nlevels=15
x=findgen(Nlevels+2)/(Nlevels+1)
Argument=x
levels0=Argument*(maxval-minval)+minval
levels=levels0(1:Nlevels)
mode='lin'
	endif else begin
mode='custom'
nlevels=n_elements(levels)
	endelse

data={array:array, nlevels:nlevels, levels:levels, upper:maxval, lower:minval,	$
	mode:mode, max:maxval, min:minval, Show:0, Labels:follow}

ID.Nlevels=widget_text(button_base,/edit,ysiz=1,uval='Nlevels', $
	val=string(Data.nlevels,format='(i2)'),xsiz=5)

level_base=widget_base(LeftBase,/row,/frame)

temp=widget_label(level_base,val='Levels: ')

limit_base=widget_base(Level_Base,/colu)

ID.Upper=widget_text(limit_base,/edit,ysiz=1,uval='Upper', $
val=strcompress(string(maxval,format="('Upper = ',g11.3)")),/frame)

ID.Lower=widget_text(limit_base,/edit,ysiz=1,uval='Lower', $
val=strcompress(string(minval,format="('Lower = ',g11.3)")),/frame)

ID.Levels=widget_text(level_base,/edit,/scroll,uval='Levels', $
	 ysiz=2,/fra,xsiz=12,val=strtrim(string(Data.Levels,format='(g11.3)'),2))

device,get_scr=scr

ID.Draw(0)=widget_draw(Leftbase,xsi=scr(1)*0.6,ysi=scr(1)*0.6,/fra)

Showbase=widget_base(Rightbase,/row,/nonexcl)
ID.Labels=widget_button(Showbase,val='Annotation',uval='Labels')

Showbase=widget_base(Rightbase,/row,/nonexcl)
ID.Show=widget_button(Showbase,val='Show effect',uval='Show')


ID.Draw(1)=widget_draw(Rightbase,xsi=scr(1)*0.6,ysi=scr(1)*0.6)

widget_control,MainBase,/realize,/hour

	for j=0,1 do begin
WIDGET_CONTROL,ID.Draw(j),GET_VALUE=temp
ID.Win(j)=temp
wset,ID.Win(j)
erase
	endfor


	if Data.Mode ne "custom" then begin
Argument=findgen(Data.Nlevels+2)/(Data.Nlevels+1)
levels0=Argument*(Data.upper-Data.lower)+Data.lower
levels=levels0(1:Data.Nlevels)
	endif else begin
levels=Data.levels
levels0=[Data.min,Data.levels,Data.max]
	endelse

data={array:Data.array, nlevels:Data.nlevels, levels:levels, upper:Data.upper, $
	lower:Data.lower, mode:Data.mode, max:Data.max, min:Data.min, $
	Show:Data.show, Labels:Data.Labels}

widget_control,ID.Levels,set_val=strtrim(string(Data.Levels,format='(g11.3)'),2)
widget_control,ID.Labels,set_but=Data.Labels


wset,ID.Win(0)

plot,levels0,xtickl=-0.02,ytickl=-0.02,xran=[0,Data.Nlevels+1],/xst, $
	yran=[Data.min,Data.max],/yst

for j=0,Data.Nlevels-1 do plots,[0,Data.Nlevels+1],[1.,1.]*levels(j),col=!p.color,/noc

empty

WIDGET_CONTROL,ID.NLevels,/input

xmanager,'cont_setting',MainBase,group=group_leader, /modal

follow=Data.Labels
Levels=float(Data.Levels)
Data=0

	end