################################################################################
# fichier de configuration Utilisateur "steadrc" :     -*-tcl-*-
#
# Pour rajouter (par exemple) un menu du nom de l'utilisateur
# lui permettant d'editer un certain nombre de fichiers qui lui appartiennent
#
#   Pour l'utiliser faire Config/reread User File
#   après l'avoir sauvegardé
################################################################################

# PREFERENCES UTILISATEUR 

# Ne rien modifier entre ces deux marqueurs : 
#      "PREFERENCES UTILISATEUR" et "FIN DES PREFERENCES UTILISATEUR"
# Ce texte serait écrasé à chaque sauvegarde des préférences
# (par le menu "Config/Save Current Preference")


   set EDITPREFS(accentmode) postAccentuation

   set EDITPREFS(highlightbg) #FF8
   set EDITPREFS(indent_string) {    }
   set EDITPREFS(prefix) {# }
   set EDITPREFS(print_command) {imprimer %F}

   set EDITPREFS(textfont) {lucidatypewriter 12 bold}

# FIN DES PREFERENCES UTILISATEUR  


######################################################################
# jedit:userhook - C'est dans cette procedure que la configuration 
# utilisateur doit etre declareee                               
######################################################################
proc jedit:userhook {} {
 
    # la variable globale stead(exe) contient le nom de l'executable
    global stead
     
    # la variable globale USER_FILE_LIST contient la liste de fichier a éditer
    # pour l'utilisateur
    set USER_FILE_LIST { 
      ~/.cshrc ~/.login ~/.logout ~/.exrc
      ~/.mailrc ~/.tkmailrc ~/.xsession
      ~/.Xmodmap ~/.Xresources
      ~/.tk/stead/steadrc ~/.twmrc ~/.fvwmrc
      ~/.newsrc ~/pp 
    }
    
    
    # la variable user contient le nom de l'utilisateur
    global env
    set user $env(USER)
    
    # si le menu $user existe, on le detruit 
    if [winfo exists .menu.$user] {
      destroy .menu.$user
    }
    
    # creation du bouton de menu $user activant le menu .menu.$user.m
    menubutton .menu.$user -text $user -menu .menu.$user.m
    
    # Pour afficher ce nouveau bouton en glissant sur la barre des menus
    # (incompatible avec tk4.0) :
    # global tk_version
    # if {[string match 3.* [set tk_version]]} {
    #    eval "tk_menuBar .menu [tk_getMenuButtons .menu] .menu.$user "
    # }
    if {![tk8]} {
       eval "tk_menuBar .menu [tk_getMenuButtons .menu] .menu.$user "
    }
    
    # creation du menu .menu.$user.m 
    menu .menu.$user.m
    
    # # Creation (sur demande) des menus pour les projets PIST et MOS4
    # .menu.$user.m add command -label "Menu PARPAING" \
    #     -command "mkMenuPARPAING"
    
    # Creation (sur demande) des menus pour les projets PIST
    .menu.$user.m add command -label "macro.tcl" -command {
          shell:edit $stead(userlib)/macros/macro.tcl
    }
    .menu.$user.m add separator
  
  
    .menu.$user.m add command -label "Menu Bookmark" -command "mkMenuBkm"
    .menu.$user.m add command -label "Menu Exut"     -command "mkMenuExut"
    .menu.$user.m add command -label "Menu PIST"     -command "mkMenuPist"
    .menu.$user.m add command -label "Menu Gred"     -command "mkMenuGred"
    .menu.$user.m add command -label "Menu PARPAING" -command "mkMenuPARPAING"
  
  
    .menu.$user.m add separator
    
    # remplissage du menu
    menu:addEditFilesToMenu .menu.$user.m $USER_FILE_LIST
    
    ##############################################################################
    # autres exemple de fonctionnalités bizares : couleurs
    ##############################################################################
    
    .menu.$user.m add separator
   
    foreach background { Yellow } {
        .main.t tag configure background:$background -background $background
        .menu.$user.m add command \
            -label "Background: $background" \
            -command [format {
                jedit:colours:clear_background
                   set sel_r [.main.t tag ranges sel]
                   for {set i 0} {$i < [llength $sel_r]} {incr i 2} {
                     set j [expr $i + 1]
                     .main.t tag add background:%s \
                          [lindex $sel_r $i] \
                          [lindex $sel_r $j]
                   } 
              } $background]
    }
  
    .menu.$user.m add command \
            -label "Background: Plain" \
            -command {jedit:colours:clear_background } 
  
    .menu.$user.m add separator
    foreach foreground {
        Magenta
    } {
        .main.t tag configure foreground:$foreground -foreground $foreground
        .menu.$user.m add command \
          -label "Foreground: $foreground" -command [format {
          jedit:colours:clear_foreground
          catch {
            .main.t tag add foreground:%s sel.first sel.last
          }
        } $foreground]
    }
    .menu.$user.m add command -label "Foreground: Plain" -command {
        jedit:colours:clear_foreground
    }
    .menu.$user.m add separator
    .menu.$user.m add command -label "Clear Colours in Selection" -command {
        jedit:colours:clear_foreground
        jedit:colours:clear_background
    }
    .menu.$user.m add separator
    
    .main.t tag configure font:bold \
        -font -*-new\ century\ schoolbook-bold-i-normal-*-24-*-*-*-*-*-iso8859-*
      
    .menu.$user.m add command \
        -label "Font: bold" -command [format {
           jedit:clear_font
           set sel_r [.main.t tag ranges sel]
           for {set i 0} {$i < [llength $sel_r]} {incr i 2} {
             set j [expr $i + 1]
             .main.t tag add font:%s [lindex $sel_r $i] [lindex $sel_r $j]
           } 
     } bold]
       
    .menu.$user.m add command -label "Font: Normal" -command {jedit:clear_font}
        
    # affichage du menu
    
    pack .menu.$user -in .menu -side left
    
    ######################################################################
    # Definition ou modification éventuelle de raccourcis clavier :
    ######################################################################
    
    # pour que la touche "TAB" donne une tabulation normale au lieu de la
    # chaine "indentstring" (voir preferences utilisateurs)
    # bind $stead(text) <Tab>    [list xtext_insert  $stead(text) "\t" ]
    
    # definition de la touche F1 : coller
    # bind $stead(text) <F1>     [list xtext_cut $stead(text)]
    
    # # definition de la touche F1 : insertion de "\'"
    # bind $stead(text) <F1>     [list xtext_insert $stead(text) {\'} ]
    # 
    
    # Lancement automatique des menu utilisateur
    mkMenuBkm
    
    # # PLANTE !!! CORRIGER LES PROC menu:makeEditSubmenuFromDirectory
    # 
    # mkMenuExut ; 
    
    mkMenuPist
    # mkMenuGred
    # mkMenuPARPAING
    
    userHookAlias
} 

## userHookAlias -- défini quelques alias utilisateur
# 
# 
proc userHookAlias {  } {
    
    # NE FONCTIONNE qu'avec stead2+ (nouvelle syntaxe) d'ou le catch
    # 
    # DE PLUS : CECI DEVIENT INTEGRE A STEAD (nouvelle version)
    # je ne conserve cela ici que pour utilisation avec ancien stead
    # et comme exemp^le 
    # 
    set err [catch {
        global stead
        
        # # Quelques caractere spéciaux en cas d'urgence (i.e mauvaise
        # # config du clavier ne permettant pas de les taper directement !
        # # 
        # electricAlias-def $stead(mode) tilda          ~
        # electricAlias-def $stead(mode) n              ~
        # 
        # # begin and end brace
        # electricAlias-def $stead(mode) beginbrace     {\{}
        # electricAlias-def $stead(mode) endbrace       {\{}
        
        electricAlias-def $stead(mode) bb             {\{}
        
        # electricAlias-def $stead(mode) eb             {\{}
        # 
        # # begin and end bracket
        # electricAlias-def $stead(mode) beginbracket   {\[}
        # electricAlias-def $stead(mode) endbracket     {\]}
        # electricAlias-def $stead(mode) br             {\[}
        # electricAlias-def $stead(mode) er             {\]}
        # 
        # # backslash
        # electricAlias-def $stead(mode) backslash      {\\}
        # electricAlias-def $stead(mode) bs             {\\}
        # electricAlias-def $stead(mode) /              {\\}
        # 
        # # diese = numbersign
        # electricAlias-def $stead(mode) numbersign     {#}
    } result]
    
    if {$err} {
        # Meme si cette procédure n'existe pas : je serai au courant
        # si elle est appelée un jour !
    
        stead:dialogue {
            "Erreur dans la proc userHookAlias du fichier utilisateur !"
        }
    }  ;# endif
    
}


######################################################################
# exemple de menu utilisateur (acces direct a certains fichiers)
######################################################################
proc mkMenuBkm {} {
global stead
    ######################################################################
    # creation eventuel d'un menu pist_work
    ######################################################################
    set public_html ~/public_html
    set bkm_dir ~/public_html/bm
  
    if {![file isdirectory $public_html]} {
        return
    }
    
    catch {destroy .menu.bkm}
    menubutton .menu.bkm -text Bkm -menu .menu.bkm.m
    
    # Pour afficher ce nouveau bouton en glissant sur la barre des menus
    global tk_version
    if {![tk8]} {
       eval "tk_menuBar .menu [tk_getMenuButtons .menu] .menu.bkm "
    }
    
    # creation du menu .menu.bkm.m 
    menu .menu.bkm.m
  
    # le fichier principal à éditer :
    .menu.bkm.m add command -label "edit main index.html"\
               -command "shell:edit $public_html/index.html "
               
    .menu.bkm.m add separator
  
    # définition de sous-repertoire à rajouter :
    set dirlist "
      $public_html/
      $public_html/ao319
      $public_html/bm
      $public_html/c++
      $public_html/dev
      $public_html/enseignement
      $public_html/in204
      $public_html/latex
      $public_html/lib
      $public_html/oc
      $public_html/oop
      $public_html/ro
      $public_html/roadef2001_fapp
      $public_html/stead
      $public_html/tcl
      $public_html/web
      $public_html/web/exemples/divers
      $public_html/web/proto
    "
    set dirlist [concat $dirlist [glob -nocomplain $public_html/mac/*]] 
    # remplissage du menu
    set i 0
    foreach dir $dirlist {
        menu:makeEditSubmenuFromDirectory .menu.bkm.m .menu.bkm.m.dir$i \
               $dir/*
        incr i
    }
    menu:addDestroyMenuCommand .menu.bkm "Détruire ce menu"
    
    .menu.bkm.m add separator
    
    # mes sous-repertoire préféré accessible directement (sans sous-menu)
    # mais ca prend TROP de place
    # FAIRE UNE PROCEDURE POUR CELA
    # set dir $public_html/bm
    # set files [lsort [glob -nocomplain $dir/*]]
  
    # foreach file $files {
    #   if ![file isfile $file] {continue}
    #   if {[string match *.o $file]} {continue}
    #   if {[string match bkm $file]} {continue}
    #   .menu.bkm.m add command -label "Edit $file"\
    #         -command "shell:edit $file "
    # }
    
    pack .menu.bkm -in .menu -side left
  
}

######################################################################
# exemple de menu utilisateur (acces direct a certains fichiers)
######################################################################
proc mkMenuExut {} {

  # Ce qui suit **n'est plus** utilisé car je préfère créer un sous menu.
  # 
  # # Crée un menu bouton ".menu.exut" (et le menu associé ".menu.exut.m"
  # # et y rajoute la commande d'édition des fichiers du répertoire
  # 
  # set exut_dir ~/doc/unix/exemples
  # menu:makeEditMenuFromDirectory  .menu.exut  Exut  $exut_dir/*
  
  
  # Crée un menu bouton ".menu.exut", et le menu associé ".menu.exut.m"
  # SANS fichier à éditer
  # 
  menu:makeEditMenuFromDirectory  .menu.exut  Exut  "PATTERN_BIDON"
  
  
  # On ajoute alors le sous-menu pour éditer les exemples :
  # 
  set dir ~/doc/unix/exemples
  menu:makeEditSubmenuFromDirectory \
        .menu.exut.m  .menu.exut.m.exut  $dir/*

  
  # On ajoute un séparateur
  .menu.exut.m add separator 
  
  # Crée un sous-menu ".menu.exutm.applis" pour éditer d'autre fichiers
  set applis_dir ~/doc/unix/applis
  menu:makeEditSubmenuFromDirectory \
        .menu.exut.m  .menu.exut.m.applis  $applis_dir/*
  
  
  # Crée un sous-menu ".menu.exutm.hots" pour d'autre fichiers
  set dir ~/work/gestion/hot
  menu:makeEditSubmenuFromDirectory \
        .menu.exut.m  .menu.exut.m.hots  $dir/*
  
  menu:addDestroyMenuCommand  .menu.exut  "Détruire ce menu"
  
}

######################################################################
# exemple de menu utilisateur (acces direct a certains fichiers)
######################################################################
proc mkMenuPARPAING {} {
global stead
  ######################################################################
  # creation eventuel d'un menu pist_work
  ######################################################################
  set parpaing ~/ro/parpaing/work/leda
  set flowFile ~/ro/monoroute/flow.cc
  if [file isdirectory $parpaing] {
  
     catch {destroy .menu.parpaing}
     menubutton .menu.parpaing -text parpaing -menu .menu.parpaing.m
     
     # Pour afficher ce nouveau bouton en glissant sur la barre des menus
     global tk_version
     if {![tk8]} {
        eval "tk_menuBar .menu [tk_getMenuButtons .menu] .menu.parpaing "
     }
     
     # creation du menu .menu.parpaing.m 
     menu .menu.parpaing.m

     .menu.parpaing.m add command -label "edit GNUmakefile"\
                -command "shell:edit $parpaing/compil/GNUmakefile "
     .menu.parpaing.m add command -label "edit parpaing.cc"\
                -command "shell:edit $parpaing/compil/parpaing.cc "
     .menu.parpaing.m add command -label "edit bench.cc"\
                -command "shell:edit $parpaing/compil/bench.cc "
                
     .menu.parpaing.m add separator
     .menu.parpaing.m add command -label "edit compil/run.log"\
                -command "shell:edit $parpaing/compil/run.log "
     .menu.parpaing.m add command -label "edit tests/parpaing.tes"\
                -command "shell:edit $parpaing/tests/parpaing.tes "
                
     .menu.parpaing.m add separator
     .menu.parpaing.m add command -label "edit listings.tex"\
                -command "shell:edit $parpaing/doc/listings.tex "
     
     .menu.parpaing.m add separator
     .menu.parpaing.m add command -label "edit monoroute/flow.cc"\
                -command "shell:edit \
                     $flowFile "
     .menu.parpaing.m add separator
     
     # définition de fichier à rajouter :
     set dirlist "
       $parpaing/
       $parpaing/compil
       $parpaing/listings
       $parpaing/tests
       $parpaing/doc
     "
     set dirlist [concat $dirlist [glob -nocomplain $parpaing/lib/*]] 
     # remplissage du menu automatiques
     set i 0
     foreach dir $dirlist {
         .menu.parpaing.m add cascade -label $dir -menu .menu.parpaing.m.dir$i
         menu .menu.parpaing.m.dir$i
         set files [lsort [glob -nocomplain $dir/*]]
         foreach file $files {
           if ![file isfile $file] {continue}
           if {[string match *.o $file]} {continue}
           if {[string match parpaing $file]} {continue}
           .menu.parpaing.m.dir$i add command -label "Edit $file"\
                 -command "shell:edit $file "
         }
         incr i
     }
     pack .menu.parpaing -in .menu -side left
  }
  
}

######################################################################
# autre exemple de menu utilisateur (acces direct a certains fichiers)
######################################################################
proc mkMenuPist {} {
global stead
  ######################################################################
  # creation eventuel d'un menu pist_work
  ######################################################################
  set pist ~/projets/pist
  if [file isdirectory $pist] {
  
     catch {destroy .menu.pist}
     menubutton .menu.pist -text pist -menu .menu.pist.m
     
     # Pour afficher ce nouveau bouton en glissant sur la barre des menus
     global tk_version
     if {![tk8]} {
        eval "tk_menuBar .menu [tk_getMenuButtons .menu] .menu.pist "
     }
     
     # creation du menu .menu.pist.m 
     menu .menu.pist.m
     
     .menu.pist.m add command -label "exec mkpistindex | stead"\
            -command "stead:execExternalTclScript $pist/bin/mkpistindex "
     
     .menu.pist.m add separator
     
     # définition de fichier à rajouter :
     set dirlist "
       $pist/
       $pist/bin
       $pist/doc
       $pist/lib
     "
     set dirlist [concat $dirlist [glob -nocomplain $pist/lib/*]] 
     
     
     # remplissage du menu
     set i 0
     foreach dir $dirlist {
         menu:makeEditSubmenuFromDirectory .menu.pist.m .menu.pist.m.dir$i \
                $dir/*
         incr i
     }
     menu:addDestroyMenuCommand .menu.pist "Détruire ce menu"
     
     pack .menu.pist -in .menu -side left
  }
  
}

######################################################################
# autre exemple de menu utilisateur (acces direct a certains fichiers)
######################################################################
proc mkMenuGred {} {
global stead
  ######################################################################
  # creation eventuel d'un menu gred_work
  ######################################################################
  set gred ~/projets/gred
  if [file isdirectory $gred] {
  
     menubutton .menu.gred -text gred -menu .menu.gred.m
     
     # Pour afficher ce nouveau bouton en glissant sur la barre des menus
     global tk_version
     if {![tk8]} {
        eval "tk_menuBar .menu [tk_getMenuButtons .menu] .menu.gred "
     }
     
     # creation du menu .menu.gred.m 
     menu .menu.gred.m
     
     
     # définition de fichier à rajouter :
     set dirlist "
       $gred/
       $gred/bin
       $gred/doc
       $gred/lib
       $gred/samples
       $gred/local
     "
     # remplissage du menu
     set i 0
     foreach dir $dirlist {
         .menu.gred.m add cascade -label $dir -menu .menu.gred.m.dir$i
         menu .menu.gred.m.dir$i
         set files [lsort [glob -nocomplain $dir/*]]
         foreach file $files {
           if ![file isfile $file] {continue}
           # if [string match *~ $file] {continue}
           .menu.gred.m.dir$i add command -label "Edit $file"\
                 -command "shell:edit $file "
         }
         incr i
     }
     pack .menu.gred -in .menu -side left
  }
}

# ./
