
;+ ***********************************************************************
; NAME:
;	UVALUE_REGION
;
; PURPOSE:
;	Cette procedure reactualise le contenu de UVALUE pour le widget
;		CW_REGION
;
; CATEGORY:
;	Widgets
;
; CALLING SEQUENCE:
;	UVALUE_REGION,Xdim,Ydim,Vdim
;
; INPUTS:
;	XDIM	dimension X du tableau contenant l'image
;	YDIM	dimension Y du tableau contenant l'image
;	VDIM	valeur superieur de la dimension de l'image
;
; KEYWORD PARAMETERS:
;
; OUTPUTS:
;	remise a jour du contenu de la structure STATE
;		state{size_imx, size_imy, size_vis}
;	remisse a jour des UVALUE de CURSOR et RESET
;
; COMMON BLOCKS:
;	IDENT_REG: 
;		cursor	identification du widget 'CURSOR'
;		reset	identification du widget 'RESET'
;		textx	identification du widget X:...
;		texty	identification du widget Y:
;		state	structure
;
; EXAMPLE:
;	UVALUE_REG,state.size_imx,state.size_imy,state.size_vis
;		pour reactualiser apres changement de donnees ou de 
;		dimension
; MODIFICATION HISTORY:
; 	Ecrit par: J Bonmartin le 03/03/98 (bonmartin@obspm.fr)
;-**********************************************************************

PRO UVALUE_REGION,xdim,ydim,vdim
;COMMON IDENT_REG,cursor,reset,textx,texty,etat,state, Inf,Xd,Xf,Yd,Yf 

if N_PARAMS() ne 3 Then BEGIN
		print,'UVALUE_REGION: enter 3 parameters'
		return
	end


state= {size_imx:0, size_imy:0, size_vis:0}

	 state.size_imx = xdim

	state.size_imy = ydim

	state.size_vis = vdim

WIDGET_CONTROL,cursor,SET_Uvalue= state
WIDGET_CONTROL,reset,SET_Uvalue= state

end


;+ ***********************************************************************
; NAME:
;	REGION_EVENT
;
; PURPOSE:
;	Gestion des evenements de CW_REGION
;
; CATEGORY:
;	WIDGET
;
; CALLING SEQUENCE:
;	Result = REION_EVENT, event
;
; OUTPUTS:
;	Au retour la fonction fournit la structure
;		result:{id:parent, Top:event.top, Handler:0L,$
;			 XD:xd, XF:xf, YD:yd, YF:yf}
;	X, Y coordonnees de la region selectionnee
;
;	UVALUE = 'REGION'
;
; COMMON BLOCKS:
;	IDENT_REG: 
;		cursor	identification du widget 'CURSOR'
;		reset	identification du widget 'RESET'
;		textx	identification du widget X:...
;		texty	identification du widget Y:
;		state	structure
;
; MODIFICATION HISTORY:
;-


FUNCTION Region_event, event

COMMON IDENT_REG,cursor,reset,textx,texty,etat,state,Inf,Xd,Xf,Yd,Yf


ON_ERROR, 2
parent = event.handler
stash = WIDGET_INFO(parent, /child)

WIDGET_CONTROL, event.id, GET_VALUE=val, /no_copy

;case val of
IF Event.ID EQ cursor THEN BEGIN
;	'SELECT': begin
		rap = Float(state.size_vis)/state.size_imx
		WIDGET_CONTROL,etat, $
		  set_value='Mouse:LEFT:position,MIDLE:size,RIGHT:exit'

		BOX_CURSOR2,Xd, Yd,Nx,Ny
			XF = FIX((Xd + Nx)/Rap)
			YF = FIX((Yd + Ny)/Rap)
			XD = FIX(Xd / Rap)
			Yd = FIX(Yd / Rap)

		WXD= IND_RS(Xd, Inf.CRPIXX, Inf. Ray)
		WXF= IND_RS(Xf, Inf.CRPIXX, Inf. Ray)
		WYD= IND_RS(Yd, Inf.CRPIXY, Inf. Ray)
		WYF= IND_RS(YF, Inf.CRPIXY, Inf. Ray)
		widget_control,textx,$
			set_value=string(Wxd,FORMAT='(F6.2)')$
				+','+string(Wxf,FORMAT='(F6.2)')
		widget_control,texty,$
			set_value=string(Wyd,FORMAT='(F6.2)')$
				+','+string(Wyf,FORMAT='(F6.2)')

	if xf gt state.size_imx or yf gt state.size_imy THEN begin
		r=widget_message('ERROR: selected point out of range')
		uvalue_region,state.size_imx,state.size_imy,$
				state.size_vis
		return,0
	endif
		WIDGET_CONTROL,Etat, Set_value='Region selected'
		end

;	'RESET': begin
IF Event.Id EQ reset THEN BEGIN
			XD=0
			YD=0
			XF = state.size_imx
			YF = state.size_imy

		WXD= IND_RS(Xd, Inf.CRPIXX, Inf. Ray)
		WXF= IND_RS(Xf, Inf.CRPIXX, Inf. Ray)
		WYD= IND_RS(Yd, Inf.CRPIXY, Inf. Ray)
		WYF= IND_RS(YF, Inf.CRPIXY, Inf. Ray)
		widget_control,textx,$
			set_value=string(Wxd,FORMAT='(F6.2)')$
				+','+string(Wxf,FORMAT='(F6.2)')
		widget_control,texty,$
			set_value=string(Wyd,FORMAT='(F6.2)')$
				+','+string(Wyf,FORMAT='(F6.2)')
		WIDGET_CONTROL,Etat, Set_value='Reset DONE'
		end

IF Event.Id EQ Textx THEN BEGIN
		Valeurs = STR_SEP(Event.value, ',')
		WXD = FLOAT (Valeurs(0))
		WXF = FLOAT (Valeurs(1))
		XD = FIX(RS_IND (Wxd, Inf.CRPIXX, Inf. Ray))
		XF = FIX(RS_IND (Wxf, Inf.CRPIXX, Inf. Ray))
		WXD= IND_RS(Xd, Inf.CRPIXX, Inf. Ray)
		WXF= IND_RS(XF, Inf.CRPIXX, Inf. Ray)
		widget_control,textx,$
			set_value=string(Wxd,FORMAT='(F6.2)')$
				+','+string(Wxf,FORMAT='(F6.2)')
	END	

IF Event.Id EQ Texty THEN BEGIN
		Valeurs = STR_SEP(Event.value, ',')
		WYD = FLOAT (Valeurs(0))
		WYF = FLOAT (Valeurs(1))
		YD = FIX(RS_IND (Wyd, Inf.CRPIXY, Inf. Ray))
		YF = FIX(RS_IND (Wyf, Inf.CRPIXY, Inf. Ray))

		WYD= IND_RS(Yd, Inf.CRPIXY, Inf. Ray)
		WYF= IND_RS(YF, Inf.CRPIXY, Inf. Ray)
		widget_control,texty,$
			set_value=string(Wyd,FORMAT='(F6.2)')$
				+','+string(Wyf,FORMAT='(F6.2)')
	END	

		widget_control,parent,set_uvalue='REGION'
ret = {id:parent, Top:event.top, Handler:0L, XD:xd, XF:xf, YD:yd, YF:yf}

return,ret
end

;+ ***********************************************************************
; NAME:
;	CW_REGION
;
; PURPOSE:
;	Compound WIDGET pour la selection d'une region d'une image
;visualisee
;	La commande 'SELECT' selectionne une region
;	La commande 'RESET' redonne les dimensions de l'image
;	Les limites de la region sont affichees
;
; CATEGORY:
;	COMPOUN WIDGET
;
; CALLING SEQUENCE:
;	Result = CW_REGION(parent, Image, Dim, Str_lim)
;
; INPUTS:
;	Parent	identification du widget parent
;	Image	image visualisee
;	Dim	nombre de pixels de l'image visualisee
;	Str_lim	structure contenant les limites actuelles , voir RH.2D
;

; KEYWORD PARAMETERS:
;
; OUTPUTS:
;	Result: identification du widget
;	Apres un appel a 'SELECT' ou 'RESET', on a:
;		Uvalue = 'REGION'
;		les coordonnees de la region selectionne dans la structure
;de retour EVENT :	
;	{id:parent, Top:event.top, Handler:0L, XD:xd, XF:xf, YD:yd, YF:yf}
; X, Y de debut et de fin de la region. Ces valeurs sont exprimees en
;coordonnees de pixels ramenes aux coordonnees de l'image, meme si celle-ci
;a ete visualisee sur DIM pixels 
;
; COMMON BLOCKS:
; 	IDENT_REG,cursor,reset,textx,texty,state
;
; RESTRICTIONS:
;	On ne peut pas selectionne une region sur une imge provenant d'une
;selection precedente. L'image doit correspondre au tableau IMAGE
;
; EXAMPLE:
;	Imag = INDGEN(64,64)
;	ID = CW_REGION( Parent, Imag, 512)
;La commande 'SELECT' permet la selection d'une region dans l'image 
;de 64*64 pixels qui a ete precedemment visualisee sur 512*512 pixels 
;La commande 'RESET reinitialise les limites de la region a celles du tableau
;soit X= 0,63, Y= 0,63
;
;
; MODIFICATION HISTORY:

;-


FUNCTION cw_region,parent, image,pix, Info, Str_lim
COMMON IDENT_REG,cursor,reset,textx,texty,etat,state,Inf,Xd,Xf,Yd,Yf
; gestion des images 2D/3D (true images)  nov 2008
INF = Info

state= {size_imx:0, size_imy:0, size_vis:0}
		sz = size(image)
		if sz(0) eq 2 then state.size_imx = sz(1)-1
		if sz(0) eq 3 then state.size_imx = sz(2)-1
		if sz(0) eq 2 then state.size_imy = sz(2)-1
		if sz(0) eq 3 then state.size_imy = sz(3)-1
		state.size_vis = pix
print,'Limites:',str_lim.xd,str_lim.xf
	XD = Str_lim.Xd & XF = Str_lim.Xf
	YD = Str_lim.Yd & YF = Str_lim.Yf
	WXD= IND_RS(Str_lim.Xd, Info.CRPIXX, Info. Ray)
	WXF= IND_RS(Str_lim.Xf, Info.CRPIXX, Info. Ray)
	WYD= IND_RS(Str_lim.Yd, Info.CRPIXY, Info. Ray)
	WYF= IND_RS(Str_lim.YF, Info.CRPIXY, Info. Ray)

base = WIDGET_BASE(parent, /column, /align_center)

      cursor = WIDGET_BUTTON(base,value='SELECT');,uvalue=state)
      reset = WIDGET_BUTTON(base,value='RESET');,uvalue=state)
	textx = CW_FIELD( Base, $
		Value = string(WXd,FORMAT='(F6.2)')+','$
				+string(WXf,FORMAT='(F6.2)'), $
;			Uvalue=state, $
			TITLE='Limits on X', /Return_event) 
	texty = CW_FIELD( Base, $
		Value = string(WYd,FORMAT='(F6.2)')+','$
				+string(WYf,FORMAT='(F6.2)'), $
;			Uvalue=state, $
			TITLE='Limits on Y', /Return_event) 
	etat= WIDGET_TEXT(base,Value= 'Select OR Reset',Xsize=42)

WIDGET_CONTROL, base,EVENT_FUNC = 'Region_event'

;WIDGET_CONTROL, WIDGET_INFO(base, /child),$
;	set_uvalue=state, /no_copy

return, base
end
