#!/bin/sh
# La ligne suivante est un commentaire TK mais une commande shell \
	exec wish "$0" "$@" 
#-----------------------------------------------------------------------------
#
#  pgftk : Petit Gestionnaire de Fichiers - Version 1.0 (necessite Tcl/Tk >= 8.0)
#
#          J'utilise beaucoup ce petit programme. J'espere qu'il vous
#          sera egalement utile. Merci de me faire part de vos commentaires.
#
#  1999/2001 - Claude MAHE  	mailto:claude.mahe at wanadoo.fr
#				http://www.uppp.free.fr
#
#-----------------------------------------------------------------------------

#---------- Definir les bulles d'aides
proc Bulle_Aide {} {
	bulleaide::for .fradio.cde.sav "Sauver la liste dans un fichier"
	bulleaide::for .fradio.cde.f5  "Ractualiser la liste"
	bulleaide::for .haut.dirname   "Rpertoire  afficher"
	bulleaide::for .haut.chgdir    "Choisir un nouveau rpertoire"
	bulleaide::for .haut.select    "Filtre pour slection fichiers"
	bulleaide::for .fradio.cde.rm  "Supprimer"
	bulleaide::for .fradio.cde.cp  "Copier"
	bulleaide::for .fradio.cde.mv  "Renommer/Dplacer"
	bulleaide::for .fradio.cde.edt "Editer"
	bulleaide::for .fradio.cde.cmd "Excuter une commande"
	bulleaide::for .entete.bnom    "Cliquer pour trier sur le nom"
	bulleaide::for .entete.bdate   "Cliquer pour trier sur la date"
	bulleaide::for .entete.btaille "Cliquer pour trier sur la taille"
	bulleaide::for .entete.buser   "Cliquer pour trier par user"
	bulleaide::for .fradio.cde.prt "Imprimer fichiers slectionns"
}	


#--------- Routine d'affichage pour renommer
proc Cmd:cp:mv {commande} {
   global DIRNAME SELECT item newobj repert cde DIRSELECT f frafic lstfic FCIB
  
   if { $commande == "cp" } {
      set txtcde "$commande - copier de : "
      set cde "cp"
   } else {
      set txtcde "$commande - renommer et/ou deplacer de : "
      set cde "mv"
   }
   
   set repert $DIRNAME
  
   toplevel .wcpmv 
   wm title .wcpmv "$txtcde $DIRNAME"
   
   Centrer wcpmv
  
  #----- Creation des 3 zones de frames (repertoire, fichiers, boutons)
  frame .wcpmv.ftop -relief raised -bd 1
  pack .wcpmv.ftop  -side top -fill both
  frame .wcpmv.fmil -relief raised -bd 1
  pack .wcpmv.fmil -side top -fill both -expand true
  frame .wcpmv.fbot -relief raised -bd 1
  pack .wcpmv.fbot  -side bottom -fill both
  
   #----- Creation frame pour nom repertoire cible
   label .wcpmv.ftop.txtdirc -text "Vers rpertoire Cible :"
   entry .wcpmv.ftop.dirc -relief sunken -textvariable repert -width 30 -bg whitesmoke
   button .wcpmv.ftop.prevdir -image idir -command { set typdsp 2;Windir}
   pack .wcpmv.ftop.txtdirc .wcpmv.ftop.dirc .wcpmv.ftop.prevdir -side left -padx 2m -pady 2m
 
  #------- Creer un "canvas scrollable" 
   canvas .wcpmv.fmil.canvas -width 10 -height 10 -yscrollcommand [list .wcpmv.fmil.yscroll set] 
   scrollbar .wcpmv.fmil.yscroll -orient vertical -command [list .wcpmv.fmil.canvas yview] 
   pack .wcpmv.fmil.yscroll -side right -fill y 
   pack .wcpmv.fmil.canvas  -side left  -fill both -expand true 
 
   set frafic [frame .wcpmv.fmil.frafic -bd 0] 
   .wcpmv.fmil.canvas create window 0 0 -anchor nw -window $frafic  

   set j 0
  
   #------- Boucle de placement des champs (textes, mots-clefs, zones de saisie)
   foreach fichier $lstfic {
         if { $fichier == "%NONE%" } {continue}
          
         set obj [string tolower $fichier]
	 incr j
	 
	 frame $frafic.$j 
         label $frafic.$j.src  -justify left -relief flat -text "Nom Source :" -width 12 -anchor w
         label $frafic.$j.ents -relief sunken -text $fichier -width 20 -anchor w
 	 
	 set FCIB($j) $fichier
         entry $frafic.$j.entc -relief sunken -textvariable FCIB($j) -highlightcolor red -bg whitesmoke -width 20
 	 label $frafic.$j.cib -justify left -relief flat -text "Nom Cible :" -width 10 -anchor w
	 	 
         pack $frafic.$j -side top -padx 1m -pady 1m -anchor w -fill both
         pack $frafic.$j.src $frafic.$j.ents $frafic.$j.cib $frafic.$j.entc -side left -expand 1 -fill both -padx 2m
    }
   
      
    set childfrafic [lindex [pack slaves $frafic.$j] 0] 
    tkwait visibility $childfrafic 
 
    set incr   [winfo height $childfrafic] 
    set width  [winfo width $frafic] 
    set height [winfo height $frafic] 
    .wcpmv.fmil.canvas config -scrollregion "0 0 $width $height" 
    if {$height > 15 * $incr } {set height [expr 15 * $incr]}
    .wcpmv.fmil.canvas config -width $width -height $height
    
   button .wcpmv.fbot.ok -text OK -command {
               set repert [CvtVar $repert]
               CopierObj $repert
              }
   button .wcpmv.fbot.abandon -text Annuler -relief ridge -command {destroy .wcpmv}
   pack .wcpmv.fbot.ok  .wcpmv.fbot.abandon -side left -padx 2m -pady 2m -ipadx 2m -pady 1m

   bind .wcpmv <Return> {
        set repert [CvtVar $repert]
        CopierObj $repert
      }
  
  tkwait window .wcpmv 
}


proc CopierObj {dircib} {
   global DIRNAME SELECT cde FCIB lstfic

   if { [file isdirectory $dircib] == 0 } {
      tk_messageBox -message "$dircib n'est pas un repertoire" -type ok -icon error -title "Erreur"
      return 0
   }

  set j 0
  
  foreach fichier $lstfic {
       if { $fichier == "%NONE%" } {continue}
       incr j
  
       if { [file exist [file join $dircib $FCIB($j)]] == 1 } {
         tk_messageBox -message "$FCIB($j) existe deja dans $dircib" -type ok -icon error -title "Erreur"
	 continue
       }

      set objsrc [file join $DIRNAME $fichier]
      set objcib [file join $dircib $FCIB($j)]
      
      if { [catch {exec $cde $objsrc $objcib} txtmsg] != 0 } {
          tk_messageBox -message $txtmsg -type ok -icon error -title "Erreur"
      } 
  }
   
  destroy .wcpmv

}


#---------- Routine pour selection d'une queue d'imprimante
proc PrtSel {} {
   global tcl_platform prtsel PGFTKDIR

   set prtsel [toplevel .prtsel]
   wm title $prtsel "Choix imprimante" 
   wm resizable $prtsel 0 0

   #--- Lecture du fichier /etc/printcap via script shell
   set qlist [exec [file join $PGFTKDIR pgfprintcap.sh]]

   frame $prtsel.h
   pack  $prtsel.h -side top
   frame $prtsel.b
   pack  $prtsel.b -side bottom

   label $prtsel.h.txt -text "Liste des Files d'Attente"  -font fixed -width 40
   pack $prtsel.h.txt -side top -fill x

   listbox $prtsel.h.queues -relief raised -borderwidth 2 -yscrollcommand "$prtsel.h.scrollq set"  -bg whitesmoke
   pack $prtsel.h.queues  -side left -fill both -expand 1
   scrollbar $prtsel.h.scrollq -command "$prtsel.h.queues yview"
   pack $prtsel.h.scrollq -side right -fill y
   foreach q $qlist {
      set nmq [file tail $q]
      if { $nmq != "_default" } {$prtsel.h.queues insert end $nmq}
      }

   button $prtsel.b.cancel -text Abandon  -command {set fin "OUI"}
   pack   $prtsel.b.cancel -side top -padx 2m -pady 4m -fill both

   #-- Centre fenetre
   Centrer prtsel
 
   bind $prtsel.h.queues <Button-1> {
     set monimp [%W get [%W nearest %y]]
     set fin "OUI"
   }

   #--------- Permet de garder la fenetre toujours au premier plan
   bind $prtsel <Visibility> {
       if { [string match %W $prtsel ] && [string compare %s VisibilityUnobscured] } {
          raise %W
          update
       }
   }

   tkwait variable fin

   grab release $prtsel
   destroy $prtsel
}


#--------- Pour centrer un objet
proc Centrer {widget} {
   global w
   set w ".$widget"
   after idle {
      update idletasks
      set xmax [winfo screenwidth $w]
      set ymax [winfo screenheight $w]
      set x0 [expr ($xmax - [winfo reqwidth $w])/2]
      set y0 [expr ($ymax - [winfo reqheight $w])/2]
      wm geometry $w "+$x0+$y0"
   }

}

#--------- Routine d'affichage "Aide"
proc Apropos {version} {
   global PGFTKDIR

   toplevel .apropos -class msg
   wm title .apropos "A propos de pgftk"
   
   Centrer apropos
   
   wm maxsize .apropos 240 265
   wm minsize .apropos 240 265
    
   frame .apropos.frametop -relief raised -bd 1
   pack .apropos.frametop -side top -fill both
   frame .apropos.framebot -relief raised -bd 1
   pack .apropos.framebot -side bottom -fill both

   image create photo logotcl -data [RtvImgData tcllogo]
  
   label .apropos.frametop.logo -image logotcl -relief raised -bd 3
   pack .apropos.frametop.logo -side top -padx 3m -pady 3m
   label .apropos.frametop.version -text "$version"
   pack .apropos.frametop.version -side bottom
   
   button .apropos.framebot.ok -text OK -command {destroy .apropos}
   pack .apropos.framebot.ok -padx 2m -expand 1 -side left
 
   set oldFocus [focus]
   grab set .apropos
   focus .apropos
   bind .apropos <Return> {destroy .apropos}

   tkwait window .apropos
}


#------------ Routine d'execution d'une commande
proc Exec_cmd {} {
global cdetoexec paramp params DIRNAME ficcmd fin txtentete env

if { $cdetoexec < " " } {
     set msg "Vous devez prciser une commande  excuter !"
     tk_messageBox -message $result -type ok -icon error -title "Erreur"
     return
} 

set HOME $env(HOME)
set PRINTER $env(PRINTER)
set D $DIRNAME

foreach objcmd $ficcmd {
   if { $objcmd == "%NONE%" } {continue}
   if { $objcmd <= " "} {continue}
   set F $objcmd
   set txtentete "Traitement de $objcmd en cours..."
   update idletasks
   if { [catch {eval exec $cdetoexec} result] } {
           tk_messageBox -message $result -type ok -icon error -title "Erreur"

   }
}
set fin 1
}


proc LTRTFILscrolly args {
  global LTRTFIL macro
  eval $macro.flbox.sy set $args
  $LTRTFIL yview moveto [lindex $args 0]
}

proc LTRTFILscrollx args {
  global LTRTFIL macro
  eval $macro.flbox.sx set $args
  $LTRTFIL xview moveto [lindex $args 0]
}


#--------------- Traitement principal routine Cmd
proc Trt_Macro {} {
  global DIRNAME cdecmd lstfic ficcmd dircib srvcib objcib colfic macro LTRTFIL txtentete monimp

  set macro [toplevel .macro]
  wm title $macro "Excuter une commande" 
  wm resizable $macro 0 0

  Centrer macro

  set ficcmd $lstfic
  set LTRTFIL  $macro.flbox.lbox

  #---------- Creation frame entete  
  frame $macro.entete
  pack $macro.entete -side top -padx 2m -pady 2m
  
  frame $macro.entete.f1
  pack $macro.entete.f1 -side top -padx 1m -pady 1m -anchor w -fill both 
  label $macro.entete.f1.lmacro -relief flat -text "Commande (\$D=Directory, \$F=Fichier) :" -anchor w
  entry $macro.entete.f1.macro -relief sunken -textvariable cdetoexec -bg green -width 30

  pack $macro.entete.f1.lmacro -side top -anchor w -expand 1 -padx 2m 
  pack $macro.entete.f1.macro -side left -expand 1 -padx 2m
  
  menubutton $macro.entete.f1.b -relief raised -text "Exemples" -menu $macro.entete.f1.b.mnu
  pack $macro.entete.f1.b -padx 10 -pady 10
  set bmnu [menu $macro.entete.f1.b.mnu -tearoff 0]
  
  $bmnu add command -font fixed -label "Ajout Droits x     : chmod a+x \$D/\$F "  -command { set cdetoexec "chmod a+x \$D/\$F" }
  $bmnu add command -font fixed -label "Retire Droits x    : chmod a-x \$D/\$F "  -command { set cdetoexec "chmod a-x \$D/\$F" }
  $bmnu add command -font fixed -label "Imprimer           : lpr -P\$PRINTER \$D/\$F"  -command { set cdetoexec "lpr -P\$PRINTER \$D/\$F" }
  $bmnu add command -font fixed -label "Copier dans  \$HOME : cp \$D/\$F \$HOME "  -command { set cdetoexec "cp \$D/\$F \$HOME" }
  $bmnu add command -font fixed -label "Dplacer dans /tmp : mv \$D/\$F /tmp "  -command { set cdetoexec "mv \$D/\$F /tmp" }
  $bmnu add command -font fixed -label "Lancer gimp        : gimp \$D/\$F &"  -command { set cdetoexec "gimp \$D/\$F &" }
   
  set txtentete "Liste des fichiers  traiter"
 
  frame $macro.entete.f5
  pack $macro.entete.f5 -side top -padx 1m -pady 3m -anchor w -fill both
  label $macro.entete.f5.ltxtfic -relief flat -textvariable txtentete  \
        -font {-adobe-times-bold-r-normal--14-140-75-75-p-77-iso8859-1}
  pack $macro.entete.f5.ltxtfic
 
  frame  $macro.flbox 
  pack  $macro.flbox -side top -expand 1 -fill both

  scrollbar  $macro.flbox.sy -orient v -command [list $LTRTFIL yview]
  scrollbar  $macro.flbox.sx -orient h -command [list $LTRTFIL xview]
  pack  $macro.flbox.sy -fill y -side right
  pack  $macro.flbox.sx -fill x -side bottom

  listbox $LTRTFIL -exportselection no -selectmode browse -yscrollcommand LTRTFILscrolly \
                 -xscrollcommand LTRTFILscrollx -width $colfic -bg whitesmoke
  pack $LTRTFIL -side left -fill both -expand 1
  

  foreach fic $ficcmd {
     if { $fic == "%NONE%" } {continue}
     $LTRTFIL insert end $fic
  }

   #-------- Creation d'un cadre specifique pour les boutons     
   frame $macro.framebutton -relief raised -bd 1
   pack  $macro.framebutton -side bottom -padx 1m -pady 1m -anchor w  -fill both   
   button $macro.ok   -padx 11 -pady 4 -text Valider -width 15 -relief ridge -command {Exec_cmd} -highlightcolor red
   button $macro.exit -padx 11 -pady 4 -text "Abandon" -command {set fin 1} -highlightcolor red
    
   pack $macro.ok $macro.exit -in $macro.framebutton -side left -expand 1 -padx 2m -pady 2m
 
   bind $macro <Return> {Exec_cmd}   

   focus $macro.entete.f1.macro
   grab $macro

   tkwait variable fin

   grab release $macro
   destroy $macro
}



#------------ Change curseur lors du chargement de la liste des fichiers
proc ChgCurseur {action} {
   global cadretext txtmsg
   
   if {$action == "%ON" } {
      set txtmsg "Traitement en cours. Veuillez patienter..."
      $cadretext configure -cursor {watch blue}
      . configure -cursor {watch blue}
    } else {
      set txtmsg ""
      $cadretext configure -cursor ""
      . configure -cursor ""
   }
   update idletasks
}


#------------ Gestion barre d'ascenseur (affiche/cache selon nb lignes affichees)
proc Scrolled {type name args} {
 global couleur
    frame $name -bg $couleur(FondEcran)
    $type $name.$type \
            -xscrollcommand [list Scroll? $name.x \
            [list grid $name.x -row 1 -column 0 -sticky we]]\
            -yscrollcommand [list Scroll? $name.y \
            [list grid $name.y -row 0 -column 1 -sticky ns]] 
    eval $name.$type configure $args
    scrollbar $name.x -ori h -command "$name.$type xview" -bg $couleur(FondEcran) -bd 1 
    scrollbar $name.y -ori v -command "$name.$type yview" -bg $couleur(FondEcran) -bd 1 
    grid $name.$type $name.y -sticky n,e,w,s
    grid $name.x -sticky n,e,w,s
    grid rowconfigure $name 0 -weight 1
    grid columnconfigure $name 0 -weight 1
    return $name.$type
  }
proc Scroll? {bar cmd offset size} {
    if {$offset != 0.0 || $size != 1.0 } {
        eval $cmd; $bar set $offset $size
    }  else {[lindex $cmd 0] forget $bar}
}



#---------- Convertir une variable $xxx
#           Permet la saisie de variables dans les champs de saisie (exemple $HOME)
proc CvtVar {variable} {
global env

  if { [string range $variable 0 0] == $ } {
      set nomvar [string range $variable 1 end]
      if { [catch {set $nomvar $env($nomvar)} erreur] } {
           return $variable 
      } else {
           return [set $nomvar]
       }      
  }
  return $variable 
}


#--------- Retourne une chaine de caracteres pour cration des images 
#	   (la chaine de caractere a t cr ainsi : mmencode fic.gif >fic.txt )
proc RtvImgData {nomimg} {
  switch $nomimg {
           f5  {return {R0lGODlhIwAYAOMAAMDAwGBgYP///wAAAP//mDOZAABgYACYYP//////////////////////
                     /////////yH+DExpbnV4IC0gR2ltcAAh+QQBCgAIACwAAAAAIwAYAAAEiRDISau9OOvNu9dB
                     KI7idwVCqq5CMJgVyqZEir6wJLN1LeOwnYpQoA2Ox5xQVSgKCBPgR1YTNK89AUDqQfUMB6uz
                     t1XSBIbU+KnldrxPQ3ZeDq7maHbdtMs65U97U2c1TQIHaTWCXWyFV0VkbhxUbIaNbWZ4kI2L
                     b4SXWZ2TH5IbSKeoqDmrrK0RADs=}
	       }
	   cmd {return {R0lGODlhIwAYAKUAAMDAwLi4uNDQ0DAwMBgYGICAgKioqODg4AAAAPDw8JiYmCAgIFhYWLi4
                 wIiIkJiYoGhgWHBYQHhgSHBgUGhoaP+oUP/AcP/IiOigaCgwQHh4eFhoeP+wWP//wP//uP/g
                 qP/osDA4SNjg4JiQeNC4kMiIUP/QmEhISJCAYP/QiKiIaMCggOjYsIh4cP/oyP//6LCgkKi4
                 wJhwUP//0Ojw/3iAkOjAgOjQoKigmKiQeP///////////////////////yH+DExpbnV4IC0g
                 R2ltcAAh+QQBCgA/ACwAAAAAIwAYAAAG/kCAcEgsGo/IpHLJHAaegSO0yRQMCISCIEo1RgWG
                 wuFgQCQEhDFAERAAuMzoobAgDAoERiKxWOAXAwZbVG0KZgkEAA0ADg9gAQ4JBwhRcEptDAgA
                 BwkOEBESExEUBmcBCAZvcZUIA1YMFRYWFxcYGRoArW6WSZyIkBscsx0eHR8gIQEUGntUGggI
                 CyIasSAj0CQeHxgaAtCaTQPNACUWICYnBhooHh4pKmcJBidNh44rFcQsDC0uLx0XYICRBE6J
                 tywDAsSQkaJDhxkvEnQAQYHGgxPPGFCpgyBNDRk2PMxIAOIGLm/QTripsgUBBQUHBOBQgQJF
                 jk0CCpxYAGDlcJIoCTSckKehQbM9CQB0S4Bq0M81BJAaSieJDgIBSDU2iVLGDQUEDBZoKKBg
                 AIMTBDTMSbS1ZyYCCAokYKBgD70EA6LFdfp07oAxAigMnSTHG0xVbdVwcTngxIEnAmIiJgTl
                 C55AqqZ0SeJGgE8mQQAAOw==}	
		}
           cp  {return {R0lGODlhIwAYAOMAAMDAwGBgYAAAAAAzmf///wAwyAAwYP//mGBgAP/IAMjImMiYAP//yJmZ
                        Zv///////yH+DExpbnV4IC0gR2ltcAAh+QQBCgAPACwAAAAAIwAYAAAErBDISau9OOu9g/+g
                        IA0kdwVEqqaASA1mhYJ04I7xNK9r++aSHY/lKhgHhpxQdSAcfJICErh0WqGSJJWAah4Q4DDQ
                        IvwSEmeF4DYG7L6KRXweDrM73BSCwe/7+3cab3toCYWGCQuJgRkBbnoMZ2eIiAsLjBhrXYST
                        lImWmI0Se52GiqeXY2sChJ6Jnw2hG62UqA2pbQC0p7ALsbm6DKavlre3shqrysurwM7POREA
                        Ow==}
		}
	   edt {return {R0lGODlhIwAYAIQAAMDAwJkAAP8AZgAAAJhgAMgAAAAA/wD/AJjIYDCY/zNm////mJmZZgCA
                        AAAAgP/IAICAgP//////AMiYADAw/8jImAAwyP//////////////////////////////////
                        /yH+DExpbnV4IC0gR2ltcAAh+QQBCgAfACwAAAAAIwAYAAAFoiAgjmRpnmiqrmxbBoErj4Eg
                        DLNLwAXuGsCgcEg4IAa+liGhaDqfTcKC0UgqHdisNit9EKwsSGRMLo+lkglyJja7u1/wqv00
                        o9UAuartJhMkXjh6KW0UhoeGXXh5bH1+aV8RjDJ8Y4gMFQRfAJKDKJVmDBEVSGOTLqCXozim
                        niegZUgDZactbRa4uRaltK4msGSzZrVhOb4lssnKy8c5zs8rIQA7}
		}
	   mv {return {R0lGODlhIwAYAMYAAMDAwEBISAAAALi4uNDQ0MjI0CAgADg4AHh4YJCQkFhQQOjAiLiYcGho
                       YPDw8PDwmHh4ABAQAICAcBAQEGhAIOCweP/YkHBoSP//uP//OP//ALCwAIiIYKioqCAgIFBQ
                       UIiIAIiIkICIiDAwMODg6MjIoP//4P//GGhoAGhYMMioeFhIOJiAYMCogDgoIKiAWP/YqLig
                       eFhYYLi4mOjo2FhYAODg8DAgENiYWP/IgP+4cP/ouCgoGOjoGAAAEP+wWP/AeHh4eP//INDQ
                       AP+gUCAAAP/IYNigaP//qJiYCDgwKBgIAGBgOPDwaMjIAOjoMP//QGhoUBggKGA4GLhwMLi4
                       wP//UHhIILCwoOjoyP//0Hh4gIhQIEhIAJiYoKiosDAYCJBYKKioCHh4QHiAgCAQADg4QJiY
                       gNjYuNjYqGhocKBoMJCQcHBwGKhwOHh4UPDwiICAGP//////////////////////////////
                       /////////////////////////yH5BAEKAH8ALAAAAAAjABgAAAf+gACCg4SFhoeIgwSEAg2E
                       ERKDAwOJiAkCExQVFhdtnm0bHIqClJWEHR4OHxEXDg4PGiAeISIjHx0DJKaFlw4lEiavJygp
                       KisXLC0TASKUpaYdEyYSJMIoIy4vKjAYGCoxAjK6uwAdAjM0wjUJNiE3ODk6MDs7MQEdAM+I
                       BR08rg89BAjw4UMghR8/gADJAWNEkHGmBDjAIESDxYsWhwggUkSAESBHRuDTZ8iACSQZMKpM
                       okSAhwAClgBZkWBRJSZNnAxxsuEJFCgpY0WpRsABASlTqCipki8RAQ8CgnjwMcCECStCJ3XY
                       CiCIgCsrSFUaMMEBliwOtCDRkAQB00nACQZ02LKES9imicyVKOHgpJAuPrYMqILLi5cvW8CE
                       uUuykLlgJh5URAFCzBhcHQx/IaOYcaICPNI5QFIRY40gXwwf3lLErlhEB6xiVakBAoIBqg+T
                       KeMaLyKBwEUErWGGsJetunl7TuTKgRkBA7RoQPHBRuatmTcrf31okqAzaNZCEGBY7vXkYRQs
                       amwoygUkPVAEkZB7wJfsuxfnqvQ2SpomKCAAnEATFGhggeQIQoAEbHgiQQEK2pTghN5NaEgg
                       ADs=}
		}
	  prt {return {R0lGODlhIwAYAOMAAMDAwJiYmGBgYMjImP///wAAADNm/5mZZmBgAP//yJmZMzOZADDIAP//
                        /////////yH+C0xpbnV4IC1HaW1wACH5BAEKAA8ALAAAAAAjABgAAASWEMhJq704681t+GAY
                        dJowEGiKDgWJBachzwbRuleg7izuxTSZzWcR7FSsgpIIgBGCwsLhIL3hdMdUlWrtIL7gcHjb
                        3SBUibQ6PUBQp2WNeD6eUl1n1Jo9GChYcDh5CX2FCwwMC35VcXIEhIV9f5NJCI0ZSpmam0pf
                        lxkIfIWTCgoFnkShkKWsrKefG5yysEy1tre4uR0RADs=}
		}
	  rm {return {R0lGODlhIwAYAMIAAMDAwMgAQMwAAJAAAP+4MOAwAP///////yH+DExpbnV4IC0gR2ltcAAh
                        +QQBCgAHACwAAAAAIwAYAAADUAi63P4wyklBEGLUzQQp2SRw3Rc+J7lgRLpqqoO5btxgcG3f
                        mb7zsB8E5xPiFEXb8SVcFYJMYwsatQWmkZHVRL1ZQd2m4hKW2critHrNTicAADs=}
		}
         sav {return {R0lGODlhIwAYAOMAAMDAwGBgMJmZZmaZZgAAAMjImP///8jIyP//yP//mGBgAGBgYDAwMJiY
                      mP///////yH+DExpbnV4IC0gR2ltcAAh+QQBCgAPACwAAAAAIwAYAAAEshDISau9OOvNu89B
                      KAxkaQ5hQHxAUBjjeQaHsX6BAeu8jvyJ1M2TQwh6vh8iKBAMO4HfkadcJpiKJydamBqq12ug
                      qd1wp+Awtqw5f4Fq8ZgNKnThcbFAxXLZU4CBc30CXXZNiIljWX2GiYkKApEKjDiFAgsLDJqc
                      mwwMlHQYLk2cmZ4HqaCVRIibmp+fqQ2rohdjpbG6qQe1hKWwuw20ob8CuruqxSwEzc7P0M4s
                      09TVFxEAOw==}
		}
	  idir {return {R0lGODdhEAAQAPIAAAAAAHh4eLi4uPj4APj4+P///wAAAAAAACwAAAAAEAAQAAADPVi63P4w
                        LkKCtTTnUsXwQqBtAfh910UU4ugGAEucpgnLNY3Gop7folwNOBOeiEYQ0acDpp6pGAFArVqt
                        hQQAO///}
	       }
	  smallexec {return {R0lGODdhEAAQAMIAAP///wAAAFhYWMDAwKCgpAAAAAAAAAAAACwAAAAAEAAQAAADTAi63B4w
                             OiDFAILCFa7NWEgp3XABpnIG5Jail1SaMQu3BDFDaQnpBBoN1pEEhUIdi6Ub+Jo60qjpzAWi
                             GuYVqLRJqVsvJ2KKiBtmRwIAOw==}
		     }
	  smallfile {return {R0lGODdhEAAQAKEAAP///wAAAH9/fwAAACwAAAAAEAAQAAACL4SPicEdet6S6okLHl3JVXBh
                             VyB0UFZyYYiaEGmuGMy9aQTKbV3dhgOkIWS6k7EAADs=}
	          }
	  tcllogo {return {R0lGODlhKgBAAPQAAP//////zP//AP/MzP/Mmf/MAP+Zmf+ZZv+ZAMz//8zMzMyZmcyZZsxm
                         ZsxmAMwzAJnMzJmZzJmZmZlmmZlmZplmM5kzM2aZzGZmzGZmmWZmZmYzZmYzMzNmzDMzZgAz
                         mSH+IE1hZGUgd2l0aCBHSU1QIGJ5IExARGVtYWlsbHkuY29tACH5BAVkAAEALAAAAAAqAEAA
			AAX+YCCOZEkyTKM2jOm66yPPdF03bx7YcuHIDkGBR7SZeIyhTID4FZ+4Es8nQyCe2EeUNJ0p
			eY2s9mi7PhAMngEAMGRbUpvzSxskLh1J+Hkg134OdDIDEB+GHxtYMEQMTjMGEYeGFoomezaC
			DZGSHFmLXTQKkh8eNQVpZ2afmDQGHaOYSoEyhhcklzVmMpuHnaZmDqiGJbg0qFqvh6UNAwB7
			VA+OwydEjgujkgrPNhbTI8dFvNgEYcHcHx0lB1kX2IYeA2G6NN0YfkXJ2BsAMuAzHB9cZMk3
			qoEbRzUACsRCUBK5JxsC3iMiKd8GN088SIyT0RAFSROyeEg38caDiB/+JEgqxsODrZJ1BkT0
			oHKSmI0ceQxo94HDpg0qsuDkUmRAMgu8OgwQ+uIJgUMVeGXA+IQkzEeHGvD8cIGlDXsLiRjQ
			+EHroQhea7xY8IQBSgYYDi1IS+OFBCgaDMGVS3fGi5BPJpBaENdQ0EomKGD56IHwO39EXiSC
			Ysgxor5+Xfgq0qByYUpiXmwuoredB2aYH4gWWda0B7SeNENpEJHC1ghi+pS4AJpIAwWvKPBi
			+8YEht5EriEqpFfMlhEdkBNpx0HUhwypx5T4IB1MBg/Ws2snwV3MSQOkzI8fUd48Aw3dOZto
			71x85hHtHijYv18Gf/3GqCdDCXHNoICBobSoIqBqJLyCoH8JPrLgdh88CKCFD0CGmAiGYPgf
			fwceZh6FC2ohIIklnkhehTNY4CIHHGzgwYw01ujBBhvAqKOLLq5AAk9kuSPkkKO40NB+h1gn
			ypJIIvkBf09aN5QIRz5p5ZJXJpmlIVhOGQA2TmIJZZhKKmmll2BqyWSXWUrZpQtpatlmk1c2
			KaWRHeTZEJF8SqLDn/hhsOeQgBbqAh6DGqronxeARUIIACH5BAUeAAAALAUALgAFAAUAAAUM
			4CeKz/OV5YmqaRkCACH5BAUeAAEALAUALgAKAAUAAAUUICCKz/OdJVCaa7p+7aOWcDvTZwgA
			IfkEBR4AAQAsCwAuAAkABQAABRPgA4zP95zAeZqoWqqpyqLkZ38hACH5BAUKAAEALAcALgAN
			AA4AAAU7ICA+jwiUJEqeKau+r+vGaTmac63v/GP9HM7GQyx+jsgkkoRUHJ3Qx0cK/VQVTKtW
			wbVKn9suNuncWkMAIfkEBQoAAAAsBwA3AAcABQAABRGgIHzk842j+Yjlt5KuO8JmCAAh+QQF
			CgAAACwLADcABwAFAAAFEeAnfN9TjqP5oOWziq05lmUIACH5BAUKAAAALA8ANwAHAAUAAAUP
			oPCJTymS3yiQj4qOcPmEACH5BAUKAAAALBMANwAHAAUAAAURoCB+z/MJX2o+I2miKimiawgA
			IfkEBQoAAAAsFwA3AAcABQAABRGgIHzfY47jQ4qk+aHl+pZmCAAh+QQFCgAAACwbADcABwAF
			AAAFEaAgfs/zCV9qPiNJouo7ll8IACH5BAUKAAAALB8ANwADAAUAAAUIoCB8o0iWZggAOw==}
		   }
  
        }

}


#-------- Formatage permissions
proc FmtDroits { p } {
    set ldroitn [list --- --x -w- -wx r-- r-x rw- rwx]
    set ldroits [list --S --S -wS -wS r-S r-S rwS rwS]
    set lng [string length $p]
    set bit_u [string range $p [expr $lng - 3] [expr $lng - 3]]
    set bit_g [string range $p [expr $lng - 2] [expr $lng - 2]]
    set bit_o [string range $p [expr $lng - 1] [expr $lng - 1]]
    set bit_s [string range $p [expr $lng - 4] [expr $lng - 4]]
    
    if { $bit_s == "4" } {
       set droits "[lindex $ldroits $bit_u][lindex $ldroitn $bit_g][lindex $ldroitn $bit_o]"
    } elseif { $bit_s == "2" } {
       set droits "[lindex $ldroitn $bit_u][lindex $ldroits $bit_g][lindex $ldroitn $bit_o]"
    } else {
       set droits "[lindex $ldroitn $bit_u][lindex $ldroitn $bit_g][lindex $ldroitn $bit_o]"
    }
    return $droits
}



#---------- Traitement des fichiers selectionnes
proc Trt_Selection {cde} {
  global DIRNAME SELECT lstfic item txtmsg nomediteur monimp cadretext env

  if { ($cde != "f5" && $cde != "sav") && [llength $lstfic] < 2 } {
      tk_messageBox -message "Slectionnez au moins un lment dans la liste" \
                    -type ok -icon info -title "Traitement Action"
      return 0 
  }

  switch $cde {
             cp  {
                 Cmd:cp:mv cp
		 AfficherListe $DIRNAME $SELECT
                 catch {set txtmsg $anomalies}
		 return 0
                }
              mv  {
                 Cmd:cp:mv mv
	        AfficherListe $DIRNAME $SELECT
                 catch {set txtmsg $anomalies}
		 return 0
               }

           f5  {AfficherListe $DIRNAME $SELECT
                return 0 }
           sav {SauveListe
                return 0}
          cmd  {Trt_Macro
                AfficherListe $DIRNAME $SELECT
                catch {set txtmsg $anomalies}
               }
          rm   {
                 set lstrm [lrange $lstfic 1 end]
                 set reponse [tk_messageBox -message "Supprimer tous les fichiers slectionns ?" \
                             -type yesno -icon warning -title "Confirmation"]
                 foreach item $lstfic {
                   if {$item == "%NONE%"} {continue}
                   if { $reponse == "yes" } {
                      catch {exec rm [file join $DIRNAME $item]} erreur
                      if { $erreur != ""} {lappend anomalies $erreur }
                    }
                    $cadretext tag delete selection$item
                  } 
                  if { $reponse == "yes" } {
                    AfficherListe $DIRNAME $SELECT
                    catch {set txtmsg $anomalies}
                  }
               }
         prt   {
                 set lstprt [lrange $lstfic 1 end]
		 if { $monimp == "" } {
                    PrtSel
                    set choix 0
                 } else {
                    set choix [tk_dialog .info "Confirmer impression" "Imprimer fichiers slectionns sur $monimp" \
                           question 0 "OK" "Abandon"]
                   if { $choix == 2 } { PrtSel }
                 }
                 foreach item $lstprt {
                   if {$item == "%NONE%"} {continue}
                   if { $choix != "1" } {
                      catch {exec lp -d$monimp -o nb [file join $DIRNAME $item]} erreur
                      if { $erreur != ""} {lappend anomalies $erreur }
                   }
                   $cadretext tag delete selection$item
                 } 
               }   
       default {
                 foreach item $lstfic {
                   if {$item == "%NONE%"} {continue}
                   $cadretext tag delete selection$item
                   switch $cde {
                       edt {
                             set cdetoexec "$nomediteur $DIRNAME/$item &"
                             if { [catch {eval exec $cdetoexec} result] } {
			          tk_messageBox -message "$result" -type ok -icon error -title "Erreur"
				  }
                           }
                    }
                 }
               }
   }
   set lstfic %NONE%
}


#---------- Traitement touche ENTREE
proc Traitement {} {
global DIRNAME SELECT dirname select index env

set DIRNAME [CvtVar $DIRNAME]

if { [file isdirectory $DIRNAME] == 0 } {
    tk_messageBox -message "$DIRNAME n'est pas un repertoire" -type ok -icon error -title "Erreur"
    return 0
}

set index 1.0
set dirname $DIRNAME
set select $SELECT
AfficherListe $DIRNAME $SELECT

}

#---------- Creation des Menus dynamiques des sous-rpertoires :
proc Crt_Dyn_Mnu {dirtrt nommnu} {
    global chgdirmnu DIRNAME SELECT
    
    catch {$nommnu delete 0 end}
    set dlist [lsort [eval glob -nocomplain $dirtrt/*/  ]]
    foreach nmdir $dlist {
         if { [string range $nmdir end end] == "/" } {
              set LNG   [expr [string length $nmdir] - 2]
              set nmdir [string range $nmdir 0 $LNG]
               }
	 set cmd "set DIRNAME \[$nommnu entrycget active -label\] ; set dirname \$DIRNAME ; AfficherListe \$DIRNAME \$SELECT"
	 $nommnu add command -font fixed -label $nmdir -command $cmd
 	}
}



#----------- Recherche et affichage des fichiers
proc AfficherListe {dirname select} {
global nbfic BOXES txtnbfic tri txtmsg imgfil imgexc colfic encours lstfic \
       index mapolice lhstdir chgdirmnu menudirprv menudirsub menusuite cadretext

ChgCurseur %ON

   #----- Renseigne Sous-menu avec repertoires prcdents
   set prevdir "Rpertoires de [file dirname $dirname]"
   $chgdirmnu entryconfigure 4 -label $prevdir
   Crt_Dyn_Mnu $prevdir $menudirprv
   set status normal
   if { [$menudirprv index end] == "none" } {set status disabled}
   $chgdirmnu entryconfigure 4 -state $status
  
   #----- Renseigne Sous-menu avec sous-repertoires 
   set subdir "Rpertoires de $dirname"
   $chgdirmnu entryconfigure 5 -label $subdir
   Crt_Dyn_Mnu $subdir $menudirsub
   set status normal
   if { [$menudirsub index end] == "none" } {set status disabled}
   $chgdirmnu entryconfigure 5 -state $status
   
   #----- Test si rpertoire dj dans l'historique, sinon ajout dans l'historique
   #----- et si plus de 20 elements on reboucle sur le menu 
   if { [lsearch -exact $lhstdir $dirname] == -1 } {
        set nbelem [llength $lhstdir]
	if { $nbelem > 20 } {
	   set newlist [linsert $lhstdir 1 $dirname]
	   set lhstdir [lrange $newlist 0 20] 
	   set j 5
	   foreach nomdir $lhstdir {
	      incr j
	      if {$j == 6} continue 
	       $chgdirmnu entryconfigure $j -label $nomdir
	     }  
         } else {
	   lappend lhstdir $dirname
 	   $chgdirmnu add command -font fixed -label $dirname  -command {
	          set DIRNAME [$chgdirmnu entrycget active -label] 
                  set dirname $DIRNAME
        	  AfficherListe $DIRNAME $SELECT}
	}
    }




set nbfic 0
set txtnbfic "0 Fichier"
set lstfic %NONE%

$cadretext configure -state normal
$cadretext delete 1.0 end

set colfic 20
set numenr 0
set volfic 0

foreach fic [eval glob -nocomplain [file join $dirname $select]] {
   if { ! [file isfile $fic] } {continue}
   file stat $fic FICINF
   incr nbfic
   set nomfic [file tail $fic]
   if { [string length $nomfic] > $colfic } {set colfic [string length $nomfic]}
   lappend liste "[list $nomfic $FICINF(mtime) $FICINF(size) \
                  [file attributes $fic -owner] [file attributes $fic -group] \
                  [FmtDroits [file attributes $fic -permissions]]]"
   lappend Lpn [list $fic $numenr]
   lappend Lpd [list $FICINF(mtime) $numenr]
   lappend Lpt [list $FICINF(size)  $numenr]
   lappend Lpu [list [file attributes $fic -owner] $numenr]
   incr numenr
   incr volfic $FICINF(size)
}

set txtnbfic "$nbfic Fichiers ($volfic octets)"
if { $nbfic == 0 } {
   set encours 1
   $cadretext delete 1.0 end
   ChgCurseur %OFF
   set txtmsg "Aucun fichier ne rpond  votre demande..."
   return {}
}

#--- Tri des elements selon la demande 
switch $tri {
 NomA    {set sfl [lsort -increasing -dictionary -index 0 $Lpn]}
 NomD    {set sfl [lsort -decreasing -dictionary -index 0 $Lpn]}
 DateA   {set sfl [lsort -increasing -integer -index 0 $Lpd]}
 DateD   {set sfl [lsort -decreasing -integer -index 0 $Lpd]}
 TailleA {set sfl [lsort -increasing -integer -index 0 $Lpt]}
 TailleD {set sfl [lsort -decreasing -integer -index 0 $Lpt]}
 User    {set sfl [lsort -increasing -dictionary -index 0 $Lpu]}
}

$cadretext configure -state normal
$cadretext delete 1.0 end

set lngligne 80

foreach zonetri $sfl {
   set enreg [lindex $liste [lindex $zonetri 1]]
 
   if { [file executable [file join $dirname [lindex $enreg 0]]]  } {
      $cadretext image create end -image imgexc
   } else {
      $cadretext image create end -image imgfil
   }
 
   set ligne " [format "%-${colfic}s" [lindex $enreg 0]] \
              [clock format [lindex $enreg 1] -format "%d.%m.%Y %T"] \
              [format "%12d" [lindex $enreg 2]] [format "%9s" [lindex $enreg 3]] \
              [format "%9s" [lindex $enreg 4]] [format "%9s" [lindex $enreg 5]]\n"
   if { [string length $ligne] > $lngligne } { set lngligne [string length $ligne] }
   $cadretext insert end $ligne
 }

.entete.bnom configure -text Nom -font $mapolice -width [expr $colfic + 1]
$cadretext configure  -state disabled -font $mapolice
ChgCurseur %OFF

}


#--------------- Sauvegarder Liste dans un fichier .txt
proc SauveListe {} {
global DIRNAME cadretext

set typelist {
       {"Texte" {".txt"}}
       {"Tous " {*}}
    }

set nomfic [tk_getSaveFile -initialdir $DIRNAME -title "Sauvegarder liste" \
            -defaultextension txt -filetypes $typelist -initialfile "pgftklst.txt" ]             
if { [catch {open $nomfic w 0666} fileId] == 0} {
   puts $fileId [$cadretext get 1.0 end]
   close $fileId
}

}


#--------------- Imprimer Liste
proc ImprimeListe {} {
global env monimp DIRNAME SERVEUR cadretext
  

 if { $monimp == "" } {
    PrtSel
 } else {
    set choix [tk_dialog .info "Confirmer impression" "Imprimer liste sur $monimp" question 0 \
                             "OK" "Abandon" ]
    if { $choix == "1" } return
    if { $choix == "2" } {PrtSel} 
 }
 
 set maliste "$env(HOME)/.pgftk.lst"
 set entete "pgf : Liste des fichiers (repertoire : $DIRNAME)"
 
 if { [catch {open $maliste w 0666} fileId] == 0} {
   puts  $fileId "pgf : Liste des fichiers du repertoire : $DIRNAME"
   puts $fileId [$cadretext get 1.0 end]
   close $fileId
   if { [catch {exec lpr -P$monimp $maliste }] == 0} {
      tk_messageBox -message "Liste envoye  la file d'attente $monimp" -type ok -icon info -title "Impression"        
   }
   catch { exec rm $nomfic}
}

}



#--------------- Changer Police
proc ChgPolice {} {
global mapolice colfic cadretext

 $cadretext configure -font $mapolice 
 .entete.bnom configure -width $colfic -font $mapolice
 .entete.bdate configure -font $mapolice 
 .entete.btaille configure -font $mapolice
 .entete.buser configure -font $mapolice
 .entete.bgroupe configure -font $mapolice
 .entete.bdroits configure -font $mapolice
 	   
}


#--------------- Changement de repertoire
proc ChgDir {typchg} {
  global DIRNAME SELECT DIRSELECT typdsp
  switch $typchg {
           ..  {
 		  set DIRNAME [file dirname $DIRNAME] 
		  set dirname $DIRNAME
 		  AfficherListe $DIRNAME $SELECT 
                }
	 Autre { set typdsp 1;Windir }
   }


}

#--------------- Traitement principal
set version "Version 1.0 \n Claude Mah - Oct.2000\n\n\nmailto:mahe.claude@free.fr\nhttp://mahe.claude.free.fr"

catch {set USER $env(LOGNAME)}

set mapolice "Fixed 14"
set monimp ""

wm focusmodel . passive 
wm title . "[winfo name .] : Petit Gestionnaire de Fichiers ($USER sur $tcl_platform(os))"

#--- Recupere le repertoire ou se trouve pgftk
set PGFTKDIR [file dirname [info script]]

#------------- Chargement sous-routines
foreach fictcl { pgfBulle_aide.tcl pgftree.tcl} {source [file join $PGFTKDIR $fictcl]} 


#---------- Affectation parametres
if { $argc == 0 } {
    set DIRNAME [pwd]
} else {
   set DIRNAME [lindex $argv 0]
}

set SELECT {*}
set dirname $DIRNAME
set prvdir $dirname
set select  {*}
set typdsp 1

#----- Creation images : fichier normal, fichier executable et repertoire
image create photo imgfil -data [RtvImgData smallfile]
image create photo imgexc -data [RtvImgData smallexec]
image create photo idir   -data [RtvImgData idir]]

#--------- Couleurs initiales
set couleur(FondEcran) grey
set couleur(FondMenu) grey
set couleur(Menu) black
set couleur(FondBouton) grey
set couleur(FondListe) whitesmoke
set couleur(Liste) black

. configure -bg $couleur(FondEcran)

#-------- Creation barre de menus
frame .mbar  -relief groove -bd 1 -bg $couleur(FondMenu)
pack .mbar -side top -fill x

set mnufont {fixed 12}
foreach menu { Fichier Edition Outils Options Aide } {
  menubutton .mbar.[string tolower $menu] -text $menu -bg $couleur(FondMenu) \
            -fg $couleur(Menu) -menu .mbar.[string tolower $menu].menu -font $mnufont \
	    -activebackground white
  menu .mbar.[string tolower $menu].menu -tearoff 0 -bg $couleur(FondMenu) -fg $couleur(Menu)
  set cote left
  if { $menu == "Aide" } {set cote right}
  pack .mbar.[string tolower $menu] -side $cote 
}

.mbar.fichier.menu add command -label "Enregister liste   " -font $mnufont -command {SauveListe} 
.mbar.fichier.menu add command -label "Imprimer liste     " -font $mnufont -command {ImprimeListe}
.mbar.fichier.menu add separator
.mbar.fichier.menu add command -label "Choix imprimante   " -font $mnufont -command {PrtSel}
.mbar.fichier.menu add separator
.mbar.fichier.menu add command -label "Quitter          F3" -font $mnufont -command {exit}


.mbar.edition.menu add command -label "Copier liste dans Presse-papier" -font $mnufont -command {
        clipboard clear
	clipboard append [$cadretext get 1.0 end]
    } 
.mbar.edition.menu add separator
.mbar.edition.menu add command -label "Slectionner tout              " -font $mnufont -command {
   set lstfic ""
   for {set i 1} {$i <= $nbfic} {incr i} {
      set ligne [$cadretext get $i.0 $i.end ]
      set item [string range $ligne 1 $colfic]
      set item [string trimright $item]
      lappend lstfic $item
      $cadretext tag add selection$item [$cadretext index $i.0] [$cadretext index $i.end]          
     $cadretext tag configure selection$item -background orange
    }

} 
.mbar.edition.menu add command -label "Rafraichir                     F5" -font $mnufont -command {Traitement}

set msghlp "pgftk : Petit Gestionnaire de Fichiers - mahe.claude@free.fr\n"
.mbar.aide.menu add command -label "Gnralits" -font $mnufont -command {
        tk_messageBox -message $msghlp -type ok -icon warning -title "Information" -icon info}
.mbar.aide.menu add separator
.mbar.aide.menu add command -label "A propos de pgftk" -font $mnufont -command {Apropos $version}


.mbar.outils.menu add command -label "Appeler diteur texte" -font $mnufont -command {
               set cdetoexec "$nomediteur"
               if { [catch {eval exec $cdetoexec &} result] } {tk_messageBox -message "$result" -type ok -icon error -title "Erreur"}
            }
.mbar.outils.menu add command -label "Relancer un autre pgftk" -font $mnufont -command {exec pgftk &}
.mbar.outils.menu add command -label "Lancer un terminal (xterm)" -font $mnufont \
           -command {exec xterm  -title "pgf : xterm" -bg whitesmoke -fg black &}
.mbar.outils.menu add command -label "Explorateur rpertoire" -font $mnufont -command {set typdsp 0;Windir }
	   
                     
.mbar.options.menu add cascade -label "Police" -font $mnufont -menu .mbar.options.police
set policemnu [menu .mbar.options.police -tearoff 0]
set lstfonts [list "Fixed 10" "Fixed 14" Terminal Roman "Courrier  8" "Courrier 10" "Courrier 12" \
                   "Lucidatypewriter  8" "Lucidatypewriter 10" "Lucidatypewriter 12"  ]
foreach police $lstfonts {  
       $policemnu add radio -label $police -variable mapolice -value $police -command {ChgPolice}
}
	   
.mbar.options.menu add cascade -label "Choix diteur" -font $mnufont -menu .mbar.options.edtmnu
set edtmnu [menu .mbar.options.edtmnu -tearoff 0]
$edtmnu add radio -label "kedit     " -variable nomediteur -value "kedit"
$edtmnu add radio -label "kwrite    " -variable nomediteur -value "kwrite"
$edtmnu add radio -label "nedit     " -variable nomediteur -value "nedit"
$edtmnu add radio -label "emacs     " -variable nomediteur -value "emacs"
$edtmnu add radio -label "joe       " -variable nomediteur -value "xterm -e joe"
$edtmnu add radio -label "vi        " -variable nomediteur -value "xterm -e vi"

set nomediteur "kedit"


#---------- Dfinition des boutons actions
frame .fradio  -bg $couleur(FondBouton) 
pack .fradio -side top -anchor w -fill both 

frame .fradio.cde -relief groove -bg $couleur(FondBouton) -bd 1
pack .fradio.cde -side left -anchor w -fill both -expand 1 


foreach baction { sav edt rm mv cp prt cmd f5 } {
  set image [image create photo -data [RtvImgData $baction] ]
  set commande "Trt_Selection $baction"
  button .fradio.cde.$baction -image $image -anchor w -command $commande \
                              -activebackground green -borderwidth 1 
  pack .fradio.cde.$baction -side left      
}

set tri NomA 

#---------- Creation frame zone de saisies
frame .haut -relief flat -bg $couleur(FondEcran) 
entry .haut.dirname -relief sunken -textvariable DIRNAME -width 40 -bg whitesmoke


#---------- Dfinition du menu bouton "Repertoire" 
menubutton .haut.chgdir -relief raised -text Repertoire -font $mapolice \
              -menu .haut.chgdir.mnu -bg $couleur(FondBouton) -borderwidth 2
set chgdirmnu [menu .haut.chgdir.mnu -tearoff 0 -bg $couleur(FondMenu) -fg $couleur(Menu)]
$chgdirmnu add command -font fixed -label ".." -command {ChgDir ..} 
$chgdirmnu add command -font fixed -label "Autre..." -command {ChgDir Autre}
set nmdir $env(HOME)
lappend lhstdir $nmdir

$chgdirmnu add command -font fixed -label $nmdir -command {
                           set DIRNAME [$chgdirmnu entrycget active -label] 
 			   set dirname $DIRNAME
 			   AfficherListe $DIRNAME $SELECT
             }
  
$chgdirmnu add separator
    
#----- Sous-menu avec repertoires precedents et sous-repertoires
set prevdir [file dirname $DIRNAME]
$chgdirmnu add cascade -label $prevdir -menu $chgdirmnu.prv -font fixed
set menudirprv [menu $chgdirmnu.prv -tearoff 0 -bg $couleur(FondMenu) -fg $couleur(Menu)] 
  
set subdir $DIRNAME
$chgdirmnu add cascade -label $subdir -menu $chgdirmnu.sub -font fixed
set menudirsub [menu $chgdirmnu.sub -tearoff 0 -bg $couleur(FondMenu) -fg $couleur(Menu)] 

$chgdirmnu add separator
  

label .haut.txtsel -text "Slection" -font $mapolice -bg $couleur(FondEcran)
entry .haut.select -relief sunken -textvariable SELECT -width 15 -bg whitesmoke
pack .haut -side top -padx 2m -pady 2m -anchor w -fill both
pack  .haut.chgdir .haut.dirname -side left -padx 2m -pady 2m
pack .haut.txtsel .haut.select -side left -padx 2m


set tri NomA
set trinom "Nom  "
set tridate "Date  "
set tritaille "Taille  "

#---------- Entete liste des fichiers
frame .entete -relief flat -background $couleur(FondEcran) -width 50
button .entete.bnom -textvariable trinom  -font $mapolice -width 12 -anchor w  -bg $couleur(FondBouton) -borderwidth 1 -command {
                    if { $tri == "NomD" } {
                       set tri NomA
                       set trinom "Nom  "
                    } else {   
                       set tri NomD
                       set trinom "Nom <"
                    }
                    set tridate "Date  "
		    set tritaille "Taille  "
		    AfficherListe $DIRNAME $SELECT 
                    }
button .entete.bdate -textvariable tridate -width 17 -font $mapolice  -bg $couleur(FondBouton) \
            -anchor w -borderwidth 1 -command {
                    if { $tri == "DateD" } {
                       set tri DateA
                       set tridate "Date  "
                    } else {   
                       set tri DateD
                       set tridate "Date <"
                    }
                    set trinom "Nom  "
		    set tritaille "Taille  "
		    AfficherListe $DIRNAME $SELECT 
                    }
button .entete.btaille -textvariable tritaille -width 12 -font $mapolice  -bg $couleur(FondBouton) \
         -anchor w -borderwidth 1 -command {
                    if { $tri == "TailleD" } {
                       set tri TailleA
                       set tritaille "Taille  "
                    } else {   
                       set tri TailleD
                       set tritaille "Taille <"
                    }
                    set tridate "Date  "
		    set trinom "Nom  "
                    AfficherListe $DIRNAME $SELECT 
                    }
button .entete.buser -text User -font $mapolice -width 8  -bg $couleur(FondBouton) -anchor w -borderwidth 1 -command {
                    set tri User
                    set tridate "Date  "
		    set trinom "Nom  "
		    set tritaille "Taille  "
                    AfficherListe $DIRNAME $SELECT 
                    }
button .entete.bgroupe -text Groupe -font $mapolice -width 8 -anchor w -borderwidth 1 -bg $couleur(FondBouton) 
button .entete.bdroits -text Droits -font $mapolice -width 10 -anchor w -borderwidth 1 -bg $couleur(FondBouton) 

pack .entete -side top -padx 2m -pady 2m -anchor w -fill both -expand 1
pack .entete.bnom .entete.bdate .entete.btaille .entete.buser .entete.bgroupe -side left -fill both
pack .entete.bdroits -side left -expand 1 -fill both


#------ Boite texte pour liste des fichiers
set cadretext [Scrolled text .cadre -width 100 -height 30 \
               -font $mapolice -bg $couleur(FondListe) -relief sunken -bd 3 \
               -wrap none]
pack .cadre -side top -expand 1 -fill both


#---------- Cadre bas pour afficher nb fichiers + message ano
frame .bas -relief sunken  -bg $couleur(FondEcran) 
pack .bas -side bottom -fill both

set txtnbfic "0 Fichier"
label .bas.nbfic -textvariable txtnbfic -relief sunken -anchor w -bg $couleur(FondEcran) 
pack .bas.nbfic -side left
label .bas.msg  -textvariable txtmsg -foreground blue -relief sunken -anchor w -bg $couleur(FondEcran) 
pack .bas.msg  -side left -expand 1 -fill both



AfficherListe $DIRNAME $SELECT  
Bulle_Aide

#----------- Definition des "binds"
bind . <Return> {Traitement}
bind . <F5> {Traitement}
bind . <F3> {exit}
      
#----------- Bouton gauche de la souris = selection/deselection 
bind $cadretext <Button-1> {
   set ligne [$cadretext get "@%x,%y linestart" "@%x,%y lineend" ]
   set item [string range $ligne 1 $colfic]
   set item [string trimright $item]
   if { $item > " " } {
      set dejala [lsearch -exact $lstfic $item]
      if { $dejala == -1} {
          lappend lstfic $item
	  $cadretext tag add selection$item [$cadretext index "@%x,%y linestart"] [$cadretext index "@%x,%y lineend"] 
          $cadretext tag configure selection$item -background orange
      } else { 
          $cadretext tag delete selection$item
	  set lstfic [lreplace $lstfic $dejala $dejala]
      }
   }
}


