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

;+
; GRAFF_WRITE
;	Process a draw event in text mode
;
; Usage:
;	ichange = graff_write(pdefs, event, track_flag)
;
; Return value
;	ichange	int	1 if changed, 0 if not
;
; 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
;	Add tracking event handling: 5/12/95; SJT
;	Made to function returning "cancel" state: 18/12/96; SJT
;	Change to plot crosshairs in normalized coords: 27/1/97; SJT
;-

if (track_flag) then begin
    graff_msg, pdefs.ids.hlptxt, 'Left ' + $
      '= add string, Middle = edit string, Right = delete string'
    return, 0
endif

xy = convert_coord(event.x, event.y, /device, /to_data)
xyn = convert_coord(event.x, event.y, /device, /to_norm)

ichange = 0

case event.type of
    
    1: begin                    ; Release event
        
        handle_value, pdefs.text, text, /no_copy

        case event.release of
            1: begin            ; Left: add a line
                if (pdefs.ntext eq 0) then posit = xy(0:1) $
                else begin
                    if (pdefs.text_options.norm) then posit = xyn(0:1) $
                    else posit = xy(0:1)
                endelse
                handle_value, pdefs.text, text, /no_copy, /set

                ichange = graff_text(pdefs, position = posit)
            end
            
            2:if (pdefs.ntext ge 1) then begin
                                ; Centre - edit a text string
                
                ddata = convert_coord(text.x, text.y, /data, $
                                      /to_device)
                locs = where(text.norm eq 1, nnorm) ; Normalized
                if (nnorm ne 0) then ddata(*, locs) = $
                  convert_coord(text(locs).x, text(locs).y, /norm, $
                                /to_device)
                locs = where(text.norm eq 2, nnorm) ; Frame
                if (nnorm ne 0) then begin
                    gr_fra2norm, text(locs).x, text(locs).y, xn, yn
                    ddata(*, locs) = $
                      convert_coord(xn, yn, /norm, $
                                    /to_device)
                endif
                handle_value, pdefs.text, text, /no_copy, /set
                
                dist = sqrt((ddata(0, *)-event.x)^2 + $
                            (ddata(1, *)-event.y)^2)
                md = min(dist, imin)
                if (md lt 5) then $
                  ichange = graff_text(pdefs, edit = imin) $
                else graff_msg, pdefs.ids.message, $
                  "No text anchor point within 5 pixels"
        
            endif else handle_value, pdefs.text, text, /no_copy, /set

            
            4: if (pdefs.ntext ne 0) then begin
                                ; Right: delete.
                
                if (pdefs.ntext ge 1) then begin
                    ddata = convert_coord(text.x, text.y, /data, $
                                          /to_device)
                locs = where(text.norm eq 1, nnorm) ; Normalized
                if (nnorm ne 0) then ddata(*, locs) = $
                  convert_coord(text(locs).x, text(locs).y, /norm, $
                                /to_device)
                locs = where(text.norm eq 2, nnorm) ; Frame
                if (nnorm ne 0) then begin
                    gr_fra2norm, text(locs).x, text(locs).y, xn, yn
                    ddata(*, locs) = $
                      convert_coord(xn, yn, /norm, $
                                    /to_device)
                endif
            
                    dist = sqrt((ddata(0, *)-event.x)^2 + $
                                (ddata(1, *)-event.y)^2)
                    md = min(dist, imin)
                endif else md = 100.
                
                if (md lt 5) then begin
                    if (pdefs.ntext eq 1) then begin
                        handle_value, pdefs.text, pdefs.text_options, /set
                        pdefs.ntext = 0
                    
                    endif else begin
                        if (imin eq 0) then text = text(1:*) $
                          
                        else if (imin eq pdefs.ntext-1) then $
                          text = text(0:Imin-1) $
                        
                        else text = [text(0:Imin-1), text(Imin+1:*)]    
                     
                        handle_value, pdefs.text, text, /no_copy, /set
                    
                        pdefs.ntext = pdefs.ntext-1
                    endelse
                    ichange = 1
                endif else begin
                    graff_msg, pdefs.ids.message, $
                      "No text anchor point within 5 pixels"
                    handle_value, pdefs.text, text, /no_copy, /set
                endelse
            endif else handle_value, pdefs.text, text, /no_copy, /set
        endcase
    end
    
    2: begin                    ; Motion events
        idraw_flag = 0
        
        device, set_graph = 6
        if (pdefs.transient.opflag) then begin
            plots, /norm, [0., 1.], $
              replicate(pdefs.transient.opos(1), 2), linesty = 2 
            plots, /norm, linesty = 2, $
              replicate(pdefs.transient.opos(0), 2), [0., 1.]
        endif
        plots, /norm, [0., 1.], replicate(xyn(1), 2), linesty = 2
        plots, /norm, replicate(xyn(0), 2), [0., 1.], linesty = 2
        device, set_graph = 3
        
        pdefs.transient.opos = xyn(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:                       ; Ignore press events and any other
                                ; miscellanea
    
endcase

return, ichange

end