OSDN Git Service

Please enter the commit message for your changes. Lines starting
[eos/base.git] / util / src / TclTk / blt2.5 / library / hiertable.tcl
diff --git a/util/src/TclTk/blt2.5/library/hiertable.tcl b/util/src/TclTk/blt2.5/library/hiertable.tcl
new file mode 100644 (file)
index 0000000..de066d5
--- /dev/null
@@ -0,0 +1,943 @@
+# hiertable.tcl
+# ----------------------------------------------------------------------
+# Bindings for the BLT hiertable widget
+# ----------------------------------------------------------------------
+#   AUTHOR:  George Howlett
+#            Bell Labs Innovations for Lucent Technologies
+#            gah@lucent.com
+#            http://www.tcltk.com/blt
+#
+#      RCS:  $Id: hiertable.tcl,v 1.1.1.1 2009/05/09 16:27:21 pcmacdon Exp $
+#
+# ----------------------------------------------------------------------
+# Copyright (c) 1998  Lucent Technologies, Inc.
+# ======================================================================
+#
+# Permission to use, copy, modify, and distribute this software and its
+# documentation for any purpose and without fee is hereby granted,
+# provided that the above copyright notice appear in all copies and that
+# both that the copyright notice and warranty disclaimer appear in
+# supporting documentation, and that the names of Lucent Technologies
+# any of their entities not be used in advertising or publicity
+# pertaining to distribution of the software without specific, written
+# prior permission.
+#
+# Lucent Technologies disclaims all warranties with regard to this
+# software, including all implied warranties of merchantability and
+# fitness.  In no event shall Lucent be liable for any special, indirect
+# or consequential damages or any damages whatsoever resulting from loss
+# of use, data or profits, whether in an action of contract, negligence
+# or other tortuous action, arising out of or in connection with the use
+# or performance of this software.
+#
+# ======================================================================
+
+namespace eval blt::Hiertable {
+    variable afterId ""
+    variable scroll 0
+    variable column ""
+    variable space   off
+    variable x 0
+    variable y 0
+}
+
+# 
+# ButtonPress assignments
+#
+#      B1-Enter        start auto-scrolling
+#      B1-Leave        stop auto-scrolling
+#      ButtonPress-2   start scan
+#      B2-Motion       adjust scan
+#      ButtonRelease-2 stop scan
+#
+
+bind Hiertable <ButtonPress-2> {
+    set blt::Hiertable::cursor [%W cget -cursor]
+    %W configure -cursor hand1
+    %W scan mark %x %y
+}
+
+bind Hiertable <B2-Motion> {
+    %W scan dragto %x %y
+}
+
+bind Hiertable <ButtonRelease-2> {
+    %W configure -cursor $blt::Hiertable::cursor
+}
+
+bind Hiertable <B1-Leave> {
+    if { $blt::Hiertable::scroll } {
+       blt::Hiertable::AutoScroll %W 
+    }
+}
+
+bind Hiertable <B1-Enter> {
+    after cancel $blt::Hiertable::afterId
+}
+
+# 
+# KeyPress assignments
+#
+#      Up                      
+#      Down
+#      Shift-Up
+#      Shift-Down
+#      Prior (PageUp)
+#      Next  (PageDn)
+#      Left
+#      Right
+#      space           Start selection toggle of entry currently with focus.
+#      Return          Start selection toggle of entry currently with focus.
+#      Home
+#      End
+#      F1
+#      F2
+#      ASCII char      Go to next open entry starting with character.
+#
+# KeyRelease
+#
+#      space           Stop selection toggle of entry currently with focus.
+#      Return          Stop selection toggle of entry currently with focus.
+
+
+bind Hiertable <KeyPress-Up> {
+    blt::Hiertable::MoveFocus %W up
+    if { $blt::Hiertable::space } {
+       %W selection toggle focus
+    }
+}
+
+bind Hiertable <KeyPress-Down> {
+    blt::Hiertable::MoveFocus %W down
+    if { $blt::Hiertable::space } {
+       %W selection toggle focus
+    }
+}
+
+bind Hiertable <Shift-KeyPress-Up> {
+    blt::Hiertable::MoveFocus %W prevsibling
+}
+
+bind Hiertable <Shift-KeyPress-Down> {
+    blt::Hiertable::MoveFocus %W nextsibling
+}
+
+bind Hiertable <KeyPress-Prior> {
+    blt::Hiertable::MovePage %W top
+}
+
+bind Hiertable <KeyPress-Next> {
+    blt::Hiertable::MovePage %W bottom
+}
+
+bind Hiertable <KeyPress-Left> {
+    %W close focus
+}
+bind Hiertable <KeyPress-Right> {
+    %W open focus
+    %W see focus -anchor w
+}
+
+bind Hiertable <KeyPress-space> {
+    if { [%W cget -selectmode] == "single" } {
+       if { [%W selection includes focus] } {
+           %W selection clearall
+       } else {
+           %W selection clearall
+           %W selection set focus
+       }
+    } else {
+       %W selection toggle focus
+    }
+    set blt::Hiertable::space on
+}
+
+bind Hiertable <KeyRelease-space> { 
+    set blt::Hiertable::space off
+}
+
+bind Hiertable <KeyPress-Return> {
+    blt::Hiertable::MoveFocus %W focus
+    set blt::Hiertable::space on
+}
+
+bind Hiertable <KeyRelease-Return> { 
+    set blt::Hiertable::space off
+}
+
+bind Hiertable <KeyPress> {
+    blt::Hiertable::NextMatchingEntry %W %A
+}
+
+bind Hiertable <KeyPress-Home> {
+    blt::Hiertable::MoveFocus %W top
+}
+
+bind Hiertable <KeyPress-End> {
+    blt::Hiertable::MoveFocus %W bottom
+}
+
+bind Hiertable <KeyPress-F1> {
+    %W open -r root
+}
+
+bind Hiertable <KeyPress-F2> {
+    eval %W close -r [%W entry children root] 
+}
+
+#
+# Differences between "current" and nearest.
+#
+#      set index [$widget index current]
+#      set index [$widget nearest $x $y]
+#
+#      o Nearest gives you the closest entry.
+#      o current is "" if
+#         1) the pointer isn't over an entry.
+#         2) the pointer is over a open/close button.
+#         3) 
+#
+#
+# ----------------------------------------------------------------------
+#
+# USAGE: blt::Hiertable::Init <hiertable> 
+#
+# Invoked by internally by Hiertable_Init routine.  Initializes the 
+# default bindings for the hiertable widget entries.  These are local
+# to the widget, so they can't be set through the widget's class
+# bind tags.
+#
+# Arguments:   hiertable               hierarchy widget
+#
+# ----------------------------------------------------------------------
+proc blt::Hiertable::Init { widget } {
+    #
+    # Active entry bindings
+    #
+    $widget bind Entry <Enter> { 
+       %W entry highlight current 
+    }
+    $widget bind Entry <Leave> { 
+       %W entry highlight "" 
+    }
+
+    #
+    # Button bindings
+    #
+    $widget button bind all <ButtonRelease-1> {
+       %W see -anchor nw current
+       %W toggle current
+    }
+    $widget button bind all <Enter> {
+       %W button highlight current
+    }
+    $widget button bind all <Leave> {
+       %W button highlight ""
+    }
+
+    #
+    # ButtonPress-1
+    #
+    #  Performs the following operations:
+    #
+    #  1. Clears the previous selection.
+    #  2. Selects the current entry.
+    #  3. Sets the focus to this entry.
+    #  4. Scrolls the entry into view.
+    #  5. Sets the selection anchor to this entry, just in case
+    #     this is "multiple" mode.
+    #
+    
+    $widget bind Entry <ButtonPress-1> {       
+       blt::Hiertable::SetSelectionAnchor %W current
+       set blt::Hiertable::scroll 1
+    }
+
+    $widget bind Entry <Double-ButtonPress-1> {
+       %W toggle current
+    }
+
+    #
+    # B1-Motion
+    #
+    #  For "multiple" mode only.  Saves the current location of the
+    #  pointer for auto-scrolling.  Resets the selection mark.  
+    #
+    $widget bind Entry <B1-Motion> { 
+       set blt::Hiertable::x %x
+       set blt::Hiertable::y %y
+       set index [%W nearest %x %y]
+       if { [%W cget -selectmode] == "multiple" } {
+           %W selection mark $index
+       } else {
+           blt::Hiertable::SetSelectionAnchor %W $index
+       }
+    }
+
+    #
+    # ButtonRelease-1
+    #
+    #  For "multiple" mode only.  
+    #
+    $widget bind Entry <ButtonRelease-1> { 
+       if { [%W cget -selectmode] == "multiple" } {
+           %W selection anchor current
+       }
+       after cancel $blt::Hiertable::afterId
+       set blt::Hiertable::scroll 0
+    }
+
+    #
+    # Shift-ButtonPress-1
+    #
+    #  For "multiple" mode only.
+    #
+
+    $widget bind Entry <Shift-ButtonPress-1> { 
+       if { [%W cget -selectmode] == "multiple" && [%W selection present] } {
+           if { [%W index anchor] == "" } {
+               %W selection anchor current
+           }
+           set index [%W index anchor]
+           %W selection clearall
+           %W selection set $index current
+       } else {
+           blt::Hiertable::SetSelectionAnchor %W current
+       }
+    }
+    $widget bind Entry <Shift-Double-ButtonPress-1> {
+       puts <Shift-Double-ButtonPress-1> 
+       # do nothing
+    }
+    $widget bind Entry <Shift-B1-Motion> { 
+       # do nothing
+    }
+    $widget bind Entry <Shift-ButtonRelease-1> { 
+       after cancel $blt::Hiertable::afterId
+       set blt::Hiertable::scroll 0
+    }
+
+    #
+    # Control-ButtonPress-1
+    #
+    #  For "multiple" mode only.  
+    #
+    $widget bind Entry <Control-ButtonPress-1> { 
+       if { [%W cget -selectmode] == "multiple" } {
+           set index [%W index current]
+           %W selection toggle $index
+           %W selection anchor $index
+       } else {
+           blt::Hiertable::SetSelectionAnchor %W current
+       }
+    }
+    $widget bind Entry <Control-Double-ButtonPress-1> {
+       puts <Control-Double-ButtonPress-1> 
+       # do nothing
+    }
+    $widget bind Entry <Control-B1-Motion> { 
+       # do nothing
+    }
+    $widget bind Entry <Control-ButtonRelease-1> { 
+       after cancel $blt::Hiertable::afterId
+       set blt::Hiertable::scroll 0
+    }
+
+    $widget bind Entry <Control-Shift-ButtonPress-1> { 
+       if { [%W cget -selectmode] == "multiple" && [%W selection present] } {
+           if { [%W index anchor] == "" } {
+               %W selection anchor current
+           }
+           if { [%W selection includes anchor] } {
+               %W selection set anchor current
+           } else {
+               %W selection clear anchor current
+               %W selection set current
+           }
+       } else {
+           blt::Hiertable::SetSelectionAnchor %W current
+       }
+    }
+    $widget bind Entry <Control-Shift-Double-ButtonPress-1> {
+       puts <Control-Shift-Double-ButtonPress-1> 
+       # do nothing
+    }
+    $widget bind Entry <Control-Shift-B1-Motion> { 
+       # do nothing
+    }
+    $widget column bind all <Enter> {
+       %W column highlight [%W column current]
+    }
+    $widget column bind all <Leave> {
+       %W column highlight ""
+    }
+    $widget column bind Rule <Enter> {
+       %W column highlight [%W column current]
+       %W column resize activate [%W column current]
+    }
+    $widget column bind Rule <Leave> {
+       %W column highlight ""
+       %W column resize activate ""
+    }
+    $widget column bind Rule <ButtonPress-1> {
+       %W column resize anchor %x
+    }
+    $widget column bind Rule <B1-Motion> {
+       %W column resize mark %x
+    }
+    $widget column bind Rule <ButtonRelease-1> {
+       %W column configure [%W column current] -width [%W column resize set]
+    }
+    $widget column bind all <ButtonRelease-1> {
+       set column [%W column nearest %x %y]
+       if { $column != "" } {
+           %W column invoke $column
+       }
+    }
+}
+
+# ----------------------------------------------------------------------
+# USAGE: blt::Hiertable::AutoScroll <hiertable>
+#
+# Invoked when the user is selecting elements in a hiertable widget
+# and drags the mouse pointer outside of the widget.  Scrolls the
+# view in the direction of the pointer.
+#
+# Arguments:   hiertable               hierarchy widget
+#
+# ----------------------------------------------------------------------
+proc blt::Hiertable::AutoScroll { widget } {
+    if { ![winfo exists $widget] } {
+       return
+    }
+    set x $blt::Hiertable::x
+    set y $blt::Hiertable::y
+
+    set index [$widget nearest $x $y]
+
+    if {$y >= [winfo height $widget]} {
+       $widget yview scroll 1 units
+       set neighbor down
+    } elseif {$y < 0} {
+       $widget yview scroll -1 units
+       set neighbor up
+    } else {
+       set neighbor $index
+    }
+    if { [$widget cget -selectmode] == "single" } {
+       blt::Hiertable::SetSelectionAnchor $widget $neighbor
+    } else {
+       $widget selection mark $index
+    }
+    set ::blt::Hiertable::afterId [after 10 blt::Hiertable::AutoScroll $widget]
+}
+
+proc blt::Hiertable::SetSelectionAnchor { widget index } {
+    set index [$widget index $index]
+    # If the anchor hasn't changed, don't do anything
+    if { $index != [$widget index anchor] } {
+       $widget selection clearall
+       $widget see $index
+       $widget focus $index
+       $widget selection set $index
+       $widget selection anchor $index
+    }
+}
+
+# ----------------------------------------------------------------------
+# USAGE: blt::Hiertable::MoveFocus <hiertable> <where>
+#
+# Invoked by KeyPress bindings.  Moves the active selection to the
+# entry <where>, which is an index such as "up", "down", "prevsibling",
+# "nextsibling", etc.
+# ----------------------------------------------------------------------
+proc blt::Hiertable::MoveFocus { widget where } {
+    catch {$widget focus $where}
+    if { [$widget cget -selectmode] == "single" } {
+        $widget selection clearall
+        $widget selection set focus
+    }
+    $widget see focus
+}
+
+# ----------------------------------------------------------------------
+# USAGE: blt::Hiertable::MovePage <hiertable> <where>
+# Arguments:   hiertable               hierarchy widget
+#
+# Invoked by KeyPress bindings.  Pages the current view up or down.
+# The <where> argument should be either "top" or "bottom".
+# ----------------------------------------------------------------------
+
+proc blt::Hiertable::MovePage { widget where } {
+
+    # If the focus is already at the top/bottom of the window, we want
+    # to scroll a page. It's really one page minus an entry because we
+    # want to see the last entry on the next/last page.
+    if { [$widget index focus] == [$widget index view.$where] } {
+        if {$where == "top"} {
+           $widget yview scroll -1 pages
+           $widget yview scroll 1 units
+        } else {
+           $widget yview scroll 1 pages
+           $widget yview scroll -1 units
+        }
+    }
+    update
+
+    # Adjust the entry focus and the view.  Also activate the entry.
+    # just in case the mouse point is not in the widget.
+    $widget entry highlight view.$where
+    $widget focus view.$where
+    $widget see view.$where
+    if { [$widget cget -selectmode] == "single" } {
+        $widget selection clearall
+        $widget selection set focus
+    }
+}
+
+# ----------------------------------------------------------------------
+# USAGE: blt::Hiertable::NextMatchingEntry <hiertable> <char>
+# Arguments:   hiertable               hierarchy widget
+#
+# Invoked by KeyPress bindings.  Searches for an entry that starts
+# with the letter <char> and makes that entry active.
+# ----------------------------------------------------------------------
+
+proc blt::Hiertable::NextMatchingEntry { widget key } {
+    if {[string match {[ -~]} $key]} {
+       set last [$widget index focus]
+       set next [$widget index next]
+       while { $next != $last } {
+           set label [$widget entry cget $next -label]
+           if { [string index $label 0] == $key } {
+               break
+           }
+           set next [$widget index -at $next next]
+       }
+       $widget focus $next
+        if {[$widget cget -selectmode] == "single"} {
+            $widget selection clearall
+            $widget selection set focus
+        }
+       $widget see focus
+    }
+}
+
+#
+#  Edit mode assignments
+#
+#      ButtonPress-3   Enables/disables edit mode on entry.  Sets focus to 
+#                      entry.
+#
+#  KeyPress
+#
+#      Left            Move insertion position to previous.
+#      Right           Move insertion position to next.
+#      Up              Move insertion position up one line.
+#      Down            Move insertion position down one line.
+#      Return          End edit mode.
+#      Shift-Return    Line feed.
+#      Home            Move to first position.
+#      End             Move to last position.
+#      ASCII char      Insert character left of insertion point.
+#      Del             Delete character right of insertion point.
+#      Delete          Delete character left of insertion point.
+#      Ctrl-X          Cut
+#      Ctrl-V          Copy
+#      Ctrl-P          Paste
+#      
+#  KeyRelease
+#
+#  ButtonPress-1       Start selection if in entry, otherwise clear selection.
+#  B1-Motion           Extend/reduce selection.
+#  ButtonRelease-1      End selection if in entry, otherwise use last selection.
+#  B1-Enter            Disabled.
+#  B1-Leave            Disabled.
+#  ButtonPress-2       Same as above.
+#  B2-Motion           Same as above.
+#  ButtonRelease-2     Same as above.
+#      
+# All bindings in editting mode will "break" to override other bindings.
+#
+#
+
+bind xEditor <ButtonPress-3> {
+    set node [%W nearest %x %y]
+    %W entry insert $node @%x,%y ""
+#    %W entry insert $node 2 ""
+}
+
+image create photo blt::Hiertable::CloseNormalFolder -format gif -data {
+R0lGODlhEAANAMIAAAAAAH9/f///////AL+/vwAA/wAAAAAAACH5BAEAAAUALAAAAAAQAA0A
+AAM8WBrM+rAEQWmIb5KxiWjNInCkV32AJHRlGQBgDA7vdN4vUa8tC78qlrCWmvRKsJTquHkp
+ZTKAsiCtWq0JADs=
+}
+image create photo blt::Hiertable::OpenNormalFolder -format gif -data {
+R0lGODlhEAANAMIAAAAAAH9/f///////AL+/vwAA/wAAAAAAACH5BAEAAAUALAAAAAAQAA0A
+AAM1WBrM+rAEMigJ8c3Kb3OSII6kGABhp1JnaK1VGwjwKwtvHqNzzd263M3H4n2OH1QBwGw6
+nQkAOw==
+}
+image create photo blt::Hiertable::CloseActiveFolder -format gif -data {
+R0lGODlhEAANAMIAAAAAAH9/f/////+/AL+/vwAA/wAAAAAAACH5BAEAAAUALAAAAAAQAA0A
+AAM8WBrM+rAEQWmIb5KxiWjNInCkV32AJHRlGQBgDA7vdN4vUa8tC78qlrCWmvRKsJTquHkp
+ZTKAsiCtWq0JADs=
+}
+image create photo blt::Hiertable::OpenActiveFolder -format gif -data {
+R0lGODlhEAANAMIAAAAAAH9/f/////+/AL+/vwAA/wAAAAAAACH5BAEAAAUALAAAAAAQAA0A
+AAM1WBrM+rAEMigJ8c3Kb3OSII6kGABhp1JnaK1VGwjwKwtvHqNzzd263M3H4n2OH1QBwGw6
+nQkAOw==
+}
+
+
+if { $tcl_platform(platform) == "windows" } {
+    if { $tk_version >= 8.3 } {
+       set cursor "@[file join $blt_library treeview.cur]"
+    } else {
+       set cursor "size_we"
+    }
+    option add *Hiertable.ResizeCursor [list $cursor]
+} else {
+    option add *Hiertable.ResizeCursor \
+       "@$blt_library/treeview.xbm $blt_library/treeview_m.xbm black white"
+}
+
+# Standard Motif bindings:
+
+bind HiertableEditor <ButtonPress-1> {
+    %W text icursor @%x,%y
+}
+
+bind HiertableEditor <Left> {
+    %W text icursor last
+}
+bind HiertableEditor <Right> {
+    %W text icursor next
+}
+bind HiertableEditor <Shift-Left> {
+    set new [expr {[%W text index insert] - 1}]
+    if {![%W text selection present]} {
+       %W text selection from insert
+       %W text selection to $new
+    } else {
+       %W text selection adjust $new
+    }
+    %W text icursor $new
+}
+bind HiertableEditor <Shift-Right> {
+    set new [expr {[%W text index insert] + 1}]
+    if {![%W text selection present]} {
+       %W text selection from insert
+       %W text selection to $new
+    } else {
+       %W text selection adjust $new
+    }
+    %W text icursor $new
+}
+
+bind HiertableEditor <Home> {
+    %W text icursor 0
+}
+bind HiertableEditor <Shift-Home> {
+    set new 0
+    if {![%W text selection present]} {
+       %W text selection from insert
+       %W text selection to $new
+    } else {
+       %W text selection adjust $new
+    }
+    %W text icursor $new
+}
+bind HiertableEditor <End> {
+    %W text icursor end
+}
+bind HiertableEditor <Shift-End> {
+    set new end
+    if {![%W text selection present]} {
+       %W text selection from insert
+       %W text selection to $new
+    } else {
+       %W text selection adjust $new
+    }
+    %W text icursor $new
+}
+
+bind HiertableEditor <Delete> {
+    if { [%W text selection present]} {
+       %W text delete sel.first sel.last
+    } else {
+       %W text delete insert
+    }
+}
+
+bind HiertableEditor <BackSpace> {
+    if { [%W text selection present] } {
+       %W text delete sel.first sel.last
+    } else {
+       set index [expr [%W text index insert] - 1]
+       if { $index >= 0 } {
+           %W text delete $index $index
+       }
+    }
+}
+
+bind HiertableEditor <Control-space> {
+    %W text selection from insert
+}
+
+bind HiertableEditor <Select> {
+    %W text selection from insert
+}
+
+bind HiertableEditor <Control-Shift-space> {
+    %W text selection adjust insert
+}
+
+bind HiertableEditor <Shift-Select> {
+    %W text selection adjust insert
+}
+
+bind HiertableEditor <Control-slash> {
+    %W text selection range 0 end
+}
+
+bind HiertableEditor <Control-backslash> {
+    %W text selection clear
+}
+
+bind HiertableEditor <KeyPress> {
+    blt::Hiertable::Insert %W %A
+}
+
+# Ignore all Alt, Meta, and Control keypresses unless explicitly bound.
+# Otherwise, if a widget binding for one of these is defined, the
+# <KeyPress> class binding will also fire and insert the character,
+# which is wrong.  Ditto for Escape, Return, and Tab.
+
+bind HiertableEditor <Alt-KeyPress> {
+    # nothing
+}
+
+bind HiertableEditor <Meta-KeyPress> {
+    # nothing
+}
+
+bind HiertableEditor <Control-KeyPress> {
+    # nothing
+}
+
+bind HiertableEditor <Escape> { 
+    %W text cancel 
+    grab release %W
+}
+
+bind HiertableEditor <Return> { 
+    %W text apply 
+    grab release %W
+}
+
+bind HiertableEditor <Shift-Return> {
+    blt::Hiertable::Insert %W "\n"
+}
+
+bind HiertableEditor <KP_Enter> {
+    # nothing
+}
+
+bind HiertableEditor <Tab> {
+    # nothing
+}
+
+if {![string compare $tcl_platform(platform) "macintosh"]} {
+    bind HiertableEditor <Command-KeyPress> {
+       # nothing
+    }
+}
+
+# On Windows, paste is done using Shift-Insert.  Shift-Insert already
+# generates the <<Paste>> event, so we don't need to do anything here.
+if { [string compare $tcl_platform(platform) "windows"] != 0 } {
+    bind HiertableEditor <Insert> {
+       catch {blt::Hiertable::Insert %W [selection get -displayof %W]}
+    }
+}
+
+# Additional emacs-like bindings:
+bind HiertableEditor <ButtonPress-3> {
+    if { [winfo viewable %W] } {
+       grab release %W
+       %W text cancel
+    } 
+}
+
+bind HiertableEditor <Control-a> {
+    %W text icursor 0
+    %W text selection clear
+}
+
+bind HiertableEditor <Control-b> {
+    %W text icursor [expr {[%W index insert] - 1}]
+    %W text selection clear
+}
+
+bind HiertableEditor <Control-d> {
+    %W text delete insert
+}
+
+bind HiertableEditor <Control-e> {
+    %W text icursor end
+    %W text selection clear
+}
+
+bind HiertableEditor <Control-f> {
+    %W text icursor [expr {[%W index insert] + 1}]
+    %W text selection clear
+}
+
+bind HiertableEditor <Control-h> {
+    if {[%W text selection present]} {
+       %W text delete sel.first sel.last
+    } else {
+       set index [expr [%W text index insert] - 1]
+       if { $index >= 0 } {
+           %W text delete $index $index
+       }
+    }
+}
+
+bind HiertableEditor <Control-k> {
+    %W text delete insert end
+}
+
+
+
+# blt::Hiertable::Insert --
+# Insert a string into an entry at the point of the insertion cursor.
+# If there is a selection in the entry, and it covers the point of the
+# insertion cursor, then delete the selection before inserting.
+#
+# Arguments:
+# w -          The entry window in which to insert the string
+# s -          The string to insert (usually just a single character)
+
+proc blt::Hiertable::Insert {w s} {
+    if {![string compare $s ""]} {
+       return
+    }
+    catch {
+       set insert [$w text index insert]
+       if {([$w text index sel.first] <= $insert)
+               && ([$w text index sel.last] >= $insert)} {
+           $w delete sel.first sel.last
+       }
+    }
+    $w text insert insert $s
+}
+
+# tkEntryTranspose -
+# This procedure implements the "transpose" function for entry widgets.
+# It tranposes the characters on either side of the insertion cursor,
+# unless the cursor is at the end of the line.  In this case it
+# transposes the two characters to the left of the cursor.  In either
+# case, the cursor ends up to the right of the transposed characters.
+#
+# Arguments:
+# w -          The entry window.
+
+proc HiertableTranspose w {
+    set i [$w text index insert]
+    if {$i < [$w text index end]} {
+       incr i
+    }
+    set first [expr {$i-2}]
+    if {$first < 0} {
+       return
+    }
+    set new [string index [$w get] [expr {$i-1}]][string index [$w get] $first]
+    $w delete $first $i
+    $w insert insert $new
+}
+
+# Hiertable::GetSelection --
+#
+# Returns the selected text of the entry with respect to the -show option.
+#
+# Arguments:
+# w -         The entry window from which the text to get
+
+proc blt::Hiertable::GetSelection {w} {
+    set entryString [string range [$w get] [$w index sel.first] \
+                       [expr [$w index sel.last] - 1]]
+    if {[$w cget -show] != ""} {
+      regsub -all . $entryString [string index [$w cget -show] 0] entryString
+    }
+    return $entryString
+}
+
+if 0 {
+    bind HiertableEditor <Control-t> {
+       tkEntryTranspose %W
+    }
+    bind HiertableEditor <Meta-b> {
+       %W text icursor [blt::Hiertable::PreviousWord %W insert]
+       %W text selection clear
+    }
+    bind HiertableEditor <Meta-d> {
+       %W delete insert [blt::Hiertable::NextWord %W insert]
+    }
+    bind HiertableEditor <Meta-f> {
+       %W text icursor [blt::Hiertable::NextWord %W insert]
+       %W text selection clear
+    }
+    bind HiertableEditor <Meta-BackSpace> {
+       %W delete [blt::Hiertable::PreviousWord %W insert] insert
+    }
+    bind HiertableEditor <Meta-Delete> {
+       %W delete [blt::Hiertable::PreviousWord %W insert] insert
+    }
+    # tkEntryNextWord -- Returns the index of the next word position
+    # after a given position in the entry.  The next word is platform
+    # dependent and may be either the next end-of-word position or the
+    # next start-of-word position after the next end-of-word position.
+    #
+    # Arguments:
+    # w -              The entry window in which the cursor is to move.
+    # start -  Position at which to start search.
+    
+    if {![string compare $tcl_platform(platform) "windows"]}  {
+       proc blt::Hiertable::NextWord {w start} {
+           set pos [tcl_endOfWord [$w get] [$w index $start]]
+           if {$pos >= 0} {
+               set pos [tcl_startOfNextWord [$w get] $pos]
+           }
+           if {$pos < 0} {
+               return end
+           }
+           return $pos
+       }
+    } else {
+       proc blt::Hiertable::NextWord {w start} {
+           set pos [tcl_endOfWord [$w get] [$w index $start]]
+           if {$pos < 0} {
+               return end
+           }
+           return $pos
+       }
+    }
+    
+    # blt::Hiertable::PreviousWord --
+    #
+    # Returns the index of the previous word position before a given
+    # position in the entry.
+    #
+    # Arguments:
+    # w -              The entry window in which the cursor is to move.
+    # start -  Position at which to start search.
+    
+    proc blt::Hiertable::PreviousWord {w start} {
+       set pos [tcl_startOfPreviousWord [$w get] [$w index $start]]
+       if {$pos < 0} {
+           return 0
+       }
+       return $pos
+    }
+}