#f sh-main.tcl - mode for editing sh code
# 
# Historique 
#   02/12/01 (Maurice Diamantini) : premier version, 
#   



## mode_sh_init --
# 
proc mode_sh_init {} {

    global stead
    global EDITPREFS
    
    set EDITPREFS(prefix) "# "
    set EDITPREFS(autobreak) 0
    set EDITPREFS(autoindent) 1
    
    # Une liste de fichiers fréquemment édités (à personaliser par 
    # l'utilisateur)
    # On peut utiliser les métacaracteres ou les variables d'environnement
    set stead(mode,sh,favorFiles) [list   \
       file  "LISTE A COMPLETER"   fichierBidon.sci                          \
       file  "Mon .cshrc"    $::env(HOME)/.cshrc                             \
       sep   -----------     ----------------------                          \
       file  lmiSolver.sci   \
                 $::stead(install)/adm/modes_exemples/scilab_lmisolver.sci   \
       dir   modes_exemples/*    $::stead(install)/adm/modes_exemples/*      \
    ]       
    
    ####################################################################
    # 
    # Ce qui suit sera refondu !
    # 
    # Définition du menu de navigation A REFONDRE
    # 
    set ::TE_MODE_SEARCH_STRING    {(^|\n)##\s+(\w+[^\n]*)}
    set ::TE_MODE_NAVIG_SHOW_TEXT  "titre"

    proc te:mode:navig_sort_hook {list} {
        # Exemple : tri par ordre alphabetique
        # return [lsort -command te:mode:sort_command $list]
        
        # Exemple : aucun tri (pour conserver l'ordre d'apparition)
        return  $list
    }
}

## mode_sh_getHelp -- 
# 
# 
proc mode_sh_getHelp {  } {
    set txt {\
        Mode sh : aucune aide pour l'instant !
    }
    return $txt
}


## mode_sh_defineStyles -
# 
proc mode_sh_defineStyles {} {
    global stead
    global xtext
    upvar #0 stead(text) w
    
    # On commence par supprimer tout style précédent du jeu "sh"
    xtext_style $w delete sh

    # J'en ai mare des tabulations qu'on trouve dans le code source
    # et qui perturbe l'indentation
    set COLOR_TAB 1
    if {$COLOR_TAB} {
        xtext_style $w define $stead(mode) {
            tabulation {
                -type regexpLight
                -pat {\t}
                -config {
                    -background "#FDD"
                }
            }
        }
    }
    
    # Style dQuote  : guillemets standard (doubles ou simples)
    # 
    xtext_style $w define sh  sdQuotes {
        -type regexpLight
        -config {-foreground #700}
        -pat {(".*?")}
    }
    # Style odQuote  : guillemets "doubles" ophelines sur une ligne
    # 
    xtext_style $w define sh orphQuotes {
        -type regexpLine
        -config {-foreground red -font bold}
        -pat {^(?:[^"]*)(")(?:[^"]*)$}
    }
    
    # "keylist1"  mots clé important du Bshell
    # 
    xtext_style $w define sh keylist1 {
        -type wordListLight
        -config {-foreground red}
        -values {
            exec exit
            continue  break return
        }
    }
    # "keylist2"  mots clé courant du Bshell
    # 
    xtext_style $w define sh keylist2 {
        -type wordListLight
        -config {-foreground blue}
        -values {
            eval 
            do done 
            for in 
            while
            shift
            if then elif  else fi 
            set unset export  
            case esac
            test
        }
    }

    # Style backquote  : 
    # 
    xtext_style $w define sh backquote {
        -type regexpLight
        -config {-foreground red}
        -pat {(`)}
    }
    
    # variables spéciales prédéfinies par make : $@ , $(?D) ...
    xtext_style $w define sh specVar {
        -type regexpLight
        -config {-foreground blue}
        -pat {(\$[0-9#@\?\*])}
    }

    # "comment" Commentaire BournShell : N'EST PAS précédé par par ";" !
    set pat    {(?:^|[^\B\$])(#.*)}
    set config  "-foreground #070 "
    set stead(tagSpec,shell_comment) [list  \
        -type   regexpLine                  \
        -pat    $pat                        \
        -config $config                     \
    ]
    xtext_style $w define sh comment   $stead(tagSpec,shell_comment)    

    # style "separator" pour les lignes ne contenant que des caractères 
    # identiques (au moins 50)
    xtext_style $w define sh separator {
        -type   regexpLine              
        -pat    {^\s*([-_@#&/\Ba-zA-Z0-9]{50,100})+$}                   
        -config {-foreground #070 -background yellow}               
    }
    
    # Les titres sont des lignes commençant par les "metaPrefix"
    # (par défaut c'est "^##")
    # 
    xtext_style $w define sh  title [list     \
        -type regexpLight                       \
        -config {-foreground red}               \
        -pat "^$xtext($w,metaPrefix)\[^#\]*\$"       \
    ]
    
    # Style error2  : espace apres un backslash en fin de ligne
    xtext_style $w define sh error_bs {
        -type regexpLight
        -config {-background #FAA}
        -pat {(\B\s+)$}
    }
    # Style error1  : espace en fin de ligne (après un caractère autre
    # qu'un espace ou que dièse) (car "# " est fréquent est correct !).
    # ATTENTION : ceci est agressif car actif à chaque mot pendant la frappe 
    # d'une phase !=> prévoir une option 
    # e.g. : MODE_SH_COLOR_ACTIVATE_ERROR_FINAL_SPACE
    xtext_style $w define sh error_final_space {
        -type regexpLight
        -config {-background #FAA}
        -pat {[^# \t]+([ \t]+$)}
    }

    # Espace autour du signe "=" interdit dans une affectation
    # (erreur si espace avant, ou apres, ou les deux)
    xtext_style $w define sh error_equal {
        -type regexpLight
        -config {-background #FAA}
        -pat {([ \t]+=[ \t]+|[ \t]+=|=[ \t]+)}
    }

    xtext_style $w enable sh
    
}


## mode_sh_defineSabbrev -
# 
proc mode_sh_defineSabbrev {} {

    # Voir le mode tcl pour des exemples
    
}

## mode_sh_defineMenu_sh - défini le menu principale de sh
# 
# 
proc mode_sh_defineMenu_sh {} {
    global stead
    
    set menubutton  .menu.$stead(mode)
    set m           .menu.$stead(mode).m
    
    if {[winfo exists $menubutton]} {
        destroy $menubutton
    }
    # Création d'un bouton de menu (ce qu'on voit)
    menubutton $menubutton \
            -text [string totitle $stead(mode)] \
            -menu .menu.$stead(mode).m
            
    # On positionne ce bouton
    pack append .menu $menubutton left
  
    # Création d'un menu (ce qui ce déroule quand on clique sur le menubutton)
    set m [menu $m]
    # 
    ####################################################################
    

    
    $m add command \
            -label {search selected proc (in this file or in this stead)} \
            -command {stead:searchtextProc $stead(text)}
   
    $m add command \
            -label {Lancer wish sur ce fichier} \
            -command {mode_text_execWish}
            
              
    $m add separator
    $m add command \
            -label "Aide du mode sh"  \
            -command [list stead -readonly 1 -text [mode_sh_getHelp] ]
    
    

    ####################################################################
    # Création d'un menu pour éditer les fichiers modèles de ce mode
    menu $m.modeles
    $m add cascade  -label {Fichiers modèles poue le mode sh}  \
                    -menu "$m.modeles"
    stead:makeEditMenuFromSpecs $m.modeles $stead(mode,sh,favorFiles)
    
    
    ## Sous menu pour les fichiers Scilab du répertoire courant
    menu:makeEditSubmenuFromDirectory2  $m $m.[xtcl_uid]  \
           "Fichier du répertoire courant"  \
           [file dirname $stead(file)]/*
    


}
## mode_sh_defineMenu_templates - défini le menu Templates de sh
# 
# 
proc mode_sh_defineMenu_templates {} {
    global stead
    
    set menubutton  .menu.template
    set m           .menu.template.m
    
    if {[winfo exists $menubutton]} {
        destroy $menubutton
    }
    # Création d'un bouton de menu (ce qu'on voit)
    menubutton $menubutton  \
            -text Templates \
            -menu $m
            
    # On positionne ce bouton
    pack append .menu $menubutton left
  
    # Création d'un menu (ce qui ce déroule quand on clique sur le menubutton)
    set m [menu $m]
    

    $m add command \
            -label "Insérer un separateur \"#...\"" \
            -command {separator 1}
    
    $m add command \
            -label {proc...} \
            -command {electricAlias-wrap proc}
    
    $m add separator
    $m add command \
            -label {Switch multiplatform} \
            -command {insert_switch_platform_header}
                   
    $m add separator
    $m add command \
            -label {En-tête "#!..wish"} \
            -command {insert_wish_header 1.0}
    $m add command \
            -label {Add library  ~/lib/text"} \
            -command {insert_library ~/lib/text}
    $m add command \
            -label {Add library  ~/lib/tk"} \
            -command {insert_library ~/lib/tk}
    
    $m add separator
    
    $m add command \
            -label {boucle for} \
            -command {electricAlias-wrap for}
    $m add command \
            -label {boucle foreach} \
            -command {electricAlias-wrap foreach}
    $m add command \
            -label {boucle while} \
            -command {electricAlias-wrap while}
                   
    $m add command \
            -label {if} \
            -command {electricAlias-wrap if}
    
    $m add separator
    
    $m add cascade  -label Alias  -menu $m.alias
    menu $m.alias
    foreach alias [electricAlias-softNames] {
        $m.alias add command   \
             -label $alias \
             -command "electricAlias-insert $stead(text) [te:no_interp $alias]"
    }

    $m add cascade  -label Alias2  -menu $m.alias2
    menu $m.alias2
    foreach alias [electricAlias-softNames] {
        # On n'ajoute que les alias commençant par un majuscule (filtrage)
        set tmp [string index $alias 0]
        if {$tmp == [string toupper $tmp]} {
            $m.alias2 add command \
                -label $alias    \
                -command "electricAlias-insert $stead(text) $alias"
        }
    }

}
## stead:modeStart_sf - lancement du mode tcl
# 
# 
proc stead:modeStart_sh {} {
    mode_sh_init
    mode_sh_defineSabbrev
    mode_sh_defineMenu_sh
    mode_sh_defineMenu_templates
    mode_sh_defineStyles
}
## stead:modeCleanup -- nettoyage en cas de changement de mode
# 
proc stead:modeCleanup {} {
    global stead
    upvar 0 stead(text) w
    te:mode:destroy_menu $stead(mode)
    te:mode:destroy_menu templates
    xtext_style $w delete $stead(mode)
}
stead:modeStart_sh
#./

