home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / Comanche / comanche.exe / lib / iwidgets2.2.0 / scripts / selectionbox.itk < prev    next >
Text File  |  1999-02-24  |  19KB  |  555 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@spd.dsccc.com
  13. #
  14. #  @(#) $Id: selectionbox.itk,v 1.1 1998/07/27 18:49:50 stanton 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. # Default resources.
  40. #
  41. option add *Selectionbox.borderWidth 2 widgetDefault
  42.  
  43. option add *Selectionbox.itemsLabel Items widgetDefault
  44. option add *Selectionbox.itemsLabelPos nw widgetDefault
  45. option add *Selectionbox.itemsOn yes widgetDefault
  46.  
  47. option add *Selectionbox.selectionLabel Selection widgetDefault
  48. option add *Selectionbox.selectionLabelPos nw widgetDefault
  49. option add *Selectionbox.selectionOn yes widgetDefault
  50.  
  51. option add *Selectionbox.vscrollMode static widgetDefault
  52. option add *Selectionbox.hscrollMode none widgetDefault
  53. option add *Selectionbox.scrollMargin 3 widgetDefault
  54. option add *Selectionbox.margin 7 widgetDefault
  55.  
  56. option add *Selectionbox.width 260 widgetDefault
  57. option add *Selectionbox.height 320 widgetDefault
  58.  
  59. #
  60. # Usual options.
  61. #
  62. itk::usual Selectionbox {
  63.     keep -activebackground -activerelief -background -borderwidth -cursor \
  64.      -elementborderwidth -foreground -highlightcolor -highlightthickness \
  65.      -insertbackground -insertborderwidth -insertofftime -insertontime \
  66.      -insertwidth -jump -labelfont -selectbackground -selectborderwidth \
  67.      -selectforeground -textbackground -textfont -troughcolor
  68. }
  69.  
  70. # ------------------------------------------------------------------
  71. #                            SELECTIONBOX
  72. # ------------------------------------------------------------------
  73. class iwidgets::Selectionbox {
  74.     inherit itk::Widget
  75.  
  76.     constructor {args} {}
  77.     destructor {}
  78.  
  79.     itk_option define -childsitepos childSitePos Position center
  80.     itk_option define -margin margin Margin 7
  81.     itk_option define -itemson itemsOn ItemsOn true
  82.     itk_option define -selectionon selectionOn SelectionOn true
  83.     itk_option define -width width Width 260
  84.     itk_option define -height height Height 320
  85.  
  86.     public method childsite {}
  87.     public method get {}
  88.     public method curselection {}
  89.     public method clear {component}
  90.     public method insert {component index args}
  91.     public method delete {first {last {}}}
  92.     public method size {}
  93.     public method scan {option args}
  94.     public method nearest {y}
  95.     public method index {index}
  96.     public method selection {option args}
  97.     public method selectitem {}
  98.  
  99.     private method _packComponents {{when later}}
  100.  
  101.     private variable _repacking {}     ;# non-null => _packComponents pending
  102. }
  103.  
  104. #
  105. # Provide a lowercased access method for the Selectionbox class.
  106. proc ::iwidgets::selectionbox {pathName args} {
  107.     uplevel ::iwidgets::Selectionbox $pathName $args
  108. }
  109.  
  110. # ------------------------------------------------------------------
  111. #                        CONSTRUCTOR
  112. # ------------------------------------------------------------------
  113. body iwidgets::Selectionbox::constructor {args} {
  114.     component hull configure -borderwidth 0
  115.     
  116.     # 
  117.     # Create an internal frame to contain the components.
  118.     #
  119.     itk_component add frame {
  120.     frame $itk_interior.frame
  121.     } {
  122.     keep -background -cursor
  123.     }
  124.     pack $itk_component(frame) -fill both -expand yes
  125.     pack propagate $itk_component(frame) no
  126.     
  127.     #
  128.     # Create the child site widget.
  129.     #
  130.     itk_component add childsite {
  131.     frame $itk_interior.sbchildsite
  132.     } {
  133.     keep -background -cursor
  134.     }
  135.     set itk_interior $itk_component(childsite)
  136.     
  137.     #
  138.     # Create the items list.
  139.     #
  140.     itk_component add items {
  141.     iwidgets::Scrolledlistbox $itk_component(frame).items -selectmode single \
  142.         -visibleitems 1x1
  143.     } {
  144.     keep -activebackground -activerelief -background -borderwidth \
  145.         -cursor -dblclickcommand -elementborderwidth -exportselection \
  146.         -foreground -highlightcolor \
  147.         -highlightthickness -hscrollmode -items -jump -labelfont \
  148.         -labelmargin -relief -repeatdelay -repeatinterval \
  149.         -sbwidth -scrollmargin -selectbackground -selectborderwidth \
  150.         -selectforeground -textbackground -textfont -troughcolor \
  151.         -vscrollmode
  152.     
  153.     rename -labeltext -itemslabel itemsLabel Text
  154.     rename -labelpos -itemslabelpos itemsLabelPos Position
  155.     rename -selectioncommand -itemscommand itemsCommand Command
  156.     }
  157.     configure -itemscommand [code $this selectitem]
  158.     
  159.     itk_component add margin {
  160.     frame $itk_component(frame).margin
  161.     } {
  162.     keep -background -cursor
  163.     }
  164.     
  165.     #
  166.     # Create the selection entry.
  167.     #
  168.     itk_component add selection {
  169.     iwidgets::Entryfield $itk_component(frame).selection 
  170.     } {
  171.     keep -background -borderwidth -cursor -exportselection \
  172.             -foreground -highlightcolor \
  173.         -highlightthickness -insertbackground -insertborderwidth \
  174.         -insertofftime -insertontime -insertwidth -labelfont \
  175.         -labelmargin -relief -selectbackground -selectborderwidth \
  176.         -selectforeground -textbackground -textfont
  177.     
  178.     rename -labeltext -selectionlabel selectionLabel Text
  179.     rename -labelpos -selectionlabelpos selectionLabelPos Position
  180.     rename -command -selectioncommand selectionCommand Command
  181.     }
  182.     
  183.     #
  184.     # Explicitly handle configs that may have been ignored earlier.
  185.     #
  186.     eval itk_initialize $args
  187.  
  188.     # 
  189.     # When idle, pack the components.
  190.     #
  191.     _packComponents
  192. }   
  193.  
  194. # ------------------------------------------------------------------
  195. #                           DESTRUCTOR
  196. # ------------------------------------------------------------------
  197. body iwidgets::Selectionbox::destructor {} {
  198.     if {$_repacking != ""} {after cancel $_repacking}
  199. }
  200.  
  201. # ------------------------------------------------------------------
  202. #                             OPTIONS
  203. # ------------------------------------------------------------------
  204.  
  205. # ------------------------------------------------------------------
  206. # OPTION: -childsitepos
  207. #
  208. # Specifies the position of the child site in the selection box.
  209. # ------------------------------------------------------------------
  210. configbody iwidgets::Selectionbox::childsitepos {
  211.     _packComponents 
  212. }
  213.  
  214. # ------------------------------------------------------------------
  215. # OPTION: -margin
  216. #
  217. # Specifies distance between the items list and selection entry.
  218. # ------------------------------------------------------------------
  219. configbody iwidgets::Selectionbox::margin {
  220.     set pixels [winfo pixels $itk_component(margin) \
  221.             $itk_option(-margin)]
  222.     
  223.     $itk_component(margin) configure -width $pixels -height $pixels
  224. }
  225.  
  226. # ------------------------------------------------------------------
  227. # OPTION: -itemson
  228. #
  229. # Specifies whether or not to display the items list.
  230. # ------------------------------------------------------------------
  231. configbody iwidgets::Selectionbox::itemson {
  232.     if {$itk_option(-itemson)} {
  233.     _packComponents 
  234.     } else {
  235.     pack forget $itk_component(items)
  236.     }
  237. }
  238.  
  239. # ------------------------------------------------------------------
  240. # OPTION: -selectionon
  241. #
  242. # Specifies whether or not to display the selection entry widget.
  243. # ------------------------------------------------------------------
  244. configbody iwidgets::Selectionbox::selectionon {
  245.     if {$itk_option(-selectionon)} {
  246.     _packComponents
  247.     } else {
  248.     pack forget $itk_component(selection)
  249.     }
  250. }
  251.  
  252. # ------------------------------------------------------------------
  253. # OPTION: -width
  254. #
  255. # Specifies the width of the selection box.  The value may be 
  256. # specified in any of the forms acceptable to Tk_GetPixels.  
  257. # ------------------------------------------------------------------
  258. configbody iwidgets::Selectionbox::width {
  259.     set pixels \
  260.             [winfo pixels $itk_component(frame) $itk_option(-width)]
  261.     
  262.     $itk_component(frame) config -width $pixels
  263. }
  264.  
  265. # ------------------------------------------------------------------
  266. # OPTION: -height
  267. #
  268. # Specifies the height of the selection box.  The value may be 
  269. # specified in any of the forms acceptable to Tk_GetPixels.  
  270. # ------------------------------------------------------------------
  271. configbody iwidgets::Selectionbox::height {
  272.     set pixels \
  273.             [winfo pixels $itk_component(frame) $itk_option(-height)]
  274.     
  275.     $itk_component(frame) config -height $pixels
  276. }
  277.  
  278. # ------------------------------------------------------------------
  279. #                            METHODS
  280. # ------------------------------------------------------------------
  281.  
  282. # ------------------------------------------------------------------
  283. # METHOD: childsite
  284. #
  285. # Returns the path name of the child site widget.
  286. # ------------------------------------------------------------------
  287. body iwidgets::Selectionbox::childsite {} {
  288.     return $itk_component(childsite)
  289. }
  290.  
  291. # ------------------------------------------------------------------
  292. # METHOD: get 
  293. #
  294. # Returns the current selection.
  295. # ------------------------------------------------------------------
  296. body iwidgets::Selectionbox::get {} {
  297.     return [$itk_component(selection) get]
  298. }
  299.  
  300. # ------------------------------------------------------------------
  301. # METHOD: curselection
  302. #
  303. # Returns the current selection index.
  304. # ------------------------------------------------------------------
  305. body iwidgets::Selectionbox::curselection {} {
  306.     return [$itk_component(items) curselection]
  307. }
  308.  
  309. # ------------------------------------------------------------------
  310. # METHOD: clear component
  311. #
  312. # Delete the contents of either the selection entry widget or items
  313. # list.
  314. # ------------------------------------------------------------------
  315. body iwidgets::Selectionbox::clear {component} {
  316.     switch $component {
  317.     selection {
  318.         $itk_component(selection) clear
  319.     }
  320.     
  321.     items {
  322.         delete 0 end
  323.     }
  324.     
  325.     default {
  326.         error "bad clear argument \"$component\": should be\
  327.            selection or items"
  328.     }
  329.     }
  330. }
  331.  
  332. # ------------------------------------------------------------------
  333. # METHOD: insert component index args
  334. #
  335. # Insert element(s) into either the selection or items list widget.
  336. # ------------------------------------------------------------------
  337. body iwidgets::Selectionbox::insert {component index args} {
  338.     switch $component {
  339.     selection {
  340.         eval $itk_component(selection) insert $index $args
  341.     }
  342.     
  343.     items {
  344.         set index [index $index]
  345.         configure -items [eval linsert {$itk_option(-items)} $index $args]
  346.     }
  347.     
  348.     default {
  349.         error "bad insert argument \"$component\": should be\
  350.            selection or items"
  351.     }
  352.     }
  353. }
  354.  
  355. # ------------------------------------------------------------------
  356. # METHOD: delete first ?last?
  357. #
  358. # Delete one or more elements from the items list box.  The default 
  359. # is to delete by indexed range. If an item is to be removed by name, 
  360. # it must be preceeded by the keyword "item". Only index numbers can 
  361. # be used to delete a range of items. 
  362. # ------------------------------------------------------------------
  363. body iwidgets::Selectionbox::delete {first {last {}}} {
  364.     set first [index $first]
  365.     
  366.     if {$last != {}} {
  367.     set last [index $last]
  368.     } else {
  369.     set last $first
  370.     }
  371.     
  372.     if {[llength $itk_option(-items)] > 0} {
  373.     if {$first <= $last} {
  374.         configure -items [lreplace $itk_option(-items) $first $last]
  375.     } else {
  376.         error "first index must not be greater than second"
  377.     }
  378.     }
  379. }
  380.  
  381. # ------------------------------------------------------------------
  382. # METHOD: size 
  383. #
  384. # Returns a decimal string indicating the total number of elements 
  385. # in the items list.
  386. # ------------------------------------------------------------------
  387. body iwidgets::Selectionbox::size {} {
  388.     return [$itk_component(items) size]
  389. }
  390.  
  391. # ------------------------------------------------------------------
  392. # METHOD: scan option args 
  393. #
  394. # Implements scanning on items list.
  395. # ------------------------------------------------------------------
  396. body iwidgets::Selectionbox::scan {option args} {
  397.     eval $itk_component(items) scan $option $args
  398. }
  399.  
  400. # ------------------------------------------------------------------
  401. # METHOD: nearest y
  402. #
  403. # Returns the index to the nearest listbox item given a y coordinate.
  404. # ------------------------------------------------------------------
  405. body iwidgets::Selectionbox::nearest {y} {
  406.     return [$itk_component(items) nearest $y]
  407. }
  408.  
  409. # ------------------------------------------------------------------
  410. # METHOD: index index
  411. #
  412. # Returns the decimal string giving the integer index corresponding 
  413. # to index.
  414. # ------------------------------------------------------------------
  415. body iwidgets::Selectionbox::index {index} {
  416.     return [$itk_component(items) index $index]
  417. }
  418.  
  419. # ------------------------------------------------------------------
  420. # METHOD: selection option args
  421. #
  422. # Adjusts the selection within the items list.
  423. # ------------------------------------------------------------------
  424. body iwidgets::Selectionbox::selection {option args} {
  425.     eval $itk_component(items) selection $option $args
  426.  
  427.     selectitem
  428. }
  429.  
  430. # ------------------------------------------------------------------
  431. # METHOD: selectitem
  432. #
  433. # Replace the selection entry field contents with the currently 
  434. # selected items value.
  435. # ------------------------------------------------------------------
  436. body iwidgets::Selectionbox::selectitem {} {
  437.     $itk_component(selection) clear
  438.     set numSelected [$itk_component(items) selecteditemcount]
  439.  
  440.     if {$numSelected == 1} {
  441.     $itk_component(selection) insert end \
  442.         [$itk_component(items) getcurselection]
  443.     } elseif {$numSelected > 1} {
  444.     $itk_component(selection) insert end \
  445.         [lindex [$itk_component(items) getcurselection] 0]
  446.     }
  447.  
  448.     $itk_component(selection) icursor end
  449. }
  450.  
  451. # ------------------------------------------------------------------
  452. # PRIVATE METHOD: _packComponents ?when?
  453. #
  454. # Pack the selection, items, and child site widgets based on options.
  455. # If "when" is "now", the change is applied immediately.  If it is 
  456. # "later" or it is not specified, then the change is applied later, 
  457. # when the application is idle.
  458. # ------------------------------------------------------------------
  459. body iwidgets::Selectionbox::_packComponents {{when later}} {
  460.     if {$when == "later"} {
  461.     if {$_repacking == ""} {
  462.         set _repacking [after idle [code $this _packComponents now]]
  463.     }
  464.     return
  465.     } elseif {$when != "now"} {
  466.     error "bad option \"$when\": should be now or later"
  467.     }
  468.  
  469.     set _repacking ""
  470.  
  471.     switch $itk_option(-childsitepos) {
  472.     n {
  473.         pack configure $itk_component(childsite) -side top \
  474.             -in $itk_component(frame)
  475.         
  476.         pack configure $itk_component(items) -side top \
  477.             -after $itk_component(childsite) 
  478.         pack configure $itk_component(margin) -side top \
  479.             -after $itk_component(items) 
  480.         pack configure $itk_component(selection) -side top \
  481.             -after $itk_component(margin)
  482.     }
  483.     
  484.     w {
  485.         pack configure $itk_component(frame) -side right
  486.         pack configure $itk_component(childsite) -side left \
  487.             -before $itk_component(frame) \
  488.             -in $itk_component(hull)
  489.         
  490.         pack configure $itk_component(items) -side top
  491.         pack configure $itk_component(margin) -side top \
  492.             -after $itk_component(items)
  493.         pack configure $itk_component(selection) -side top \
  494.             -after $itk_component(margin)
  495.     }
  496.     
  497.     s {
  498.         pack configure $itk_component(items) -side top
  499.         pack configure $itk_component(margin) -side top \
  500.             -after $itk_component(items)
  501.         pack configure $itk_component(selection) -side top \
  502.             -after $itk_component(margin)
  503.         pack configure $itk_component(childsite) -side top \
  504.             -after $itk_component(selection) \
  505.             -in $itk_component(frame)
  506.     }
  507.     
  508.     e {
  509.         pack configure $itk_component(frame) -side left
  510.         pack configure $itk_component(childsite) -side right \
  511.             -before $itk_component(frame) \
  512.             -in $itk_component(hull)
  513.         
  514.         pack configure $itk_component(items) -side top
  515.         pack configure $itk_component(margin) -side top \
  516.             -after $itk_component(items)
  517.         pack configure $itk_component(selection) -side top \
  518.             -after $itk_component(margin)
  519.     }
  520.     
  521.     center {
  522.         pack configure $itk_component(items) -side top
  523.         pack configure $itk_component(childsite) -side top \
  524.             -after $itk_component(items) \
  525.             -in $itk_component(frame)
  526.         pack configure $itk_component(margin) -side top \
  527.             -after $itk_component(childsite)
  528.         pack configure $itk_component(selection) -side top \
  529.             -after $itk_component(margin)
  530.     }
  531.     
  532.     default {
  533.         error "bad childsitepos option \"$itk_option(-childsitepos)\":\
  534.            should be n, e, s, w, or center"
  535.     }
  536.     }
  537.     
  538.     if {$itk_option(-itemson)} {
  539.     pack configure $itk_component(items) -fill both -expand yes
  540.     } else {
  541.     pack forget $itk_component(items)
  542.     }
  543.     
  544.     if {$itk_option(-selectionon)} {
  545.     pack configure $itk_component(selection) -fill x
  546.     } else {
  547.     pack forget $itk_component(selection)
  548.     }
  549.     
  550.     raise $itk_component(childsite)
  551. }
  552.