Viewing contents of file '../idllib/contrib/tappin/graffer/graff_rescale.pro'
;+
; GRAFF_RESCALE
;	Rescale the current GRAFFER dataset
;
; Usage:
;	ichange = graff_rescale(pdefs)
;
; Return value
;	ichange	int	1 if changed, 0 if not
;
; Argument:
;	prefs	struct	input	The GRAFFER data & control structure.
;
; History:
;	Original: 16/8/96; SJT
;	Made to function returning "cancel" state: 18/12/96; SJT
;	Add CAPTURE key to text inputs: 6/2/97; SJT
;-

function Rescale_event, event

widget_control, event.id, get_uvalue = but
widget_control, event.handler, get_uvalue = boxes, /no_copy

iexit = 0
value = 0.

track_flag = strpos(tag_names(event, /struct), 'TRACK') ne -1
if (track_flag) then begin
    idraw = 0
    if (event.enter eq 0) then begin
        graff_msg, boxes(4), ''
        goto, miss_case
    endif
endif

case (but) of
    'CANCEL': if (track_flag) then $
      graff_msg, boxes(4), "Abandon operation and return" $
    else iexit = -1
    
    'POP': widget_control, event.id, timer = 2
    
    'DO': if (track_flag) then $
      graff_msg, boxes(4), "Apply scalings and shifts and return" $
    else  begin
        value = fltarr(4)
        for j = 0, 3 do begin
            widget_control, boxes(j), get_value = xy
            value(j) = xy
        endfor
        iexit = 1
    endelse
    
    'XSCALE': if (track_flag) then $
      graff_msg, boxes(4), "Specify scaling factor for X values" $
    else grf_focus_enter, boxes(1)

    'XSHIFT': if (track_flag) then $
      graff_msg, boxes(4), "Specify shift for X values (post scaling units)" $
    else grf_focus_enter, boxes(2)

    'YSCALE': if (track_flag) then $
      graff_msg, boxes(4), "Specify scaling factor for Y values" $
    else grf_focus_enter, boxes(3)

    'YSHIFT': if (track_flag) then $
      graff_msg, boxes(4), "Specify shift for Y values (post scaling units)" $
    else grf_focus_enter, boxes(0)
    
endcase

Miss_case:

widget_control, event.handler, set_uvalue = boxes, /no_copy

return, { $
          Id:      event.id, $
          Top:     event.top,  $
          Handler: 0l,  $
          Value:   value,  $
          Exited:  iexit $
        }

end

function Graff_rescale, pdefs

; Extract the datasets

handle_value, pdefs.data, data, /no_copy

if (data(pdefs.cset).type lt 0) then begin ; This a function -- can't
                                ; rescale a function!
    handle_value, pdefs.data, data, /no_copy, /set
    graff_msg, pdefs.ids.message,  $
      "This a function -- can't rescale a function!"
    return, 0
end
if (data(pdefs.cset).ndata eq 0) then begin ; This a new data set -- can't
                                ; rescale no data!
    handle_value, pdefs.data, data, /no_copy, /set
    graff_msg, pdefs.ids.message,  $
      "This an empty dataset -- can't rescale an empty dataset!"
    return, 0
end

widget_control, pdefs.ids.graffer, sensitive = 0

tlb = widget_base(title = 'GRAFFER rescale', group = $
                  pdefs.ids.graffer, resource = 'Graffer')

base = widget_base(tlb, /column)

popper = widget_label(base, value = 'GRAFFER Dataset rescaler', uvalue = $
                    'POP')

boxes = lonarr(5)
jb = widget_base(base, /row, /frame)

boxes(0) = graff_enter(jb, label = 'X: Scaling:', value = 1.0, /float, $
                       xsize = 11, uvalue = 'XSCALE', /track, /capture)

boxes(1) = graff_enter(jb, label = 'Shift:', value = 0., /float, xsize $
                       = 11, uvalue = 'XSHIFT', /track, /capture)

jb = widget_base(base, /row, /frame)

boxes(2) = graff_enter(jb, label = 'Y: Scaling:', value = 1.0, /float, $
                       xsize = 11, uvalue = 'YSCALE', /track, /capture)

boxes(3) = graff_enter(jb, label = 'Shift:', value = 0., /float, xsize $
                       = 11, uvalue = 'YSHIFT', /track, /capture)

boxes(4) = widget_text(base, value = '')

jb = widget_base(base, /row)

junk = widget_button(jb, value = '     Cancel    ', uvalue = 'CANCEL', /track)
junk = widget_button(jb, value = '     Do  it    ', uvalue = 'DO', /track)


;	Realise the widgets and use a DIY widget handling procedure
;	(as with all the graffer popups) to facilitate getting values
;	back into the right place.

widget_control, tlb, /real
widget_control, base, set_uvalue = boxes, /no_copy, event_func = $
  'rescale_event'
if (pdefs.popflag) then widget_control, popper, timer = 2

repeat begin
    ev = widget_event(base)
endrep until (ev.exited ne 0)

widget_control, tlb, /destroy
widget_control, pdefs.ids.graffer, /sensitive 


if (ev.exited lt 0) then begin
    handle_value, pdefs.data, data, /no_copy, /set
    return, 0
end

handle_value, data(pdefs.cset).xydata, xydata, /no_copy

if (data(pdefs.cset).type eq 9) then begin
    handle_value, xydata.x, x, /no_copy
    handle_value, xydata.y, y, /no_copy
    
    x = x*ev.value(0) + ev.value(1)
    y = y*ev.value(2) + ev.value(3)
    
    handle_value, xydata.x, x, /no_copy, /set
    handle_value, xydata.y, y, /no_copy, /set
endif else begin
    xydata(0, *) = xydata(0, *)*ev.value(0) + ev.value(1)
    xydata(1, *) = xydata(1, *)*ev.value(2) + ev.value(3)
    case data(pdefs.cset).type of ; Handle error scaling
        0:                      ; No errors nothing to do
        
        1: xydata(2, *) = xydata(2, *)*ev.value(2) ; Y
        2: xydata(2:3, *) = xydata(2:3, *)*ev.value(2) ; YY
        
        3: xydata(2, *) = xydata(2, *)*ev.value(0) ; X
        4: xydata(2:3, *) = xydata(2:3, *)*ev.value(0) ; XX
        
        5: begin                ; XY
            xydata(2, *) = xydata(2, *)*ev.value(0)
            xydata(3, *) = xydata(3, *)*ev.value(2)
        end
        
        6: begin                ; XYY
            xydata(2, *) = xydata(2, *)*ev.value(0)
            xydata(3:4, *) = xydata(3:4, *)*ev.value(2)
        end
        7: begin                ; XXY
            xydata(2:3, *) = xydata(2:3, *)*ev.value(0)
            xydata(4, *) = xydata(4, *)*ev.value(2)
        end
        
        8: begin                ; XXYY
            xydata(2:3, *) = xydata(2:3, *)*ev.value(0)
            xydata(4:5, *) = xydata(4:5, *)*ev.value(2)
        end
    endcase
endelse

handle_value, data(pdefs.cset).xydata, xydata, /no_copy, /set
handle_value, pdefs.data, data, /no_copy, /set

return, 1

end