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