File:  [LON-CAPA] / capa / capa51 / GUITools / grader.tcl
Revision 1.3: download - view: text, annotated - select for diffs
Wed Jan 12 21:00:25 2000 UTC (24 years, 4 months ago) by albertel
Branches: MAIN
CVS tags: HEAD
- typos in the word occur

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

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