@implementation DynamicListBox : Box { - init {} { $super init grid rowconfigure $frame 0 -weight 1 grid columnconfigure $frame 1 -weight 1 set column 0 foreach f {actions listbox} { grid [frame $frame.$f] \ -row 0 -column $column -sticky snew incr column } #- actions frame foreach action {add delete load} { pack [set ${action}Button [button $frame.actions.button$action \ -text $action -command "$self $action"]] \ -padx 4 -pady 2 -anchor n -fill x bind $frame.actions.button$action <Return> { %W invoke } eval bind $frame.actions.button$action [@removeBindingsOnDestroyEvent] } $loadButton configure -text "load from file" -command "$self loadFromFile" focus $addButton #- listbox set listbox [[ListBox newWithPath: $frame.listbox.listbox] show] set addEntry [entry $path.entry -width 15] bind $addEntry <Return> \ "place forget $addEntry ; \ focus $addButton ; \ $self add: \[%W get\]" eval bind $addEntry [@removeBindingsOnDestroyEvent] } - add {} { $addEntry delete 0 end place $addEntry -relx 0.0 -rely 0.0 -relwidth 1 \ -y -[winfo reqheight $addEntry] -in [$listbox path] focus -force $addEntry } - delete {} { $listbox removeIndex: [$listbox indexOfSelection] } - insert {} { $self add } - remove {} { $self delete } - loadFromFile {} { $listbox loadFromFile: [tk_getOpenFile] } - forwardInvocation: msg { if [$listbox respondsTo: [@selector $msg]] { return [eval $listbox $msg] } else { return [eval $super $msg] } } - dealloc {} { $listbox dealloc catch {destroy $toplevel $path} return [$super dealloc] } }