#!/usr/bin/wish # $Id: xagm,v 1.1 1998/03/08 22:46:24 fraserm Exp $ # $Log: xagm,v $ # Revision 1.1 1998/03/08 22:46:24 fraserm # Initial revision # # divide word length by this to get default max number of words: set maxwordsdivisor 5 # divide word length by this to get default average word length: set avlengthdivisor 3 set wordwidth 30 set defaultwidth 80 set firstsearchnum 1 set readbytes 8 set defextend ".txt" proc RunAgm {} { global quiet time width word remword srchtype wordcount partial avlength \ hard searchnum set command "agm -f" if { $quiet } { append command " -q" } if { $time } { append command " -t" } append command [format " -o%d" $width] if { [string compare $srchtype maxwords] == 0 } { append command [format " -c%d" $wordcount] if { $partial } { append command " -p" } } else { append command [format " -l%d" $avlength] if { $hard } { append command " -h" } } regsub -all {[ ]+} [$word get] "" word_nospace append command " " $word_nospace regsub -all {[ ]+} [$remword get] "" remove if { [string length $remove] > 0 } { append command "-" $remove } set sw [toplevel ".sw$searchnum"] wm title $sw "Search $searchnum (xagm)" incr searchnum set title [label $sw.title -text "Executing command: $command"] set textfr [frame $sw.textfr] set text [text $textfr.text -width $width -yscrollcommand "$textfr.scroll set"] set textbar [scrollbar $textfr.scroll -command "$textfr.text yview"] pack $text -side left -fill both -expand 1 pack $textbar -side left -fill y set pctcmplt [scale $sw.pctcmplt$searchnum -from 0 -to 100 -label "% complete" -orient horizontal -length 250 -showvalue true -tickinterval 25] set butfrm [frame $sw.butfrm] set stop [button $butfrm.stop -text "Stop" -state disabled] set save [button $butfrm.save -text "Save" -state disabled -command "SaveText $text"] set close [button $butfrm.close -text "Close" -command "destroy $sw" -state disabled] pack $stop $save $close -side left pack $title -side top pack $textfr -side top -fill both -expand 1 pack $pctcmplt -side top pack $butfrm -side top if { [catch { open "|$command" r } ch] } { $text insert end "Unable to start command $command\n" $stop configure -text "Close" -state enabled -command "destroy $sw" } fconfigure $ch -buffering none -blocking 0 fileevent $ch readable "ProcessOutput $ch $text $sw $stop $save $close $pctcmplt" $stop configure -state normal -command "StopCommand $ch $text $sw $stop $save $close $pctcmplt" } proc SaveText { text } { global defextend set types [list [list {Text files} {*.txt}] [list {All Files} {*}]] set filename [tk_getSaveFile -defaultextension $defextend -filetypes $types -title "Save Anagrams"] if { [string length $filename] > 0 } { if [catch { open $filename w } ch] { tk_messageBox -icon error -type ok -message "Unable to save in file $filename" } else { puts -nonewline $ch [$text get 1.0 end] } close $ch } } proc ProcessOutput { ch text win stopbut savebut closebut pc } { if { [eof $ch] } { $pc set 100 StopCommand $ch $text $win $stopbut $savebut $closebut $pc } else { if [catch {read $ch} instuff] { $pc set 100 StopCommand $ch $text $win $stopbut $savebut $closebut $pc } else { if {[regexp "^(.*)(\[0-9\]\[0-9\])\b\b(.*)\$" $instuff dummy stuff pct rest] == 1} { # do percent thing $pc set $pct set stuff "$stuff$rest" } else { set stuff $instuff } regsub -all "\[0-9\]\[0-9\]\b\b" $stuff "" outline $text insert end $outline $text yview end update idletasks } } } proc StopCommand { ch text win stopbut savebut closebut pc } { catch { close $ch } $text yview end $stopbut configure -state disabled $savebut configure -state normal $closebut configure -state normal } proc StateAv { relief state } { global avlenlab avlenmenu avhard $avlenlab configure -relief $relief $avlenmenu configure -state $state $avhard configure -state $state } proc StateMax { relief state } { global maxwordslab maxwordsmenu maxpartial $maxwordslab configure -relief $relief $maxwordsmenu configure -state $state $maxpartial configure -state $state } proc SelAv {} { StateAv raised normal StateMax flat disabled } proc SelMax {} { StateAv flat disabled StateMax raised normal } proc SetDefaultValues {} { global maxwordsdivisor avlengthdivisor word remword wordcount avlength set wordcount [expr ([string length [$word get]] - [string length [$remword get]]) / $maxwordsdivisor] set avlength [expr ([string length [$word get]] - [string length [$remword get]]) / $avlengthdivisor] } wm title . "Control (xagm)" set global [frame .global] set checks [frame $global.checks] set quietbut [checkbutton $checks.quiet -text "Quiet Mode" -variable quiet] set timebut [checkbutton $checks.time -text "Time statistics" -variable time] pack $quietbut $timebut -side top -anchor w set widthscale [scale $global.width -label "Output Width" -from 20 -to 160 \ -length 200 -resolution 5 -showvalue 1 -tickinterval 20 -orient horizontal -variable width] pack $checks -side left -anchor w pack $widthscale -side left pack $global -side top set search [frame .search] set wordlab [label $search.wordlab -text "Search phrase:"] set word [entry $search.word -width $wordwidth] bind $word SetDefaultValues pack $word -side right -fill x -expand 1 pack $wordlab -side right set search2 [frame .search2] set remlab [label $search2.remlab -text "Remove these words first:"] set remword [entry $search2.remword -width $wordwidth] bind $remword SetDefaultValues pack $remword -side right -fill x -expand 1 pack $remlab -side right pack $search $search2 -side top -fill x -expand 1 set baselab [label .baselab -text "Base search on:"] pack $baselab -side top set opts [frame .opts] set maxopts [frame $opts.maxopts] set maxbut [radiobutton $maxopts.selected -text "Maximum number of words" -value "maxwords" -variable srchtype -command "SelMax"] set maxwords [frame $maxopts.words] set maxwordslab [label $maxwords.lab -text "Max. # of words:"] set maxwordsmenu [winfo parent [tk_optionMenu $maxwords.words wordcount 1 2 3 4 5 6 7 8 9 10]] pack $maxwordslab $maxwordsmenu -side left set maxpartial [checkbutton $maxopts.partial -text "Allow partial anagrams" -variable partial] pack $maxbut $maxwords $maxpartial -side top -anchor w set avopts [frame $opts.avopts] set avbut [radiobutton $avopts.selected -text "Average word length" -value "avwords" -variable srchtype -command "SelAv"] set avlen [frame $avopts.avlen] set avlenlab [label $avlen.lab -text "Average word length:"] set avlenmenu [winfo parent [tk_optionMenu $avlen.length avlength 1 2 3 4 5 6 7 8 9 10]] pack $avlenlab $avlenmenu -side left set avhard [checkbutton $avopts.hard -text "Minimum (not average) word length" -variable hard] pack $avbut $avlen $avhard -side top -anchor w pack $maxopts $avopts -side left pack $opts -side top set butts [frame .butts] set go [button $butts.go -text "Go" -command "RunAgm"] set quit [button $butts.quit -text "Quit" -command "exit"] pack $go $quit -side left pack $butts -side top set width $defaultwidth set srchtype maxwords set searchnum $firstsearchnum SelMax