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

1.1     ! albertel    1: ###########################################################
        !             2: # scorer.output.num file looks like this
        !             3: # classname setNum numQuest flags questiondescriptor
        !             4: # flags come in the order of CheckPIN, AnonMode, (CheckSpaces, Gone)
        !             5: #       (SurveyMode, Gone) (SurveyHeader, Gone) (IdFormat, Gone) 
        !             6: #       (CheckMultipleMarks, Gone) QueryAboutPID, (log gone)
        !             7: ###########################################################
        !             8: 
        !             9: ###########################################################
        !            10: # scorerMessage
        !            11: ###########################################################
        !            12: ###########################################################
        !            13: ###########################################################
        !            14: proc scorerMessage { num mesg {tag normal} } {
        !            15:     global gScorer
        !            16:     $gScorer(status.$num) insert end "$mesg\n" $tag
        !            17:     $gScorer(status.$num) see end
        !            18: #    update
        !            19: }
        !            20: 
        !            21: ###########################################################
        !            22: # scorerError
        !            23: ###########################################################
        !            24: ###########################################################
        !            25: ###########################################################
        !            26: proc scorerError { num errorCode args } {
        !            27:     global gScorer
        !            28:     switch $errorCode {
        !            29: 	LOTS_OF_ANON_MODE_MATCHES {
        !            30: 	    lappend gScorer(errortype.$num) $errorCode
        !            31: 	    lappend gScorer(errors.$num) [lindex $args 0]
        !            32: 	    scorerMessage $num "More than 6 Student IDs generate the closest match to the capaID specified on [lindex $args 1]'s paper" error
        !            33: 	}
        !            34: 	NO_CODE_IN_ANON_MODE {
        !            35: 	    lappend gScorer(errortype.$num) $errorCode
        !            36: 	    lappend gScorer(errors.$num) [lindex $args 0]
        !            37: 	    scorerMessage $num "There was no CapaID/CODE on [lindex $args 1]'s paper" error
        !            38: 	}
        !            39: 	NO_SUCH_STUDENT {
        !            40: 	    lappend gScorer(errortype.$num) $errorCode
        !            41: 	    lappend gScorer(errors.$num) [lindex $args 0]
        !            42: 	    scorerMessage $num "Unable to find [lindex $args 1] in classl" error
        !            43: 	}
        !            44: 	UNABLE_TO_PARSE {
        !            45: 	    lappend gScorer(errortype.$num) $errorCode
        !            46: 	    lappend gScorer(errors.$num) [lindex $args 0]
        !            47: 	    scorerMessage $num "An error occured while trying to parse the set for [lindex $args 1]'s paper" error
        !            48: 	}
        !            49: 	PINWRONG -
        !            50: 	UNKNOWN_GRADING_METHOD -
        !            51: 	CANT_OPEN_SB -
        !            52: 	CANT_UPDATE_SB -
        !            53: 	default {
        !            54: 	    displayError "$errorCode $args"
        !            55: 	}
        !            56:     }
        !            57:     incr gScorer(numerrors.$num)
        !            58:     update
        !            59: }
        !            60: 
        !            61: ###########################################################
        !            62: # runScorer
        !            63: ###########################################################
        !            64: ###########################################################
        !            65: ###########################################################
        !            66: proc runScorer { setFile } {
        !            67:     global gUniqueNumber gWindowMenu gFile gScorer
        !            68: 
        !            69:     set num [incr gUniqueNumber]
        !            70:     
        !            71:     set classDir [file dirname $setFile]
        !            72:     set gFile($num) $classDir
        !            73: #    puts "set gFile($num) to $gFile($num)"
        !            74:     set scorerWin [toplevel .beginScorer$num]
        !            75:     $gWindowMenu add command -label "ScorerConfig $classDir" \
        !            76: 	    -command "capaRaise \"$scorerWin\""
        !            77:     wm title $scorerWin $classDir
        !            78: 
        !            79:     set infoFrame [frame $scorerWin.infoFrame ]
        !            80:     set buttonFrame [frame $scorerWin.buttonFrame ]
        !            81:     set configFrame [frame $scorerWin.configFrame ]
        !            82:     pack $infoFrame $buttonFrame $configFrame -side top
        !            83: 
        !            84:     set classNameFrame [frame $infoFrame.classNameFrame]
        !            85:     set setNumFrame [frame $infoFrame.setNumFrame]
        !            86:     set scoreFileFrame [frame $infoFrame.scoreFileFrame]
        !            87:     pack $classNameFrame $setNumFrame $scoreFileFrame -side top -anchor w
        !            88: 
        !            89:     #classname
        !            90:     label $classNameFrame.label -text "Class Name:"
        !            91:     entry $classNameFrame.entry -textvariable gScorer(class.$num)\
        !            92: 	    -width 8
        !            93: #    button $classNameFrame.button -text "What Goes Here" \
        !            94: 	-command "helpScorer className"
        !            95:     pack $classNameFrame.label $classNameFrame.entry -side left
        !            96:     set gScorer(class.$num) [file tail $classDir]
        !            97: 
        !            98:     #set number
        !            99:     set gScorer(set.$num) [string range [file rootname [file tail $setFile]] 3 end]
        !           100:     label $setNumFrame.label -text "Set Number:"
        !           101:     entry $setNumFrame.set -width 2 -textvariable gScorer(set.$num)
        !           102:     pack $setNumFrame.label $setNumFrame.set -side left
        !           103: 
        !           104:     #scoring file
        !           105:     label $scoreFileFrame.label -text "Scoring Office File:"
        !           106:     set entryFrame [frame $scoreFileFrame.entryFrame]
        !           107:     button $scoreFileFrame.select -text "Select File" \
        !           108: 	    -command "selectScoringFile $num"
        !           109:     pack $scoreFileFrame.label $entryFrame $scoreFileFrame.select -side left
        !           110:     entry $entryFrame.entry -textvariable gScorer(scoreFile.$num) \
        !           111: 	    -xscrollcommand "$entryFrame.scroll set"
        !           112:     scrollbar $entryFrame.scroll -orient h -command \
        !           113: 	    "$entryFrame.entry xview"
        !           114:     pack $entryFrame.entry $entryFrame.scroll
        !           115:     pack configure $entryFrame.scroll -fill x
        !           116: 
        !           117:     #buttons
        !           118:     button $buttonFrame.cancel -text Cancel -command "destroy $scorerWin\
        !           119:                                 removeWindowEntry \"ScorerConfig $classDir\"" 
        !           120:     button $buttonFrame.continue -text "Continue" \
        !           121: 	    -command "getScorerQuest $num" 
        !           122:     button $buttonFrame.load -text "Load Previous Settings" \
        !           123: 	    -command "loadScorerConfig $num"
        !           124:     pack $buttonFrame.cancel $buttonFrame.continue $buttonFrame.load \
        !           125: 	    -side left
        !           126: 
        !           127:     #config options
        !           128:     #flag list is from scorer.h
        !           129:     foreach flaglist $gScorer(flags) {
        !           130: 	set flag [lindex $flaglist 0]
        !           131: 	set question [lindex $flaglist 1]
        !           132: 	set oneVal [lindex $flaglist 2]
        !           133: 	set zeroVal [lindex $flaglist 3]
        !           134: 	set defaultVal [lindex $flaglist 4]
        !           135: 	set frame($flag) [frame $configFrame.[string tolower $flag] \
        !           136: 		-relief groove -borderwidth 2]
        !           137: 	set gScorer($flag.frame.$num) $frame($flag)
        !           138: 	pack $frame($flag) -side top -anchor w
        !           139: 	set frame($flag.top) [frame $frame($flag).top]
        !           140: 	set frame($flag.bot) [frame $frame($flag).bot]
        !           141: 	pack $frame($flag.top) $frame($flag.bot) -side top -anchor w
        !           142: 	label $frame($flag.top).label -text "$question" -anchor w -width 70
        !           143: #	button $frame($flag.top).help -text "Huh?" -command "helpScorerFlags $flag"
        !           144:         pack $frame($flag.top).label  -side left
        !           145: 	radiobutton $frame($flag.bot).one -variable gScorer($flag.$num) \
        !           146: 		-value 1 -text $oneVal -command "configureOptions $num"
        !           147: 	radiobutton $frame($flag.bot).zero -variable gScorer($flag.$num) \
        !           148: 		-value 0 -text $zeroVal -command "configureOptions $num"
        !           149: 	set gScorer($flag.$num) $defaultVal
        !           150: 	pack $frame($flag.bot).one $frame($flag.bot).zero -side left
        !           151:     }
        !           152:     parseCapaConfig $num $gFile($num)
        !           153:     configureOptions $num
        !           154:     loadScorerConfig $num
        !           155:     Centre_Dialog $scorerWin default
        !           156: }
        !           157: 
        !           158: ###########################################################
        !           159: # loadScorerConfig
        !           160: ###########################################################
        !           161: ###########################################################
        !           162: ###########################################################
        !           163: proc loadScorerConfig { num } {
        !           164:     global gScorer gFile
        !           165:     
        !           166:     set filename [file join $gFile($num) records scorer.output.$gScorer(set.$num)]
        !           167:     if { [ catch { set fileId [ open $filename "r" ] } ] } {
        !           168: 	displayError "The set \"$gScorer(set.$num)\" does not yet have an scorer.output file. "
        !           169: 	return
        !           170:     }
        !           171:     set line [gets $fileId ]
        !           172:     close $fileId
        !           173:     set flags [lindex $line 3]
        !           174: #When uncommenting or commenting the following lines make sure to update the actual 
        !           175: #index values
        !           176:     set gScorer(CheckPIN.$num) [string index $flags 0]
        !           177:     set gScorer(AnonMode.$num) [string index $flags 1]
        !           178: #    set gScorer(CheckSpaces.$num) [string index $flags 2]
        !           179: #    set gScorer(SurveyMode.$num) [string index $flags 3]
        !           180: #    set gScorer(SurveyHeader.$num) [string index $flags 4]
        !           181: #    set gScorer(IdFormat.$num) [string index $flags 5]
        !           182: #    set gScorer(CheckMultipleMarks.$num) [string index $flags 6]
        !           183:     set gScorer(QueryAboutPID.$num) [string index $flags 2]
        !           184: #    set gScorer(Form.$num) [string index $flags 8]
        !           185: #    set gScorer(log.$num) [string index $flags 9]
        !           186:     configureOptions $num
        !           187: }
        !           188: 
        !           189: ###########################################################
        !           190: ###########################################################
        !           191: ###########################################################
        !           192: ###########################################################
        !           193: proc configureOptions { num } {
        !           194:     global gScorer
        !           195:     
        !           196:     foreach frame [array names gScorer "*.frame.$num"] {
        !           197: 	pack forget $gScorer($frame)
        !           198:     }
        !           199:     
        !           200:     #    pack $gScorer(SurveyMode.frame.$num) -side top
        !           201:     #    if { $gScorer(SurveyMode.$num) } {}
        !           202:     #       pack $gScorer(SurveyHeader.frame.$num)
        !           203:     #    {} 
        !           204:     pack $gScorer(CheckPIN.frame.$num)
        !           205:     if { $gScorer(CheckPIN.$num) } {
        !           206: 	pack $gScorer(AnonMode.frame.$num)
        !           207: 	if { $gScorer(AnonMode.$num) } {
        !           208: 	    pack $gScorer(QueryAboutPID.frame.$num)
        !           209: 	} else {
        !           210: 	    set gScorer(QueryAboutPID.$num) 0
        !           211: 	}
        !           212:     } else {
        !           213: 	set gScorer(AnonMode.$num) 0
        !           214:     }
        !           215:     #	pack $gScorer(CheckSpaces.frame.$num)
        !           216:     #	pack $gScorer(CheckMultipleMarks.frame.$num)
        !           217:     #	pack $gScorer(IdFormat.frame.$num)	
        !           218:     #    {}
        !           219:     #    pack $gScorer(Form.frame.$num)
        !           220:     #    pack $gScorer(log.frame.$num)	
        !           221: }
        !           222: 
        !           223: ###########################################################
        !           224: # selectScoringFile
        !           225: ###########################################################
        !           226: ###########################################################
        !           227: ###########################################################
        !           228: proc selectScoringFile { num } {
        !           229:     global gScorer
        !           230:     if { "" != [ set temp [tk_getOpenFile] ] } {set gScorer(scoreFile.$num) $temp}
        !           231: }    
        !           232: 
        !           233: ###########################################################
        !           234: ###########################################################
        !           235: ###########################################################
        !           236: ###########################################################
        !           237: proc helpScorerFlags { flag } {
        !           238:     global gUniqueNumber gWindowMenu
        !           239: 
        !           240:     set num [incr gUniqueNumber]
        !           241:     set helpWin [toplevel .beginScorer$num]
        !           242:     $gWindowMenu add command -label "HelpFlag $flag" \
        !           243: 	    -command "capaRaise \" $helpWin\""
        !           244:     wm title $helpWin $flag
        !           245:     
        !           246:     button $helpWin.dismiss -text Dismiss -command "destroy $helpWin"
        !           247:     message $helpWin.help -aspect 2000
        !           248:     set help ""
        !           249:     switch $flag {
        !           250: #	SurveyMode 	   { set help "An examination will include the student number on  the answer sheet of the student who answered the questions, whereas a survey will have no student number at all." } 
        !           251: #	SurveyHeader       { set help "If the Survey given include a header portion this will let ."}
        !           252: 	CheckPIN           { set help "bluh" }
        !           253: 	AnonMode           { set help "bluh" }
        !           254: 	QueryAboutPID      { set help "bluh" }
        !           255: #	CheckSpaces        { set help "bluh" }
        !           256: #	CheckMultipleMarks { set help "bluh" }
        !           257: #	IdFormat           { set help "bluh" }
        !           258: #       Form               { set help "bluh" }
        !           259: #	log                { set help "bluh" }
        !           260:     }
        !           261:     $helpWin.help configure -text "$help"
        !           262:     pack $helpWin.dismiss $helpWin.help
        !           263:     Centre_Dialog $helpWin default
        !           264: }
        !           265: 
        !           266: ###########################################################
        !           267: # getScorerQuest
        !           268: ###########################################################
        !           269: ###########################################################
        !           270: ###########################################################
        !           271: proc getScorerQuest { num } {
        !           272:     global gUniqueNumber gWindowMenu gFile gScorer
        !           273: 
        !           274:     if { ![file readable $gScorer(scoreFile.$num)] } {
        !           275: 	displayMessage "Please Select a readable scoring office report file before continuing."
        !           276: 	return
        !           277:     }
        !           278: 
        !           279:     set classDir $gFile($num) 
        !           280: 
        !           281:     set scorerWin ".beginScorer$num"
        !           282: 
        !           283:     set infoFrame  $scorerWin.infoFrame 
        !           284:     set buttonFrame $scorerWin.buttonFrame
        !           285:     set configFrame $scorerWin.configFrame
        !           286:     set classNameFrame $infoFrame.classNameFrame
        !           287:     set setNumFrame $infoFrame.setNumFrame
        !           288:     set scoreFileFrame $infoFrame.scoreFileFrame
        !           289:     set entryFrame $scoreFileFrame.entryFrame
        !           290: 
        !           291:     destroy $configFrame 
        !           292:     pack [frame $configFrame] 
        !           293: 
        !           294:     destroy $scoreFileFrame.select
        !           295:     $entryFrame.entry configure -state disabled
        !           296:     $classNameFrame.entry configure -state disabled
        !           297:     $setNumFrame.set configure -state disabled
        !           298: 
        !           299:     #disabeling the config options
        !           300:     set classNameFrame $infoFrame.classNameFrame
        !           301:     set setNumFrame $infoFrame.setNumFrame
        !           302:     $classNameFrame.entry configure -state disabled
        !           303:     $setNumFrame.set configure -state disabled
        !           304: 
        !           305:     $buttonFrame.continue configure -command "startScorer $num" 
        !           306:     $buttonFrame.load configure -command "loadScorerQuest $num"
        !           307:     
        !           308:     #question
        !           309:     set questButFrame [ frame $configFrame.butFrame ]
        !           310:     set questLabelFrame [frame $configFrame.label ]
        !           311:     set questListFrame [ frame $configFrame.listFrame ]
        !           312:     pack $questButFrame $questLabelFrame $questListFrame 
        !           313:     pack configure $questLabelFrame -anchor w 
        !           314:   
        !           315:     button $questButFrame.add -text "Add"  -command "addScorerQuest $num"
        !           316:     button $questButFrame.clone -text "Clone" -command "cloneScorerQuest $num"
        !           317:     button $questButFrame.rm -text "Remove" -command "rmScorerQuest $num"
        !           318:     button $questButFrame.change -text "Change" -command "changeScorerQuest $num"
        !           319:     pack $questButFrame.add $questButFrame.clone $questButFrame.rm \
        !           320: 	    $questButFrame.change -side left
        !           321: 
        !           322:     label $questLabelFrame.label -text "Num  Type             Points  Leafs"
        !           323:     pack $questLabelFrame.label
        !           324: 
        !           325:     #listbox
        !           326:     set gScorer(questNum.$num) [ listbox $questListFrame.questNum \
        !           327: 				     -width 3 -height 20 \
        !           328: 				     -yscrollcommand "$questListFrame.scroll set" ]
        !           329:     set gScorer(quest.$num) [ listbox $questListFrame.quest -width 50 -height 20 \
        !           330: 	    -yscrollcommand "$questListFrame.scroll set"]
        !           331:     scrollbar $questListFrame.scroll -orient v -command \
        !           332: 	"scrolltwo \"$questListFrame.quest yview\" \"$questListFrame.questNum yview\""
        !           333:     pack  $questListFrame.scroll $questListFrame.quest  \
        !           334: 	$questListFrame.questNum  -side right
        !           335:     pack configure $questListFrame.scroll -fill y
        !           336:     loadScorerQuest $num
        !           337:     update idletasks
        !           338:     Centre_Dialog $scorerWin default
        !           339: }
        !           340: 
        !           341: ###########################################################
        !           342: # configQuestWin
        !           343: ###########################################################
        !           344: ###########################################################
        !           345: ###########################################################
        !           346: proc configQuestWin { num action {message ""} {max 1} } {
        !           347:     global gScorer
        !           348: 
        !           349:     if { ![winfo exists .scorerQuestWin$num] } { return }    
        !           350:     set frame .scorerQuestWin$num.add.leaf
        !           351:     
        !           352:     switch $action {
        !           353: 	hide 
        !           354: 	{ pack forget $frame }
        !           355: 	show
        !           356: 	{
        !           357: 	    pack $frame
        !           358: 	    $frame.leafs configure -label $message
        !           359: 	    $frame.leafs configure -to $max
        !           360: 	}
        !           361:     }
        !           362: }
        !           363: 
        !           364: 
        !           365: ###########################################################
        !           366: # renumberScorerQuest
        !           367: ###########################################################
        !           368: ###########################################################
        !           369: ###########################################################
        !           370: proc renumberScorerQuest { num } {
        !           371:     global gScorer
        !           372:     $gScorer(questNum.$num) delete 0 end
        !           373:     set max [$gScorer(quest.$num) index end ]
        !           374:     for { set i 1 } { $i <= $max } { incr i } {
        !           375: 	lappend numList $i
        !           376:     }
        !           377:     eval "$gScorer(questNum.$num) insert 0 $numList"
        !           378:     $gScorer(questNum.$num) yview [ $gScorer(quest.$num) nearest 5 ]
        !           379: }
        !           380: 
        !           381: ###########################################################
        !           382: # insertQuest
        !           383: ###########################################################
        !           384: ###########################################################
        !           385: ###########################################################
        !           386: proc insertQuest { num where } {
        !           387:     global gScorer
        !           388: 
        !           389:     if { $where != "end" } { $gScorer(quest.$num) delete $where }
        !           390:     switch $gScorer(questType.$num) {
        !           391: 	ONE_OUT_OF_10
        !           392: 	-
        !           393: 	ASSIGNED
        !           394: 	-
        !           395: 	SINGLE_DIGIT
        !           396: 	-
        !           397: 	STRING_MATCH
        !           398: 	{
        !           399: 	    $gScorer(quest.$num) insert $where [format "%-13s %7s" \
        !           400: 		    $gScorer(questType.$num) $gScorer(questPoint.$num)]
        !           401: 	}
        !           402: 	GLE
        !           403: 	-
        !           404: 	TF
        !           405: 	-
        !           406: 	N_OUT_OF_M
        !           407: 	{
        !           408: 	    $gScorer(quest.$num) insert $where [format "%-13s %7s %6s" \
        !           409: 		    $gScorer(questType.$num) $gScorer(questPoint.$num) \
        !           410: 		    $gScorer(questLeaf.$num)]
        !           411: 	}
        !           412:     }
        !           413:     renumberScorerQuest $num
        !           414: }
        !           415: 
        !           416: ###########################################################
        !           417: # addScorerQuest
        !           418: ###########################################################
        !           419: ###########################################################
        !           420: ###########################################################
        !           421: proc addScorerQuest { num {position end} } {
        !           422:     global gUniqueNumber gWindowMenu gFile gScorer
        !           423: 
        !           424:     if { [winfo exists .scorerQuestWin$num] } { return }    
        !           425:     set questWin [ toplevel .scorerQuestWin$num ]
        !           426: 
        !           427:     if { ! [ info exists gScorer(questType.$num) ] } {
        !           428: 	set gScorer(questType.$num) ONE_OUT_OF_10
        !           429:     }
        !           430: 
        !           431:     set buttonFrame [ frame $questWin.button ]
        !           432:     set optionFrame [ frame $questWin.add ]
        !           433:     pack $buttonFrame $optionFrame -side top
        !           434: 
        !           435:     set text Change
        !           436:     if { $position == "end" } { 
        !           437: 	set text Add
        !           438:     } 
        !           439:     button $buttonFrame.done -text $text -command "insertQuest $num $position
        !           440:                                                    destroy $questWin"
        !           441:     button $buttonFrame.cancel -text "Cancel" -command "destroy $questWin"
        !           442:     pack $buttonFrame.done $buttonFrame.cancel -side left
        !           443: 
        !           444:     set typeFrame [ frame $optionFrame.type ]
        !           445:     set pointFrame [ frame $optionFrame.point ]
        !           446:     set leafFrame [ frame $optionFrame.leaf ]
        !           447:     pack $typeFrame $pointFrame $leafFrame -side top
        !           448: 
        !           449:     radiobutton $typeFrame.oneoutof8 -text "One out of no more than 10" -value "ONE_OUT_OF_10" \
        !           450: 	-variable gScorer(questType.$num) -command "configQuestWin $num hide" 
        !           451:     radiobutton $typeFrame.gletype -text "GLE type" -value "GLE" \
        !           452: 	-variable gScorer(questType.$num) \
        !           453: 	-command "configQuestWin $num show \"Number of Leafs\" 3 " 
        !           454:     radiobutton $typeFrame.tftype -text "TF type" -value "TF" \
        !           455: 	-variable gScorer(questType.$num) \
        !           456: 	-command "configQuestWin $num show \"Number of Leafs\" 5 "
        !           457:     radiobutton $typeFrame.assigned -text "Assigned score" -value "ASSIGNED" \
        !           458: 	-variable gScorer(questType.$num) -command "configQuestWin $num hide " 
        !           459:     radiobutton $typeFrame.noutofm -text "N out of M" -value "N_OUT_OF_M" \
        !           460: 	-variable gScorer(questType.$num) \
        !           461: 	-command "configQuestWin $num show \"What is the value of M\" 10 " 
        !           462:     radiobutton $typeFrame.singledigit -text "Single digit" -value "SINGLE_DIGIT" \
        !           463: 	-variable gScorer(questType.$num) -command "configQuestWin $num hide" 
        !           464:     radiobutton $typeFrame.exactstring -text "Exact string matching" \
        !           465: 	-value "STRING_MATCH" -variable gScorer(questType.$num) \
        !           466: 	-command "configQuestWin $num hide"
        !           467:     pack $typeFrame.oneoutof8 $typeFrame.gletype $typeFrame.tftype \
        !           468: 	$typeFrame.assigned $typeFrame.noutofm $typeFrame.singledigit  \
        !           469: 	$typeFrame.exactstring -side top -anchor w
        !           470: 
        !           471:     scale $pointFrame.points -from 0 -to 9 -variable gScorer(questPoint.$num) \
        !           472: 	-label "Point Value" -orient h -length 300
        !           473:     pack $pointFrame.points
        !           474: 
        !           475:     scale $leafFrame.leafs -from 1 -to 10 -variable gScorer(questLeaf.$num) \
        !           476: 	-label "Number of Leafs" -orient h -length 300
        !           477:     pack $leafFrame.leafs
        !           478:     
        !           479:     switch $gScorer(questType.$num) {
        !           480: 	ONE_OUT_OF_10
        !           481: 	-
        !           482: 	ASSIGNED
        !           483: 	-
        !           484: 	SINGLE_DIGIT
        !           485: 	-
        !           486: 	STRING_MATCH { configQuestWin $num hide }
        !           487: 	GLE { configQuestWin $num show "Number of Leafs" 3 }
        !           488: 	TF { configQuestWin $num show "Number of Leafs" 5 }
        !           489: 	N_OUT_OF_M { configQuestWin $num show "What is the value of M" 10 }
        !           490:     }
        !           491:     Centre_Dialog $questWin default
        !           492: }
        !           493: 
        !           494: ###########################################################
        !           495: # cloneScorerQuest
        !           496: ###########################################################
        !           497: ###########################################################
        !           498: ###########################################################
        !           499: proc cloneScorerQuest { num } {
        !           500:     global gUniqueNumber gWindowMenu gFile gScorer
        !           501: 
        !           502:     if { [ $gScorer(quest.$num) curselection ] == "" } { 
        !           503: 	displayError "Please select an exisiting question to clone."
        !           504: 	return
        !           505:     }
        !           506:     
        !           507:     set temp [ $gScorer(quest.$num) get [ $gScorer(quest.$num) curselection ] ]
        !           508:     $gScorer(quest.$num) insert end $temp
        !           509:     renumberScorerQuest $num
        !           510: }
        !           511: 
        !           512: ###########################################################
        !           513: # rmScorerQuest
        !           514: ###########################################################
        !           515: ###########################################################
        !           516: ###########################################################
        !           517: proc rmScorerQuest { num } {
        !           518:     global gUniqueNumber gWindowMenu gFile gScorer
        !           519: 
        !           520:     if { [winfo exists .scorerQuestWin$num] } { return }    
        !           521:     if { [ $gScorer(quest.$num) curselection ] == "" } { 
        !           522: 	displayError "Please select an exisiting question to delete."
        !           523: 	return
        !           524:     }
        !           525:     $gScorer(quest.$num) delete [$gScorer(quest.$num) curselection]
        !           526:     renumberScorerQuest $num
        !           527: }
        !           528: 
        !           529: ###########################################################
        !           530: # changeScorerQuest
        !           531: ###########################################################
        !           532: ###########################################################
        !           533: ###########################################################
        !           534: proc changeScorerQuest { num } {
        !           535:     global gUniqueNumber gWindowMenu gFile gScorer
        !           536: 
        !           537:     if { [winfo exists .scorerQuestWin$num] } { return }    
        !           538:     if { [ $gScorer(quest.$num) curselection ] == "" } { 
        !           539: 	displayError "Please select an exisiting question to change."
        !           540: 	return
        !           541:     }
        !           542:     
        !           543:     set position [ $gScorer(quest.$num) curselection ]
        !           544:     set gScorer(questType.$num) [lindex [$gScorer(quest.$num) get $position ] 0 ]
        !           545:     set gScorer(questPoint.$num) [lindex [$gScorer(quest.$num) get $position ] 1 ]
        !           546:     set gScorer(questLeaf.$num) [lindex [$gScorer(quest.$num) get $position ] 2 ]
        !           547:     addScorerQuest $num $position
        !           548: }
        !           549: 
        !           550: ###########################################################
        !           551: # startScorer
        !           552: ###########################################################
        !           553: ###########################################################
        !           554: ###########################################################
        !           555: proc startScorer { num } {
        !           556:     global gScorer gFile
        !           557:     
        !           558:     set scorerWin .beginScorer$num
        !           559: 
        !           560:     set filename [file join $gFile($num) records scorer.output.$gScorer(set.$num)]
        !           561:     if { [ catch { set fileId [ open $filename "w+" ] } ] } {
        !           562: 	displayError "Unable to write to the scorer.output file. "
        !           563: 	return
        !           564:     }
        !           565: #When deleting or adding anything to the flags var make sure to update loadScorerConfig
        !           566: #    set flags $gScorer(CheckPIN.$num)$gScorer(AnonMode.$num)$gScorer(CheckSpaces.$num)$gScorer(SurveyMode.$num)$gScorer(SurveyHeader.$num)$gScorer(IdFormat.$num)$gScorer(CheckMultipleMarks.$num)$gScorer(QueryAboutPID.$num)$gScorer(Form.$num)$gScorer(log.$num)
        !           567:     set flags $gScorer(CheckPIN.$num)$gScorer(AnonMode.$num)$gScorer(QueryAboutPID.$num)
        !           568:     set numQuestion [ $gScorer(quest.$num) index end ]
        !           569:     set questString ""
        !           570:     for { set i 0 } { $i < $numQuestion } { incr i } {
        !           571: 	set line [ $gScorer(quest.$num) get $i ]
        !           572: 	set gScorer(quest.$i.type.$num) [lindex $line 0]
        !           573: 	switch [lindex $line 0 ] {
        !           574: 	    ONE_OUT_OF_10 { append questString a }
        !           575: 	    GLE { append questString b }
        !           576: 	    TF { append questString c }
        !           577: 	    ASSIGNED { append questString d }
        !           578: 	    N_OUT_OF_M { append questString e }
        !           579: 	    SINGLE_DIGIT { append questString f }
        !           580: 	    STRING_MATCH { append questString g }
        !           581: 	}
        !           582: 	append questString [lindex $line 1]
        !           583: 	set gScorer(quest.$i.points.$num) [lindex $line 1]
        !           584: 	if { [ lindex $line 2 ] == "" } {
        !           585: 	    set gScorer(quest.$i.leafs.$num) 1
        !           586: 	    append questString 1
        !           587: 	} else {
        !           588: 	    set gScorer(quest.$i.leafs.$num) [lindex $line 2]
        !           589: 	    append questString [lindex $line 2] 
        !           590: 	}
        !           591:     }
        !           592:     set outputLine "$gScorer(class.$num) $gScorer(set.$num) $numQuestion $flags $questString"
        !           593:     puts $fileId [format "%-500s" $outputLine]
        !           594:     close $fileId
        !           595:     destroy $scorerWin.buttonFrame
        !           596:     destroy $scorerWin.configFrame
        !           597: 
        !           598:     set gScorer(student.$num) 0
        !           599:     set gScorer(numerrors.$num) 0
        !           600: 
        !           601:     set buttonFrame [frame $scorerWin.buttonFrame]
        !           602:     set statusFrame [frame $scorerWin.statusFrame]
        !           603:     pack $buttonFrame $statusFrame
        !           604: 
        !           605:     button $buttonFrame.pause -text Pause -command "pauseScorer $num"
        !           606:     button $buttonFrame.cont -text Continue -command "unpauseScorer $num"
        !           607:     button $buttonFrame.restart -text Restart -command "restartScorer $num"
        !           608:     button $buttonFrame.final -text "Update .sb" -command "scorerToSet $num"
        !           609:     button $buttonFrame.exit -text "Quit" -command "scorerQuit $num"
        !           610:     pack $buttonFrame.pause $buttonFrame.cont $buttonFrame.restart \
        !           611: 	$buttonFrame.final $buttonFrame.exit -side left
        !           612: 
        !           613:    
        !           614:     message $statusFrame.mesg -text "Messages:" -aspect 2000
        !           615:     set statusText [frame $statusFrame.statusText]
        !           616:     set student [frame $statusFrame.student]
        !           617:     set errors [frame $statusFrame.errors]
        !           618:     set statusButtons [frame $statusFrame.button]
        !           619:     pack $statusFrame.mesg $statusFrame.statusText $statusFrame.student \
        !           620: 	$statusFrame.errors $statusFrame.button
        !           621:     pack configure $statusFrame.mesg $statusFrame.student $statusFrame.errors \
        !           622: 	-anchor w 
        !           623:     pack configure $statusText -expand 1 -fill both
        !           624:     
        !           625:     set gScorer(status.$num) [text $statusText.text -wrap char \
        !           626: 				  -yscrollcommand "$statusText.scroll set"]
        !           627:     $gScorer(status.$num) tag configure error -foreground red
        !           628:     $gScorer(status.$num) tag configure info -foreground #006c00
        !           629: 
        !           630:     scrollbar $statusText.scroll -orient v -command "$statusText.text yview"
        !           631:     pack $statusText.text $statusText.scroll -side left
        !           632:     pack configure $statusText.scroll -fill y
        !           633:     pack configure $gScorer(status.$num) -expand 1 -fill both
        !           634: 
        !           635:     label $student.mesg -text "Students completed:"
        !           636:     label $student.num -textvariable gScorer(student.$num)
        !           637:     pack $student.mesg $student.num -side left
        !           638: 
        !           639:     label $errors.mesg -text "Errors To Be Handled:"
        !           640:     label $errors.num -textvariable gScorer(numerrors.$num)
        !           641:     pack $errors.mesg $errors.num -side left
        !           642:     
        !           643:     button $statusButtons.handleErrors -text "Handle Errors" \
        !           644: 	-command "handleErrorsScorer $num"
        !           645:     button $statusButtons.printMsg -text "Print Messages" \
        !           646: 	-command "printScorerMsg $num"
        !           647:     button $statusButtons.saveMsg -text "Save Messages" \
        !           648: 	-command "saveScorerMsg $num"
        !           649:     button $statusButtons.clearMsg -text "Clear Messages" \
        !           650: 	-command "clearScorerMsg $num"
        !           651:     pack $statusButtons.handleErrors $statusButtons.printMsg \
        !           652: 	$statusButtons.saveMsg -side left
        !           653: 
        !           654:     wm protocol $scorerWin WM_DELETE_WINDOW "usequit $num"
        !           655:     update idletasks 
        !           656:     Centre_Dialog $scorerWin default
        !           657: #    set gScorer(quit.$num) 0
        !           658:     restartScorer $num
        !           659: }
        !           660: 
        !           661: ###########################################################
        !           662: # usequit
        !           663: ###########################################################
        !           664: ###########################################################
        !           665: ###########################################################
        !           666: proc usequit { num } { scorerMessage $num "Please use the Quit Button." info }
        !           667: 
        !           668: ###########################################################
        !           669: # saveScorerMsg
        !           670: ###########################################################
        !           671: ###########################################################
        !           672: ###########################################################
        !           673: proc saveScorerMsg { num } {
        !           674:     global gScorer
        !           675: 
        !           676:     set file [tk_getSaveFile -title "Enter the name to save messages to."]
        !           677:     if { $file == "" } { return }
        !           678:     if { [catch {set fileId [open $file "w"] } ] } { 
        !           679: 	displayError "Unable to open $file"
        !           680: 	return 
        !           681:     }
        !           682:     set tag [getWhichTags "All {Errors Only} {NonErrors Only}" "{} error normal" "saved"]
        !           683:     puts -nonewline $fileId [getTextTagged $gScorer(status.$num) $tag ]
        !           684:     close $fileId
        !           685: }
        !           686: 
        !           687: ###########################################################
        !           688: # printScorerMsg
        !           689: ###########################################################
        !           690: ###########################################################
        !           691: ###########################################################
        !           692: proc printScorerMsg { num } {
        !           693:     global gScorer gFile
        !           694: 
        !           695:     set file [file join $gFile($num) managertemp.txt]
        !           696:     set lprCommand [getLprCommand $file $num]
        !           697:     if  { $lprCommand == "Cancel" } { return }
        !           698:     if { [catch {set fileId [open $file "w"] } ] } { 
        !           699: 	displayError "Unable to open $file"
        !           700: 	return 
        !           701:     }
        !           702:     set tag [getWhichTags "All {Errors Only} {NonErrors Only}" "{} error normal" printed]
        !           703:     puts -nonewline $fileId [getTextTagged $gScorer(status.$num) $tag ]
        !           704:     close $fileId
        !           705:     set errorMsg ""
        !           706:     set error [catch {set output [ eval "exec $lprCommand" ] } errorMsg ]
        !           707:     exec rm -f $file
        !           708:     if { $error == 1 } {
        !           709:         displayError "An error occurred while printing: $errorMsg"
        !           710:     } else {
        !           711: 	displayMessage "Print job sent to the printer.\n $output"
        !           712:     }
        !           713: }
        !           714: 
        !           715: ###########################################################
        !           716: # initScorer
        !           717: ###########################################################
        !           718: ###########################################################
        !           719: ###########################################################
        !           720: proc initScorer { num } {
        !           721:     global gScorer gFile
        !           722:     
        !           723:     scorerMessage $num "Initializing. . ."
        !           724: 
        !           725:     if { ![info exists gScorer(in.$num)] || ( $gScorer(in.$num) == "" ) } {
        !           726: 	if { [catch {set gScorer(in.$num) \
        !           727: 			 [ open $gScorer(scoreFile.$num) "r" ] } ] } {
        !           728: 	    displayError "Unable to open input file $gScorer(scoreFile.$num)"
        !           729: 	    exit
        !           730: 	} 
        !           731:     }
        !           732: 
        !           733:     set filename [file join $gFile($num) records scorer.output.$gScorer(set.$num)]
        !           734:     if { ![info exists gScorer(out.$num)] || ( $gScorer(out.$num) == "" ) } {
        !           735: 	if { [catch {set gScorer(out.$num) [ open $filename "a+" ] } ] } {
        !           736: 	    displayError "Unable to open input file $filename"	    
        !           737: 	    exit
        !           738: 	}
        !           739:     }
        !           740: 
        !           741:     scorerMessage $num "Building List of Students. . ." 
        !           742:     update
        !           743:     set oldDir [pwd]
        !           744:     cd $gFile($num)
        !           745:     
        !           746: #4 is the length of the CapaID
        !           747:     set a $gScorer(HalfSheet.CapaID)
        !           748:     set capaidplus [expr {[lindex $a 1] - [lindex $a 0] - 3}]
        !           749: #    puts "$capaidplus, $a"
        !           750:     set gScorer(studentList.$num) [buildStudentList $num $gScorer(class.$num) \
        !           751: 				       $gScorer(set.$num) $capaidplus]
        !           752:     cd $oldDir
        !           753: }
        !           754: 
        !           755: ###########################################################
        !           756: # getLine
        !           757: ###########################################################
        !           758: ###########################################################
        !           759: ###########################################################
        !           760: proc getLine { num } {
        !           761:     global gScorer
        !           762:     
        !           763:     scorerMessage $num "Getting Responses"
        !           764: 
        !           765:     set done 0
        !           766:     while { ! $done } {
        !           767: 	gets $gScorer(in.$num) aline
        !           768: 	if { [eof $gScorer(in.$num) ] } { error EOF }
        !           769: 	if { ![string match "#*" $aline] } {
        !           770: 	    set done 1
        !           771: 	}
        !           772:     }
        !           773:     return $aline
        !           774: }
        !           775: 
        !           776: ###########################################################
        !           777: # oneResponse
        !           778: ###########################################################
        !           779: ###########################################################
        !           780: ###########################################################
        !           781: proc oneResponse { response max which } {
        !           782:     upvar $which whichVar
        !           783:     set whichVar ""
        !           784:     set howmany 0
        !           785:     for { set i 0 } { $i < $max } { incr i } {
        !           786: 	if { [string index "$response" $i] == "1" } {
        !           787: 	    lappend whichVar $i
        !           788: 	    incr howmany
        !           789: 	}
        !           790:     }
        !           791:     return $howmany
        !           792: }
        !           793: ###########################################################
        !           794: # parseLine
        !           795: ###########################################################
        !           796: ###########################################################
        !           797: ###########################################################
        !           798: proc parseLine { num answerLine answerStruct } {
        !           799:     global gScorer
        !           800:     upvar $answerStruct parsedIn
        !           801:     set result ""
        !           802: 
        !           803:     scorerMessage $num "Understanding Responses"
        !           804: 
        !           805: # Only support HalfSheets
        !           806: #    if { $gScorer(Form.$num) } {
        !           807: #	set sheet FullSheet
        !           808: #    } else {
        !           809: #	set sheet HalfSheet 
        !           810: #    }
        !           811:     set sheet HalfSheet
        !           812: 
        !           813:     set parsedIn(orignalLine) "$answerLine"
        !           814:     foreach type { SerialNumber LastName FirstName MiddleInitial
        !           815: 	StudentNumber Section CapaID } {
        !           816: 	if { [ catch {set parsedIn($type) [string range "$answerLine" \
        !           817: 					   [lindex $gScorer($sheet.$type) 0] \
        !           818: 					   [lindex $gScorer($sheet.$type) 1] ] } ] } {
        !           819: 	    set parsedIn($type) ""
        !           820: 	}
        !           821:     }
        !           822:     set letter "ABCDEFGHIJ"
        !           823:     set number "1234567890"
        !           824:     set offset   [lindex $gScorer($sheet.Question) 0]
        !           825:     set maxQuest [lindex $gScorer($sheet.Question) 1]
        !           826:     set perQuest [lindex $gScorer($sheet.Question) 2]
        !           827:     set parsedIn(multiplemarks) 0
        !           828:     set parsedIn(spaces) 0
        !           829:     for { set i 0 } { $i < $maxQuest } { incr i } {
        !           830: 	if { [ catch { set gScorer(quest.$i.type.$num) } ] } {
        !           831: 	    set parsedIn(maxQuest) $i
        !           832: 	    set gScorer(numQuest.$num) $i
        !           833: 	    break
        !           834: 	}
        !           835: 	set array $letter
        !           836: 	set start [expr $i * $perQuest + $offset ]
        !           837: 	set stop [expr $start + $perQuest - 1 ]
        !           838: 	set response [string range "$answerLine" $start $stop]
        !           839: 	switch $gScorer(quest.$i.type.$num) {
        !           840: 	    ASSIGNED -
        !           841: 	    SINGLE_DIGIT -
        !           842: 	    ONE_OUT_OF_10 {
        !           843: 		if { $gScorer(quest.$i.type.$num) != "ONE_OUT_OF_10" } {
        !           844: 		    set array $number
        !           845: 		}
        !           846: 		set howmany [oneResponse "$response" $perQuest which]
        !           847: 		if { $howmany == 1 } {
        !           848: 		    set parsedIn(answer.$i) [string index $array $which]
        !           849: 		} else {
        !           850: 		    if { $howmany > 1 } { 
        !           851: 			set parsedIn(answer.$i) " "
        !           852: 			incr parsedIn(multiplemarks)
        !           853: 		    } else {
        !           854: 			if { $howmany < 1 } { 
        !           855: 			    set parsedIn(answer.$i) " "
        !           856: 			    incr parsedIn(spaces)
        !           857: 			}
        !           858: 		    }
        !           859: 		}
        !           860: 	    }
        !           861: 	    GLE -
        !           862: 	    TF {
        !           863: 		if { $gScorer(quest.$i.type.$num) != "GLE" } {
        !           864: 		    set stepsize 2
        !           865: 		} else {
        !           866: 		    set stepsize 3
        !           867: 		}
        !           868: 		set leafs $gScorer(quest.$i.leafs.$num)
        !           869: 		for { set j 0 } { $j < $leafs } { incr j } {
        !           870: 		    set start [expr $j*$stepsize]
        !           871: 		    set stop  [expr $start + $stepsize - 1]
        !           872: 		    set howmany [oneResponse [string range \
        !           873:                         $response $start $stop] $perQuest which]
        !           874: 		    if { $howmany == 1 } {
        !           875: 			append parsedIn(answer.$i) [string index $array \
        !           876: 							[expr {$start + $which}]]
        !           877: 		    } else {
        !           878: 			if { $howmany > 1 } { 
        !           879: 			    append parsedIn(answer.$i) " "
        !           880: 			    incr parsedIn(multiplemarks)
        !           881: 			} else {
        !           882: 			    if { $howmany < 1 } { 
        !           883: 				append parsedIn(answer.$i) " "
        !           884: 				incr parsedIn(spaces)
        !           885: 			    }
        !           886: 			}
        !           887: 		    }
        !           888: 		}
        !           889: 	    }
        !           890: 	    N_OUT_OF_M -
        !           891: 	    STRING_MATCH { 
        !           892: 		set found 0
        !           893: 		for { set j 0 } { $j < $perQuest } { incr j } {
        !           894: 		    set char [string index "$response" $j]
        !           895: 		    if { "$char" == 1 } {
        !           896: 			append parsedIn(answer.$i) [string index $array $j]
        !           897: 			incr found
        !           898: 		    }
        !           899: 		}
        !           900: 		if { ! $found } { 
        !           901: 		    incr parsedIn(spaces) 
        !           902: 		    set parsedIn(answer.$i) ""
        !           903: 		}
        !           904: 	    }
        !           905: 	}
        !           906:     }
        !           907:     #if there isn't a capaId already, treat the first four questions as
        !           908:     # capaID
        !           909: #    if { $parsedIn(CapaID) == "" && $gScorer(CheckPIN.$num) } {
        !           910: #	set pinWrong 0
        !           911: #	for {set j 0} {$j < 4} {incr j} {
        !           912: #	    switch -regexp "$parsedIn(answer.$j)" {
        !           913: #		^[A-J]$ {
        !           914: #		    append parsedIn(CapaID) \
        !           915: 			[string first $parsedIn(answer.$j) "ABCDEFGHIJ" ]
        !           916: #		}
        !           917: #		default {
        !           918: #		    set pinWrong 1
        !           919: #		}
        !           920: #	    }
        !           921: #	}
        !           922: #	if { $pinWrong } {
        !           923: #	    scorerError $num PINWRONG parsedIn
        !           924: #	    lappend result PINWRONG
        !           925: #	}
        !           926: #    } 
        !           927: #    parray parsedIn
        !           928:     if { $result != "" } {
        !           929: 	error "$result"
        !           930:     }
        !           931: }
        !           932: 
        !           933: proc getAnswers2 { PID set maxQuest num } {
        !           934:     global gFile
        !           935:     set pwd [pwd]
        !           936:     cd $gFile($num)
        !           937:     set result [getAnswersFromSet $PID $set $maxQuest]
        !           938:     cd $pwd
        !           939:     return $result
        !           940: }
        !           941: 
        !           942: proc getAnswers { PID set maxQuest num } {
        !           943:     global gFile gCapaConfig
        !           944:     set pwd [pwd]
        !           945:     cd $gFile($num)
        !           946:     set temp [exec $gCapaConfig($num.answers_command) $PID {} 1 $set]
        !           947:     cd $pwd
        !           948:     set result ""
        !           949:     foreach line [split $temp "\n"] {
        !           950: 	switch [lindex [split $line :] 0] {
        !           951: 	    ANS { lappend result [string range $line 4 end] }
        !           952: 	}
        !           953:     }
        !           954:     return $result
        !           955: }
        !           956: 
        !           957: ###########################################################
        !           958: # checkStudentNumber
        !           959: ###########################################################
        !           960: ###########################################################
        !           961: ###########################################################
        !           962: proc checkStudentNumber { num answerStructVar } {
        !           963:     global gScorer gFile
        !           964:     upvar $answerStructVar answerStruct
        !           965: 
        !           966: #    puts "Stunum1:$answerStruct(StudentNumber):"
        !           967:     if { ![inClasslist $num $answerStruct(StudentNumber)] } {
        !           968: #	puts "Stunum2:$answerStruct(StudentNumber):"
        !           969: 	set matched [findByStudentName [string trim $answerStruct(LastName)] $gFile($num)]
        !           970: 	if { [llength $matched] != 1 } {
        !           971: 	    getOneStudent "" $gFile($num) id name "Unable to find student id: $answerStruct(StudentNumber), entered name is $answerStruct(LastName), $answerStruct(FirstName)." "Name on paper:$answerStruct(LastName), $answerStruct(FirstName), Number on Paper: $answerStruct(StudentNumber)"
        !           972: 	} else {
        !           973: 	    set id [lindex [lindex $matched 0] 0]
        !           974: 	    if { [makeSure "Unable to find bubbled id: $answerStruct(StudentNumber), name: $answerStruct(LastName) in classl, however I did find $matched. Use this one?"] != "Yes" } {
        !           975: 		getOneStudent "" $gFile($num) id name "Unable to find student id: $answerStruct(StudentNumber), entered name is $answerStruct(LastName), $answerStruct(FirstName)." "Name on paper:$answerStruct(LastName), $answerStruct(FirstName), Number on Paper: $answerStruct(StudentNumber)"
        !           976: 	    } else {
        !           977: 	    }
        !           978: 	}
        !           979: 	if { $id == "" } {
        !           980: 	    scorerError $num NO_SUCH_STUDENT "$answerStruct(orignalLine)" \
        !           981: 		$answerStruct(StudentNumber)
        !           982: 	    return 0
        !           983: 	} else {
        !           984: 	    scorerMessage $num "Student Number $answerStruct(StudentNumber) not found in classl using $id instead." info
        !           985: 	    set answerStruct(StudentNumber) $id
        !           986: 	}
        !           987:     }
        !           988: #    puts "Stunum3:$answerStruct(StudentNumber):"
        !           989:     return 1
        !           990: }
        !           991: 
        !           992: ###########################################################
        !           993: # handleStudent 
        !           994: ###########################################################
        !           995: ###########################################################
        !           996: ###########################################################
        !           997: proc handleStudent { num answerStructVar} {
        !           998:     global gScorer gFile
        !           999:     upvar $answerStructVar answerStruct
        !          1000:     
        !          1001:     if { ![checkStudentNumber $num answerStruct] } { return 0 }
        !          1002: 
        !          1003:     scorerMessage $num "Finding Possible Students. . ."
        !          1004:     if { ! $gScorer(AnonMode.$num) } {
        !          1005: 	set answerStruct(questionPID) $answerStruct(StudentNumber)
        !          1006:     } else {
        !          1007: #	puts "$answerStruct(StudentNumber):$answerStruct(CapaID):"
        !          1008: 	if { [string trim $answerStruct(CapaID)] == "" } { 
        !          1009: 	    scorerError $num NO_CODE_IN_ANON_MODE "$answerStruct(orignalLine)" \
        !          1010: 		$answerStruct(StudentNumber)
        !          1011: 	    return 0
        !          1012: 	}
        !          1013: 	set answerStruct(questionPID) [getAnonModeID $num answerStruct]
        !          1014: 	if { [llength $answerStruct(questionPID)] > 6 } {
        !          1015: 	    scorerError $num LOTS_OF_ANON_MODE_MATCHES "$answerStruct(orignalLine)" \
        !          1016: 		$answerStruct(StudentNumber)
        !          1017: 	    return 0
        !          1018: 	}
        !          1019:     }
        !          1020: 
        !          1021:     set answerStruct(Name) "$answerStruct(LastName) $answerStruct(FirstName) $answerStruct(MiddleInitial)"
        !          1022: 
        !          1023:     scorerMessage $num "Getting Possible Answers for $answerStruct(StudentNumber), paper#  $answerStruct(SerialNumber). . ."
        !          1024:     foreach questionPID $answerStruct(questionPID) {
        !          1025: 	scorerMessage $num "Getting Answers for $questionPID. . ."
        !          1026: 	if { [catch { set answerStruct(correct.$questionPID) \
        !          1027: 			  [getAnswers $questionPID $gScorer(set.$num) \
        !          1028: 			       $answerStruct(maxQuest) $num] } errorMsg ] } {
        !          1029: 	    puts $errorMsg
        !          1030: 	    scorerError $num UNABLE_TO_PARSE "$answerStruct(orignalLine)" \
        !          1031: 		$answerStruct(StudentNumber)
        !          1032: 	    error UNABLE_TO_PARSE
        !          1033: 	}
        !          1034: #	puts "$answerStruct(correct.$questionPID)"
        !          1035:     }
        !          1036: 
        !          1037:     scorerMessage $num "Grading Answers. . ."
        !          1038:     foreach questionPID $answerStruct(questionPID) {
        !          1039: 	set answerStruct($questionPID.grade) [gradeSet $num answerStruct $questionPID] 
        !          1040: 	scorerMessage $num "Correct: $answerStruct($questionPID.correct) #correct: $answerStruct($questionPID.grade) PID: $questionPID"
        !          1041:     }
        !          1042:     scorerMessage $num "Given:   $answerStruct($questionPID.given)"
        !          1043:     if { [llength $answerStruct(questionPID)] >  1 } {
        !          1044: 	scorerMessage $num "Selecting Student. . ."
        !          1045: 	if { $gScorer(QueryAboutPID.$num) } {
        !          1046: 	    set answerStruct(questionPID) \
        !          1047: 		[getWhichAnon $num answerStruct $answerStruct(indices)]
        !          1048: 	} else {
        !          1049: 	    set answerStruct(questionPID) \
        !          1050: 		[pickAnonHighest $num answerStruct $answerStruct(indices)]
        !          1051: 	}
        !          1052: 	scorerMessage $num "Student $answerStruct(StudentNumber) selected $answerStruct(questionPID)'s paper." info
        !          1053:     } 
        !          1054:     return 1
        !          1055: }
        !          1056: 
        !          1057: ###########################################################
        !          1058: # gradeQuestion
        !          1059: ###########################################################
        !          1060: ###########################################################
        !          1061: ###########################################################
        !          1062: proc gradeQuestion { num questNum correct given answerStructVar } {
        !          1063:     global gScorer
        !          1064:     upvar $answerStructVar answerStruct
        !          1065:     set numRight 0
        !          1066:     switch $gScorer(quest.$questNum.type.$num) {
        !          1067: 	ONE_OUT_OF_10 -
        !          1068: 	GLE -
        !          1069: 	TF -
        !          1070: 	SINGLE_DIGIT {
        !          1071: #	    scorerMessage $num "The correct answer: $correct, The student's answer: $given"
        !          1072: 	    set fmt "%-$gScorer(quest.$questNum.leafs.$num)s," 
        !          1073: 	    append answerStruct(correct) [format $fmt $correct]
        !          1074: 	    append answerStruct(given) [format $fmt $given]
        !          1075: 	    for { set leafs 0 } { $leafs < $gScorer(quest.$questNum.leafs.$num) 
        !          1076: 			      }   { incr leafs } {
        !          1077: 		if { [string index $correct $leafs] ==
        !          1078: 		     [string index $given $leafs] } {
        !          1079: 		    incr numRight
        !          1080: 		}
        !          1081: 	    }
        !          1082: 	}
        !          1083: 	ASSIGNED {
        !          1084: #	    scorerMessage $num "The student got a $given out of $gScorer(quest.$questNum.points.$num) "
        !          1085: 	    append answerStruct(correct) "$gScorer(quest.$questNum.points.$num),"
        !          1086: 	    append answerStruct(given) "$given,"
        !          1087: 	    if { [catch {incr given 0}] } {
        !          1088: 		set numRight 0
        !          1089: 	    } else {
        !          1090: 		set numRight $given
        !          1091: 	    }
        !          1092: 	}
        !          1093: 	N_OUT_OF_M {
        !          1094: #	    scorerMessage $num "The correct answer: $correct, The student's answer: $given"
        !          1095: 	    set fmt "%-$gScorer(quest.$questNum.leafs.$num)s," 
        !          1096: 	    append answerStruct(correct) [format $fmt $correct]
        !          1097: 	    append answerStruct(given) [format $fmt $given]
        !          1098: 	    set letters "ABCDEFGHIJ"
        !          1099: 	    set maxLeaf $gScorer(quest.$questNum.leafs.$num)
        !          1100: 	    for { set leaf 0 } { $leaf < $maxLeaf } { incr leaf } {
        !          1101: 		if { [string first [string index $letters $leaf] $correct] != -1 } {
        !          1102: 		    set ansOn($leaf) 1
        !          1103: 		} else { 
        !          1104: 		    set ansOn($leaf) 0 
        !          1105: 		}
        !          1106: 	    }
        !          1107: 	    for { set leaf 0 } { $leaf < $maxLeaf } { incr leaf } {
        !          1108: 		if { [string first [string index $letters $leaf] $given] != -1 } {
        !          1109: 		    set stuOn($leaf) 1
        !          1110: 		} else { 
        !          1111: 		    set stuOn($leaf) 0 
        !          1112: 		}
        !          1113: 	    }
        !          1114: 	    for { set leaf 0 } { $leaf < $maxLeaf } { incr leaf } {
        !          1115: 		if { $ansOn($leaf) == $stuOn($leaf) } { incr numRight } 
        !          1116: 	    }
        !          1117: 	}
        !          1118: 	STRING_MATCH {
        !          1119: #	    scorerMessage $num "The correct answer: $correct, The student's answer: $given"
        !          1120: 	    set fmt "%-$gScorer(quest.$questNum.leafs.$num)s," 
        !          1121: 	    append answerStruct(correct) [format $fmt $correct]
        !          1122: 	    append answerStruct(given) [format $fmt $given]
        !          1123: 	    set letters "ABCDEFGHIJ"
        !          1124: 	    set maxLeaf 10
        !          1125: 	    for { set leaf 0 } { $leaf < $maxLeaf } { incr leaf } {
        !          1126: 		if { [string first [string index $letters $leaf] $correct] != -1 } {
        !          1127: 		    set ansOn($leaf) 1
        !          1128: 		} else { 
        !          1129: 		    set ansOn($leaf) 0 
        !          1130: 		}
        !          1131: 	    }
        !          1132: 	    for { set leaf 0 } { $leaf < $maxLeaf } { incr leaf } {
        !          1133: 		if { [string first [string index $letters $leaf] $given] != -1 } {
        !          1134: 		    set stuOn($leaf) 1
        !          1135: 		} else { 
        !          1136: 		    set stuOn($leaf) 0 
        !          1137: 		}
        !          1138: 	    }
        !          1139: 	    for { set leaf 0 } { $leaf < $maxLeaf } { incr leaf } {
        !          1140: 		if { $ansOn($leaf) == $stuOn($leaf) } { incr numRight } 
        !          1141: 	    }
        !          1142: 	    if { $numRight != $maxLeaf } { set numRight 0 }
        !          1143: 	}
        !          1144: 	default {
        !          1145: 	    scorerMessage $num "Unknown question type while grading,"
        !          1146: 	}
        !          1147:     }
        !          1148:     return $numRight
        !          1149: }
        !          1150: 
        !          1151: ###########################################################
        !          1152: # gradeSet
        !          1153: ###########################################################
        !          1154: ###########################################################
        !          1155: ###########################################################
        !          1156: proc gradeSet { num answerStructVar questionPID } {
        !          1157:     global gScorer
        !          1158:     upvar $answerStructVar answerStruct
        !          1159:     
        !          1160:     set numRight 0
        !          1161:     for { set i 0 } { $i < $answerStruct(maxQuest) } { incr i } {
        !          1162: 	set correct [lindex $answerStruct(correct.$questionPID) $i]
        !          1163: 	set given $answerStruct(answer.$i) 
        !          1164: 	set probRight [gradeQuestion $num $i $correct $given answerStruct]
        !          1165: 	incr numRight $probRight
        !          1166: 	append answerStruct($questionPID.numRight) $probRight
        !          1167:     }
        !          1168:     set answerStruct($questionPID.correct) $answerStruct(correct)
        !          1169:     set answerStruct(correct) ""
        !          1170:     set answerStruct($questionPID.given) $answerStruct(given)
        !          1171:     set answerStruct(given) ""
        !          1172:     return $numRight
        !          1173: }
        !          1174: 
        !          1175: 
        !          1176: ###########################################################
        !          1177: # getScorerEntry
        !          1178: ###########################################################
        !          1179: ###########################################################
        !          1180: ###########################################################
        !          1181: proc getScorerEntry { num PID } {
        !          1182:     global gScorer
        !          1183:     
        !          1184:     set fileId $gScorer(out.$num) 
        !          1185:     seek $fileId 0 start
        !          1186:     set done 0
        !          1187:     set found 0
        !          1188:     set aline ""
        !          1189:     set offset 0
        !          1190:     while { ! $done } {
        !          1191: 	set readamt [gets $fileId aline]
        !          1192: 	if { [eof $fileId] } { set done 0 ; break}
        !          1193: 	if { 0 == [ string compare [string toupper [lindex $aline 0]] \
        !          1194: 			[string toupper $PID] ] } {
        !          1195: 	    set done 1
        !          1196: 	    set found 1
        !          1197: 	} else { 
        !          1198: 	    #plus one because gets swallows the newline it reads
        !          1199: 	    set offset [expr $offset + $readamt + 1]	
        !          1200: 	}
        !          1201:     }
        !          1202:     if { ! $found } { set offset -$offset }
        !          1203:     return $offset
        !          1204: }
        !          1205: 
        !          1206: ###########################################################
        !          1207: # setScorerEntry
        !          1208: ###########################################################
        !          1209: ###########################################################
        !          1210: ###########################################################
        !          1211: proc setScorerEntry { num aline offset } {
        !          1212:     global gScorer
        !          1213:     
        !          1214:     set fileId $gScorer(out.$num)
        !          1215:     seek $fileId [expr abs($offset)] start
        !          1216:     puts $fileId $aline
        !          1217: }
        !          1218: 
        !          1219: ###########################################################
        !          1220: # setOutput
        !          1221: ###########################################################
        !          1222: ###########################################################
        !          1223: ###########################################################
        !          1224: proc setOutput { num answerStructVar} {
        !          1225:     global gScorer
        !          1226:     upvar $answerStructVar answerStruct
        !          1227: 
        !          1228: #FIXME what if questions PID is empty
        !          1229:     set questionPID $answerStruct(questionPID)
        !          1230:     set out [format "%9s %-30s %s %4s %3s %s %s %s" $answerStruct(StudentNumber) \
        !          1231: 		 $answerStruct(Name) $answerStruct($questionPID.numRight) \
        !          1232: 		 $answerStruct($questionPID.grade) $answerStruct(Section) \
        !          1233: 		 $answerStruct($questionPID.given) $questionPID \
        !          1234: 		 $answerStruct(SerialNumber)]
        !          1235:     set offset [getScorerEntry $num $answerStruct(StudentNumber)]
        !          1236:     setScorerEntry $num "$out" $offset
        !          1237: }
        !          1238: 
        !          1239: ###########################################################
        !          1240: # finishScoring
        !          1241: ###########################################################
        !          1242: ###########################################################
        !          1243: ###########################################################
        !          1244: proc finishScoring { num answerStructVar} {
        !          1245:     global gScorer
        !          1246:     scorerMessage $num "Finishing . . ."
        !          1247: #    puts "errors:"
        !          1248: #    puts "$gScorer(errors.$num)"
        !          1249:     scorerMessage $num "Finished, Feel free to Update .sb"
        !          1250:     if { [makeSure "Would you like to update the .sb file?"] == "Yes" } {
        !          1251: 	scorerToSet $num
        !          1252:     }
        !          1253:     trace variable gScorer(quit.$num) w "scorerClose $num 0"
        !          1254: }
        !          1255: 
        !          1256: proc scorerStudentTime { num } {
        !          1257:     puts [ time "scorerStudent $num" ]
        !          1258: }
        !          1259: 
        !          1260: ###########################################################
        !          1261: # scorerStudent
        !          1262: ###########################################################
        !          1263: ###########################################################
        !          1264: ###########################################################
        !          1265: proc scorerStudent { num } {
        !          1266:     global gScorer
        !          1267: 
        !          1268:     if { $gScorer(pause.$num) } {
        !          1269: 	if { [array names gScorer quit.$num] != "" } { 
        !          1270: 	    if { ![scorerClose $num] } {
        !          1271: 		unset gScorer(quit.$num)
        !          1272: 		set gScorer(pause.$num) 0
        !          1273: 	    } else {
        !          1274: 		return
        !          1275: 	    }
        !          1276: 	}
        !          1277: 	if { $gScorer(pause.$num) == 1 } { 
        !          1278: 	    scorerMessage $num "Pausing. . . " info
        !          1279: 	    set gScorer(pause.$num) 2
        !          1280: 	}
        !          1281: 	after 100 "scorerStudent $num"
        !          1282: 	return
        !          1283:     }
        !          1284: #getanswerline
        !          1285:     if { [ catch { set answer [ getLine $num ] } ] } {
        !          1286: 	finishScoring $num answerStruct
        !          1287: 	return
        !          1288:     }
        !          1289:     incr gScorer(student.$num)
        !          1290:     update
        !          1291:     set gScorer(needToUpdateDB) 1
        !          1292: #parseanswerline
        !          1293:     if { [catch {parseLine $num $answer answerStruct} errorMsg ] } {
        !          1294: 	displayError "Error parsing line: $errorMsg"
        !          1295:     } else {
        !          1296: #parse the set and grades it for any possiblely matching student
        !          1297: 	if { ! [ catch { set result [handleStudent $num answerStruct]} errorMsg ] } {
        !          1298: 	    #write entry to outputfile if student was succesfully handled
        !          1299: 	    if { $result } { setOutput $num answerStruct } 		
        !          1300: 	} else { #error handling Student
        !          1301: 	    global errorCode errorInfo
        !          1302: 	    displayError "An error occured when attempting to grade a student. The error is: $errorMsg"
        !          1303: 	}
        !          1304:     }
        !          1305:     after idle "scorerStudent $num"
        !          1306: }
        !          1307: 
        !          1308: ###########################################################
        !          1309: # restartScorer
        !          1310: ###########################################################
        !          1311: ###########################################################
        !          1312: ###########################################################
        !          1313: proc restartScorer { num } {
        !          1314:     global gScorer
        !          1315:     if { ! [info exists gScorer(pause.$num) ] } {
        !          1316: 	initScorer $num
        !          1317: 	set gScorer(pause.$num) 0
        !          1318:     } else {
        !          1319:     }
        !          1320:     after idle "scorerStudent $num"
        !          1321: }
        !          1322: 
        !          1323: ###########################################################
        !          1324: # pauseScorer
        !          1325: ###########################################################
        !          1326: ###########################################################
        !          1327: ###########################################################
        !          1328: proc pauseScorer { num } {
        !          1329:     global gScorer
        !          1330:     set gScorer(pause.$num) 1
        !          1331: }
        !          1332: 
        !          1333: ###########################################################
        !          1334: # stopScorer
        !          1335: ###########################################################
        !          1336: ###########################################################
        !          1337: ###########################################################
        !          1338: proc stopScorer { num } {
        !          1339: }
        !          1340: 
        !          1341: ###########################################################
        !          1342: # unpauseScorer
        !          1343: ###########################################################
        !          1344: ###########################################################
        !          1345: ###########################################################
        !          1346: proc unpauseScorer { num } {
        !          1347:     global gScorer
        !          1348:     set gScorer(pause.$num) 0
        !          1349: }
        !          1350: 
        !          1351: ###########################################################
        !          1352: ###########################################################
        !          1353: ###########################################################
        !          1354: ###########################################################
        !          1355: proc finalScorer { num method studentNumber numRight } {
        !          1356:     global gScorer
        !          1357: 
        !          1358:     set answers ""
        !          1359:     for { set i 0 } { $i < $gScorer(numQuest.$num) } { incr i } {
        !          1360: 	switch $gScorer(quest.$i.type.$num) {
        !          1361: 	    ONE_OUT_OF_10 -
        !          1362: 	    SINGLE_DIGIT {
        !          1363: 		append answers [ expr [string index $numRight $i] * \
        !          1364: 				 $gScorer(quest.$i.points.$num) ]
        !          1365: 	    }
        !          1366: 	    GLE -
        !          1367: 	    TF -
        !          1368: 	    N_OUT_OF_M {
        !          1369: 		set right [string index $numRight $i]
        !          1370: 		set leafs $gScorer(quest.$i.leafs.$num)
        !          1371: 		set points $gScorer(quest.$i.points.$num)
        !          1372: 		set unit [expr double($points)/double($leafs)]
        !          1373: 		if { $unit == 0 } { set unit $points } 
        !          1374: 		switch $method {
        !          1375: 		    CAPA {
        !          1376: 			set score [expr int($points-(2*$unit*($leafs-$right)))]
        !          1377: 			if { $score < 0 } { set score 0 }
        !          1378: 		    }
        !          1379: 		    Lenient {
        !          1380: 			set score [expr int($points-($unit*($leafs-$right)))]
        !          1381: 		    }
        !          1382: 		    Strict {
        !          1383: 			if { $right == $leafs } { 
        !          1384: 			    set score $points 
        !          1385: 			} else { 
        !          1386: 			    set score 0 
        !          1387: 			}
        !          1388: 		    }
        !          1389: 		    default {
        !          1390: 			scorerError $num UNKNOWN_GRADING_METHOD $method
        !          1391: 		    }
        !          1392: 		}
        !          1393: 		append answers $score
        !          1394: 	    }
        !          1395: 	    STRING_MATCH -
        !          1396: 	    ASSIGNED {
        !          1397: 		append answers [string index $numRight $i]
        !          1398: 	    }
        !          1399: 	    default {
        !          1400: 	    }
        !          1401: 	}
        !          1402:     }
        !          1403:     return $answers
        !          1404: }
        !          1405: 
        !          1406: ###########################################################
        !          1407: # scorerToSet2
        !          1408: ###########################################################
        !          1409: ###########################################################
        !          1410: ###########################################################
        !          1411: proc scorerToSet2 { num method } {
        !          1412:     global gScorer gFile
        !          1413:     destroy .getGradingMethod$num
        !          1414:     
        !          1415:     set processed 0
        !          1416:     set done 0
        !          1417:     set fileId $gScorer(out.$num)
        !          1418:     set setId $gScorer(set.$num)
        !          1419:     seek $fileId 0 start
        !          1420: 
        !          1421: #remove the header line
        !          1422:     gets $fileId aline 
        !          1423: 
        !          1424:     scorerMessage $num "Processing. . ."
        !          1425:     while { ! $done } {
        !          1426: 	gets $fileId aline
        !          1427: 	if { [eof $fileId] } {
        !          1428: 	    set done 1
        !          1429: 	    break
        !          1430: 	}
        !          1431: 	set studentNumber [lindex $aline 0]
        !          1432: 	incr processed
        !          1433: 	if { [ expr $processed % 100 ] == 0 } { scorerMessage $num $processed }
        !          1434: 	update idletasks
        !          1435: 	set cwd [pwd]
        !          1436: 	cd $gFile($num)
        !          1437: 	if { ![file exists [file join records set$setId.sb] ] } {
        !          1438: 	    if { ![file exists [file join records set$setId.db] ] } {
        !          1439: 		cd $cwd
        !          1440: 		scorerMessage $num "set$setId.db does not exist" error
        !          1441: 		return
        !          1442: 	    } else {
        !          1443: 		scorerMessage $num "Copying set$setId.db to set$setId.sb" 
        !          1444: 		if { [catch {file copy [file join records set$setId.db] \
        !          1445: 				 [file join records set$setId.sb] }] } {
        !          1446: 		    cd $cwd
        !          1447: 		    scorerMessage $num "Unable to create set$setId.sb from set$setId.db, please create it by hand" error
        !          1448: 		    return
        !          1449: 		}
        !          1450: 	    }
        !          1451: 	}
        !          1452: 	if { [catch { set offset [ scorer_get_entry $studentNumber $setId ] } errors] } {
        !          1453: 	    cd $cwd
        !          1454: 	    scorerMessage $num "Error trying to read set$setId.sb" error
        !          1455: 	    return
        !          1456: 	}
        !          1457: 	cd $cwd
        !          1458: 	set name [string range $aline 10 39]
        !          1459: 	set numRight [lindex [string range $aline 40 end] 0]
        !          1460: 	set entry(answers) [ finalScorer $num $method $studentNumber $numRight ]
        !          1461: 	set entry(tries) ""
        !          1462: 	for { set i 0 } { $i < $gScorer(numQuest.$num) } { incr i } {
        !          1463: 	    append entry(tries) ", 1"
        !          1464: 	}
        !          1465: 	set entry(tries) [string range $entry(tries) 1 end]
        !          1466: 	set cwd [pwd]
        !          1467: 	cd $gFile($num)
        !          1468: 	if { [ catch { scorer_set_entry $studentNumber $setId $offset \
        !          1469: 			   $entry(answers) $entry(tries) } errors ] } {
        !          1470: 	    cd $cwd
        !          1471: 	    scorerMessage $num "Error trying to update set$setId.sb" error
        !          1472: 	    return
        !          1473: 	}
        !          1474: 	cd $cwd
        !          1475:     }
        !          1476:     scorerMessage $num "Finished updating. . ."
        !          1477:     update idletasks
        !          1478: 
        !          1479:     set gScorer(needToUpdateDB) 0
        !          1480:     if { [makeSure "Should I copy the updated set$setId.sb to set$setId.db"] == "Yes" } {
        !          1481: 	if { [file exists [file join $gFile($num) records set$setId.db] ] } {
        !          1482: 	    if { [catch {file delete [file join $gFile($num) records set$setId.db]}]} {
        !          1483: 		scorerMessage $num "An error occured while trying to copy. Please do this by hand." error
        !          1484: 	    }
        !          1485: 	}
        !          1486: 	if { [catch {file copy [file join $gFile($num) records set$setId.sb] \
        !          1487: 			 [file join $gFile($num) records set$setId.db] }] } {
        !          1488: 	    scorerMessage $num "An error occured while trying to copy. Please do this by hand." error
        !          1489: 	}
        !          1490:     }
        !          1491:     scorerMessage $num "Done"
        !          1492: }
        !          1493: 
        !          1494: ###########################################################
        !          1495: # scorerToSet
        !          1496: ###########################################################
        !          1497: ###########################################################
        !          1498: ###########################################################
        !          1499: proc scorerToSet { num } {
        !          1500:     global gScorer
        !          1501:     
        !          1502:     #getGradingMethod
        !          1503:     set gradeWindow [toplevel .getGradingMethod$num]
        !          1504:     
        !          1505:     set messageFrame [frame $gradeWindow.mesg]
        !          1506:     set capaFrame [frame $gradeWindow.capa]
        !          1507:     set lenientFrame [frame $gradeWindow.lenient]
        !          1508:     set strictFrame [frame $gradeWindow.strict]
        !          1509:     set cancelFrame [frame $gradeWindow.cancel]
        !          1510:     pack $messageFrame $capaFrame $lenientFrame $strictFrame $cancelFrame \
        !          1511: 	-side top
        !          1512: 
        !          1513:     label $messageFrame.mesg -text "Please Select a Grading Method:" 
        !          1514:     pack $messageFrame.mesg
        !          1515: 
        !          1516:     button $capaFrame.capa -text "CAPA Standard" -command "scorerToSet2 $num CAPA"
        !          1517: #    button $capaFrame.huh -text "Huh?"
        !          1518:     pack $capaFrame.capa  -side left
        !          1519: 
        !          1520:     button $lenientFrame.lenient -text "Lenient Method" \
        !          1521: 	-command "scorerToSet2 $num Lenient"
        !          1522: #    button $lenientFrame.huh -text "Huh?"
        !          1523:     pack $lenientFrame.lenient  -side left
        !          1524: 
        !          1525:     button $strictFrame.strict -text "Strict Method" \
        !          1526: 	-command "scorerToSet2 $num Strict"
        !          1527: #    button $strictFrame.huh -text "Huh?"
        !          1528:     pack $strictFrame.strict -side left
        !          1529:     
        !          1530:     button $cancelFrame.cancel -text "Cancel" -command "destroy $gradeWindow"
        !          1531:     pack $cancelFrame.cancel
        !          1532:     Centre_Dialog $gradeWindow default
        !          1533: }
        !          1534: 
        !          1535: ###########################################################
        !          1536: # scorerQuit
        !          1537: ###########################################################
        !          1538: ###########################################################
        !          1539: ###########################################################
        !          1540: proc scorerQuit { num } {
        !          1541:     global gScorer
        !          1542:     set gScorer(pause.$num) 1
        !          1543:     set gScorer(quit.$num) 1
        !          1544:     catch {scorerMessage $num "Quitting. . . " info}
        !          1545: }
        !          1546: 
        !          1547: ###########################################################
        !          1548: # scorerClose
        !          1549: ###########################################################
        !          1550: ###########################################################
        !          1551: ###########################################################
        !          1552: proc scorerClose { num {mustClose 0} {dummy ""} {dummy2 ""} {dummy3 ""}} {
        !          1553:     global gScorer
        !          1554: 
        !          1555:     if { $gScorer(needToUpdateDB) } {
        !          1556: 	set message \
        !          1557: 	    "Are you sure you wish to close, you haven't yet updated the .sb file."
        !          1558:     } else {
        !          1559: 	set message "Are you sure you wish to close?"
        !          1560:     }
        !          1561:     if { (! $mustClose ) && [makeSure $message ] == "Cancel" } { return 0 }
        !          1562:     stopScorer $num
        !          1563:     destroy .beginScorer$num
        !          1564: #    freeStudentList $num
        !          1565:     return 1
        !          1566: }
        !          1567: 
        !          1568: ###########################################################
        !          1569: # loadScorerQuest
        !          1570: ###########################################################
        !          1571: ###########################################################
        !          1572: ###########################################################
        !          1573: proc loadScorerQuest { num } {
        !          1574:     global gScorer gFile
        !          1575:     
        !          1576:     set filename [file join $gFile($num) records scorer.output.$gScorer(set.$num)]
        !          1577:     if { [ catch { set fileId [ open $filename "r" ] } ] } {
        !          1578: 	displayError "The set $gScorer(set.$num) does not yet have an scorer.output file. "
        !          1579: 	return
        !          1580:     }
        !          1581:     set line [gets $fileId ]
        !          1582:     close $fileId
        !          1583:     set numQuestions [lindex $line 2]
        !          1584:     set flags [lindex $line 4]
        !          1585:     $gScorer(quest.$num) delete 0 end
        !          1586:     for { set i 0 } { $i < $numQuestions } { incr i } {
        !          1587: 	switch [string index $flags [expr $i * 3] ] {
        !          1588: 	    a { set gScorer(questType.$num) ONE_OUT_OF_10 }
        !          1589: 	    b { set gScorer(questType.$num) GLE }
        !          1590: 	    c { set gScorer(questType.$num) TF }
        !          1591: 	    d { set gScorer(questType.$num) ASSIGNED }
        !          1592: 	    e { set gScorer(questType.$num) N_OUT_OF_M }
        !          1593: 	    f { set gScorer(questType.$num) SINGLE_DIGIT }
        !          1594: 	    g { set gScorer(questType.$num) STRING_MATCH }
        !          1595: 	}
        !          1596: 	set gScorer(questPoint.$num) [string index $flags [expr $i * 3 + 1] ]
        !          1597: 	set gScorer(questLeaf.$num) [string index $flags [expr $i * 3 + 2] ]
        !          1598: 	insertQuest $num end
        !          1599:     }
        !          1600: }
        !          1601: 
        !          1602: ###########################################################
        !          1603: # reScore
        !          1604: ###########################################################
        !          1605: ###########################################################
        !          1606: ###########################################################
        !          1607: proc reScore { file } {
        !          1608:     global gUniqueNumber gScorer gFile
        !          1609:     set num [incr gUniqueNumber]
        !          1610:     if { [catch {set gScorer(out.$num) [open $file "r"]}]} { 
        !          1611: 	displayError "Unable to open $file"
        !          1612: 	return
        !          1613:     }
        !          1614:     set gScorer(set.$num) [lindex [split $file .] end]
        !          1615:     set gFile($num) [file dirname [file dirname $file]]
        !          1616:     set line [gets $gScorer(out.$num) ]
        !          1617:     set gScorer(numQuest.$num) [lindex $line 2]
        !          1618:     set flags [lindex $line 4]
        !          1619:     for { set i 0 } { $i < $gScorer(numQuest.$num) } { incr i } {
        !          1620: 	switch [string index $flags [expr $i * 3] ] {
        !          1621: 	    a { set gScorer(quest.$i.type.$num) ONE_OUT_OF_10 }
        !          1622: 	    b { set gScorer(quest.$i.type.$num) GLE }
        !          1623: 	    c { set gScorer(quest.$i.type.$num) TF }
        !          1624: 	    d { set gScorer(quest.$i.type.$num) ASSIGNED }
        !          1625: 	    e { set gScorer(quest.$i.type.$num) N_OUT_OF_M }
        !          1626: 	    f { set gScorer(quest.$i.type.$num) SINGLE_DIGIT }
        !          1627: 	    g { set gScorer(quest.$i.type.$num) STRING_MATCH }
        !          1628: 	}
        !          1629: 	set gScorer(quest.$i.points.$num) [string index $flags [expr $i * 3 + 1] ]
        !          1630: 	set gScorer(quest.$i.leafs.$num) [string index $flags [expr $i * 3 + 2] ]
        !          1631:     }
        !          1632: 
        !          1633:     set reScore [toplevel .reScore$num]
        !          1634:     wm title $reScore "ReScoring $file"
        !          1635: 
        !          1636:     set windowFrame [frame $reScore.windowFrame]
        !          1637:     set buttonFrame [frame $reScore.buttonFrame]
        !          1638:     pack $windowFrame $buttonFrame -side bottom 
        !          1639:     pack configure $windowFrame -expand true -fill both
        !          1640:     pack configure $buttonFrame -anchor e
        !          1641: 
        !          1642:     scrollbar $windowFrame.scroll -orient vertical -command \
        !          1643: 	"$windowFrame.text yview"
        !          1644:     set gScorer(status.$num) [text $windowFrame.text -yscrollcommand \
        !          1645: 				  "$windowFrame.scroll set" -wrap char -height 40]
        !          1646:     pack $windowFrame.scroll $gScorer(status.$num) -side left -expand 0
        !          1647:     pack configure $windowFrame.scroll -expand 0 -fill y
        !          1648:     pack configure $gScorer(status.$num) -expand true -fill both
        !          1649: 	    
        !          1650:     button $buttonFrame.ok -text Dismiss -command \
        !          1651: 		    "destroy $reScore
        !          1652:                      catch {close $gScorer(out.$num)}"
        !          1653:     bind $reScore <Destroy> "catch {close $gScorer(out.$num)}"
        !          1654:     button $buttonFrame.save -text "Save Messages" -command "saveScorerMsg $num"
        !          1655:     button $buttonFrame.print -text "Print Messages" -command "printScorerMsg $num"
        !          1656:     pack $buttonFrame.print $buttonFrame.save $buttonFrame.ok -side left
        !          1657:     
        !          1658:     Centre_Dialog $reScore default
        !          1659:     update
        !          1660:     scorerToSet $num
        !          1661: }
        !          1662: 
        !          1663: #The flags struct is
        !          1664: # name
        !          1665: # question to ask
        !          1666: # yes (1) response
        !          1667: # no (0) response
        !          1668: set gScorer(flags) \
        !          1669: {
        !          1670:     {
        !          1671: 	CheckPIN 
        !          1672: 	{Is there a capaID/CODE on the paper?}
        !          1673: 	Yes
        !          1674: 	No
        !          1675: 	1
        !          1676:     }
        !          1677:     {
        !          1678: 	AnonMode 
        !          1679: 	{Is this an anonymous Exam?}
        !          1680: 	Yes
        !          1681: 	No
        !          1682: 	0
        !          1683:     }
        !          1684:     {
        !          1685: 	QueryAboutPID 
        !          1686: 	{When finding multiple PIDs matching a capaID:}
        !          1687: 	{Ask which to use}
        !          1688: 	{Pick one with highest score}
        !          1689: 	0
        !          1690:     }
        !          1691: }
        !          1692: #    { 
        !          1693: #	SurveyMode 
        !          1694: #	{What is being scanned?} 
        !          1695: #	Survey
        !          1696: #	Exam/Quiz 
        !          1697: #	0
        !          1698: #    }  
        !          1699: #    {
        !          1700: #	SurveyHeader 
        !          1701: #	{Does the Survey have a header?}
        !          1702: #	Yes
        !          1703: #	No
        !          1704: #	0
        !          1705: #    }
        !          1706: 
        !          1707: #    {
        !          1708: #	CheckSpaces
        !          1709: #	{Should scorer worry about blank questions?}
        !          1710: #	Yes
        !          1711: #	No
        !          1712: #	0
        !          1713: #    }
        !          1714: #    { 
        !          1715: #	CheckMultipleMarks 
        !          1716: #	{Should scorer worry about multiple marks on single mark questions?}
        !          1717: #	Yes
        !          1718: #	No
        !          1719: #	0
        !          1720: #    }
        !          1721: #    {
        !          1722: #	IdFormat 
        !          1723: #	{What format is the student number in?}
        !          1724: #	A<number>
        !          1725: #	{Social Security}
        !          1726: #	1
        !          1727: #    }
        !          1728: #    {
        !          1729: #	Form
        !          1730: #	{Which form size is being used? Select Half Sheet}
        !          1731: #	{Full sheet}
        !          1732: #	{Half Sheet}
        !          1733: #	0
        !          1734: #    }
        !          1735: #    {
        !          1736: #	log
        !          1737: #	{When encountering errors: Select Query the User}
        !          1738: #	{Log them}
        !          1739: #	{Query the user}
        !          1740: #	1
        !          1741: #    }
        !          1742: 
        !          1743: #Counting from zero, first number is column of start of the field,
        !          1744: #second number is end of the field. The Question field is an 
        !          1745: #exception first comes start of question responses then # of
        !          1746: #responses, and then the number of bubbles per response
        !          1747: #Full Sheet Specs
        !          1748: set gScorer(FullSheet.SerialNumber)  {  5  8 }
        !          1749: set gScorer(FullSheet.LastName)      { 40 49 }
        !          1750: set gScorer(FullSheet.FirstName)     { 50 54 }
        !          1751: set gScorer(FullSheet.MiddleInitial) { 55 55 }
        !          1752: set gScorer(FullSheet.StudentNumber) { 56 64 }
        !          1753: set gScorer(FullSheet.Section)       { 65 67 }
        !          1754: set gScorer(FullSheet.CapaID)        { } 
        !          1755: #No CapaID spot on full sheet
        !          1756: set gScorer(FullSheet.Question)      { 76 50 10 }
        !          1757:  
        !          1758: #Half Sheet Specs
        !          1759: set gScorer(HalfSheet.SerialNumber)  {  5  8 }
        !          1760: set gScorer(HalfSheet.LastName)      { 40 49 }
        !          1761: set gScorer(HalfSheet.FirstName)     { 50 50 }
        !          1762: set gScorer(HalfSheet.MiddleInitial) { } 
        !          1763: #No Middle Initial
        !          1764: set gScorer(HalfSheet.StudentNumber) { 56 64 }
        !          1765: set gScorer(HalfSheet.Section)       { 65 67 }
        !          1766: set gScorer(HalfSheet.CapaID)        { 68 73 }
        !          1767: set gScorer(HalfSheet.Question)      { 76 50 10 }

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