File:  [LON-CAPA] / capa / capa51 / GUITools / classl.tcl
Revision 1.1: download - view: text, annotated - select for diffs
Tue Sep 28 21:25:36 1999 UTC (24 years, 9 months ago) by albertel
Branches: MAIN
CVS tags: HEAD
Initial revision

    1: ###########################################################
    2: # createClasslEditor
    3: ###########################################################
    4: ###########################################################
    5: ###########################################################
    6: proc createClasslEditor { classlFile } {
    7:     global gUniqueNumber gWindowMenu gWindow gTitle gClassl gFile \
    8: 	    gClosed
    9: 
   10:     set error [ catch {set fileId [open $classlFile "r"]}]
   11:     if { $error } { 
   12: 	displayError "Unable to open a $classlFile."
   13: 	return
   14:     }
   15:     close $fileId
   16: 
   17:     set num [incr gUniqueNumber]
   18: 
   19:     set gFile($num) $classlFile
   20: 
   21:     set classlWin [toplevel .classlwindow$num]
   22:     $gWindowMenu add command -label "Classl $classlFile" \
   23: 	    -command "capaRaise $classlWin"
   24:     wm title $classlWin  "Classl $classlFile"
   25: 
   26:     set menuFrame [frame $classlWin.menu -borderwidth 3 -relief raised]
   27:     set infoFrame [frame $classlWin.infoFrame]
   28:     set actionFrame [frame $classlWin.actionFrame]
   29:     set windowFrame [frame $classlWin.windowFrame]
   30:     pack $menuFrame $infoFrame $actionFrame $windowFrame
   31:     pack configure $windowFrame -expand 1 -fill both
   32:     pack configure $menuFrame -fill x -anchor w
   33: 
   34: #menu
   35:     menubutton $menuFrame.file -text File -menu $menuFrame.file.m
   36:     menubutton $menuFrame.edit -text Copy -menu $menuFrame.edit.m
   37:     pack $menuFrame.file  $menuFrame.edit -side left
   38:     
   39:     set fileMenu [ menu $menuFrame.file.m ]
   40:     set editMenu [ menu $menuFrame.edit.m ]
   41: 
   42:     $fileMenu add command -label Open -accelerator "Alt+o" \
   43: 	    -command "specifyClass createClasslEditor"
   44:     bind $classlWin <Alt-o> "specifyClass createClasslEditor"
   45:     $fileMenu add command -label Save -command "saveClassl $num 0" \
   46: 	    -accelerator "Alt+s"
   47:     bind $classlWin <Alt-s> "saveClassl $num 0"
   48:     $fileMenu add command -label "Save As" -command "saveClassl $num 1" \
   49: 	    -accelerator "Alt+S"
   50:     bind $classlWin <Alt-Shift-s> "saveClassl $num 1" 
   51:     $fileMenu add command -label Print -command "printClassl $num"
   52:     $fileMenu add command -label Close -command "closeClassl $num" \
   53: 	    -accelerator "Alt+w"
   54:     bind $classlWin <Alt-w> "closeClassl $num"
   55:     
   56:     $editMenu add command -label "Copy StudentNum" -command "classlCopy $num stunum" \
   57: 	-accelerator "Alt+c"
   58:     bind $classlWin <Alt-c> "classlCopy $num stunum"
   59:     $editMenu add command -label "Copy Name" -command "classlCopy $num name" \
   60: 	-accelerator "Alt+n"
   61:     bind $classlWin <Alt-n> "classlCopy $num name"
   62:     $editMenu add command -label "Copy Email" -command "classlCopy $num email" \
   63: 	-accelerator "Alt+e"
   64:     bind $classlWin <Alt-e> "classlCopy $num email"
   65: 
   66: #info
   67: #action
   68:     button $actionFrame.add -text "Add" -command "classlAdd $num"
   69:     button $actionFrame.edit -text "Edit" -command "classlEdit $num"
   70:     button $actionFrame.delete -text "Delete" -command "classlDelete $num"
   71:     button $actionFrame.section -text "Change Section" -command "classlSectionChange $num"
   72:     button $actionFrame.sort -text "Sort" -command "classlSort $num"
   73:     button $actionFrame.print -text "Print" -command "classlPrint $num"
   74:     button $actionFrame.find -text "Find" -command "classlFind $num"
   75:     pack $actionFrame.add $actionFrame.edit $actionFrame.delete $actionFrame.section \
   76: 	$actionFrame.sort $actionFrame.print $actionFrame.find -side left
   77: 
   78: #window
   79:     set leftFrame [frame $windowFrame.left]
   80:     set rightFrame [frame $windowFrame.right]
   81:     pack $leftFrame $rightFrame -side left
   82:     pack configure $leftFrame -expand 1 -fill both
   83:     pack configure $rightFrame -fill y 
   84: 
   85: #FIXME need to set the title width based on the widest occuring element in
   86: #the listbox
   87:     scrollbar $rightFrame.scroll -orient v -command "$leftFrame.classl yview"
   88:     pack $rightFrame.scroll -fill y -expand 1 -pady 20
   89: 
   90:     set gTitle($num) [format "%-100s" "Class  Section  StuNum  Name                                E-mail"]
   91:     entry $leftFrame.title -textvariable gTitle($num) -width 80 \
   92: 	    -state disabled -xscrollcommand "$leftFrame.scroll set"
   93:     set gClassl($num) [ listbox $leftFrame.classl -width 80 -height 30 \
   94: 	    -xscrollcommand "$leftFrame.scroll set" \
   95: 	    -yscrollcommand "$rightFrame.scroll set" \
   96:             -exportselection 0]
   97:     scrollbar $leftFrame.scroll -orient h -command \
   98: 	    "scrolltwo {$leftFrame.classl xview} {$leftFrame.title  xview}"
   99:     pack $leftFrame.title $leftFrame.classl $leftFrame.scroll -side top
  100:     pack configure $leftFrame.title $leftFrame.scroll -fill x
  101:     pack configure $leftFrame.classl -fill both -expand 1
  102: 
  103:     set fileId [open $classlFile "r"]
  104:     while { 1 } {
  105: 	set aline [gets $fileId]
  106: 	if { [eof $fileId ] } { break }
  107: 	$gClassl($num) insert end [format "%-100s" $aline]
  108:     }
  109:     set gClassl($num.changed) 0
  110:     set gClassl($num.changedlast) 0
  111:     set gClosed($num) 0
  112:     Centre_Dialog $classlWin default
  113:     trace variable gClassl($num.changed) w updateClasslStatus
  114: }
  115: 
  116: ###########################################################
  117: # closeClassl
  118: ###########################################################
  119: ###########################################################
  120: ###########################################################
  121: proc closeClassl { num { mustClose 0 } } {
  122:     global gWindowMenu gWindow gTitle gClassl gFile gClosed
  123: 
  124:     if { ![winfo exists $gClassl($num)] } { return }
  125: 
  126:     if { $gClosed($num) } { return }
  127:     if { $gClassl($num.changed) == 1 } {
  128:         if { [askToSave "Do you wish to save $gFile($num)?" "saveClassl $num" ] == "Cancel" && ( ! $mustClose ) } { return }
  129:     }
  130: 
  131:     if { ( ! $mustClose ) && ( [makeSure "Are you sure you wish to stop editing
  132: $gFile($num)?"] == "Cancel" ) } {
  133:         return
  134:     }
  135:     set gClosed($num) 1
  136:     destroy [winfo toplevel $gClassl($num)]
  137:     removeWindowEntry "Classl $gFile($num)"
  138: }
  139: 
  140: ###########################################################
  141: # saveClassl
  142: ###########################################################
  143: ###########################################################
  144: ###########################################################
  145: proc saveClassl { num {saveAs 0}} {
  146:     global gFile gClassl
  147: 
  148:     if { ![winfo exists $gClassl($num)] } { return }
  149:     if { $saveAs } {
  150: 	set file [tk_getSaveFile -title "Enter name to Save As" \
  151: 		      -initialdir [file dirname "$gFile($num)"]]
  152: 	if {$file == "" } { return }
  153: 	set gFile($num) $file
  154:     }
  155:     set fileId [open "$gFile($num)" "w"]
  156:     foreach line [$gClassl($num) get 0 end] { puts $fileId $line }
  157:     close $fileId
  158:     set gClassl($num.changed) 0
  159: }
  160: 
  161: ###########################################################
  162: # classlSectionChange
  163: ###########################################################
  164: ###########################################################
  165: ###########################################################
  166: proc classlSectionChange { num } {
  167:     global gFile gClassl gWindowMenu
  168:     
  169:     if { [set which [$gClassl($num) curselection]] == "" } {
  170: 	displayMessage "Select a student first"
  171: 	return
  172:     }
  173:     if { [winfo exists .classlsection$num] } {
  174: 	capaRaise .classlsection$num
  175: 	return
  176:     }
  177:     set sectionChange [toplevel .classlsection$num]
  178:     $gWindowMenu add command -label "Section Change" \
  179: 	    -command "capaRaise $sectionChange"
  180:     wm title $sectionChange [file dirname $sectionChange]
  181: 
  182:     set infoFrame [frame $sectionChange.info]
  183:     set entryFrame [frame $sectionChange.entry]
  184:     set buttonFrame [frame $sectionChange.button]
  185:     pack $infoFrame $entryFrame $buttonFrame -side top
  186:     
  187:     label $infoFrame.label -text "Enter New Section Number"
  188:     pack $infoFrame.label
  189: 
  190:     label $entryFrame.label -text "Section:"
  191:     entry $entryFrame.section -textvariable gClassl($num.section) -width 3 \
  192: 	-validate key -validatecommand "limitEntry %W 3 number %P"
  193:     pack $entryFrame.label $entryFrame.section -side left
  194: 
  195:     set gClassl($num.done) 0
  196:     button $buttonFrame.change -text "Change" -command "set gClassl($num.done) 1"
  197:     button $buttonFrame.cancel -text "Cancel" -command "set gClassl($num.done) 0"
  198:     pack $buttonFrame.change $buttonFrame.cancel -side left
  199: 
  200:     Centre_Dialog $sectionChange default
  201:     update
  202: 
  203:     focus $sectionChange
  204:     capaGrab $sectionChange
  205:     vwait gClassl($num.done)
  206:     capaGrab release $sectionChange
  207:     
  208:     if { $gClassl($num.done) } {
  209: 	set record [$gClassl($num) get $which]
  210: 	set record "[string range $record 0 9][format %03d $gClassl($num.section)][string range $record 13 end]"
  211: 	$gClassl($num) delete $which
  212: 	$gClassl($num) insert $which $record
  213: 	set gClassl($num.changed) 1
  214:     }
  215: 
  216:     destroy $sectionChange
  217: }
  218: 
  219: ###########################################################
  220: # classlSort
  221: ###########################################################
  222: ###########################################################
  223: ###########################################################
  224: proc classlSort { num } {
  225:     global gFile gClassl gWindowMenu
  226:     if { [winfo exists .classlsort$num] } {
  227: 	capaRaise .classlsort$num
  228: 	return
  229:     }
  230: 
  231:     set sortClassl [toplevel .classlsort$num]
  232:     $gWindowMenu add command -label "Sort Classl" \
  233: 	    -command "capaRaise $sortClassl"
  234:     wm title $sortClassl [file dirname $sortClassl]
  235: 
  236:     set infoFrame [frame $sortClassl.info]
  237:     set buttonFrame [frame $sortClassl.button]
  238:     pack $infoFrame $buttonFrame -side top
  239:     
  240:     label $infoFrame.label -text "How would you like the classl sorted?"
  241:     pack $infoFrame.label
  242:     
  243:     set gClassl($num.done) 0
  244:     button $buttonFrame.section -text "Sort By Section" \
  245: 	-command "set gClassl($num.done) Section"
  246:     button $buttonFrame.name    -text "Sort By Name" \
  247: 	-command "set gClassl($num.done) Name"
  248:     button $buttonFrame.cancel  -text "Cancel" -command "set gClassl($num.done) 0"
  249:     pack $buttonFrame.section $buttonFrame.name $buttonFrame.cancel -side left
  250: 
  251:     Centre_Dialog $sortClassl default
  252:     update
  253: 
  254:     focus $sortClassl
  255:     capaGrab $sortClassl
  256:     vwait gClassl($num.done)
  257:     capaGrab release $sortClassl
  258:     
  259:     if { $gClassl($num.done) != 0 } {
  260: 	sortClassl$gClassl($num.done) $num
  261: 	set gClassl($num.changed) 1
  262:     }
  263:     destroy $sortClassl
  264: }
  265: 
  266: ###########################################################
  267: # classlCompare
  268: ###########################################################
  269: ###########################################################
  270: ###########################################################
  271: proc classlCompare { field1 field2 val1 val2 } {
  272:     switch $field1 {
  273: 	section {
  274: 	    set a [string range $val1 10 12]
  275: 	    set b [string range $val2 10 12]
  276: 	}
  277: 	name {
  278: 	    set a " [string range $val1 24 55]"
  279: 	    set b " [string range $val2 24 55]"
  280: 	}
  281:     }
  282:     switch $field2 {
  283: 	name {
  284: 	    append a " [string range $val1 24 55]"
  285: 	    append b " [string range $val2 24 55]"
  286: 	}
  287: 	default {}
  288:     }
  289:     return [string compare $a $b]
  290: }
  291: 
  292: ###########################################################
  293: # sortClasslSection
  294: ###########################################################
  295: ###########################################################
  296: ###########################################################
  297: proc sortClasslSection { num } {
  298:     global gClassl
  299:     set allitems [$gClassl($num) get 0 end]
  300:     set newitems [lsort -command "classlCompare section name" $allitems]
  301:     $gClassl($num) delete 0 end
  302:     eval "$gClassl($num) insert end $newitems"
  303: }
  304: 
  305: ###########################################################
  306: # sortClasslName
  307: ###########################################################
  308: ###########################################################
  309: ###########################################################
  310: proc sortClasslName { num } {
  311:     global gClassl
  312:     set allitems [$gClassl($num) get 0 end]
  313:     set newitems [lsort -command "classlCompare name {}" $allitems]
  314:     $gClassl($num) delete 0 end
  315:     eval "$gClassl($num) insert end $newitems"
  316: }
  317:  
  318: ###########################################################
  319: # makeClasslEntryEditor 
  320: ###########################################################
  321: ###########################################################
  322: ###########################################################
  323: proc makeClasslEntryEditor { num window title buttonname } {
  324:     global gClassl gWindowMenu
  325: 
  326:     if { [winfo exists $window] } {
  327: 	capaRaise $window
  328: 	return 1
  329:     }
  330: 
  331:     set add [toplevel $window]
  332:     $gWindowMenu add command -label "$title" -command "capaRaise $add"
  333:     wm title $add "$title"
  334: 
  335:     set infoFrame [frame $add.info]
  336:     set buttonFrame [frame $add.button]
  337:     pack $infoFrame $buttonFrame -side top -anchor w
  338: 
  339:     set classFrame [frame $infoFrame.class]
  340:     set sectionFrame [frame $infoFrame.section]
  341:     set stuFrame [frame $infoFrame.stu]
  342:     set nameFrame [frame $infoFrame.name]
  343:     set emailFrame [frame $infoFrame.email]
  344:     pack $classFrame $sectionFrame $stuFrame $nameFrame $emailFrame -side top -anchor w
  345: 
  346:     label $classFrame.label -text "Class Name" -width 20
  347:     entry $classFrame.entry -textvariable gClassl($num.editclass) -width 9 \
  348: 	-validate key -validatecommand "limitEntry %W 9 any %P"
  349:     pack $classFrame.label $classFrame.entry -side left
  350: 
  351:     label $sectionFrame.label -text "Section" -width 20
  352:     entry $sectionFrame.entry -textvariable gClassl($num.editsection) -width 3 \
  353: 	-validate key -validatecommand "limitEntry %W 3 number %P"
  354:     pack $sectionFrame.label $sectionFrame.entry -side left
  355: 
  356:     label $stuFrame.label -text "Student Number" -width 20
  357:     entry $stuFrame.entry -textvariable gClassl($num.editstu) -width 9 \
  358: 	-validate key -validatecommand "limitEntry %W 9 any %P"
  359:     pack $stuFrame.label $stuFrame.entry -side left
  360: 
  361:     label $nameFrame.label -text "Name(Last, First MI)" -width 20
  362:     entry $nameFrame.entry -textvariable gClassl($num.editname) -width 30 \
  363: 	-validate key -validatecommand "limitEntry %W 30 any %P"
  364:     pack $nameFrame.label $nameFrame.entry -side left
  365: 
  366:     label $emailFrame.label -text "Email" -width 20
  367:     entry $emailFrame.entry -textvariable gClassl($num.editemail) -width 40 \
  368: 	-validate key -validatecommand "limitEntry %W 40 any %P"
  369:     pack $emailFrame.label $emailFrame.entry -side left
  370: 
  371:     button $buttonFrame.add -text $buttonname -command "set gClassl($num.done) 1"
  372:     button $buttonFrame.cancel -text Cancel -command "set gClassl($num.done) 0"
  373:     pack $buttonFrame.add $buttonFrame.cancel -side left
  374: 
  375:     bind $add <Return> "set gClassl($num.done) 1"
  376: 
  377:     Centre_Dialog $add default
  378:     update
  379: 
  380:     focus $add
  381:     capaGrab $add
  382:     return 0
  383: }
  384: 
  385: ###########################################################
  386: # classlDelete
  387: ###########################################################
  388: ###########################################################
  389: ###########################################################
  390: proc classlDelete { num } {
  391:     global gClassl gWindowMenu
  392: 
  393:     if { [set which [$gClassl($num) curselection]] == "" } {
  394: 	displayMessage "Select a student first"
  395: 	return
  396:     } 
  397:     $gClassl($num) delete $which
  398:     set gClassl($num.changed) 1
  399: }
  400: 
  401: ###########################################################
  402: # classlEdit
  403: ###########################################################
  404: ###########################################################
  405: ###########################################################
  406: proc classlEdit { num } {
  407:     global gClassl gWindowMenu
  408: 
  409:     if { [set which [$gClassl($num) curselection]] == "" } {
  410: 	displayMessage "Select a student first"
  411: 	return
  412:     } 
  413:     set record [$gClassl($num) get $which]
  414:     
  415:     set gClassl($num.editclass) [string trimright [string range $record 0 8]]
  416:     set gClassl($num.editsection) [string trimright [string range $record 10 12]]
  417:     set gClassl($num.editstu) [string trimright [string range $record 14 22]]
  418:     set gClassl($num.editname) [string trimright [string range $record 24 53]]
  419:     set gClassl($num.editemail) [string trimright [string range $record 60 99]]
  420: 
  421:     if { [makeClasslEntryEditor $num ".classledit$num" "Editing Student" "Done"] } { return }
  422: 
  423:     vwait gClassl($num.done)
  424:     capaGrab release .classledit$num
  425:     destroy .classledit$num
  426:     if { $gClassl($num.done) } {
  427: 	set gClassl($num.editsection) [string trimleft $gClassl($num.editsection) "0"]
  428: 	set record [format "%-9s %03d %-9s %-30s      %-40s" $gClassl($num.editclass) \
  429: 		   $gClassl($num.editsection) $gClassl($num.editstu) \
  430: 		   $gClassl($num.editname) $gClassl($num.editemail)]
  431: 	$gClassl($num) delete $which
  432: 	$gClassl($num) insert $which $record
  433: 	set gClassl($num.changed) 1
  434:     }
  435: }
  436: 
  437: ###########################################################
  438: # findStuNumClassl 
  439: ###########################################################
  440: ###########################################################
  441: ###########################################################
  442: proc findStuNumClassl { num newstunum } {
  443:     global gClassl 
  444:     
  445:     set max [$gClassl($num) index end]
  446:     for {set i 0} {$i < $max} {incr i} {
  447: 	set teststunum [string range [$gClassl($num) get $i] 14 22]
  448: 	if { [regexp -nocase $newstunum $teststunum] } { return $i }
  449:     }
  450:     return -1
  451: }
  452: 
  453: ###########################################################
  454: # classlAdd
  455: ###########################################################
  456: ###########################################################
  457: ###########################################################
  458: proc classlAdd { num } {
  459:     global gClassl gWindowMenu
  460: 
  461:     set gClassl($num.editclass) ""
  462:     set gClassl($num.editsection) ""
  463:     set gClassl($num.editstu) ""
  464:     set gClassl($num.editname) ""
  465:     set gClassl($num.editemail) ""
  466: 
  467:     if { [makeClasslEntryEditor $num ".classladd$num" "Adding a Student" "Add"] } { 
  468: 	return 
  469:     }
  470:     vwait gClassl($num.done)
  471:     capaGrab release .classladd$num
  472:     destroy .classladd$num
  473:     
  474:     if { $gClassl($num.done) } {
  475: 	if { [set which [findStuNumClassl $num $gClassl($num.editstu)]] > -1 } {
  476: 	    if { "Cancel" == [makeSure "Found a duplicate student \n [$gClassl($num) get $which] \n Replace this one?"] } {
  477: 		set gClassl($num.done) 0
  478: 		displayMessage "Student was not added."
  479: 	    } else {
  480: 		$gClassl($num) delete $which
  481: 	    }
  482: 	}
  483:     }
  484:     if { $gClassl($num.done) } {
  485: 	set gClassl($num.editsection) [string trimleft $gClassl($num.editsection) "0"]
  486: 	set a [format "%-9s %03d %-9s %-30s      %-40s" $gClassl($num.editclass) \
  487: 		   $gClassl($num.editsection) $gClassl($num.editstu) \
  488: 		   $gClassl($num.editname) $gClassl($num.editemail)]
  489: 	$gClassl($num) insert 0 $a
  490: 	set gClassl($num.changed) 1
  491:     }
  492: }
  493: 
  494: ###########################################################
  495: # classlPrint
  496: ###########################################################
  497: ###########################################################
  498: ###########################################################
  499: proc classlPrint { num } {
  500:     global gClassl gWindowMenu gFile
  501: 
  502:     if { [set which [$gClassl($num) curselection]] == "" } {
  503: 	displayMessage "Select a student first"
  504: 	return
  505:     } 
  506:     if { $gClassl($num.changed) == 1 } {
  507:         if {[askToSave "Do you wish to save $gFile($num)?" "saveClassl $num"]=="Yes"} { 
  508: 	    saveClassl $num
  509: 	}
  510:     }
  511:     set record [$gClassl($num) get $which]
  512:     set stunum [string range $record 14 22]
  513: 
  514:     if { [winfo exists .capaprint$num] } {
  515: 	capaRaise .capaprint$num
  516: 	return 1
  517:     }
  518: 
  519:     set print [toplevel .capaprint$num]
  520:     $gWindowMenu add command -label "Printing a Student" -command "capaRaise $print"
  521:     wm title $print "Printing a Student"
  522: 
  523:     set infoFrame [frame $print.info]
  524:     set dataFrame [frame $print.data]
  525:     set buttonFrame [frame $print.button]
  526:     pack $infoFrame $dataFrame $buttonFrame -side top -anchor w
  527: 
  528:     label $infoFrame.label -text "Print For Student $stunum"
  529:     pack $infoFrame.label
  530: 
  531:     set setFrame [frame $dataFrame.set]
  532:     set printerFrame [frame $dataFrame.printer]
  533:     pack $setFrame $printerFrame -side top -anchor w
  534: 
  535:     label $setFrame.label -text "Set" -width 13
  536:     entry $setFrame.set -textvariable gClassl($num.printset) -width 2 \
  537: 		-validate key -validatecommand "limitEntry %W 9 any %P"
  538:     pack $setFrame.label $setFrame.set -side left
  539: 
  540:     label $printerFrame.label -text "Printer Name" -width 13
  541:     entry $printerFrame.printer -textvariable gClassl($num.printername) -width 20 
  542:     pack $printerFrame.label $printerFrame.printer -side left
  543: 
  544:     button $buttonFrame.print -text "Print" -command "set gClassl($num.done) 1"
  545:     button $buttonFrame.cancel -text "Cancel" -command "set gClassl($num.done) 0"
  546:     pack $buttonFrame.print $buttonFrame.cancel -side left
  547: 
  548:     bind $print <Return> "set gClassl($num.done) 1"
  549: 
  550:     Centre_Dialog $print default
  551:     update
  552: 
  553:     focus $print
  554:     capaGrab $print
  555:     vwait gClassl($num.done)
  556:     capaGrab release $print
  557: 
  558:     if { $gClassl($num.done) } {
  559: 	global gCapaConfig
  560: 	parseCapaConfig $num [file dirname $gFile($num)]
  561: 	if {[catch {printStudent $num $stunum $gClassl($num.printset) $gClassl($num.printername)} error ]} {
  562: 	    displayError "Unable to print  $stunum"
  563: 	}
  564: 	foreach name [array names gCapaConfig "$num.*"] {
  565: 	    unset gCapaConfig($name)
  566: 	}
  567:     }
  568:     destroy $print
  569: }
  570: 
  571: ###########################################################
  572: # printStudent
  573: ###########################################################
  574: ###########################################################
  575: ###########################################################
  576: proc printStudent { num stunum printset printername } {
  577:     global gCapaConfig gFile
  578:     set command "$gCapaConfig($num.qzparse_command) -c [file dirname $gFile($num)] \
  579:                      -set $printset -stu $stunum"
  580:     eval "exec $command"
  581:     set tex_file [file join [file dirname $gFile($num)] TeX $stunum.tex]
  582:     set command "$gCapaConfig($num.latex_command) $tex_file"
  583:     removeStatus $num
  584:     #if { "Yes" != [makeSure "Planning on running LaTeX, Continue?"] } { return }
  585:     displayStatus "Running LaTeX" message $num
  586:     set directory [pwd]
  587:     cd [file join [file dirname $gFile($num)] TeX]
  588:     eval "exec $command"
  589:     cd $directory
  590:     set dvi_file [file join [file dirname $gFile($num)] TeX $stunum.dvi]
  591:     set ps_file [file join [file dirname $gFile($num)] TeX $stunum.ps]
  592:     set command "$gCapaConfig($num.dvips_command) $dvi_file -o $ps_file >& /dev/null"
  593:     removeStatus $num
  594:     #if { "Yes" != [makeSure "Planning on running dvips, Continue?"] } { return }
  595:     displayStatus "Running dvips" message $num
  596:     eval "exec $command"
  597:     removeStatus $num
  598:     #if { "Cancel" == [set lprcmd [getLprCommand $ps_file $num]] } { return }
  599:     if { [catch { eval "exec lpr -P$printername $ps_file" } errors ] } {
  600: 	displayError "An error occurred while printing: $errors"
  601:     }
  602: }
  603: 
  604: ###########################################################
  605: # updateClasslStatus
  606: ###########################################################
  607: ###########################################################
  608: ###########################################################
  609: proc updateClasslStatus { name1 name2 op } {
  610:     global gClassl gWindowMenu
  611: 
  612:     set num [lindex [split $name2 .] 0]
  613:     if { $gClassl($num.changed) != $gClassl($num.changedlast)} {
  614: 	set gClassl($num.changedlast) $gClassl($num.changed)
  615: 	global gFile
  616: 	if { ![winfo exists $gClassl($num)] } { return }
  617: 	if { $gClassl($num.changed) } {
  618: 	    catch {removeWindowEntry "Classl $gFile($num)*"}
  619: 	    wm title [winfo toplevel $gClassl($num)] "Classl $gFile($num) (Modified)"
  620: 	    $gWindowMenu add command -label "Classl $gFile($num) (Modified)" -command \
  621: 		"capaRaise $gClassl($num)"
  622: 	} else {
  623: 	    catch {removeWindowEntry "Classl $gFile($num)*"}
  624: 	    wm title [winfo toplevel $gClassl($num)] "Classl $gFile($num)"
  625: 	    $gWindowMenu add command -label "Classl $gFile($num)" -command \
  626: 		"capaRaise $gClassl($num)"
  627: 	}
  628:     }
  629: }
  630: 
  631: ###########################################################
  632: # classlCopy
  633: ###########################################################
  634: ###########################################################
  635: ###########################################################
  636: proc classlCopy { num field } {
  637:     global gClassl
  638:     
  639:     if { ![winfo exists $gClassl($num)] } { return }
  640:     if { [set which [$gClassl($num) curselection]] == "" } {
  641: 	displayMessage "Select a student first"
  642: 	return
  643:     }
  644:     set entry [$gClassl($num) get $which]
  645:     set text ""
  646:     switch $field {
  647: 	stunum { set text [string trimright [string range $entry 14 22]] }
  648: 	name { set text [string trimright [string range $entry 24 53]] }
  649: 	email { set text [string trimright [string range $entry 60 99]] }
  650:     }
  651:     if { $text != "" } {
  652: 	set gClassl($num.selection) $text
  653: 	selection own $gClassl($num)
  654: 	selection handle $gClassl($num) "classlPaste $num"
  655: 	selection handle -selection CLIPBOARD $gClassl($num) "classlPaste $num"
  656: 	clipboard clear -displayof $gClassl($num)
  657: 	clipboard append -displayof $gClassl($num) -- $text
  658:     }
  659: }
  660: 
  661: ###########################################################
  662: # classlPaste
  663: ###########################################################
  664: ###########################################################
  665: ###########################################################
  666: proc classlPaste { num start length } {
  667:     global gClassl
  668:     return [string range $gClassl($num.selection) $start [expr $start + $length]]
  669: }
  670: 
  671: ###########################################################
  672: # classlFind
  673: ###########################################################
  674: ###########################################################
  675: ###########################################################
  676: proc classlFind { num } {
  677:     global gClassl gWindowMenu
  678: 
  679:     if { [winfo exists .classlfind$num] } {
  680: 	capaRaise .classlfind$num
  681: 	return
  682:     }
  683:     set classlFind [toplevel .classlfind$num]
  684:     $gWindowMenu add command -label "Find in Classl" \
  685: 	    -command "capaRaise $classlFind"
  686:     wm title $classlFind "Find"
  687: 
  688:     set infoFrame [frame $classlFind.info]
  689:     set entryFrame [frame $classlFind.entry]
  690:     set buttonFrame [frame $classlFind.button]
  691:     pack $infoFrame $entryFrame $buttonFrame -side top -anchor w
  692: 
  693:     set nameFrame [frame $entryFrame.name]
  694:     set stunumFrame [frame $entryFrame.stunum]
  695:     set emailFrame [frame $entryFrame.email]
  696:     pack $nameFrame $stunumFrame $emailFrame -side top -anchor w
  697: 
  698:     label $nameFrame.label -text "Name" -width 14 -anchor w
  699:     entry $nameFrame.name -textvariable gClassl($num.findname) -width 30 \
  700: 	-validate key -validatecommand "limitEntry %W 30 any %P"
  701:     frame $nameFrame.spacer -width 80
  702:     button $nameFrame.go -text "Find" -command "classlDoFind $num name"
  703:     pack $nameFrame.label $nameFrame.name $nameFrame.spacer $nameFrame.go \
  704: 	-side left -anchor w
  705: 
  706:     label $stunumFrame.label -text "Student Number" -width 14 -anchor w
  707:     entry $stunumFrame.stunum -textvariable gClassl($num.findstunum) -width 9 \
  708: 	-validate key -validatecommand "limitEntry %W 9 any %P"
  709:     frame $stunumFrame.spacer -width 248
  710:     button $stunumFrame.go -text "Find" -command "classlDoFind $num stunum"
  711:     pack $stunumFrame.label $stunumFrame.stunum $stunumFrame.spacer \
  712: 	$stunumFrame.go -side left -anchor w
  713: 
  714:     label $emailFrame.label -text "Email" -width 14 -anchor w
  715:     entry $emailFrame.email -textvariable gClassl($num.findemail) -width 40 \
  716: 	-validate key -validatecommand "limitEntry %W 40 any %P"
  717:     button $emailFrame.go -text "Find" -command "classlDoFind $num email"
  718:     pack $emailFrame.label $emailFrame.email $emailFrame.go -side left -anchor w
  719: 
  720:     button $buttonFrame.close -text "Close" -command "destroy $classlFind"
  721:     pack $buttonFrame.close
  722: 
  723:     Centre_Dialog $classlFind default
  724: }
  725: 
  726: ###########################################################
  727: # classlDoFind
  728: ###########################################################
  729: ###########################################################
  730: ###########################################################
  731: proc classlDoFind { num type } {
  732:     global gClassl 
  733: 
  734:     if {![winfo exists $gClassl($num)]} {return}
  735:     if { [set which [$gClassl($num) curselection]] == "" } { 
  736: 	set which 0 
  737:     } else {
  738: 	incr which
  739:     }
  740:     set max [$gClassl($num) index end]
  741:     for {set i 0} { $i < ($max-1)} {incr i} {
  742: 	set current [expr ($i+$which)%$max]
  743: 	puts -nonewline "$current:"
  744: 	set entry [$gClassl($num) get $current]
  745: 	switch $type {
  746: 	    name { set tmp [string range [$gClassl($num) get $current] 24 53] }
  747: 	    stunum { set tmp [string range [$gClassl($num) get $current] 14 22] }
  748: 	    email { set tmp [string range [$gClassl($num) get $current] 60 99] }
  749: 	}
  750: 	if { [regexp -nocase $gClassl($num.find$type) $tmp] } {
  751: 	    $gClassl($num) selection clear 0 end
  752: 	    $gClassl($num) selection set $current
  753: 	    $gClassl($num) see $current
  754: 	    puts " "
  755: 	    return
  756: 	}
  757:     }
  758:     displayMessage "Not Found"
  759: }

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