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

package provide DS9 1.0

proc IExamDef {} {
    global iexam
    
    set iexam(button) 0
    set iexam(key) 0
    set iexam(any) 0
    set iexam(frame) {}
    set iexam(x) {}
    set iexam(y) {}
    set iexam(event) {}
    set iexam(mode) {}
}

proc IExamButton {which xx yy} {
    global iexam
    global imarker

    if {$iexam(button) || $iexam(any)} {
	# we need this cause MarkerMotion maybe called, 
	# and we don't want it
	set imarker(motion) none
	set imarker(handle) -1

	set iexam(frame) $which
	set iexam(x) $xx
	set iexam(y) $yy

	if {$iexam(any)} {
	    set iexam(event) {<1>}
	}
	set iexam(button) 0
	set iexam(any) 0
    }
}

proc IExamKey {which K xx yy} {
    global iexam

    if {$iexam(key) || $iexam(any)} {
	set iexam(frame) $which
	set iexam(x) $xx
	set iexam(y) $yy
	set iexam(event) $K

	set iexam(key) 0
	set iexam(any) 0
    }
}

proc ProcessSendIExamCmd {proc id param {sock {}} {fn {}}} {
    global parse
    set parse(proc) $proc
    set parse(id) $id

    global iexam
    global icursor
    global current
    set iexam(frame) {}
    set iexam(x) {}
    set iexam(y) {}
    set iexam(event) {}
    set iexam(mode) $current(mode)

    set current(mode) iexam

    set iexam(button) 1
    set iexam(key) 0
    set iexam(any) 0

    global cvarname
    set cvarname {iexam(button)}

    # turn on blinking cursor
    set icursor(timer) 1
    CursorTimer

    iexamsend::YY_FLUSH_BUFFER
    iexamsend::yy_scan_string $param
    iexamsend::yyparse

    # turn off blinking cursor
    set icursor(timer) 0

    set current(mode) $iexam(mode)

    set iexam(button) 0
    set iexam(key) 0

    set iexam(frame) {}
    set iexam(x) {}
    set iexam(y) {}
    set iexam(event) {}
    set iexam(mode) {}

    unset cvarname
}

proc IExamSendCmdDest {which} {
    global iexam
    global cvarname

    set iexam($which) 1
    set cvarname "iexam($which)"
}

proc IExamSendCmdData {ww hh} {
    global iexam
    
    global cvarname
    vwait $cvarname
    ProcessSendCmdTxt "$iexam(event) [$iexam(frame) get data canvas $iexam(x) $iexam(y) $ww $hh]"
}

proc IExamSendCmdCoord {sys sky skyformat} {
    global iexam

    global cvarname
    vwait $cvarname
    ProcessSendCmdTxt "$iexam(event) [$iexam(frame) get coordinates $iexam(x) $iexam(y) $sys $sky $skyformat]"
}

proc IExamSendCmdMacro {cmd} {
    global iexam

    global cvarname
    vwait $cvarname

    # $width,$height,$depth,$bitpix
    ParseXYBitpixMacro cmd $iexam(frame)

    # $filename[$regions]
    ParseFilenameRegionMacro cmd $iexam(frame)

    # $filename
    ParseFilenameMacro cmd $iexam(frame)

    # $regions
    ParseRegionMacro cmd $iexam(frame)

    # $env
    ParseEnvMacro cmd

    # $pan
    ParsePanMacro cmd $iexam(frame)

    # $value
    ParseValueMacro cmd $iexam(frame) $iexam(x) $iexam(y)

    # $x,$y
    ParseXYMacro cmd $iexam(frame) $iexam(x) $iexam(y)

    # $z
    ParseZMacro cmd $iexam(frame)

    ProcessSendCmdTxt "$iexam(event) $cmd"
}

proc ProcessSendIExamCmdOld {proc id param {sock {}} {fn {}}} {
    global iexam

    global icursor
    global current

    set iexam(frame) {}
    set iexam(x) {}
    set iexam(y) {}
    set iexam(event) {}
    set iexam(mode) $current(mode)

    set current(mode) iexam

    set iexam(button) 0
    set iexam(key) 0
    set iexam(any) 0

    # turn on blinking cursor
    set icursor(timer) 1
    CursorTimer

    switch -- [string tolower [lindex $param 0]] {
	button {
	    set iexam(button) 1
	    set varname {iexam(button)}
	    set param [join [lreplace $param 0 0]]
	}
	key {
	    set iexam(key) 1
	    set varname {iexam(key)}
	    set param [join [lreplace $param 0 0]]
	}
	any {
	    set iexam(any) 1
	    set varname {iexam(any)}
	    set param [join [lreplace $param 0 0]]
	}
	default {
	    set iexam(button) 1
	    set varname {iexam(button)}
	}
    }

    switch -- [string tolower [lindex $param 0]] {
	value -
	data {
	    vwait $varname
	    set w [lindex $param 1]
	    set h [lindex $param 2]
	    if {$w == {}} {
		set w 1
	    }
	    if {$h == {}} {
		set h 1
	    }
	    $proc $id "$iexam(event) [$iexam(frame) get data canvas $iexam(x) $iexam(y) $w $h]\n"
	}
	coordinate {
	    set sys [lindex $param 1]
	    set sky [lindex $param 2]
	    set skyformat [lindex $param 3]
	    switch -- $skyformat {
		{} {set skyformat degrees}
	    }
	    switch -- $sky {
		{} {set sky fk5}
	    }
	    switch -- $sys {
		{} {set sys physical}
		fk4 -
		fk5 -
		icrs -
		galactic -
		ecliptic {set sky $sys; set sys wcs}
	    }

	    vwait $varname
	    $proc $id "$iexam(event) [$iexam(frame) get coordinates $iexam(x) $iexam(y) $sys $sky $skyformat]\n"
	}
	{} {
	    vwait $varname
	    $proc $id "$iexam(event) [$iexam(frame) get coordinates $iexam(x) $iexam(y) image fk5 degrees]\n"
	}
	default {
	    vwait $varname
	    set cmd $param

	    # $width,$height,$depth,$bitpix
	    ParseXYBitpixMacro cmd $iexam(frame)

	    # $filename[$regions]
	    ParseFilenameRegionMacro cmd $iexam(frame)

	    # $filename
	    ParseFilenameMacro cmd $iexam(frame)

	    # $regions
	    ParseRegionMacro cmd $iexam(frame)

	    # $env
	    ParseEnvMacro cmd

	    # $pan
	    ParsePanMacro cmd $iexam(frame)

	    # $value
	    ParseValueMacro cmd $iexam(frame) $iexam(x) $iexam(y)

	    # $x,$y
	    ParseXYMacro cmd $iexam(frame) $iexam(x) $iexam(y)

	    # $z
	    ParseZMacro cmd $iexam(frame)

	    $proc $id "$iexam(event) $cmd\n"
	}
    }

    # turn off blinking cursor
    set icursor(timer) 0

    set current(mode) $iexam(mode)

    set iexam(button) 0
    set iexam(key) 0

    set iexam(frame) {}
    set iexam(x) {}
    set iexam(y) {}
    set iexam(event) {}
    set iexam(mode) {}
}

