### steadutil.tcl - procédures d'utilité générales pour l'editeurs stead
#
# voir aussi fichier macros.tcl
#
# Modif diam 30/11/99
#
# $Id:  $
#
#
########################################################################

package provide stead 2.0

## i -- retourne l'indentation courante
#
# retourne l'indentation courante (ce qui est insérer quand on
# tape <Tab>
# Cette procédure est utilisé dans les modes,
# en particulier avec les electric alias.
#
proc i {} {
  global EDITPREFS
  return $EDITPREFS(indent_string)
}

## insert_fill_lines { {STR "#"} {NL 1} {NC ""} {t .main.t}}
#
# insère une chaine "lines" telle que cette chaine complète $NL lignes
# (jusqu'à NC caractères) avec la chaine de séparation $STR :
# Toutes les options peuvent être omises :
#    STR : chaine à répéter (généralement un caractère) ("#" par défaut)
#    NC : longueur de ligne (Nb Colonne) ; défaut : EDITPREFS(fillcolumn) (72)
#    NL : Nombre de Lignes (défaut = 1)
#    t : nom du widget text (défaut : .main.t pour stead)
# xtext_pushState est appelée dans la procédure (pour undo)
#
# Exemple :
# "insert_fill_lignes"  produit :#######################################
# "insert_fill_lignes %"  produit :%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# "insert_fill_lignes - 75 2 .main.t" produit :----------------------------
#                                              ----------------------------
#
proc insert_fill_lines { {STR "#"} {NL 1} {NC ""} {w .main.t}} {

   global EDITPREFS
   if {"x$NC" == "x"} then {set NC $EDITPREFS(fillcolumn)}

   xtext_pushState

   # colonne contiendra le nbre de caracteres depuis le début de ligne
   set colonne [lindex [split [$w index insert]  .] 1]

   # compl le nombre de fois qu'il faut insérer $STR
   set compl [expr { int (($NC-$colonne)/[string length $STR])} ]

   set line ""

   # pour chaque ligne à insérer : on complete avec des $STR
   # puis on remplit d'espaces la ligne suivante jusqu'a $colonne
   for {set nl 1} {$nl <= $NL} {incr nl} {

      # i varie du point d'insertion à la fin de la ligne pleine :
      for {set i 1} {$i <=  $compl} {incr i} {
         append line $STR
      } ;# endfor

      append line \n

      # On commence la ligne suivante avec des espaces :
      for {set i 0} {$i < $colonne} {incr i} {append line " "}
   } ;# endfor

   $w insert insert $line
   xtext_markDirty $w
   # # # .main.t yview -pickplace insert
   $w see insert
   xtext_updateInsertPos $w
} ;# endproc insert_fill_lines

## return_fill_lines { {STR "#"} {NL 1} {NC ""}}
# idem que insert_fill_lines, mais retourne la chaine au lieu de l'insérer.
# La chaine "lines" telle que cette chaine complète $NL lignes
# (jusqu'à NC caractères) avec la chaine de séparation $STR :
# Toutes les options peuvent être omises :
#    STR : chaine à répéter (généralement un caractère) ("#" par défaut)
#    NC : longueur de ligne (Nb Colonne) ; défaut : EDITPREFS(fillcolumn) (72)
#    NL : Nombre de Lignes (défaut = 1)
#
proc return_fill_lines { {STR "#"} {NL 1} {NC ""} {w .main.t}} {

   global EDITPREFS
   if {"x$NC" == "x"} then {set NC $EDITPREFS(fillcolumn)}

   # colonne contiendra le nbre de caracteres depuis le début de ligne
   set colonne [lindex [split [$w index insert]  .] 1]

   # compl le nombre de fois qu'il faut insérer $STR
   set compl [expr { int (($NC-$colonne)/[string length $STR])} ]

   set line ""

   # pour chaque ligne à insérer : on complete avec des $STR
   # puis on remplit d'espaces la ligne suivante jusqu'a $colonne
   for {set nl 1} {$nl <= $NL} {incr nl} {

      # i varie du point d'insertion à la fin de la ligne pleine :
      for {set i 1} {$i <=  $compl} {incr i} {
         append line $STR
      } ;# endfor

      append line \n

      # On commence la ligne suivante avec des espaces :
      for {set i 0} {$i < $colonne} {incr i} {append line " "}
   } ;# endfor

   return $line
} ;# endproc return_fill_lines


## insert -- insère la chaine dans le texte a une position donnée
#
# insert la chaine $s dans le texte $w à une chaine a une position
# arbitraire (sans changer le point d'inertion):
# (avec checkpoint pour le undo)
#    exemple : insert $txt 1.0
#
#
proc insert { {s .main.t} {idx insert} {w .main.t} } {
    xtext_pushState
    set x [$w index $idx]
    $w insert $x $s
    xtext_markDirty $w
}



## stead:getIndent -- retourne l'indentation de la ligne courante
#
#
#
#
proc stead:getIndent {{w .main.t} {index insert} } {
    set indentPattern "^(\[ \t\]*)"
    set line [$w get "$index linestart" "$index lineend"]
    set indent ""
    regexp $indentPattern $line indent
    return ${indent}
} ;# endproc stead:getIndent

## stead:getIndentToInsert -- retourne l'indentation de la ligne courante
#
# Retourne une chaine composer de l'indentation de la ligne courante,
# auquelle on ajoute des espaces justqu'à l'insert
#
# ATTENTION : bug dans la reselection rectangulaire apres remplacement
#     Ce bug existait aussi dans le pipe via commande unix
#     mais pas dans le boite recherche/remplacement standard
#
proc stead:getIndentToInsert {{w .main.t} {index insert} } {
    set indent [stead:getIndent $w $index]
    while {[$w  compare \
            "$index linestart + [string length $indent]c" \
            < insert] \
    } {
        append indent " "
    } ;# endwhile

    return ${indent}
} ;# endproc stead:getIndent


## stripAllEndSpaces -- supprime tout espace final dans tout le texte
#
# todo (27/07/01) passer le nom de widget texte
#
proc stripAllEndSpaces {} {
    global stead
    set w $stead(text)

    set pat1 {[ \t]+\n}
    set pat2 \n

    xtext_replaceAll $w  -regexp $pat1 $pat2

}

## stead:showMetaComment -- affiche les métacommentaires
#
# Un métacommentaire représente un commentaire plus important
# que les autres. Il est identifié par une ligne commençant par
# l'expression réguliere metaPrefix.
#
# Si la patterne n'est pas précisée : affiche les métacommentaires
#
#
proc stead:showMetaComments { {rpat ""}} {
    global stead
    set w $stead(text)


    stead -text [xtext_grep $stead(text) $rpat]
}
#./
