Posted to tcl by Stu at Sat Jan 29 11:35:44 GMT 2022view raw

  1. bind TCombobox <Key> [list comboKey %W %A]
  2. proc comboKey {combo key} {
  3. if {$key eq ""} { return }
  4. if {[set curIdx [$combo current]] == {}} { return }
  5. if {[set newIdx [getNextOrPrevMatch [$combo cget -values] $key $curIdx [string is upper $key]]] == -1} { return }
  6. comboGo $combo $newIdx
  7. }
  8. proc comboGo {combo where} {
  9. if {[set curIdx [$combo current]] == {}} { return }
  10. set nitems [llength [$combo cget -values]]
  11. incr nitems -1
  12. set idx $curIdx
  13. switch -exact -- $where {
  14. home { set idx 0 }
  15. end { set idx $nitems }
  16. next { incr idx }
  17. prior { incr idx -1 }
  18. default { set idx $where }
  19. }; # hctiws
  20. if {$idx < 0 || $idx > $nitems || $idx == $curIdx} { return }
  21. $combo current $idx
  22. event generate $combo <<SelectAll>>
  23. event generate $combo <<ComboboxSelected>>
  24. }
  25. proc getNextOrPrevMatch {aList aString {curIdx 0} {backwards no}} {
  26. set idxs [lsearch -all -nocase $aList $aString*]
  27. if {[llength $idxs] == 0} { return -1 }
  28. if {[llength $idxs] == 1 && [lindex $idxs 0] == $curIdx} { return -1 }
  29. set p -1
  30. foreach idx $idxs {
  31. if {$idx < $curIdx} { set p $idx }
  32. if {$idx > $curIdx} { break }
  33. }
  34. if {$backwards} {
  35. if {$p == -1} {
  36. set newIdx [lindex $idxs end]
  37. } else {
  38. set newIdx $p
  39. }
  40. } else {
  41. if {$idx == $curIdx} {
  42. set newIdx [lindex $idxs 0]
  43. } else {
  44. set newIdx $idx
  45. }
  46. }
  47. return $newIdx
  48. }

AltStyle によって変換されたページ (->オリジナル) /