# -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*- # # $Id: SListBox.tcl,v 1.5 2004/03/28 02:44:57 hobbs Exp $ # # SListBox.tcl -- # # This file implements Scrolled Listbox widgets # # Copyright (c) 1993-1999 Ioi Kim Lam. # Copyright (c) 2000-2001 Tix Project Group. # # See the file "license.terms" for information on usage and redistribution # of this file, and for a DISCLAIMER OF ALL WARRANTIES. # # ToDo: # -anchor (none) # tixWidgetClass tixScrolledListBox { -classname TixScrolledListBox -superclass tixScrolledWidget -method { } -flag { -anchor -browsecmd -command -state } -static { -anchor } -configspec { {-anchor anchor Anchor w} {-browsecmd browseCmd BrowseCmd ""} {-command command Command ""} {-state state State normal} {-takefocus takeFocus TakeFocus 1 tixVerifyBoolean} } -default { {.scrollbar auto} {*borderWidth 1} {*listbox.highlightBackground #d9d9d9} {*listbox.relief sunken} {*listbox.background #c3c3c3} {*listbox.takeFocus 1} {*Scrollbar.takeFocus 0} } } proc tixScrolledListBox:InitWidgetRec {w} { upvar #0 $w data tixChainMethod $w InitWidgetRec set data(x-first) 0 set data(x-last) 1 set data(y-first) 0 set data(y-last) 1 } proc tixScrolledListBox:ConstructWidget {w} { upvar #0 $w data tixChainMethod $w ConstructWidget set data(w:listbox) \ [listbox $w.listbox] set data(w:hsb) \ [scrollbar $w.hsb -orient horizontal] set data(w:vsb) \ [scrollbar $w.vsb -orient vertical ] set data(pw:client) $data(w:listbox) } proc tixScrolledListBox:SetBindings {w} { upvar #0 $w data tixChainMethod $w SetBindings $data(w:listbox) config \ -xscrollcommand "tixScrolledListBox:XView $w"\ -yscrollcommand "tixScrolledListBox:YView $w" $data(w:hsb) config -command "$data(w:listbox) xview" $data(w:vsb) config -command "$data(w:listbox) yview" bind $w "+tixScrolledListBox:Configure $w" bind $w "focus $data(w:listbox)" bindtags $data(w:listbox) \ "$data(w:listbox) TixListboxState Listbox TixListbox [winfo toplevel $data(w:listbox)] all" tixSetMegaWidget $data(w:listbox) $w } proc tixScrolledListBoxBind {} { tixBind TixListboxState <1> { if {[set [tixGetMegaWidget %W](-state)] eq "disabled"} { break } } tixBind TixListbox <1> { if {[string is true -strict [%W cget -takefocus]]} { focus %W } tixScrolledListBox:Browse [tixGetMegaWidget %W] } tixBind TixListboxState { if {[set [tixGetMegaWidget %W](-state)] eq "disabled"} { break } } tixBind TixListbox { tixScrolledListBox:Browse [tixGetMegaWidget %W] } tixBind TixListboxState { if {[set [tixGetMegaWidget %W](-state)] eq "disabled"} { break } } tixBind TixListbox { tixScrolledListBox:KeyBrowse [tixGetMegaWidget %W] } tixBind TixListboxState { if {[set [tixGetMegaWidget %W](-state)] eq "disabled"} { break } } tixBind TixListbox { tixScrolledListBox:KeyBrowse [tixGetMegaWidget %W] } tixBind TixListboxState { if {[set [tixGetMegaWidget %W](-state)] eq "disabled"} { break } } tixBind TixListbox { tixScrolledListBox:KeyInvoke [tixGetMegaWidget %W] } tixBind TixListboxState { if {[set [tixGetMegaWidget %W](-state)] eq "disabled"} { break } } tixBind TixListbox { tixScrolledListBox:Invoke [tixGetMegaWidget %W] } tixBind TixListboxState { if {[set [tixGetMegaWidget %W](-state)] eq "disabled"} { break } } tixBind TixListbox { tixScrolledListBox:Browse [tixGetMegaWidget %W] } } proc tixScrolledListBox:Browse {w} { upvar #0 $w data if {$data(-browsecmd) != ""} { set bind(specs) {%V} set bind(%V) [$data(w:listbox) get \ [$data(w:listbox) nearest [tixEvent flag y]]] tixEvalCmdBinding $w $data(-browsecmd) bind } } proc tixScrolledListBox:KeyBrowse {w} { upvar #0 $w data if {$data(-browsecmd) != ""} { set bind(specs) {%V} set bind(%V) [$data(w:listbox) get active] tixEvalCmdBinding $w $data(-browsecmd) bind } } # tixScrolledListBox:Invoke -- # # The user has invoked the listbox by pressing either the # key or double-clicking. Call the user-supplied -command function. # # For both -browsecmd and -command, it is the responsibility of the # user-supplied function to determine the current selection of the listbox # proc tixScrolledListBox:Invoke {w} { upvar #0 $w data if {$data(-command) != ""} { set bind(specs) {%V} set bind(%V) [$data(w:listbox) get \ [$data(w:listbox) nearest [tixEvent flag y]]] tixEvalCmdBinding $w $data(-command) bind } } proc tixScrolledListBox:KeyInvoke {w} { upvar #0 $w data if {$data(-command) != ""} { set bind(specs) {%V} set bind(%V) [$data(w:listbox) get active] tixEvalCmdBinding $w $data(-command) bind } } #---------------------------------------------------------------------- # # option configs #---------------------------------------------------------------------- proc tixScrolledListBox:config-takefocus {w value} { upvar #0 $w data $data(w:listbox) config -takefocus $value } #---------------------------------------------------------------------- # # Widget commands #---------------------------------------------------------------------- #---------------------------------------------------------------------- # # Private Methods #---------------------------------------------------------------------- proc tixScrolledListBox:XView {w first last} { upvar #0 $w data set data(x-first) $first set data(x-last) $last $data(w:hsb) set $first $last tixWidgetDoWhenIdle tixScrolledWidget:Configure $w } proc tixScrolledListBox:YView {w first last} { upvar #0 $w data set data(y-first) $first set data(y-last) $last $data(w:vsb) set $first $last tixWidgetDoWhenIdle tixScrolledWidget:Configure $w # Somehow an update here must be used to advoid osscilation # update idletasks } # #---------------------------------------------------------------------- # virtual functions to query the client window's scroll requirement #---------------------------------------------------------------------- proc tixScrolledListBox:GeometryInfo {w mW mH} { upvar #0 $w data return [list \ [list $data(x-first) $data(x-last)]\ [list $data(y-first) $data(y-last)]] } proc tixScrolledListBox:Configure {w} { upvar #0 $w data tixWidgetDoWhenIdle tixScrolledListBox:TrickScrollbar $w if {$data(-anchor) eq "e"} { $data(w:listbox) xview 100000 } } # This procedure is necessary because listbox does not call x,y scroll command # when its size is changed # proc tixScrolledListBox:TrickScrollbar {w} { upvar #0 $w data set inc [$data(w:listbox) select include 0] $data(w:listbox) select set 0 if {!$inc} { $data(w:listbox) select clear 0 } }