# -*-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 exit }