home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / selectionbox.itk < prev    next >
Text File  |  2003-09-01  |  19KB  |  561 lines

  1. #
  2. # Selectionbox
  3. # ----------------------------------------------------------------------
  4. # Implements a selection box composed of a scrolled list of items and
  5. # a selection entry field.  The user may choose any of the items displayed
  6. # in the scrolled list of alternatives and the selection field will be
  7. # filled with the choice.  The user is also free to enter a new value in
  8. # the selection entry field.  Both the list and entry areas have labels.
  9. # A child site is also provided in which the user may create other widgets
  10. # to be used in conjunction with the selection box.
  11. # ----------------------------------------------------------------------
  12. #  AUTHOR: Mark L. Ulferts              EMAIL: mulferts@austin.dsccc.com
  13. #
  14. #  @(#) $Id: selectionbox.itk,v 1.2 2001/08/07 19:56:48 smithc Exp $
  15. # ----------------------------------------------------------------------
  16. #            Copyright (c) 1995 DSC Technologies Corporation
  17. # ======================================================================
  18. # Permission to use, copy, modify, distribute and license this software 
  19. # and its documentation for any purpose, and without fee or written 
  20. # agreement with DSC, is hereby granted, provided that the above copyright 
  21. # notice appears in all copies and that both the copyright notice and 
  22. # warranty disclaimer below appear in supporting documentation, and that 
  23. # the names of DSC Technologies Corporation or DSC Communications 
  24. # Corporation not be used in advertising or publicity pertaining to the 
  25. # software without specific, written prior permission.
  26. # DSC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 
  27. # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, AND NON-
  28. # INFRINGEMENT. THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, AND THE
  29. # AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, 
  30. # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. IN NO EVENT SHALL 
  31. # DSC BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 
  32. # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 
  33. # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTUOUS ACTION,
  34. # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 
  35. # SOFTWARE.
  36. # ======================================================================
  37.  
  38. #
  39. # Usual options.
  40. #
  41. itk::usual Selectionbox {
  42.     keep -activebackground -activerelief -background -borderwidth -cursor \
  43.      -elementborderwidth -foreground -highlightcolor -highlightthickness \
  44.      -insertbackground -insertborderwidth -insertofftime -insertontime \
  45.      -insertwidth -jump -labelfont -selectbackground -selectborderwidth \
  46.      -selectforeground -textbackground -textfont -troughcolor
  47. }
  48.  
  49. # ------------------------------------------------------------------
  50. #                            SELECTIONBOX
  51. # ------------------------------------------------------------------
  52. itcl::class iwidgets::Selectionbox {
  53.     inherit itk::Widget
  54.  
  55.     constructor {args} {}
  56.     destructor {}
  57.  
  58.     itk_option define -childsitepos childSitePos Position center
  59.     itk_option define -margin margin Margin 7
  60.     itk_option define -itemson itemsOn ItemsOn true
  61.     itk_option define -selectionon selectionOn SelectionOn true
  62.     itk_option define -width width Width 260
  63.     itk_option define -height height Height 320
  64.  
  65.     public method childsite {}
  66.     public method get {}
  67.     public method curselection {}
  68.     public method clear {component}
  69.     public method insert {component index args}
  70.     public method delete {first {last {}}}
  71.     public method size {}
  72.     public method scan {option args}
  73.     public method nearest {y}
  74.     public method index {index}
  75.     public method selection {option args}
  76.     public method selectitem {}
  77.  
  78.     private method _packComponents {{when later}}
  79.  
  80.     private variable _repacking {}     ;# non-null => _packComponents pending
  81. }
  82.  
  83. #
  84. # Provide a lowercased access method for the Selectionbox class.
  85. proc ::iwidgets::selectionbox {pathName args} {
  86.     uplevel ::iwidgets::Selectionbox $pathName $args
  87. }
  88.  
  89. #
  90. # Use option database to override default resources of base classes.
  91. #
  92. option add *Selectionbox.itemsLabel Items widgetDefault
  93. option add *Selectionbox.selectionLabel Selection widgetDefault
  94. option add *Selectionbox.width 260 widgetDefault
  95. option add *Selectionbox.height 320 widgetDefault
  96.  
  97. # ------------------------------------------------------------------
  98. #                        CONSTRUCTOR
  99. # ------------------------------------------------------------------
  100. itcl::body iwidgets::Selectionbox::constructor {args} {
  101.     #
  102.     # Set the borderwidth to zero and add width and height options
  103.     # back to the hull.
  104.     #
  105.     component hull configure -borderwidth 0
  106.     itk_option add hull.width hull.height
  107.     
  108.     #
  109.     # Create the child site widget.
  110.     #
  111.     itk_component add -protected sbchildsite {
  112.     frame $itk_interior.sbchildsite
  113.     } 
  114.     
  115.     #
  116.     # Create the items list.
  117.     #
  118.     itk_component add items {
  119.     iwidgets::Scrolledlistbox $itk_interior.items -selectmode single \
  120.         -visibleitems 20x10 -labelpos nw -vscrollmode static \
  121.         -hscrollmode none 
  122.     } {
  123.     usual
  124.     keep -dblclickcommand -exportselection 
  125.     
  126.     rename -labeltext -itemslabel itemsLabel Text
  127.     rename -selectioncommand -itemscommand itemsCommand Command
  128.     }
  129.     configure -itemscommand [itcl::code $this selectitem]
  130.     
  131.     #
  132.     # Create the selection entry.
  133.     #
  134.     itk_component add selection {
  135.     iwidgets::Entryfield $itk_interior.selection -labelpos nw
  136.     } {
  137.     usual
  138.  
  139.     keep -exportselection 
  140.     
  141.     rename -labeltext -selectionlabel selectionLabel Text
  142.     rename -command -selectioncommand selectionCommand Command
  143.     }
  144.     
  145.     #
  146.     # Set the interior to the childsite for derived classes.
  147.     #
  148.     set itk_interior $itk_component(sbchildsite)
  149.  
  150.     #
  151.     # Initialize the widget based on the command line options.
  152.     #
  153.     eval itk_initialize $args
  154.  
  155.     # 
  156.     # When idle, pack the components.
  157.     #
  158.     _packComponents
  159. }   
  160.  
  161. # ------------------------------------------------------------------
  162. #                           DESTRUCTOR
  163. # ------------------------------------------------------------------
  164. itcl::body iwidgets::Selectionbox::destructor {} {
  165.     if {$_repacking != ""} {after cancel $_repacking}
  166. }
  167.  
  168. # ------------------------------------------------------------------
  169. #                             OPTIONS
  170. # ------------------------------------------------------------------
  171.  
  172. # ------------------------------------------------------------------
  173. # OPTION: -childsitepos
  174. #
  175. # Specifies the position of the child site in the selection box.
  176. # ------------------------------------------------------------------
  177. itcl::configbody iwidgets::Selectionbox::childsitepos {
  178.     _packComponents 
  179. }
  180.  
  181. # ------------------------------------------------------------------
  182. # OPTION: -margin
  183. #
  184. # Specifies distance between the items list and selection entry.
  185. # ------------------------------------------------------------------
  186. itcl::configbody iwidgets::Selectionbox::margin {
  187.     _packComponents 
  188. }
  189.  
  190. # ------------------------------------------------------------------
  191. # OPTION: -itemson
  192. #
  193. # Specifies whether or not to display the items list.
  194. # ------------------------------------------------------------------
  195. itcl::configbody iwidgets::Selectionbox::itemson {
  196.     _packComponents 
  197. }
  198.  
  199. # ------------------------------------------------------------------
  200. # OPTION: -selectionon
  201. #
  202. # Specifies whether or not to display the selection entry widget.
  203. # ------------------------------------------------------------------
  204. itcl::configbody iwidgets::Selectionbox::selectionon {
  205.     _packComponents
  206. }
  207.  
  208. # ------------------------------------------------------------------
  209. # OPTION: -width
  210. #
  211. # Specifies the width of the hull.  The value may be specified in 
  212. # any of the forms acceptable to Tk_GetPixels.  A value of zero 
  213. # causes the width to be adjusted to the required value based on 
  214. # the size requests of the components.  Otherwise, the width is 
  215. # fixed.
  216. # ------------------------------------------------------------------
  217. itcl::configbody iwidgets::Selectionbox::width {
  218.     #
  219.     # The width option was added to the hull in the constructor.
  220.     # So, any width value given is passed automatically to the
  221.     # hull.  All we have to do is play with the propagation.
  222.     #
  223.     if {$itk_option(-width) != 0} {
  224.     set propagate 0
  225.     } else {
  226.     set propagate 1
  227.     }
  228.  
  229.     #
  230.     # Due to a bug in the tk4.2 grid, we have to check the 
  231.     # propagation before setting it.  Setting it to the same
  232.     # value it already is will cause it to toggle.
  233.     #
  234.     if {[grid propagate $itk_component(hull)] != $propagate} {
  235.     grid propagate $itk_component(hull) $propagate
  236.     }
  237. }
  238.  
  239. # ------------------------------------------------------------------
  240. # OPTION: -height
  241. #
  242. # Specifies the height of the hull.  The value may be specified in 
  243. # any of the forms acceptable to Tk_GetPixels.  A value of zero 
  244. # causes the height to be adjusted to the required value based on 
  245. # the size requests of the components. Otherwise, the height is 
  246. # fixed.
  247. # ------------------------------------------------------------------
  248. itcl::configbody iwidgets::Selectionbox::height {
  249.     #
  250.     # The height option was added to the hull in the constructor.
  251.     # So, any height value given is passed automatically to the
  252.     # hull.  All we have to do is play with the propagation.
  253.     #
  254.     if {$itk_option(-height) != 0} {
  255.     set propagate 0
  256.     } else {
  257.     set propagate 1
  258.     }
  259.  
  260.     #
  261.     # Due to a bug in the tk4.2 grid, we have to check the 
  262.     # propagation before setting it.  Setting it to the same
  263.     # value it already is will cause it to toggle.
  264.     #
  265.     if {[grid propagate $itk_component(hull)] != $propagate} {
  266.     grid propagate $itk_component(hull) $propagate
  267.     }
  268. }
  269.  
  270. # ------------------------------------------------------------------
  271. #                            METHODS
  272. # ------------------------------------------------------------------
  273.  
  274. # ------------------------------------------------------------------
  275. # METHOD: childsite
  276. #
  277. # Returns the path name of the child site widget.
  278. # ------------------------------------------------------------------
  279. itcl::body iwidgets::Selectionbox::childsite {} {
  280.     return $itk_component(sbchildsite)
  281. }
  282.  
  283. # ------------------------------------------------------------------
  284. # METHOD: get 
  285. #
  286. # Returns the current selection.
  287. # ------------------------------------------------------------------
  288. itcl::body iwidgets::Selectionbox::get {} {
  289.     return [$itk_component(selection) get]
  290. }
  291.  
  292. # ------------------------------------------------------------------
  293. # METHOD: curselection
  294. #
  295. # Returns the current selection index.
  296. # ------------------------------------------------------------------
  297. itcl::body iwidgets::Selectionbox::curselection {} {
  298.     return [$itk_component(items) curselection]
  299. }
  300.  
  301. # ------------------------------------------------------------------
  302. # METHOD: clear component
  303. #
  304. # Delete the contents of either the selection entry widget or items
  305. # list.
  306. # ------------------------------------------------------------------
  307. itcl::body iwidgets::Selectionbox::clear {component} {
  308.     switch $component {
  309.     selection {
  310.         $itk_component(selection) clear
  311.     }
  312.     
  313.     items {
  314.         delete 0 end
  315.     }
  316.     
  317.     default {
  318.         error "bad clear argument \"$component\": should be\
  319.            selection or items"
  320.     }
  321.     }
  322. }
  323.  
  324. # ------------------------------------------------------------------
  325. # METHOD: insert component index args
  326. #
  327. # Insert element(s) into either the selection or items list widget.
  328. # ------------------------------------------------------------------
  329. itcl::body iwidgets::Selectionbox::insert {component index args} {
  330.     switch $component {
  331.     selection {
  332.         eval $itk_component(selection) insert $index $args
  333.     }
  334.     
  335.     items {
  336.         eval $itk_component(items) insert $index $args
  337.     }
  338.     
  339.     default {
  340.         error "bad insert argument \"$component\": should be\
  341.            selection or items"
  342.     }
  343.     }
  344. }
  345.  
  346. # ------------------------------------------------------------------
  347. # METHOD: delete first ?last?
  348. #
  349. # Delete one or more elements from the items list box.  The default 
  350. # is to delete by indexed range. If an item is to be removed by name, 
  351. # it must be preceeded by the keyword "item". Only index numbers can 
  352. # be used to delete a range of items. 
  353. # ------------------------------------------------------------------
  354. itcl::body iwidgets::Selectionbox::delete {first {last {}}} {
  355.     set first [index $first]
  356.     
  357.     if {$last != {}} {
  358.     set last [index $last]
  359.     } else {
  360.     set last $first
  361.     }
  362.     
  363.     if {$first <= $last} {
  364.     eval $itk_component(items) delete $first $last
  365.     } else {
  366.     error "first index must not be greater than second"
  367.     }
  368. }
  369.  
  370. # ------------------------------------------------------------------
  371. # METHOD: size 
  372. #
  373. # Returns a decimal string indicating the total number of elements 
  374. # in the items list.
  375. # ------------------------------------------------------------------
  376. itcl::body iwidgets::Selectionbox::size {} {
  377.     return [$itk_component(items) size]
  378. }
  379.  
  380. # ------------------------------------------------------------------
  381. # METHOD: scan option args 
  382. #
  383. # Implements scanning on items list.
  384. # ------------------------------------------------------------------
  385. itcl::body iwidgets::Selectionbox::scan {option args} {
  386.     eval $itk_component(items) scan $option $args
  387. }
  388.  
  389. # ------------------------------------------------------------------
  390. # METHOD: nearest y
  391. #
  392. # Returns the index to the nearest listbox item given a y coordinate.
  393. # ------------------------------------------------------------------
  394. itcl::body iwidgets::Selectionbox::nearest {y} {
  395.     return [$itk_component(items) nearest $y]
  396. }
  397.  
  398. # ------------------------------------------------------------------
  399. # METHOD: index index
  400. #
  401. # Returns the decimal string giving the integer index corresponding 
  402. # to index.
  403. # ------------------------------------------------------------------
  404. itcl::body iwidgets::Selectionbox::index {index} {
  405.     return [$itk_component(items) index $index]
  406. }
  407.  
  408. # ------------------------------------------------------------------
  409. # METHOD: selection option args
  410. #
  411. # Adjusts the selection within the items list.
  412. # ------------------------------------------------------------------
  413. itcl::body iwidgets::Selectionbox::selection {option args} {
  414.     eval $itk_component(items) selection $option $args
  415.  
  416.     selectitem
  417. }
  418.  
  419. # ------------------------------------------------------------------
  420. # METHOD: selectitem
  421. #
  422. # Replace the selection entry field contents with the currently 
  423. # selected items value.
  424. # ------------------------------------------------------------------
  425. itcl::body iwidgets::Selectionbox::selectitem {} {
  426.     $itk_component(selection) clear
  427.     set numSelected [$itk_component(items) selecteditemcount]
  428.  
  429.     if {$numSelected == 1} {
  430.     $itk_component(selection) insert end \
  431.         [$itk_component(items) getcurselection]
  432.     } elseif {$numSelected > 1} {
  433.     $itk_component(selection) insert end \
  434.         [lindex [$itk_component(items) getcurselection] 0]
  435.     }
  436.  
  437.     $itk_component(selection) icursor end
  438. }
  439.  
  440. # ------------------------------------------------------------------
  441. # PRIVATE METHOD: _packComponents ?when?
  442. #
  443. # Pack the selection, items, and child site widgets based on options.
  444. # If "when" is "now", the change is applied immediately.  If it is 
  445. # "later" or it is not specified, then the change is applied later, 
  446. # when the application is idle.
  447. # ------------------------------------------------------------------
  448. itcl::body iwidgets::Selectionbox::_packComponents {{when later}} {
  449.     if {$when == "later"} {
  450.     if {$_repacking == ""} {
  451.         set _repacking [after idle [itcl::code $this _packComponents now]]
  452.     }
  453.     return
  454.     } elseif {$when != "now"} {
  455.     error "bad option \"$when\": should be now or later"
  456.     }
  457.  
  458.     set _repacking ""
  459.  
  460.     set parent [winfo parent $itk_component(sbchildsite)]
  461.     set margin [winfo pixels $itk_component(hull) $itk_option(-margin)]
  462.  
  463.     switch $itk_option(-childsitepos) {
  464.     n {
  465.         grid $itk_component(sbchildsite) -row 0 -column 0 \
  466.             -sticky nsew -rowspan 1
  467.         grid $itk_component(items) -row 1 -column 0 -sticky nsew
  468.         grid $itk_component(selection) -row 3 -column 0 -sticky ew
  469.         
  470.         grid rowconfigure $parent 0 -weight 0 -minsize 0
  471.         grid rowconfigure $parent 1 -weight 1 -minsize 0
  472.         grid rowconfigure $parent 2 -weight 0 -minsize $margin
  473.         grid rowconfigure $parent 3 -weight 0 -minsize 0
  474.  
  475.         grid columnconfigure $parent 0 -weight 1 -minsize 0
  476.         grid columnconfigure $parent 1 -weight 0 -minsize 0
  477.     }
  478.     
  479.     w {
  480.         grid $itk_component(sbchildsite) -row 0 -column 0 \
  481.             -sticky nsew -rowspan 3
  482.         grid $itk_component(items) -row 0 -column 1 -sticky nsew
  483.         grid $itk_component(selection) -row 2 -column 1 -sticky ew
  484.         
  485.         grid rowconfigure $parent 0 -weight 1 -minsize 0
  486.         grid rowconfigure $parent 1 -weight 0 -minsize $margin
  487.         grid rowconfigure $parent 2 -weight 0 -minsize 0
  488.         grid rowconfigure $parent 3 -weight 0 -minsize 0
  489.  
  490.         grid columnconfigure $parent 0 -weight 0 -minsize 0
  491.         grid columnconfigure $parent 1 -weight 1 -minsize 0
  492.     }
  493.     
  494.     s {
  495.         grid $itk_component(items) -row 0 -column 0 -sticky nsew
  496.         grid $itk_component(selection) -row 2 -column 0 -sticky ew
  497.         grid $itk_component(sbchildsite) -row 3 -column 0 \
  498.             -sticky nsew -rowspan 1
  499.         
  500.         grid rowconfigure $parent 0 -weight 1 -minsize 0
  501.         grid rowconfigure $parent 1 -weight 0 -minsize $margin
  502.         grid rowconfigure $parent 2 -weight 0 -minsize 0
  503.         grid rowconfigure $parent 3 -weight 0 -minsize 0
  504.  
  505.         grid columnconfigure $parent 0 -weight 1 -minsize 0
  506.         grid columnconfigure $parent 1 -weight 0 -minsize 0
  507.     }
  508.     
  509.     e {
  510.         grid $itk_component(items) -row 0 -column 0 -sticky nsew
  511.         grid $itk_component(selection) -row 2 -column 0 -sticky ew
  512.         grid $itk_component(sbchildsite) -row 0 -column 1 \
  513.             -sticky nsew -rowspan 3
  514.         
  515.         grid rowconfigure $parent 0 -weight 1 -minsize 0
  516.         grid rowconfigure $parent 1 -weight 0 -minsize $margin
  517.         grid rowconfigure $parent 2 -weight 0 -minsize 0
  518.         grid rowconfigure $parent 3 -weight 0 -minsize 0
  519.  
  520.         grid columnconfigure $parent 0 -weight 1 -minsize 0
  521.         grid columnconfigure $parent 1 -weight 0 -minsize 0
  522.     }
  523.     
  524.     center {
  525.         grid $itk_component(items) -row 0 -column 0 -sticky nsew
  526.         grid $itk_component(sbchildsite) -row 1 -column 0 \
  527.             -sticky nsew -rowspan 1
  528.         grid $itk_component(selection) -row 3 -column 0 -sticky ew
  529.         
  530.         grid rowconfigure $parent 0 -weight 1 -minsize 0
  531.         grid rowconfigure $parent 1 -weight 0 -minsize 0
  532.         grid rowconfigure $parent 2 -weight 0 -minsize $margin
  533.         grid rowconfigure $parent 3 -weight 0 -minsize 0
  534.  
  535.         grid columnconfigure $parent 0 -weight 1 -minsize 0
  536.         grid columnconfigure $parent 1 -weight 0 -minsize 0
  537.     }
  538.     
  539.     default {
  540.         error "bad childsitepos option \"$itk_option(-childsitepos)\":\
  541.            should be n, e, s, w, or center"
  542.     }
  543.     }
  544.     
  545.     if {$itk_option(-itemson)} {
  546.     } else {
  547.     grid forget $itk_component(items)
  548.     }
  549.     
  550.     if {$itk_option(-selectionon)} {
  551.     } else {
  552.     grid forget $itk_component(selection)
  553.     }
  554.     
  555.     raise $itk_component(sbchildsite)
  556. }
  557.  
  558.