#  Copyright (C) 1999-2018
#  Smithsonian Astrophysical Observatory, Cambridge, MA, USA
#  For conditions of distribution and use, see copyright notice in "copyright"

package provide DS9 1.0

proc IMEDef {} {
    global iime
    global ime
    global pime
    
    set ime(task) stats
    set ime(shape) circle

    array set pime [array get ime]
}

proc IMEChangeTask {} {
    global current

    if {$current(frame) == {}} {
	return
    }

    if {$current(mode) != {analysis}} {
	return
    }

    UpdateTaskMenu
    IMEChangeShape
}

proc IMEChangeShape {} {
    global ime
    global ds9
    global current

    switch $ime(task) {
	stats -
	hist {
	    switch $ime(shape) {
		circle -
		ellipse -
		box -
		polygon {}
		default {set ime(shape) circle}
	    }
	}
	radial {
	    switch $ime(shape) {
		annulus -
		ellipseannulus -
		boxannulus {}
		default {set ime(shape) annulus}
	    }
	}
	plot2d {}
	plot3d {
	    switch $ime(shape) {
		circle -
		ellipse -
		box -
		polygon -
		point {}
		default {set ime(shape) point}
	    }
	}
    }

    foreach ff $ds9(frames) {
	$ff marker analysis unselect all
	set coord [$ff get crosshair canvas]
	set XX [lindex $coord 0]
	set YY [lindex $coord 1]

	$ff analysis shape $ime(shape) $XX $YY

	if {$current(frame) == $ff} {
	    IMEDoTask $current(frame)
	}
    }
}

proc IMEDoTask {which} {
    global ime

    if {![$which has fits]} {
	return
    }

    switch $ime(task) {
	stats {IMEStatsTask $which}
	hist {IMEHistTask $which}
	radial {IMERadialTask $which}
	plot2d {IMEPlot2DTask $which}
	plot3d {IMEPlot3DTask $which}
    }
}

proc IMEKey {which K xx yy} {
    global ime

    # always available
    switch $K {
	question {
	    IMEHelp
	    return
	}
    }

    if {![$which has fits]} {
	return
    }

    switch $K {
	a {
	    # FWHM (Aperture Sum)
	}
	b {
	    # Box Coords?
	}
	c {
	    # Column Cut
	}
	d {
	    # remap (Load Display)
	    set ime(task) plot3d
	    IMEKeyTask $which $xx $yy
	}
	e {
	    # remap (Contour)
	}
	f {
	    # remap (Redraw)
	}
	g {
	    # remap (Graphics Cursor)
	}
	h {
	    set ime(task) hist
	    IMEKeyTask $which $xx $yy
	}
	i {
	    # remap (Image Cursor)
	}
	j {
	    # Line Guassian Fit
	}
	k {
	    # Col Gaussian Fit
	}
	l {
	    # Line Cut
	}
	m {
	    set ime(task) stats
	    IMEKeyTask $which $xx $yy
	}
	n {
	    # remap (Next Frame)
	}
	o {
	    # remap (Overplot)
	}
	p {
	    # remap (Prev Frame)
	}
	q {
	    # remap (Quit)
	}
	r {
	    set ime(task) radial
	    IMEKeyTask $which $xx $yy
	}
	s {
	    # Surface Plot
	}
	t {
	    # remap (Output Image)
	}
	u {
	    # Vector Plot
	}
	v {
	    set ime(task) plot2d
	    IMEKeyTask $which $xx $yy
	}
	w {
	    # remap (Toggle Logfile)
	}
	x {
	    # Print coords/values
	}
	y {
	    # remap (Set Origin)
	}
	z {
	    # Print value grid
	}
	, {
	    # Quick Profile Photometry
	}
	. {
	    # Quick Radial Profile Plot and Fit
	}
    }
}

proc IMEKeyTask {which xx yy} {
    global ime

    $which crosshair canvas $xx $yy

    $which analysis shape $ime(shape) $xx $yy
    IMEDoTask $which

    UpdateColormapLevelMosaic $which $xx $yy canvas
    UpdateInfoBox $which $xx $yy canvas
    UpdatePixelTableDialog $which $xx $yy canvas
    UpdateGraphLayout $which
    UpdateGraphAxis $which
    UpdateGraphData $which $xx $yy canvas
}

proc IMEButton {which xx yy} {
    global ime
    global imarker

    global debug
    if {$debug(tcl,ime)} {
	puts stderr "IMEButton $which $xx $yy"
    }

    # see if we are on a handle
    set hh [$which get marker analysis handle $xx $yy]
    set id [lindex $hh 0]
    set imarker(handle) [lindex $hh 1]

    if {$imarker(handle)} {
	$which marker analysis $id edit begin $imarker(handle)
	set imarker(motion) beginEdit
	return
    }

    # else, see if we are on a segment of a polygon
    set hh [$which get marker analysis polygon segment $xx $yy]
    set id [lindex $hh 0]
    set segment [lindex $hh 1]
    if {$segment} {
	$which marker analysis $id create polygon vertex $segment $xx $yy
	$which marker analysis $id edit begin $imarker(handle)
	set imarker(handle) [expr 4+$segment+1]
	set imarker(motion) beginEdit
	return
    }

    # see if any markers are selected
    if {[$which get marker analysis select number]>0} {
	# else, see if we are on a marker
	if {[$which get marker analysis id $xx $yy]} {
	    $which marker analysis $id move begin
	    set imarker(motion) beginMove
	    return
	} else {
	    $which marker analysis unselect all
	    set imarker(motion) none
	    return
	}
    }

    $which marker analysis $id move begin
    set imarker(motion) beginMove
    
    $which crosshair canvas $xx $yy
    $which analysis shape $ime(shape) $xx $yy
    IMEDoTask $which
}

proc IMEShift {which xx yy} {
    global ime
    global imarker

    global debug
    if {$debug(tcl,ime)} {
	puts stderr "IMEShift $which $xx $yy"
    }

    # see if we are on a handle
    set hh [$which get marker analysis handle $xx $yy]
    set id [lindex $hh 0]
    set imarker(handle) [lindex $hh 1]

    if {$imarker(handle)} {
	$which marker analysis $id rotate begin
	set imarker(motion) beginRotate
    }
}

proc IMEDouble {which xx yy} {
    global ime
    global imarker

    global debug
    if {$debug(tcl,ime)} {
	puts stderr "IMEDouble $which $xx $yy"
    }

    if {[$which get marker analysis id $xx $yy]} {
	$which marker analysis select only $xx $yy
    }
}

proc IMEMotion {which xx yy} {
    global ime
    global imarker

    global debug
    if {$debug(tcl,ime)} {
	puts stderr "IMEMotion $which $xx $yy"
    }

    switch -- $imarker(motion) {
	none {}
	beginMove -
	move {
	    $which marker analysis move motion $x $y
	    set imarker(motion) move
	    $which crosshair canvas $xx $yy
	    $which analysis shape $ime(shape) $xx $yy
	    IMEDoTask $which
	}
	beginEdit -
	edit {
	    set imarker(motion) edit
	    $which marker analysis edit motion $xx $yy $imarker(handle)
	    IMEDoTask $which
	}
	beginRotate -
	rotate {
	    set imarker(motion) rotate
	    $which marker analysis rotate motion $xx $yy $imarker(handle)
	    IMEDoTask $which
	}
	region -
	shiftregion {}
    }
}

proc IMERelease {which xx yy} {
    global ime
    global imarker

    global debug
    if {$debug(tcl,ime)} {
	puts stderr "IMERelease $which $xx $yy"
    }

    switch -- $imarker(motion) {
	none {}
	beginMove -
	beginRotate {}
	beginEdit {}
	move {
	    $which marker analysis move end
	    IMEDoTask $which
	}
	edit {
	    $which marker analysis edit end
	    IMEDoTask $which
	}
	rotate {
	    $which marker analysis rotate end
	    IMEDoTask $which
	}
	region -
	shiftregion {}
    }

    set imarker(motion) none
    set imarker(handle) -1
}

proc IMEArrowKey {which xx yy} {
    global ime
    global ds9

    global debug
    if {$debug(tcl,ime)} {
	puts stderr "IMEArrow $which $xx $yy"
    }

    $which crosshair warp $xx $yy

    set coord [$which get crosshair canvas]
    set XX [lindex $coord 0]
    set YY [lindex $coord 1]

    $which analysis shape $ime(shape) $XX $YY
    IMEDoTask $which

    UpdateColormapLevelMosaic $which $XX $YY canvas
    UpdateInfoBox $which $XX $YY canvas
    UpdatePixelTableDialog $which $XX $YY canvas
    UpdateGraphData $which $XX $YY canvas
}

proc IMEHelp {} {
    global ime

    set rr "\tAnalysis Help\n\n?\tPrint Help\nd\tPlot 3D\nm\tStatistics\nv\tPlot 2D\n"

    SimpleTextDialog imehlp "Analysis Help" 80 20 insert top $rr
}

proc IMEStatsTask {which} {
    global ime

    set rr [$which get marker analysis hide analysis stats physical fk5]

    SimpleTextDialog "imestat" "Statistics" 80 20 insert top $rr
}

proc IMEHistTask {which} {
    global iime
    global ime

    set id 0
 
    set varname imehist
    global $varname
    upvar #0 $varname var

    set vvarname analysishist
    upvar #0 $vvarname vvar
    global $vvarname

    set xdata ${vvarname}x
    set ydata ${vvarname}y
    global $xdata $ydata

    set ping [PlotPing $vvarname]

    if {!$ping} {
	PlotLineDialog $vvarname Histogram {} Values Counts

	set vvar(manage) 0
	set vvar(dim) xy
	set vvar(xdata) $xdata
	set vvar(ydata) $ydata
	blt::vector create $xdata $ydata
    }

    $which get marker analysis hide analysis histogram $xdata $ydata 512

    if {!$ping} {
	PlotExternal $vvarname
	set vvar(smooth) step
	set vvar(fill) 1
	$vvar(proc,updateelement) $vvarname
	$vvar(proc,updategraph) $vvarname
    }

    PlotStats $vvarname
    PlotList $vvarname
}

proc IMERadialTask {which} {
    global iime
    global ime

    set varname imerad
    global $varname
    upvar #0 $varname var

    set vvarname analysisrad
    upvar #0 $vvarname vvar
    global $vvarname

    set vvar(system) physical

    set xdata ${vvarname}x
    set ydata ${vvarname}y
    set yedata ${vvarname}ye
    global $xdata $ydata $yedata

    set ping [PlotPing $vvarname]

    if {!$ping} {
	PlotLineDialog $vvarname "Radial Profile" {} physical {}
	MarkerAnalysisRadialAxisTitle $vvarname

	set vvar(manage) 0
	set vvar(dim) xyey
	set vvar(xdata) $xdata
	set vvar(ydata) $ydata
	set vvar(yedata) $yedata
	blt::vector create $xdata $ydata $yedata
    }

    $which get marker analysis hide analysis radial $xdata $ydata $yedata physical

    if {!$ping} {
	PlotExternal $vvarname
	$vvar(proc,updateelement) $vvarname
	$vvar(proc,updategraph) $vvarname
    }

    PlotStats $vvarname
    PlotList $vvarname
}

proc IMEPlot2DTask {which} {
    global iime
    global ime

    set varname imeplot2d
    global $varname
    upvar #0 $varname var

    set vvarname analysisplot2d
    upvar #0 $vvarname vvar
    global $vvarname

    set vvar(system) physical
    set vvar(sky) fk5
    set vvar(method) average

    set xdata ${vvarname}x
    set ydata ${vvarname}y
    set xcdata ${vvarname}xc
    set ycdata ${vvarname}yc
    global $xdata $ydata $xcdata $ycdata

    set ping [PlotPing $vvarname]

    if {!$ping} {
	PlotLineDialog $vvarname Plot2D {} physical Counts
	MarkerAnalysisPlot2dXAxisTitle $vvarname
	MarkerAnalysisPlot2dYAxisTitle $vvarname

	# setup our own formatting
	set vvar(graph,format) 0
	set vvar(xcdata) $xcdata
	set vvar(ycdata) $ycdata
	$vvar(graph) xaxis configure \
	    -command "MarkerAnalysisPlot2dXAxis $vvarname"

	set vvar(manage) 0
	set vvar(dim) xy
	set vvar(xdata) $xdata
	set vvar(ydata) $ydata
	blt::vector create $xdata $ydata $xcdata $ycdata
    }

    $which get marker analysis hide analysis plot2d $xdata $ydata $xcdata $ycdata physical fk5 average

    if {!$ping} {
	PlotExternal $vvarname
	$vvar(proc,updateelement) $vvarname
	$vvar(proc,updategraph) $vvarname
    }

    PlotStats $vvarname
    PlotList $vvarname
}

proc IMEPlot3DTask {which} {
    global iime
    global ime

    set varname imeplot3d
    global $varname
    upvar #0 $varname var

    set vvarname analysisplot3d
    upvar #0 $vvarname vvar
    global $vvarname

    set vvar(system) image
    set vvar(method) average

    set xdata ${vvarname}x
    set ydata ${vvarname}y
    global $xdata $ydata

    set ping [PlotPing $vvarname]

    if {!$ping} {
	PlotLineDialog $vvarname Plot3D {} image Counts
	MarkerAnalysisPlot3dXAxisTitle $vvarname
	MarkerAnalysisPlot3dYAxisTitle $vvarname

	set vvar(manage) 0
	set vvar(dim) xy
	set vvar(xdata) $xdata
	set vvar(ydata) $ydata
	blt::vector create $xdata $ydata
    }

    $which get marker analysis hide analysis plot3d $xdata $ydata physical fk5 average

    if {!$ping} {
	PlotExternal $vvarname
	$vvar(proc,updateelement) $vvarname
	$vvar(proc,updategraph) $vvarname
    }

    PlotStats $vvarname
    PlotList $vvarname
}

