#!/usr/bin/wishx
# Copyright (c) 1994, 1995, 1996 New York University
# File monitor_tool
# "@(#) $Id: monitor_tool,v 1.5 1997/03/05 04:45:53 baratloo Exp $"


# Global varialbes...
set progName ""
set hostName ""
set portNumber 0
set manager_sd 0

set parDY 60
set seqDY 30
set angleDY 15
set stringXpos 530

set lastNumJobs 0
set canvasWidth 550
set canvasTop 0
set maxCanvasHeight 300
set currentY 20
set lastLine "1 0"

set NOT_STARTED_COLOR gray
set NOT_FINISHED_COLOR red
set FINISHED_COLOR blue

# ------------------------------------------------------------------------- #
# ------------------------------------------------------------------------- #
proc exitProcess {} {
    global manager_sd
    catch {close $manager_sd}
    exit
}



proc drawText {x y text} {
    .f.c create text $x $y -text $text -fill black -anchor w
}



proc drawVerticalLine {xpos ypos len width color} {
    global parDY
    .f.c create line $xpos $ypos $xpos [expr $ypos+$len] -width $width -fill $color
}



proc drawAngledLine {x1 x2 y} {
    global angleDY
    .f.c create line $x1 [expr $y+1] $x2 [expr $y+$angleDY-1] -width 1 -fill gray
}



proc updateProgress {} {
    global manager_sd parDY seqDY angleDY canvasWidth lastLine
	global canvasTop maxCanvasHeight currentY stringXpos
    global FINISHED_COLOR NOT_FINISHED_COLOR NOT_STARTED_COLOR

    if {[gets $manager_sd line] == 0} {
		fileevent $manager_sd readable ""
		close $manager_sd
		return
    }
    set stepno [lindex $line 0]
    set jobs [lrange $line 1 end]

    if {$stepno == 2} {
		set x1 [expr $canvasWidth / 2]
		drawVerticalLine $x1 $currentY $seqDY 2 gray
		drawText $stringXpos [expr $currentY+30] $stepno
		set lastLine $line
		return
    }

    if {$stepno > [lindex $lastLine 0]} {
		if {[llength $lastLine] == 2} {
			set x1 [expr $canvasWidth / 2]
			drawVerticalLine  $x1 $currentY $seqDY 2 $FINISHED_COLOR
			incr currentY $seqDY
			set delx [expr $canvasWidth / [expr [llength $jobs] + 1]]
			set x2 $delx
			for {set i 0} {$i < [llength $jobs]} {incr i 1} {
				drawAngledLine $x1 $x2 $currentY
				incr x2 $delx
			}
			incr currentY $angleDY
			drawText $stringXpos [expr $currentY+$parDY/2] $stepno
		} else {
			set x1 [expr $canvasWidth / 2]
			set delx [expr $canvasWidth / [llength $lastLine]]
			set x2 $delx
			for {set i 1} {$i < [llength $lastLine]} {incr i 1} {
				drawVerticalLine $x2 $currentY $parDY 2 $FINISHED_COLOR
				drawAngledLine $x2 $x1 [expr $currentY +  $parDY]
				incr x2 $delx
			}
			incr currentY $parDY
			incr currentY $angleDY
			drawText $stringXpos [expr $currentY+$seqDY/2] $stepno
		}
		if {[expr $currentY - $canvasTop] > $maxCanvasHeight} {
			set canvasTop [expr $currentY - $maxCanvasHeight]
		}
		.f.c config -scrollregion [list 0 $canvasTop 550 [expr $currentY+$parDY+50]]
		.f.c yview moveto [expr $currentY+$parDY]
    }

    if {[llength $jobs] == 1} {
		set dy $seqDY
    } else {
		set dy $parDY
    }
    set delx [expr $canvasWidth / [expr [llength $jobs] + 1]]
    set xpos $delx
    for {set i 0} {$i < [llength $jobs]} {incr i 1} {
		if {[lindex $jobs $i] == "X"} {
			drawVerticalLine $xpos $currentY $dy 2 $FINISHED_COLOR
		} elseif {[lindex $jobs $i] != 0} {
			drawVerticalLine $xpos $currentY $dy [lindex $jobs $i] $NOT_FINISHED_COLOR
		} else {
			drawVerticalLine $xpos $currentY $dy 1 $NOT_STARTED_COLOR
		}
		incr xpos $delx
    }
    set lastLine $line
}



# ------------------------------------------------------------------------- #
# ------------------------------------------------------------------------- #
wm title . "Execution Monitoring Tool"
tk_bindForTraversal .
focus .
wm resizable . 0 1



# First a dummy frame to determine the width of the window...
frame .fdummy -width 600
pack .fdummy -side top -fill x



# Menu stuff...
frame .menu -relief raised -borderwidth 2
pack .menu -side top -fill x



# Options menu item...
menubutton .menu.file -text "Options" -menu .menu.file.m -underline 0
menu .menu.file.m
.menu.file.m add command -label "Exit program" -underline 0 -command exitProcess
pack .menu.file -side left
tk_menuBar .menu .menu.file



# Status line 1 ...
frame .fstat1 -relief ridge -borderwidth 2
label .fstat1.lprog -text "Program name:"
entry .fstat1.eprog -textvariable progName -width 10 -foreground blue3 -relief flat
label .fstat1.lhost -text "Running on host:"
entry .fstat1.ehost -textvariable hostName -foreground blue3 -relief flat
label .fstat1.lport -text "Port number:"
entry .fstat1.eport -textvariable portNumber -width 10 -foreground blue3 -relief flat
pack .fstat1.lprog .fstat1.eprog -side left
pack .fstat1.lhost .fstat1.ehost -side left
pack .fstat1.lport .fstat1.eport -side left
pack .fstat1 -side top -fill x
.fstat1.eprog config -state disabled
.fstat1.ehost config -state disabled
.fstat1.eport config -state disabled




# Create a scrollable canvas
frame .f
canvas .f.c -relief sunken -width $canvasWidth -borderwidth 2 \
		-scrollregion [list 0 $canvasTop $canvasWidth $currentY] \
		-yscrollcommand [list .f.vscroll set]
scrollbar .f.vscroll -orient vertical -command [list .f.c yview]
pack .f.vscroll -side right -fill y
pack .f.c -side top -fill both -expand true
pack .f -side top -fill both -expand true



# ------------------------------------------------------------------------- #
# ------------------------------------------------------------------------- #
# Read the runtime arguments and set globals...
if {$argc != 3} {
    mkDialog .dialog "-text \"Error in usage.\n\nUsage:\n\
			$argv0 <prog> <host> <port> <guiport>, where\n\n\
			<prog> is the name of the Calypso program\n\
			<host> is the name of the machine running the program\n\
			<port> is the port number.\n\n\
			Look at the Help menu for further information.\"\
			-aspect 300 -justify left" {OK {}}
    tkwait visibility .dialog
    grab .dialog
    tkwait window .dialog
    exit
}


set progName [lindex $argv 0]
set hostName [lindex $argv 1]
set portNumber [lindex $argv 2]


set manager_sd [server_connect $hostName $portNumber]
fileevent $manager_sd readable updateProgress


