home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 3 / CD ACTUAL 3.iso / linux / incoming / jstools-.6v3 / jstools- / jstools-tk3.6v3.0 / lib / jentrykeys.tcl < prev    next >
Encoding:
Text File  |  1995-02-09  |  7.6 KB  |  285 lines

  1. # jentrykeys.tcl - support for Entry key bindings
  2. # Copyright 1992-1994 by Jay Sekora.  All rights reserved, except 
  3. # that this file may be freely redistributed in whole or in part 
  4. # for non-profit, noncommercial use.
  5.  
  6. ######################################################################
  7. # j:ekb:mkmap w map next {{key command ?args?}...} - set up pseudo-binding
  8. #   Note that key includes modifier; w can be particular widget or class
  9. ######################################################################
  10.  
  11. proc j:ekb:mkmap { w map next bindings } {
  12.   global j_teb
  13.   
  14.   foreach list $bindings {
  15.     set key [lindex $list 0]
  16.     set command [lreplace $list 0 0]
  17.     
  18.     set j_teb(ekm,$w,$map,$key) $command
  19.     set j_teb(ekm_next,$w,$map) $next
  20.   }
  21. }
  22.  
  23. ######################################################################
  24. # j:ekb:process_key W mod K A - process keystrokes
  25. ######################################################################
  26.  
  27. proc j:ekb:process_key {W mod K A} {
  28.   global j_teb
  29.   
  30.   set j_teb(next_keymap,$W) ""        ;# some bindings change this
  31.   
  32.   if {"x$mod" != "x"} {
  33.     set K "$mod-$K"
  34.     set default "$mod-DEFAULT"
  35.   } else {
  36.     set default "DEFAULT"
  37.   }
  38.   
  39.   # if this widget hasn't been used before, set its keymap from default
  40.   if {! [info exists j_teb(keymap,$W)]} {
  41.     set j_teb(keymap,$W) $j_teb(keymap,Entry)
  42.   }
  43.   # if no last command, set it to {}
  44.   if {! [info exists j_teb(last_command,$W)]} {
  45.     set j_teb(last_command,$W) {}
  46.   }
  47.   set map $j_teb(keymap,$W)
  48.  
  49.   if [info exists j_teb(ekm,$W,$map,$K)] {
  50.     # specific action for this widget
  51.     set command $j_teb(ekm,$W,$map,$K)
  52.     eval $command [list $W $K $A]
  53.   } else {
  54.     if [info exists j_teb(ekm,Entry,$map,$K)] {
  55.       # specific binding for all Entry widgets
  56.       set command $j_teb(ekm,Entry,$map,$K)
  57.       eval $command [list $W $K $A]
  58.     } else {
  59.       if [info exists j_teb(ekm,$W,$map,$default)] {
  60.         # default key action for this widget
  61.         set command $j_teb(ekm,$W,$map,$default)
  62.         eval $command [list $W $K $A]
  63.       } else {
  64.         # default key action for Entry widgets
  65.         set command $j_teb(ekm,Entry,$map,$default)
  66.         eval $command [list $W $K $A]
  67.       }
  68.     }
  69.   }
  70.   set j_teb(last_command,$W) $command
  71.   
  72.   # if a binding hasn't explicitly chosen a different keymap for the next
  73.   #   key, switch to the default next keymap for this keymap:
  74.   if {"x$j_teb(next_keymap,$W)" == "x"} {
  75.     if [info exists j_teb(ekm_next,$W,$map)] {
  76.       set j_teb(next_keymap,$W) $j_teb(ekm_next,$W,$map)
  77.     } else {
  78.       set j_teb(next_keymap,$W) $j_teb(ekm_next,Entry,$map)
  79.     }
  80.   }
  81.   set j_teb(keymap,$W) $j_teb(next_keymap,$W)
  82. }
  83.  
  84. ######################################################################
  85. # j:ek:see_insert W - make sure insert point is visible
  86. ######################################################################
  87.  
  88. proc j:ek:see_insert { W } {
  89.   j:tk3 {tk_entrySeeCaret $W}
  90.   j:tk4 {tkEntrySeeInsert $W}
  91. }
  92.  
  93. ######################################################################
  94. # j:ekb:new_mode mode W K A - change modes
  95. ######################################################################
  96.  
  97. proc j:ekb:new_mode { mode W K A } {
  98.   global j_teb
  99.   set j_teb(next_keymap,$W) $mode
  100. }
  101.  
  102. ######################################################################
  103. # j:ekb:self_insert W K A - insert A into entry widget W
  104. # * handles deletion of selection if needed
  105. ######################################################################
  106.  
  107. proc j:ekb:self_insert { W K A } {
  108.   global j_teb J_PREFS
  109.   
  110.   if $J_PREFS(typeover) {
  111.     catch {
  112.       $W delete sel.first sel.last
  113.     }
  114.   }
  115.  
  116.   if {"$A" != ""} {
  117.     $W insert insert $A
  118.     j:ek:see_insert $W
  119.   }
  120. }
  121.  
  122. ######################################################################
  123. # j:ekb:clear_and_insert W K A - clear entry widget W and insert A
  124. ######################################################################
  125.  
  126. proc j:ekb:clear_and_insert { W K A } {
  127.   global j_teb
  128.   puts stdout foo
  129.   
  130.   $W delete 0 end
  131.   
  132.   if {"$A" != ""} {
  133.     $W insert insert $A
  134.     j:ek:see_insert $W
  135.   }
  136. }
  137.  
  138. ######################################################################
  139. ### ENTRY MOVEMENT ROUTINES
  140. ######################################################################
  141.  
  142. # j:ekb:left W - move one character left
  143. proc j:ekb:left { W args } {
  144.   $W icursor [expr {[$W index insert] - 1}]
  145.   j:ek:see_insert $W
  146. }
  147.  
  148. # j:ekb:right W - move one character right
  149. proc j:ekb:right { W args } {
  150.   $W icursor [expr {[$W index insert] + 1}]
  151.   j:ek:see_insert $W
  152. }
  153.  
  154. # j:ekb:bol W - move to beginning of entry
  155. proc j:ekb:bol { W args } {
  156.   $W icursor 0
  157.   j:ek:see_insert $W
  158. }
  159.  
  160. # j:ekb:eol W - move to end of entry
  161. proc j:ekb:eol { W args } {
  162.   $W icursor end
  163.   j:ek:see_insert $W
  164. }
  165.  
  166. # j:ekb:word_left W - move one word left
  167. # hacked from tk_entryBackword in entry.tcl
  168. proc j:ekb:word_left { W args } {
  169.   set string [$W get]
  170.   set length [string length $string]
  171.   set curs [expr [$W index insert]-2]
  172.   if {$curs < 0} return
  173.   for {set start $curs} {$start > 0} {incr start -1} {
  174.     if {[string first [string index $string $start] " \t"] >= 0} {
  175.       incr start
  176.       break
  177.     }
  178.     if {([string first [string index $string $start] " \t"] < 0)
  179.         && ([string first [string index $string [expr $start-1]] " \t"]
  180.         >= 0)} {
  181.       break
  182.     }
  183.   }
  184.   $W icursor $start
  185.   j:ek:see_insert $W
  186. }
  187.  
  188. # j:ekb:word_right W - move one word right
  189. # hacked from tk_entryBackword in entry.tcl
  190. proc j:ekb:word_right { W args } {
  191.   set string [$W get]
  192.   set length [string length $string]
  193.   set curs [expr [$W index insert]+1]
  194.  
  195.   for {set end $curs} {$end < $length} {incr end 1} {
  196.     if {[string first [string index $string $end] " \t"] >= 0} {
  197.       break
  198.     }
  199.   }
  200.   $W icursor $end
  201.   j:ek:see_insert $W
  202. }
  203.  
  204. ######################################################################
  205. ###  ENTRY DELETION ROUTINES
  206. ######################################################################
  207.  
  208. # j:ekb:clear W - clear entire widget
  209. proc j:ekb:clear { W args } {
  210.   $W delete 0 end
  211. }
  212.  
  213. # j:ekb:delete_left W - delete character before insert
  214. proc j:ekb:delete_left { W args } {
  215.   global J_PREFS
  216.   
  217.   if {$J_PREFS(typeover) && ![catch {selection get} s]} {
  218.     if {"x[selection own]" == "x$W"} {
  219.       $W delete sel.first sel.last
  220.       return 0
  221.     }
  222.   }
  223.   tk_entryBackspace $W
  224.   j:ek:see_insert $W
  225. }
  226.  
  227. # j:ekb:delete_right W - delete character after insert
  228. proc j:ekb:delete_right { W args } {
  229.   global J_PREFS
  230.   
  231.   if {$J_PREFS(typeover) && ![catch {selection get} s]} {
  232.     if {"x[selection own]" == "x$W"} {
  233.       $W delete sel.first sel.last
  234.       return 0
  235.     }
  236.   }
  237.   $W delete insert
  238.   j:ek:see_insert $W
  239. }
  240.  
  241. # j:ekb:kill_eol W - delete to eol
  242. proc j:ekb:kill_eol { W args } {
  243.   $W delete insert end
  244. }
  245.  
  246. # j:ekb:kill_selection W - delete selection
  247. proc j:ekb:kill_selection { W args } {
  248.   catch {
  249.     $W delete sel.first sel.last
  250.   }
  251. }
  252.  
  253. # j:ekb:delete_word_left W - move one word left
  254. # hacked from tk_entryBackword in entry.tcl
  255. proc j:ekb:delete_word_left { W args } {
  256.   set string [$W get]
  257.   set length [string length $string]
  258.   set curs [expr [$W index insert]-2]
  259.   if {$curs < 0} return
  260.   for {set start $curs} {$start > 0} {incr start -1} {
  261.     if {[string first [string index $string [expr $start-1]] " \t"] >= 0} {
  262.       break
  263.     }
  264.   }
  265.   $W delete $start [expr {$curs+1}]
  266.   j:ek:see_insert $W
  267. }
  268.  
  269. # j:ekb:delete_word_right W - move one word right
  270. # hacked from tk_entryBackword in entry.tcl
  271. proc j:ekb:delete_word_right { W args } {
  272.   set string [$W get]
  273.   set length [string length $string]
  274.   set curs [expr [$W index insert]+1]
  275.  
  276.   for {set end $curs} {$end < $length} {incr end 1} {
  277.     if {[string first [string index $string [expr $end+1]] " \t"] >= 0} {
  278.       break
  279.     }
  280.   }
  281.   $W delete insert $end
  282.   j:ek:see_insert $W
  283. }
  284.