Annotation of capa/capa51/GUITools/grader.tcl, revision 1.1

1.1     ! albertel    1: ###########################################################
        !             2: # grader.tcl - 
        !             3: # Copyright Guy Albertelli II 1996
        !             4: ###########################################################
        !             5: set gTclVer 2.0
        !             6: 
        !             7: ###########################################################
        !             8: # createControlWindow
        !             9: ###########################################################
        !            10: # Creates the menu window 
        !            11: ###########################################################
        !            12: # Arguments: none
        !            13: # Returns: nothing
        !            14: # Globals: gWindowMenu - set to the name of Menu for the windows
        !            15: #                        menu
        !            16: ###########################################################
        !            17: proc createControlWindow {} {
        !            18:     global gWindowMenu gParseMode gParseModeButton gLprCommand gCapaConfig 
        !            19: 
        !            20:     after 500 { dateUpdate }
        !            21:     after 1000 { cleanWindowList }
        !            22: 
        !            23:     set gCapaConfig(Printer_selected) "0"
        !            24:     set gCapaConfig(lprOneSided_command) "lpr "
        !            25:     set gCapaConfig(lprTwoSided_command) ""
        !            26:     set gCapaConfig(printer_option) ""
        !            27:     
        !            28:     wm withdraw .
        !            29: 
        !            30:     set menuFrame [menu .main -tearoff 0 -type tearoff -font 8x13bold \
        !            31: 	    -disabledforeground grey85 ]
        !            32: 
        !            33:     wm title $menuFrame "Grader"
        !            34: 
        !            35:     $menuFrame post 0 0
        !            36: 
        !            37:     wm geometry $menuFrame "+0+20"
        !            38:     $menuFrame add command -label "Grader" -foreground grey85 -background \
        !            39: 	    black -state disabled 
        !            40:     $menuFrame add command -label "Info..." -command { createInfoWindow }
        !            41:     $menuFrame add cascade -label "File" -menu $menuFrame.file
        !            42:     $menuFrame add command -label "Excuse Problem" -command { \
        !            43: 	    createExcuseWindow }
        !            44:     $menuFrame add cascade -label "Windows" -menu $menuFrame.windows
        !            45:     $menuFrame add cascade -label "Print" -menu $menuFrame.print
        !            46:     $menuFrame add command -label "Remap..." -command { createRemapWindow }
        !            47:     $menuFrame add command -label "Quit" -command { quit }
        !            48: 
        !            49:     set file  [menu $menuFrame.file -tearoff 1 -font 8x13bold ]
        !            50:     set windows [menu $menuFrame.windows -tearoff 1 -font 8x13bold]
        !            51:     set print    [menu $menuFrame.print -tearoff 1  -font 8x13bold]
        !            52:     set gWindowMenu $windows
        !            53:     
        !            54:     $file add command -label "Specify Class" -command { specifyClass }
        !            55:     $file add command -label "Create Class Report" -command { \
        !            56: 	    createSummaryWindow }
        !            57:     $file add command -label "Grade Subjective" -command { gradeSubjective }
        !            58: 
        !            59:     $print add command -label "Set Summary" -command { printSetSummary }
        !            60:     $print add command -label "Term Summary" -command { printTermSummary }
        !            61: 
        !            62:     set gParseMode 2
        !            63:     set gParseModeButton "Both, Questions Answers"    
        !            64: }
        !            65: 
        !            66: ###########################################################
        !            67: # createInfoWindow
        !            68: ###########################################################
        !            69: # creates the Information window
        !            70: ###########################################################
        !            71: # Arguments: None
        !            72: # Returns: Nothing
        !            73: # Globals: gDate - the variable containg the current date 
        !            74: #          gWindowMenu - used to register the new window in the
        !            75: #                        windows menu
        !            76: #          gVer - Stores the current version of Grader (set in 
        !            77: #                 C init code
        !            78: ###########################################################
        !            79: proc createInfoWindow {} {
        !            80:     global gDate gWindowMenu gVer gTclVer gCmd gCompileDate
        !            81: 
        !            82:     if { [winfo exists .about] } {
        !            83: 	capaRaise .about
        !            84: 	return 
        !            85:     }
        !            86: 
        !            87:     set about [toplevel .about]
        !            88: 
        !            89:     $gWindowMenu add command -label "About" -command "capaRaise $about"
        !            90: 
        !            91:     wm title $about "About" 
        !            92:     
        !            93:     label $about.l1 -font 12x24 -text "Grader $gVer" -pady 20
        !            94:     label $about.l4 -font 8x13 -text "Grader.tcl Version $gTclVer" -pady 20
        !            95:     label $about.l6  -font 8x13 -text "$gCompileDate" 
        !            96:     message $about.l2 -font 8x13 -text "Code by: Y. Tsai, G. Albertelli II Copyright Michigan State University Board of Trustees, 1992-1999, No Unauthorized Commercial Use" \
        !            97:        -pady 20 -aspect 300
        !            98:     label $about.l3 -font 8x13 -textvariable gDate 
        !            99:     label $about.l5  -font 8x13 -textvariable gCmd
        !           100: 
        !           101:     button $about.close -text "Close" -command "destroy $about
        !           102:                                                 removeWindowEntry About"
        !           103:     
        !           104:     pack $about.l1 $about.l4 $about.l6 $about.l2 $about.l3 $about.l5 \
        !           105: 	    $about.close -side top 
        !           106: 
        !           107:     Centre_Dialog $about default
        !           108: }
        !           109: 
        !           110: ###########################################################
        !           111: # quit
        !           112: ###########################################################
        !           113: # called when the quit option is selected on the menu, unmaps
        !           114: # all keys.
        !           115: ###########################################################
        !           116: # Arguments: None
        !           117: # Returns: Nothing
        !           118: # Globals: None
        !           119: ###########################################################
        !           120: proc quit {} {
        !           121:     if { [makeSure "Are you sure you wish to quit?"] == "Cancel" } {
        !           122: 	return 
        !           123:     }
        !           124:     
        !           125:     if { [winfo exists .gradesubjective] } { subjDone }
        !           126:     catch { rm -f [file join / tmp gkc[pid]]}
        !           127:     catch { rm -f [file join / tmp g[pid]]}
        !           128: 
        !           129:     unmapAllKeys
        !           130:     exit
        !           131: }
        !           132: 
        !           133: ###########################################################
        !           134: # createExcuseWindow
        !           135: ###########################################################
        !           136: # runs capa_excuse for a set and section, creates a window to
        !           137: # get the information from, requires that the user has already
        !           138: # selected a class.
        !           139: ###########################################################
        !           140: # Arguments: None
        !           141: # Returns: Nothing
        !           142: # Globals: gPrompt - used to detect when to take the modal dialog away
        !           143: #          gSetLoad - global var containg the current set being graded
        !           144: #          gSectionLoad - global var containg the current section
        !           145: #                         being graded
        !           146: #          gExcuseSet - Contains the number of the set to be excused
        !           147: #          gExcuseProblem - number of the problem to be excused
        !           148: #          gExcuseSection - Section number to excuse the problem for
        !           149: #          gExcuseWho - contains either : Section or All, and is
        !           150: #                       whether to excuse an entire class or a specific
        !           151: #                       section
        !           152: ###########################################################
        !           153: proc createExcuseWindow { } {
        !           154:     global gPrompt gSetLoad gSectionLoad gExcuseSet gExcuseProblem \
        !           155: 	    gExcuseSection gExcuseWho
        !           156:     
        !           157:     if {![winfo exists .grader]} {
        !           158: 	displayError "You must first specify a class"
        !           159: 	return 
        !           160:     }
        !           161: 
        !           162:     if { $gSetLoad == "" } {
        !           163: 	set gExcuseSet 1
        !           164:     } else {
        !           165: 	set gExcuseSet $gSetLoad
        !           166:     }
        !           167: 
        !           168:     if { $gSectionLoad == "" } {
        !           169: 	set gExcuseSection 1
        !           170:     } else {
        !           171: 	set gExcuseSection $gSectionLoad
        !           172:     }
        !           173: 
        !           174:     set excuse [toplevel .excuse -borderwidth 10]
        !           175: 
        !           176:     set whichFrame [frame $excuse.whichFrame -borderwidth 4 -relief groove]
        !           177:     set whoFrame [frame $excuse.whoFrame -borderwidth 10]
        !           178:     set buttonFrame [frame $excuse.buttonFrame]
        !           179:     pack $whichFrame $whoFrame $buttonFrame -side top -anchor w
        !           180: 
        !           181:     set setFrame [frame $whichFrame.setFrame]
        !           182:     set problemFrame [frame $whichFrame.problemFrame]
        !           183:     pack $setFrame $problemFrame -side top -anchor e
        !           184: 
        !           185:     label $setFrame.label -text Set
        !           186:     entry $setFrame.entry -textvariable gExcuseSet -width 3
        !           187:     pack $setFrame.label $setFrame.entry -side left
        !           188: 
        !           189:     set gExcuseProblem 1
        !           190:     label $problemFrame.label -text "Problem Number"
        !           191:     entry $problemFrame.entry -textvariable gExcuseProblem -width 3
        !           192:     pack $problemFrame.label $problemFrame.entry -side left
        !           193: 
        !           194:     set sectionFrame [frame $whoFrame.sectionFrame]
        !           195:     set allFrame [frame $whoFrame.allFrame]
        !           196:     pack $sectionFrame $allFrame -side top -anchor w
        !           197: 
        !           198:     set gExcuseWho Section
        !           199:     radiobutton $sectionFrame.radio -text "For students in section:" \
        !           200: 	    -variable gExcuseWho -value Section    
        !           201:     entry $sectionFrame.entry -textvariable gExcuseSection -width 3
        !           202:     pack $sectionFrame.radio $sectionFrame.entry -side left
        !           203: 
        !           204:     radiobutton $allFrame.radio -text "For all students in the class." \
        !           205: 	    -variable gExcuseWho -value All
        !           206:     pack $allFrame.radio
        !           207: 
        !           208:     set gPrompt(result) ""
        !           209:     button $buttonFrame.excuse -text Excuse -command { set gPrompt(yes) 1 } \
        !           210: 	    -underline 0
        !           211:     button $buttonFrame.cancel -text Cancel -command { set gPrompt(yes) 0 } \
        !           212: 	    -underline 0
        !           213:     pack $buttonFrame.excuse $buttonFrame.cancel -side left
        !           214:     
        !           215:     bind $excuse <Alt-Key> break
        !           216:     
        !           217:     Centre_Dialog $excuse default
        !           218:     update
        !           219:     
        !           220:     focus $excuse
        !           221:     raise $excuse
        !           222:     capaGrab $excuse
        !           223:     vwait gPrompt(yes)
        !           224:     capaGrab release $excuse
        !           225:     destroy $excuse
        !           226:     if {$gPrompt(yes)} {
        !           227: 	switch $gExcuseWho {
        !           228: 	    All
        !           229: 	    {
        !           230: 		capaExcuse $gExcuseSet $gExcuseProblem 0
        !           231: 	    }
        !           232: 	    Section
        !           233: 	    {
        !           234: 		capaExcuse $gExcuseSet $gExcuseProblem $gExcuseSection
        !           235: 	    }
        !           236: 	}
        !           237: 	loadScores
        !           238:     } else {
        !           239: 	return
        !           240:     }
        !           241: }    
        !           242: 
        !           243: ###########################################################
        !           244: # createSummaryWindow
        !           245: ###########################################################
        !           246: # creates a dialog to craft a summary report with
        !           247: ###########################################################
        !           248: # Arguments: None
        !           249: # Returns: Nothing
        !           250: # Globals: gWindowMenu - name of the window menu widget, used to
        !           251: #                        register the dialog box
        !           252: #          gSetLoad - current set being graded
        !           253: #          gSectionLoad - current section being graded
        !           254: #          gSummaryFile - filename to save report to
        !           255: #          gSummary - array with fields
        !           256: #              (section) - section to create the summary for
        !           257: #              (set) - set to creat the summary for
        !           258: #              (who) - two possible values: section (create a section
        !           259: #                       summary), all (create a class summary)
        !           260: #              (which) - 2 possible values: specific (summary report
        !           261: #                        for a specific set), upto (summary report upto
        !           262: #                        and including a specific set)
        !           263: #              (first) - first field to sort by, four values:name
        !           264: #                        (student name), number (student number), 
        !           265: #                        section (section), grade (grade on the sets)
        !           266: #              (second) - second field to sort by, same four values as
        !           267: #                         above
        !           268: #              (filename) - either default, grader picks it or specified,
        !           269: #                           user specified a name to be found in gSummaryFile
        !           270: ###########################################################
        !           271: proc createSummaryWindow {} {
        !           272:     global gWindowMenu gSetLoad gSectionLoad gSummary gSummaryFile
        !           273:     
        !           274:     if { [winfo exists .summary] } {
        !           275: 	raise .summary
        !           276: 	return
        !           277:     }
        !           278: 
        !           279:     if {![winfo exists .grader]} {
        !           280: 	displayError "You must first specify a class"
        !           281: 	return 
        !           282:     }
        !           283: 
        !           284:     if { $gSetLoad == "" } {
        !           285: 	set gSummary(set) 1
        !           286:     } else {
        !           287: 	set gSummary(set) $gSetLoad
        !           288:     }
        !           289: 
        !           290:     if { $gSectionLoad == "" } {
        !           291: 	set gSummary(section) 1
        !           292:     } else {
        !           293: 	set gSummary(section) $gSectionLoad
        !           294:     }
        !           295: 
        !           296:     set summary [toplevel .summary]
        !           297:     $gWindowMenu add command -label "Summary" -command "capaRaise $summary"
        !           298: 
        !           299:     set whoFrame [frame $summary.whoFrame -borderwidth 4 -relief groove]
        !           300:     set whichFrame [frame $summary.whichFrame -borderwidth 4 -relief groove]
        !           301:     set sortFrame [frame $summary.sortFrame]
        !           302:     set file2Frame [frame $summary.file2Frame]
        !           303:     set buttonFrame [frame $summary.buttonFrame]
        !           304:     pack $whoFrame $whichFrame $sortFrame $file2Frame $buttonFrame -side top
        !           305:     pack configure $whoFrame $whichFrame -padx 10 -pady 10
        !           306: 
        !           307:     set sectionFrame [frame $whoFrame.section]
        !           308:     set allFrame [frame $whoFrame.all]
        !           309:     pack $sectionFrame $allFrame -side top
        !           310: 
        !           311:     set gSummary(who) section
        !           312: 
        !           313:     radiobutton $sectionFrame.section -text \
        !           314: 	    "For students in default section:" -variable gSummary(who) \
        !           315: 	    -value section 
        !           316:     entry $sectionFrame.entry -textvariable gSummary(section) -width 3 
        !           317:     pack $sectionFrame.section $sectionFrame.entry -side left
        !           318: 
        !           319:     radiobutton $allFrame.all -text "For all students in the class" \
        !           320: 	    -variable gSummary(who) -value all 
        !           321:     pack $allFrame.all
        !           322: 
        !           323:     set sectionFrame [frame $whichFrame.section]
        !           324:     set allFrame [frame $whichFrame.all]
        !           325:     pack $sectionFrame $allFrame -side top
        !           326: 
        !           327:     set gSummary(which) specific
        !           328: 
        !           329:     radiobutton $sectionFrame.section -text "For set:" \
        !           330: 	    -variable gSummary(which) -value specific 
        !           331:     entry $sectionFrame.entry -textvariable gSummary(set) -width 3 
        !           332:     pack $sectionFrame.section $sectionFrame.entry -side left
        !           333: 
        !           334:     radiobutton $allFrame.all -text "For all sets up to:" -variable \
        !           335: 	    gSummary(which) -value upto 
        !           336:     entry $allFrame.entry -textvariable gSummary(set) -width 3 
        !           337:     pack $allFrame.all $allFrame.entry -side left
        !           338: 
        !           339:     set firstFrame [frame $sortFrame.firstFrame -borderwidth 4 -relief groove]
        !           340:     set secondFrame [frame $sortFrame.secondFrame -borderwidth 4 \
        !           341: 	    -relief groove]
        !           342:     pack $firstFrame $secondFrame -side left
        !           343: 
        !           344:     set gSummary(first) name
        !           345: 
        !           346:     label $firstFrame.label -text "Sorting Order - Primary"
        !           347:     radiobutton $firstFrame.name -text "Student Name" -variable \
        !           348: 	    gSummary(first) -value name
        !           349:     radiobutton $firstFrame.number -text "Student Number" -variable \
        !           350: 	    gSummary(first) -value number
        !           351:     radiobutton $firstFrame.section -text "Section" -variable \
        !           352: 	    gSummary(first) -value section
        !           353:     radiobutton $firstFrame.grade -text "Grade" -variable gSummary(first) \
        !           354: 	    -value grade
        !           355:     pack $firstFrame.label $firstFrame.name $firstFrame.number \
        !           356: 	    $firstFrame.section $firstFrame.grade -side top -anchor w
        !           357: 
        !           358:     set gSummary(second) number
        !           359: 
        !           360:     label $secondFrame.label -text "Sorting Order - Secondary"
        !           361:     radiobutton $secondFrame.name -text "Student Name" -variable \
        !           362: 	    gSummary(second) -value name
        !           363:     radiobutton $secondFrame.number -text "Student Number" -variable \
        !           364: 	    gSummary(second) -value number
        !           365:     radiobutton $secondFrame.section -text "Section" -variable \
        !           366: 	    gSummary(second) -value section
        !           367:     radiobutton $secondFrame.grade -text "Grade" -variable gSummary(second) \
        !           368: 	    -value grade
        !           369:     pack $secondFrame.label $secondFrame.name $secondFrame.number \
        !           370: 	    $secondFrame.section $secondFrame.grade -side top -anchor w
        !           371: 
        !           372:     set defaultFrame [frame $file2Frame.defaultFrame]
        !           373:     set fileFrame [frame $file2Frame.fileFrame]
        !           374:     pack $defaultFrame $fileFrame -side top
        !           375: 
        !           376:     if {[catch {set gSummary(filename)}]} { set gSummary(filename) default }
        !           377: 
        !           378:     radiobutton $defaultFrame.default -text "Grader Chooses File Name" \
        !           379: 	-variable gSummary(filename) -value default
        !           380:     pack $defaultFrame.default
        !           381: 
        !           382:     radiobutton $fileFrame.label -text "Specified Output File:" \
        !           383: 	-variable gSummary(filename) -value specified
        !           384:     set entryFrame [frame $fileFrame.entryFrame]
        !           385:     button $fileFrame.select -text "Select File" \
        !           386: 	    -command "selectOutputFile"
        !           387:     pack $fileFrame.label $entryFrame $fileFrame.select -side left
        !           388:     entry $entryFrame.entry -textvariable gSummaryFile \
        !           389: 	-xscrollcommand "$entryFrame.scroll set"
        !           390:     scrollbar $entryFrame.scroll -orient h -command \
        !           391: 	    "$entryFrame.entry xview"
        !           392:     pack $entryFrame.entry $entryFrame.scroll
        !           393:     pack configure $entryFrame.scroll -fill x
        !           394: 
        !           395:     button $buttonFrame.create -text "Create" -command \
        !           396: 	    "removeWindowEntry Summary
        !           397:              destroy $summary
        !           398:              createSummaryReport"
        !           399:     button $buttonFrame.cancel -text "Cancel" -command \
        !           400: 	    "removeWindowEntry Summary
        !           401:              destroy $summary"
        !           402:     pack $buttonFrame.create $buttonFrame.cancel -side left
        !           403: 
        !           404:     Centre_Dialog $summary default
        !           405: }
        !           406: 
        !           407: ###########################################################
        !           408: # selectOutputFile
        !           409: ###########################################################
        !           410: ###########################################################
        !           411: ###########################################################
        !           412: proc selectOutputFile {} {
        !           413:     global gSummaryFile gSummary
        !           414:     set gSummary(filename) specified
        !           415:     if { "" != [ set temp [tk_getSaveFile] ] } {set gSummaryFile $temp}
        !           416: }    
        !           417: 
        !           418: ###########################################################
        !           419: # createSummaryReport
        !           420: ###########################################################
        !           421: # creates the summary report
        !           422: ###########################################################
        !           423: # Argumnets: None
        !           424: # Returns: Nothing
        !           425: # Globals: gSummary - the report generation information is in here
        !           426: #          gClassDir - the directory the class is in
        !           427: # Files: gClassDir/ClassSet.rpt - summary report created if for the
        !           428: #                                 entire class (created)
        !           429: #       gClassDir/SecSet.rpt - summarry report created if for only a
        !           430: #                              section (created)
        !           431: ###########################################################
        !           432: proc createSummaryReport {} {
        !           433:     global gSummary gClassDir gUniqueNumber gSummaryFile
        !           434: 
        !           435:     displayStatus "Opening File" both
        !           436: 
        !           437:     switch $gSummary(who) {
        !           438: 	all
        !           439: 	{
        !           440: 	    set file [file join $gClassDir ClassSet$gSummary(set).rpt ]
        !           441: 	}
        !           442: 	section
        !           443: 	{
        !           444: 	    set file [file join $gClassDir \
        !           445: 		    Sec$gSummary(section)Set$gSummary(set).rpt ]
        !           446: 	}
        !           447: 	default
        !           448: 	{
        !           449: 	    displayError "An error has occured while creating a summary \
        !           450: 		    report $gSummary(section)"
        !           451: 	    return
        !           452: 	}
        !           453:     }
        !           454: 
        !           455:     if { $gSummary(filename) == "specified" } { set file $gSummaryFile }
        !           456:     if { $file == "" } { 
        !           457: 	removeStatus
        !           458: 	displayError "Must specify a valid filename"
        !           459: 	return
        !           460:     }
        !           461:     updateStatusMessage "Creating Summary"
        !           462: 
        !           463:     set error [ catch {createSummary $file} ]
        !           464: 
        !           465:     removeStatus
        !           466: 
        !           467:     if {!$error && "Yes" == [makeSure "Created summary file $file, would you like to see it?"]} {
        !           468: 	set fileId [open $file r]
        !           469: 	set num [incr gUniqueNumber] 
        !           470: 	set num2 [incr gUniqueNumber] 
        !           471: 	winputs $num [read $fileId]
        !           472: 	winoutput $num2 $num {}
        !           473:     }
        !           474: }
        !           475: 
        !           476: ###########################################################
        !           477: # specifyClass
        !           478: ###########################################################
        !           479: # runs tk_getOpenFile and creates the class window if a directory is chosen
        !           480: ###########################################################
        !           481: # Arguments: None
        !           482: # Returns: Nothing
        !           483: # Globals: gClassDir - remembers the directory the class is in
        !           484: ###########################################################
        !           485: proc specifyClass {} {
        !           486:     global gClassDir
        !           487: 
        !           488:     if { [winfo exists .grader] } { return }
        !           489:     set var [tk_getOpenFile -title "Please select a capa.config file" -filetypes \
        !           490: 		 { { {Capa Config} {capa.config} } }]
        !           491: 
        !           492:     if { $var != "" } {
        !           493: 	set gClassDir [file dirname $var]
        !           494: 	cd $gClassDir
        !           495:     } else {
        !           496: 	return
        !           497:     }
        !           498:     
        !           499:     createClassWindow
        !           500: }
        !           501: 
        !           502: ###########################################################
        !           503: # changeClass
        !           504: ###########################################################
        !           505: # called when the change class button is pressed, if another class
        !           506: # is chosen the class window is updated
        !           507: ###########################################################
        !           508: # Arguments: None
        !           509: # Returns: Nothing
        !           510: # Globals: gClassDir - remembers the directory the class is in
        !           511: #          gClass - just the name of the directory, and therefore 
        !           512: #                   the class
        !           513: #          gLoaded - reset to zero since we are unloading the class
        !           514: ###########################################################
        !           515: proc changeClass {} {
        !           516:     global gClassDir gClass gLoaded
        !           517: 
        !           518:     set var [tk_getOpenFile -title "Please select a capa.config file" -filetypes \
        !           519: 		 { { {Capa Config} {capa.config} } }]    
        !           520: 
        !           521:     if { $var != "" } {
        !           522: 	removeWindowEntry $gClassDir
        !           523: 	set gClassDir [file dirname $var]
        !           524: 	cd $gClassDir
        !           525: 	set gClass  [file tail $gClassDir]
        !           526:     } else {
        !           527: 	return
        !           528:     }
        !           529:     
        !           530:     set gLoaded 0
        !           531:     clearClassWindow
        !           532:     parseCapaConfig
        !           533: }
        !           534: 
        !           535: ###########################################################
        !           536: # createClassWindow
        !           537: ###########################################################
        !           538: # creates the rather complicated class window
        !           539: ###########################################################
        !           540: # Arguments: None
        !           541: # Returns: Nothing
        !           542: # Globals: gClassDir - remembers the directory the class is in
        !           543: #          gWindowMenu - the name of the window menu widget
        !           544: #          gOpenDate - the label linked var the date the set opens is in
        !           545: #          gOpenTime - the label linked var the time the set opens is in
        !           546: #          gDueDate - the label linked var the due date for the set is in
        !           547: #          gDueTime - the label linked var the due time for the set is in
        !           548: #          gAnswerDate - the label linked var the date the set answer
        !           549: #                        open date is in
        !           550: #          gAnswerTime - the label linked var the time the set answer
        !           551: #                        open time is in
        !           552: #          gSectionLoad - the current section being graded
        !           553: #          gSetLoad - the current set being graded
        !           554: #          gFindNumber - linked var that stores the string to search
        !           555: #                        through student numbers for
        !           556: #          gFindName - linked var that stores the string to search
        !           557: #                      through student names for
        !           558: #          gButtonFrame - stores the widget name of the button frame, so 
        !           559: #                         the buttons' state can be changed elsewhere
        !           560: #          gNameFrame - stores the widget name of the name entry frame, so 
        !           561: #                       the entry widget's state can be changed elsewhere
        !           562: #          gNumberFrame - stores the widget name of the number entry 
        !           563: #                         frame, so the entry widget' state can be 
        !           564: #                         changed elsewhere
        !           565: #          gStudentList - the widget name of the listbox containing the 
        !           566: #                         list of students
        !           567: #          gClass - the name of the class currently being graded
        !           568: #          gLoaded - keeps track of whether a class has been loaded yet
        !           569: #                    set to zero here
        !           570: ###########################################################
        !           571: proc createClassWindow {} {
        !           572:     global gClassDir gWindowMenu gOpenDate gOpenTime gDueDate gDueTime \
        !           573: 	    gAnswerDate gAnswerTime gSectionLoad gSetLoad gFindNumber \
        !           574: 	    gFindName gButtonFrame gNameFrame gNumberFrame gStudentList \
        !           575: 	    gClass gLoaded
        !           576: 
        !           577:     set gLoaded 0
        !           578:     
        !           579:     set grader [toplevel .grader]
        !           580:     $gWindowMenu add command -label "$gClassDir" -command "capaRaise $grader"
        !           581: 
        !           582:     set labelFrame [frame $grader.labelFrame]
        !           583:     set dataFrame [frame $grader.dataFrame]
        !           584:     set columnFrame [frame $grader.columnFrame]
        !           585:     set infoFrame [frame $grader.infoFrame]
        !           586:     pack $labelFrame $dataFrame $columnFrame $infoFrame -side top -anchor w
        !           587:     pack configure $infoFrame -expand 1 -fill both
        !           588: 
        !           589:     set gClass [file tail $gClassDir] 
        !           590:     label $labelFrame.label -background black -foreground grey85 \
        !           591: 	    -textvariable gClass -width 51
        !           592:     button $labelFrame.button -text "Change Class" -command { changeClass }
        !           593:     pack $labelFrame.label $labelFrame.button -side left
        !           594: 
        !           595:     set dateFrame [frame $dataFrame.date -relief sunken -borderwidth 2]
        !           596:     set actionsFrame [frame $dataFrame.actions ]
        !           597:     pack $dateFrame $actionsFrame -side left
        !           598: 
        !           599:     set openDateFrame [frame $dateFrame.openDate]
        !           600:     set openTimeFrame [frame $dateFrame.openTime]
        !           601:     set dueDateFrame [frame $dateFrame.dueDate]
        !           602:     set dueTimeFrame [frame $dateFrame.dueTime]
        !           603:     set answerDateFrame [frame $dateFrame.answerDate]
        !           604:     set answerTimeFrame [frame $dateFrame.answerTime]
        !           605:     pack $openDateFrame $openTimeFrame $dueDateFrame $dueTimeFrame \
        !           606: 	    $answerDateFrame $answerTimeFrame -side top
        !           607: 
        !           608:     label $openDateFrame.text -text "Open Date:" -width 13
        !           609:     label $openDateFrame.date -textvariable gOpenDate -width 10 -relief sunken \
        !           610: 	    -background white 
        !           611:     pack $openDateFrame.text $openDateFrame.date -side left
        !           612: 
        !           613:     label $openTimeFrame.text -text "Open Time:" -width 13
        !           614:     label $openTimeFrame.time -textvariable gOpenTime -width 10 -relief sunken \
        !           615: 	    -background white 
        !           616:     pack $openTimeFrame.text $openTimeFrame.time -side left
        !           617: 
        !           618:     label $dueDateFrame.text -text "Due Date:" -width 13
        !           619:     label $dueDateFrame.date -textvariable gDueDate -width 10 -relief sunken \
        !           620: 	    -background white 
        !           621:     pack $dueDateFrame.text $dueDateFrame.date -side left
        !           622: 
        !           623:     label $dueTimeFrame.text -text "Due Time:" -width 13
        !           624:     label $dueTimeFrame.time -textvariable gDueTime -width 10 -relief sunken \
        !           625: 	    -background white 
        !           626:     pack $dueTimeFrame.text $dueTimeFrame.time -side left
        !           627: 
        !           628:     label $answerDateFrame.text -text "Answer Date:" -width 13
        !           629:     label $answerDateFrame.date -textvariable gAnswerDate -width 10 -relief \
        !           630: 	    sunken -background white 
        !           631:     pack $answerDateFrame.text $answerDateFrame.date -side left
        !           632: 
        !           633:     label $answerTimeFrame.text -text "Answer Time:" -width 13
        !           634:     label $answerTimeFrame.time -textvariable gAnswerTime -width 10 -relief \
        !           635: 	    sunken -background white 
        !           636:     pack $answerTimeFrame.text $answerTimeFrame.time -side left
        !           637: 
        !           638:     set loadFrame [frame $actionsFrame.load]
        !           639:     set findFrame [frame $actionsFrame.find]
        !           640:     set buttonFrame [frame $actionsFrame.buttons]
        !           641:     set gButtonFrame $buttonFrame
        !           642:     pack $loadFrame $findFrame $buttonFrame -side top
        !           643:     pack configure $loadFrame -anchor e
        !           644: 
        !           645:     set sectionFrame [frame $loadFrame.section]
        !           646:     set setFrame [frame $loadFrame.set]
        !           647:     pack $sectionFrame $setFrame -side top -anchor w
        !           648: 
        !           649:     label $sectionFrame.label -text "    Section:"
        !           650:     entry $sectionFrame.entry -textvariable gSectionLoad -width 3
        !           651:     pack $sectionFrame.label $sectionFrame.entry -side left
        !           652: 
        !           653:     label $setFrame.label -text     "Problem Set:"
        !           654:     entry $setFrame.entry -textvariable gSetLoad -width 3
        !           655:     bind $setFrame.entry <KeyPress-Return> loadScores
        !           656:     button $setFrame.button -text "Load Scores" -command loadScores
        !           657:     pack $setFrame.label $setFrame.entry $setFrame.button -side left
        !           658:     
        !           659:     set nameFrame [frame $findFrame.name]
        !           660:     set gNameFrame $nameFrame
        !           661:     set numberFrame [frame $findFrame.number]
        !           662:     set gNumberFrame $numberFrame
        !           663:     pack $nameFrame $numberFrame -side top
        !           664: 
        !           665:     entry $nameFrame.name -textvariable gFindName
        !           666:     button $nameFrame.button -text   "Find By Name         " -command findByName
        !           667:     bind $nameFrame.name <KeyPress-Return> findByName
        !           668:     pack $nameFrame.name $nameFrame.button -side left
        !           669: 
        !           670:     entry $numberFrame.name -textvariable gFindNumber
        !           671:     button $numberFrame.button -text "Find By StudentNumber" -command findByNumber
        !           672:     bind $numberFrame.name <KeyPress-Return> findByNumber
        !           673:     pack $numberFrame.name $numberFrame.button -side left
        !           674: 
        !           675:     button $buttonFrame.report -text "Student Report" -command studentReport \
        !           676: 	    -state disabled
        !           677:     button $buttonFrame.grading -text "Grading" -command createGradingWindow \
        !           678: 	    -state disabled
        !           679:     pack $buttonFrame.report $buttonFrame.grading  -side left
        !           680: 
        !           681:     label $columnFrame.space -text "  "
        !           682:     label $columnFrame.name -text "Student Name" -width 30
        !           683:     label $columnFrame.number -text "Number" -width 11
        !           684:     message $columnFrame.score -text "Current Set Score" -aspect 250
        !           685:     message $columnFrame.pin -text "Current Pin" -aspect 200
        !           686:     pack $columnFrame.space $columnFrame.name $columnFrame.number \
        !           687: 	    $columnFrame.score $columnFrame.pin -side left
        !           688: 
        !           689:     scrollbar $infoFrame.scroll -orient vertical -command \
        !           690: 	    "$infoFrame.listbox yview"
        !           691:     set gStudentList [listbox $infoFrame.listbox -yscrollcommand \
        !           692: 	    "$infoFrame.scroll set" -height 30]
        !           693:     pack $infoFrame.scroll $infoFrame.listbox -side left
        !           694:     pack configure $infoFrame.scroll -expand false -fill y
        !           695:     pack configure $infoFrame.listbox -expand true -fill both
        !           696: 
        !           697:     Centre_Dialog $grader default
        !           698:     parseCapaConfig
        !           699: }
        !           700: 
        !           701: ###########################################################
        !           702: # clearClassWindow
        !           703: ###########################################################
        !           704: # empties the class window of all data
        !           705: ###########################################################
        !           706: # Arguments: none
        !           707: # Returns: Nothing
        !           708: # Globals: gClassDir - remembers the directory the class is in
        !           709: #          gWindowMenu - the name of the window menu widget
        !           710: #          gOpenDate - the label linked var the date the set opens is in
        !           711: #          gOpenTime - the label linked var the time the set opens is in
        !           712: #          gDueDate - the label linked var the due date for the set is in
        !           713: #          gDueTime - the label linked var the due time for the set is in
        !           714: #          gAnswerDate - the label linked var the date the set answer
        !           715: #                        open date is in
        !           716: #          gAnswerTime - the label linked var the time the set answer
        !           717: #                        open time is in
        !           718: #          gSectionLoad - the current section being graded
        !           719: #          gSetLoad - the current set being graded
        !           720: #          gStudentList - the widget name of the listbox containing the 
        !           721: #                         list of students
        !           722: #          gClass - the name of the class currently being graded
        !           723: ###########################################################
        !           724: proc clearClassWindow {} {
        !           725:     global gWindowMenu gOpenDate gOpenTime gDueDate gDueTime gAnswerDate \
        !           726: 	    gAnswerTime gStudentList gSectionLoad gSetLoad gClassDir
        !           727: 
        !           728:     $gWindowMenu add command -label "$gClassDir" -command "capaRaise .grader"
        !           729: 
        !           730:     set gOpenDate ""
        !           731:     set gOpenTime ""
        !           732:     set gDueDate ""
        !           733:     set gDueTime ""
        !           734:     set gAnswerDate ""
        !           735:     set gAnswerTime ""
        !           736:     set gSectionLoad ""
        !           737:     set gSetLoad ""
        !           738: 
        !           739:     $gStudentList delete 0 end
        !           740: }
        !           741: 
        !           742: ###########################################################
        !           743: # loadScores
        !           744: ###########################################################
        !           745: # load in a new set of scores
        !           746: ###########################################################
        !           747: # Arguments: None
        !           748: # Returns: Nothing
        !           749: # Globals: gSectionLoad - the current section being graded
        !           750: #          gSetLoad - the current set being graded
        !           751: #          gButtonFrame - stores the widget name of the button frame, so 
        !           752: #                         the buttons' state can be changed elsewhere
        !           753: #          gNameFrame - stores the widget name of the name entry frame, so 
        !           754: #                       the entry widget's state can be changed elsewhere
        !           755: #          gNumberFrame - stores the widget name of the number entry 
        !           756: #                         frame, so the entry widget' state can be 
        !           757: #                         changed elsewhere
        !           758: #          gStudentList - the widget name of the listbox containing the 
        !           759: #                         list of students
        !           760: #          gLoaded - 1 if a section has been loaded
        !           761: ###########################################################
        !           762: proc loadScores {} {
        !           763:     global gNumberFrame gNameFrame gButtonFrame gSectionLoad gSetLoad \
        !           764: 	    gStudentList gLoaded
        !           765: 
        !           766:     $gStudentList delete 0 end
        !           767: 
        !           768:     if { $gSectionLoad == "" } {
        !           769: 	displayError "The Section field must be completed before \
        !           770: 		continuing."
        !           771: 	return
        !           772:     } elseif { $gSetLoad == "" } {
        !           773: 	displayError "The Set field must be completed before \
        !           774: 		continuing."
        !           775: 	return
        !           776:     }    
        !           777: 
        !           778:     set result [getHeader]
        !           779:     switch -- $result {
        !           780: 	0 { displayError "The Set and Section selected do not appear to exist"; return }
        !           781: 	-1 { #displayMessage "No date information is available for this set" }
        !           782: 	1 { #break } 
        !           783:     }
        !           784: 
        !           785:     $gButtonFrame.report configure -state normal
        !           786:     $gButtonFrame.grading configure -state normal
        !           787: 
        !           788: ##    $gButtonFrame.log configure -state normal
        !           789: 
        !           790:     getStudents gStudentList
        !           791: 
        !           792:     set gLoaded 1
        !           793: }
        !           794: 
        !           795: ###########################################################
        !           796: # findByName
        !           797: ###########################################################
        !           798: # preforms a search for a student by name, findSection returns
        !           799: # the section the student is in, then the correct element in the
        !           800: # Student ListBox is highlighted.
        !           801: ###########################################################
        !           802: # Arguments: None
        !           803: # Returns: Nothing
        !           804: # Globals: gSectionLoad - the current section being graded
        !           805: #          gFindName - linked var that stores the string to search
        !           806: #                      through student names for
        !           807: #          gStudentList - the widget name of the listbox containing the 
        !           808: #                         list of students
        !           809: #          gLoaded - keeps track of whther scores have been loaded yet
        !           810: ###########################################################
        !           811: proc findByName {} {
        !           812:     global gFindName gFindNumber gStudentList gSectionLoad gLoaded
        !           813: 
        !           814:     fillInStudent gFindName gFindNumber 1
        !           815:     if { $gFindNumber == "" } { return }
        !           816:     set section [findSection name $gFindName]
        !           817: 
        !           818:     if { $section == "0" } { 
        !           819: 	displayError "Name not found in classl file"
        !           820: 	return 
        !           821:     }
        !           822: 
        !           823:     if { !(($gSectionLoad == $section) && $gLoaded) } {
        !           824: 	set gSectionLoad $section
        !           825: 	loadScores
        !           826:     }
        !           827: 
        !           828:     set size [$gStudentList size]
        !           829:     set search [string tolower $gFindName]
        !           830:     while { $size != 0 } {
        !           831: 	incr size -1
        !           832: 	set tempString [string tolower [$gStudentList get $size]]
        !           833: 	switch -- [string first $search $tempString] {
        !           834: 	    0
        !           835: 	    { 
        !           836: 		$gStudentList selection set $size 
        !           837: 		$gStudentList activate $size 
        !           838: 		$gStudentList see $size
        !           839: 	    }
        !           840: 	}
        !           841:     }
        !           842: }
        !           843: 
        !           844: ###########################################################
        !           845: # studentReport
        !           846: ###########################################################
        !           847: # creates a window containg a report for the current student
        !           848: ###########################################################
        !           849: # Arguments: None
        !           850: # Returns: Nothing
        !           851: # Globals: gSectionLoad - the current section being graded
        !           852: #          gStudentList - the widget name of the listbox containing the 
        !           853: #                         list of students
        !           854: #          gWindoMenu - the name of the window menu widget
        !           855: ###########################################################
        !           856: proc studentReport {} {
        !           857:     global gStudentList gSectionLoad gWindowMenu
        !           858: 
        !           859:     set string [$gStudentList get active]
        !           860: 
        !           861:     set studentNumber [string range $string 31 39]
        !           862:     
        !           863:     set text [getReportInfo $studentNumber]
        !           864: 
        !           865:     if {![winfo exists .a$studentNumber]} {
        !           866: 	set report [toplevel .a$studentNumber]
        !           867: 	$gWindowMenu add command -label "$studentNumber" -command \
        !           868: 		"capaRaise $report"	
        !           869: 	set labelFrame [frame $report.labelFrame]
        !           870: 	set textFrame [frame $report.textFrame]
        !           871: 	set buttonFrame [frame $report.buttonFrame]
        !           872: 	pack $buttonFrame $labelFrame $textFrame -side top
        !           873: 	pack configure $buttonFrame -anchor e
        !           874: 
        !           875: 	label $labelFrame.namel -text "Student Name: "
        !           876: 	label $labelFrame.namet -text [string range $string 0 30]
        !           877: 	label $labelFrame.numberl -text "Number: "
        !           878: 	label $labelFrame.numbert -text [string range $string 31 39]
        !           879: 	label $labelFrame.sectionl -text "Section: "
        !           880: 	label $labelFrame.sectiont -text $gSectionLoad
        !           881: 	pack $labelFrame.namel $labelFrame.namet $labelFrame.numberl \
        !           882: 		$labelFrame.numbert $labelFrame.sectionl $labelFrame.sectiont \
        !           883: 		-side left
        !           884: 	
        !           885: 	scrollbar $textFrame.scrollbar -orient vertical -command \
        !           886: 		"$textFrame.text yview"
        !           887: 	text $textFrame.text -yscrollcommand "$textFrame.scrollbar set" \
        !           888: 		-height 30 -width 80
        !           889: 	pack $textFrame.scrollbar $textFrame.text -side left
        !           890: 	pack configure $textFrame.scrollbar -expand false -fill y
        !           891: 	pack configure $textFrame.text -expand true -fill both
        !           892: 	
        !           893: 	button $buttonFrame.close -text "Close" -command \
        !           894: 		"destroy $report
        !           895: 	         removeWindowEntry $studentNumber"
        !           896: 	pack $buttonFrame.close
        !           897: 	Centre_Dialog $report default
        !           898:     } else {
        !           899: 	.a$studentNumber.textFrame.text delete 0.0 end 
        !           900:     }
        !           901: 
        !           902:     .a$studentNumber.textFrame.text insert end $text
        !           903:     .a$studentNumber.textFrame.text configure -state disabled
        !           904:     
        !           905: }
        !           906: 
        !           907: ###########################################################
        !           908: # findByNumber
        !           909: ###########################################################
        !           910: # finds a student based on a complete student number, once again
        !           911: # findSection finds the correct section and then it searches through the
        !           912: # list box looking for the correct student
        !           913: ###########################################################
        !           914: # Arguments: None
        !           915: # Returns: Nothing
        !           916: # Globals: gSectionLoad - the current section being graded
        !           917: #          gFindNumber - linked var that stores the string to search
        !           918: #                        through student numbers for
        !           919: #          gStudentList - the widget name of the listbox containing the 
        !           920: #                         list of students
        !           921: #          gLoaded - whether or not the data for the set/section has
        !           922: #                    actually been loaded
        !           923: ###########################################################
        !           924: proc findByNumber {} {
        !           925:     global gFindName gFindNumber gStudentList gSectionLoad gLoaded
        !           926: 
        !           927:     fillInStudent gFindName gFindNumber 0
        !           928:     if { $gFindNumber == "" } { return }
        !           929:     set section [findSection number $gFindNumber]
        !           930: 
        !           931:     if { $section == "0" } { 
        !           932: 	displayError "Name not found in classl file"
        !           933: 	return 
        !           934:     }
        !           935: 
        !           936:     if { ! (($gSectionLoad == $section ) && $gLoaded) } {
        !           937: 	set gSectionLoad $section
        !           938: 	loadScores
        !           939:     }
        !           940: 
        !           941:     set size [$gStudentList size]
        !           942:     set search [string tolower $gFindNumber]
        !           943:     while { $size != 0 } {
        !           944: 	incr size -1
        !           945: 	set tempString [string range [string tolower \
        !           946: 		[$gStudentList get $size]] 31 39]
        !           947: 	switch -- [string first $search $tempString] {
        !           948: 	    0
        !           949: 	    { 
        !           950: 		$gStudentList selection set $size 
        !           951: 		$gStudentList activate $size 
        !           952: 		$gStudentList see $size
        !           953: 	    }
        !           954: 	}
        !           955:     }
        !           956: }
        !           957: 
        !           958: ###########################################################
        !           959: # printBody
        !           960: ###########################################################
        !           961: # sends the file quiztemp.ps to the printer through lpr using
        !           962: # the option foud in gLprCommand
        !           963: ###########################################################
        !           964: # Arguments: none
        !           965: # Returns: Nothing
        !           966: # Files: /tmp/g[pid] - file containg info to print (removed)
        !           967: ###########################################################
        !           968: proc printBody { lprCommand } {
        !           969: 
        !           970:     set errorMsg ""
        !           971:     
        !           972:     set error [catch {set returnMessage [eval "exec $lprCommand"] } errorMsg ]
        !           973:     
        !           974:     exec /bin/rm -f /tmp/g[pid]
        !           975: 
        !           976:     if { $error == 1 } {
        !           977:         displayError "When attempting to print an error occured : $errorMsg"
        !           978: 	return 1
        !           979:     } else {
        !           980: 	displayMessage "Print job sent to the printer.\n $returnMessage"
        !           981:     }
        !           982:     
        !           983:     return 0
        !           984: }
        !           985: 
        !           986: ###########################################################
        !           987: # printSetSummary
        !           988: ###########################################################
        !           989: # prints a set summary for the currently grading set and section
        !           990: ###########################################################
        !           991: # Arguments: None
        !           992: # Returns: Nothing
        !           993: # Globals: gSetLoad - currently being graded set
        !           994: #          gWindowMenu - the widget name of the window menu
        !           995: #          gSectionLoad - currently being graded section
        !           996: # Files: /tmp/g[pid] - file containg info to print (created)
        !           997: ###########################################################
        !           998: proc printSetSummary {} {
        !           999:     global gSetLoad gWindowMenu gSectionLoad 
        !          1000: 
        !          1001:     if { $gSetLoad == "" } { 
        !          1002: 	displayError "Please enter a Set number."
        !          1003: 	return
        !          1004:     }
        !          1005: 
        !          1006:     if { $gSectionLoad == "" } { 
        !          1007: 	displayError "Please enter a Section number."
        !          1008: 	return
        !          1009:     }
        !          1010: 
        !          1011:     set lprCommand [getLprCommand [file join / tmp g[pid] ] ]
        !          1012:     if { $lprCommand == "" } {
        !          1013: 	displayError "Print command was empty, unable to print."
        !          1014: 	return 1
        !          1015:     }
        !          1016:     if {$lprCommand == "Cancel" } {
        !          1017: 	return 1
        !          1018:     }
        !          1019: 
        !          1020:     getSetSummary [file join / tmp g[pid]]
        !          1021: 
        !          1022:     printBody  $lprCommand
        !          1023: }
        !          1024: 
        !          1025: ###########################################################
        !          1026: # printTermSummary
        !          1027: ###########################################################
        !          1028: # creates a termsummary file and send it to the printer
        !          1029: ###########################################################
        !          1030: # Arguments: None
        !          1031: # Returns: Nothing
        !          1032: # Globals: gSetLoad - currently being graded set
        !          1033: #          gWindowMenu - the widget name of the window menu
        !          1034: #          gSectionLoad - currently being graded section
        !          1035: # Files: /tmp/g[pid] - file containg info to print (created)
        !          1036: ###########################################################
        !          1037: proc printTermSummary {} {
        !          1038:     global gSetLoad gWindowMenu gSectionLoad 
        !          1039: 
        !          1040:     if { $gSetLoad == "" } { 
        !          1041: 	displayError "Please enter a Set number."
        !          1042: 	return
        !          1043:     }
        !          1044: 
        !          1045:     if { $gSectionLoad == "" } { 
        !          1046: 	displayError "Please enter a Section number."
        !          1047: 	return
        !          1048:     }
        !          1049: 
        !          1050:     set lprCommand [getLprCommand [file join / tmp g[pid] ] ]
        !          1051:     if { $lprCommand == "" } {
        !          1052: 	displayError "Print command was empty, unable to print."
        !          1053: 	return 1
        !          1054:     }
        !          1055:     if {$lprCommand == "Cancel" } {
        !          1056: 	return 1
        !          1057:     }
        !          1058: 
        !          1059:     displayStatus "Getting Term Summary" bar
        !          1060: 
        !          1061:     getTermSummary [file join / tmp g[pid] ]
        !          1062: 
        !          1063:     removeStatus 
        !          1064: 
        !          1065:     printBody $lprCommand
        !          1066: }
        !          1067: 
        !          1068: ###########################################################
        !          1069: # createGradingWindow
        !          1070: ###########################################################
        !          1071: # create the window in which the user can change the grades in
        !          1072: ###########################################################
        !          1073: # Arguments: None
        !          1074: # Returns: Nothing
        !          1075: # Globals: gStudentList - the widget name of the list box the list
        !          1076: #                         of students is in.
        !          1077: #          gSectionLoad - currently being graded section
        !          1078: #          gWindowMenu - widget name of the window menu
        !          1079: #          gProblemText - stores the results of the parse of the set
        !          1080: #          gParseMode - stores either 1 (Both, Questions Answers) or
        !          1081: #                       2 (Answer Only)
        !          1082: #          gSetLoad - currently being graded set
        !          1083: #          gGrading - an array containg
        !          1084: #               (name) - Name of the student
        !          1085: #               (number) - student number 
        !          1086: #          gGradeCanvas - widget name of the canvas used to contain all
        !          1087: #                         of the radiobuttons when grading
        !          1088: #          gAnswer - an array containg the score for the student
        !          1089: #                ($i) - i contains the current problem number and the entry
        !          1090: #                       has one of Y, N, E, or -
        !          1091: #                (max$i) - i is the problem number, these entries exist only
        !          1092: #                          for handgraded questions, and is the maximum
        !          1093: #                          score for that question
        !          1094: #          gQuestionType - stores whether a quetion is handgraded or not
        !          1095: #                ($i) - i contains the current problem number and the entry
        !          1096: #                       has one of handGrade, or autoGrade
        !          1097: #          gParseModeButton - the text that will be displayed on
        !          1098: #                             the button that switches parse modes, 
        !          1099: #                             either "Answer Only" or 
        !          1100: #                             "Both, Questions Answers"
        !          1101: ###########################################################
        !          1102: proc createGradingWindow {} {
        !          1103:     global gStudentList gSectionLoad gWindowMenu gProblemText gParseMode \
        !          1104: 	    gSetLoad gGrading gGradeCanvas gAnswer gQuestionType \
        !          1105: 	    gParseModeButton
        !          1106: 
        !          1107:     if { [winfo exists .grading] } { 
        !          1108: 	capaRaise .grading
        !          1109: 	return 
        !          1110:     }
        !          1111:     catch {unset gAnswer}
        !          1112:     set grading [toplevel .grading]
        !          1113:     $gWindowMenu add command -label "Grading" -command "capaRaise $grading"
        !          1114: 
        !          1115:     set labelFrame [frame $grading.labelFrame]
        !          1116:     set buttonFrame [frame $grading.buttonFrame]
        !          1117:     set winFrame [frame $grading.winFrame]
        !          1118:     pack $labelFrame $buttonFrame $winFrame -side top
        !          1119:     pack configure $buttonFrame -anchor e
        !          1120: 
        !          1121:     set string [$gStudentList get active]
        !          1122:     set gGrading(name) [string range $string 0 30]
        !          1123:     set gGrading(number) [string range $string 31 39]
        !          1124:     set gGrading(parsenum) $gGrading(number)
        !          1125:     label $labelFrame.namel -text "Student Name: "
        !          1126:     label $labelFrame.namet -text $gGrading(name)
        !          1127:     label $labelFrame.numberl -text "Number: "
        !          1128:     entry $labelFrame.numbert -width 9 -textvariable gGrading(parsenum)
        !          1129:     button $labelFrame.reparse -text "Parse" -command "updateGradingWindow 0"
        !          1130:     label $labelFrame.sectionl -text "Section: "
        !          1131:     label $labelFrame.sectiont -text $gSectionLoad
        !          1132:     pack $labelFrame.namel $labelFrame.namet $labelFrame.numberl \
        !          1133: 	$labelFrame.numbert $labelFrame.reparse $labelFrame.sectionl \
        !          1134: 	$labelFrame.sectiont -side left
        !          1135: 
        !          1136:     button $buttonFrame.button -textvariable gParseModeButton \
        !          1137: 	    -command updateGradingWindow
        !          1138:     button $buttonFrame.save -text SAVE 
        !          1139:     button $buttonFrame.close -text Close -command "removeWindowEntry Grading
        !          1140:                                                    destroy $grading"
        !          1141:     pack $buttonFrame.button $buttonFrame.save $buttonFrame.close \
        !          1142: 	    -side left
        !          1143: 
        !          1144:     set assignmentFrame [frame $winFrame.assignmentFrame]
        !          1145:     set gradingFrame [frame $winFrame.gradingFrame]
        !          1146:     pack $gradingFrame $assignmentFrame -side left
        !          1147: 
        !          1148:     scrollbar $assignmentFrame.scroll -orient vertical -command \
        !          1149: 	    "$assignmentFrame.text yview"
        !          1150:     set gProblemText [text $assignmentFrame.text -yscrollcommand \
        !          1151: 	    "$assignmentFrame.scroll set" -height 44 -width 80]
        !          1152:     pack $assignmentFrame.scroll $assignmentFrame.text -side left
        !          1153:     pack configure $assignmentFrame.scroll -expand false -fill y
        !          1154:     pack configure $assignmentFrame.text -expand true -fill both
        !          1155: 
        !          1156:     set numQuestions [enscriptParse $gParseMode $gSetLoad Specific 0 \
        !          1157: 	    $gGrading(parsenum) $gGrading(name) gProblemText]
        !          1158:     
        !          1159:     $buttonFrame.save configure -command " saveGrading $numQuestions $grading "
        !          1160:     set setAllFrame [frame $gradingFrame.setallFrame ]
        !          1161:     set gradeFrame [frame $gradingFrame.gradeFrame ]
        !          1162:     pack $gradingFrame.setallFrame  $gradeFrame -side top
        !          1163: 
        !          1164:     frame $setAllFrame.space0 -width 55
        !          1165:     button $setAllFrame.dash -text "-" -padx -1 \
        !          1166: 	    -command "gradeSetAll - $numQuestions"
        !          1167:     frame $setAllFrame.space1 -width 8
        !          1168:     button $setAllFrame.y -text "y" -padx -1 \
        !          1169: 	    -command "gradeSetAll y $numQuestions"
        !          1170:     frame $setAllFrame.space2 -width 8
        !          1171:     button $setAllFrame.n -text "n" -padx -1 \
        !          1172: 	    -command "gradeSetAll n $numQuestions"
        !          1173:     frame $setAllFrame.space3 -width 8
        !          1174:     button $setAllFrame.e -text "E" -padx -1 \
        !          1175: 	    -command "gradeSetAll E $numQuestions"
        !          1176:     frame $setAllFrame.space4 -width 8
        !          1177:     label $setAllFrame.state -text "stat"
        !          1178:     label $setAllFrame.tries -text "tries"
        !          1179:     pack $setAllFrame.space0 $setAllFrame.dash \
        !          1180: 	    $setAllFrame.space1 $setAllFrame.y \
        !          1181: 	    $setAllFrame.space2 $setAllFrame.n \
        !          1182: 	    $setAllFrame.space3 $setAllFrame.e \
        !          1183: 	    $setAllFrame.space4 $setAllFrame.state \
        !          1184: 	    $setAllFrame.tries -side left
        !          1185: 
        !          1186:     scrollbar $gradeFrame.scroll -orient vertical -command \
        !          1187: 	    "$gradeFrame.canvas yview"
        !          1188:     set gGradeCanvas [canvas $gradeFrame.canvas -yscrollcommand \
        !          1189: 	    "$gradeFrame.scroll set" -height 600 -width 200]
        !          1190:     pack $gradeFrame.scroll $gGradeCanvas -side left
        !          1191:     pack configure $gradeFrame.scroll -expand false -fill y
        !          1192:     pack configure $gGradeCanvas -expand true -fill both
        !          1193: 
        !          1194:     Centre_Dialog $grading default
        !          1195: 
        !          1196:     catch {unset gAnswer}
        !          1197:     catch {unset gQuestionType}
        !          1198: 
        !          1199:     getQuestionTypes $numQuestions 
        !          1200: 
        !          1201:     set vSize 26
        !          1202:     set offset 9
        !          1203:     set todo ""
        !          1204:     for { set i 1 } { $i <= $numQuestions } { incr i } {
        !          1205: 	label $gGradeCanvas.prob$i -text "$i"
        !          1206: 	$gGradeCanvas create window 10 [expr $offset + $vSize * ($i-1)] \
        !          1207: 	    -window $gGradeCanvas.prob$i
        !          1208: 	switch $gQuestionType($i) {
        !          1209: 	    autoGrade
        !          1210: 	    {
        !          1211: 		radiobutton $gGradeCanvas.dash$i -variable gAnswer($i) \
        !          1212: 			-value -
        !          1213: 		$gGradeCanvas create window 40 [expr $offset+ $vSize * ($i-1)] -window \
        !          1214: 			$gGradeCanvas.dash$i
        !          1215: 		radiobutton $gGradeCanvas.y$i -variable gAnswer($i) -value y
        !          1216: 		$gGradeCanvas create window 64 [expr $offset+ $vSize * ($i-1)] -window \
        !          1217: 			$gGradeCanvas.y$i
        !          1218: 		radiobutton $gGradeCanvas.n$i -variable gAnswer($i) -value n
        !          1219: 		$gGradeCanvas create window 88 [expr $offset+ $vSize * ($i-1)] -window \
        !          1220: 			$gGradeCanvas.n$i
        !          1221: 		radiobutton $gGradeCanvas.e$i -variable gAnswer($i) -value E
        !          1222: 		$gGradeCanvas create window 112 [expr $offset+ $vSize * ($i-1)] -window \
        !          1223: 			$gGradeCanvas.e$i
        !          1224: 		label $gGradeCanvas.state$i -textvariable gAnswer($i)
        !          1225: 		$gGradeCanvas create window 136 [expr $offset+ $vSize * ($i-1)] -window \
        !          1226: 			$gGradeCanvas.state$i
        !          1227: 	    }
        !          1228: 	    handGrade
        !          1229: 	    {	
        !          1230: 		radiobutton $gGradeCanvas.e$i -variable gAnswer($i) -value E
        !          1231: 		$gGradeCanvas create window 112 [expr $offset+ $vSize * ($i-1)] -window \
        !          1232: 			$gGradeCanvas.e$i
        !          1233: 		scale $gGradeCanvas.hand$i -from 0 -to $gAnswer(max$i) -orient h \
        !          1234: 		    -variable gAnswer(hand$i) -showvalue 0 -length 80
        !          1235: 		$gGradeCanvas create window 60 [expr $offset+ $vSize * ($i-1)] -window \
        !          1236: 			$gGradeCanvas.hand$i
        !          1237: 		label $gGradeCanvas.current$i -textvariable gAnswer($i)
        !          1238: 		$gGradeCanvas create window 136 [expr $offset+ $vSize * ($i-1)] -window \
        !          1239: 			$gGradeCanvas.current$i
        !          1240: #		label $gGradeCanvas.max$i -textvariable gAnswer(max$i)
        !          1241: #		$gGradeCanvas create window 112 [expr $offset+ $vSize * ($i-1)] -window \
        !          1242: 		    $gGradeCanvas.max$i
        !          1243: 		trace variable gAnswer(hand$i) w handGradeExcuse
        !          1244: 		lappend todo $i
        !          1245: 	    }
        !          1246: 	}
        !          1247: 	entry $gGradeCanvas.tries$i -textvariable gAnswer($i.tries) -width 2
        !          1248: 	$gGradeCanvas create window 170 [expr $offset+ $vSize * ($i - 1)] \
        !          1249: 	    -window $gGradeCanvas.tries$i
        !          1250:     }
        !          1251:     $gGradeCanvas configure -scrollregion "0 0 150 \
        !          1252:                   [ expr ( $vSize * $numQuestions ) + $vSize ]"
        !          1253:     setupGAnswer $numQuestions
        !          1254: 
        !          1255:     foreach item $todo {
        !          1256: 	if { $gAnswer($item) != "E" && $gAnswer($item) != "-" } { 
        !          1257: 	    set gAnswer(hand$item) $gAnswer($item) 
        !          1258: 	}
        !          1259:     }
        !          1260: }
        !          1261: 
        !          1262: ###########################################################
        !          1263: # handGradeExcuse
        !          1264: ###########################################################
        !          1265: ###########################################################
        !          1266: ###########################################################
        !          1267: proc handGradeExcuse { name1 name2 op } {
        !          1268:     global gAnswer
        !          1269:     scan $name2 "hand%d" num
        !          1270:     if { $gAnswer($name2) != "E" && $gAnswer($name2) != "-" } { 
        !          1271: 	set gAnswer($num) $gAnswer($name2) 
        !          1272:     }
        !          1273: }
        !          1274: ###########################################################
        !          1275: # gradeSetAll
        !          1276: ###########################################################
        !          1277: ###########################################################
        !          1278: ###########################################################
        !          1279: proc gradeSetAll { type numQuestions } {
        !          1280:     global gAnswer gQuestionType
        !          1281:     
        !          1282:     for { set i 1 } { $i <= $numQuestions } { incr i } {
        !          1283: 	switch $gQuestionType($i) {
        !          1284: 	    autoGrade
        !          1285: 	    {
        !          1286: 		if { $gAnswer($i) != "Y" } { set gAnswer($i) $type }
        !          1287: 	    }
        !          1288: 	    handGrade
        !          1289: 	    {
        !          1290: 		switch -- $type {
        !          1291: 		    y
        !          1292: 		    { set gAnswer($i) $gAnswer(max$i) }
        !          1293: 		    n
        !          1294: 		    { set gAnswer($i) "0" }
        !          1295: 		    E
        !          1296: 		    -
        !          1297: 		    -
        !          1298: 		    { set gAnswer($i) $type }
        !          1299: 		}
        !          1300: 	    }
        !          1301: 	}
        !          1302:     }
        !          1303: }
        !          1304: 
        !          1305: ###########################################################
        !          1306: # saveGrading
        !          1307: ###########################################################
        !          1308: # saves all changes, and updates the main window
        !          1309: ###########################################################
        !          1310: # Arguments: the number of questions, and the name of the grading 
        !          1311: #            window
        !          1312: # Returns: None
        !          1313: # Globals: None
        !          1314: ###########################################################
        !          1315: proc saveGrading { numQuestions grading } {
        !          1316:     if { [makeSure "You have pressed the SAVE button, Please confirm."] != \
        !          1317: 	    "Cancel" } {
        !          1318: 	saveGAnswer $numQuestions
        !          1319: 	removeWindowEntry Grading
        !          1320: 	destroy $grading
        !          1321: 	loadScores
        !          1322:     }
        !          1323: }
        !          1324: 
        !          1325: ###########################################################
        !          1326: # updateGradingWindow
        !          1327: ###########################################################
        !          1328: # reparses the file and updates the parsemode button
        !          1329: ###########################################################
        !          1330: # Arguments: None
        !          1331: # Returns: Nothing
        !          1332: # Globals: gProblemText - stores the results of the parse of the set
        !          1333: #          gParseMode - stores either 1 (Both, Questions Answers) or
        !          1334: #                       2 (Answer Only)
        !          1335: #          gSetLoad - currently being graded set
        !          1336: #          gGrading - an array containg
        !          1337: #               (name) - Name of the student
        !          1338: #               (number) - student number 
        !          1339: #          gParseModeButton - the text that will be displayed on
        !          1340: #                             the button that switches parse modes, 
        !          1341: #                             either "Answer Only" or 
        !          1342: #                             "Both, Questions Answers"
        !          1343: ###########################################################
        !          1344: proc updateGradingWindow { { changeMode 1 } } {
        !          1345:     global gParseMode gSetLoad gGrading gProblemText gParseModeButton
        !          1346: 
        !          1347:     $gProblemText delete 0.0 end
        !          1348: 
        !          1349:     displayStatus "Updating Window . . ." message
        !          1350: 
        !          1351:     if { $changeMode } {
        !          1352: 	switch $gParseMode {
        !          1353: 	    1 { 
        !          1354: 		set gParseModeButton "Both, Questions Answers" 
        !          1355: 		set gParseMode 2
        !          1356: 	    }
        !          1357: 	    2 { 
        !          1358: 		set gParseModeButton "Answer Only" 
        !          1359: 		set gParseMode 1
        !          1360: 	    }
        !          1361: 	}
        !          1362:     }
        !          1363:     enscriptParse $gParseMode $gSetLoad Specific 0 $gGrading(parsenum) \
        !          1364: 	    $gGrading(name) gProblemText
        !          1365:     removeStatus
        !          1366: }
        !          1367: 
        !          1368: ###########################################################
        !          1369: # handGrade
        !          1370: ###########################################################
        !          1371: # creates a dialog to get the new score for a problem from the
        !          1372: # user for a hand graded question
        !          1373: ###########################################################
        !          1374: # Arguments: the number of the problem
        !          1375: # Returns: nothing
        !          1376: # Globals: gGradeCanvas - the name of the canvas widget that has all
        !          1377: #                         of the radio buttons for grading on
        !          1378: #          gNewHandGrade - the variable the new grade will be in
        !          1379: #          gAnswer - an array containg the score for the student
        !          1380: #                ($i) - i contains the current problem number and the entry
        !          1381: #                       has one of Y, N, E, or -
        !          1382: #                (max$i) - i is the problem number, these entries exist only
        !          1383: #                          for handgraded questions, and is the maximum
        !          1384: #                          score for that question
        !          1385: ###########################################################
        !          1386: proc handGrade { problemNumber } {
        !          1387:     global gGradeCanvas gNewHandGrade gAnswer
        !          1388: 
        !          1389:     set handGrade [toplevel .handGrade]
        !          1390:     
        !          1391:     set gradeFrame [frame $handGrade.gradeFrame]
        !          1392:     set buttonFrame [frame $handGrade.buttonFrame]
        !          1393:     pack $gradeFrame $buttonFrame -side top
        !          1394:     
        !          1395:     label $gradeFrame.grade -text "Grade: "
        !          1396:     entry $gradeFrame.entry -textvariable gNewHandGrade
        !          1397:     # set gNewHandGrade $gAnswer($problemNumber)
        !          1398:     
        !          1399:     set gNewHandGrade $gAnswer(max$problemNumber)
        !          1400:     
        !          1401:     label $gradeFrame.maxGrade -textvariable gAnswer(max$problemNumber)
        !          1402:     pack $gradeFrame.grade $gradeFrame.entry $gradeFrame.maxGrade -side left
        !          1403: 
        !          1404:     button $buttonFrame.cancel -text Cancel -command "set gPrompt(ok) 0"
        !          1405:     button $buttonFrame.ok -text Ok -command \
        !          1406: 	"setHandGrade $problemNumber;set gPrompt(ok) 1"
        !          1407:     pack $buttonFrame.cancel $buttonFrame.ok -side left
        !          1408:     
        !          1409:     Centre_Dialog $handGrade default
        !          1410:     capaRaise $handGrade
        !          1411:     capaGrab $handGrade
        !          1412:     vwait gPrompt(ok)
        !          1413:     capaGrab release $handGrade
        !          1414:     destroy $handGrade
        !          1415:     $gGradeCanvas.hand$problemNumber deselect
        !          1416: }
        !          1417: 
        !          1418: ###########################################################
        !          1419: # main
        !          1420: ###########################################################
        !          1421: # sets up the auto_path variable, some globals and adds some
        !          1422: # options then calls createControlWindow to give the user something
        !          1423: # to do
        !          1424: ###########################################################
        !          1425: # Arguments: None
        !          1426: # Returns: Nothing
        !          1427: # Globals: None
        !          1428: ###########################################################
        !          1429: if { [lindex $auto_path 0] == "./lib/tcl7.5" } {
        !          1430:     set auto_path ""
        !          1431:     lappend auto_path [pwd]/lib/tcl7.5
        !          1432:     lappend auto_path [pwd]/lib/tk4.1
        !          1433: }
        !          1434: 
        !          1435: lappend auto_path /usr/local/lib/CAPA45/Grader
        !          1436: lappend auto_path [pwd]
        !          1437: source gradesubjective.tcl
        !          1438: option add *font 8x13bold
        !          1439: set gUniqueNumber 1
        !          1440: createControlWindow

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>