###########################################################################
# special_keys.tcl : 
#       gestion des touches speciales (tabulation, return et espace)
# 
# 10/09/00 diam : prévoir le rajout de la gestion de <Delete> ou de 
#       <Backspace> pour effacer l'indete d'une seule touche...)
# 
###########################################################################

package provide xtext 2.0

## stead:tabkey -- do whatever tab does (indent, whatever)
# 
# xx/xx/98 diam modif :simulation de tabulation par un nombre d'espace 
#       variable dépendant de la  position de l'insert
# 
proc stead:tabkey {{w .main.t}} {
  global EDITPREFS

  if {[info procs stead:tabkey_pre_hook] != {}} {
    stead:tabkey_pre_hook $w
  }
  #
  if {[info procs stead:tabkey_inside_hook] != {}} {
    stead:tabkey_inside_hook $w
  } else {
    if {[regexp {[ ]+} $EDITPREFS(indent_string)]} {
    
       # On cherche la colonne courante du point d'insertion
       set ins [.main.t index insert]    ;# retourne par exemple 63.6)
       set col [lindex [split $ins .] 1] ;# retourne la colonne courante : 6

       # Si la chaine d'indentation ne contient que des espaces,
       # on ajoute N espaces pour obtenir un multiple de la longueur 
       # d'indentation  
       set indent_length [string length $EDITPREFS(indent_string)]
       set N [expr $indent_length - $col % $indent_length]
       set str [string repeat " " $N]
       xtext_insert $w -string $str
       
    } else {

       # xtext_insert $w -string "\t"
       xtext_insert $w -string "$EDITPREFS(indent_string)"
       
    }
    xtext_markDirty $w
  }
  #
  if {[info procs stead:tabkey_post_hook] != {}} {
    stead:tabkey_post_hook $w
  }
}

## stead:spacebar - do whatever space does (abbrev, line breaking, whatever)
# 
proc stead:spacebar {{w .main.t}} {
    global EDITPREFS
    if {[info procs stead:spacebar_pre_hook] != {}} {
        stead:spacebar_pre_hook $w
    }
    #
    if {[info procs stead:spacebar_inside_hook] != {}} {
        stead:spacebar_inside_hook $w
    } else {
        xtext_insert $w -string " "
        stead:autobreak_hook $w
    }
    #
    if {[info procs stead:spacebar_post_hook] != {}} {
        stead:spacebar_post_hook $w
    }
}



## stead:returnkey - do whatever return does (indentation, etc.)
# 
# 10/09/00 diam : A AMELIORER NETTEMENT :
#    - si on est dans un commentaire (le prefix débute la ligne courante)
#      alors insérer ce même préfix en début de la ligne suivante
#    - si une preference correspondante est positionnée : vire les 
#      espaces finaux des du voisinage (ou réserver cela à la sauvegarde ?)
#    - renommer jedit_returnkey_insert par exemple en 
#      xtext($w,lastReurnkeyInsert)
#      et eventuellement esayer de trabsfere ceci au widget xtext plutot 
#      qu'a stead
# 
# 
proc stead:returnkey {{w .main.t}} {

     global jedit_returnkey_insert
   
     if {[info procs stead:returnkey_pre_hook] != {}} {
          stead:returnkey_pre_hook $w
   
     }
     if {[info procs stead:returnkey_inside_hook] != {}} {
          stead:returnkey_inside_hook $w
     } else {
          # si le texte est propre ou si on a change de position par rapport au 
          # return precedent, on effectue un checkpoint
          # on marque le texte "sale"
          # on efface la selection si elle existe
      
          append jedit_returnkey_insert {}
          if {"x$jedit_returnkey_insert" == "x"} {
               set jedit_returnkey_insert [$w index "insert -1 chars"]
          }
      
          if {![xtext_isDirty $w] || \
                        ($jedit_returnkey_insert != [$w index insert])} {  
               xtext_pushState
          }
          xtext_markDirty $w
          xtext_delete $w -push 0 -style 0  sel 

          xtext_repeat $w {
                $w insert insert \n
                set jedit_returnkey_insert [$w index insert]
                $w see insert
          }
          stead:autoindent_hook
     }
     #
     if {[info procs stead:returnkey_post_hook] != {}} {
          stead:returnkey_post_hook $w
     }
}
# ./


