Viewing contents of file '../idllib/contrib/tappin/graffer/graff_draw.pro'
function Graff_draw, pdefs, event, track_flag

;+
; GRAFF_DRAW
;	Process a draw event in draw mode
;
; Usage:
;	ichange = graff_draw(pdefs, event, track_flag)
;
; Argument:
;	pdefs	struct	in/out	The plot definition structure.
;	event	struct	input	The draw event that triggered this
;	track_flag byte	input	A flag to say if it's a tracking event.
;
; History:
;	Carved from graffer: 17/8/95; SJT
;	Modify to cope with function data (by ignoring it): 18/8/95;
;	SJT
;	Add tracking event handling: 5/12/95; SJT
;	Handle data with error bars: 28/11/96; SJT
;	Made to function returning "cancel" state: 18/12/96; SJT
;-

handle_value, pdefs.data, data, /no_copy

if (track_flag) then begin
    if (data(pdefs.cset).type ge 0 and  $
        data(pdefs.cset).type le 8) then $ 
      graff_msg, pdefs.ids.hlptxt, $
      'Left = add point, Middle = edit point, Right = delete point'
    handle_value, pdefs.data, data, /no_copy, /set
    return, 0
endif

xy = convert_coord(event.x, event.y, /device, /to_data)
handle_value, data(pdefs.cset).xydata, xydata, /no_copy

svflag = 0

if (data(pdefs.cset).type lt 0 or $
    data(pdefs.cset).type ge 9) then begin ; Function, can't manipulate it
                                ; Re-save and exit
    
    handle_value, data(pdefs.cset).xydata, xydata, /no_copy, /set
    handle_value, pdefs.data, data, /no_copy, /set
    
    if (event.type ne 2) then graff_msg, pdefs.ids.message,  $
      "Can't manipulate function or 2-D data" $
    else begin
        widget_control, pdefs.ids.xcp, set_value = xy(0)
        widget_control, pdefs.ids.ycp, set_value = xy(1)
    endelse
    
    event.type = 0
    return, 0
end else ncols = ([2, 3, 4, 3, 4, 4, 5, 5, 6])(data(pdefs.cset).type)

case (data(pdefs.cset).mode) of
    0: begin
        xyd = xy(0:1)
        xydatar = xydata
    end
    1: begin
        xyd = [sqrt(total(xy(0:1)^2)), atan(xy(1), xy(0))]
        xydatar = [xydata(0, *)*cos(xydata(1, *)), $
                   xydata(0, *)*sin(xydata(1, *))]
    end
    2: begin
        xyd = [sqrt(total(xy(0:1)^2)), atan(xy(1), xy(0))*!Radeg]
        xydatar = [xydata(0, *)*cos(xydata(1, *)*!Dtor), $
                   xydata(0, *)*sin(xydata(1, *)*!Dtor)]
    end
endcase

ichange = 0
case event.type of
    0: if (event.press eq 2) then begin  
                                ; Press event (only used for moves)
        
        if (data(pdefs.cset).ndata ge 1) then begin
            ddata = convert_coord(xydatar, /data, /to_device)
            dist = sqrt((ddata(0, *)-event.x)^2 + $
                        (ddata(1, *)-event.y)^2)
            md = min(dist, imin)
            if (md lt 5) then pdefs.transient.imove = imin $
            else graff_msg, pdefs.ids.message, $
              "No datum within 5 pixels of selected location"
        endif
        
    end
    
    1: begin                    ; Release event
        
        case event.release of
            1: begin            ; Left: add a point
                ndl = fltarr(ncols)
                ndl(0) = xyd
                old_data = data(pdefs.cset)
                old_xy = xydata
                
                if (data(pdefs.cset).ndata le 1) then  $
                  xydata(*, data(pdefs.cset).ndata) = ndl $
                else xydata = [[xydata], [ndl]]
                
                data(pdefs.cset).ndata = data(pdefs.cset).ndata+1
                if (data(pdefs.cset).type ne 0) then begin
                    line = data(pdefs.cset).ndata-1
                    handle_value, data(pdefs.cset).xydata, xydata, $
                      /set, /no_copy
                    handle_value, pdefs.data, data, /set, /no_copy
                    svflag = 1
                    ichange = gr_xy_wid(pdefs, line = line)
                    if (ichange eq 0) then begin
                        handle_value, pdefs.data, data, /no_copy
                        data(pdefs.cset) = old_data
                        handle_value, data(pdefs.cset).xydata, old_xy, $
                          /set, /no_copy
                        handle_value, pdefs.data, data, /no_copy, /set
                    endif
                endif else ichange = 1
            end
            2: if (data(pdefs.cset).ndata ne 0 and $
                   pdefs.transient.imove ne -1) then begin
                                ; Centre: move one
                if (data(pdefs.cset).type ne 0) then begin
                    handle_value, data(pdefs.cset).xydata, xydata, $
                      /set, /no_copy
                    handle_value, pdefs.data, data, /set, /no_copy
                    ichange = gr_xy_wid(pdefs, line = pdefs.transient.imove)
                endif else begin
                    xydata(*, pdefs.transient.imove) = xyd
                    ichange = 1
                    handle_value, data(pdefs.cset).xydata, xydata, $
                      /set, /no_copy
                    handle_value, pdefs.data, data, /set, /no_copy
                endelse
                svflag = 1
                pdefs.transient.imove = -1
            end
            4: if (data(pdefs.cset).ndata ne 0) then begin
                                ; Right: delete.
                ddata = convert_coord(xydatar, /data, /to_device)
                dist = sqrt((ddata(0, *)-event.x)^2 + $
                            (ddata(1, *)-event.y)^2)
                md = min(dist, imin)
                if (md lt 5) then begin
                    if (data(pdefs.cset).ndata le 2) then begin
                        if (imin eq 0) then xydata(*, 0) = xydata(*, 1)
                    endif else if (imin eq 0) then  $
                      xydata = xydata(*, 1:*) $
                    else if (imin eq data(pdefs.cset).ndata-1) then $
                      xydata = xydata(*, 0:imin-1)  $
                    else xydata = [[xydata(*, 0:imin-1)], $
                                   [xydata(*, imin+1:*)]]
                
                    data(pdefs.cset).ndata = data(pdefs.cset).ndata-1
                    ichange = 1
                endif else graff_msg, pdefs.ids.message,  $
                  "No datum within 5 pixels of selected location"
            end
        endcase
        
    end
    2: begin                    ; Motion events
        idraw_flag = 0
        device, set_graph = 10
        if (pdefs.transient.opflag) then begin
            if (pdefs.xtype) then plots, 10.^!X.crange, $
              replicate(pdefs.transient.opos(1), 2) $
            else plots, !X.crange, replicate(pdefs.transient.opos(1), 2)
            if (pdefs.ytype) then plots, $
              replicate(pdefs.transient.opos(0), 2), 10.^!Y.crange $
            else plots, replicate(pdefs.transient.opos(0), 2), $
              !Y.crange
        endif
        if (pdefs.xtype) then plots, 10.^!X.crange, $
          replicate(xy(1), 2) $
        else plots, !X.crange, replicate(xy(1), 2)
        if (pdefs.ytype) then plots, replicate(xy(0), 2), $
          10.^!Y.crange $
        else plots, replicate(xy(0), 2), !Y.crange
        device, set_graph = 3
        
        pdefs.transient.opos = xy(0:1)
        pdefs.transient.opflag = 1b
        
        widget_control, pdefs.ids.xcp, set_value = xy(0)
        widget_control, pdefs.ids.ycp, set_value = xy(1)
    end
    Else:                       ; Shouldn't be any scroll events but
                                ; it's here just in case...
endcase

if (not svflag) then begin
    handle_value, data(pdefs.cset).xydata, xydata, /no_copy, /set
    handle_value, pdefs.data, data, /no_copy, /set
endif

return, ichange

end