Annotation of capa/capa51/GUITools/classl.tcl, revision 1.1.1.1
1.1 albertel 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>