#f print.tcl - gestion de l'impression
# 
# modif :
# 30/10/02 (MD) : 
#   Modification :
#   Le %F n'est utlisable que pour un mot complet
#   Ceci devrait fonctionner meme si le fichier contient des espaces,
#   
#   La commande "d'impression" suivante devrait fonctionner comme prévue
#   meme depuis un répertoire contenant des espaces :
#       cat %F | wc -c > PP
#   Création d'un fichier PP contenant le nbre de caracteres de la partie
#   à imprimer
# 
package provide stead 2.0


## stead:printSubstCommand - construit la commande d'impression 
# 
# 
# proc stead:printSubstCommand {cmd name} {
#  
#     if {![regsub -all {%[Ff]} $cmd $name cmd]} {
#         append cmd " $name"
#     }
#     return $cmd
# } 
proc stead:printSubstCommand {cmd name} {
    set newCmd [list]
    foreach word $cmd  {
        if {[string match {%[fF]} $word]} {
            set word $name
        }
        lappend newCmd $word
    }
    return $newCmd
} 

## stead:printBox - commande d'impression
# 
# what :
#   "file'  pour imprimer le fichier complet
#   "sel"   pour n'imprimer que la sélection
#   xxx     (n'importe quoi d'autre) texte à imprimer
# 
proc stead:printBox {{what file}} {
    global EDITPREFS
    global stead
    set w $stead(text)
    
    # Si cette chaine devient non vide, on devra passer par un fichier 
    # temporaire pour l'impression.
    set tmpName ""
    
    # determination de ce qu'on imprime
    # 
    switch -exact -- $what {
      file {
               
          if {![string length [file tail [file rootname $stead(file)]]]} {
               # Si pas de nom de fichier : on en fabrique un
               set tmpName steadUnamedFile.$stead(mode)
               set content [$w get 1.0 end]

          } elseif {[xtext_isDirty $w]} {
          
               # fichier non sauvegardé : on en fabrique un temporaire
               set tmpName [file tail [file rootname $stead(file)]].$stead(mode)
               set content [$w get 1.0 end]
               
          } else {
               # cas ou on imprime le fichier sur disque 
               #    => pas besoin de fichier tampon
               set tmpName ""
          }       
      }
      sel {
          # Création d'un fichier temporaire contenant la sélection
          set tmpName [file tail [file rootname $stead(file)]]-sel.$stead(mode)
          set content [xtext_getSel $w]
      }
      default {
          # Création d'un fichier temporaire contenant la text passé en argument
          set tmpName stead-stuff.$stead(mode)
          set content $what
      }
    }
    
    # On fait confirmer la commande d'impression
    set newPrintCmd [te:prompt \
            -text "Print Command" \
            -default $EDITPREFS(print_command) \
            -title "Print" \
    ]
    
    if {![string length $newPrintCmd]} then {
        stead:log "Print: cancel by the user"
        return
    } 
    
    # On mémorise la nouvelle commande d'impression pour le reste de la session.
    # L'utilisateur peut aussi enregistrer cette nouvelle préférence sur disque
    # 
    set EDITPREFS(print_command) $newPrintCmd
    
    if {![string length $tmpName]} {
        # On veut imprimer le fichier édité tel qu'il est sur le disque
        if {![file size $stead(file)]} {
            stead:log  "Print: There is nothing to print"
            return
        } 
        stead:printFile $newPrintCmd $stead(file)
        
    } else {
        # On veut imprimer un fichier temporaire
        if {![string length $content]} {
            stead:log  "Print: There is nothing to print"
            return
        } 

        # Création d'un fichier tamporaire pour l'impression
        set tmpName [stead:tmpFile $tmpName]
        if {[catch {
                set fid [open $tmpName w]
                puts $fid $content
                close $fid } errorTxt]
        } {
            stead:log -error "ERROR: $errorTxt"
            return 0
        }

        stead:printFile $newPrintCmd $tmpName
        
        file delete $tmpName

    }
} 

## stead:printFile -- 
# 
# Imprime le fichier fileToPrint, en fonction de la commande d'impression
# générique
# - ne lit pas les préférences (c''st à la charge de la proc appelante
# - effectue la substitution %F
# - le fichier doit exister et est inchangé à la fin
# 
proc stead:printFile { printCmd fileToPrint } {
    set shortFilePath "...[string range $fileToPrint end-40 end]"
    stead:log  "Print: Please wait (printing $shortFilePath)..."
    # stead:log  "Print: Please wait (printing $fileToPrint)..."
    update
    set filePrintCmd [stead:printSubstCommand $printCmd $fileToPrint]
    # set cmd [list puts "exec $filePrintCmd"]
    set cmd [concat exec $filePrintCmd]
    if {[catch $cmd res]} {
        stead:log -error "Print: $res"
    } else {
        stead:log  "Print: Done ($shortFilePath)." 
    }
}
#./
