|
#!/bin/sh |
|
# the following line is evaluated by sh but ignored by tcl \ |
|
wishwn "$0" "$@" & |
|
# the following line is evaluated by sh but ignored by tcl \ |
|
exec true |
|
# the preceding lines make this script self-executing on unix systems |
|
|
|
########################################################################## |
|
# # |
|
# A Tcl/Tk interface for WordNet # |
|
# by David Slomin (dgslomin@princeton.edu) - 6/97 # |
|
# based upon the X-Windows version by Brian Gustafson - 5/91 # |
|
# # |
|
########################################################################## |
|
|
|
if {$tcl_platform(platform) == "windows"} { |
|
package require registry 1.1 |
|
} |
|
|
|
### Default Configuration |
|
|
|
set showcontextualhelp 0 |
|
set showglosses 1 |
|
set wordwrap 1 |
|
set showfileinfo 0 |
|
set showbyteoffset 0 |
|
set showsenseflag 0 |
|
set maxhistorylength 10 |
|
set fontname times |
|
set fontsize 2 |
|
set fontsizelist {100 120 140 180 240} |
|
|
|
### Indentation constants |
|
|
|
# "->" # "=>" |
|
set fontpt1offset(times,1) 20; set fontpt2offset(times,1) 20 |
|
set fontpt1offset(times,2) 20; set fontpt2offset(times,2) 20 |
|
set fontpt1offset(times,3) 26; set fontpt2offset(times,3) 26 |
|
set fontpt1offset(courier,1) 23; set fontpt2offset(courier,1) 23 |
|
set fontpt1offset(courier,2) 28; set fontpt2offset(courier,2) 28 |
|
set fontpt1offset(courier,3) 34; set fontpt2offset(courier,3) 34 |
|
set fontpt1offset(helvetica,1) 19; set fontpt2offset(helvetica,1) 19 |
|
set fontpt1offset(helvetica,2) 24; set fontpt2offset(helvetica,2) 24 |
|
set fontpt1offset(helvetica,3) 27; set fontpt2offset(helvetica,3) 27 |
|
|
|
# "HAS PART:" # "PART OF:" |
|
set fonthpoffset(times,1) 66; set fontpooffset(times,1) 58 |
|
set fonthpoffset(times,2) 77; set fontpooffset(times,2) 66 |
|
set fonthpoffset(times,3) 100; set fontpooffset(times,3) 87 |
|
set fonthpoffset(courier,1) 71; set fontpooffset(courier,1) 64 |
|
set fonthpoffset(courier,2) 91; set fontpooffset(courier,2) 82 |
|
set fonthpoffset(courier,3) 111; set fontpooffset(courier,3) 100 |
|
set fonthpoffset(helvetica,1) 70; set fontpooffset(helvetica,1) 62 |
|
set fonthpoffset(helvetica,2) 80; set fontpooffset(helvetica,2) 70 |
|
set fonthpoffset(helvetica,3) 102; set fontpooffset(helvetica,3) 90 |
|
|
|
# "HAS MEMBER:" # "MEMBER OF:" |
|
set fonthmoffset(times,1) 74; set fontmooffset(times,1) 81 |
|
set fonthmoffset(times,2) 85; set fontmooffset(times,2) 92 |
|
set fonthmoffset(times,3) 108; set fontmooffset(times,3) 118 |
|
set fonthmoffset(courier,1) 75; set fontmooffset(courier,1) 79 |
|
set fonthmoffset(courier,2) 96; set fontmooffset(courier,2) 102 |
|
set fonthmoffset(courier,3) 118; set fontmooffset(courier,3) 124 |
|
set fonthmoffset(helvetica,1) 77; set fontmooffset(helvetica,1) 84 |
|
set fonthmoffset(helvetica,2) 87; set fontmooffset(helvetica,2) 95 |
|
set fonthmoffset(helvetica,3) 111; set fontmooffset(helvetica,3) 121 |
|
|
|
# "HAS SUBSTANCE:" # "SUBSTANCE OF:" |
|
set fonthsoffset(times,1) 105; set fontsooffset(times,1) 97 |
|
set fonthsoffset(times,2) 124; set fontsooffset(times,2) 113 |
|
set fonthsoffset(times,3) 157; set fontsooffset(times,3) 146 |
|
set fonthsoffset(courier,1) 106; set fontsooffset(courier,1) 98 |
|
set fonthsoffset(courier,2) 136; set fontsooffset(courier,2) 127 |
|
set fonthsoffset(courier,3) 166; set fontsooffset(courier,3) 155 |
|
set fonthsoffset(helvetica,1) 111; set fontsooffset(helvetica,1) 103 |
|
set fonthsoffset(helvetica,2) 127; set fontsooffset(helvetica,2) 117 |
|
set fonthsoffset(helvetica,3) 166; set fontsooffset(helvetica,3) 156 |
|
|
|
# " " # "[0-9]" |
|
set fontspoffset(times,1) 3; set fontNUMoffset(times,1) 6 |
|
set fontspoffset(times,2) 3; set fontNUMoffset(times,2) 7 |
|
set fontspoffset(times,3) 4; set fontNUMoffset(times,3) 10 |
|
set fontspoffset(courier,1) 7; set fontNUMoffset(courier,1) 8 |
|
set fontspoffset(courier,2) 9; set fontNUMoffset(courier,2) 11 |
|
set fontspoffset(courier,3) 11; set fontNUMoffset(courier,3) 13 |
|
set fontspoffset(helvetica,1) 4; set fontNUMoffset(helvetica,1) 7 |
|
set fontspoffset(helvetica,2) 4; set fontNUMoffset(helvetica,2) 8 |
|
set fontspoffset(helvetica,3) 5; set fontNUMoffset(helvetica,3) 9 |
|
|
|
# ". " |
|
set fontsp2offset(times,1) 6; |
|
set fontsp2offset(times,2) 6; |
|
set fontsp2offset(times,3) 7; |
|
set fontsp2offset(courier,1) 12; |
|
set fontsp2offset(courier,2) 15; |
|
set fontsp2offset(courier,3) 19; |
|
set fontsp2offset(helvetica,1) 7; |
|
set fontsp2offset(helvetica,2) 7; |
|
set fontsp2offset(helvetica,3) 11; |
|
|
|
set labonly 0 |
|
set version "3.0" |
|
|
|
if {$tcl_platform(platform) == "unix"} { |
|
if {[lsearch -exact [array names env] WNHOME] == -1} { |
|
set resourcedir "/usr/local/WordNet-3.0/lib/wnres" |
|
} else { |
|
set resourcedir "$env(WNHOME)/lib/wnres" |
|
} |
|
set configfile "$env(HOME)/.wnrc" |
|
if [ file exists $configfile ] { |
|
source $configfile |
|
} |
|
set printcommand "lpr" |
|
} |
|
if {$tcl_platform(platform) == "windows"} { |
|
set UserRegPath "HKEY_CURRENT_USER\\Software\\WordNet\\3.0" |
|
if { [registry values $UserRegPath "wnrc" ] != "" } { |
|
eval [ registry get $UserRegPath "wnrc" ] |
|
} |
|
if { [registry values $UserRegPath "WNHome"] != "" } { |
|
append resourcedir [registry get $UserRegPath "WNHome"] "/lib/wnres" |
|
} else { |
|
set MachineRegPath "HKEY_LOCAL_MACHINE\\Software\\WordNet\\3.0" |
|
if { [registry values $MachineRegPath "WNHome" ] != "" } { |
|
append resourcedir [registry get $MachineRegPath "WNHome"] "/lib/wnres" |
|
} else { |
|
set resourcedir "C:/Program Files/WordNet/3.0/lib/wnres" |
|
} |
|
} |
|
} |
|
|
|
### Startup |
|
|
|
wm title . "WordNet 3.0 Browser" |
|
|
|
### Primary Functions |
|
|
|
proc displayvalidsearchmenus {searchword} { |
|
global posmenu |
|
blackout 1 |
|
set gotone 0 |
|
pack forget .wordframe.overview |
|
for {set posnumber 1} {$posnumber <= 4} {incr posnumber} { |
|
set pos [lindex {noun verb adj adv} [expr $posnumber - 1]] |
|
pack forget .posmenubar.$pos |
|
set bitfield [findvalidsearches [fixword $searchword] $posnumber] |
|
if {$bitfield != 0} { |
|
pack \ |
|
.posmenubar.$pos \ |
|
-side left \ |
|
-padx 2 \ |
|
-pady 2 \ |
|
-before .posmenubar.senselabel |
|
.posmenubar.$pos.menu delete 0 end |
|
foreach line $posmenu($posnumber) { |
|
set label [lindex $line 0] |
|
regsub -nocase "this" $label $searchword label |
|
set searchtypenumber [lindex $line 1] |
|
set abssearchtypenumber [expr abs($searchtypenumber)] |
|
set action "\ |
|
searchanddisplay \"$searchword\" \"\$g_senses\" $posnumber \ |
|
$searchtypenumber; \ |
|
history_add \"$searchword\" \"\$g_senses\" $posnumber \ |
|
$searchtypenumber; \ |
|
pack .wordframe.overview \ |
|
-side right \ |
|
-padx 5 \ |
|
-pady 1 |
|
" |
|
if {[expr $bitfield & [bit $abssearchtypenumber]]} { |
|
.posmenubar.$pos.menu add command \ |
|
-label $label \ |
|
-command $action |
|
} |
|
} |
|
set gotone 1 |
|
} |
|
} |
|
if {!$gotone} { |
|
.statusbar.status configure \ |
|
-text "No matches found." |
|
} |
|
blackout 0 |
|
return $gotone |
|
} |
|
|
|
proc displayoverview {searchword} { |
|
global showfileinfo |
|
global showbyteoffset |
|
global showsenseflag |
|
global wordwrap |
|
global fontNUMoffset |
|
global fontsize |
|
global fontname |
|
global fontsp2offset |
|
|
|
set fontNUMsize $fontNUMoffset($fontname,$fontsize) |
|
set fontsp2size $fontsp2offset($fontname,$fontsize) |
|
|
|
if {$showfileinfo == 2} {fileinfo 1} else {fileinfo 0} |
|
if {$showbyteoffset == 2} {byteoffset 1} else {byteoffset 0} |
|
if {$showsenseflag == 2} {senseflag 1} else {senseflag 0} |
|
blackout 1 |
|
.results.text configure \ |
|
-state normal |
|
.results.text delete 1.0 end |
|
pack forget .wordframe.overview |
|
set gotone 0 |
|
for {set posnumber 1} {$posnumber <= 4} {incr posnumber} { |
|
set bitfield [findvalidsearches [fixword $searchword] $posnumber] |
|
if {$bitfield != 0} { |
|
# The 31 in the following line should correspond to the value of |
|
# OVERVIEW defined in wnconsts.h in the WordNet library |
|
set buf [search [fixword $searchword] $posnumber 31 -1] |
|
set morphedword "" |
|
set numspaces 0 |
|
set iter 0 |
|
set buflines [split $buf "\n"] |
|
foreach line $buflines { |
|
.results.text mark set begofline \ |
|
[.results.text index "end - 2 char"] |
|
.results.text insert end "$line\n" |
|
regexp -nocase -- \ |
|
"The (noun|verb|adj|adv) (.*) has \[0-9\]+ senses?" \ |
|
$line dummy dummy morphedword |
|
set index [string first " --" $line] |
|
if {$index != -1} { |
|
set line [string range $line 0 [expr $index - 1]] |
|
} |
|
if {[regexp -indices -nocase -- \ |
|
"\[\})>,\] ($morphedword)\[0-9\]*(#\[0-9\]+)?(,|\$)" \ |
|
$line dummy indices]} { |
|
.results.text tag add overviewhighlight \ |
|
"end - 2 lines linestart + [lindex $indices 0] chars" \ |
|
"end - 2 lines linestart + [expr \ |
|
[lindex $indices 1] + 1] chars" |
|
} elseif {[regexp -indices -nocase -- \ |
|
"\[0-9\]+\. ($morphedword)\[0-9\]*(#\[0-9\]+)?(,|\$)" \ |
|
$line dummy indices]} { |
|
.results.text tag add overviewhighlight \ |
|
"end - 2 lines linestart + [lindex $indices 0] chars" \ |
|
"end - 2 lines linestart + [expr \ |
|
[lindex $indices 1] + 1] chars" |
|
} |
|
set indent [string first "." $line] |
|
if {$indent != -1} { |
|
set numspaces [expr $indent * $fontNUMsize + $fontsp2size] |
|
} else {set numspaces 0} |
|
.results.text mark set endofline [.results.text index \ |
|
"end - 1 char"] |
|
.results.text tag configure indent$posnumber$iter \ |
|
-lmargin2 $numspaces |
|
.results.text tag add indent$posnumber$iter \ |
|
begofline endofline |
|
.results.text mark set begofline [.results.text index \ |
|
"end - 2 char"] |
|
incr iter |
|
} |
|
.results.text delete "end - 1 lines" end |
|
set gotone 1 |
|
} |
|
} |
|
.results.text configure \ |
|
-state disabled |
|
if {$gotone} { |
|
.statusbar.status configure \ |
|
-text "Overview of $searchword" |
|
} |
|
blackout 0 |
|
setwordwrap $wordwrap |
|
focus .results.text |
|
return $gotone |
|
} |
|
|
|
proc searchanddisplay {searchword senses posnumber searchtypenumber} { |
|
global posmenu |
|
global showcontextualhelp |
|
global showglosses |
|
global showfileinfo |
|
global showbyteoffset |
|
global showsenseflag |
|
blackout 1 |
|
glosses $showglosses |
|
if {$showfileinfo > 0} {fileinfo 1} else {fileinfo 0} |
|
if {$showbyteoffset > 0} {byteoffset 1} else {byteoffset 0} |
|
if {$showsenseflag > 0} {senseflag 1} else {senseflag 0} |
|
set longpos [lindex {noun verb adjective adverb} [expr $posnumber - 1]] |
|
.results.text configure \ |
|
-state normal |
|
.results.text delete 0.0 end |
|
.statusbar.status configure \ |
|
-text "Searching... (press escape to abort)" |
|
update idletasks |
|
if {$showcontextualhelp} { |
|
foreach line $posmenu($posnumber) { |
|
if {[lindex $line 1] == $searchtypenumber} { |
|
set linenumber [lsearch $posmenu($posnumber) $line] |
|
} |
|
} |
|
.results.text insert end "\n[contextualhelp $posnumber $linenumber]" |
|
.results.text mark set endofhelp [.results.text index "end - 1 char"] |
|
.results.text tag add helpstyle 1.0 endofhelp |
|
} |
|
foreach sense [getsenselist $senses] { |
|
|
|
global fontsize |
|
|
|
global fontpt1offset |
|
global fontpt2offset |
|
global fonthpoffset |
|
global fontpooffset |
|
global fonthmoffset |
|
global fontmooffset |
|
global fonthsoffset |
|
global fontsooffset |
|
global fontspoffset |
|
|
|
global fontname |
|
global wordwrap |
|
|
|
if {$wordwrap} { |
|
set searchlines [split [search [fixword $searchword] $posnumber \ |
|
$searchtypenumber $sense] "\n"] |
|
.results.text mark set begofline [.results.text index "end - 2 char"] |
|
|
|
### Set indentation levels ### |
|
|
|
set fontpt1size $fontpt1offset($fontname,$fontsize) |
|
set fontpt2size $fontpt2offset($fontname,$fontsize) |
|
set fonthpsize $fonthpoffset($fontname,$fontsize) |
|
set fontposize $fontpooffset($fontname,$fontsize) |
|
set fonthmsize $fonthmoffset($fontname,$fontsize) |
|
set fontmosize $fontmooffset($fontname,$fontsize) |
|
set fonthssize $fonthsoffset($fontname,$fontsize) |
|
set fontsosize $fontsooffset($fontname,$fontsize) |
|
set fontspsize $fontspoffset($fontname,$fontsize) |
|
|
|
.statusbar.status configure \ |
|
-text "Formatting... (press escape to abort)" |
|
|
|
set iter 0 |
|
set morphedword "" |
|
set mword "" |
|
foreach i $searchlines { |
|
.results.text insert end $i\n |
|
.results.text mark set endofline [.results.text index \ |
|
"end - 1 char"] |
|
|
|
# added by RIT |
|
regexp -nocase -- \ |
|
"\[0-9\]+ (senses|sense) of (.+)" \ |
|
$i dummy dummy mword |
|
set morphedword [string trimright $mword] |
|
set index [string first " --" $i] |
|
set schar [string first " " $i] |
|
if {$index != -1 && $schar != 0} { |
|
set line [string range $i 0 [expr $index - 1]] |
|
if {[regexp -indices -nocase -- \ |
|
"(\[\.\})>,\] |^|, )($morphedword)\[0-9\]*(#\[0-9\]+)?( \[(\]|,|$\)" \ |
|
$line dummy dummy indices]} { |
|
.results.text tag add overviewhighlight \ |
|
"end - 2 lines linestart + [lindex $indices 0] chars" \ |
|
"end - 2 lines linestart + [expr \ |
|
[lindex $indices 1] + 1] chars" |
|
} |
|
} |
|
|
|
set numspaces 0 |
|
set idx [string first "->" $i] |
|
if {$idx != -1} {set numspaces \ |
|
[expr $fontpt1size + $idx * $fontspsize - 1]} \ |
|
else {set idx [string first "=>" $i] |
|
if {$idx != -1} {set numspaces \ |
|
[expr $fontpt2size + $idx * $fontspsize]} \ |
|
else {set idx [string first "HAS PART:" $i] |
|
if {$idx != -1} {set numspaces \ |
|
[expr $fonthpsize + $idx * $fontspsize - 1]} \ |
|
else {set idx [string first "PART OF:" $i] |
|
if {$idx != -1} {set numspaces \ |
|
[expr $fontposize + $idx * $fontspsize - 1]} \ |
|
else {set idx [string first "HAS MEMBER:" $i] |
|
if {$idx != -1} {set numspaces \ |
|
[expr $fonthmsize + $idx * $fontspsize - 1]} \ |
|
else {set idx [string first "MEMBER OF:" $i] |
|
if {$idx != -1} {set numspaces \ |
|
[expr $fontmosize + $idx * $fontspsize - 1]} \ |
|
else {set idx [string first "HAS SUBSTANCE:" $i] |
|
if {$idx != -1} {set numspaces \ |
|
[expr $fonthssize + $idx * $fontspsize]} \ |
|
else {set idx [string first "SUBSTANCE OF:" $i] |
|
if {$idx != -1} {set numspaces \ |
|
[expr $fontsosize + $idx * $fontspsize]} \ |
|
} } } } } } } |
|
|
|
.results.text tag configure indentstyle$iter -lmargin2 $numspaces |
|
.results.text tag add indentstyle$iter begofline endofline |
|
.results.text mark set begofline [.results.text index \ |
|
"end - 2 char"] |
|
incr iter |
|
} |
|
} else { |
|
.results.text insert end [search [fixword $searchword] $posnumber \ |
|
$searchtypenumber $sense] |
|
} |
|
|
|
setwordwrap $wordwrap |
|
} |
|
foreach line $posmenu($posnumber) { |
|
if {[lindex $line 1] == $searchtypenumber} { |
|
set label "\"[lindex $line 0]\" search for $longpos \"$searchword\"" |
|
eval [lindex $line 2] |
|
break |
|
} |
|
} |
|
.results.text configure \ |
|
-state disabled |
|
.statusbar.status configure \ |
|
-text $label |
|
blackout 0 |
|
} |
|
|
|
proc history_add {searchword senses posnumber searchtypenumber} { |
|
global posmenu |
|
global maxhistorylength |
|
|
|
if {$posnumber == 0} { |
|
set label "$searchword - Overview" |
|
set action " \ |
|
set g_searchword \"$searchword\"; \ |
|
set g_senses \"\"; \ |
|
displayvalidsearchmenus \"$searchword\"; \ |
|
displayoverview \"$searchword\"; \ |
|
.posmenubar.label configure \ |
|
-text \"Searches for $searchword:\" \ |
|
" |
|
} else { |
|
set longpos [lindex {Noun Verb Adjective Adverb} [expr $posnumber - 1]] |
|
foreach line $posmenu($posnumber) { |
|
if {[lindex $line 1] == $searchtypenumber} { |
|
if {$senses == ""} { |
|
set label "$searchword - $longpos / [lindex $line 0]" |
|
} else { |
|
set label \ |
|
"$searchword - $longpos / [lindex $line 0] / $senses" |
|
} |
|
break |
|
} |
|
} |
|
set action " \ |
|
set g_searchword \"$searchword\"; \ |
|
set g_senses \"$senses\"; \ |
|
displayvalidsearchmenus \"$searchword\"; \ |
|
searchanddisplay \"$searchword\" \"$senses\" $posnumber \ |
|
$searchtypenumber; \ |
|
pack .wordframe.overview \ |
|
-side right \ |
|
-padx 5 \ |
|
-pady 1; \ |
|
.posmenubar.label configure \ |
|
-text \"Searches for $searchword:\" \ |
|
" |
|
} |
|
.menubar.history.menu insert 0 command \ |
|
-label $label \ |
|
-command $action |
|
if {[.menubar.history.menu index end] == $maxhistorylength} { |
|
.menubar.history.menu delete end |
|
} |
|
} |
|
|
|
proc saveoptions { } { |
|
|
|
global tcl_platform |
|
global UserRegPath |
|
global showcontextualhelp |
|
global showglosses |
|
global wordwrap |
|
global showfileinfo |
|
global showbyteoffset |
|
global showsenseflag |
|
global maxhistorylength |
|
global fontname |
|
global fontsize |
|
global fontsizelist |
|
global configfile |
|
|
|
# Under Unix, write options settings to ".wnrc" file in user's |
|
# home directory. |
|
# Under Windows, write to "wnrc" key in registry. |
|
|
|
if {$tcl_platform(platform) == "unix"} { |
|
set c [open $configfile w] |
|
puts $c "set showcontextualhelp $showcontextualhelp" |
|
puts $c "set showglosses $showglosses" |
|
puts $c "set wordwrap $wordwrap" |
|
puts $c "set showfileinfo $showfileinfo" |
|
puts $c "set showbyteoffset $showbyteoffset" |
|
puts $c "set showsenseflag $showsenseflag" |
|
puts $c "set maxhistorylength $maxhistorylength" |
|
puts $c "set fontname $fontname" |
|
puts $c "set fontsize $fontsize" |
|
puts $c "set fontsizelist \{ $fontsizelist \}" |
|
} elseif {$tcl_platform(platform) == "windows"} { |
|
set c "" |
|
append c "set showcontextualhelp $showcontextualhelp\n" |
|
append c "set showglosses $showglosses\n" |
|
append c "set wordwrap $wordwrap\n" |
|
append c "set showfileinfo $showfileinfo\n" |
|
append c "set showbyteoffset $showbyteoffset\n" |
|
append c "set showsenseflag $showsenseflag\n" |
|
append c "set maxhistorylength $maxhistorylength\n" |
|
append c "set fontname $fontname\n" |
|
append c "set fontsize $fontsize\n" |
|
append c "set fontsizelist \{ $fontsizelist \}\n" |
|
registry set $UserRegPath "wnrc" $c |
|
} |
|
} |
|
|
|
proc showhelpwidget {w filename windowtitle} { |
|
if {[winfo exist .$w]} {raise .$w; return} |
|
toplevel .$w |
|
wm title .$w $windowtitle |
|
grid \ |
|
[frame .$w.top \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-row 0 \ |
|
-column 0 \ |
|
-sticky nsew |
|
grid \ |
|
[frame .$w.buttons \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-row 1 \ |
|
-column 0 \ |
|
-sticky nsew |
|
grid rowconfigure .$w 0 -weight 1 |
|
grid rowconfigure .$w 1 -weight 0 |
|
grid columnconfigure .$w 0 -weight 1 |
|
text .$w.top.text \ |
|
-wrap word \ |
|
-relief sunken \ |
|
-borderwidth 2 \ |
|
-font -adobe-courier-medium-r-normal-*-*-120-*-*-*-*-*-* \ |
|
-state disabled \ |
|
-yscrollcommand ".$w.top.scrolly set" \ |
|
-width 80 \ |
|
-height 25 \ |
|
-background White \ |
|
-foreground Black |
|
scrollbar .$w.top.scrolly \ |
|
-command ".$w.top.text yview" \ |
|
-relief sunken \ |
|
-width 12 |
|
grid .$w.top.text \ |
|
-row 0 \ |
|
-column 0 \ |
|
-sticky nsew |
|
grid .$w.top.scrolly \ |
|
-row 0 \ |
|
-column 1 \ |
|
-sticky nsew |
|
grid rowconfigure .$w.top 0 -weight 1 |
|
grid rowconfigure .$w.top 1 -weight 0 |
|
grid columnconfigure .$w.top 0 -weight 1 |
|
grid columnconfigure .$w.top 1 -weight 0 |
|
pack \ |
|
[button .$w.buttons.dismiss \ |
|
-text "Dismiss" \ |
|
-command "destroy .$w"] \ |
|
-side top \ |
|
-padx 1 \ |
|
-pady 1 |
|
.$w.top.text configure \ |
|
-state normal |
|
set fileid [open $filename "r"] |
|
set filetext [read $fileid] |
|
close $fileid |
|
regsub -all ".\b" $filetext "" filetext |
|
.$w.top.text insert end $filetext |
|
.$w.top.text configure \ |
|
-state disabled |
|
} |
|
|
|
proc printtext {whattoprint} { |
|
# The following line is a hack to get the passed argument to be |
|
# recognised in bound actions, like button presses. |
|
global printtext_whattoprint; set printtext_whattoprint $whattoprint |
|
global tcl_platform |
|
switch $tcl_platform(platform) { |
|
unix { |
|
global printcommand |
|
toplevel .printtxt |
|
wm title .printtxt "Print WordNet Results" |
|
wm transient .printtxt . |
|
scan [wm geometry .] "%dx%d+%d+%d" geom_h geom_w geom_x geom_y |
|
wm geometry .printtxt +[expr $geom_x+50]+[expr $geom_y+50] |
|
wm resizable .printtxt 0 0 |
|
grab set .printtxt |
|
pack \ |
|
[frame .printtxt.top] \ |
|
[frame .printtxt.bottom] \ |
|
-side top \ |
|
-padx 10 \ |
|
-pady 10 |
|
pack \ |
|
[label .printtxt.top.label \ |
|
-text "Print command:"] \ |
|
[entry .printtxt.top.entry \ |
|
-textvariable printcommand \ |
|
-background White \ |
|
-foreground Black] \ |
|
-side left |
|
focus .printtxt.top.entry |
|
pack \ |
|
[button .printtxt.bottom.print \ |
|
-text "Print" \ |
|
-command { |
|
set fileId [open "| $printcommand" w] |
|
switch $printtext_whattoprint { |
|
"main" { |
|
puts $fileId [.results.text get 1.0 end] |
|
} |
|
"grep" { |
|
puts $fileId [join \ |
|
[.grepwidget.results.frame.list \ |
|
get 0 end] "\n"] |
|
} |
|
default {} |
|
} |
|
close $fileId |
|
destroy .printtxt |
|
}] \ |
|
[button .printtxt.bottom.cancel \ |
|
-text "Cancel" \ |
|
-command { |
|
destroy .printtxt |
|
}] \ |
|
-side left |
|
bind .printtxt <Return> { |
|
.printtxt.bottom.print flash |
|
.printtxt.bottom.print invoke |
|
} |
|
} |
|
windows { |
|
bell |
|
} |
|
} |
|
} |
|
|
|
proc savetext {whattosave} { |
|
# The following line is a hack to get the passed argument to be |
|
# recognised in bound actions, like button presses. |
|
global tcl_platform |
|
global savetext_whattosave; set savetext_whattosave $whattosave |
|
toplevel .saveas |
|
wm title .saveas "Save WordNet Results To File" |
|
wm transient .saveas . |
|
scan [wm geometry .] "%dx%d+%d+%d" geom_h geom_w geom_x geom_y |
|
wm geometry .saveas +[expr $geom_x+50]+[expr $geom_y+50] |
|
wm resizable .saveas 0 0 |
|
grab set .saveas |
|
pack \ |
|
[frame .saveas.top] \ |
|
[frame .saveas.bottom] \ |
|
-side top \ |
|
-padx 10 \ |
|
-pady 10 |
|
pack \ |
|
[label .saveas.top.label \ |
|
-text "Filename:"] \ |
|
[entry .saveas.top.entry \ |
|
-textvariable filename \ |
|
-background White \ |
|
-foreground Black] \ |
|
-side left |
|
focus .saveas.top.entry |
|
pack \ |
|
[button .saveas.bottom.save \ |
|
-text "Save" \ |
|
-command { |
|
if [file exists $filename] { |
|
toplevel .savewarning |
|
wm title .savewarning "Wordnet Warning" |
|
wm transient .savewarning .saveas |
|
scan [wm geometry .saveas] "%dx%d+%d+%d" \ |
|
geom_h geom_w geom_x geom_y |
|
wm geometry .savewarning +[expr $geom_x+50]+[expr $geom_y+50] |
|
wm resizable .savewarning 0 0 |
|
grab set .savewarning |
|
pack \ |
|
[message .savewarning.message \ |
|
-text "The file \"$filename\" already exists.\ |
|
Choose \"append\" to add the new search results onto\ |
|
the end of the old ones. Choose \"replace\" to\ |
|
discard the old search results and store the new ones\ |
|
in their place. If you choose \"cancel,\" you will\ |
|
have the opportunity to select a different file." \ |
|
-width 300] \ |
|
[frame .savewarning.bottom] \ |
|
-side top \ |
|
-padx 10 \ |
|
-pady 10 |
|
pack \ |
|
[button .savewarning.bottom.append \ |
|
-text "Append" \ |
|
-command { |
|
set fileId [open $filename "a"] |
|
switch $savetext_whattosave { |
|
"main" { |
|
puts $fileId [.results.text get 1.0 end] |
|
} |
|
"grep" { |
|
puts $fileId [join \ |
|
[.grepwidget.results.frame.list \ |
|
get 0 end] "\n"] |
|
} |
|
default {} |
|
} |
|
close $fileId |
|
destroy .saveas |
|
destroy .savewarning |
|
}] \ |
|
[button .savewarning.bottom.replace \ |
|
-text "Replace" \ |
|
-command { |
|
set fileId [open $filename "w"] |
|
switch $savetext_whattosave { |
|
"main" { |
|
puts $fileId [.results.text get 1.0 end] |
|
} |
|
"grep" { |
|
puts $fileId [join \ |
|
[.grepwidget.results.frame.list \ |
|
get 0 end] "\n"] |
|
} |
|
default {} |
|
} |
|
close $fileId |
|
destroy .saveas |
|
destroy .savewarning |
|
}] \ |
|
[button .savewarning.bottom.cancel \ |
|
-text "Cancel" \ |
|
-command { |
|
destroy .savewarning |
|
}] \ |
|
-side left |
|
bind .savewarning <Return> { |
|
.savewarning.bottom.append flash |
|
.savewarning.bottom.append invoke |
|
} |
|
} else { |
|
set fileId [open $filename "w"] |
|
switch $savetext_whattosave { |
|
"main" { |
|
puts $fileId [.results.text get 1.0 end] |
|
} |
|
"grep" { |
|
puts $fileId [join [.grepwidget.results.frame.list \ |
|
get 0 end] "\n"] |
|
} |
|
default {} |
|
} |
|
close $fileId |
|
destroy .saveas |
|
} |
|
}] \ |
|
[button .saveas.bottom.cancel \ |
|
-text "Cancel" \ |
|
-command {destroy .saveas}] \ |
|
-side left |
|
bind .saveas <Return> { |
|
.saveas.bottom.save flash |
|
.saveas.bottom.save invoke |
|
} |
|
} |
|
|
|
proc setmaxhistorylength {} { |
|
global maxhistorylength |
|
global tcl_platform |
|
toplevel .histlen |
|
wm title .histlen "Set Maximum WordNet Browser History Length" |
|
wm transient .histlen . |
|
scan [wm geometry .] "%dx%d+%d+%d" geom_h geom_w geom_x geom_y |
|
wm geometry .histlen +[expr $geom_x+50]+[expr $geom_y+50] |
|
wm resizable .histlen 0 0 |
|
grab set .histlen |
|
pack \ |
|
[frame .histlen.f \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-side top \ |
|
-fill both \ |
|
-expand true |
|
pack \ |
|
[frame .histlen.f.top] \ |
|
[frame .histlen.f.bottom] \ |
|
-side top \ |
|
-padx 10 \ |
|
-pady 10 |
|
pack \ |
|
[label .histlen.f.top.label \ |
|
-text "Maximum history length:"] \ |
|
[entry .histlen.f.top.entry \ |
|
-textvariable maxhistorylength \ |
|
-background White \ |
|
-foreground Black] \ |
|
-side left |
|
focus .histlen.f.top.entry |
|
pack \ |
|
[button .histlen.f.bottom.ok \ |
|
-text "Ok" \ |
|
-command { |
|
if {[.menubar.history.menu index end] >= $maxhistorylength} { |
|
.menubar.history.menu delete $maxhistorylength end |
|
} |
|
destroy .histlen |
|
}] \ |
|
-side left |
|
bind .histlen <Return> { |
|
.histlen.f.bottom.ok flash |
|
.histlen.f.bottom.ok invoke |
|
} |
|
} |
|
|
|
proc showaboutbox {} { |
|
global resourcedir |
|
if {[winfo exist .aboutbox]} {raise .aboutbox; return} |
|
toplevel .aboutbox |
|
wm title .aboutbox "About WordNet Browser" |
|
wm resizable .aboutbox 0 0 |
|
pack \ |
|
[frame .aboutbox.top \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
[frame .aboutbox.bottom \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-side top \ |
|
-fill x \ |
|
-ipadx 3 \ |
|
-ipady 3 |
|
pack \ |
|
[frame .aboutbox.top.left \ |
|
-relief flat] \ |
|
[frame .aboutbox.top.right \ |
|
-relief flat] \ |
|
-side left \ |
|
-fill x \ |
|
-ipadx 3 \ |
|
-ipady 3 |
|
pack \ |
|
[label .aboutbox.top.left.icon \ |
|
-bitmap @$resourcedir/wn.xbm] \ |
|
-side left \ |
|
-padx 10 |
|
pack \ |
|
[label .aboutbox.top.right.text1 \ |
|
-anchor w \ |
|
-justify left \ |
|
-font "-adobe-helvetica-medium-r-*-*-*-180-*-*-*-*-*-*" \ |
|
-text "WordNet Browser"] \ |
|
[label .aboutbox.top.right.text2 \ |
|
-anchor w \ |
|
-justify left \ |
|
-font "-adobe-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*" \ |
|
-text "A graphical interface to the\nWordNet online lexical\ |
|
database."] \ |
|
[label .aboutbox.top.right.text3 \ |
|
-anchor w \ |
|
-justify left \ |
|
-font "-adobe-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*" \ |
|
-text "This Tcl/Tk version by David Slomin and Randee Tengi."] \ |
|
[label .aboutbox.top.right.text4 \ |
|
-anchor w \ |
|
-justify left \ |
|
-font "-adobe-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*" \ |
|
-text "Based upon an earlier X Window version by\nBrian Gustafson."] \ |
|
[label .aboutbox.top.right.text5 \ |
|
-anchor w \ |
|
-justify left \ |
|
-font "-adobe-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*" \ |
|
-text "Copyright 1991-2006\nPrinceton University Cognitive Science Lab"] \ |
|
[label .aboutbox.top.right.text6 \ |
|
-anchor w \ |
|
-justify left \ |
|
-font "-adobe-helvetica-medium-r-*-*-*-120-*-*-*-*-*-*" \ |
|
-text "All Rights Reserved"] \ |
|
-side top \ |
|
-fill x |
|
pack \ |
|
[button .aboutbox.bottom.ok \ |
|
-text "Dismiss" \ |
|
-command {destroy .aboutbox}] \ |
|
-side top \ |
|
-padx 3 \ |
|
-pady 2 |
|
} |
|
|
|
proc grepword {greptype} { |
|
global g_greptype; set g_greptype $greptype; |
|
global g_searchword |
|
global grepstr |
|
global tcl_platform |
|
|
|
if {[winfo exist .grepwidget]} {raise .grepwidget; return} |
|
|
|
set grepstr $g_searchword |
|
|
|
toplevel .grepwidget |
|
switch $g_greptype { |
|
"substring" { wm title .grepwidget "Substring search (grep)"} |
|
"ending" { wm title .grepwidget "Ending string search (grep)"} |
|
} |
|
grid \ |
|
[frame .grepwidget.inputs \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-row 0 \ |
|
-column 0 \ |
|
-sticky nsew |
|
grid \ |
|
[frame .grepwidget.results \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-row 1 \ |
|
-column 0 \ |
|
-sticky nsew |
|
grid \ |
|
[frame .grepwidget.status \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-row 2 \ |
|
-column 0 \ |
|
-sticky nsew |
|
grid \ |
|
[frame .grepwidget.buttons \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-row 3 \ |
|
-column 0 \ |
|
-sticky nsew |
|
grid rowconfigure .grepwidget 0 -weight 0 |
|
grid rowconfigure .grepwidget 1 -weight 1 |
|
grid rowconfigure .grepwidget 2 -weight 0 |
|
grid rowconfigure .grepwidget 3 -weight 0 |
|
grid columnconfigure .grepwidget 0 -weight 1 |
|
tk_optionMenu .grepwidget.inputs.pos greppos Noun Verb Adjective Adverb |
|
grid \ |
|
[label .grepwidget.inputs.label \ |
|
-text "Substring:"] \ |
|
-row 0 \ |
|
-column 0 \ |
|
-sticky ew \ |
|
-padx 2 \ |
|
-pady 2 |
|
grid \ |
|
[entry .grepwidget.inputs.word \ |
|
-textvariable grepstr \ |
|
-width 15 \ |
|
-foreground Black \ |
|
-background White] \ |
|
-row 0 \ |
|
-column 1 \ |
|
-sticky ew \ |
|
-padx 2 \ |
|
-pady 2 |
|
focus .grepwidget.inputs.word |
|
grid \ |
|
.grepwidget.inputs.pos \ |
|
-row 0 \ |
|
-column 2 \ |
|
-sticky ew \ |
|
-padx 2 \ |
|
-pady 2 |
|
grid rowconfigure .grepwidget.inputs 0 -weight 1 |
|
grid columnconfigure .grepwidget.inputs 0 -weight 0 |
|
grid columnconfigure .grepwidget.inputs 1 -weight 1 |
|
grid columnconfigure .grepwidget.inputs 2 -weight 0 |
|
pack \ |
|
[frame .grepwidget.results.frame] \ |
|
-side top \ |
|
-fill both \ |
|
-expand true \ |
|
-padx 8 \ |
|
-pady 8 |
|
grid \ |
|
[listbox .grepwidget.results.frame.list \ |
|
-yscrollcommand ".grepwidget.results.frame.yscroll set" \ |
|
-foreground Black \ |
|
-background White \ |
|
-highlightthickness 0] \ |
|
-row 0 \ |
|
-column 0 \ |
|
-sticky nsew |
|
grid \ |
|
[scrollbar .grepwidget.results.frame.yscroll \ |
|
-command ".grepwidget.results.frame.list yview" \ |
|
-width 12 \ |
|
-highlightthickness 0] \ |
|
-row 0 \ |
|
-column 1 \ |
|
-sticky nsew |
|
grid rowconfigure .grepwidget.results.frame 0 -weight 1 |
|
grid columnconfigure .grepwidget.results.frame 0 -weight 1 |
|
grid columnconfigure .grepwidget.results.frame 1 -weight 0 |
|
pack \ |
|
[label .grepwidget.status.label \ |
|
-text ""] \ |
|
-side top |
|
pack \ |
|
[frame .grepwidget.buttons.frame] \ |
|
-side top |
|
grid \ |
|
[button .grepwidget.buttons.frame.search \ |
|
-text "Search" \ |
|
-command { |
|
if {[.grepwidget.buttons.frame.search cget -text] == "Search"} { |
|
if {[string length $grepstr] >= 3} { |
|
.grepwidget.buttons.frame.search configure \ |
|
-text "Abort" |
|
.grepwidget.status.label configure \ |
|
-text "Searching... (press escape to abort)" |
|
bind .grepwidget <Escape> { |
|
.grepwidget.buttons.frame.search flash |
|
.grepwidget.buttons.frame.search invoke |
|
} |
|
.grepwidget.results.frame.list delete 0 end |
|
update |
|
set posnumber [lsearch {{} Noun Verb Adjective Adverb} \ |
|
$greppos] |
|
set clockstart [clock seconds] |
|
switch $g_greptype { |
|
"substring" { |
|
set buf [search [fixword $grepstr] $posnumber 30 0] |
|
} |
|
"ending" { |
|
set buf [fixgrep [search [fixword $grepstr] $posnumber 30 0] [fixword $grepstr]] |
|
} |
|
} |
|
set clockstop [clock seconds] |
|
set buflines [split $buf \n] |
|
foreach line $buflines { |
|
.grepwidget.results.frame.list insert end $line |
|
} |
|
.grepwidget.buttons.frame.search configure \ |
|
-text "Search" |
|
.grepwidget.status.label configure -text "" |
|
bind .grepwidget <Escape> {} |
|
} else { |
|
bell |
|
set line "Error: search string less than 3 characters\n" |
|
.grepwidget.results.frame.list delete 0 end |
|
.grepwidget.results.frame.list insert end $line |
|
} |
|
} else { |
|
bell |
|
abortsearch |
|
} |
|
}] \ |
|
-row 0 \ |
|
-column 0 \ |
|
-sticky nsew \ |
|
-padx 2 \ |
|
-pady 2 |
|
grid \ |
|
[button .grepwidget.buttons.frame.save \ |
|
-text "Save" \ |
|
-command "savetext grep"] \ |
|
-row 0 \ |
|
-column 1 \ |
|
-sticky nsew \ |
|
-padx 2 \ |
|
-pady 2 |
|
|
|
# Printing only works on Unix systems, so don't offer the option on |
|
# other platforms. |
|
if {$tcl_platform(platform) == "unix"} { |
|
grid \ |
|
[button .grepwidget.buttons.frame.print \ |
|
-text "Print" \ |
|
-command "printtext grep"] \ |
|
-row 0 \ |
|
-column 2 \ |
|
-sticky nsew \ |
|
-padx 2 \ |
|
-pady 2 |
|
} |
|
grid \ |
|
[button .grepwidget.buttons.frame.dismiss \ |
|
-text "Dismiss" \ |
|
-command "destroy .grepwidget"] \ |
|
-row 0 \ |
|
-column 3 \ |
|
-sticky nsew \ |
|
-padx 2 \ |
|
-pady 2 |
|
grid rowconfigure .grepwidget.buttons.frame 0 -weight 0 |
|
grid columnconfigure .grepwidget.buttons.frame 0 -weight 1 |
|
grid columnconfigure .grepwidget.buttons.frame 1 -weight 1 |
|
grid columnconfigure .grepwidget.buttons.frame 2 -weight 1 |
|
grid columnconfigure .grepwidget.buttons.frame 3 -weight 1 |
|
bind .grepwidget.results.frame.list <ButtonRelease-1> { |
|
set chosengrep [.grepwidget.results.frame.list curselection] |
|
if {$chosengrep != {}} { |
|
set chosengrepword [.grepwidget.results.frame.list get \ |
|
[lindex $chosengrep 0]] |
|
set g_searchword $chosengrepword |
|
set g_senses {} |
|
golookup |
|
} |
|
} |
|
bind .grepwidget <Return> { |
|
.grepwidget.buttons.frame.search flash |
|
.grepwidget.buttons.frame.search invoke |
|
} |
|
} |
|
|
|
### Utility functions |
|
|
|
proc setwordwrap {wrap} { |
|
if {$wrap} { |
|
.results.text configure -wrap word |
|
grid forget .results.scrollx |
|
} else { |
|
.results.text configure -wrap none |
|
grid .results.scrollx -row 1 -column 0 -sticky nsew |
|
} |
|
} |
|
|
|
proc golookup {} { |
|
global g_searchword |
|
global g_senses |
|
|
|
if {[fixword $g_searchword] == ""} return |
|
.results.text configure \ |
|
-state normal |
|
.results.text delete 1.0 end |
|
.results.text configure \ |
|
-state disabled |
|
set g_senses {} |
|
.posmenubar.label configure \ |
|
-text "Searches for $g_searchword:" |
|
if {[displayvalidsearchmenus $g_searchword]} { |
|
displayoverview $g_searchword |
|
history_add $g_searchword {} 0 0 |
|
} |
|
} |
|
|
|
proc fixword {word} { |
|
regsub "^ *" $word "" word ; # remove leading spaces |
|
regsub " *$" $word "" word ; # remove trailing spaces |
|
regsub -all " " $word "_" word ; # change other spaces to underscores |
|
return $word |
|
} |
|
|
|
proc fixgrep {grepbuf word} { |
|
set greplines [split $grepbuf "\n"] |
|
foreach line $greplines { |
|
if { ([regexp -nocase "$word\$" $line]) && !([regexp " " $line]) } { |
|
append retbuf $line |
|
append retbuf "\n" |
|
} |
|
} |
|
return $retbuf |
|
} |
|
|
|
proc updatefonts {} { |
|
global fontsizelist |
|
global fontname |
|
global fontsize |
|
.results.text configure \ |
|
-font "-adobe-$fontname-medium-r-*-*-*-[lindex \ |
|
$fontsizelist $fontsize]-*-*-*-*-*-*" |
|
.results.text tag configure helpstyle \ |
|
-font "-adobe-$fontname-medium-r-*-*-*-[lindex $fontsizelist \ |
|
[expr $fontsize - 1]]-*-*-*-*-*-*" \ |
|
-foreground Blue \ |
|
-lmargin1 20 |
|
.results.text tag configure overviewhighlight \ |
|
-font "-adobe-$fontname-bold-r-*-*-*-[lindex $fontsizelist \ |
|
$fontsize]-*-*-*-*-*-*" \ |
|
-foreground Red |
|
} |
|
|
|
proc clearall {} { |
|
global g_searchword |
|
global g_senses |
|
set g_searchword {} |
|
set g_senses {} |
|
.results.text configure \ |
|
-state normal |
|
.results.text delete 1.0 end |
|
.results.text configure \ |
|
-state disabled |
|
foreach pos {noun verb adj adv} { pack forget .posmenubar.$pos } |
|
pack forget .wordframe.overview |
|
.statusbar.status configure \ |
|
-text "Enter search word and press return." |
|
.posmenubar.label configure \ |
|
-text "" |
|
} |
|
|
|
proc generaterange {low high} { |
|
for {set i $low} {$i <= $high} {incr i} {lappend res $i} |
|
return $res |
|
} |
|
|
|
proc getsenselist {senses} { |
|
regsub -all {[^0-9*]+} $senses " " senses |
|
regsub "^ *" $senses "" senses |
|
regsub "\ +$" $senses "" senses |
|
if {[regexp {\*} $senses] || ($senses == {})} { set senses 0 } |
|
return $senses |
|
} |
|
|
|
proc blackout {q} { |
|
set objectlist { |
|
.menubar.file |
|
.menubar.history |
|
.menubar.options |
|
.menubar.help |
|
.wordframe.entry |
|
.wordframe.overview |
|
.posmenubar.noun |
|
.posmenubar.verb |
|
.posmenubar.adj |
|
.posmenubar.adv |
|
.posmenubar.entry |
|
} |
|
if {$q} { |
|
bind . <KeyPress-Escape> {bell; abortsearch} |
|
bind .wordframe.entry <Return> {} |
|
bind .results.text <Shift-Button-1> {} |
|
bind .results.text <Button-2> {} |
|
bind . <Control-s> {} |
|
foreach object $objectlist { |
|
$object configure \ |
|
-state disabled |
|
} |
|
} else { |
|
bind . <KeyPress-Escape> {} |
|
bind .wordframe.entry <Return> golookup |
|
bind .results.text <Shift-Button-1> {shiftclickhandler %x %y} |
|
bind .results.text <Button-2> {shiftclickhandler %x %y} |
|
bind . <Control-s> controlshandler |
|
foreach object $objectlist { |
|
$object configure \ |
|
-state normal |
|
} |
|
} |
|
} |
|
|
|
proc shiftclickhandler {x y} { |
|
global g_searchword |
|
set newsearchword [.results.text get "@$x,$y wordstart" "@$x,$y wordend"] |
|
if {$newsearchword != "\n"} { |
|
set g_searchword $newsearchword |
|
golookup |
|
} |
|
} |
|
|
|
proc controlshandler {} { |
|
global g_searchword |
|
if {[catch {selection get} newsearchword]} { |
|
bell |
|
return |
|
} |
|
if {$newsearchword != ""} { |
|
set g_searchword $newsearchword |
|
golookup |
|
} |
|
} |
|
|
|
|
|
### Visual Components |
|
|
|
grid \ |
|
[frame .menubar \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-row 0 \ |
|
-column 0 \ |
|
-sticky ew |
|
grid \ |
|
[frame .wordframe \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-row 1 \ |
|
-column 0 \ |
|
-sticky ew |
|
grid \ |
|
[frame .posmenubar \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-row 2 \ |
|
-column 0 \ |
|
-sticky ew |
|
grid \ |
|
[frame .results \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-row 3 \ |
|
-column 0 \ |
|
-sticky nsew \ |
|
-ipadx 3 \ |
|
-ipady 3 |
|
grid \ |
|
[frame .statusbar \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-row 4 \ |
|
-column 0 \ |
|
-sticky ew |
|
grid rowconfigure . 0 -weight 0 |
|
grid rowconfigure . 1 -weight 0 |
|
grid rowconfigure . 2 -weight 0 |
|
grid rowconfigure . 3 -weight 1 |
|
grid rowconfigure . 4 -weight 0 |
|
grid columnconfigure . 0 -weight 1 |
|
pack \ |
|
[menubutton .menubar.file \ |
|
-text "File" \ |
|
-menu .menubar.file.menu \ |
|
-relief flat] \ |
|
[menubutton .menubar.history \ |
|
-text "History" \ |
|
-menu .menubar.history.menu \ |
|
-relief flat] \ |
|
[menubutton .menubar.options \ |
|
-text "Options" \ |
|
-menu .menubar.options.menu \ |
|
-relief flat] \ |
|
[menubutton .menubar.help \ |
|
-text "Help" \ |
|
-menu .menubar.help.menu \ |
|
-relief flat] \ |
|
-side left |
|
pack \ |
|
[label .wordframe.label \ |
|
-text "Search Word:"] \ |
|
[entry .wordframe.entry \ |
|
-textvariable g_searchword \ |
|
-width 40 \ |
|
-background White \ |
|
-foreground Black] \ |
|
-side left \ |
|
-padx 2 \ |
|
-pady 2 |
|
focus .wordframe.entry |
|
button .wordframe.overview \ |
|
-text "Redisplay Overview" \ |
|
-padx 3 \ |
|
-pady 1 \ |
|
-highlightthickness 0 \ |
|
-relief raised \ |
|
-command { |
|
set g_senses {} |
|
displayoverview $g_searchword |
|
history_add $g_searchword {} 0 0 |
|
} |
|
pack \ |
|
[label .posmenubar.label \ |
|
-text ""] \ |
|
-side left \ |
|
-padx 2 \ |
|
-pady 2 |
|
menubutton .posmenubar.noun \ |
|
-text "Noun" \ |
|
-menu .posmenubar.noun.menu \ |
|
-relief raised |
|
menubutton .posmenubar.verb \ |
|
-text "Verb" \ |
|
-menu .posmenubar.verb.menu \ |
|
-relief raised |
|
menubutton .posmenubar.adj \ |
|
-text "Adjective" \ |
|
-menu .posmenubar.adj.menu \ |
|
-relief raised |
|
menubutton .posmenubar.adv \ |
|
-text "Adverb" \ |
|
-menu .posmenubar.adv.menu \ |
|
-relief raised |
|
pack \ |
|
[entry .posmenubar.entry \ |
|
-textvariable g_senses \ |
|
-width 10 \ |
|
-background White \ |
|
-foreground Black] \ |
|
[label .posmenubar.senselabel \ |
|
-text "Senses:"] \ |
|
-side right \ |
|
-padx 2 \ |
|
-pady 2 |
|
grid \ |
|
[text .results.text \ |
|
-wrap word \ |
|
-relief sunken \ |
|
-borderwidth 2 \ |
|
-state disabled \ |
|
-yscrollcommand ".results.scrolly set" \ |
|
-xscrollcommand ".results.scrollx set" \ |
|
-background White \ |
|
-foreground Black \ |
|
-width 80 \ |
|
-height 25 \ |
|
-highlightthickness 0] \ |
|
-row 0 \ |
|
-column 0 \ |
|
-sticky nsew |
|
updatefonts |
|
grid \ |
|
[scrollbar .results.scrolly \ |
|
-command ".results.text yview" \ |
|
-width 12 \ |
|
-relief sunken \ |
|
-borderwidth 2 \ |
|
-highlightthickness 0] \ |
|
-row 0 \ |
|
-column 1 \ |
|
-sticky nsew |
|
grid \ |
|
[scrollbar .results.scrollx \ |
|
-orient horizontal \ |
|
-command ".results.text xview" \ |
|
-width 12 \ |
|
-relief sunken \ |
|
-borderwidth 2 \ |
|
-highlightthickness 0] \ |
|
-row 1 \ |
|
-column 0 \ |
|
-sticky nsew |
|
if {$wordwrap} {grid forget .results.scrollx} |
|
grid rowconfigure .results 0 -weight 1 |
|
grid rowconfigure .results 1 -weight 0 |
|
grid columnconfigure .results 0 -weight 1 |
|
grid columnconfigure .results 1 -weight 0 |
|
pack \ |
|
[label .statusbar.status \ |
|
-text "Enter search word and press return."] \ |
|
-side left \ |
|
-padx 2 |
|
|
|
### Regular Menus |
|
|
|
if {$labonly} { |
|
menu .menubar.file.menu \ |
|
-tearoff false |
|
menu .menubar.history.menu \ |
|
-tearoff false |
|
menu .menubar.options.menu \ |
|
-tearoff false |
|
menu .menubar.options.menu.font \ |
|
-tearoff false |
|
menu .menubar.help.menu \ |
|
-tearoff false |
|
.menubar.file.menu add command \ |
|
-label "Find keywords by substring" \ |
|
-command "grepword substring" |
|
.menubar.file.menu add command \ |
|
-label "Find keywords by ending" \ |
|
-command "grepword ending" |
|
.menubar.file.menu add separator |
|
.menubar.file.menu add command \ |
|
-label "Save current display (specify path)" \ |
|
-command "savetext main" |
|
} else { |
|
menu .menubar.file.menu \ |
|
-tearoff false |
|
menu .menubar.history.menu \ |
|
-tearoff false |
|
menu .menubar.options.menu \ |
|
-tearoff false |
|
menu .menubar.options.menu.font \ |
|
-tearoff false |
|
menu .menubar.help.menu \ |
|
-tearoff false |
|
.menubar.file.menu add command \ |
|
-label "Find keywords by substring" \ |
|
-command "grepword substring" |
|
.menubar.file.menu add separator |
|
.menubar.file.menu add command \ |
|
-label "Save current display (specify path)" \ |
|
-command "savetext main" |
|
} |
|
|
|
# Printing only works on Unix systems, so don't offer the option on |
|
# other platforms. |
|
if {$tcl_platform(platform) == "unix"} { |
|
.menubar.file.menu add command \ |
|
-label "Print current display" \ |
|
-command "printtext main" |
|
} |
|
.menubar.file.menu add command \ |
|
-label "Clear current display" \ |
|
-command clearall |
|
.menubar.file.menu add separator |
|
if {$labonly} { |
|
.menubar.file.menu add command \ |
|
-label "Reopen database" \ |
|
-command reopendb |
|
.menubar.file.menu add separator |
|
} |
|
.menubar.file.menu add command \ |
|
-label "Exit" \ |
|
-command { destroy . } |
|
.menubar.options.menu add checkbutton \ |
|
-label "Show help with each search" \ |
|
-variable showcontextualhelp |
|
.menubar.options.menu add checkbutton \ |
|
-label "Show descriptive gloss" \ |
|
-variable showglosses \ |
|
-command { glosses $showglosses } |
|
.menubar.options.menu add checkbutton \ |
|
-label "Wrap lines" \ |
|
-variable wordwrap \ |
|
-command {.menubar.history.menu invoke 0} |
|
.menubar.options.menu add separator |
|
.menubar.options.menu add command \ |
|
-label "Set advanced search options..." \ |
|
-command { |
|
toplevel .adviewopt |
|
wm title .adviewopt "Advanced search options" |
|
wm transient .adviewopt . |
|
scan [wm geometry .] "%dx%d+%d+%d" geom_h geom_w geom_x geom_y |
|
wm geometry .adviewopt +[expr $geom_x+50]+[expr $geom_y+50] |
|
wm resizable .adviewopt 0 0 |
|
grab set .adviewopt |
|
pack \ |
|
[frame .adviewopt.fileinfo \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
[frame .adviewopt.byteoffset \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
[frame .adviewopt.senseflag \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
[frame .adviewopt.bottom \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-side top \ |
|
-fill both \ |
|
-expand true |
|
pack \ |
|
[frame .adviewopt.fileinfo.f \ |
|
-relief flat \ |
|
-borderwidth 10] \ |
|
-side top \ |
|
-fill both \ |
|
-expand true |
|
pack \ |
|
[label .adviewopt.fileinfo.f.label \ |
|
-text "Lexical file information"] \ |
|
[radiobutton .adviewopt.fileinfo.f.opt0 \ |
|
-text "Don't show" \ |
|
-variable showfileinfo \ |
|
-value 0] \ |
|
[radiobutton .adviewopt.fileinfo.f.opt1 \ |
|
-text "Show with searches" \ |
|
-variable showfileinfo \ |
|
-value 1] \ |
|
[radiobutton .adviewopt.fileinfo.f.opt2 \ |
|
-text "Show with searches and overview" \ |
|
-variable showfileinfo \ |
|
-value 2] \ |
|
-side top \ |
|
-anchor w |
|
pack \ |
|
[frame .adviewopt.byteoffset.f \ |
|
-relief flat \ |
|
-borderwidth 10] \ |
|
-side top \ |
|
-fill both \ |
|
-expand true |
|
pack \ |
|
[label .adviewopt.byteoffset.f.label \ |
|
-text "Synset location in database file"] \ |
|
[radiobutton .adviewopt.byteoffset.f.opt0 \ |
|
-text "Don't show" \ |
|
-variable showbyteoffset \ |
|
-value 0] \ |
|
[radiobutton .adviewopt.byteoffset.f.opt1 \ |
|
-text "Show with searches" \ |
|
-variable showbyteoffset \ |
|
-value 1] \ |
|
[radiobutton .adviewopt.byteoffset.f.opt2 \ |
|
-text "Show with searches and overview" \ |
|
-variable showbyteoffset \ |
|
-value 2] \ |
|
-side top \ |
|
-anchor w |
|
pack \ |
|
[frame .adviewopt.senseflag.f \ |
|
-relief flat \ |
|
-borderwidth 10] \ |
|
-side top \ |
|
-fill both \ |
|
-expand true |
|
pack \ |
|
[label .adviewopt.senseflag.f.label \ |
|
-text "Sense number"] \ |
|
[radiobutton .adviewopt.senseflag.f.opt0 \ |
|
-text "Don't show" \ |
|
-variable showsenseflag \ |
|
-value 0] \ |
|
[radiobutton .adviewopt.senseflag.f.opt1 \ |
|
-text "Show with searches" \ |
|
-variable showsenseflag \ |
|
-value 1] \ |
|
[radiobutton .adviewopt.senseflag.f.opt2 \ |
|
-text "Show with searches and overview" \ |
|
-variable showsenseflag \ |
|
-value 2] \ |
|
-side top \ |
|
-anchor w |
|
pack \ |
|
[button .adviewopt.bottom.ok \ |
|
-text "Ok" \ |
|
-command "destroy .adviewopt"] \ |
|
-side top \ |
|
-pady 5 |
|
} |
|
.menubar.options.menu add command \ |
|
-label "Set maximum history length..." \ |
|
-command setmaxhistorylength |
|
.menubar.options.menu add command \ |
|
-label "Set font..." \ |
|
-command { |
|
toplevel .fontopt |
|
wm title .fontopt "Font" |
|
wm transient .fontopt . |
|
scan [wm geometry .] "%dx%d+%d+%d" geom_h geom_w geom_x geom_y |
|
wm geometry .fontopt +[expr $geom_x+50]+[expr $geom_y+50] |
|
wm resizable .fontopt 0 0 |
|
grab set .fontopt |
|
pack \ |
|
[frame .fontopt.top] \ |
|
[frame .fontopt.bottom \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-side top \ |
|
-fill both \ |
|
-expand true |
|
pack \ |
|
[frame .fontopt.top.face \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
[frame .fontopt.top.size \ |
|
-relief raised \ |
|
-borderwidth 1] \ |
|
-side left \ |
|
-fill both \ |
|
-expand true |
|
pack \ |
|
[frame .fontopt.top.face.f \ |
|
-relief flat \ |
|
-borderwidth 10] \ |
|
-side top \ |
|
-fill both \ |
|
-expand true |
|
pack \ |
|
[label .fontopt.top.face.f.label \ |
|
-text "Typeface"] \ |
|
[radiobutton .fontopt.top.face.f.courier \ |
|
-text "Courier" \ |
|
-variable fontname \ |
|
-value courier] \ |
|
[radiobutton .fontopt.top.face.f.helvetica \ |
|
-text "Helvetica" \ |
|
-variable fontname \ |
|
-value helvetica] \ |
|
[radiobutton .fontopt.top.face.f.times \ |
|
-text "Times" \ |
|
-variable fontname \ |
|
-value times] \ |
|
-side top \ |
|
-anchor w |
|
pack \ |
|
[frame .fontopt.top.size.f \ |
|
-relief flat \ |
|
-borderwidth 10] \ |
|
-side top \ |
|
-fill both \ |
|
-expand true |
|
pack \ |
|
[label .fontopt.top.size.f.label \ |
|
-text "Size"] \ |
|
[radiobutton .fontopt.top.size.f.small \ |
|
-text "Small" \ |
|
-variable fontsize \ |
|
-value 1] \ |
|
[radiobutton .fontopt.top.size.f.medium \ |
|
-text "Medium" \ |
|
-variable fontsize \ |
|
-value 2] \ |
|
[radiobutton .fontopt.top.size.f.large \ |
|
-text "Large" \ |
|
-variable fontsize \ |
|
-value 3] \ |
|
-side top \ |
|
-anchor w |
|
pack \ |
|
[button .fontopt.bottom.ok \ |
|
-text "Ok" \ |
|
-command { |
|
updatefonts |
|
destroy .fontopt |
|
.menubar.history.menu invoke 0 |
|
}] \ |
|
-side top \ |
|
-pady 5 |
|
} |
|
.menubar.options.menu add separator |
|
.menubar.options.menu add command \ |
|
-label "Save current options as default" \ |
|
-command {saveoptions} |
|
.menubar.help.menu add command \ |
|
-label "Help on using the WordNet browser" \ |
|
-command {showhelpwidget helpwidget_xwn $resourcedir/wnb.man "WordNet Browser Help"} |
|
.menubar.help.menu add command \ |
|
-label "Help on WordNet terminology" \ |
|
-command {showhelpwidget helpwidget_wngloss $resourcedir/wngloss.man "WordNet Glossary"} |
|
.menubar.help.menu add command \ |
|
-label "Display the WordNet license" \ |
|
-command {showhelpwidget helpwidget_license $resourcedir/license.txt "WordNet License"} |
|
.menubar.help.menu add separator |
|
.menubar.help.menu add command \ |
|
-label "About the WordNet browser" \ |
|
-command showaboutbox |
|
|
|
### Dynamic menus (for each part of speech) |
|
### The numbers here are from wnconsts.h in the Wordnet library. |
|
### Unfortunately, Tcl doesn't recognise #defined constants. |
|
### Please be sure to keep them synchronised. |
|
|
|
menu .posmenubar.noun.menu \ |
|
-tearoff false |
|
menu .posmenubar.verb.menu \ |
|
-tearoff false |
|
menu .posmenubar.adj.menu \ |
|
-tearoff false |
|
menu .posmenubar.adv.menu \ |
|
-tearoff false |
|
set posmenu(1) { |
|
{ "Synonyms, ordered by estimated frequency" 2 {} } |
|
{ "Synonyms, grouped by similarity" 27 {} } |
|
{ "Antonyms" 1 {} } |
|
{ "Coordinate Terms" 26 {} } |
|
{ "Hypernyms (this is a kind of...)" -2 {} } |
|
{ "Hyponyms (...is a kind of this), brief" 3 {} } |
|
{ "Hyponyms (...is a kind of this), full" -3 {} } |
|
{ "Holonyms (this is a part of...), regular" 13 {} } |
|
{ "Holonyms (this is a part of...), inherited" -29 {} } |
|
{ "Meronyms (parts of this), regular" 12 {} } |
|
{ "Meronyms (parts of this), inherited" -28 {} } |
|
{ "Derivationally related forms" 20 {} } |
|
{ "Attributes (...is a value of this)" 18 {} } |
|
{ "Domain" 21 {} } |
|
{ "Domain Terms" 22 {} } |
|
{ "Familiarity" 24 {} } |
|
} |
|
set posmenu(2) { |
|
{ "Synonyms, ordered by estimated frequency" 2 {} } |
|
{ "Synonyms, grouped by similarity" 27 {} } |
|
{ "Antonyms" 1 {} } |
|
{ "Coordinate Terms" 26 {} } |
|
{ "Hypernyms (this is one way to...)" -2 {} } |
|
{ "Troponyms (particular ways to...), brief" 3 {} } |
|
{ "Troponyms (particular ways to...), full" -3 {} } |
|
{ "This entails doing..." 4 {} } |
|
{ "This causes..." 14 {} } |
|
{ "Derivationally related forms" 20 {} } |
|
{ "Sentence frames" 25 {} } |
|
{ "Domain" 21 {} } |
|
{ "Domain Terms" 22 {} } |
|
{ "Familiarity" 24 {} } |
|
} |
|
set posmenu(3) { |
|
{ "Synonyms" 5 {} } |
|
{ "Antonyms" 1 {} } |
|
{ "Related Noun" 17 {} } |
|
{ "This is a value of..." 18 {} } |
|
{ "Derivationally related forms" 20 {} } |
|
{ "Domain" 21 {} } |
|
{ "Domain Terms" 22 {} } |
|
{ "Familiarity" 24 {} } |
|
} |
|
set posmenu(4) { |
|
{ "Synonyms" 23 {} } |
|
{ "Antonyms" 1 {} } |
|
{ "Base Adjective" 17 {} } |
|
{ "Derivationally related forms" 20 {} } |
|
{ "Domain" 21 {} } |
|
{ "Domain Terms" 22 {} } |
|
{ "Familiarity" 24 {} } |
|
} |
|
|
|
### Bindings |
|
|
|
bind .wordframe.entry <Return> golookup |
|
bind .results.text <Shift-Button-1> {shiftclickhandler %x %y} |
|
bind .results.text <Button-2> {shiftclickhandler %x %y} |
|
bind . <Control-s> controlshandler |
|
bind . <Control-g> "grepword substring" |
|
|
|
set g_searchword [lindex $argv 0] |
|
golookup |
|
|