⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listbox.tcl

📁 Linux下的MSN聊天程序源码
💻 TCL
📖 第 1 页 / 共 4 页
字号:
# ----------------------------------------------------------------------------#  listbox.tcl#  This file is part of Unifix BWidget Toolkit#  $Id: listbox.tcl 3417 2004-12-03 00:31:24Z tjikkun $# ----------------------------------------------------------------------------#  Index of commands:#     - ListBox::create#     - ListBox::configure#     - ListBox::cget#     - ListBox::insert#     - ListBox::itemconfigure#     - ListBox::itemcget#     - ListBox::bindText#     - ListBox::bindImage#     - ListBox::delete#     - ListBox::move#     - ListBox::reorder#     - ListBox::selection#     - ListBox::exists#     - ListBox::index#     - ListBox::item - deprecated#     - ListBox::items#     - ListBox::see#     - ListBox::edit#     - ListBox::xview#     - ListBox::yview#     - ListBox::_update_edit_size#     - ListBox::_destroy#     - ListBox::_see#     - ListBox::_update_scrollregion#     - ListBox::_draw_item#     - ListBox::_redraw_items#     - ListBox::_redraw_selection#     - ListBox::_redraw_listbox#     - ListBox::_redraw_idle#     - ListBox::_resize#     - ListBox::_init_drag_cmd#     - ListBox::_drop_cmd#     - ListBox::_over_cmd#     - ListBox::_auto_scroll#     - ListBox::_scroll# ----------------------------------------------------------------------------namespace eval ListBox {    Widget::define ListBox listbox DragSite DropSite DynamicHelp    namespace eval Item {        Widget::declare ListBox::Item {            {-indent     Int        0   0 "%d >= 0"}            {-text       String     ""  0}            {-font       String     ""  0}            {-foreground String     ""  0}            {-image      TkResource ""  0 label}            {-window     String     ""  0}            {-data       String     ""  0}            {-fill       Synonym    -foreground}            {-fg         Synonym    -foreground}        }    }    DynamicHelp::include ListBox::Item balloon    Widget::tkinclude ListBox canvas .c \        remove {            -insertwidth -insertbackground -insertborderwidth -insertofftime            -insertontime -selectborderwidth -closeenough -confine -scrollregion            -xscrollincrement -yscrollincrement -width -height        } \        initialize {            -relief sunken -borderwidth 2 -takefocus 1            -highlightthickness 1 -width 200        }    DragSite::include ListBox "LISTBOX_ITEM" 1    DropSite::include ListBox {        LISTBOX_ITEM {copy {} move {}}    }    Widget::declare ListBox {        {-deltax           Int 10 0 "%d >= 0"}        {-deltay           Int 15 0 "%d >= 0"}        {-padx             Int 20 0 "%d >= 0"}        {-foreground       TkResource "" 0 listbox}        {-background       TkResource "" 0 listbox}        {-selectbackground TkResource "" 0 listbox}        {-selectforeground TkResource "" 0 listbox}        {-font             TkResource "" 0 listbox}        {-width            TkResource "" 0 listbox}        {-height           TkResource "" 0 listbox}        {-redraw           Boolean 1  0}        {-multicolumn      Boolean 0  0}        {-dropovermode     Flag    "wpi" 0 "wpi"}	{-selectmode       Enum none 1 {none single multiple}}        {-fg               Synonym -foreground}        {-bg               Synonym -background}        {-dropcmd          String  "ListBox::_drag_and_drop" 0}        {-autofocus        Boolean  1  1}        {-selectfill       Boolean  0  1}    }    Widget::addmap ListBox "" .c {-deltay -yscrollincrement}    bind ListBox <Destroy>   [list ListBox::_destroy %W]    bind ListBox <Configure> [list ListBox::_resize  %W]    bind ListBoxFocus <1>    [list focus %W]    bind ListBox <Key-Up>    [list ListBox::_keyboard_navigation %W -1]    bind ListBox <Key-Down>  [list ListBox::_keyboard_navigation %W  1]    variable _edit}# ----------------------------------------------------------------------------#  Command ListBox::create# ----------------------------------------------------------------------------proc ListBox::create { path args } {    Widget::init ListBox $path $args    variable $path    upvar 0  $path data    frame $path -class ListBox -bd 0 -highlightthickness 0 -relief flat    # For 8.4+ we don't want to inherit the padding    catch {$path configure -padx 0 -pady 0}    # widget informations    set data(nrows) -1    # items informations    set data(items)    {}    set data(selitems) {}    # update informations    set data(upd,level)   0    set data(upd,afterid) ""    set data(upd,level)   0    set data(upd,delete)  {}    # drag and drop informations    set data(dnd,scroll)   ""    set data(dnd,afterid)  ""    set data(dnd,item)     ""    eval [list canvas $path.c] [Widget::subcget $path .c] \	 [list -xscrollincrement 8 -highlightthickness 1]    pack $path.c -expand yes -fill both    DragSite::setdrag $path $path.c ListBox::_init_drag_cmd \	    [Widget::cget $path -dragendcmd] 1    DropSite::setdrop $path $path.c ListBox::_over_cmd ListBox::_drop_cmd 1    Widget::create ListBox $path    set w [Widget::cget $path -width]    set h [Widget::cget $path -height]    set dy [Widget::cget $path -deltay]    $path.c configure -width [expr {$w*8}] -height [expr {$h*$dy}]    ## Let any click within the canvas focus on the canvas so that    ## MouseWheel scroll events will be properly handled by the    ## canvas.    if {[Widget::cget $path -autofocus]} {	bindtags $path.c [concat [bindtags $path.c] ListBoxFocus]	BWidget::bindMouseWheel $path.c    }    switch -exact -- [Widget::getoption $path -selectmode] {	single {	    $path bindText  <Button-1> [list ListBox::_mouse_select $path set]	    $path bindImage <Button-1> [list ListBox::_mouse_select $path set]	}	multiple {	    set cmd ListBox::_multiple_select	    $path bindText <Button-1>          [list $cmd $path n %x %y]	    $path bindText <Shift-Button-1>    [list $cmd $path s %x %y]	    $path bindText <Control-Button-1>  [list $cmd $path c %x %y]	    $path bindImage <Button-1>         [list $cmd $path n %x %y]	    $path bindImage <Shift-Button-1>   [list $cmd $path s %x %y]	    $path bindImage <Control-Button-1> [list $cmd $path c %x %y]	}    }    return $path}# ----------------------------------------------------------------------------#  Command ListBox::configure# ----------------------------------------------------------------------------proc ListBox::configure { path args } {    set res [Widget::configure $path $args]    set ch1 [expr {[Widget::hasChanged $path -deltay dy]  |                   [Widget::hasChanged $path -padx val]   |                   [Widget::hasChanged $path -multicolumn val]}]    set ch2 [expr {[Widget::hasChanged $path -selectbackground val] |                   [Widget::hasChanged $path -selectforeground val]}]    set redraw 0    if { [Widget::hasChanged $path -height h] } {        $path.c configure -height [expr {$h*$dy}]        set redraw 1    }    if { [Widget::hasChanged $path -width w] } {        $path.c configure -width [expr {$w*8}]        set redraw 1    }    if { [Widget::hasChanged $path -background bg] } {        $path.c itemconfigure box -fill $bg    }    if { !$redraw } {        if { $ch1 } {            _redraw_idle $path 2        } elseif { $ch2 } {            _redraw_idle $path 1        }    }    if { [Widget::hasChanged $path -redraw bool] && $bool } {        variable $path        upvar 0  $path data        set lvl $data(upd,level)        set data(upd,level) 0        _redraw_idle $path $lvl    }    set force [Widget::hasChanged $path -dragendcmd dragend]    DragSite::setdrag $path $path.c ListBox::_init_drag_cmd $dragend $force    DropSite::setdrop $path $path.c ListBox::_over_cmd ListBox::_drop_cmd    return $res}# ----------------------------------------------------------------------------#  Command ListBox::cget# ----------------------------------------------------------------------------proc ListBox::cget { path option } {    return [Widget::cget $path $option]}# ----------------------------------------------------------------------------#  Command ListBox::insert# ----------------------------------------------------------------------------proc ListBox::insert { path index item args } {    variable $path    upvar 0  $path data    set item [Widget::nextIndex $path $item]    if { [lsearch -exact $data(items) $item] != -1 } {        return -code error "item \"$item\" already exists"    }    Widget::init ListBox::Item $path.$item $args    set data(items) [linsert $data(items) $index $item]    set data(upd,create,$item) $item    _redraw_idle $path 2    return $item}# Bastien Chevreux (bach@mwgdna.com)# The multipleinsert command performs inserts several items at once into#  the list. It is faster than calling insert multiple times as it uses the#  Widget::copyinit command for initializing all items after the 1st. The #  speedup factor is between 2 and 3 for typical usage, but could be higher#  for inserts with many options.## Syntax: path and index are as in the insert command#	args is a list of even numbered elements where the 1st of each pair#	corresponds to the item of 'insert' and the second to args of 'insert'.# ----------------------------------------------------------------------------#  Command ListBox::multipleinsert# ----------------------------------------------------------------------------proc ListBox::multipleinsert { path index args } {    variable $path    upvar 0  $path data    # If we got only one list as arg, take the first element as args    # This enables callers to use     #	$list multipleinsert index $thelist    # instead of    #	eval $list multipleinsert index $thelist    if {[llength $args] == 1} {	set args [lindex $args 0]    }    set count 0    foreach {item iargs} $args {	if { [lsearch -exact $data(items) $item] != -1 } {	    return -code error "item \"$item\" already exists"	}		if {$count==0} {	    Widget::init ListBox::Item $path.$item $iargs	    set firstpath $path.$item	} else {	    Widget::copyinit ListBox::Item $firstpath $path.$item $iargs	}	set data(items) [linsert $data(items) $index $item]	set data(upd,create,$item) $item	incr count    }    _redraw_idle $path 2    return $item}# ----------------------------------------------------------------------------#  Command ListBox::itemconfigure# ----------------------------------------------------------------------------proc ListBox::itemconfigure { path item args } {    variable $path    upvar 0  $path data    if { [lsearch -exact $data(items) $item] == -1 } {        return -code error "item \"$item\" does not exist"    }    set oldind [Widget::getoption $path.$item -indent]    set res   [Widget::configure $path.$item $args]    set chind [Widget::hasChanged $path.$item -indent indent]    set chw   [Widget::hasChanged $path.$item -window win]    set chi   [Widget::hasChanged $path.$item -image  img]    set cht   [Widget::hasChanged $path.$item -text txt]    set chf   [Widget::hasChanged $path.$item -font fnt]    set chfg  [Widget::hasChanged $path.$item -foreground fg]    set idn   [$path.c find withtag n:$item]    _set_help $path $item    if { $idn == "" } {        # item is not drawn yet        _redraw_idle $path 2        return $res    }    set oldb   [$path.c bbox $idn]    set coords [$path.c coords $idn]    set padx   [Widget::getoption $path -padx]    set x0     [expr {[lindex $coords 0]-$padx-$oldind+$indent}]    set y0     [lindex $coords 1]    if { $chw || $chi } {        # -window or -image modified        set idi  [$path.c find withtag i:$item]        set type [lindex [$path.c gettags $idi] 0]        if { [string length $win] } {            if { [string equal $type "win"] } {                $path.c itemconfigure $idi -window $win            } else {                $path.c delete $idi                $path.c create window $x0 $y0 -window $win -anchor w \		    -tags [list win i:$item]            }        } elseif { [string length $img] } {            if { [string equal $type "img"] } {                $path.c itemconfigure $idi -image $img            } else {                $path.c delete $idi                $path.c create image $x0 $y0 -image $img -anchor w \		    -tags [list img i:$item]            }        } else {            $path.c delete $idi        }    }    if { $cht || $chf || $chfg } {        # -text or -font modified, or -foreground modified        set fnt [_getoption $path $item -font]        set fg  [_getoption $path $item -foreground]        $path.c itemconfigure $idn -text $txt -font $fnt -fill $fg        _redraw_idle $path 1    }    if { $chind } {        # -indent modified        $path.c coords $idn [expr {$x0+$padx}] $y0        $path.c coords i:$item $x0 $y0        _redraw_idle $path 1    }    if { [Widget::getoption $path -multicolumn] && ($cht || $chf || $chind) } {        set bbox [$path.c bbox $idn]        if { [lindex $bbox 2] > [lindex $oldb 2] } {            _redraw_idle $path 2        }    }    return $res}# ----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -