dialog
TCL/TK UseCase3
Abstract : Contains the dialog boxes used through out the program.
Comments : Pay close attention to the way in which the save and
open works. Most of the code is reused for both
functions and for the different type of saves.
# This file contains code for all of the dialogue boxes used by the application.
# Each dialogue box is a seperate window. Ex. File open/save windows, print
# window, etc.
# Creates a 'confirm' dialogue box which asks the user if they wish to proceed
# with their current action. When this proceedure is called, a text message can be
# passed which will be printed in the yesno window. There are 2 buttons
# automatically created: "No!" and "Sure do." A global flag is set according to
# whether the user clicked on "No!" or "Sure do."
# This proceedure is called when the user attempts do delete an edge or a vertex,
# and when the user attempts to quit without saving.
proc yesno { words x y } {
global flagno
toplevel .asking
wm transient .asking .
set temp [winfo x .]
set temp2 [winfo y .]
set x2 [expr $x + $temp]
set y2 [expr $y + $temp2]
wm geometry .asking 200x125+$x2+$y2
# Creates the message text:
message .asking.t -relief raised -background gray \
-width 150 -text $words
# Creates "No!" button: When clicked, sets global var. flagno to 0.
button .asking.b1 -text "No!" -background red -command \
{set flagno 0 ; destroy .asking}
# Creates "Sure do." button: When clicked, sets global var. flagno to 1.
button .asking.b2 -text "Sure do." -background red -command \
{set flagno 1 ; destroy .asking}
pack .asking.t
pack .asking.b2 .asking.b1 -fill y -padx 1m -pady 1m
update idletask
grab .asking
tkwait window .asking
}
# Not used
proc nextcord {words} {
global passx
global passy
toplevel .asking
wm transient .asking .
message .asking.t -relief raised -background gray \
-width 150 -text $words
pack .asking.t -fill x
bind .area {set passx %x ; set passy %y ; destroy .asking}
update idletask
grab set .
tkwait window .asking
bind .area {whattodo %x %y}
}
# Creates a window which displays the text message passed to the procedure, and
# contains an "Okay" button.
proc ask {words} {
toplevel .asking
wm transient .asking .
wm group .asking .
# wm geometry .asking 100x100+$x+$y
# Creates the text message
message .asking.t -relief raised -background gray \
-width 150 -text $words
# Creates the "Okay" button. When this button is clicked, the window gets
# destroyed.
button .asking.b -text "Okay" -background red\
-command "destroy .asking"
pack .asking.t .asking.b -fill x
update idletask
grab .asking
tkwait window .asking
}
# Creates dialogue box used to let user enter in the name of a vertex or edge label.
# This procedure is used when a verted or construction edge is created, and and when
# the user renames the label of a vertex or construction edge.
proc asklabel {words x y} {
global askingName
set askingName ""
toplevel .asking
wm transient .asking .
set temp [winfo x .]
set temp2 [winfo y .]
set x2 [expr $x + $temp]
set y2 [expr $y + $temp2]
wm geometry .asking 150x75+$x2+$y2
message .asking.t -relief raised -background gray \
-width 150 -text $words
# askingName is the text variable which stores the text entered by the user. This
# gets returned to the routine which called this procedure.
entry .asking.name -background green -textvariable askingName
# Creates "Enter" and "Cancel" buttons:
button .asking.b -text "Enter" -background red \
-command "destroy .asking"
button .asking.b2 -text "Cancel" -background red \
-command {set askingName "" ; destroy .asking}
pack .asking.t .asking.name -fill x
pack .asking.b .asking.b2 -side right -padx 1m -pady 1m
bind .asking.name {destroy .asking}
update idletask
grab .asking
tkwait window .asking
return $askingName
}
#Chi-Chen's and Mike's opening & saving
# The openentry procedure gets called when a filename or directory name is selected -
# either by the user double-clicking on an entry in the file selection window, or by
# the user entering in a filename into the text entry field of the file selection window
# and hitting return.
proc openentry {entry} {
global boxflag iGraph changes can filename
# boxflag is a global variable which tells this procedure whether:
# 1)a file is to be opened or saved.
# 2)a CD is to be generated and saved to a file.
# 3)a postscript file is to be saved.
# Checks to see if the filename is valid.
if [file exists $entry] {
# If entry is a directory name, we change to that directory and create a new file
# list box containing all files in that directory.
if [file isdirectory $entry] {
cd $entry
destroy .fs.files
listbox .fs.files -relief raised -borderwidth 4 \
-yscrollcommand ".fs.scroll set"
pack .fs.files -side left
bind .fs.files {openentry [selection get]}
list-out
global entered
set $entered {}
} elseif [file exists $entry] {
# Do following if file exists:
if [file isfile $entry] {
#this is where the open & save stuff happens
if {$boxflag == "open"} {
set filename $entry
# A file is being opened, so we call the c++ function to open a file.
# We call function cppOpenCD in the iGraph object, passing it the file
# name entered.
set retVal [$iGraph cppOpenCD: $entry]
destroy .fs
set changes no
}
} } } elseif {[file exists $entry] != 1} {
# Execute the following if the filename does not exist:
if {$boxflag == "savefile"} {
set changes no
set filename $entry
# A file is being saved, so we call the c++ function to save a file.
# We call function cppSaveCD in the iGraph object, passing it the file
# name entered.
set retVal [$iGraph cppSaveCD: $entry]
destroy .fs
} elseif {$boxflag == "savecd"} {
puts "Sending: GenCD $entry"
# A Class Dictionary is being generated, so we call the c++
# function to generate the CD and save to a file.
# We call function cppGenCD in the iGraph object, passing it the file
# name entered.
set retVal [$iGraph cppGenCD: $entry]
destroy .fs
# Save as a postscript:
} elseif {$boxflag == "saveps"} {
# A PostScript file is being generated, so we call the
# PostScript procedure which saves the file with $entry file name.
Postscript $can $entry
destroy .fs
} else {
# puts "Sorry, that file doesn't exist."
}
} }
# Creates the text entry field in the file entry window which allows the user to enter
# a filename. If the user hits return, the procedure openentry is called.
proc file-entry {type} {
global entered filename
frame .fs.file
label .fs.file.label -text $type
entry .fs.file.entry -width 20 -relief sunken -bd 2 -textvariable entered
pack .fs.file.label .fs.file.entry -side left -padx 1m -pady 2m
# When user enters a filename in the text box, openentry is called and passed the name of
# the file which the user entered.
bind .fs.file.entry {openentry $entered ; set entered $filename}
pack .fs.file -side top
}
# Generates the list of files in the file select window.
proc list-out {} {
.fs.files insert end .
.fs.files insert end ..
foreach i [lsort [glob *]] {
.fs.files insert end $i
}
}
# File select dialogue box window: Creates a window which contains a scrollable list of
# files in the current directory. The user selects an entry in the window by
# double-clicking on the file or directory name.
proc list-box {} {
listbox .fs.files -relief raised -borderwidth 4 \
-yscrollcommand ".fs.scroll set"
pack .fs.files -side left
scrollbar .fs.scroll -command ".fs.files yview"
pack .fs.scroll -side right -fill y
list-out
# Calls the procedure which generates the list of files in the current directory.
list-out
# If the user double-clicks on a filename, openentry is called and passed the filename
# or directory name which the user double-clicked on.
bind .fs.files {openentry [selection get]}
}
# The following functions create the file selection box based on whether the user wishes
# to open a file, save a file, generate a CD and save to a file, or save a postscript file.
# Open a file:
proc openfile {} {
global boxflag
# Tells procedure openentry that we want to open a file.
set boxflag open
toplevel .fs
wm title .fs "Select File:"
file-entry "Open File:"
list-box
}
# Save a file:
proc savefile {} {
global boxflag filename iGraph changes
#Saves if file has already been opened
if {$filename != ""} {
set changes no
set retVal [$iGraph cppSaveCD: $filename]
return
}
# Tells procedure openentry that we want to save a file.
set boxflag savefile
toplevel .fs
wm title .fs "Save File:"
file-entry "Save File:"
list-box
}
# Save a file as:
proc savefileas {} {
global boxflag filename iGraph changes
# Tells procedure openentry that we want to save a file.
set boxflag savefile
toplevel .fs
wm title .fs "Save File as:"
file-entry "Save File as:"
list-box
}
# Generate a CD:
proc savecd {} {
global boxflag
# Tells procedure openentry that we want to save a CD.
set boxflag savecd
toplevel .fs
wm title .fs "Save CD:"
file-entry "Save CD:"
list-box
}
# Save a postscript file
proc savepost {} {
global boxflag
set boxflag saveps
toplevel .fs
wm title .fs "Save Postscript:"
file-entry "Save Postscript:"
list-box
}
# Print dialogue box
proc printwindow {} {
toplevel .pw
wm title .pw "Print:"
frame .pw.frame1
frame .pw.frame2
# Pack the 2 frames:
pack .pw.frame1 -side top -fill x
pack .pw.frame2 -side bottom -fill x
label .pw.frame1.label -text {Enter Printer:}
# Text entry widget
entry .pw.frame1.entry -width 20 -relief sunken -textvariable printer
frame .pw.frame2.p -borderwidth 2 -relief sunken
# Print button runs print procedure
button .pw.frame2.p.print -text "Print" -padx 5 -pady 5 \
-command {print $printer}
# Cancel button destroys window
button .pw.frame2.cancel -text "Cancel" -padx 5 -pady 5 -command\
{destroy .pw}
# When you push , it prints
bind .pw.frame1.entry {print $printer}
# Pack labels and entries and buttons (oh, my!) in each frame:
pack .pw.frame1.label -side left
pack .pw.frame1.entry -side right
pack .pw.frame2.p .pw.frame2.p.print -side left
pack .pw.frame2.cancel -side right
}
# Prints the postscript file and destroys the printing dialogue box.
proc print {printer} {
printcanvas $printer
# Destroy the printer window:
destroy .pw
}