Annotation of capa/capa51/GUITools/classl.tcl, revision 1.5

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.