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