File:  [LON-CAPA] / capa / capa51 / GUITools / classl.tcl
Revision 1.3: download - view: text, annotated - select for diffs
Wed Mar 22 21:08:02 2000 UTC (24 years, 5 months ago) by albertel
Branches: MAIN
CVS tags: HEAD
- Lots of little changes

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

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