Diff for /capa/capa51/GUITools/quizzer.tcl between versions 1.1.1.1 and 1.19

version 1.1.1.1, 1999/09/28 21:25:36 version 1.19, 2000/08/07 20:47:29
Line 1 Line 1
   # student quiz editor and assembly tool
   #  Copyright (C) 1992-2000 Michigan State University
   #
   #  The CAPA system is free software; you can redistribute it and/or
   #  modify it under the terms of the GNU General Public License as
   #  published by the Free Software Foundation; either version 2 of the
   #  License, or (at your option) any later version.
   #
   #  The CAPA system is distributed in the hope that it will be useful,
   #  but WITHOUT ANY WARRANTY; without even the implied warranty of
   #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   #  General Public License for more details.
   #
   #  You should have received a copy of the GNU General Public
   #  License along with the CAPA system; see the file COPYING.  If not,
   #  write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   #  Boston, MA 02111-1307, USA.
   #
   #  As a special exception, you have permission to link this program
   #  with the TtH/TtM library and distribute executables, as long as you
   #  follow the requirements of the GNU GPL in regard to all of the
   #  software in the executable aside from TtH/TtM.
   
 ###########################################################  ###########################################################
 # quizzer.tcl -   # quizzer.tcl - 
 # Copyright Guy Albertelli II 1996  # Created Guy Albertelli II 1996
 ###########################################################  ###########################################################
 set gTclVer 4.0  set gTclVer 4.0
   
Line 287  proc createInfoWindow {} { Line 310  proc createInfoWindow {} {
     label $about.l1  -font 12x24 -text "Quizzer $gVer" -pady 20      label $about.l1  -font 12x24 -text "Quizzer $gVer" -pady 20
     label $about.l4  -font 8x13 -text "Quizzer.tcl version $gTclVer" -pady 20      label $about.l4  -font 8x13 -text "Quizzer.tcl version $gTclVer" -pady 20
     label $about.l6  -font 8x13 -text "$gCompileDate"       label $about.l6  -font 8x13 -text "$gCompileDate" 
     message $about.l2 -font 8x13 -text "Code by: Y. Tsai, G. Albertelli II Copyright Michigan State University Board of Trustees, 1992-1999, No Unauthorized Commercial Use" \      message $about.l2 -font 8x13 -text "Code by: Y. Tsai, G. Albertelli II Copyright Michigan State University Board of Trustees, 1992-2000, CAPA is released under to GNU GPL v2, and comes WITHOUT ANY WARRENTY, see COPYING for details" \
  -pady 20 -aspect 300   -pady 20 -aspect 300
     label $about.l3  -font 8x13 -textvariable gDate       label $about.l3  -font 8x13 -textvariable gDate 
     label $about.l5  -font 8x13 -textvariable gCmd      label $about.l5  -font 8x13 -textvariable gCmd
Line 641  proc getProbValTryVal {} { Line 664  proc getProbValTryVal {} {
 ###########################################################  ###########################################################
 # updateDateBox   # updateDateBox 
 ###########################################################  ###########################################################
   # sticks the date information from gControlDates into the date listbox
 ###########################################################  ###########################################################
 ###########################################################  ###########################################################
 proc updateDateBox { listbox } {  proc updateDateBox { listbox } {
Line 665  proc loadDates { listbox } { Line 689  proc loadDates { listbox } {
     global gControlDates      global gControlDates
     if { [catch {getHeaderInfo}]} {       if { [catch {getHeaderInfo}]} { 
  displayError "That set.db does not exist"   displayError "That set.db does not exist"
     }       } else { 
    if { [llength $gControlDates] > 2 } {
       set gControlDates [linsert [lreverse [lrange $gControlDates 1 end]] 0 [lindex $gControlDates 0]] 
    } 
       }
     updateDateBox $listbox      updateDateBox $listbox
 }  }
   
Line 819  proc getday { kind } { Line 847  proc getday { kind } {
 }  }
   
 ###########################################################  ###########################################################
   # moveUpDate
   ###########################################################
   ###########################################################
   ###########################################################
   proc  moveUpDate { listbox } {
       global gControlDates gDates
       if { ![winfo exists $listbox] } { return }
       if { [set which [$listbox curselection]] == "" } {
    displayMessage "Please select a date to move."
    return
       }
       if { $which > 1 } {
    set element [lindex $gControlDates $which]
    set gControlDates [lreplace $gControlDates $which $which]
    set gControlDates [linsert $gControlDates [expr $which - 1] $element]
    updateDateBox $listbox
    $listbox selection set [expr {$which - 1}]
    $listbox see [expr {$which -1}]
       }
   }
   
   ###########################################################
   # moveDownDate
   ###########################################################
   ###########################################################
   ###########################################################
   proc  moveDownDate { listbox } {
       global gControlDates gDates
       if { ![winfo exists $listbox] } { return }
       if { [set which [$listbox curselection]] == "" } {
    displayMessage "Please select a date to move."
    return
       }
       if { ($which > 0) && ($which < ([llength $gControlDates]-1)) } {
    set element [lindex $gControlDates $which]
    set gControlDates [lreplace $gControlDates $which $which]
    set gControlDates [linsert $gControlDates [expr $which + 1] $element]
    updateDateBox $listbox
    $listbox selection set [expr {$which + 1}]
    $listbox see [expr {$which + 1}]
       }
   }
   
   ###########################################################
 # enableDateValidation  # enableDateValidation
 ###########################################################  ###########################################################
 ###########################################################  ###########################################################
Line 948  proc createDateDialog { toplevel makedef Line 1020  proc createDateDialog { toplevel makedef
     checkbutton $optionsFrame2.response -variable gDates(inhibitresponse) \      checkbutton $optionsFrame2.response -variable gDates(inhibitresponse) \
  -text "Inhibit Correct/Incorrect response \n(normally only for exams/quizzes)"   -text "Inhibit Correct/Incorrect response \n(normally only for exams/quizzes)"
     pack $durationFrame $optionsFrame2.view $optionsFrame2.response -side top      pack $durationFrame $optionsFrame2.view $optionsFrame2.response -side top
     set gDates(viewbetween) 1      set gDates(viewbetween) 0
     set gDates(inhibitresponse) 0      set gDates(inhibitresponse) 0
   
     label $durationFrame.label -text "Duration"      label $durationFrame.label -text "Duration"
Line 965  proc createDateDialog { toplevel makedef Line 1037  proc createDateDialog { toplevel makedef
     button $buttonFrame.cancel -text "Cancel" -command "set gPrompt2(ok) 0"      button $buttonFrame.cancel -text "Cancel" -command "set gPrompt2(ok) 0"
     set gDates(optBut) [ button $buttonFrame.options -text "More Options" \      set gDates(optBut) [ button $buttonFrame.options -text "More Options" \
      -command "addDateOptions"]       -command "addDateOptions"]
     pack $buttonFrame.help $buttonFrame.set $buttonFrame.cancel $buttonFrame.options \      pack $buttonFrame.set $buttonFrame.cancel $buttonFrame.options -side left
  -side left  
     bind $toplevel <Destroy> "set gPrompt2(ok) 0"      bind $toplevel <Destroy> "set gPrompt2(ok) 0"
     bind $toplevel <KeyPress> "getday open;getday due;getday answer"      bind $toplevel <KeyPress> "getday open;getday due;getday answer"
     bind $toplevel <Return> {tkTabToWindow [tk_focusNext %W]}      bind $toplevel <Return> {tkTabToWindow [tk_focusNext %W]}
Line 1096  proc changeDate { listbox } { Line 1167  proc changeDate { listbox } {
  }   }
     }      }
     capaGrab release $changeDate      capaGrab release $changeDate
     bind $changeDate <Destroy> ""      catch {bind $changeDate <Destroy> ""}
     destroy $changeDate      destroy $changeDate
     if {$gPrompt2(ok) == 1 } {      if {$gPrompt2(ok) == 1 } {
  addCurrentDates $listbox $makedefault $which   addCurrentDates $listbox $makedefault $which
Line 1147  proc addDate { listbox } { Line 1218  proc addDate { listbox } {
  }   }
     }      }
     capaGrab release $addDate      capaGrab release $addDate
     bind $addDate <Destroy> ""      catch {bind $addDate <Destroy> ""}
     destroy $addDate      destroy $addDate
     if {$gPrompt2(ok) == 1 } {      if {$gPrompt2(ok) == 1 } {
  addCurrentDates $listbox $makedefault   addCurrentDates $listbox $makedefault
Line 1162  proc addDate { listbox } { Line 1233  proc addDate { listbox } {
 ###########################################################  ###########################################################
 proc createDBHeader {} {  proc createDBHeader {} {
     global gNumberParsedText gPrompt gLoadHeaderSet gControlDates \      global gNumberParsedText gPrompt gLoadHeaderSet gControlDates \
     gSetNumberText  gHeaderQCount      gSetNumberText  gHeaderQCount gEnableDiscussion gFile
   
     if { $gNumberParsedText == "" } {      if { $gNumberParsedText == "" } {
  displayError "You must first preview the file before creating the \   displayError "You must first preview the file before creating the \
Line 1182  proc createDBHeader {} { Line 1253  proc createDBHeader {} {
     message $dialog.msg -text "Header Information" -aspect 1000      message $dialog.msg -text "Header Information" -aspect 1000
     set loadFrame [frame $dialog.loadFrame -borderwidth 4 -relief sunken]      set loadFrame [frame $dialog.loadFrame -borderwidth 4 -relief sunken]
     set infoFrame [frame $dialog.infoFrame -borderwidth 4 -relief sunken]      set infoFrame [frame $dialog.infoFrame -borderwidth 4 -relief sunken]
       label $dialog.message -text "Later entries will override earlier entries"
       set optionFrame [frame $dialog.options]
     set buttonFrame [frame $dialog.buttons -bd 10]      set buttonFrame [frame $dialog.buttons -bd 10]
     pack $dialog.msg $loadFrame $infoFrame $buttonFrame -side top -fill x      pack $dialog.msg $loadFrame $dialog.message $infoFrame $optionFrame \
    $buttonFrame -side top -fill x
   
     set legendFrame [frame $infoFrame.legendFrame]      set legendFrame [frame $infoFrame.legendFrame]
     set listFrame [frame $infoFrame.listFrame]      set listFrame [frame $infoFrame.listFrame]
Line 1197  proc createDBHeader {} { Line 1271  proc createDBHeader {} {
     set listbox [listbox $listFrame.list -width 63 -yscrollcommand "$listFrame.scroll set" ]      set listbox [listbox $listFrame.list -width 63 -yscrollcommand "$listFrame.scroll set" ]
     scrollbar $listFrame.scroll -command "$listbox yview"      scrollbar $listFrame.scroll -command "$listbox yview"
     pack $listFrame.list $listFrame.scroll -side left      pack $listFrame.list $listFrame.scroll -side left
       pack configure $listFrame.scroll -fill y
     updateDateBox $listbox      updateDateBox $listbox
           
     button $commandFrame.add -text "Add" -command "addDate $listbox"      button $commandFrame.add -text "Add" -command "addDate $listbox"
     button $commandFrame.change -text "Change" -command "changeDate $listbox"      button $commandFrame.change -text "Change" -command "changeDate $listbox"
     button $commandFrame.delete -text "Delete" -command "deleteDate $listbox"      button $commandFrame.delete -text "Delete" -command "deleteDate $listbox"
     pack $commandFrame.add $commandFrame.change $commandFrame.delete -side left      button $commandFrame.moveup -text "MoveUp" -command "moveUpDate $listbox"
       button $commandFrame.movedown -text "MoveDown" -command "moveDownDate $listbox"
       pack $commandFrame.add $commandFrame.change $commandFrame.delete \
    $commandFrame.moveup $commandFrame.movedown -side left
     bind $listbox <Double-ButtonPress-1> "changeDate $listbox"      bind $listbox <Double-ButtonPress-1> "changeDate $listbox"
   
     message $loadFrame.msg -text "Load header information from set:"  \      message $loadFrame.msg -text "Load header information from set:"  \
Line 1212  proc createDBHeader {} { Line 1290  proc createDBHeader {} {
     button $loadFrame.load -text "load" -command "loadDates $listbox"      button $loadFrame.load -text "load" -command "loadDates $listbox"
     pack $loadFrame.msg $loadFrame.entry $loadFrame.load -side left      pack $loadFrame.msg $loadFrame.entry $loadFrame.load -side left
   
       if { [file exists [file join [file dirname $gFile] discussion $gSetNumberText]] } {
    set gEnableDiscussion 1
       } else {
    set gEnableDiscussion 0
       }
       checkbutton $optionFrame.discuss -text "Enable Discussion Forum" \
    -variable gEnableDiscussion
       pack $optionFrame.discuss
   
     button $buttonFrame.ok -text Set -command { set gPrompt(ok) 1 } \      button $buttonFrame.ok -text Set -command { set gPrompt(ok) 1 } \
     -underline 0       -underline 0 
     button $buttonFrame.cancel -text Cancel -command { set gPrompt(ok) 0 } \      button $buttonFrame.cancel -text Cancel -command { set gPrompt(ok) 0 } \
Line 1241  proc createDBHeader {} { Line 1328  proc createDBHeader {} {
     capaGrab release $dialog      capaGrab release $dialog
     destroy $dialog      destroy $dialog
     if {$gPrompt(ok) == 1 } {      if {$gPrompt(ok) == 1 } {
    updateDiscussion
    if { [llength $gControlDates] > 2 } {
       set gControlDates [linsert [lreverse [lrange $gControlDates 1 end]] 0 [lindex $gControlDates 0]] 
    } 
  eval updateHeader [ eval concat $gControlDates ]   eval updateHeader [ eval concat $gControlDates ]
     }      }
           
Line 1249  proc createDBHeader {} { Line 1340  proc createDBHeader {} {
 }  }
   
 ###########################################################  ###########################################################
   # updateDiscussion
   ###########################################################
   ###########################################################
   ###########################################################
   proc updateDiscussion {} {
       global gFile gSetNumberText gEnableDiscussion
       set dir [file dirname $gFile]
       set disDir [file join $dir discussion $gSetNumberText]
       set logDir [file join $dir discussion logs]
       if { $gEnableDiscussion } {
    if { ![file exists $disDir] } {
       if { [file exists $disDir.unavailable] } {
    exec mv $disDir.unavailable $disDir
       } else {
    file mkdir $disDir
    file attributes $disDir -permissions 0777
       }
    }
    if { ![file exists $logDir] } {
       file mkdir [file join $dir discussion logs]
       file attributes [file join $dir discussion logs] -permissions 0777
    }
       } else { 
    if { [file exists $disDir] } { exec mv $disDir $disDir.unavailable } 
       }
   }
   
   ###########################################################
 # allFieldsComplete2   # allFieldsComplete2 
 ###########################################################  ###########################################################
 ###########################################################  ###########################################################
 ###########################################################  ###########################################################
 proc allFieldsComplete2 {} {  proc allFieldsComplete2 {} {
     global gLoadHeaderSet gControlDates      global gLoadHeaderSet gControlDates 
           
     if { [string length $gOpenDate] != 8 } {      if { [string length $gOpenDate] != 8 } {
  return 0   return 0
Line 1541  proc replaceAll {} { Line 1660  proc replaceAll {} {
     set gCreateImportLinks 1      set gCreateImportLinks 1
     getFindWindow refNum      getFindWindow refNum
     if { $refNum >= 0 } { registerCreateImportLinks $refNum 0.0 end }      if { $refNum >= 0 } { registerCreateImportLinks $refNum 0.0 end }
     displayMessage "Replaced $num occurance$s"      displayMessage "Replaced $num occurrence$s"
 }  }
   
 ###########################################################  ###########################################################
Line 1761  proc createPrefsWindow {} { Line 1880  proc createPrefsWindow {} {
     if { [winfo exists .prefs] } { capaRaise .prefs; return }      if { [winfo exists .prefs] } { capaRaise .prefs; return }
   
     set prefs [toplevel .prefs]      set prefs [toplevel .prefs]
     $gWindowMenu add command -label "Prefrences" -command "capaRaise $prefs"      $gWindowMenu add command -label "Prefernces" -command "capaRaise $prefs"
     wm title $prefs "Preferences"      wm title $prefs "Preferences"
   
     set frameAll [frame $prefs.frameAll -relief groove -borderwidth 4]      set frameAll [frame $prefs.frameAll -relief groove -borderwidth 4]
Line 1805  proc createPrefsWindow {} { Line 1924  proc createPrefsWindow {} {
     button $frameButton.config -text "Reread capa.config" -command "rereadCapaConfig"      button $frameButton.config -text "Reread capa.config" -command "rereadCapaConfig"
     button $frameButton.ok -text "Dismiss" -command "destroy $prefs      button $frameButton.ok -text "Dismiss" -command "destroy $prefs
                                                 trace vdelete gWhichFile w changePrefFile                                                  trace vdelete gWhichFile w changePrefFile
                                                 removeWindowEntry Prefrences"                                                  removeWindowEntry Prefernces"
     bind $prefs <Destroy> "removeWindowEntry Preferences"      bind $prefs <Destroy> "removeWindowEntry Preferences"
     button $frameButton.save -text "Save All" -command "savePrefs"      button $frameButton.save -text "Save All" -command "savePrefs"
     pack $frameButton.impcolor $frameButton.commentcolor $frameButton.config \      pack $frameButton.impcolor $frameButton.commentcolor $frameButton.config \
Line 1932  proc checkHeader { numberParsed } { Line 2051  proc checkHeader { numberParsed } {
 #    if { $gFirstTime } { set gFirstTime 0; return }  #    if { $gFirstTime } { set gFirstTime 0; return }
     set gLoadHeaderSet $gSetNumberText      set gLoadHeaderSet $gSetNumberText
     set error [catch {getHeaderInfo}]      set error [catch {getHeaderInfo}]
       catch { 
    if { [llength $gControlDates] > 2 } {
       set gControlDates [linsert [lreverse [lrange $gControlDates 1 end]] 0 [lindex $gControlDates 0]] 
    } 
       }
     if { $error == 1 } {      if { $error == 1 } {
  set gHeaderQCount "0"   set gHeaderQCount "0"
  set gControlDates ""   set gControlDates ""
Line 2189  proc createPreviewWindow {} { Line 2313  proc createPreviewWindow {} {
 }  }
   
 ###########################################################  ###########################################################
   # openError
   ###########################################################
   ###########################################################
   ###########################################################
   proc openError { file line type} {
       global gRefLine gLineNumberGoto gTextWindow
       if { $type == 2 } {
    set gLineNumberGoto $line
    gotoLine
    capaRaise [winfo toplevel $gTextWindow]
       } else {
    if {[set num [openReferenceFile $file]]} {
       update idletasks
       set gRefLine($num) $line
       gotoRefLine $num
    }
       }
   }
   
   ###########################################################
   # showParseErrors
 ###########################################################  ###########################################################
 ###########################################################  ###########################################################
 ###########################################################  ###########################################################
 proc showParseErrors {} {  proc showParseErrors {} {
     global gParseErrorsText gWindowMenu      global gParseErrorsText gWindowMenu gUniqueNumber gCapaConfig
   
     set parseErrors [getParseErrors]      set parseErrors [getParseErrors]
           
Line 2243  proc showParseErrors {} { Line 2388  proc showParseErrors {} {
     $gParseErrorsText delete 0.0 end      $gParseErrorsText delete 0.0 end
     capaRaise .parseErrors      capaRaise .parseErrors
  }   }
    foreach line [split $parseErrors "\n"] {
  $gParseErrorsText insert end $parseErrors      set tag 0
       if { [regexp -indices {File:.+->(.+), Line ([0-9]+): ERROR:} $line result file linenum]} {
    set tag 1
       } else {
    if { [regexp -indices {File:(.+), Line ([0-9]+): ERROR:} $line result file linenum]} {
       set tag 2
    }
       }
       if { $tag } {
    set tagnum [incr gUniqueNumber]
    set linenum [eval [list string range $line] $linenum]
    set filename [eval [list string range $line] $file]
    set i [expr [lindex [split [$gParseErrorsText index end] .] 0] - 1]
       }
       $gParseErrorsText insert end "$line\n"
       if { $tag } {
    $gParseErrorsText tag add error.$tagnum $i.[lindex $file 0] $i.[expr [lindex $file 1] + 1]
    $gParseErrorsText tag configure error.$tagnum -foreground $gCapaConfig(IMP_color)
    $gParseErrorsText tag bind error.$tagnum <Double-ButtonPress> \
       "eval openError $filename $linenum $tag"
       }
    }
     } else {      } else {
  if { [winfo exists .parseErrors] } { $gParseErrorsText delete 0.0 end }   if { [winfo exists .parseErrors] } { $gParseErrorsText delete 0.0 end }
     }      }
Line 2381  proc rereadCapaConfig { } { Line 2547  proc rereadCapaConfig { } {
  displayError "Invalid capa.config file"    displayError "Invalid capa.config file" 
  set gCapaConfig(printer_option) $printer_option   set gCapaConfig(printer_option) $printer_option
     }       } 
       setDefaultValues
     updateColors      updateColors
 }  }
   
Line 2399  proc pickCapaConfig { } { Line 2566  proc pickCapaConfig { } {
  cd [file dirname $file]   cd [file dirname $file]
  set error [parseCapaConfig]   set error [parseCapaConfig]
  if { $error != "OK" } { displayError "Invalid capa.config file"; cd $oldDir }    if { $error != "OK" } { displayError "Invalid capa.config file"; cd $oldDir } 
    setDefaultValues
     }       } 
 }  }
   
   proc setDefaultValues {} {
       global gProbVal gTryVal gHintVal gCapaConfig
       catch {set gProbVal $gCapaConfig(default_prob_val)}
       catch {set gTryVal $gCapaConfig(default_try_val)}
       catch {set gHintVal $gCapaConfig(default_hint_val)}
   }
   
 ###########################################################  ###########################################################
 # openDocument  # openDocument
 ###########################################################  ###########################################################
 ###########################################################  ###########################################################
 ###########################################################  ###########################################################
 proc openDocument {} {  proc openDocument {} {
     global gFile gTextWindow gSetNumberText gPrefs gChanged gQuizTemp gUndo      global gFile gTextWindow gSetNumberText gPrefs gChanged gQuizTemp gUndo 
   
     if { $gChanged } { if { [askToSave 0 0] == "Cancel" } { return } }      if { $gChanged } { if { [askToSave 0 0] == "Cancel" } { return } }
     if { ![catch {set gTextWindow}] } {       if { ![catch {set gTextWindow}] } { 
Line 2478  proc openDocument {} { Line 2653  proc openDocument {} {
  set gQuizTemp true   set gQuizTemp true
         return          return
     }      }
       setDefaultValues
   
     createEditingWindow 0      createEditingWindow 0
     $gTextWindow delete 0.0 end      $gTextWindow delete 0.0 end
     $gTextWindow insert 0.0 [read $fileId [file size $gFile]]      $gTextWindow insert 0.0 [read $fileId [file size $gFile]]
Line 2664  proc isReferenceFileOpen { file } { Line 2840  proc isReferenceFileOpen { file } {
     set entryfile [lindex $entry 1]      set entryfile [lindex $entry 1]
  }   }
 # puts $entryfile  # puts $entryfile
  if { [catch {file stat $entryfile a1}] } { puts skipped;continue }   if { [catch {file stat $entryfile a1}] } { continue }
  file stat $file a2   file stat $file a2
 # puts "$a2(ino) == $a1(ino)"  # puts "$a2(ino) == $a1(ino)"
  if { $a2(ino) == $a1(ino) } {   if { $a2(ino) == $a1(ino) } {
Line 2721  proc openReferenceFile { {file ""} {new Line 2897  proc openReferenceFile { {file ""} {new
       -title "Select the proper file" \        -title "Select the proper file" \
       -initialdir "$gDir(reference)" ]        -initialdir "$gDir(reference)" ]
  event generate .main <ButtonRelease-1>   event generate .main <ButtonRelease-1>
  if { $file == "" } { return }   if { $file == "" } { return 0 }
  set gDir(reference) [file dirname $file]   set gDir(reference) [file dirname $file]
   
  if { [file isdirectory $file] } {   if { [file isdirectory $file] } {
     displayError "You attempted to open $file which is a directory not a file."      displayError "You attempted to open $file which is a directory not a file."
     return      return 0
  }   }
     } else {      } else {
  if { !$new } {   if { !$new } {
     if { [set window [isReferenceFileOpen $file] ] != "" } {       if { [set window [isReferenceFileOpen $file] ] != "" } { 
    set num [lindex [split [lindex [split $window .] 1] e] end]
  capaRaise $window   capaRaise $window
  return    return $num
     }      }
     # specifically opening the capa.config file      # specifically opening the capa.config file
     if { $file == "capa.config" } {      if { $file == "capa.config" } {
Line 2743  proc openReferenceFile { {file ""} {new Line 2920  proc openReferenceFile { {file ""} {new
       { {All Files} {"*"} } } \        { {All Files} {"*"} } } \
   -title "Select the proper file" \    -title "Select the proper file" \
   -initialdir "$gDir(reference)" ]    -initialdir "$gDir(reference)" ]
     if { $file == "" } { return }      if { $file == "" } { return 0 }
  } else {   } else {
     set file [file join [file dirname $gFile] capa.config]      set file [file join [file dirname $gFile] capa.config]
  }   }
     } else {      } else {
  if { ![file isfile $file] && ![file readable $file] } {   if { ![file isfile $file] && ![file readable $file] } {
     displayError "Unable to find $file"      displayError "Unable to find $file"
     return      return 0
  }   }
  if { [file isdirectory $file] } {   if { [file isdirectory $file] } {
     displayError "You attempted to open $file which is a directory not a file."      displayError "You attempted to open $file which is a directory not a file."
     return      return 0
  }   }
     }      }
  }   }
Line 2872  proc openReferenceFile { {file ""} {new Line 3049  proc openReferenceFile { {file ""} {new
     set gRefChanged($num) 0      set gRefChanged($num) 0
     set gRefClosed($num) 0      set gRefClosed($num) 0
     addFindList $num      addFindList $num
       return $num
 }  }
   
 ###########################################################  ###########################################################
Line 2912  proc trackChanges { procName num } { Line 3090  proc trackChanges { procName num } {
  set chars \[ .$procName get \$insertindex \$insertindex2 \]   set chars \[ .$procName get \$insertindex \$insertindex2 \]
     }      }
     set gUndo($num.\$numChange) \"insert \$insertindex \[list \$chars\] \"      set gUndo($num.\$numChange) \"insert \$insertindex \[list \$chars\] \"
             if {\[regexp \{.*\[\"/\].*\} \$chars\] || \              if { \[string length \$chars\] > 100 } {
                 \[regexp \{.*\[\"/\].*\} \[.$procName get \"\$insertindex linestart\" \"\$insertindex2 lineend\"\]\]} {                      registerCreateImportLinks $num \$insertindex-1line \$insertindex2+1line
                registerCreateImportLinks $num \$insertindex \$insertindex2              } else {
                   if {\[regexp \{.*\[\"/\].*\} \$chars\] || \
                       \[regexp \{.*\[\"/\].*\} \[.$procName get \"\$insertindex linestart\" \"\$insertindex2 lineend\"\]\]} { 
                      registerCreateImportLinks $num \$insertindex \$insertindex2
                   }
             }              }
  }          }
  set result \[uplevel .$procName \$args\]   set result \[uplevel .$procName \$args\]
         updateLocation $num          updateLocation $num
         return \$result          return \$result
Line 2928  proc trackChanges { procName num } { Line 3110  proc trackChanges { procName num } {
 ###########################################################  ###########################################################
 ###########################################################  ###########################################################
 proc undo { num } {  proc undo { num } {
     global gUndo gRefText gTextWindow      global gUndo gRefText gTextWindow gChanged gRefChanged
     if { $gUndo($num.cur) == 0 } { return }      if { $gUndo($num.cur) == 0 } { return }
     set undoInfo $gUndo($num.$gUndo($num.cur))      set undoInfo $gUndo($num.$gUndo($num.cur))
     if { [regexp {.*[\"/].*} $undoInfo] } {      if { [regexp {.*[\"/].*} $undoInfo] } {
Line 2939  proc undo { num } { Line 3121  proc undo { num } {
     }      }
     if { $num == 0 } {      if { $num == 0 } {
  if {[catch {eval ".$gTextWindow $gUndo($num.$gUndo($num.cur))"}]} { return }   if {[catch {eval ".$gTextWindow $gUndo($num.$gUndo($num.cur))"}]} { return }
    set gChanged 1
     } else {      } else {
  if {[catch {eval ".$gRefText($num) $gUndo($num.$gUndo($num.cur))"}]} { return }   if {[catch {eval ".$gRefText($num) $gUndo($num.$gUndo($num.cur))"}]} { return }
    set gRefChanged($num) 1
     }      }
     incr gUndo($num.cur) -1      incr gUndo($num.cur) -1
 }  }
Line 3220  proc createStopButton {} { Line 3404  proc createStopButton {} {
     if {[winfo exists .stopbutton]} {destroy .stopbutton}      if {[winfo exists .stopbutton]} {destroy .stopbutton}
     set top [toplevel .stopbutton]      set top [toplevel .stopbutton]
     button $top.stop -text "Stop Parser" -command "stopParser"      button $top.stop -text "Stop Parser" -command "stopParser"
     label $top.status -textvariable gStopStatus -width 35      label $top.status -textvariable gStopStatus -width 35 -anchor w
     pack $top.stop $top.status      pack $top.stop $top.status
     set gStopStatus ""      set gStopStatus ""
     grab $top      grab $top
Line 3478  proc printWindow {} { Line 3662  proc printWindow {} {
     pack $print.msg $oneSetFrame $moreSetFrame $buttonFrame -side top       pack $print.msg $oneSetFrame $moreSetFrame $buttonFrame -side top 
     pack configure $oneSetFrame $moreSetFrame -anchor w -fill x      pack configure $oneSetFrame $moreSetFrame -anchor w -fill x
         
       set msg2Frame [frame $moreSetFrame.msg2 -relief solid -borderwidth 2]
     set infoFrame [frame $moreSetFrame.frame1]      set infoFrame [frame $moreSetFrame.frame1]
     set setFrame [frame $moreSetFrame.frame2 -relief solid -borderwidth 1]      set msg3Frame [frame $moreSetFrame.msg3 -relief solid -borderwidth 2]
     pack $infoFrame $setFrame       set setFrame [frame $moreSetFrame.frame2] 
     pack configure $infoFrame $setFrame -anchor w      pack $msg2Frame $setFrame $msg3Frame $infoFrame -anchor w
           
     if {[catch {set gPrintSelection(sets)}]} {set gPrintSelection(sets) printCur}      if {[catch {set gPrintSelection(sets)}]} {set gPrintSelection(sets) printCur}
     if {[catch {set gPrintSelection(type)}]} {set gPrintSelection(type) printSpecific}      if {[catch {set gPrintSelection(type)}]} {set gPrintSelection(type) printSpecific}
Line 3513  proc printWindow {} { Line 3698  proc printWindow {} {
     bind $print <Destroy> "removeWindowEntry Print"      bind $print <Destroy> "removeWindowEntry Print"
     pack $buttonFrame.ok $buttonFrame.cancel -side left      pack $buttonFrame.ok $buttonFrame.cancel -side left
           
       set msgFrame [frame $oneSetFrame.msg -relief solid -borderwidth 2]
     set currentDviFrame [frame $oneSetFrame.currentDvi]      set currentDviFrame [frame $oneSetFrame.currentDvi]
     set currentPreviewFrame [frame $oneSetFrame.currentPreview]      set currentPreviewFrame [frame $oneSetFrame.currentPreview]
     set randomFrame [frame $oneSetFrame.random]      set randomFrame [frame $oneSetFrame.random]
Line 3520  proc printWindow {} { Line 3706  proc printWindow {} {
     set sectionFrame [frame $infoFrame.section]      set sectionFrame [frame $infoFrame.section]
     set multSectionFrame [frame $infoFrame.multsection]      set multSectionFrame [frame $infoFrame.multsection]
     set wholeClassFrame [frame $infoFrame.wholeClass]      set wholeClassFrame [frame $infoFrame.wholeClass]
     pack $currentDviFrame $currentPreviewFrame $randomFrame $specificFrame \      pack $msgFrame $currentDviFrame $currentPreviewFrame $randomFrame $specificFrame \
     $sectionFrame $multSectionFrame $wholeClassFrame -anchor w \      $sectionFrame $multSectionFrame $wholeClassFrame -anchor w \
     -side top      -side top
     pack configure $specificFrame -expand true -fill both      pack configure $specificFrame -expand true -fill both
   
       label $msgFrame.msg -text "Select:"
       pack $msgFrame.msg -anchor w
       label $msg2Frame.msg -text "Or Select:"
       pack $msg2Frame.msg -anchor w
       label $msg3Frame.msg -text "For:"
       pack $msg3Frame.msg -anchor w
   
     radiobutton $currentDviFrame.currentDvi -text "Print current .dvi" \      radiobutton $currentDviFrame.currentDvi -text "Print current .dvi" \
     -value "printCurrentDvi" -variable gPrintSelection(type)       -value "printCurrentDvi" -variable gPrintSelection(type) 
     pack $currentDviFrame.currentDvi -side left       pack $currentDviFrame.currentDvi -side left 
Line 3690  proc createCreateDviWin {} { Line 3883  proc createCreateDviWin {} {
 # sends the file quiztemp.ps to the printer through lpr using  # sends the file quiztemp.ps to the printer through lpr using
 # the option foud in gLprCommand  # the option foud in gLprCommand
 ###########################################################  ###########################################################
 # Arguments: none  # Arguments: lprCommand - actual command to be run to print
   #            showCompletionMessage - (defaults to 1 true)
   #                      controls whether the print complete 
   #                      message gets shown
 # Returns: Nothing  # Returns: Nothing
 # Globals: gCapaConfig -  # Globals: gCapaConfig -
 #          gStopPrinting -  #          gStopPrinting -
Line 3700  proc printBody { lprCommand { showComple Line 3896  proc printBody { lprCommand { showComple
     global gCapaConfig gStopPrinting gDonePrinting      global gCapaConfig gStopPrinting gDonePrinting
   
     set errorMsg ""      set errorMsg ""
     set error [ catch {exec $gCapaConfig(dvips_command) quiztemp.dvi \      set error [ catch {eval exec $gCapaConfig(dvips_command) quiztemp.dvi \
     -o quiztemp.ps >& /dev/null} errorMsg ]      -o quiztemp.ps >& /dev/null} errorMsg ]
     if { $error } {      if { $error } {
  displayError \   displayError \
  "When attempting to run dvips an error occured : $errorMsg"   "When attempting to run dvips an error occurred : $errorMsg"
  return 1   return 1
     }      }
   
Line 3719  proc printBody { lprCommand { showComple Line 3915  proc printBody { lprCommand { showComple
     set error [catch {set returnMessage [eval "exec $lprCommand"] } errorMsg ]      set error [catch {set returnMessage [eval "exec $lprCommand"] } errorMsg ]
           
     if { $error == 1 } {      if { $error == 1 } {
         displayError "When attempting to print an error occured : $errorMsg"          displayError "When attempting to print an error occurred : $errorMsg"
  return 1   return 1
     } else {      } else {
  if { $showCompletionMessage } {   if { $showCompletionMessage } {
Line 3975  proc printSection { { lprCommand "" } } Line 4171  proc printSection { { lprCommand "" } }
  default { set type "-T" }   default { set type "-T" }
     }      }
   
       set prSection [string trimleft $gPrintSelection(section) 0]
   
     if { [set gStopPrinting [expr 2 == [runLatex \      if { [set gStopPrinting [expr 2 == [runLatex \
     "echo [pwd] | $gCapaConfig(qzparse_command) \      "echo [pwd] | $gCapaConfig(qzparse_command) \
     -sec $gPrintSelection(section) -set $set \      -sec $prSection -set $set \
     -d [pwd] -c [pwd] $type " gCreateDviText] ] ] } {      -d [pwd] -c [pwd] $type " gCreateDviText] ] ] } {
  for {set i $start} { $i <= $end} { incr i } {   for {set i $start} { $i <= $end} { incr i } {
     exec rm -f section$gPrintSelection(section)-set$i.tex       exec rm -f section$prSection-set$i.tex 
  }   }
  if {$showStopping} {   if {$showStopping} {
     displayMessage "Printing has been stopped."      displayMessage "Printing has been stopped."
Line 3997  proc printSection { { lprCommand "" } } Line 4195  proc printSection { { lprCommand "" } }
     }      }
   
     for { set i $start} { $i <= $end } { incr i } {      for { set i $start} { $i <= $end } { incr i } {
  if { ! [file exists section$gPrintSelection(section)-set$i.tex] } {   if { ! [file exists section$prSection-set$i.tex] } {
     if {$showStopping} {      if {$showStopping} {
  displayError "The qzparse command: $gCapaConfig(qzparse_command), was unable to produce the expected output. Printing stopped"   displayError "The qzparse command: $gCapaConfig(qzparse_command), was unable to produce the expected output. Printing stopped"
  set gStopPrinting 0   set gStopPrinting 0
Line 4006  proc printSection { { lprCommand "" } } Line 4204  proc printSection { { lprCommand "" } }
     return 2      return 2
  }   }
   
  exec mv section$gPrintSelection(section)-set$i.tex quiztemp.tex   exec mv section$prSection-set$i.tex quiztemp.tex
  exec /bin/rm -f quiztemp.dvi    exec /bin/rm -f quiztemp.dvi 
   
  $gCreateDviText insert end "$gCapaConfig(latex_command)\n"   $gCreateDviText insert end "$gCapaConfig(latex_command)\n"
Line 4286  proc analyzeClass { {start 1} } { Line 4484  proc analyzeClass { {start 1} } {
     set name [lindex $gAnalyze(toprocess) 1]      set name [lindex $gAnalyze(toprocess) 1]
     set section [lindex $gAnalyze(toprocess) 2]      set section [lindex $gAnalyze(toprocess) 2]
     set gAnalyze(toprocess) [lrange $gAnalyze(toprocess) 3 end]      set gAnalyze(toprocess) [lrange $gAnalyze(toprocess) 3 end]
     set command "$gCapaConfig(answers_command) $number \"$name\" $section $gAnalyze(set)"      set command "$gCapaConfig(answers_command) $number \"$name\" 0 $gAnalyze(set)"
     set fileId [open "|$command" "r"]      set fileId [open "|$command" "r"]
     set gAnalyze(pid) [pid $fileId]      set gAnalyze(pid) [pid $fileId]
     fconfigure $fileId -blocking 0      fconfigure $fileId -blocking 0
Line 4424  proc analyzeRandom { } { Line 4622  proc analyzeRandom { } {
 }  }
   
 ###########################################################  ###########################################################
   # analyzeStrings
   ###########################################################
   ###########################################################
   ###########################################################
   proc analyzeStrings { prob window create} {
       global gAnalyze
   
       if { ![winfo exists $window.analyzestrings] } { if {!$create} { return } }
       if { ![catch {set setWin [toplevel $window.analyzestrings]}] } {
    set msgFrame [frame $setWin.msgFrame]
    set valFrame [frame $setWin.valFrame]
    set buttonFrame [frame $setWin.buttonFrame]
    pack $msgFrame $valFrame $buttonFrame
    pack configure $valFrame -expand 1 -fill both
   
    message $msgFrame.msg -text "Correct Answers" -aspect 3000
    pack $msgFrame.msg
   
    set maxWidth 1
    foreach choice $gAnalyze($prob.ans) {
       if {[string length $choice]>$maxWidth} {set maxWidth [string length $choice]}
    }
    set maxStringWidth $maxWidth
    incr maxWidth 6
   
    set selectMode none
    listbox $valFrame.val -width [expr $maxWidth + 2] \
       -yscrollcommand "$valFrame.scroll set" -selectmode $selectMode
    scrollbar $valFrame.scroll -command "$valFrame.val yview"
    pack $valFrame.val $valFrame.scroll -side left
    pack configure $valFrame.val -expand 1 -fill both 
    pack configure $valFrame.scroll -expand 0 -fill y
    button $buttonFrame.cancel -text "Dismiss" -command "destroy $setWin"
    pack $buttonFrame.cancel
       } else {
    set maxWidth 1
    set valFrame $window.analyzestrings.valFrame
    $valFrame.val delete 0 end
    foreach choice $gAnalyze($prob.ans) {
       if {[string length $choice]>$maxWidth} {set maxWidth [string length $choice]}
    }
    set maxStringWidth $maxWidth
    incr maxWidth 6
       }
       set lastchoice [lindex $gAnalyze($gAnalyze(prob).ans) 0]
       set num 1
       foreach choice [lsort $gAnalyze($gAnalyze(prob).ans)] {    
    if { $lastchoice != $choice } {
       $valFrame.val insert end \
    "[format %-[set maxStringWidth]s $lastchoice] [format %5d $num]"
       set lastchoice $choice
       set num 1
    } else {
       incr num
    }
       }
       $valFrame.val insert end \
    "[format %-[set maxStringWidth]s $lastchoice] [format %5d $num]"
   }
   
   ###########################################################
 # analyzeUpdate  # analyzeUpdate
 ###########################################################  ###########################################################
 ###########################################################  ###########################################################
Line 4444  proc analyzeUpdate { {newProbNumber 0} } Line 4703  proc analyzeUpdate { {newProbNumber 0} }
     set gAnalyze(highnum) [set high [lindex $gAnalyze($gAnalyze(prob).ans) end]]      set gAnalyze(highnum) [set high [lindex $gAnalyze($gAnalyze(prob).ans) end]]
     set gAnalyze(numuniq) [llength [lunique $gAnalyze($gAnalyze(prob).ans)]]      set gAnalyze(numuniq) [llength [lunique $gAnalyze($gAnalyze(prob).ans)]]
 #don't draw anything if the answers aren't numbers  #don't draw anything if the answers aren't numbers
     if { [catch {expr $low + 1}]} { update idletask;return }      if { [catch {expr $low + 1}]} { 
    catch {destroy $c.button}
    update idletask
    button $c.button -text "List of strings" -command \
       "analyzeStrings $gAnalyze(prob) $c 1"
    $c create window [expr $gAnalyze(canvaswidth)/2.0] 40 -window $c.button
    analyzeStrings $gAnalyze(prob) $c 0
    return 
       }
   
     $c create line 25 50 [expr $gAnalyze(canvaswidth) - 25] 50      $c create line 25 50 [expr $gAnalyze(canvaswidth) - 25] 50
     set diff [expr double($high-$low)]      set diff [expr double($high-$low)]
     if { $diff == 0 } {      if { $diff == 0 } {
  set center [expr $gAnalyze(canvaswidth)/2.0]   set center [expr $gAnalyze(canvaswidth)/2.0]
  $c create oval [expr $center - 2] 48 [expr $center + 2] 52 -fill green   $c create rectangle [expr $center - 2] 48 [expr $center + 2] 52 -fill green
  update idletasks   update idletasks
  return   return
     }      }
Line 4467  proc analyzeUpdate { {newProbNumber 0} } Line 4734  proc analyzeUpdate { {newProbNumber 0} }
  set center [expr $center+25]   set center [expr $center+25]
  $c create rectangle [expr $center - 1] 40 [expr $center + 1] 60   $c create rectangle [expr $center - 1] 40 [expr $center + 1] 60
     }      }
       set lastpoint [lindex $gAnalyze($gAnalyze(prob).ans) 0]
       set num 0
     foreach point $gAnalyze($gAnalyze(prob).ans) {          foreach point $gAnalyze($gAnalyze(prob).ans) {    
  set center [expr ($gAnalyze(canvaswidth)-50)*(($point-$low)/$diff)]   if { $lastpoint != $point } {
  set center [expr $center+25]      set center [expr ($gAnalyze(canvaswidth)-50)*(($lastpoint-$low)/$diff)]
  $c create oval [expr $center - 2] 48 [expr $center + 2] 52 -fill green      set center [expr $center+25]
       $c create rectangle [expr $center - 2] [expr 48-$num] \
    [expr $center + 2] [expr 52+$num] -fill green
       set lastpoint $point
       set num 0
    } else {
       incr num
    }
     }      }
       set center [expr ($gAnalyze(canvaswidth)-50)*(($lastpoint-$low)/$diff)]
       set center [expr $center+25]
       $c create rectangle [expr $center - 2] [expr 48-$num] \
    [expr $center + 2] [expr 52+$num] -fill green
           
     update idletasks      update idletasks
 }  }
Line 4485  proc analyzeStop {} { Line 4765  proc analyzeStop {} {
     global gAnalyze      global gAnalyze
     set gAnalyze(stop) 1      set gAnalyze(stop) 1
     set gAnalyze(status) "Stopped"      set gAnalyze(status) "Stopped"
     exec kill -SIGKILL $gAnalyze(pid)      catch {exec kill -SIGKILL $gAnalyze(pid)}
 }  }
   
 ###########################################################  ###########################################################

Removed from v.1.1.1.1  
changed lines
  Added in v.1.19


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