Annotation of capa/capa51/GUITools/common.tcl, revision 1.1
1.1 ! albertel 1: set gMaxSet 99
! 2: ###########################################################
! 3: # capaRaise
! 4: ###########################################################
! 5: # tries to make sure that the window mostly definatley ends
! 6: # up on top. Needed to do this beacuase of how an Xserver
! 7: # for WinNT handles raise
! 8: ###########################################################
! 9: # Argument: window - name of the window to get on top
! 10: # Returns : nothing
! 11: # Globals : nothing
! 12: ###########################################################
! 13: proc capaRaise { window } {
! 14: if { $window == "" } { return }
! 15: wm withdraw $window
! 16: wm deiconify $window
! 17: # raise $window
! 18: }
! 19:
! 20: ###########################################################
! 21: # cleanWindowList
! 22: ###########################################################
! 23: ###########################################################
! 24: ###########################################################
! 25: proc cleanWindowList { } {
! 26: global gWindowMenu gCmd gUndoSize gUndo
! 27:
! 28: set gCmd "Tcl Commands executed: [info cmdcount]"
! 29: catch {set gUndoSize "Undo information size [array size gUndo]:[string length [array get gUndo]]"}
! 30: if { ![winfo exists $gWindowMenu] } {
! 31: after 1000 cleanWindowList
! 32: return
! 33: }
! 34: set num [$gWindowMenu index end]
! 35: for { set i 1 } { $i <= $num } { incr i } {
! 36: set window [lindex [$gWindowMenu entrycget $i -command] 1]
! 37: if { ![winfo exists $window] } {
! 38: $gWindowMenu delete $i
! 39: incr i -1
! 40: set num [$gWindowMenu index end]
! 41: }
! 42: }
! 43: after 1000 cleanWindowList
! 44: }
! 45:
! 46: ###########################################################
! 47: # createRemapWindow
! 48: ###########################################################
! 49: # creates the window to start the process of remapping or unmapping
! 50: # the xKeySym for a key
! 51: ###########################################################
! 52: # Argument: none
! 53: # Returns: nothing
! 54: # Globals: gWindowMenu - used to register the window under the windows
! 55: # menu
! 56: ###########################################################
! 57: proc createRemapWindow {} {
! 58: global gWindowMenu
! 59:
! 60: if { [winfo exists .remap] } {
! 61: capaRaise .remap
! 62: return
! 63: }
! 64:
! 65: set remap [toplevel .remap]
! 66: $gWindowMenu add command -label "Remap" -command "capaRaise $remap"
! 67: wm title $remap "Select Remap Command"
! 68:
! 69: label $remap.label -text "This requires that xmodmap be in your path"
! 70: button $remap.delete -text "Remap a key to delete" -command \
! 71: "remap Delete
! 72: destroy $remap
! 73: removeWindowEntry Remap"
! 74: button $remap.backspace -text "Remap a key to backspace" -command \
! 75: "remap BackSpace
! 76: destroy $remap
! 77: removeWindowEntry Remap"
! 78: button $remap.unmap -text "Unmap a remapped key" -command \
! 79: "remap unmap
! 80: destroy $remap
! 81: removeWindowEntry Remap"
! 82: button $remap.cancel -text "Cancel" -command \
! 83: "destroy $remap
! 84: removeWindowEntry Remap"
! 85: pack $remap.label $remap.delete $remap.backspace $remap.unmap \
! 86: $remap.cancel -side top
! 87:
! 88: Centre_Dialog $remap default
! 89: }
! 90:
! 91: ###########################################################
! 92: # remap
! 93: ###########################################################
! 94: # creates a window thaat tells the user to press a key, which globally
! 95: # grabs input, and the runs xmodmap to a file it creates in /tmp named
! 96: # gkc[pid].
! 97: ###########################################################
! 98: # Arguments: one of (Delete,Backspace,unmap), type of remap to preform
! 99: # Returns: nothing
! 100: # Globals: gOriginalKeySyms - stores the KeySyms and keycodes of
! 101: # remmapped keys.
! 102: # gPromptRemap - used to capture the keypress by the user.
! 103: # Files: /tmp/gkc[pid] - stores inforamtion to be run through xmodmap
! 104: # (created and removed)
! 105: ###########################################################
! 106: proc remap { type } {
! 107: global gOriginalKeySyms gPromptRemap
! 108:
! 109: set gPromptRemap(result) ""
! 110:
! 111: switch $type {
! 112: Delete
! 113: -
! 114: BackSpace
! 115: {
! 116: set dialog [toplevel .dialog]
! 117: wm title $dialog "Grabbing keypress"
! 118: label $dialog.label -text "Press the key that you want to remap \
! 119: to $type"
! 120: label $dialog.label2 -textvariable gPromptRemap(result)
! 121: pack $dialog.label $dialog.label2
! 122:
! 123: bind all <KeyPress> "set gPromptRemap(result) \"%k %K\""
! 124: Centre_Dialog $dialog default
! 125: capaRaise $dialog
! 126: focus $dialog
! 127: grab -global $dialog
! 128: vwait gPromptRemap(result)
! 129: grab release $dialog
! 130: destroy $dialog
! 131: bind all <KeyPress> ""
! 132: set oldKeyCode [lindex $gPromptRemap(result) 0]
! 133: set oldKeySym [lindex $gPromptRemap(result) 1]
! 134: set error [catch { set a $gOriginalKeySyms($oldKeyCode) } ]
! 135: if { $error == 1 } {
! 136: set gOriginalKeySyms($oldKeyCode) $oldKeySym
! 137: }
! 138: exec echo "keycode $oldKeyCode = $type" > [ file join / tmp \
! 139: gkc[pid] ]
! 140: exec xmodmap [ file join / tmp gkc[pid] ]
! 141: displayMessage "Remapped $oldKeySym to $type"
! 142: }
! 143: unmap
! 144: {
! 145: set dialog [toplevel .dialog]
! 146: wm title $dialog "Grabbing keypress"
! 147: label $dialog.label -text "Press the key that you want to unmap"
! 148: label $dialog.label2 -textvariable gPromptRemap(result)
! 149: pack $dialog.label $dialog.label2
! 150:
! 151: bind all <KeyPress> "set gPromptRemap(result) \"%k %K\""
! 152: Centre_Dialog $dialog default
! 153: capaRaise $dialog
! 154: focus $dialog
! 155: grab -global $dialog
! 156: vwait gPromptRemap(result)
! 157: grab release $dialog
! 158: destroy $dialog
! 159: bind all <KeyPress> ""
! 160: set oldKeyCode [lindex $gPromptRemap(result) 0]
! 161: set oldKeySym [lindex $gPromptRemap(result) 1]
! 162: set error [catch { set a $gOriginalKeySyms($oldKeyCode) } ]
! 163: if { $error == 1 } {
! 164: displayMessage "Sorry, $oldKeySym has not been remapped \
! 165: since Quizzer has been started."
! 166: } else {
! 167: exec echo "keycode $oldKeyCode = \
! 168: $gOriginalKeySyms($oldKeyCode)" > \
! 169: [ file join / tmp gkc[pid] ]
! 170: exec xmodmap [ file join / tmp gkc[pid] ]
! 171: displayMessage "Remapped $oldKeySym back to \
! 172: $gOriginalKeySyms($oldKeyCode) "
! 173: }
! 174: }
! 175: }
! 176: catch { rm -f [file join / tmp gkc*]}
! 177: }
! 178:
! 179: ###########################################################
! 180: # unmapAllKeys
! 181: ###########################################################
! 182: # wanders through the gOriginalKeySyms var and unmap individually
! 183: # all of the keys that had been remmapped
! 184: ###########################################################
! 185: # Arguments: none
! 186: # Returns: nothing
! 187: # Globals: gOriginalKeySyms - stores the original KeySym values by
! 188: # keycodes that have been remmapped
! 189: # Files: /tmp/gkc[pid] - stores inforamtion to be run through xmodmap
! 190: # (created and removed)
! 191: ###########################################################
! 192: proc unmapAllKeys { } {
! 193: global gOriginalKeySyms
! 194:
! 195: set allKeyCodes [array names gOriginalKeySyms]
! 196:
! 197: while { $allKeyCodes != "" } {
! 198: set oldKeyCode [lindex $allKeyCodes 0]
! 199: set allKeyCodes [lrange $allKeyCodes 1 end]
! 200: exec echo "keycode $oldKeyCode = $gOriginalKeySyms($oldKeyCode)" \
! 201: > [ file join / tmp gkc[pid] ]
! 202: exec xmodmap [ file join / tmp gkc[pid] ]
! 203: catch { rm -rf [ file join / tmp gkc*] }
! 204: }
! 205: #displayMessage "Remapped all keys back to original value."
! 206: }
! 207:
! 208:
! 209: ###########################################################
! 210: # displayError
! 211: ###########################################################
! 212: # displays a modal dialog with an errormessage to the user
! 213: ###########################################################
! 214: # Arguments: the message to be displayed
! 215: # Returns: Nothing
! 216: # Globals: gPromptDE - used to detect when the user presses ok
! 217: ###########################################################
! 218: proc displayError { msg {color black} } {
! 219: global gPromptDE
! 220:
! 221: set dialog [toplevel .prompt -borderwidth 10]
! 222: wm geo $dialog "+200+200"
! 223: wm title $dialog "Error"
! 224:
! 225: message $dialog.warning -text "WARNING" -font 12x24 -aspect 700
! 226: message $dialog.msg -text "$msg" -aspect 700 -foreground $color
! 227: set buttonFrame [frame $dialog.buttons -bd 10]
! 228: pack $dialog.warning $dialog.msg $buttonFrame -side top -fill x
! 229:
! 230: button $buttonFrame.ok -text Dismiss -command { set gPromptDE(ok) 1 } \
! 231: -underline 0
! 232: pack $buttonFrame.ok -side left
! 233:
! 234: Centre_Dialog $dialog default
! 235: update
! 236:
! 237: capaRaise $dialog
! 238: focus $dialog
! 239: capaGrab $dialog
! 240: vwait gPromptDE(ok)
! 241: capaGrab release $dialog
! 242: destroy $dialog
! 243: return
! 244: }
! 245:
! 246: ###########################################################
! 247: # capaGrab
! 248: ###########################################################
! 249: # modification of tcl's grab, this one sets up a binding so that
! 250: # if you click anywhere else the window is reshuffled back to the
! 251: # top
! 252: ###########################################################
! 253: # Arguments: either "window" or "release window"
! 254: # Returns: Nothing
! 255: # Globals: None
! 256: ###########################################################
! 257: proc capaGrab { args } {
! 258: if { [lindex $args 0] == "release" } {
! 259: set window [lindex $args 1]
! 260: grab release $window
! 261: bind all <ButtonRelease> {}
! 262: } else {
! 263: set window [lindex $args 0]
! 264: grab $window
! 265: bind all <ButtonRelease> "capaAutoRaise $window %W"
! 266: }
! 267: }
! 268:
! 269: proc capaAutoRaise { window reportWin } {
! 270: if { $window == $reportWin } {
! 271: capaRaise $window
! 272: focus $window
! 273: }
! 274: }
! 275:
! 276: ###########################################################
! 277: # displayMessage
! 278: ###########################################################
! 279: # displays a modal dialog with a message to the user
! 280: ###########################################################
! 281: # Arguments: the message to be displayed
! 282: # Returns: Nothing
! 283: # Globals: gPromptDM - used to detect when the user presses ok
! 284: ###########################################################
! 285: proc displayMessage { msg {color black} } {
! 286: global gPromptDM
! 287:
! 288: set dialog [toplevel .prompt -borderwidth 10]
! 289: wm geo $dialog "+200+200"
! 290: wm title $dialog "Message"
! 291:
! 292: message $dialog.msg -text "$msg" -aspect 700 -foreground $color
! 293: set buttonFrame [frame $dialog.buttons -bd 10]
! 294: pack $dialog.msg $buttonFrame -side top -fill x
! 295:
! 296: button $buttonFrame.ok -text Dismiss -command { set gPromptDM(ok) 1 } \
! 297: -underline 0
! 298: pack $buttonFrame.ok -side left
! 299:
! 300: bind $buttonFrame.ok <Return> "set gPromptDM(ok) 1"
! 301: Centre_Dialog $dialog default
! 302: update
! 303:
! 304: focus $dialog
! 305: capaRaise $dialog
! 306: capaGrab $dialog
! 307: vwait gPromptDM(ok)
! 308: capaGrab release $dialog
! 309: destroy $dialog
! 310: return
! 311: }
! 312:
! 313: ###########################################################
! 314: # getLprCommand
! 315: ###########################################################
! 316: # builds a command string to print with
! 317: ###########################################################
! 318: # Arguments: name of the file to be printed
! 319: # num - index of options in gCapaConfig
! 320: # Returns: the print command if accepted, Cancel if cancel was hit
! 321: # Globals: gPrompt - the variable watched to control when to
! 322: # remove the dialog
! 323: # gLprCommand - the variable which stores a specified command
! 324: # gCapaConfig - the variable holding the print strings from
! 325: # the capa.config file
! 326: ###########################################################
! 327: proc getLprCommand { PS_file {num ""}} {
! 328: global gLprCommand gPrompt gCapaConfig Printer_selected
! 329:
! 330: if { $num != "" } { set prefix "$num." } else { set prefix "" }
! 331: set showPrinterList false
! 332: set dialog [toplevel .lprCommand -borderwidth 10]
! 333: wm title $dialog "Command to Print"
! 334: wm geo $dialog "+200+200"
! 335:
! 336: set infoFrame [ frame $dialog.infoFrame ]
! 337: set optionsFrame [ frame $dialog.optionsFrame ]
! 338: set buttonFrame [frame $dialog.buttons -bd 10]
! 339: pack $infoFrame $optionsFrame $buttonFrame -side top -fill x -anchor w
! 340:
! 341: message $infoFrame.msg -text "Select a printing method:" -aspect 5000
! 342: pack $infoFrame.msg
! 343:
! 344: set printInfo [frame $optionsFrame.info]
! 345: set printerList [frame $optionsFrame.list]
! 346: set printerListFrame [frame $optionsFrame.printFrame]
! 347: set oneSidedFrame [frame $optionsFrame.oneSided]
! 348: set twoSidedFrame [frame $optionsFrame.twoSided]
! 349: set spaceFrame [frame $optionsFrame.space -height 30]
! 350: set specifiedFrame [frame $optionsFrame.specified]
! 351: pack $printInfo $printerList $oneSidedFrame $twoSidedFrame \
! 352: $spaceFrame $specifiedFrame -side top -anchor w
! 353: pack configure $printInfo -anchor w
! 354: pack configure $printerList -anchor e
! 355:
! 356: if { [array names gLprCommand which] == "" } { set gLprCommand(which) "" }
! 357: radiobutton $oneSidedFrame.radio -text "One Sided" -value \
! 358: "OneSided" -variable gLprCommand(which)
! 359: message $oneSidedFrame.cmd -text $gCapaConfig([set prefix]lprOneSided_command) \
! 360: -relief raised -width 600 -aspect 5000
! 361: if { $gCapaConfig([set prefix]lprOneSided_command) != "" } {
! 362: if { $gLprCommand(which) == "" } { set gLprCommand(which) OneSided }
! 363: set showPrinterList true
! 364: pack $oneSidedFrame.radio $oneSidedFrame.cmd -side top
! 365: pack configure $oneSidedFrame.radio -anchor w
! 366: pack configure $oneSidedFrame.cmd -anchor e
! 367: }
! 368:
! 369: radiobutton $twoSidedFrame.radio -text "Two Sided" -value \
! 370: "TwoSided" -variable gLprCommand(which)
! 371: message $twoSidedFrame.cmd -text $gCapaConfig([set prefix]lprTwoSided_command) \
! 372: -relief raised -width 400 -aspect 5000
! 373: if { $gCapaConfig([set prefix]lprTwoSided_command) != "" } {
! 374: if { $gLprCommand(which) == "" } { set gLprCommand(which) TwoSided }
! 375: set showPrinterList true
! 376: pack $twoSidedFrame.radio $twoSidedFrame.cmd -side top
! 377: pack configure $twoSidedFrame.radio -anchor w
! 378: pack configure $twoSidedFrame.cmd -anchor e
! 379: }
! 380:
! 381: message $printInfo.text -text "\$Printer_selected = " -aspect 5000
! 382: message $printInfo.current -textvariable Printer_selected \
! 383: -aspect 5000
! 384: pack $printInfo.text $printInfo.current -side left
! 385:
! 386: set printerListbox [ listbox $printerList.list -width 20 \
! 387: -yscrollcommand "$printerList.scroll set" -height 3 ]
! 388: scrollbar $printerList.scroll -orient v -command "$printerList.list yview"
! 389: if { $showPrinterList && $gCapaConfig([set prefix]printer_option) != "" } {
! 390: pack $printerListbox $printerList.scroll -side left -anchor e
! 391: pack configure $printerList.scroll -fill y
! 392: foreach printer $gCapaConfig([set prefix]printer_option) {
! 393: $printerListbox insert end $printer
! 394: }
! 395: set Printer_selected [lindex $gCapaConfig([set prefix]printer_option) 0]
! 396: if { $gCapaConfig(Printer_selected) == "" } {
! 397: set gCapaConfig(Printer_selected) 0
! 398: }
! 399: $printerListbox selection set $gCapaConfig(Printer_selected)
! 400: $printerListbox see $gCapaConfig(Printer_selected)
! 401: set script "set Printer_selected \[$printerListbox get \[$printerListbox curselection \] \]"
! 402: eval $script
! 403: bind $printerListbox <B1-ButtonRelease> "eval $script"
! 404: bind $printerListbox <Key> "eval $script"
! 405: bind $printerListbox <Motion> "eval $script"
! 406: }
! 407:
! 408: radiobutton $specifiedFrame.radio -text "Specified" -value \
! 409: "Specified" -variable gLprCommand(which)
! 410: if { $gLprCommand(which) == "" } { set gLprCommand(which) Specified }
! 411: message $specifiedFrame.msg -text "Print command:" -aspect 5000
! 412: entry $specifiedFrame.entry -textvariable gLprCommand(Specified) \
! 413: -width 40 -xscrollcommand "$specifiedFrame.scroll set"
! 414: trace variable gLprCommand(Specified) w \
! 415: "global gLprCommand; set gLprCommand(which) Specified ;#"
! 416: scrollbar $specifiedFrame.scroll -command "$specifiedFrame.entry xview" \
! 417: -orient h
! 418: message $specifiedFrame.msg2 -text "Example: lpr -PlocalPrinter" \
! 419: -aspect 5000
! 420: pack $specifiedFrame.radio $specifiedFrame.msg $specifiedFrame.entry \
! 421: $specifiedFrame.scroll $specifiedFrame.msg2 -side top
! 422: pack configure $specifiedFrame.radio -anchor w
! 423: pack configure $specifiedFrame.entry -anchor w
! 424: pack configure $specifiedFrame.scroll -fill x
! 425:
! 426: button $buttonFrame.ok -text Print -command {set gPrompt(yes) 1} \
! 427: -underline 0
! 428: button $buttonFrame.cancel -text Cancel -command { set gPrompt(yes) 0 } \
! 429: -underline 0
! 430: pack $buttonFrame.ok $buttonFrame.cancel -side left
! 431:
! 432: bind $dialog <Alt-Key> break
! 433:
! 434: Centre_Dialog $dialog default
! 435: update
! 436:
! 437: focus $dialog
! 438: capaRaise $dialog
! 439: capaGrab $dialog
! 440: vwait gPrompt(yes)
! 441: capaGrab release $dialog
! 442: if {$gPrompt(yes)} {
! 443: switch $gLprCommand(which) {
! 444: Specified { set command "$gLprCommand(Specified)" }
! 445: OneSided { set command "$gCapaConfig([set prefix]lprOneSided_command)" }
! 446: TwoSided { set command "$gCapaConfig([set prefix]lprTwoSided_command)" }
! 447: default {
! 448: destroy $dialog
! 449: return "Cancel"
! 450: }
! 451: }
! 452: if { $command == "" } {
! 453: destroy $dialog
! 454: displayError "An empty print command can not be used."
! 455: return "Cancel"
! 456: }
! 457: set gCapaConfig(Printer_selected) [$printerListbox curselection]
! 458: if { [string first \$PS_file $command] == -1 } {
! 459: set command "$command $PS_file"
! 460: set command [subst $command]
! 461: } else {
! 462: set command [subst $command]
! 463: }
! 464: destroy $dialog
! 465: return "$command"
! 466: } else {
! 467: destroy $dialog
! 468: return "Cancel"
! 469: }
! 470: }
! 471:
! 472: ###########################################################
! 473: # makeSure
! 474: ###########################################################
! 475: # generalized Yes No question proc,
! 476: ###########################################################
! 477: # Arguments: a string containing the question to ask the user
! 478: # Returns: Yes, or Cancel
! 479: # Globals: gPrompt - used to watch for a response
! 480: ###########################################################
! 481: proc makeSure { question } {
! 482: global gPrompt
! 483:
! 484: set dialog [toplevel .makeSurePrompt -borderwidth 10]
! 485:
! 486: wm geo $dialog "+200+200"
! 487: message $dialog.msg -text "$question" -aspect 700
! 488:
! 489: set gPrompt(result) ""
! 490: set buttonFrame [frame $dialog.buttons -bd 10]
! 491: pack $dialog.msg $buttonFrame -side top -fill x
! 492:
! 493: button $buttonFrame.yes -text Yes -command {set gPrompt(yes) 1} \
! 494: -underline 0
! 495: frame $buttonFrame.spacer
! 496: button $buttonFrame.cancel -text No -command { set gPrompt(yes) 0 } \
! 497: -underline 0
! 498: pack $buttonFrame.yes $buttonFrame.spacer $buttonFrame.cancel -side left
! 499: pack configure $buttonFrame.spacer -expand 1 -fill x
! 500:
! 501: bind $dialog <Alt-Key> break
! 502:
! 503: Centre_Dialog $dialog default
! 504: update
! 505:
! 506: focus $dialog
! 507: capaRaise $dialog
! 508: capaGrab $dialog
! 509: vwait gPrompt(yes)
! 510: capaGrab release $dialog
! 511: destroy $dialog
! 512: if {$gPrompt(yes)} {
! 513: return Yes
! 514: } else {
! 515: return Cancel
! 516: }
! 517: }
! 518:
! 519: ###########################################################
! 520: # parseCapaConfig
! 521: ###########################################################
! 522: ###########################################################
! 523: ###########################################################
! 524: proc parseCapaConfig { {num "" } { path "" } } {
! 525: global gCapaConfig
! 526:
! 527: if { $num != "" } {
! 528: set prefix "$num."
! 529: } else {
! 530: set prefix ""
! 531: }
! 532: if { $path == "" } { set path [pwd] }
! 533: set filename [file join $path capa.config]
! 534: set error [ catch { set fileId [open $filename "r"] } ]
! 535: if { $error } {
! 536: displayError "Unable to find a capa.config file in $path."
! 537: error "No capa.config"
! 538: }
! 539:
! 540: set saveto ""
! 541: set saveline false
! 542:
! 543: while { 1 } {
! 544: gets $fileId aline
! 545: if { [eof $fileId ] } { break }
! 546: set error [ catch {
! 547: switch -glob -- "$aline" {
! 548: "printer_option *= *" {
! 549: lappend gCapaConfig($prefix[lindex $aline 0]) [lindex $aline end]
! 550: }
! 551: "BeginStandardQuizzerHeader*" {
! 552: set saveto [set prefix]standardQuizzerHeader
! 553: set saveline true
! 554: set gCapaConfig($saveto) ""
! 555: set aline ""
! 556: }
! 557: "EndStandardQuizzerHeader*" {
! 558: set saveto ""
! 559: set saveline false
! 560: }
! 561: "quizzerBackupQZ *= *" -
! 562: "quizzerBackupRef *= *" -
! 563: "lprOneSided_command *= *" -
! 564: "lprTwoSided_command *= *" -
! 565: "latex_command *= *" -
! 566: "allcapaid_command *= *" -
! 567: "qzparse_command *= *" -
! 568: "answers_command *= *" -
! 569: "dvips_command *= *" -
! 570: "xdvi_command *= *" -
! 571: "IMP_color *= *" -
! 572: "comment_color *= *" -
! 573: "exam_path *= *" -
! 574: "quiz_path *= *" -
! 575: "supp_path *= *" -
! 576: "others_path *= *" {
! 577: set gCapaConfig($prefix[lindex $aline 0]) [lindex $aline end]
! 578: }
! 579: }
! 580: }
! 581: ]
! 582: if { $error } {
! 583: displayError "Error in capa.config file in line: $aline"
! 584: }
! 585: if { $saveline } {
! 586: append gCapaConfig($saveto) "$aline\n"
! 587: }
! 588: }
! 589: close $fileId
! 590: return OK
! 591: }
! 592:
! 593: ###########################################################
! 594: # parseCapaUtilsConfig
! 595: ###########################################################
! 596: ###########################################################
! 597: ###########################################################
! 598: proc parseCapaUtilsConfig { num path } {
! 599: global gCapaConfig
! 600:
! 601: set filename [file join $path capa.config]
! 602: set error [ catch { set fileId [open $filename "r"] } ]
! 603: if { $error } {
! 604: displayError "Unable to find a capautils.config file in $path."
! 605: error "No capautils.config"
! 606: }
! 607:
! 608: set saveto ""
! 609: set saveline false
! 610:
! 611: while { 1 } {
! 612: gets $fileId aline
! 613: if { [eof $fileId ] } { break }
! 614: set error [ catch {
! 615: switch -glob -- "$aline" {
! 616: "homework_scores_limit_set *= *" -
! 617: "exam_scores_limit_set *= *" -
! 618: "quiz_scores_limit_set *= *" -
! 619: "supp_scores_limit_set *= *" -
! 620: "others_scores_limit_set *= *" -
! 621: "master_scores_file *= *" -
! 622: "email_template_file *= *" -
! 623: "correction_factor *= *" -
! 624: "hw_percent *= *" -
! 625: "qz_percent *= *" -
! 626: "mt1_percent *= *" -
! 627: "mt2_percent *= *" -
! 628: "mt3_percent *= *" -
! 629: "final_percent *= *" -
! 630: "category_one_high *= *" -
! 631: "category_one_low *= *" -
! 632: "category_two_high *= *" -
! 633: "category_two_low *= *" -
! 634: "category_three_high *= *" -
! 635: "category_three_low *= *" -
! 636: "category_four_high *= *" -
! 637: "category_four_low *= *" -
! 638: "display_score_row_limit *= *"
! 639: {
! 640: set gCapaConfig($num.[lindex $aline 0]) [lindex $aline end]
! 641: }
! 642: }
! 643: }
! 644: ]
! 645: if { $error } {
! 646: displayError "Error in capautils.config file in line: $aline"
! 647: }
! 648: if { $saveline } {
! 649: append capaConfig($saveto) "$aline\n"
! 650: }
! 651: }
! 652: return OK
! 653: }
! 654:
! 655: ###########################################################
! 656: # removeWindowEntry
! 657: ###########################################################
! 658: # used to deregister a Window Menu entry
! 659: ###########################################################
! 660: # Arguments: the label the window was registered under
! 661: # Returns: nothing
! 662: # Globals: gWindowMenu - name of the WindowMenu
! 663: ###########################################################
! 664: proc removeWindowEntry { label } {
! 665: global gWindowMenu
! 666:
! 667: catch {$gWindowMenu delete $label}
! 668: }
! 669:
! 670: proc scrolltwo { firstcommand secondcommand args } {
! 671: eval "$firstcommand $args"
! 672: eval "$secondcommand $args"
! 673: }
! 674:
! 675: ###########################################################
! 676: # getTextTagged
! 677: ###########################################################
! 678: ###########################################################
! 679: ###########################################################
! 680: proc getTextTagged { window tag } {
! 681: if { $tag == "" } { return [$window get 0.0 end-1c] }
! 682: set result ""
! 683: set range [$window tag nextrange $tag 0.0]
! 684: while { $range != "" } {
! 685: set index [lindex $range 1]
! 686: append result [eval "$window get $range"]
! 687: append result "\n"
! 688: set range [$window tag nextrange $tag $index]
! 689: }
! 690: return $result
! 691: }
! 692:
! 693: ###########################################################
! 694: # getWhichTags
! 695: ###########################################################
! 696: ###########################################################
! 697: ###########################################################
! 698: proc getWhichTags { descriptions tags action } {
! 699: set whichtag [eval "tk_dialog .whichtag {Select which messages} \
! 700: {Select which set of messages will be $action.} \
! 701: {} 0 $descriptions"]
! 702: return [lindex $tags $whichtag]
! 703: }
! 704:
! 705: ###########################################################
! 706: # displayStatus
! 707: ###########################################################
! 708: # creates a window on the screen with one or both of a message
! 709: # or a canvas with a status bar, uses updateStatusMessage and
! 710: # updateStatusBar to update the respective parts of the status
! 711: # window, and use removeStatus to remove the status bar from
! 712: # the screen
! 713: ###########################################################
! 714: # Arguments: the message to be displayed (a blank if one is not wanted)
! 715: # and one of (both, bar, or message) to specify what
! 716: # parts one wnats in the status bar and optionally a number
! 717: # if there might be more than one Status at a time
! 718: # Returns: Nothing
! 719: # Globals: gStatus - an array containing information for the status
! 720: # ($num.type) - the type of status
! 721: # ($num.message) - the message in the status window
! 722: # ($num.bar) - the id number of the rectangle in the canvas
! 723: # (num) - (Optional) if there are multiple Statuses
! 724: # the number of the Status
! 725: ###########################################################
! 726: proc displayStatus { message type {num 0} } {
! 727: global gStatus
! 728: if { [winfo exists .status$num]} {
! 729: capaRaise .status$num
! 730: return
! 731: }
! 732:
! 733: set status [toplevel .status$num]
! 734:
! 735: set gStatus($num.type) $type
! 736: set gStatus($num.message) "$message"
! 737:
! 738: switch $type {
! 739: spinner {
! 740: message $status.msg -textvariable gStatus($num.message) -aspect 700
! 741: set gStatus($num.spinner) "-"
! 742: message $status.spinner -textvariable gStatus($num.spinner) -aspect 700
! 743: pack $status.msg $status.spinner -side top
! 744: }
! 745: both -
! 746: bar {
! 747: message $status.msg -textvariable gStatus($num.message) -aspect 700
! 748: canvas $status.canvas -width 200 -height 20
! 749: $status.canvas create rectangle 1 1 199 19 -outline black
! 750: set gStatus($num.bar) [$status.canvas create rectangle 1 1 1 19 \
! 751: -fill red -outline black]
! 752: pack $status.msg $status.canvas -side top
! 753: }
! 754: message {
! 755: message $status.msg -textvariable gStatus($num.message) -aspect 700
! 756: pack $status.msg
! 757: }
! 758: }
! 759: Centre_Dialog $status default
! 760: update idletasks
! 761: }
! 762:
! 763: ###########################################################
! 764: # updateStatusMessage
! 765: ###########################################################
! 766: # updates the message in the status bar
! 767: ###########################################################
! 768: # Arguments: the new message for the status bar and optionally a number
! 769: # if there might be more than one Status at a time
! 770: # Returns: Nothing
! 771: # Globals: gStatus - an array containing information for the status
! 772: # ($num.type) - the type of status
! 773: # ($num.message) - the message in the status window
! 774: # ($num.bar) - the id number of the rectangle in the canvas
! 775: # (num) - (Optional) if there are multiple Statuses
! 776: # the number of the Status
! 777: ###########################################################
! 778: proc updateStatusMessage { message { num 0 } } {
! 779: global gStatus
! 780: set gStatus($num.message) "$message"
! 781: update idletasks
! 782: }
! 783:
! 784: ###########################################################
! 785: # updateStatusBar
! 786: ###########################################################
! 787: # updates the bar in the status bar
! 788: ###########################################################
! 789: # Arguments: a floating point number between 0 and 1 that is
! 790: # the percentage done and optionally a number
! 791: # if there might be more than one Status at a time
! 792: # Returns: Nothing
! 793: # Globals: gStatus - an array containing information for the status
! 794: # ($num.type) - the type of status
! 795: # ($num.message) - the message in the status window
! 796: # ($num.bar) - the id number of the rectangle in the canvas
! 797: # (num) - (Optional) if there are multiple Statuses
! 798: # the number of the Status
! 799: ###########################################################
! 800: proc updateStatusBar { percent { num 0 } } {
! 801: global gStatus
! 802: .status$num.canvas coords $gStatus($num.bar) 1 1 [expr $percent * 200 ] 19
! 803: update idletasks
! 804: }
! 805:
! 806: ###########################################################
! 807: # updateStatusSpinner
! 808: ###########################################################
! 809: # updates the spinner in the status bar
! 810: ###########################################################
! 811: # Arguments: optionally a number if there might be more
! 812: # than one Status at a time
! 813: # Returns: Nothing
! 814: # Globals: gStatus - an array containing information for the status
! 815: # ($num.type) - the type of status
! 816: # ($num.message) - the message in the status window
! 817: # ($num.bar) - the id number of the rectangle in the canvas
! 818: # (num) - (Optional) if there are multiple Statuses
! 819: # the number of the Status
! 820: ###########################################################
! 821: proc updateStatusSpinner { { num 0 } } {
! 822: global gStatus
! 823: switch -- $gStatus($num.spinner) {
! 824: "-" { set gStatus($num.spinner) "\\" }
! 825: "\\" { set gStatus($num.spinner) "|" }
! 826: "|" { set gStatus($num.spinner) "/" }
! 827: "/" { set gStatus($num.spinner) "-" }
! 828: }
! 829: update idletasks
! 830: }
! 831:
! 832: ###########################################################
! 833: # removeStatus
! 834: ###########################################################
! 835: # takes the status message off of the screen, must be eventually
! 836: # called after a call to displayStatus
! 837: ###########################################################
! 838: # Arguments: and optionally a number if there might be more
! 839: # than one Status at a time
! 840: # Returns: Nothing
! 841: # Globals: gStatus - an array containing information for the status
! 842: # ($num.type) - the type of status
! 843: # ($num.message) - the message in the status window
! 844: # ($num.bar) - the id number of the rectangle in the canvas
! 845: ###########################################################
! 846: proc removeStatus { {num 0 } } {
! 847: global gStatus
! 848: foreach name [array names gStatus "$num.*"] { unset gStatus($name) }
! 849: destroy .status$num
! 850: update idletasks
! 851: }
! 852:
! 853: ###########################################################
! 854: # tkFDialogResolveFile
! 855: ###########################################################
! 856: # I don't like how this version of the Tcl dialog box code
! 857: # evaluates links, my code here makes it so that clicking
! 858: # on Open does the same thing as double clicking does, it
! 859: # returns the path in the top of the dialog box along with
! 860: # the new filename
! 861: ###########################################################
! 862: # I do this catch command to get Tcl to source the
! 863: # tkfbox.tcl file, then I change the tkFDialogResolveFile
! 864: # command
! 865: ###########################################################
! 866: catch {tkFDialogResolveFile}
! 867: proc tkFDialogResolveFile {context text defaultext} {
! 868: set appPWD [pwd]
! 869:
! 870: set path [tkFDialog_JoinFile $context $text]
! 871:
! 872: if {[file ext $path] == ""} {
! 873: set path "$path$defaultext"
! 874: }
! 875:
! 876: if [catch {file exists $path}] {
! 877: return [list ERROR $path ""]
! 878: }
! 879:
! 880: if [catch {if [file exists $path] {}}] {
! 881: # This "if" block can be safely removed if the following code returns
! 882: # an error. It currently (7/22/97) doesn't
! 883: #
! 884: # file exists ~nonsuchuser
! 885: #
! 886: return [list ERROR $path ""]
! 887: }
! 888:
! 889: if [file exists $path] {
! 890: if [file isdirectory $path] {
! 891: if [catch {
! 892: cd $path
! 893: }] {
! 894: return [list CHDIR $path ""]
! 895: }
! 896: set directory [pwd]
! 897: set file ""
! 898: set flag OK
! 899: cd $appPWD
! 900: } else {
! 901: if [catch {
! 902: cd [file dirname $path]
! 903: }] {
! 904: return [list CHDIR [file dirname $path] ""]
! 905: }
! 906: set directory [pwd]
! 907: set directory [file dirname $path]
! 908: set file [file tail $path]
! 909: set flag OK
! 910: cd $appPWD
! 911: }
! 912: } else {
! 913: set dirname [file dirname $path]
! 914: if [file exists $dirname] {
! 915: if [catch {
! 916: cd $dirname
! 917: }] {
! 918: return [list CHDIR $dirname ""]
! 919: }
! 920: set directory [pwd]
! 921: set file [file tail $path]
! 922: if [regexp {[*]|[?]} $file] {
! 923: set flag PATTERN
! 924: } else {
! 925: set flag FILE
! 926: }
! 927: cd $appPWD
! 928: } else {
! 929: set directory $dirname
! 930: set file [file tail $path]
! 931: set flag PATH
! 932: }
! 933: }
! 934:
! 935: return [list $flag $directory $file]
! 936: }
! 937:
! 938: ###########################################################
! 939: # tkIconList_Create
! 940: ###########################################################
! 941: # Ed wants a bigger default dialog box
! 942: ###########################################################
! 943: # I do this catch command to get Tcl to source the
! 944: # tkfbox.tcl file, then I change the tkIconList_Create
! 945: # command
! 946: ###########################################################
! 947: catch {tkIconList_Create}
! 948: proc tkIconList_Create {w} {
! 949: upvar #0 $w data
! 950:
! 951: frame $w
! 952: set data(sbar) [scrollbar $w.sbar -orient horizontal \
! 953: -highlightthickness 0 -takefocus 0]
! 954: set data(canvas) [canvas $w.canvas -bd 2 -relief sunken \
! 955: -width 600 -height 180 -takefocus 1]
! 956: pack $data(sbar) -side bottom -fill x -padx 2
! 957: pack $data(canvas) -expand yes -fill both
! 958:
! 959: $data(sbar) config -command "$data(canvas) xview"
! 960: $data(canvas) config -xscrollcommand "$data(sbar) set"
! 961:
! 962: # Initializes the max icon/text width and height and other variables
! 963: #
! 964: set data(maxIW) 1
! 965: set data(maxIH) 1
! 966: set data(maxTW) 1
! 967: set data(maxTH) 1
! 968: set data(numItems) 0
! 969: set data(curItem) {}
! 970: set data(noScroll) 1
! 971:
! 972: # Creates the event bindings.
! 973: #
! 974: bind $data(canvas) <Configure> "tkIconList_Arrange $w"
! 975:
! 976: bind $data(canvas) <1> "tkIconList_Btn1 $w %x %y"
! 977: bind $data(canvas) <B1-Motion> "tkIconList_Motion1 $w %x %y"
! 978: bind $data(canvas) <Double-1> "tkIconList_Double1 $w %x %y"
! 979: bind $data(canvas) <ButtonRelease-1> "tkCancelRepeat"
! 980: bind $data(canvas) <B1-Leave> "tkIconList_Leave1 $w %x %y"
! 981: bind $data(canvas) <B1-Enter> "tkCancelRepeat"
! 982:
! 983: bind $data(canvas) <Up> "tkIconList_UpDown $w -1"
! 984: bind $data(canvas) <Down> "tkIconList_UpDown $w 1"
! 985: bind $data(canvas) <Left> "tkIconList_LeftRight $w -1"
! 986: bind $data(canvas) <Right> "tkIconList_LeftRight $w 1"
! 987: bind $data(canvas) <Return> "tkIconList_ReturnKey $w"
! 988: bind $data(canvas) <KeyPress> "tkIconList_KeyPress $w %A"
! 989: bind $data(canvas) <Control-KeyPress> ";"
! 990: bind $data(canvas) <Alt-KeyPress> ";"
! 991:
! 992: bind $data(canvas) <FocusIn> "tkIconList_FocusIn $w"
! 993:
! 994: return $w
! 995: }
! 996:
! 997: ###########################################################
! 998: # findByStudentNumber
! 999: ###########################################################
! 1000: ###########################################################
! 1001: ###########################################################
! 1002: proc findByStudentNumber { pattern path } {
! 1003: set file [file join $path "classl"]
! 1004: if {[catch {set fileId [open $file "r"]}]} { return "" }
! 1005: set matched_entries ""
! 1006: set aline [gets $fileId]
! 1007: while { ! [eof $fileId] } {
! 1008: set aline [string trimright $aline]
! 1009: set tmp_sn [string range $aline 14 22]
! 1010: if { [regexp -nocase $pattern $tmp_sn] } {
! 1011: lappend matched_entries [ list $tmp_sn [string range $aline 24 53] ]
! 1012: }
! 1013: set aline [gets $fileId]
! 1014: }
! 1015: close $fileId
! 1016: return $matched_entries
! 1017: }
! 1018:
! 1019: ###########################################################
! 1020: # findByStudentName
! 1021: ###########################################################
! 1022: ###########################################################
! 1023: ###########################################################
! 1024: proc findByStudentName { pattern path } {
! 1025: set file [file join $path "classl"]
! 1026: if {[catch {set fileId [open $file "r"]}]} { return "" }
! 1027: set matched_entries ""
! 1028: set aline [gets $fileId]
! 1029: while { ! [eof $fileId] } {
! 1030: set aline [string trimright $aline]
! 1031: set tmp_name [string range $aline 24 53]
! 1032: if { [regexp -nocase $pattern $tmp_name] } {
! 1033: lappend matched_entries [list [string range $aline 14 22] $tmp_name]
! 1034: }
! 1035: set aline [gets $fileId]
! 1036: }
! 1037: close $fileId
! 1038: return $matched_entries
! 1039: }
! 1040:
! 1041: ###########################################################
! 1042: # fillInStudent
! 1043: ###########################################################
! 1044: ###########################################################
! 1045: ###########################################################
! 1046: proc fillInStudent { fullnameVar numberVar doname } {
! 1047: upvar $fullnameVar fullname $numberVar number
! 1048:
! 1049: if { !$doname } {
! 1050: set matched_entries [findByStudentNumber [string trim $number] .]
! 1051: } else {
! 1052: set matched_entries [findByStudentName [string trim $fullname] .]
! 1053: }
! 1054: if { [llength $matched_entries] == 0 } {
! 1055: displayMessage "No student found. Please re-enter student info."
! 1056: set id ""; set name ""
! 1057: } elseif { [llength $matched_entries] == 1 } {
! 1058: set id [lindex [lindex $matched_entries 0] 0]
! 1059: set name [lindex [lindex $matched_entries 0] 1]
! 1060: } else {
! 1061: set select [ multipleChoice .main "Matched Student Records, Select one" \
! 1062: $matched_entries ]
! 1063: if { $select == "" } {
! 1064: set id ""; set name ""
! 1065: } else {
! 1066: set id [lindex $select 0]
! 1067: set name [lindex $select 1]
! 1068: }
! 1069: }
! 1070: set fullname $name
! 1071: set number $id
! 1072: }
! 1073:
! 1074: ###########################################################
! 1075: # getOneStudent
! 1076: ###########################################################
! 1077: # Lets you pick a student by name or student number
! 1078: # then verifies that they are in the classlist
! 1079: ###########################################################
! 1080: ###########################################################
! 1081: proc getOneStudent { window path idVar nameVar {message "" } {message2 ""}} {
! 1082: upvar $idVar id
! 1083: upvar $nameVar name
! 1084:
! 1085: set select [tk_dialog $window.dialog "Student select method" \
! 1086: "$message Select student by:" "" "" "Student Number" \
! 1087: "Student Name" "Cancel"]
! 1088: if { $select == 2 } {
! 1089: set id ""
! 1090: set name ""
! 1091: return
! 1092: }
! 1093: set done 0
! 1094: while { ! $done } {
! 1095: if { $select } { set search "name" } { set search "number" }
! 1096: set pattern [ getString $window "$message Please enter a student $search." ]
! 1097: if {$pattern == "" } {
! 1098: set done 1
! 1099: set id ""
! 1100: set name ""
! 1101: continue
! 1102: }
! 1103: if { $select } {
! 1104: set matched_entries [findByStudentName $pattern $path]
! 1105: } else {
! 1106: set matched_entries [findByStudentNumber $pattern $path]
! 1107: }
! 1108: if { [llength $matched_entries] == 0 } {
! 1109: displayMessage "No student found. Please re-enter student $search."
! 1110: } elseif { [llength $matched_entries] == 1 } {
! 1111: set id [lindex [lindex $matched_entries 0] 0]
! 1112: set name [lindex [lindex $matched_entries 0] 1]
! 1113: set done 1
! 1114: } elseif { [llength $matched_entries] < 30 } {
! 1115: set select [ multipleChoice $window "Matched Student Records, Select one. $message2" \
! 1116: $matched_entries ]
! 1117: if { $select == "" } {
! 1118: set id ""; set name ""
! 1119: return
! 1120: }
! 1121: set id [lindex $select 0]
! 1122: set name [lindex $select 1]
! 1123: set done 1
! 1124: } else {
! 1125: displayMessage "There were [llength $matched_entries], please enter more data to narrow the search."
! 1126: }
! 1127: }
! 1128: }
! 1129:
! 1130: ###########################################################
! 1131: # getString
! 1132: ###########################################################
! 1133: ###########################################################
! 1134: ###########################################################
! 1135: proc getString { window message } {
! 1136: global gPrompt
! 1137: set setWin [toplevel $window.getstring]
! 1138:
! 1139: set msgFrame [frame $setWin.msgFrame]
! 1140: set valFrame [frame $setWin.valFrame]
! 1141: set buttonFrame [frame $setWin.buttonFrame]
! 1142: pack $msgFrame $valFrame $buttonFrame
! 1143:
! 1144:
! 1145: set gPrompt(val) ""
! 1146: entry $valFrame.val -textvariable gPrompt(val)
! 1147: pack $valFrame.val
! 1148:
! 1149: message $msgFrame.msg -text $message -aspect 3000
! 1150: pack $msgFrame.msg
! 1151:
! 1152: button $buttonFrame.select -text "Continue" -command { set gPrompt(ok) 1 }
! 1153: button $buttonFrame.cancel -text "Cancel" -command { set gPrompt(ok) 0 }
! 1154: pack $buttonFrame.select $buttonFrame.cancel -side left
! 1155:
! 1156:
! 1157: bind $setWin <Return> "set gPrompt(ok) 1"
! 1158: Centre_Dialog $setWin default
! 1159: update idletasks
! 1160: focus $setWin
! 1161: focus $valFrame.val
! 1162: capaRaise $setWin
! 1163: capaGrab $setWin
! 1164: vwait gPrompt(ok)
! 1165: capaGrab release $setWin
! 1166: destroy $setWin
! 1167: if { $gPrompt(ok) == 1 } {
! 1168: return $gPrompt(val)
! 1169: } else {
! 1170: return ""
! 1171: }
! 1172: }
! 1173:
! 1174: ###########################################################
! 1175: # multipleChoice
! 1176: ###########################################################
! 1177: ###########################################################
! 1178: ###########################################################
! 1179: proc multipleChoice { window message choices {single 1}} {
! 1180: global gPromptMC
! 1181:
! 1182: set setWin [toplevel $window.getstring]
! 1183:
! 1184: set msgFrame [frame $setWin.msgFrame]
! 1185: set valFrame [frame $setWin.valFrame]
! 1186: set buttonFrame [frame $setWin.buttonFrame]
! 1187: pack $msgFrame $valFrame $buttonFrame
! 1188: pack configure $valFrame -expand 1 -fill both
! 1189:
! 1190: message $msgFrame.msg -text $message -aspect 3000
! 1191: pack $msgFrame.msg
! 1192:
! 1193: set maxWidth 1
! 1194: foreach choice $choices {
! 1195: if {[string length $choice] > $maxWidth} {set maxWidth [string length $choice]}
! 1196: }
! 1197: set selectMode extended
! 1198: if { $single } { set selectMode single }
! 1199: listbox $valFrame.val -width [expr $maxWidth + 2] \
! 1200: -yscrollcommand "$valFrame.scroll set" -selectmode $selectMode
! 1201: scrollbar $valFrame.scroll -command "$valFrame.val yview"
! 1202: pack $valFrame.val $valFrame.scroll -side left
! 1203: pack configure $valFrame.val -expand 1 -fill both
! 1204: pack configure $valFrame.scroll -expand 0 -fill y
! 1205: foreach choice $choices { $valFrame.val insert end $choice }
! 1206:
! 1207: button $buttonFrame.select -text "Continue" -command { set gPromptMC(ok) 1 }
! 1208: frame $buttonFrame.spacer -width 10
! 1209: button $buttonFrame.selectall -text "SelectAll" -command \
! 1210: "$valFrame.val selection set 0 end"
! 1211: button $buttonFrame.cancel -text "Cancel" -command { set gPromptMC(ok) 0 }
! 1212: if { $single } {
! 1213: pack $buttonFrame.select $buttonFrame.cancel -side left
! 1214: } else {
! 1215: pack $buttonFrame.select $buttonFrame.spacer \
! 1216: $buttonFrame.selectall $buttonFrame.cancel -side left
! 1217: }
! 1218:
! 1219: bind $setWin <Return> "set gPromptMC(ok) 1"
! 1220: Centre_Dialog $setWin default
! 1221: update idletasks
! 1222: focus $setWin
! 1223: capaRaise $setWin
! 1224: capaGrab $setWin
! 1225: while { 1 } {
! 1226: update idletasks
! 1227: vwait gPromptMC(ok)
! 1228: if { $gPromptMC(ok) != 1 } { break }
! 1229: set select [$valFrame.val curselection]
! 1230: if { $select != "" } { break }
! 1231: }
! 1232: capaGrab release $setWin
! 1233: destroy $setWin
! 1234: if { $gPromptMC(ok) == 1 } {
! 1235: foreach selection $select { lappend result [lindex $choices $selection] }
! 1236: if { [llength $result] == 1 } { set result [lindex $result 0] }
! 1237: return $result
! 1238: } else {
! 1239: return ""
! 1240: }
! 1241: }
! 1242:
! 1243: ###########################################################
! 1244: # getSetRange
! 1245: ###########################################################
! 1246: ###########################################################
! 1247: ###########################################################
! 1248: proc getSetRange { window path } {
! 1249: global gMaxSet gPromptGSR
! 1250: for { set i 1 } { $i <= $gMaxSet } { incr i } {
! 1251: if { ! [file exists [file join $path records "set$i.db"]] } { break }
! 1252: }
! 1253: incr i -1
! 1254:
! 1255: set setWin [toplevel $window.setselect]
! 1256:
! 1257: set msgFrame [frame $setWin.msgFrame]
! 1258: set valFrame [frame $setWin.calFrame]
! 1259: set buttonFrame [frame $setWin.buttonFrame]
! 1260: pack $msgFrame $valFrame $buttonFrame
! 1261:
! 1262: message $msgFrame.msg -text "Please select a set range:" -aspect 1000
! 1263: pack $msgFrame.msg
! 1264:
! 1265: global gSetNumberStart gSetNumberEnd
! 1266: scale $valFrame.start -from 1 -to $i -variable gSetNumberStart -orient h
! 1267: scale $valFrame.end -from 1 -to $i -variable gSetNumberEnd -orient h
! 1268: pack $valFrame.start $valFrame.end
! 1269:
! 1270: button $buttonFrame.select -text "Select" -command { set gPromptGSR(ok) 1 }
! 1271: button $buttonFrame.cancel -text "Cancel" -command { set gPromptGSR(ok) 0 }
! 1272: pack $buttonFrame.select $buttonFrame.cancel -side left
! 1273:
! 1274: bind $setWin <Return> "set gPromptGSR(ok) 1"
! 1275: Centre_Dialog $setWin default
! 1276: update idletasks
! 1277: focus $setWin
! 1278: capaRaise $setWin
! 1279: capaGrab $setWin
! 1280: vwait gPromptGSR(ok)
! 1281: capaGrab release $setWin
! 1282: destroy $setWin
! 1283: if { $gPromptGSR(ok) == 1 } {
! 1284: set setIdStart $gSetNumberStart
! 1285: set setIdEnd $gSetNumberEnd
! 1286: if { $setIdStart > $setIdEnd } { set setIdEnd $setIdStart }
! 1287: unset gSetNumberStart
! 1288: unset gSetNumberEnd
! 1289: return [list $setIdStart $setIdEnd]
! 1290: } else {
! 1291: unset gSetNumberStart
! 1292: unset gSetNumberEnd
! 1293: return ""
! 1294: }
! 1295: }
! 1296:
! 1297: ###########################################################
! 1298: # getOneSet
! 1299: ###########################################################
! 1300: ###########################################################
! 1301: ###########################################################
! 1302: proc getOneSet { window path } {
! 1303: global gMaxSet gPromptGOS
! 1304: for { set i 1 } { $i <= $gMaxSet } { incr i } {
! 1305: if { ! [file exists [file join $path records "set$i.db"]] } { break }
! 1306: }
! 1307: incr i -1
! 1308:
! 1309: set setWin [toplevel $window.setselect]
! 1310:
! 1311: set msgFrame [frame $setWin.msgFrame]
! 1312: set valFrame [frame $setWin.calFrame]
! 1313: set buttonFrame [frame $setWin.buttonFrame]
! 1314: pack $msgFrame $valFrame $buttonFrame
! 1315:
! 1316: message $msgFrame.msg -text "Please select a set:" -aspect 1000
! 1317: pack $msgFrame.msg
! 1318:
! 1319: global gSetNumber
! 1320: scale $valFrame.val -from 1 -to $i -variable gSetNumber -orient h
! 1321: pack $valFrame.val
! 1322:
! 1323: button $buttonFrame.select -text "Select" -command { set gPromptGOS(ok) 1 }
! 1324: button $buttonFrame.cancel -text "Cancel" -command { set gPromptGOS(ok) 0 }
! 1325: pack $buttonFrame.select $buttonFrame.cancel -side left
! 1326:
! 1327: bind $setWin <Return> "set gPromptGOS(ok) 1"
! 1328: Centre_Dialog $setWin default
! 1329: update idletasks
! 1330: focus $setWin
! 1331: capaRaise $setWin
! 1332: capaGrab $setWin
! 1333: vwait gPromptGOS(ok)
! 1334: capaGrab release $setWin
! 1335: destroy $setWin
! 1336: if { $gPromptGOS(ok) == 1 } {
! 1337: set setId $gSetNumber
! 1338: unset gSetNumber
! 1339: return $setId
! 1340: } else {
! 1341: unset gSetNumber
! 1342: return ""
! 1343: }
! 1344: }
! 1345:
! 1346: ###########################################################
! 1347: # pickSections
! 1348: ###########################################################
! 1349: ###########################################################
! 1350: ###########################################################
! 1351: proc pickSections { sectionsToPickFrom {title "Select Sections"} {window ""}} {
! 1352: global gPromptPS
! 1353:
! 1354: set dialog [toplevel $window.pickSections -borderwidth 10]
! 1355: wm title $dialog "Which Sections"
! 1356:
! 1357: set infoFrame [frame $dialog.info ]
! 1358: set sectionListFrame [frame $dialog.list -relief groove -borderwidth 5]
! 1359: set buttonFrame [frame $dialog.buttons -bd 10]
! 1360: pack $infoFrame $sectionListFrame $buttonFrame -side top -fill x
! 1361:
! 1362: message $infoFrame.msg -text $title -aspect 5000
! 1363: pack $infoFrame.msg
! 1364:
! 1365: set headerFrame [frame $sectionListFrame.head ]
! 1366: set listboxFrame [frame $sectionListFrame.listboxframe]
! 1367: pack $headerFrame $listboxFrame -side top
! 1368: pack configure $headerFrame -anchor w
! 1369:
! 1370: message $headerFrame.msg -text "Section number # of students" \
! 1371: -aspect 5000
! 1372: pack $headerFrame.msg
! 1373:
! 1374: set sectionList [ listbox $listboxFrame.list \
! 1375: -yscrollcommand "$listboxFrame.scroll set" \
! 1376: -width 30 -height 10 -selectmode extended ]
! 1377: scrollbar $listboxFrame.scroll \
! 1378: -command "$listboxFrame.list yview" \
! 1379: -orient v
! 1380: pack $sectionList $listboxFrame.scroll -side left
! 1381: pack configure $listboxFrame.scroll -fill y
! 1382:
! 1383: foreach section $sectionsToPickFrom {
! 1384: $sectionList insert end \
! 1385: [format "%3d %4d" [lindex $section 0]\
! 1386: [lindex $section 1] ]
! 1387: }
! 1388:
! 1389: button $buttonFrame.yes -text Continue -command {set gPromptPS(yes) 1} \
! 1390: -underline 0
! 1391: frame $buttonFrame.spacer -width 10
! 1392: button $buttonFrame.selectall -text "SelectAll" -command \
! 1393: "$sectionList selection set 0 end"
! 1394: button $buttonFrame.cancel -text Cancel -command { set gPromptPS(yes) 0 } \
! 1395: -underline 0
! 1396: bind $dialog <Destroy> "set gPromptPS(yes) 0"
! 1397:
! 1398: pack $buttonFrame.yes $buttonFrame.spacer \
! 1399: $buttonFrame.selectall $buttonFrame.cancel -side left
! 1400:
! 1401: bind $dialog <Alt-Key> break
! 1402:
! 1403: Centre_Dialog $dialog default
! 1404: update
! 1405:
! 1406: focus $dialog
! 1407: capaRaise $dialog
! 1408: capaGrab $dialog
! 1409: vwait gPromptPS(yes)
! 1410: capaGrab release $dialog
! 1411: bind $dialog <Destroy> ""
! 1412: if {$gPromptPS(yes)} {
! 1413: set selectionList [ $sectionList curselection ]
! 1414: set sectionsToPrint ""
! 1415: foreach selection $selectionList {
! 1416: append sectionsToPrint "[lindex [$sectionList get $selection] 0] "
! 1417: }
! 1418: destroy $dialog
! 1419: return $sectionsToPrint
! 1420: } else {
! 1421: destroy $dialog
! 1422: return Cancel
! 1423: }
! 1424: }
! 1425:
! 1426: ###########################################################
! 1427: # getSet
! 1428: ###########################################################
! 1429: ###########################################################
! 1430: ###########################################################
! 1431: proc getSet { pid set followupCommand {start 1}} {
! 1432: global gCapaConfig gGetSet gUniqueNumber
! 1433: set num [incr gUniqueNumber]
! 1434: if { $start } {
! 1435: set gGetSet($num.toprocess) $pid
! 1436: set gGetSet($num.command) $followupCommand
! 1437: foreach name [array names gGetSet {*.[alhu]*}] { unset gGetSet($name) }
! 1438: if { [array names gGetSet exit] == "" } { set gGetSet(exit) 0 }
! 1439: }
! 1440: if { [catch {set gCapaConfig(getSet.answers_command)}] } {parseCapaConfig getSet}
! 1441: set command "$gCapaConfig(getSet.answers_command) $pid {} {} $set"
! 1442: foreach var [array names gCapaConfig $num.*] { unset gCapaConfig($var) }
! 1443: set fileId [open "|$command" "r"]
! 1444: fileevent $fileId readable "getSetLine $num $fileId"
! 1445: update idletasks
! 1446: }
! 1447:
! 1448: ###########################################################
! 1449: # getSetQuestion
! 1450: ###########################################################
! 1451: ###########################################################
! 1452: ###########################################################
! 1453: proc getSetQuestion { num fileId } {
! 1454: global gGetSet
! 1455: if { $gGetSet(exit) } {
! 1456: fileevent $fileId readable ""
! 1457: catch {close $fileId}
! 1458: return
! 1459: }
! 1460: set questNum $gGetSet($num.questNum)
! 1461: set aline [gets $fileId]
! 1462: if { $aline != "" } {
! 1463: switch [lindex [split $aline :] 0] {
! 1464: EQES { fileevent $fileId readable "getSetLine $num $fileId" }
! 1465: default { lappend gGetSet($num.$questNum.quest) $aline }
! 1466: }
! 1467: }
! 1468: if { [eof $fileId] } { getSetEnd $fileId }
! 1469: }
! 1470:
! 1471: ###########################################################
! 1472: # getSetLine
! 1473: ###########################################################
! 1474: ###########################################################
! 1475: ###########################################################
! 1476: proc getSetLine { num fileId } {
! 1477: global gGetSet
! 1478:
! 1479: if { $gGetSet(exit) } {
! 1480: fileevent $fileId readable ""
! 1481: catch {close $fileId}
! 1482: return
! 1483: }
! 1484: set aline [gets $fileId]
! 1485: if { $aline != "" } {
! 1486: switch [lindex [split $aline :] 0] {
! 1487: ANS {
! 1488: set questNum $gGetSet($num.questNum)
! 1489: set ans [string range $aline 4 end]
! 1490: set length [llength $ans]
! 1491: lappend gGetSet($num.$questNum.ans) [lindex $ans 0]
! 1492: if { ($length == 2) || ($length == 4)} {
! 1493: lappend gGetSet($num.$questNum.unit) [lindex $ans end]
! 1494: }
! 1495: if { ($length == 3) || ($length == 4) } {
! 1496: lappend gGetSet($num.$questNum.low) [lindex $ans 1]
! 1497: lappend gGetSet($num.$questNum.high) [lindex $ans 2]
! 1498: }
! 1499: }
! 1500: DONE { set gGetSet($num.maxprob) $gGetSet($num.questNum) }
! 1501: ERROR {
! 1502: fileevent $fileId readable ""
! 1503: displayError "Answers returned invalid message: $aline"
! 1504: fileevent $fileId readable "getSetLine $num $fileId"
! 1505: }
! 1506: BQES {
! 1507: incr gGetSet($num.questNum)
! 1508: fileevent $fileId readable "getSetQuestion $num $fileId"
! 1509: }
! 1510: SET { set gGetSet($num.questNum) 0 }
! 1511: default {}
! 1512: }
! 1513: }
! 1514: if { [eof $fileId] } { getSetEnd $num $fileId }
! 1515: }
! 1516:
! 1517: ###########################################################
! 1518: # getSetEnd
! 1519: ###########################################################
! 1520: ###########################################################
! 1521: ###########################################################
! 1522: proc getSetEnd { num fileId } {
! 1523: global gGetSet c
! 1524: if { [eof $fileId] } {
! 1525: catch {close $fileId}
! 1526: set command $gGetSet($num.command)
! 1527: foreach var [array names gGetSet "$num.*"] {
! 1528: set var2 [join [lrange [split $var .] 1 end] .]
! 1529: set array($var2) $gGetSet($var)
! 1530: unset gGetSet($var)
! 1531: }
! 1532: eval "$command array"
! 1533: }
! 1534: }
! 1535:
! 1536: ###########################################################
! 1537: # lunique --
! 1538: # order independent list unique proc. most efficient, but requires
! 1539: # __LIST never be an element of the input list
! 1540: # Arguments:
! 1541: # __LIST list of items to make unique
! 1542: # Returns:
! 1543: # list of only unique items, order not defined
! 1544: ###########################################################
! 1545: proc lunique __LIST {
! 1546: if {[llength $__LIST]} {
! 1547: foreach $__LIST $__LIST break
! 1548: unset __LIST
! 1549: return [info locals]
! 1550: }
! 1551: }
! 1552:
! 1553: proc splitline { line maxLength } {
! 1554: set length [string length $line]
! 1555: set lines [expr $length/$maxLength + 1]
! 1556: set i 0
! 1557: while { 1 } {
! 1558: if { [string length $line] > $maxLength } {
! 1559: set end [string wordstart $line $maxLength]
! 1560: while {1} {
! 1561: if {[string index $line $end] == " "} {break} {incr end -1}
! 1562: }
! 1563: append lin [string range $line 0 [expr int($end-1)]]\n
! 1564: set line [string range $line $end end]
! 1565: } else {
! 1566: append lin $line
! 1567: break
! 1568: }
! 1569: incr i
! 1570: }
! 1571: return $lin
! 1572: }
! 1573:
! 1574: ###########################################################
! 1575: # winputs
! 1576: ###########################################################
! 1577: ###########################################################
! 1578: ###########################################################
! 1579: proc winputs { num message {tag normal} } {
! 1580: global gOut
! 1581:
! 1582: lappend gOut(output.$num) [list $message $tag]
! 1583: }
! 1584:
! 1585: ###########################################################
! 1586: # winoutputWrap
! 1587: ###########################################################
! 1588: ###########################################################
! 1589: ###########################################################
! 1590: proc winoutputWrap { num } {
! 1591: global gOut
! 1592: if { $gOut($num.wrap) } {
! 1593: $gOut($num.output) configure -wrap char
! 1594: } else {
! 1595: $gOut($num.output) configure -wrap none
! 1596: }
! 1597: }
! 1598:
! 1599: ###########################################################
! 1600: # winoutput
! 1601: ###########################################################
! 1602: ###########################################################
! 1603: ###########################################################
! 1604: proc winoutput { num cmdnum window } {
! 1605: global gOut
! 1606:
! 1607: if { ![winfo exists $window.output$num] } {
! 1608: set outputWin [toplevel $window.output$num]
! 1609:
! 1610: set buttonFrame [frame $outputWin.button]
! 1611: set textFrame [frame $outputWin.text]
! 1612: set bottomFrame [frame $outputWin.bottom]
! 1613: pack $buttonFrame $textFrame $bottomFrame
! 1614: pack configure $buttonFrame -anchor e -expand 0 -fill x
! 1615: pack configure $textFrame -expand 1 -fill both
! 1616: pack configure $bottomFrame -expand 0 -fill x
! 1617:
! 1618: set gOut($num.output) [text $textFrame.text \
! 1619: -yscrollcommand "$textFrame.scroll set" \
! 1620: -xscrollcommand "$bottomFrame.scroll set"]
! 1621: scrollbar $textFrame.scroll -command "$textFrame.text yview"
! 1622: pack $gOut($num.output) $textFrame.scroll -side left
! 1623: pack configure $textFrame.text -expand 1 -fill both
! 1624: pack configure $textFrame.scroll -expand 0 -fill y
! 1625:
! 1626: scrollbar $bottomFrame.scroll -command "$textFrame.text xview" -orient h
! 1627: pack $bottomFrame.scroll -expand 0 -fill x
! 1628:
! 1629: set gOut($num.wrap) 1
! 1630: checkbutton $buttonFrame.wrap -text "Wrap" -command "winoutputWrap $num" \
! 1631: -variable gOut($num.wrap)
! 1632: # button $buttonFrame.save -text "Save Text" -command "CTsaveText $num"
! 1633: button $buttonFrame.print -text "Print Text" -command "winprintText $num"
! 1634: button $buttonFrame.dismiss -text "Dismiss" -command "destroy $outputWin"
! 1635: # pack $buttonFrame.wrap $buttonFrame.save $buttonFrame.print \
! 1636: $buttonFrame.dismiss -side left
! 1637: pack $buttonFrame.wrap $buttonFrame.print $buttonFrame.dismiss -side left
! 1638: }
! 1639: set index [$gOut($num.output) index end]
! 1640: foreach line $gOut(output.$cmdnum) {
! 1641: eval $gOut($num.output) insert end $line
! 1642: }
! 1643: unset gOut(output.$cmdnum)
! 1644: capaRaise $window.output$num
! 1645: $gOut($num.output) see $index
! 1646: update idletasks
! 1647: }
! 1648:
! 1649: ###########################################################
! 1650: # winprintText
! 1651: ###########################################################
! 1652: # prints the contents of the text window, creates a temp file named
! 1653: # quiztemp.txt
! 1654: ###########################################################
! 1655: # Arguments: num (the unique number of the path, and window)
! 1656: # Returns : nothing
! 1657: # Globals : gFile gCT
! 1658: ###########################################################
! 1659: proc winprintText { num } {
! 1660: global gOut
! 1661:
! 1662: set window $gOut($num.output)
! 1663: if { ![winfo exists $window]} { return }
! 1664: catch {parseCapaConfig $num}
! 1665: set lprCommand [getLprCommand commontemp.txt $num]
! 1666: if {$lprCommand == "Cancel"} { return }
! 1667:
! 1668: set fileId [open commontemp.txt w]
! 1669: puts -nonewline $fileId [$window get 0.0 end-1c]
! 1670: close $fileId
! 1671:
! 1672: set errorMsg ""
! 1673: if { [catch {set output [ eval "exec $lprCommand" ] } errorMsg ]} {
! 1674: displayError "An error occurred while printing: $errorMsg"
! 1675: } else {
! 1676: displayMessage "Print job sent to the printer.\n $output"
! 1677: }
! 1678: exec rm -f commontemp.txt
! 1679: }
! 1680:
! 1681: ###########################################################
! 1682: # limitEntry
! 1683: ###########################################################
! 1684: ###########################################################
! 1685: ###########################################################
! 1686: proc limitEntry { window max type {newvalue ""}} {
! 1687: after idle "$window config -validate key"
! 1688: if {[string length $newvalue] > $max } { return 0 }
! 1689: switch $type {
! 1690: any {}
! 1691: number { if {(![regexp ^\[0-9\]+$ $newvalue])&&($newvalue!="")} { return 0 } }
! 1692: letter {if {(![regexp ^\[A-Za-z\]+$ $newvalue])&& ($newvalue!="")} { return 0 }}
! 1693: }
! 1694: return 1
! 1695: }
! 1696:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>