#f admin.tcl - gestion des fichiers systemes

# $Id :            $
# $Author :        $
# $Date :          $
# $Revision :      $
# $Name :          $
# $Source :        $

package provide stead 2.0


## stead:searchTclProc -- cherche la procédure tcl spécifiée
# 
# Si le nom de la procédure recherchée n'est par précisée, 
# c'est le contenu d la sélection qui sera utilisé
# 
# La recherche s'effectue d'abord dans le fichier édité
# puis (si introuvable) dans le fichier donné par le tableau 
# auto_index
# 
# Probleme : meme la recherche dans le fichier courant ne fonctionne plus !
# 
#     /mnt/big/home/diam/work/tcl/stead/bin/stead 
#         -mode auto 
#         -ins {} 
#         -cdf 0 
#         -eval {} 
#         -source {} 
#         -command {
#             xtext_selectFoundLine .main.t {\n[ \t]*proc[ \t]*$procName[ \t]}
#         } 
# 
proc stead:searchTclProc { w  {procName ""}} {
    
    global auto_index
    
    # Permettra de distinguer si si cette procédure est appelée pour 
    # chercher la sélection, ou une proc spécifiés en parametre
    set searchForSel 0
    if {![string length $procName]} {
        set sel [xtext_getSel $w]
        if {"x$sel" == "x"} {
            stead:log "Please select procedure name"
            return
        } 
        set procName $sel
        set searchForSel 1
    }
    

    stead:log "Searching procedure $procName"
    
    set rpat     {^[ \t]*proc[ \t]+$procName[ \t]}
    set rpat [subst -nocommands -nobackslashes $rpat]
    
    set idx [$w search -regexp  -count count $rpat 1.0]

    if {[string length $idx]} {
        stead:log "procedure $procName found in this file" 

        # Est-ce souhaitable de changer l'insert ? créer option ?
        $w mark set insert $idx
        $w see insert
        xtext_updateFocusIn $w
        
        xtext_applyShortHighlight $w "$idx linestart" "$idx lineend"
        
    } else {
        if {[catch {set file [lindex $auto_index($procName) 1] }]} {
            stead:log "procedure $procName not found" 
        } else {
            if {$searchForSel} {
                stead:log "Opening file $file"
                stead -eval [list  stead:searchTclProc $w  $procName]  $file 
            } {
                stead:log "Avoid recursif call !"
            }
            
        }
    }
    
}

## te:cmd:show_procs - donne la liste des procedures et de leur valeur
# 
proc te:cmd:show_procs {} {
   
   global stead

   set procs_name [lsort [info procs]]
   foreach proc $procs_name {
     append result "###########\n"
     append result "proc $proc \{[info args $proc]\} \{[info body $proc]\}\n"
   }   
   
   # ceci fonctionne :
   #    stead -text "popo kjlkjh"
   # mais pas ceci (parametre trop long !!!)
   #    stead -text  $result
   # ni ceci !!!???
   #    stead -command "insert .main.t $result"
   
   # Alors je bidouille en attendant la refonte ! file_write
   # exec cat > /tmp/all_stead_proc.tcl << $result 
   # stead /tmp/all_stead_proc.tcl
   # after 2000 exec rm /tmp/all_stead_proc.tcl
   set tmpFile /tmp/all_stead_proc.tcl
   file_write $tmpFile  $result 
   stead $tmpFile
   after 2000 [list file delete $tmpFile]
   
}

## te:cmd:show_globals - donne la liste des variables globales et de leur
##                       valeur
# 
# diam 23/07/01 : c'est HORRRIBLE : à refaire propre
#   éventuellement décomposer et faire quelques "eval"
# 
proc te:cmd:show_globals {} {
    global stead
    global env
    set globals [lsort [info globals]]
    eval global [split $globals]
    set i 2
    foreach var $globals {
        if {[catch {
                set value [set $var]
                append result "set $var \{$value\}\n"
            } ]
              } {
            if {[catch {
                    if {"$var" != "auto_index"} {
                      foreach el [array names $var] {
                        set v ${var}\($el\)
                        set value [set $v]
                        append result "set $v \{$value\}\n"                    
                      }
                    }
                  }
               ]
            } {
                 append result "$var not defined yet\n"
            }
        }
    }
    stead -text $result 
}

## te:cmd:mk_admin_menu - additions du menu pour administrer stead
# 
proc te:cmd:mk_admin_menu {} {
    global stead
    global HOME env 
    global tk_version
    
    # Unique IDentifier (automaticaly update buy a trace procedure)
    global U
    
    set w $stead(text)
    
    if [winfo exists .menu.te] {
      destroy .menu.te
    }
  
    menubutton .menu.te -text {admin} -menu .menu.te.m
    
    menu .menu.te.m -tearoff on  
  
    .menu.te.m add separator
    
    # Spécification de menu d'édition
    # 
    #  type label                     gpatterne
    # 
    set editSpec {
       file bin/stead                 $stead(exe)
       file lib/stead/core/main.tcl   $stead(install)/lib/stead/core/main.tcl
       file lib/stead/core/build.tcl  $stead(install)/lib/stead/core/build.tcl
       sep  ----------------------    ----------------------
       file index.html                $stead(install)/doc/index.html
       file README                    $stead(install)/doc/README
       file CHANGES                   $stead(install)/doc/CHANGES
       file TODO                      $stead(install)/doc/TODO
       file BUG                       $stead(install)/doc/BUG
       file adm/todo_general.txt      $stead(install)/adm/todo_general.txt
       sep  ----------------------    ----------------------
       dir  adm/...                   $stead(install)/adm/*
       dir  adm/modes_exemples/...    $stead(install)/adm/modes_exemples/*
       sep  ----------------------    ----------------------
       dir  bin/...                   $stead(install)/bin/*
       sep  ----------------------    ----------------------
       dir  "lib/stead/core/ (A...i)" $stead(install)/lib/stead/core/\[A-i\]*
       dir  "lib/stead/core/ (j...z)" $stead(install)/lib/stead/core/\[j-z\]*
       dir  lib/stead/locale/...      $stead(install)/lib/stead/locale/*
       dir  lib/stead/xtext/...       $stead(install)/lib/stead/xtext/*
       dir  lib/stead/xentry...       $stead(install)/lib/stead/xentry/*
       sep  ----------------------    ----------------------
       dir  \$stead(install)/*        $stead(install)/*
       dir  etc/...                   $stead(install)/etc/*
       dir  lib/modes/...             $stead(install)/lib/modes/*
    }
    #    dir  lib/tcllib_EXTRAIT/...    $stead(install)/lib/tcllib_EXTRAIT/*
    stead:makeEditMenuFromSpecs .menu.te.m [subst $editSpec]
    
    
    # 
    # Construction de deux menus doublement-hierachique pour les 
    # librairie pist et tcllib
    # EN FAIRE UNE PROCEDURE
    # 
    
    .menu.te.m add separator
    # set otherLibs {lib/pist lib/tcllib_EXTRAIT}
    set otherLibs {lib/pist lib/tcllib}
    
    foreach lib $otherLibs  {
        set libMenu [menu .menu.te.m.$lib]
        .menu.te.m add cascade -label "Edit $lib/..." -menu $libMenu
          
        foreach pkg  [glob -nocomplain  $stead(install)/$lib/*]  {
           if {![file isdir $pkg]} {
               continue
           }  ;# endif
           
           set pkgName [file tail $pkg]
           set pat {(.*)-[0-9]*[.][0-9]*}
           regexp $pat [file tail $pkg] all pkgName
           menu:makeEditSubmenuFromDirectory2 $libMenu  \
                $libMenu.$pkgName "Edit $pkgName/..."   $pkg/*.tcl
           
        }
    } 
    
    .menu.te.m add separator
              
    menu:makeEditSubmenuFromDirectory2 .menu.te.m  \
          .menu.te.m.$U  "doc"   $stead(install)/doc/*
  
    menu:makeEditSubmenuFromDirectory2 .menu.te.m  \
          .menu.te.m.$U  "doc/guide"   $stead(install)/doc/guide/*
    
    menu:makeEditSubmenuFromDirectory2 .menu.te.m  \
          .menu.te.m.$U  "doc/ref"   $stead(install)/doc/ref/*
  
    menu:makeEditSubmenuFromDirectory2 .menu.te.m  \
          .menu.te.m.$U  "doc/old"   $stead(install)/doc/old/*
  
  
  
    .menu.te.m add separator
    
    .menu.te.m add command -label {Show MetaComments (##...)} \
          -command stead:showMetaComments
    .menu.te.m add command -label {Show Globals} \
          -command {te:cmd:show_globals}
    .menu.te.m add command -label {Show Procedures} \
          -command {te:cmd:show_procs}
     
    .menu.te.m add separator  
    
    .menu.te.m add command -label "Search selected TCL proc" \
          -command {stead:searchTclProc $stead(text)}   
      
    .menu.te.m add command -label "exec bin/mkpkgindex (Package)" \
          -command {stead:editUnixResult $stead(install)/bin/mkpkgindex }   
    
  
    pack append .menu .menu.te right
}



## admin -- crée le ou les menu d'administration...
# 
# 
# 
proc admin {} {
    te:cmd:mk_admin_menu
}
