
;*******************************************************

FUNCTION CW_GRID_GET_VALUE,id,value

stash = WIDGET_INFO ( id , /CHILD )
WIDGET_CONTROL, stash, GET_UVALUE = state;,/NO_COPY
ret = state.value
WIDGET_CONTROL, stash, SET_UVALUE = state;,/NO_COPY
RETURN, ret
END

;*********************************************************

PRO CW_GRID_SET_VALUE,id,value

stash = WIDGET_INFO ( id , /CHILD )
WIDGET_CONTROL, stash, GET_UVALUE = state;,/NOCOPY
state.value = value
state.nb = N_ELEMENTS(value)

IF (N_ELEMENTS(value) NE state.nb ) THEN BEGIN
   MESSAGE,'Mauvaise taille du tableau'
   RETURN
ENDIF ELSE BEGIN
     IF (KEYWORD_SET( exclusive )) AND $
     (N_ELEMENTS(WHERE(value EQ 1)) NE 1 ) THEN $
     value(*) = 0
ENDELSE

FOR i = 0,state.nb-1 DO BEGIN
   IF (value(i) EQ 1) THEN BEGIN
      WIDGET_CONTROL,state.button(i),$
        SET_VALUE ='>'+STRTRIM(string(state.values(i)),1)
   ENDIF ELSE BEGIN
       WIDGET_CONTROL,state.button(i),$
        SET_VALUE =' '+STRTRIM(string(state.values(i)),1)
   ENDELSE
ENDFOR



WIDGET_CONTROL, stash, SET_UVALUE = state;,/NOCOPY
END


FUNCTION CW_GRID_EVENT,ev

base = ev.handler                         ; we get back useful information 
stash = WIDGET_INFO ( base, /CHILD)       ; stored in the first child of
WIDGET_CONTROL, stash, GET_UVALUE = state;,/NO_COPY 
                                          ; the event handler ( the base of
                                          ; CW_GRID )



FOR i = 0,state.nb-1 DO BEGIN
   IF ( ev.id EQ state.button(i) ) THEN BEGIN ; button i pushed
      IF (NOT KEYWORD_SET(state.exclusive)) THEN BEGIN
           IF (state.value(i) EQ 1) THEN BEGIN
                state.value(i) = 0
                WIDGET_CONTROL,state.button(i),SET_VALUE=' '+ $
                                    STRTRIM(string(state.values(i)),1)
           ENDIF ELSE BEGIN
                state.value(i) = 1
                WIDGET_CONTROL,state.button(i),SET_VALUE='>'+ $
                                   STRTRIM(string(state.values(i)),1)
           ENDELSE
      ENDIF ELSE BEGIN


           IF (state.value(i) EQ 1) THEN BEGIN
              state.value(i) = 0
              WIDGET_CONTROL,state.button(i),SET_VALUE=' '+ $
                                   STRTRIM(string(state.values(i)),1)         
           ENDIF ELSE BEGIN 
              old = WHERE(state.value EQ 1)
              IF (old(0) NE -1) THEN BEGIN
                 state.value(old) = 0
                 WIDGET_CONTROL,state.button(old),SET_VALUE=' '+ $
                                    STRTRIM(string(state.values(old)),1)         
              ENDIF
              state.value(i) = 1
              WIDGET_CONTROL,state.button(i),SET_VALUE='>'+ $
                                   STRTRIM(string(state.values(i)),1)
           ENDELSE


      ENDELSE
   ENDIF
ENDFOR

value = intarr(50)
value(*) = 0
FOR i=0,N_ELEMENTS(state.value)-1 DO BEGIN
  value(i) = state.value(i)
ENDFOR

ret = { CW_GRID_EVENT, ID:base, TOP:ev.top, $
        HANDLER:0L, VALUE:value }

WIDGET_CONTROL, stash, SET_UVALUE = state;,/NO_COPY

;       We send back an event with the new value
RETURN, ret
END

;********************************************************

; Another kind of compound widget : The Grid Widget
;     version 1.00 by Rozier de Linage Manuel / efrei.fr

;*******************************************************
FUNCTION CW_GRID,parent,values,VALUE = value,UVALUE = uvalue, $
                 EXCLUSIVE=exclusive,TITLE = title

IF NOT KEYWORD_SET ( uvalue ) THEN uvalue = 0
nb = N_ELEMENTS ( values )
IF NOT KEYWORD_SET ( value ) THEN value = intarr(nb)$
ELSE BEGIN
   IF (N_ELEMENTS( value) NE nb ) THEN value=intarr(nb)$
   ELSE BEGIN
     IF (KEYWORD_SET( exclusive )) AND $
     (N_ELEMENTS(WHERE(value EQ 1)) NE 1 ) THEN $
     value(*) = 0
   ENDELSE
ENDELSE

IF ( nb EQ 0) THEN RETURN,0
IF NOT KEYWORD_SET ( exclusive ) THEN exclusive = 0

;   We declare base as the event handler
;   And we associate CW_GRID_GETVALUE and CW_GRID_SETVALUE to
;   GET_VALUE and SET_VALUE of WIDGET_CONTROL for this COMPOUND
;   WIDGET.
           
base = WIDGET_BASE ( parent,UVALUE = uvalue, $
                     EVENT_FUNC = 'CW_GRID_EVENT', $
                     FUNC_GET_VALUE = 'CW_GRID_GET_VALUE', $
                     PRO_SET_VALUE = 'CW_GRID_SET_VALUE', $
                     /COLUMN,/FRAME)

base_message = WIDGET_BASE(base)
base_buttons = WIDGET_BASE(base,/ROW,XPAD=0,YPAD=0)

button = lonarr(nb)
FOR i = 0,nb-1 DO BEGIN
   IF (value(i) EQ 1) THEN $
      button(i) = WIDGET_BUTTON(base_buttons,$
       VALUE ='>'+STRTRIM(string(values(i)),1))$
   ELSE $
      button(i) = WIDGET_BUTTON(base_buttons,$
       VALUE =' '+STRTRIM(string(values(i)),1))
ENDFOR

IF KEYWORD_SET(Title) THEN message = WIDGET_LABEL(base_message,VALUE = title)

;    We store useful information in the state variable to avoid COMMONs.

state = { button : button, value : value ,values : values, $
          nb:nb , base_buttons : base_buttons, exclusive : exclusive }

WIDGET_CONTROL, WIDGET_INFO ( base, /CHILD ), SET_UVALUE = state;,/NO_COPY


RETURN, base      ; A compound widget always return is main base id.
END
