archie/tcl-dp/tekilib/wise.tcl
2024-05-27 16:13:40 +02:00

289 lines
8.1 KiB
Tcl

package provide Wise 1.0
#
# WISE user interface support
#
# The following procedures support the WISE style user interface.
# There are 4 exported functions:
#
# Wise_Checklist and Wise_RadioList display a list of check buttons
# (or radio buttons) for the user to select. Both these routines
# display next/back/finish/cancel buttons.
# Wise_Message displays a long message, such as a copyright notice,
# along with a set of buttons
# Wise_GetDirName gets a directory name from the user
# Center the window on the screen.
proc Wise_CenterWindow {w} {
update idletasks
set x [expr [winfo screenwidth $w]/2 - [winfo reqwidth $w]/2 \
- [winfo vrootx [winfo parent $w]]]
set y [expr [winfo screenheight $w]/2 - [winfo reqheight $w]/2 \
- [winfo vrooty [winfo parent $w]]]
wm geom $w +$x+$y
wm deiconify $w
wm transient $w .
raise $w
}
# Create the logo image (once)
proc WiseCreateLogo {} {
global TekiInfo WiseInfo
if {[info commands logoImage] == ""} {
set WiseInfo(photo) [image create photo logoImage]
logoImage read [file join $TekiInfo(library) logo.gif]
}
}
# Create and display the WISE wizard window, centered on the screen.
# Cache the window for better performance
proc WiseMakeWizard {} {
global WiseInfo TekiInfo
if {[info commands .wise] == ""} {
toplevel .wise
WiseCreateLogo
label .wise.logo -image logoImage
grid .wise.logo -row 0 -column 0 -rowspan 2 -sticky n
label .wise.title -font $TekiInfo(varfont)
grid .wise.title -column 1 -row 0 -columnspan 5 -sticky ew
grid rowconfigure .wise 1 -weight 1
listbox .wise.list
grid .wise.list -row 1 -column 1 -columnspan 5 -sticky nesw
button .wise.back -text {< Back} -command "set WiseInfo(done) back"
button .wise.next -text {Next >} -command "set WiseInfo(done) next"
button .wise.finish -text {Finish} -command "set WiseInfo(done) finish"
button .wise.cancel -text {Cancel} -command "set WiseInfo(done) cancel"
grid .wise.back -row 2 -column 2 -sticky nsew
grid .wise.next -row 2 -column 3 -sticky nsew
grid .wise.finish -row 2 -column 4 -sticky nsew
grid .wise.cancel -row 2 -column 5 -padx 10
Wise_CenterWindow .wise
} else {
wm deiconify .wise
}
}
# Display a checklist for the user in the WISE window.
#
# title is the window title
# items is list {label value on?}
# One checkbox is created for each item, with the label as specified
#
# The return value depends on which button (next, back, finish, or cancel)
# the user presses. It is one of the following:
# back
# cancel
# {next list-of-selected-items}
# {finish list-of-selected-items}
# where list-of-selected-items is the value part from the "items" list
proc Wise_Checklist {title items} {
global WiseInfo
WiseMakeWizard
wm title .wise $title
.wise.title configure -text $title
set count 0
foreach i $items {
set name [lindex $i 0]
set on [lindex $i 2]
set w .wise.list.b$count
set WiseInfo($count) $on
checkbutton $w -variable WiseInfo($count) -text $name -anchor w
pack $w -side top -fill x
# grid $w -row $count -sticky nsw
incr count
}
set WiseInfo(done) 0
vwait WiseInfo(done)
set rv $WiseInfo(done)
if {[lsearch "next finish" $rv] != -1} {
set count 0
foreach i $items {
set value [lindex $i 1]
if $WiseInfo($count) {
lappend rv $value
}
incr count
}
}
wm withdraw .wise
set count 0
foreach i $items {
destroy .wise.list.b$count
incr count
}
unset WiseInfo
return $rv
}
# Display a radio-button list for the user in the WISE window.
#
# title is the window title
# items is list {label value on?}
# One checkbox is created for each item, with the label as specified
#
# The return value depends on which button (next, back, finish, or cancel)
# the user presses. It is one of the following:
# back
# cancel
# {next selected-item}
# {finish selected-item}
# where selected-item is the value part (from the "items" list) of the
# radio-button the user selected
proc Wise_Radiolist {title items {backDisabled 0}} {
global WiseInfo
WiseMakeWizard
wm title .wise $title
.wise.title configure -text $title
set count 0
set WiseInfo(radio) {}
foreach i $items {
set name [lindex $i 0]
set value [lindex $i 1]
set on [lindex $i 2]
set w .wise.list.b$count
if {$on} {
set WiseInfo(radio) $value
}
radiobutton $w -variable WiseInfo(radio) -text $name -anchor w -value $value
pack $w -side top -fill x
incr count
}
set WiseInfo(done) 0
if {$backDisabled} {
.wise.back configure -state disabled
}
vwait WiseInfo(done)
set rv $WiseInfo(done)
wm withdraw .wise
.wise.back configure -state normal
set count 0
foreach i $items {
destroy .wise.list.b$count
incr count
}
if {[lsearch "next finish" $rv] != -1} {
set rv [concat $rv $WiseInfo(radio)]
}
unset WiseInfo
return $rv
}
#
# Display a long message, such as a copyright notice, to the user
# in a textbox.
#
# title is the window title
# msg is the text of the message
# items is a list of labels. One button is created for each label.
#
# The return value is the index of the button pressed
proc Wise_Message {title msg items {dispLogo 1}} {
global WiseInfo
if {[info commands .wisemsg] == ""} {
toplevel .wisemsg
wm title .wisemsg $title
WiseCreateLogo
label .wisemsg.logo -image logoImage
scrollbar .wisemsg.scroll -command ".wisemsg.text yview"
text .wisemsg.text -relief sunken -bd 2 -yscrollcommand ".wisemsg.scroll set" -setgrid 1 -height 10
Wise_CenterWindow .wisemsg
}
set WiseInfo(done) -1
set count 1
foreach i $items {
button .wisemsg.b$count -text $i -command "set WiseInfo(done) $count"
grid .wisemsg.b$count -row 2 -column $count
incr count
}
.wisemsg.text delete 1.0 end
.wisemsg.text insert end $msg
grid .wisemsg.text -column 1 -row 0 -columnspan [expr $count-1] -sticky nsew
grid .wisemsg.scroll -column $count -row 0 -sticky ns
grid rowconfigure .wisemsg 0 -weight 1
if {$dispLogo} {
grid .wisemsg.logo -row 0 -column 0 -sticky n
} else {
grid forget .wisemsg.logo
}
Wise_CenterWindow .wisemsg
vwait WiseInfo(done)
set rv [expr $WiseInfo(done)-1]
wm withdraw .wisemsg
set count 1
foreach i $items {
destroy .wisemsg.b$count
incr count
}
unset WiseInfo
return $rv
}
# Ask the user to enter a directory name. Return either the
# directory name, or the empty string if they hit "cancel". Right
# now, the "Browse..." option is funky, since it requires the user
# to select a file in the directory where they want to install...
#
# XXX: need to fix this...
proc Wise_GetDirName {default} {
global WiseInfo
catch {destroy .d}
toplevel .d
wm title .d "Select directory"
set WiseInfo(done) 0
set WiseInfo(value) $default
label .d.label -text "Enter directory name"
entry .d.entry -textvariable WiseInfo(value)
button .d.ok -text OK -command "set WiseInfo(done) ok"
button .d.browse -text Browse... -command {
set WiseInfo(value) [file dirname [tk_getOpenFile -title "Select file in directory"]]
}
button .d.cancel -text Cancel -command "set WiseInfo(done) cancel"
grid .d.label -row 0 -column 0 -sticky e
grid .d.entry -row 0 -column 1 -columnspan 2 -sticky ew
grid .d.ok -row 1 -column 0
grid .d.browse -row 1 -column 1
grid .d.cancel -row 1 -column 2
grid columnconfigure .d 1 -weight 1
Wise_CenterWindow .d
vwait WiseInfo(done)
if {$WiseInfo(done) == "ok"} {
set rv $WiseInfo(value)
} else {
set rv {}
}
destroy .d
unset WiseInfo
return $rv
}