File:  [LON-CAPA] / capa / capa51 / GUITools / grader.tcl
Revision 1.6: download - view: text, annotated - select for diffs
Mon Aug 7 20:47:29 2000 UTC (23 years, 9 months ago) by albertel
Branches: MAIN
CVS tags: version_2_9_X, version_2_9_99_0, version_2_9_1, version_2_9_0, version_2_8_X, version_2_8_99_1, version_2_8_99_0, version_2_8_2, version_2_8_1, version_2_8_0, version_2_7_X, version_2_7_99_1, version_2_7_99_0, version_2_7_1, version_2_7_0, version_2_6_X, version_2_6_99_1, version_2_6_99_0, version_2_6_3, version_2_6_2, version_2_6_1, version_2_6_0, version_2_5_X, version_2_5_99_1, version_2_5_99_0, version_2_5_2, version_2_5_1, version_2_5_0, version_2_4_X, version_2_4_99_0, version_2_4_2, version_2_4_1, version_2_4_0, version_2_3_X, version_2_3_99_0, version_2_3_2, version_2_3_1, version_2_3_0, version_2_2_X, version_2_2_99_1, version_2_2_99_0, version_2_2_2, version_2_2_1, version_2_2_0, version_2_1_X, version_2_1_99_3, version_2_1_99_2, version_2_1_99_1, version_2_1_99_0, version_2_1_3, version_2_1_2, version_2_1_1, version_2_1_0, version_2_12_X, version_2_11_X, version_2_11_4_uiuc, version_2_11_4_msu, version_2_11_4, version_2_11_3_uiuc, version_2_11_3_msu, version_2_11_3, version_2_11_2_uiuc, version_2_11_2_msu, version_2_11_2_educog, version_2_11_2, version_2_11_1, version_2_11_0_RC3, version_2_11_0_RC2, version_2_11_0_RC1, version_2_11_0, version_2_10_X, version_2_10_1, version_2_10_0_RC2, version_2_10_0_RC1, version_2_10_0, version_2_0_X, version_2_0_99_1, version_2_0_2, version_2_0_1, version_2_0_0, version_1_99_3, version_1_99_2, version_1_99_1_tmcc, version_1_99_1, version_1_99_0_tmcc, version_1_99_0, version_1_3_X, version_1_3_3, version_1_3_2, version_1_3_1, version_1_3_0, version_1_2_X, version_1_2_99_1, version_1_2_99_0, version_1_2_1, version_1_2_0, version_1_1_X, version_1_1_99_5, version_1_1_99_4, version_1_1_99_3, version_1_1_99_2, version_1_1_99_1, version_1_1_99_0, version_1_1_3, version_1_1_2, version_1_1_1, version_1_1_0, version_1_0_99_3, version_1_0_99_2, version_1_0_99_1, version_1_0_99, version_1_0_3, version_1_0_2, version_1_0_1, version_1_0_0, version_0_99_5, version_0_99_4, version_0_99_3, version_0_99_2, version_0_99_1, version_0_99_0, version_0_6_2, version_0_6, version_0_5_1, version_0_5, version_0_4, stable_2002_spring, stable_2002_july, stable_2002_april, stable_2001_fall, release_5-1-3, loncapaMITrelate_1, language_hyphenation_merge, language_hyphenation, conference_2003, bz6209-base, bz6209, STABLE, HEAD, GCI_3, GCI_2, GCI_1, CAPA_5-1-6, CAPA_5-1-5, CAPA_5-1-4_RC1, BZ4492-merge, BZ4492-feature_horizontal_radioresponse, BZ4492-feature_Support_horizontal_radioresponse, BZ4492-Support_horizontal_radioresponse
- fixed license notices the reference the GNU GPL rather than the GNU LGPL

    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 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: #  General Public License for more details.
   13: #
   14: #  You should have received a copy of the GNU 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: 
   24: ###########################################################
   25: # grader.tcl - 
   26: # Created Guy Albertelli II 1996
   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 }
   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
   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: 
   77: #    set file  [menu $menuFrame.file -tearoff 1 -font 8x13bold ]
   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-2000, CAPA is released under to GNU GPL v2, and comes WITHOUT ANY WARRENTY, see COPYING for details." \
  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: 	{
  472: 	    displayError "An error has occurred while creating a summary \
  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 } {
 1000:         displayError "When attempting to print an error occurred : $errorMsg"
 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>