File:  [LON-CAPA] / capa / capa51 / GUITools / gradesubjective.tcl
Revision 1.8: download - view: text, annotated - select for diffs
Tue Dec 7 19:45:45 1999 UTC (24 years, 7 months ago) by albertel
Branches: MAIN
CVS tags: HEAD
- keywords can now be added

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

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