# 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.

# This program demonstrates the use of the CObjView (Canvas Object
# View) class.
#


proc RunSample {w} {
    label $w.lab  -justify left -text \
"Click on the buttons to add or delete canvas
objects randomally. Notice the scrollbars automatically
adjust to include all objects in the scroll-region."

    pack $w.lab -anchor c -padx 10 -pady 6
    tixCObjView $w.c
    pack $w.c -expand yes -fill both -padx 4 -pady 2
    button $w.add -command "CVDemo_Add $w.c"    -text Add    -width 6
    button $w.del -command "CVDemo_Delete $w.c" -text Delete -width 6
    pack $w.add $w.del -side left -padx 20 -pady 10 -anchor c -expand yes
}

set cvdemo_counter 0
proc CVDemo_Add {cov} {
    global cvdemo_counter

    # Generate four pseudo random numbers (x,y,w,h) to define the coordinates
    # of a rectangle object in the canvas.
    #
    set colors {red green blue white black gray yellow}

    set px [expr [lindex [time update] 0] + $cvdemo_counter]
    set py [expr [lindex [time update] 0] + $cvdemo_counter]
    set pw [expr [lindex [time update] 0] + $cvdemo_counter]
    set ph [expr [lindex [time update] 0] + $cvdemo_counter]
    set pc [expr [lindex [time update] 0] + $cvdemo_counter]

    set x [expr (20 - ($px % 37))   * 10]
    set y [expr (10 - ($py % 23))  * 10]
    set w [expr ($pw % 17)  * 10]
    set h [expr ($ph % 17)  * 10]

    # Create the canvas object
    #
    $cov subwidget canvas create rectangle $x $y [expr $x+$w] [expr $y+$h] \
	-fill [lindex $colors [expr $pc % [llength $colors]]]

    # Call the adjustscrollregion command to set the scroll bars so that all
    # objects are included in the scroll-region
    #
    $cov adjustscrollregion

    # This number acts as the seed for the next round of randomization.
    #
    set cvdemo_counter [expr ($px % 37)]
}

proc CVDemo_Delete {cov} {
    set px [lindex [time update] 0]
    set w [$cov subwidget canvas]
    set items [$w find withtag all]

    if [string compare $items ""] {
	# There are items in the canvas, randomally delete one of them
	# and re-adjust the scroll-region
	#
	set toDelete [expr $px % [llength $items]]
	$w delete [lindex $items $toDelete]

	$cov adjustscrollregion
    }
}

if {![info exists tix_demo_running]} {
    wm withdraw .
    set w .demo
    toplevel $w
    RunSample $w
    bind $w <Destroy> exit
}
