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

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.