282 lines
6.6 KiB
Tcl
282 lines
6.6 KiB
Tcl
|
# -*-mode: tcl; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
|
||
|
#
|
||
|
# $Id: EditGrid.tcl,v 1.3 2001/12/09 05:31:07 idiscovery Exp $
|
||
|
#
|
||
|
# Tix Demostration Program
|
||
|
#
|
||
|
# This sample program is structured in such a way so that it can be
|
||
|
# executed from the Tix demo program "widget": it must have a
|
||
|
# procedure called "RunSample". It should also have the "if" statment
|
||
|
# at the end of this file so that it can be run as a standalone
|
||
|
# program using tixwish.
|
||
|
|
||
|
# Demonstrates the use of editable entries in a Grid widget.
|
||
|
#
|
||
|
|
||
|
proc RunSample {w} {
|
||
|
global editgrid
|
||
|
|
||
|
wm title $w "Doe Inc. Performance"
|
||
|
wm geometry $w 640x300
|
||
|
|
||
|
label $w.lab -justify left -text \
|
||
|
"The left column is calculated automatically. To calculate the right column,
|
||
|
press the \"Calculate\" button"
|
||
|
pack $w.lab -side top -anchor c -padx 3 -pady 3
|
||
|
|
||
|
# Create the buttons
|
||
|
#
|
||
|
set f [frame $w.f -relief flat]
|
||
|
pack $f -side right -fill y
|
||
|
set add [button $f.add -text "Add Row" -width 9 \
|
||
|
-command "EditGrid_addRow"]
|
||
|
set edit [button $f.edit -text "Edit" -width 9 \
|
||
|
-command "EditGrid_edit"]
|
||
|
set cal [button $f.cal -text "Calculate" -width 9 \
|
||
|
-command "EditGrid_calculate"]
|
||
|
set close [button $f.close -text "Close" -width 9 \
|
||
|
-command "destroy $w"]
|
||
|
pack $add -side top -padx 10
|
||
|
pack $edit -side top -padx 10
|
||
|
pack $cal -side top -padx 10 -pady 2
|
||
|
pack $close -side bottom -padx 10
|
||
|
|
||
|
# Create the grid and set options to make it editable.
|
||
|
#
|
||
|
tixScrolledGrid $w.g -bd 0
|
||
|
pack $w.g -expand yes -fill both -padx 3 -pady 3
|
||
|
|
||
|
set grid [$w.g subwidget grid]
|
||
|
$grid config \
|
||
|
-formatcmd "EditGrid_format $grid" \
|
||
|
-editnotifycmd "EditGrid_editNotify" \
|
||
|
-editdonecmd "EditGrid_editDone" \
|
||
|
-selectunit cell \
|
||
|
-selectmode single
|
||
|
|
||
|
# Insert some initial data
|
||
|
#
|
||
|
$grid set 0 1 -text "City #1"
|
||
|
$grid set 0 2 -text "City #2"
|
||
|
$grid set 0 3 -text "City #3"
|
||
|
$grid set 0 5 -text "Combined"
|
||
|
|
||
|
$grid set 2 0 -text "Population"
|
||
|
$grid set 4 0 -text "Avg. Income"
|
||
|
|
||
|
$grid set 2 1 -text 125
|
||
|
$grid set 2 2 -text 81
|
||
|
$grid set 2 3 -text 724
|
||
|
|
||
|
$grid set 4 1 -text 24432.12
|
||
|
$grid set 4 2 -text 18290.24
|
||
|
$grid set 4 3 -text 18906.34
|
||
|
|
||
|
# Global data used by other EditGrid_ procedures.
|
||
|
#
|
||
|
set editgrid(g) $grid
|
||
|
set editgrid(top) 1
|
||
|
set editgrid(bot) 3
|
||
|
set editgrid(result) 5
|
||
|
|
||
|
EditGrid_calPop
|
||
|
EditGrid_calIncome
|
||
|
}
|
||
|
|
||
|
# EditGrid_edit --
|
||
|
#
|
||
|
# Prompts the user to edit a cell.
|
||
|
#
|
||
|
proc EditGrid_edit {} {
|
||
|
global editgrid
|
||
|
set grid $editgrid(g)
|
||
|
|
||
|
set ent [$grid anchor get]
|
||
|
if [string comp $ent ""] {
|
||
|
$grid edit set [lindex $ent 0] [lindex $ent 1]
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# EditGrid_addRow --
|
||
|
#
|
||
|
# Adds a new row to the table.
|
||
|
#
|
||
|
proc EditGrid_addRow {} {
|
||
|
global editgrid
|
||
|
set grid $editgrid(g)
|
||
|
|
||
|
$grid edit apply
|
||
|
|
||
|
$grid move row $editgrid(result) $editgrid(result) 1
|
||
|
|
||
|
incr editgrid(bot)
|
||
|
set editgrid(result) [expr $editgrid(bot) + 2]
|
||
|
$grid set 0 $editgrid(bot) -text "City #$editgrid(bot)"
|
||
|
$grid set 2 $editgrid(bot) -text 0
|
||
|
$grid set 4 $editgrid(bot) -text 0.0
|
||
|
|
||
|
EditGrid_calPop
|
||
|
EditGrid_calIncome
|
||
|
}
|
||
|
|
||
|
# EditGrid_calPop --
|
||
|
#
|
||
|
# Calculates the total population
|
||
|
#
|
||
|
proc EditGrid_calPop {} {
|
||
|
global editgrid
|
||
|
set grid $editgrid(g)
|
||
|
|
||
|
set pop 0
|
||
|
|
||
|
for {set i $editgrid(top)} {$i <= $editgrid(bot)} {incr i} {
|
||
|
incr pop [$grid entrycget 2 $i -text]
|
||
|
}
|
||
|
|
||
|
$grid set 2 $editgrid(result) -text $pop
|
||
|
}
|
||
|
|
||
|
# EditGrid_calIncome --
|
||
|
#
|
||
|
# Calculates the average income.
|
||
|
#
|
||
|
proc EditGrid_calIncome {} {
|
||
|
global editgrid
|
||
|
set grid $editgrid(g)
|
||
|
|
||
|
set income 0
|
||
|
set total_pop 0
|
||
|
for {set i $editgrid(top)} {$i <= $editgrid(bot)} {incr i} {
|
||
|
set pop [$grid entrycget 2 $i -text]
|
||
|
set inc [$grid entrycget 4 $i -text]
|
||
|
set income [expr $income + $pop.0 * $inc]
|
||
|
incr total_pop $pop
|
||
|
}
|
||
|
|
||
|
$grid set 4 $editgrid(result) -text [expr $income/$total_pop]
|
||
|
|
||
|
}
|
||
|
|
||
|
# EditGrid_calculate --
|
||
|
#
|
||
|
# Recalculates both columns.
|
||
|
#
|
||
|
proc EditGrid_calculate {} {
|
||
|
global editgrid
|
||
|
set grid $editgrid(g)
|
||
|
|
||
|
$grid edit apply
|
||
|
EditGrid_calIncome
|
||
|
}
|
||
|
|
||
|
# EditGrid_editNotify --
|
||
|
#
|
||
|
# Returns true if an entry can be edited.
|
||
|
#
|
||
|
proc EditGrid_editNotify {x y} {
|
||
|
global editgrid
|
||
|
set grid $editgrid(g)
|
||
|
|
||
|
if {$x == 2 || $x == 4} {
|
||
|
if {$y >= $editgrid(top) && $y <= $editgrid(bot)} {
|
||
|
set editgrid(oldValue) [$grid entrycget $x $y -text]
|
||
|
return 1
|
||
|
}
|
||
|
}
|
||
|
return 0
|
||
|
}
|
||
|
|
||
|
# EditGrid_editDone --
|
||
|
#
|
||
|
# Gets called when the user is done editing an entry.
|
||
|
#
|
||
|
proc EditGrid_editDone {x y} {
|
||
|
global editgrid
|
||
|
set grid $editgrid(g)
|
||
|
|
||
|
if {$x == 2} {
|
||
|
set pop [$grid entrycget $x $y -text]
|
||
|
if [catch {
|
||
|
format %d $pop
|
||
|
}] {
|
||
|
$grid entryconfig $x $y -text $editgrid(oldValue)
|
||
|
tk_dialog .editGridWarn "" \
|
||
|
"$pop is not an valid integer. Try again" \
|
||
|
warning 0 Ok
|
||
|
} else {
|
||
|
$grid entryconfig 4 $editgrid(result) -text "-"
|
||
|
EditGrid_calPop
|
||
|
}
|
||
|
} else {
|
||
|
set income [$grid entrycget $x $y -text]
|
||
|
if [catch {
|
||
|
format %f $income
|
||
|
}] {
|
||
|
$grid entryconfig $x $y -text $editgrid(oldValue)
|
||
|
tk_dialog .editGridWarn "" \
|
||
|
"$income is not an valid floating number. Try again" \
|
||
|
warning 0 Ok
|
||
|
} else {
|
||
|
$grid entryconfig 4 $editgrid(result) -text "-"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# EditGrid_format --
|
||
|
#
|
||
|
# This command is called whenever the background of the grid
|
||
|
# needs to be reformatted. The x1, y1, x2, y2 sprcifies the four
|
||
|
# corners of the area that needs to be reformatted.
|
||
|
#
|
||
|
proc EditGrid_format {w area x1 y1 x2 y2} {
|
||
|
global editgrid
|
||
|
|
||
|
set bg(s-margin) gray65
|
||
|
set bg(x-margin) gray65
|
||
|
set bg(y-margin) gray65
|
||
|
set bg(main) gray20
|
||
|
|
||
|
case $area {
|
||
|
main {
|
||
|
foreach col {2 4} {
|
||
|
$w format border $col 1 $col $editgrid(bot) \
|
||
|
-relief flat -filled 1 -yon 1 -yoff 1\
|
||
|
-bd 0 -bg #b0b0f0 -selectbackground #a0b0ff
|
||
|
$w format border $col 2 $col $editgrid(bot) \
|
||
|
-relief flat -filled 1 -yon 1 -yoff 1\
|
||
|
-bd 0 -bg #80b080 -selectbackground #80b0ff
|
||
|
}
|
||
|
|
||
|
$w format grid $x1 $y1 $x2 $y2 \
|
||
|
-relief raised -bd 1 -bordercolor $bg($area) -filled 0 -bg red\
|
||
|
-xon 1 -yon 1 -xoff 0 -yoff 0 -anchor se
|
||
|
}
|
||
|
y-margin {
|
||
|
$w format border $x1 $y1 $x2 $y2 \
|
||
|
-fill 1 -relief raised -bd 1 -bg $bg($area) \
|
||
|
-selectbackground gray80
|
||
|
}
|
||
|
default {
|
||
|
$w format border $x1 $y1 $x2 $y2 \
|
||
|
-filled 1 \
|
||
|
-relief raised -bd 1 -bg $bg($area) \
|
||
|
-selectbackground gray80
|
||
|
}
|
||
|
}
|
||
|
|
||
|
# case $area {
|
||
|
# {main y-margin} {
|
||
|
# set y [expr $editgrid(bot) + 1]
|
||
|
# $w format border 0 $y 100 $y -bg black -filled 1 -bd 0
|
||
|
# }
|
||
|
# }
|
||
|
}
|
||
|
|
||
|
if {![info exists tix_demo_running]} {
|
||
|
wm withdraw .
|
||
|
set w .demo
|
||
|
toplevel $w; wm transient $w ""
|
||
|
RunSample $w
|
||
|
bind $w <Destroy> exit
|
||
|
}
|