File:  [LON-CAPA] / capa / capa51 / GUITools / gradesubjective.tcl
Revision 1.7: download - view: text, annotated - select for diffs
Tue Dec 7 19:10:47 1999 UTC (24 years, 7 months ago) by albertel
Branches: MAIN
CVS tags: HEAD
- Fixed bug in parsing, undefined variable errors are now passed up,
  rather than trying to mask them.
- Started keyword additions

    1: set gMaxSet 99
    2: 
    3: proc gradeSubjective {} {
    4:     global gSubj
    5: 
    6:     if { [winfo exists .gradeSubjective] } { return }
    7:     set var [tk_getOpenFile -title "Please select a capa.config file" -filetypes \
    8: 		 { { {Capa Config} {capa.config} } }]
    9:     
   10:     if { $var != "" } {
   11: 	set gSubj(dir) [file dirname $var]
   12: 	cd $gSubj(dir)
   13:     } else {
   14: 	return
   15:     }
   16:     parseCapaConfig
   17:     if { "" == [set gSubj(set) [getOneSet {} $gSubj(dir)]] } return
   18:     if { "" == [set gSubj(quest) [getString {} "Which question?"]] } return
   19:     set fileid [open "records/set$gSubj(set).db" r]
   20:     gets $fileid aline
   21:     gets $fileid aline
   22:     set gSubj(max) [lindex [split $aline {}] [expr $gSubj(quest) - 1]]
   23:     createGradeSubjWindow
   24: }
   25: 
   26: proc createGradeSubjWindow {} {
   27:     global gSubj
   28: 
   29:     set gradSubj [toplevel .gradesubjective]
   30:     wm protocol $gradSubj WM_DELETE_WINDOW "subjDone"
   31: 
   32:     set info [frame $gradSubj.info]
   33:     set grade [frame $gradSubj.grade]
   34:     set keyword [frame $gradSubj.keyword]
   35:     set gSubj(pictFrame) [set picts [frame $gradSubj.picts -borderwidth 4 -relief groove]]
   36:     pack $info $grade $keyword -side top
   37: 
   38:     set msg [frame $info.msg]
   39:     set id [frame $info.id]
   40:     pack $msg $id -side left
   41:     
   42: #    set gSubj(msg) [text $msg.text -width 40 -height 8 -yscrollcommand "$msg.scroll set"]
   43: #    scrollbar $msg.scroll -command "$msg.text yview"
   44: #    pack $gSubj(msg) $msg.scroll -side left
   45: #    pack configure $msg.scroll -fill y
   46: #    $gSubj(msg) tag configure error -foreground red
   47: #    $gSubj(msg) tag configure info -foreground #006c00
   48: 
   49:     set msglist [frame $msg.msglist]
   50:     set msgbutton [frame $msg.msgbutton]
   51:     pack $msglist $msgbutton -side top
   52:     pack configure $msgbutton -anchor w
   53: 
   54:     set gSubj(responseList) [listbox $msglist.list -width 40 -height 5 \
   55: 				 -yscrollcommand "$msglist.scroll set"]
   56:     scrollbar $msglist.scroll -command "$msglist.list yview"
   57:     pack $gSubj(responseList) $msglist.scroll -side left
   58:     pack configure $msglist.scroll -fill y
   59:     
   60:     set gSubj(numresponse) 0
   61: 
   62:     button $msgbutton.send -text Send -command subjSendResponse
   63:     button $msgbutton.new -text New -command subjNewResponse
   64:     button $msgbutton.delete -text Delete -command subjDeleteResponse
   65:     button $msgbutton.view -text View -command subjViewResponse
   66:     button $msgbutton.edit -text Edit -command subjEditResponse
   67:     pack $msgbutton.send $msgbutton.new $msgbutton.delete $msgbutton.view \
   68: 	$msgbutton.edit -side left
   69: 
   70:     set idlist [frame $id.idlist]
   71:     set idbutton [frame $id.idbutton]
   72:     pack $idlist $idbutton -side top
   73:     pack configure $idbutton -anchor w
   74: 
   75:     set gSubj(idlist) [listbox $idlist.list -width 34 -height 5 \
   76: 			   -yscrollcommand "$idlist.scroll set"]
   77:     scrollbar $idlist.scroll -command "$idlist.list yview"
   78:     pack $idlist.list $idlist.scroll -side left
   79:     pack configure $idlist.scroll -fill y
   80: 
   81:     button $idbutton.delete -text Delete -command subjDeleteId
   82:     frame $idbutton.spacer -width 30
   83:     label $idbutton.l1 -text "\# Words:"
   84:     label $idbutton.words -textvariable gSubj(numwords)
   85:     pack $idbutton.delete $idbutton.spacer $idbutton.l1 $idbutton.words -side left 
   86:     
   87:     set response [frame $grade.response]
   88:     pack $response 
   89: 
   90:     set scoreandcom [toplevel $gradSubj.scoreandcom]
   91:     wm title $scoreandcom "Control Panel"  
   92:     wm protocol $scoreandcom WM_DELETE_WINDOW "subjDone"
   93: 
   94:     set score [frame $scoreandcom.score]
   95:     set command [frame $scoreandcom.command]
   96:     set morebut [frame $scoreandcom.morebut]
   97:     set stat [frame $scoreandcom.stat]
   98:     pack $score $command $morebut $stat -side top
   99: 
  100:     set command1 [frame $command.command1]
  101:     set command2 [frame $command.command2]
  102:     pack $command1 $command2 -side left
  103: 
  104:     set top [frame $response.top]
  105:     set bot [frame $response.bot]
  106:     pack $top $bot -side top
  107:     pack configure $bot -expand 0 -fill x
  108: 
  109:     set gSubj(response) [text $top.response -width 80 -height 21 \
  110: 			     -yscrollcommand "$top.scroll set" \
  111: 			     -xscrollcommand "$bot.scroll set"]
  112:     scrollbar $top.scroll -command "$top.response yview"
  113:     pack $gSubj(response) $top.scroll -side left
  114:     pack configure $top.scroll -fill y
  115: 
  116:     scrollbar $bot.scroll -orient h -command "$top.response xview"
  117:     pack $bot.scroll 
  118:     pack configure $bot.scroll -expand 0 -fill x
  119: 
  120:     set left [frame $keyword.left]
  121:     set left2 [frame $keyword.left2]
  122:     set right [frame $keyword.right]
  123:     pack $left $left2 $right -side left
  124: 
  125:     set gSubj(keyword) [text $right.keyword -width 60 -height 5 \
  126: 			    -yscrollcommand "$right.scroll set" ]
  127:     scrollbar $right.scroll -command "$right.response yview"
  128:     pack $gSubj(keyword) $right.scroll -side left
  129:     pack configure $right.scroll -fill y
  130: 
  131:     button $left.add -command "subjAddKeyword" -text "Add"
  132:     button $left2.addsp -command "subjAddKeywordSpelling" -text "Add Sp"
  133:     button $left.delete -command "subjDeleteKeyword" -text "Delete"
  134:     button $left2.see -command "subjSeeKeyword" -text "See Sp"
  135:     pack $left.add $left2.addsp $left.delete $left2.see -side top
  136: 
  137:     wm geometry $gradSubj "-10+0"
  138: 
  139:     set score0 [frame $score.score0]
  140:     set score1 [frame $score.score1]
  141:     pack $score0 $score1 -side top
  142: 
  143:     for {set i 0} {$i < 10 } { incr i } {
  144: 	set parent [eval set "score[expr $i/5]"]
  145: 	set a [frame $parent.score$i -relief sunken -borderwidth 1]
  146: 	if { $gSubj(max) < $i} {
  147: 	    radiobutton $a.score$i -text $i -variable gSubj(score) \
  148: 		-value $i -state disabled
  149: 	} else {
  150: 	    radiobutton $a.score$i -text $i -variable gSubj(score) -value $i
  151: 	}
  152: 	pack $parent.score$i $a.score$i -side left
  153:     }
  154: 
  155:     set buttonwidth 8
  156:     set gSubj(wrap) 1;set gSubj(pict) 0
  157:     button $command1.setnext -text "Grade&Next" -command "subjSet;subjNext" \
  158: 	-width $buttonwidth
  159:     button $command2.set -text "Grade" -command subjSet -width $buttonwidth
  160:     frame  $command1.space1 -height 30
  161:     frame  $command2.space2 -height 30
  162:     frame  $command2.space22 -height 5
  163:     button $command1.next -text "Next" -command subjNext -width $buttonwidth
  164:     button $command1.prev -text "Prev" -command subjPrev -width $buttonwidth
  165:     button $command1.goto -text "GoTo" -command subjGoto -width $buttonwidth
  166:     button $command1.exit -text "Exit" -command subjDone -width $buttonwidth
  167:     button $command2.findid -text "Find ID" -command subjFindId -width $buttonwidth
  168:     button $command2.addid -text "Add ID" -command subjAddId -width $buttonwidth
  169:     button $command2.findname -text "Find Name" -command subjFindName -width $buttonwidth
  170:     checkbutton $command2.wrap -text wrap -command subjWrap -variable gSubj(wrap)
  171:     checkbutton $command2.pict -text pict -command subjPict -variable gSubj(pict)
  172:     checkbutton $command1.done -text graded -variable gSubj(donestat) -state disabled
  173:     pack $command1.setnext $command2.set $command1.space1 $command2.space2 \
  174: 	$command1.next $command1.prev $command2.findid \
  175: 	$command2.addid $command2.findname $command1.goto $command1.exit \
  176:         $command2.wrap $command2.pict $command1.done $command2.space22
  177: 
  178:     button $morebut.print -text "Print Response" -command subjPrint \
  179: 	-width [expr $buttonwidth*2]
  180:     pack $morebut.print
  181: 
  182:     set gSubj(done) 0
  183:     set gSubj(togo) 0
  184:     set gSubj(secAvg) 0.0
  185:     set gSubj(sec) 0
  186:     set gSubj(pause) 0
  187:     label $stat.done -text Done:
  188:     label $stat.donenum -textvariable gSubj(done) -width 4
  189:     label $stat.togo -text "To Go:"
  190:     label $stat.togonum -textvariable gSubj(togo) -width 4
  191:     label $stat.sec -text Sec:
  192:     label $stat.secnum -textvariable gSubj(sec) -width 4
  193:     label $stat.avgsec -text AvgSec:
  194:     label $stat.avgsecnum -textvariable gSubj(avgsec) -width 4
  195:     checkbutton $stat.pause -variable gSubj(pause) -text "Pause" -command subjPause
  196:     pack $stat.done $stat.donenum $stat.togo $stat.togonum -side left 
  197:     #not packed
  198:     #$stat.sec $stat.secnum $stat.avgsec $stat.avgsecnum $stat.pause
  199: 
  200:     set gSubj(canvas) [canvas $picts.canvas -height 220 \
  201: 			   -xscrollcommand "$picts.scroll set"]
  202:     scrollbar $picts.scroll -orient h -command "$picts.canvas xview"
  203:     pack  $picts.scroll $gSubj(canvas) -fill x
  204:     subjInit
  205: }
  206: 
  207: proc subjWrap {} {
  208:     global gSubj 
  209:     if { $gSubj(wrap) } {
  210: 	$gSubj(response) configure -wrap char
  211:     } else {
  212: 	$gSubj(response) configure -wrap none
  213:     }
  214: }
  215: 
  216: proc updateSecCount {} {
  217:     global gSubj
  218:     
  219:     if { [catch {set gSubj(pause)}] } { return }
  220:     if { !$gSubj(pause) } {set gSubj(sec) [expr {[clock seconds] - $gSubj(seconds)}]}
  221:     after 300 updateSecCount
  222: }
  223: 
  224: proc subjCheckForNew {} {
  225:     global gSubj
  226: }
  227: 
  228: proc checkGSubj {} {
  229:     global gSubj
  230:     if {[catch {set gSubj(stunums)}]} {
  231: 	cd [file join $gSubj(dir) records set$gSubj(set) problem$gSubj(quest)]
  232: 	set gSubj(stunums) [lsort -dictionary [glob *]]
  233: 	if { [set num [lsearch $gSubj(stunums) gradingstatus]] != -1} {
  234: 	    set gSubj(stunums) [lreplace $gSubj(stunums) $num $num]
  235: 	}
  236: 	cd $gSubj(dir)
  237:     }
  238:     if {[catch {set gSubj(current)}]} {set gSubj(current) -1}
  239:     if {[catch {set gSubj(totalsec)}]} {set gSubj(totalsec) 0}
  240:     if {[catch {set gSubj(seconds)}]} {set gSubj(seconds) [clock seconds]}
  241:     if {[catch {set gSubj(togo)}]} {set gSubj(togo) [llength $gSubj(stunums)]}
  242:     if {[catch {set gSubj(allstunum)}] || 
  243: 	[catch {set gSubj(allname)}] || 
  244: 	[catch {set gSubj(allemail)}] } {
  245: 	subjInitAllLists
  246:     }
  247: }
  248: 
  249: proc subjRestore {} {
  250:     global gSubj
  251:     source gradingstatus
  252:     subjCheckForNew
  253:     set gSubj(seconds) [expr {[clock seconds] - $gSubj(sec)}]
  254:     cd $gSubj(dir)
  255:     if { [catch {incr gSubj(current) -1}]} { set gSubj(current) -1 }
  256:     if { $gSubj(redoalllists) } { subjInitAllLists; set gSubj(redoalllists) 0 }
  257:     checkGSubj
  258:     subjIndexResponse
  259:     subjNext
  260: }
  261: 
  262: proc subjSave {} {
  263:     global gSubj
  264:     set file [file join $gSubj(dir) records set$gSubj(set) \
  265: 		  problem$gSubj(quest) gradingstatus]
  266:     set fileId [open $file w]
  267:     puts $fileId "array set gSubj \{[array get gSubj]\}"
  268:     close $fileId
  269: }
  270: 
  271: proc subjDone {} {
  272:     global gSubj
  273:     if { [catch {subjSave}] } {
  274: 	displayMessage "Unable to save."
  275:     }
  276:     unset gSubj
  277:     destroy .gradesubjective
  278: }
  279: 
  280: proc subjInitAllLists {} {
  281:     global gSubj
  282:     set i 0
  283:     catch {unset gSubj(allstunum)}
  284:     catch {unset gSubj(allname)}
  285:     catch {unset gSubj(allemail)}
  286:     set fileId [open classl r]
  287:     while { 1 } {
  288: 	incr i
  289: 	set aline [gets $fileId]
  290: 	if { [eof $fileId]} {break}
  291: 	lappend gSubj(allstunum) [string toupper [string range $aline 14 22]]
  292: 	#lappend gSubj(allname) [string toupper [string range $aline 24 59]]
  293: 	lappend gSubj(allname) [string range $aline 24 59]
  294: 	lappend gSubj(allemail) [string range $aline 60 99]
  295:     }
  296: }
  297: 
  298: proc subjInit {} {
  299:     global gSubj
  300:     
  301:     set dir [file join $gSubj(dir) records set$gSubj(set) problem$gSubj(quest)]
  302:     cd $dir
  303:     set gSubj(redoalllists) 0
  304:     if { [file exists gradingstatus] } { subjRestore } else {
  305: 	set gSubj(stunums) [lsort -dictionary [glob *]]
  306: 	cd $gSubj(dir)
  307: 	set gSubj(current) -1
  308: 	set gSubj(totalsec) 0
  309: 	set gSubj(seconds) [clock seconds]
  310: 	subjInitAllLists
  311: 	set gSubj(togo) [llength $gSubj(stunums)]
  312: 	subjNext
  313:     }
  314:     after 300 updateSecCount
  315: }
  316: 
  317: #FIXME check Ids when adding them to the list of ids
  318: proc checkId { id } {
  319:     global gSubj
  320:     set score [getScore $gSubj(set) $gSubj(quest) $id]
  321:     if { $score == "-" || $score == "0" } { return 1 }
  322:     return 0
  323: }
  324: 
  325: proc subjPause {} {
  326:     global gSubj
  327:     if { !$gSubj(pause) } { set gSubj(seconds) [expr {[clock seconds] - $gSubj(sec)}] }
  328: }
  329: 
  330: proc subjStatusUpdate {} {
  331:     global gSubj
  332:     
  333:     set gSubj(done) [llength [array names gSubj "done.*.score"]]
  334:     set total [llength $gSubj(stunums)]
  335:     set gSubj(togo) [expr $total-$gSubj(done)]
  336:     incr gSubj(totalsec) [expr {[clock seconds] - $gSubj(seconds)}]
  337:     set gSubj(avgsec) [format %4.1f [expr $gSubj(totalsec)/double($gSubj(done))]]
  338: #    puts $gSubj(avgsec)
  339:     set gSubj(seconds) [clock seconds]
  340: }
  341: 
  342: proc subjSet {} {
  343:     global gSubj
  344: 
  345: #    if {$gSubj(togo) == 0} { return }
  346:     if {$gSubj(score) == "" } { subjMessage "Please select a score." error; return }
  347:     set idlist [subjGetIdList]
  348:     foreach id $idlist {
  349: 	setScore $gSubj(set) $gSubj(quest) $id $gSubj(score)
  350:     }
  351:     set id [lindex $gSubj(stunums) $gSubj(current)]
  352:     set gSubj(done.$id.idlist) $idlist
  353:     set gSubj(done.$id.score) $gSubj(score)
  354:     set gSubj(donestat) 1
  355:     subjStatusUpdate
  356:     subjSave
  357: }
  358: 
  359: proc subjNext {} {
  360:     global gSubj
  361: 
  362:     set gSubj(score) ""
  363:     set gSubj(pict) 0
  364:     subjPict
  365:     incr gSubj(current)
  366:     if { [llength $gSubj(stunums)] < $gSubj(current) } { incr gSubj(current) -1 }
  367:     set id [lindex $gSubj(stunums) $gSubj(current)]
  368: 
  369:     $gSubj(response) delete 0.0 end
  370:     $gSubj(idlist) delete 0 end
  371: 
  372:     if { $id != "" } { 
  373: 	set file [file join $gSubj(dir) records set$gSubj(set) problem$gSubj(quest) $id]
  374: 	set fileId [open $file "r"]
  375: 	$gSubj(response) insert 0.0 [read $fileId [file size $file]]
  376: 	close $fileId
  377: 	subjInsertIds $id
  378:     }
  379: 
  380:     append words [string trim [$gSubj(response) get 0.0 end-1c]] " "
  381:     set ws [format " \t\n"]
  382:     set gSubj(numwords) [regsub -all -- \[$ws\]+  $words {} b]
  383:     wm title .gradesubjective "Grading Subjective, Set $gSubj(set), Prob $gSubj(quest), $id"
  384:     if { [catch {set gSubj(score) $gSubj(done.$id.score)}] } {
  385: 	set gSubj(score) ""
  386: 	set gSubj(donestat) 0
  387: 	update idletasks
  388: 	subjFindIds
  389:     } else {
  390: 	set gSubj(donestat) 1
  391: 	subjInsertIds $gSubj(done.$id.idlist)
  392: 	update idletasks
  393:     }
  394:     subjPicts
  395: }
  396: 
  397: proc subjFindIds1 {} {
  398:     global gSubj
  399: 
  400:     set text [$gSubj(response) get 0.0 end]
  401:     set result ""
  402:     foreach id $gSubj(allstunum) {
  403: 	if { [regexp -nocase -- $id $text] } {
  404: 	    lappend result $id
  405: 	}
  406:     }
  407:     return $result
  408: }
  409: 
  410: proc subjFindIds2 {} {
  411:     global gSubj
  412: 
  413:     set text [string toupper [$gSubj(response) get 0.0 end]]
  414:     set result ""
  415:     if { [catch {lsearch $text a}] } { 
  416: 	puts badlist; return subjFindIds1 
  417:     } else {
  418: 	foreach id $gSubj(allstunum) {
  419: 	    if { [lsearch -glob $text *$id*] != -1 } {
  420: 		lappend result $id
  421: 	    }
  422: 	}
  423:     }
  424:     return $result
  425: }
  426: 
  427: proc subjFindIds3 {} {
  428:     global gSubj
  429: 
  430:     set text [string toupper [$gSubj(response) get 0.0 end]]
  431:     set text [split $text "{}!@\#\$%^&*()_-+=|\\,.<>/?'\";:`~ \n\t"]
  432:     set result ""
  433:     foreach word $text {
  434: 	if { [lsearch -exact $gSubj(allstunum) $word] != -1 } {
  435: 	    lappend result $word
  436: 	}
  437:     }
  438:     return $result
  439: }
  440: 
  441: proc subjFindIds4 {} {
  442:     global gSubj
  443: 
  444:     set text [string toupper [$gSubj(response) get 0.0 end]]
  445:     set text [split $text "{}!@\#\$%^&*()_-+=|\\,.<>/?'\";:`~ \n\t"]
  446:     set result ""
  447:     foreach id $gSubj(allstunum) {
  448: 	if { [lsearch -exact $text $id] != -1 } {
  449: 	    lappend result $id
  450: 	}
  451:     }
  452:     return $result
  453: }
  454: 
  455: proc subjFindId {} {
  456:     global gSubj
  457:     puts "4:[time {subjInsertIds [set ids [subjFindIds4]]} ]\t:[llength $ids]"
  458:     subjPicts
  459: }
  460: 
  461: proc subjFindIds {} {
  462:     global gSubj
  463: #    puts "4:[time {subjInsertIds [set ids [subjFindIds4]]} ]\t:[llength $ids]"
  464:     subjInsertIds [set ids [subjFindIds4]]
  465: #    puts "3:[time {set ids [subjFindIds3]} 2]\t:[llength $ids]"
  466: #    puts "2:[time {set ids [subjFindIds2]} 2]\t:[llength $ids]"
  467: #    puts "1:[time {set ids [subjFindIds1]} 2]\t:[llength $ids]"
  468: 
  469: }
  470: 
  471: proc subjFindName {} {
  472:     global gSubj
  473:     
  474:     if {[catch {set text [string toupper [$gSubj(response) get sel.first sel.last]]}]} {
  475: 	set text [string toupper [$gSubj(response) get 0.0 end]]
  476:     }
  477:     set text [split $text "{}!@\#\$%^&*()_-+=|\\,.<>/?'\";:`~ \n\t"]
  478:     set result ""
  479:     set length [llength $gSubj(allname)]
  480:     foreach word $text {
  481: 	if { [string length $word] == 0 } { continue }
  482: 	for { set i 0 } { $i < $length } { incr i } {
  483: 	    set name [string toupper [lindex $gSubj(allname) $i]]
  484: 	    if { [set find [lsearch -glob $name *$word*]] != -1 } {
  485: 		lappend result $i
  486: 	    }
  487: 	}
  488:     }
  489:     set result [lunique $result]
  490:     foreach index $result {
  491: 	lappend temp [list [lindex $gSubj(allstunum) $index] \
  492: 			  [lindex $gSubj(allname) $index]]
  493:     }
  494:     if {[catch {set temp [lsort $temp]}]} {
  495: 	displayMessage "No Student found."
  496: 	return
  497:     }
  498:     set selected [multipleChoice {} "Select which student you want." $temp 1]
  499:     if {$selected == ""} { return }
  500:     set done 0
  501:     if { [llength $selected] == 2 } { 
  502: 	if { [lindex [lindex $selected 0] 0] == "" } { 
  503: 	    set selected [lindex $selected 0]
  504: 	    set done 1
  505: 	}
  506:     }
  507:     if { !$done } { foreach person $selected { lappend idlist [lindex $selected 0] } }
  508:     subjInsertIds $idlist
  509:     subjPicts
  510: }
  511: 
  512: proc subjGetNameFromId { id } {
  513:     global gSubj
  514:     return [lindex $gSubj(allname) [lsearch $gSubj(allstunum) $id]]
  515: }
  516: 
  517: proc subjGetIdList {} {
  518:     global gSubj
  519:     set list [$gSubj(idlist) get 0 end]
  520:     set id ""
  521:     foreach element $list {
  522: 	append id "[lindex $element 0] "
  523:     }
  524:     return $id
  525: }
  526: 
  527: proc subjInsertIds { selected } {
  528:     global gSubj
  529:     set current [subjGetIdList]
  530:     foreach person $selected {lappend current [lindex $person 0]}
  531:     set current [lsort [lunique $current]]
  532:     $gSubj(idlist) delete 0 end
  533:     foreach id $current {
  534: 	$gSubj(idlist) insert end "$id [subjGetNameFromId $id]"
  535:     }
  536: }
  537: 
  538: proc subjDeleteId {} {
  539:     global gSubj
  540:     $gSubj(idlist) delete [$gSubj(idlist) curselection]
  541:     subjPicts
  542: }
  543: 
  544: proc subjAddId {} {
  545:     global gSubj
  546:     getOneStudent {} $gSubj(dir) id name
  547:     if { $id == "" } { return }
  548:     subjInsertIds $id
  549: }
  550: 
  551: proc subjPrev {} {
  552:     global gSubj
  553:     if  { $gSubj(current) > 0 } {
  554: 	incr gSubj(current) -2
  555: 	subjNext
  556:     }
  557: }
  558: 
  559: proc subjMessage { mesg {tag normal} } {
  560:     global gSubj
  561:     displayMessage $mesg
  562: #    $gSubj(msg) insert end "[clock format [clock seconds] -format {%I:%M:%S}] - $mesg\n" $tag
  563: #    $gSubj(msg) see end
  564: }
  565: 
  566: proc subjAddPict { id } {
  567:     global gSubj
  568:     set gif [file join $gSubj(dir) photo gif $id.gif]
  569:     if { ![file exists $gif] } { return }
  570:     lappend gSubj(imagelist) [set image [image create photo]]
  571:     $image read $gif
  572:     set a [llength $gSubj(imagelist)]
  573:     $gSubj(canvas) create image [expr ($a-1)*200] 20 -image $image -anchor nw
  574:     $gSubj(canvas) create text [expr ($a-1)*200] 10 -text $id -anchor nw
  575:     $gSubj(canvas) create text [expr ($a-1)*200] 0 -text [subjGetNameFromId $id] \
  576: 	-anchor nw
  577:     $gSubj(canvas) configure -scrollregion "1 1 [expr ($a)*200] 200"
  578:     update idletasks
  579:     return $a
  580: }
  581: 
  582: proc subjConvertPict { id } {
  583:     global gSubj
  584:     set gif [file join $gSubj(dir) photo gif $id.gif]
  585:     set jpg [file join $gSubj(dir) photo jpg $id.jpg]
  586:     if { ![file exists $gif] } {
  587: 	if { [file exists $jpg] } {
  588: 	    exec djpeg -outfile $gif $jpg
  589: 	}
  590:     }
  591: }
  592: 
  593: proc subjPicts {} {
  594:     global gSubj 
  595: 
  596:     $gSubj(canvas) delete all
  597:     catch { foreach image $gSubj(imagelist) { catch {image delete $image} } }
  598:     set gSubj(imagelist) ""
  599:     set idlist [subjGetIdList]
  600:     foreach id $idlist {
  601: 	subjConvertPict $id
  602: 	set num [subjAddPict $id]
  603:     } 
  604: }
  605: 
  606: proc subjPict {} {
  607:     global gSubj
  608:     if { $gSubj(pict) } {
  609: 	pack $gSubj(pictFrame)
  610: 	pack configure $gSubj(pictFrame) -fill x
  611:     } else {
  612: 	pack forget $gSubj(pictFrame)
  613:     }
  614: }
  615: 
  616: proc subjPrint {} {
  617:     global gSubj
  618:     set lprCommand [getLprCommand quiztemp.txt]
  619:     if {$lprCommand == "Cancel"} { return }
  620:   
  621:     set fileId [open "quiztemp.txt" w] 
  622:     set subid [lindex $gSubj(stunums) $gSubj(current)]
  623:     if { $subid != "" } {
  624: 	set file [file join $gSubj(dir) records set$gSubj(set) \
  625: 		      problem$gSubj(quest) $subid]
  626: 	puts $fileId "Submitted at [clock format [file mtime $file ]]"
  627: 	puts $fileId "By Student:\n [string trimright [subjGetNameFromId $subid]] ($subid)"
  628:     }
  629:     if { [llength [subjGetIdList]] > 1 } {
  630: 	puts $fileId "Additional Authors:"
  631: 	foreach id [subjGetIdList] {
  632: 	    if { $id == $subid } { continue }
  633: 	    puts $fileId " [string trimright [subjGetNameFromId $id]] ($id)"
  634: 	}
  635:     }
  636:     puts $fileId ""
  637:     puts -nonewline $fileId "[ $gSubj(response) get 0.0 end-1c ]"
  638:     close $fileId
  639: 
  640:     set errorMsg ""
  641:     set error [catch {set output [ eval "exec $lprCommand" ] } errorMsg ]
  642:     
  643:     if { $error == 1 } {
  644:         displayError "An error occurred while printing: $errorMsg"
  645:     } else {
  646: 	displayMessage "Print job sent to the printer.\n $output"
  647:     }
  648:     exec rm -f quiztemp.txt
  649: }
  650: 
  651: proc subjGoto {} {
  652:     global gSubj
  653:     subjGetOneStudent {} $gSubj(dir) id name
  654:     if { $id == "" } { return }
  655:     if { [file exists [file join $gSubj(dir) records set$gSubj(set) problem$gSubj(quest) $id] ] } {
  656: 	set gSubj(current) [expr [lsearch $gSubj(stunums) $id] - 1]
  657: 	subjNext
  658:     } else {
  659: 	displayMessage "Student $id did not submit an answer."
  660:     }
  661: }
  662: 
  663: proc subjGetUngraded {} {
  664:     global gSubj
  665: 
  666:     set idlist ""
  667:     foreach stunum $gSubj(stunums) {
  668: 	if {[catch {set gSubj(done.$stunum.score)}]} {
  669: 	    lappend idlist $stunum
  670: 	}
  671:     }
  672:     return [multipleChoice {} "Select which student you want to grade." $idlist 1]
  673: }
  674: 
  675: proc subjGetOneStudent { window path idVar nameVar {message "" } } {
  676:     upvar $idVar id
  677:     upvar $nameVar name
  678:     
  679:     set select [tk_dialog $window.dialog "$message Student select method" \
  680: 		    "Select student by:" "" "" "Student Number" \
  681: 		    "Student Name" "Not Yet Graded" "Cancel"]
  682:     if { $select == 3 } { 
  683: 	set id ""
  684: 	set name ""
  685: 	return 
  686:     }
  687:     if { $select == 2 } {
  688: 	set id [subjGetUngraded]
  689: 	set name [subjGetNameFromId $id]
  690: 	return
  691:     }
  692:     set done 0
  693:     while { ! $done } {
  694: 	if { $select } { set search "name" } { set search "number" }
  695: 	set pattern [ getString $window "$message Please enter a student $search." ]
  696: 	if {$pattern == "" } {
  697: 	    set done 1
  698: 	    set id ""
  699: 	    set name ""
  700: 	    continue
  701: 	}
  702: 	if { $select } {
  703: 	    set matched_entries [findByStudentName $pattern $path]
  704: 	} else {
  705: 	    set matched_entries [findByStudentNumber $pattern $path]
  706: 	}
  707: 	if { [llength $matched_entries] == 0 } {
  708: 	    displayMessage "No student found. Please re-enter student $search."
  709: 	} elseif { [llength $matched_entries] == 1 } {
  710: 	    set id [lindex [lindex $matched_entries 0] 0]
  711: 	    set name [lindex [lindex $matched_entries 0] 1]
  712: 	    set done 1
  713: 	} elseif { [llength $matched_entries] < 30 } {
  714: 	    set select [ multipleChoice $window \
  715: 			     "Matched Student Records, Select one" \
  716: 			     $matched_entries ]
  717: 	    if { $select == "" } { 
  718: 		set id ""; set name ""
  719: 		return 
  720: 	    }
  721: 	    set id [lindex $select 0]
  722: 	    set name [lindex $select 1]
  723: 	    set done 1
  724: 	} else {
  725: 	    displayMessage "There were [llength $matched_entries], please enter more data to narrow the search."
  726: 	}
  727:     }
  728: }
  729: 
  730: ###########################################################
  731: # subjSendResponse
  732: ###########################################################
  733: ###########################################################
  734: ###########################################################
  735: proc subjSendResponse {} {
  736:     global gSubj
  737: 
  738:     if { "" == [set which [$gSubj(responseList) curselection]]} {
  739: 	displayMessage "Please select a message to send."
  740: 	return
  741:     }
  742:     incr which
  743: 
  744:     set message ""
  745: 
  746:     set stuList [$gSubj(idlist) get 0 end]
  747:     foreach stu $stuList {
  748: 	set stu [lindex $stu 0]
  749: 	set index [lsearch $gSubj(allstunum) $stu]
  750: 	set name [lindex $gSubj(allname) $index]
  751: 	set email [lindex $gSubj(allemail) $index]
  752: 	puts "$name:[split $name ,]:[lindex [split $name ,] 1]:[lindex [lindex [split $name ,] 1] 0]:$index:$stu"
  753: 	puts [lsearch $gSubj(allemail) albertel@pilot.msu.edu]
  754: 	set first_name [lindex [lindex [split $name ,] 1] 0]
  755: 	set last_name [lindex [split $name , ] 0]
  756: 	set score $gSubj(score)
  757: 	regsub -all -- \\\$last_name $gSubj(response.$which) $last_name message
  758: 	regsub -all -- \\\$first_name $message $first_name message
  759: 	regsub -all -- \\\$score $message $score message
  760: #	set message [subst -nobackslashes -nocommands $gSubj(response.$which)]
  761: 	if { [regexp -- (^Subject:\[^\n\]*)(\n)(.*) $message matchvar subjline newline messagebody] } {
  762: 	    set message "$subjline Class [file tail $gSubj(dir)], Set $gSubj(set), Question $gSubj(quest) \n$messagebody"
  763: 	} else {
  764: 	    set message "Subject: Class [file tail $gSubj(dir)], Set $gSubj(set), Question $gSubj(quest) \n$message"
  765: 	}
  766: 	displayMessage "$message sent to $email"
  767: 	exec echo $message | mail $email
  768:     }
  769: }
  770: 
  771: ###########################################################
  772: # subjIndexResponse
  773: ###########################################################
  774: ###########################################################
  775: ###########################################################
  776: proc subjIndexResponse {} {
  777:     global gSubj
  778:     
  779:     $gSubj(responseList) delete 0 end
  780: 
  781:     set i 0
  782:     foreach element [lsort -dictionary [array names gSubj "response.*"]] {
  783: 	regsub -all -- "\[\n\r\t\]+" [string range $gSubj($element) 0 37] " " head
  784: 	$gSubj(responseList) insert end "[incr i].$head"
  785:     }
  786: }
  787: 
  788: ###########################################################
  789: # subjSaveResponse
  790: ###########################################################
  791: ###########################################################
  792: ###########################################################
  793: proc subjSaveResponse {} {
  794:     global gSubj
  795:     
  796:     set num [incr gSubj(numresponse)]
  797:     set gSubj(response.$num) [$gSubj(responseNew) get 0.0 end-1c]
  798:     destroy [winfo toplevel $gSubj(responseNew)]
  799:     subjIndexResponse
  800:     $gSubj(responseList) selection set end
  801:     $gSubj(responseList) see end
  802: }
  803: 
  804: ###########################################################
  805: # subjNewResponse
  806: ###########################################################
  807: ###########################################################
  808: ###########################################################
  809: proc subjNewResponse {} {
  810:     global gSubj gWindowMenu
  811:    
  812:     if { [winfo exists .addresponse] } { 
  813: 	capaRaise .addresponse
  814: 	return 
  815:     }
  816:     set response [toplevel .addresponse]
  817:     $gWindowMenu add command -label "AddingResponse" -command "capaRaise $response"
  818:     wm title $response "Adding a New Response"  
  819: 
  820:     set textFrame [frame $response.text]
  821:     set buttonFrame [frame $response.button]
  822:     pack $textFrame $buttonFrame
  823: 
  824:     set gSubj(responseNew) [text $textFrame.text -yscrollcommand \
  825: 	    "$textFrame.scroll set" -wrap char -height 15]
  826:     scrollbar $textFrame.scroll -command "$textFrame.text yview"
  827:     pack $textFrame.text $textFrame.scroll -side left -expand 1
  828:     pack configure $textFrame.scroll -fill y
  829: 
  830:     button $buttonFrame.save -text Save -command "subjSaveResponse"
  831:     button $buttonFrame.forget -text Cancel -command "destroy $response"
  832:     pack $buttonFrame.save $buttonFrame.forget -side left
  833: }
  834: 
  835: ###########################################################
  836: # subjDeleteResponse
  837: ###########################################################
  838: ###########################################################
  839: ###########################################################
  840: proc subjDeleteResponse {} {
  841:     global gSubj
  842:     if { [winfo exists .editresponse] } { 
  843: 	displayMessage "Please finish with editing the response, before deleting responses."
  844: 	return
  845:     }
  846:     if { "" == [set which [$gSubj(responseList) curselection]]} { return }
  847:     incr which
  848:     if { [catch {unset gSubj(response.$which)}] } {
  849: 	puts [array names gSubj response.*]
  850: 	return
  851:     }
  852:     for {set i [expr $which + 1]} { [info exists gSubj(response.$i)] } {incr i} {
  853: 	set j [expr $i - 1]
  854: 	set gSubj(response.$j) $gSubj(response.$i)
  855: 	unset gSubj(response.$i)
  856:     }
  857:     set gSubj(numresponse) [expr $i - 2]
  858:     subjIndexResponse
  859:     $gSubj(responseList) see [incr which -2]
  860: }
  861: 
  862: ###########################################################
  863: # subjEditResponse
  864: ###########################################################
  865: ###########################################################
  866: ###########################################################
  867: proc subjEditResponse {} {
  868:     global gSubj gWindowMenu
  869: 
  870:     if { [winfo exists .editresponse] } { capaRaise .editresponse ; return }
  871:     if { "" == [set which [$gSubj(responseList) curselection]]} { return }
  872:     incr which
  873: 
  874:     set response [toplevel .editresponse ]
  875:     $gWindowMenu add command -label "EditingResponse" -command "capaRaise $response"
  876:     wm title $response "Editing a Response"  
  877: 
  878:     set textFrame [frame $response.text]
  879:     set buttonFrame [frame $response.button]
  880:     pack $textFrame $buttonFrame
  881: 
  882:     set gSubj(responseEdit) [text $textFrame.text -yscrollcommand \
  883: 	    "$textFrame.scroll set" -wrap char -height 15]
  884:     scrollbar $textFrame.scroll -command "$textFrame.text yview"
  885:     pack $textFrame.text $textFrame.scroll -side left -expand 1
  886:     pack configure $textFrame.scroll -fill y
  887:     $gSubj(responseEdit) insert 0.0 $gSubj(response.$which)
  888: 
  889:     set gSubj(editresponsedone) 0
  890:     button $buttonFrame.save -text Save -command "set gSubj(editresponsedone) 1"
  891:     button $buttonFrame.forget -text Cancel -command "set gSubj(editresponsedone) 0"
  892:     pack $buttonFrame.save $buttonFrame.forget -side left
  893:     vwait gSubj(editresponsedone)
  894:     if { $gSubj(editresponsedone) } {
  895: 	set gSubj(response.$which) [$gSubj(responseEdit) get 0.0 end-1c]	
  896: 	subjIndexResponse
  897: 	$gSubj(responseList) selection set $which
  898: 	$gSubj(responseList) see $which
  899:     } 
  900:     destroy $response
  901: }
  902: 
  903: ###########################################################
  904: # subjViewResponse
  905: ###########################################################
  906: ###########################################################
  907: ###########################################################
  908: proc subjViewResponse {} {
  909:     global gSubj gUniqueNumber gWindowMenu
  910: 
  911:     if { "" == [set which [$gSubj(responseList) curselection]]} { return }
  912:     incr which
  913:     set num [incr gUniqueNumber]
  914: 
  915:     set response [toplevel .viewresponse$num ]
  916:     $gWindowMenu add command -label "ViewingResponse $which" \
  917: 	-command "capaRaise $response"
  918:     wm title $response "Viewing Response $which"  
  919: 
  920:     set textFrame [frame $response.text]
  921:     set buttonFrame [frame $response.button]
  922:     pack $textFrame $buttonFrame
  923: 
  924:     text $textFrame.text -yscrollcommand "$textFrame.scroll set" -wrap char -height 15
  925:     scrollbar $textFrame.scroll -command "$textFrame.text yview"
  926:     pack $textFrame.text $textFrame.scroll -side left -expand 1
  927:     pack configure $textFrame.scroll -fill y
  928:     $textFrame.text insert 0.0 $gSubj(response.$which)
  929:     $textFrame.text configure -state disabled
  930: 
  931:     button $buttonFrame.forget -text Dismiss -command "destroy $response"
  932:     pack $buttonFrame.forget -side left
  933: }
  934: 
  935: ###########################################################
  936: # subjAddKeyword
  937: ###########################################################
  938: ###########################################################
  939: ###########################################################
  940: proc subjAddKeyword {} {
  941:     global gSubj gUniqueNumber
  942:     
  943: }

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