#!/bin/sh
# -*- tcl -*-
# The next line is executed by /bin/sh, but not tcl \
exec tclsh "$0" ${1+"$@"}

    package require Tk
    
    #package require Ttk

    set nbr_element 0
    set id 0

    global database
    global nbr_element
    global id
    global y
    global coord_y
    global saisie_fichier_input
    global saisie_fichier_output

    
    set position {
        LEFT RIGHT TOP BOTTOM
    }

    set couche {
        Metal1 Metal2 Metal3 Metal4
    }    
    

# commande pour le window manager
wm withdraw .
toplevel .t
# titre de la fenêtre
wm title .t "PINS"
# taille maximale de la fenêtre 
wm maxsize .t 1024 768 
# taille minimale de la fenêtre 
wm minsize .t 400 200
# pour les systèmes d'exploitation qui demandent à l'utilisateur de placer manuellement la fenêtre.
# conseil: écrire cette instruction à chaque fois
wm positionfrom .t user
#Pour les systèmes d'exploitation qui demandent à l'utilisateur de dimensionner manuellement 
# la fenêtre  #Conseil: écrire cette instruction à chaque fois
# la fenêtre aura une taille de 500x300 pixels et sera positionnée en 10,10 sur l'écran
wm geometry .t 500x300+10+10 
# Lorsque l'utilisateur ferme la fenêtre, par exemple en cliquant sur la croix en haut à droite 
# sous windows, l'application écrit Je ferme la fenêtre avant de la fermer. 
# C'est une commande très utile, notamment pour demander à l'utilisateur lorsqu'il ferme la 
# fenêtre principale: "Êtes-vous sûr que vous voulez vraiment quitter mon beau programme 
# pour de vrai sûr de sûr ...?"
wm protocol .t WM_DELETE_WINDOW {puts "Au revoir....";destroy .t}


#frame principale
frame .t.f0 
pack .t.f0 

#création du canvas - objet dans lequel on peut dessiner
#canvas .t.f0.c -height 500 -width 500
#pack .t.f0.c -side left


#frame contenant les boutons
frame .t.f1 -borderwidth 2 -relief groove
pack .t.f1 -fill x -expand 1

#création des boutons
button .t.f1.b1 -text "Charger" -command {message_fichier_input}
pack .t.f1.b1 -fill x -side left -expand 1

button .t.f1.b2 -text "Sauver" -command {message_fichier_output}
pack .t.f1.b2 -fill x -side left -expand 1

button .t.f1.b3 -text "Quitter" -command { exit}
pack .t.f1.b3 -fill x -side left -expand 1

button .t.f1.b4 -text "A propos" -command {mes}
pack .t.f1.b4 -fill x -side left -expand 1

    #Création d'un canvas 
    #canvas .t.f0.c -height 500 -width 500  -bg yellow
    #.t.f0.c create rectangle 1 1 45 32 -fill red
    #pack configure .t.f0.c -side top -expand 1 -fill both
    
   #set y 50
   
   #for {set i 0} {$i <= 100} {incr i} {
   # set coord_y($i) [expr {$y + (25 * $i) }]
   # puts " ---> $coord_y($i)"
   #}
     
    #parray coord_y
   
    #incr i -1
    #set y [expr {$coord_y($i) +50 }]
    
    #frame .t.f0.f
    #pack configure .t.f0.f -side left -fill both -expand 1 
    #scrollbar .t.f0.f.scrollv -orient vertical -command ".t.f0.f.canvas yview" 
    #pack configure .t.f0.f.scrollv -side right -fill y -expand 1 
    #canvas .t.f0.f.canvas -height 500 -width 500 -bg yellow -scrollregion "0 0 1000 $y" -yscrollcommand ".t.f0.f.scrollv set" 
    #pack configure .t.f0.f.canvas -side top -expand 1 -fill both 
    
    #.t.f0.f.canvas create text 100 25 -text "Largeur" -anchor n
    
    #label .t.f0.f.canvas.champ_nom -text "Nom"
    #label .t.f0.f.canvas.champ_largeur -text "Largeur"
    #label .t.f0.f.canvas.champ_hauteur -text "Hauteur"
    #pack .t.f0.f.canvas.champ_nom .t.f0.f.canvas.champ_largeur .t.f0.f.canvas.champ_hauteur
    #-side left -padx 4
   
    
    
  
#*********************************************************************************************************************
proc charger {} {
    
    global nbr_element
    global id
    global database
    global saisie_fichier_input
    
    if {$saisie_fichier_input != "" } {
        set fichier $saisie_fichier_input
       } else {  
                set fichier [tk_getOpenFile -title "Fichier pin à ouvrir"]
              }
    
    if {$fichier != ""} {
        
        if {$nbr_element != 0} {
            vider
        }
        
        set handle [open $fichier "r"]
        
        while { [gets $handle ligne] >= 0 } {
            scan $ligne "%s %s %s" nom largeur hauteur
            set database($id,nom) $nom
            set database($id,largeur) $largeur
            set database($id,hauteur) $hauteur 
            incr id
        }
        
        close $handle
        
        set nbr_element $id
        incr nbr_element -1
        
        espace 
        
        # création du GUI
        gui 
        
        # remplissage des champs
        for {set ligne 0} {$ligne <= $nbr_element} {incr ligne}   {
            .t.f0.f.canvas.e_largeur$ligne insert end $database($ligne,largeur)
            .t.f0.f.canvas.e_hauteur$ligne insert end $database($ligne,hauteur)
        }
 
     } 
        tk_messageBox -icon info -message "Terminé"
        
}
#*********************************************************************************************************************    
proc vider {} {
    
    global nbr_element
          
    for {set ligne 0} {$ligne <= $nbr_element} {incr ligne}   {
        .t.f0.f.canvas.e_largeur$ligne delete 0 end
        .t.f0.f.canvas.e_hauteur$ligne delete 0 end
    }       
}    
#*********************************************************************************************************************    
proc gui {} {

    set x 0
    
    global nbr_element
    global database
    global position
    global couche
    global coord_y
    global y 
    
    espace
    
    frame .t.f0.f
    pack configure .t.f0.f -side left -fill both -expand 1 
    scrollbar .t.f0.f.scrollv -orient vertical -command ".t.f0.f.canvas yview" 
    pack configure .t.f0.f.scrollv -side right -fill y -expand 1 
    canvas .t.f0.f.canvas -height 500 -width 500 -bg yellow -scrollregion "0 0 1000 $y" -yscrollcommand ".t.f0.f.scrollv set" 
    pack configure .t.f0.f.canvas -side top -expand 1 -fill both 
    
    .t.f0.f.canvas create text 100 25 -text "Largeur" -anchor n
    .t.f0.f.canvas create text 180 25 -text "Hauteur" -anchor n
    
    #.t.f0.f.canvas.entry$i insert end "Edit this text"
    
     for {set i 0} {$i <= $nbr_element} {incr i} {
        entry .t.f0.f.canvas.e_largeur$i -width 10 -relief sunken
        .t.f0.f.canvas create window 100 $coord_y($i) -window .t.f0.f.canvas.e_largeur$i
        entry .t.f0.f.canvas.e_hauteur$i -width 10 -relief sunken
        .t.f0.f.canvas create window 180 $coord_y($i) -window .t.f0.f.canvas.e_hauteur$i
        
        .t.f0.f.canvas create text 10 $coord_y($i) -text "$database($i,nom):" -anchor n    
    
        set option_position$i "LEFT"
        tk_optionMenu .t.f0.f.canvas.opt_position$i option_position$i "LEFT" "RIGHT" "TOP" "BOTTOM"
        .t.f0.f.canvas create window 300 $coord_y($i) -window .t.f0.f.canvas.opt_position$i
    
        set option_active$i "SEL"
        tk_optionMenu .t.f0.f.canvas.opt_active$i option_active$i "SEL" "NA"
        .t.f0.f.canvas create window 380 $coord_y($i) -window .t.f0.f.canvas.opt_active$i
        
        set option_couche$i "M1"
        tk_optionMenu .t.f0.f.canvas.opt_couche$i option_couche$i "M1" "M2" "M3" "M4"
        .t.f0.f.canvas create window 450 $coord_y($i) -window .t.f0.f.canvas.opt_couche$i
        
        label .transfert_position$i -textvariable option_position$i
        label .transfert_couche$i -textvariable option_couche$i
        
    }
}
#*********************************************************************************************************************
proc espace {} {
    
    global y
    global coord_y
    global nbr_element
    
    set y 50
   
    for {set i 0} {$i <= $nbr_element} {incr i} {
        set coord_y($i) [expr {$y + (25 * $i) }]
        puts " ---> $coord_y($i)"
    }
     
    parray coord_y
   
    incr i -1
    set y [expr {$coord_y($i) +50 }]    
}    
#*********************************************************************************************************************
proc sauver {} {

    global database 
    global nbr_element
    global saisie_fichier_output
          
    rafraichir_db
    
    if {$saisie_fichier_output != "" } {
        set fichier $saisie_fichier_output
       } else {  
                set fichier [tk_getOpenFile -title "Fichier pin à ouvrir"]
              }
    
    if {$fichier != ""} {      
    
        set handle [open $fichier w]
        
        for {set ligne 0} {$ligne <= $nbr_element } {incr ligne}   {
        
            set position [.transfert_position$ligne cget -text]
            set couche [.transfert_couche$ligne cget -text]
        
            puts $handle "$database($ligne,nom) $database($ligne,largeur) $database($ligne,hauteur) $position $couche"
        }
            close $handle
    }
    
    tk_messageBox -icon info -message "Terminé"
}
#*********************************************************************************************************************    
proc rafraichir_db {}  {
        
        global database 
        global nbr_element 
        
        for {set ligne 0} {$ligne <= $nbr_element } {incr ligne}   {
        
            set L [.t.f0.f.canvas.e_largeur$ligne get]
            set H [.t.f0.f.canvas.e_hauteur$ligne get]
             
            set database($ligne,largeur) $L
            set database($ligne,hauteur) $H
        }
 }
#*********************************************************************************************************************    
proc message_fichier_input {} {
        wm deiconify .dialogue_box01
}
#*********************************************************************************************************************    
proc boite_dialogue_fichier_input {} {

        global retour

        toplevel .dialogue_box01
	wm title .dialogue_box01 "Fichier :"
        
        frame .dialogue_box01.content
        pack .dialogue_box01.content
       
       message .dialogue_box01.content.text -aspect 1000 -justify left -text " Saisir le chemin du fichier à charger "
       
       button .dialogue_box01.content.valider -text "Valider" -command {
                        wm withdraw .dialogue_box01
                        set saisie_fichier_input [.dialogue_box01.content.e get]
                        puts "Fichier cible en stream in :$saisie_fichier_input"
                        charger
                        }
        button .dialogue_box01.content.annuler -text "Annuler" -command { wm withdraw .dialogue_box01 }                        
                        
        label .dialogue_box01.content.l -text "Chemin :"
        entry .dialogue_box01.content.e -width 20 -relief sunken -bd 2 -textvariable name
        
        pack .dialogue_box01.content.text
        pack .dialogue_box01.content.l .dialogue_box01.content.e -side left
        pack .dialogue_box01.content.valider .dialogue_box01.content.annuler -side left
        wm withdraw .dialogue_box01
}
#*********************************************************************************************************************
proc message_fichier_output {} {
        wm deiconify .dialogue_box02
}
#*********************************************************************************************************************    
proc boite_dialogue_fichier_output {} {

        global retour

        toplevel .dialogue_box02
	wm title .dialogue_box02 "Saisir le chemin du fichier à sauver"
        
        frame .dialogue_box02.content
        pack .dialogue_box02.content

        message .dialogue_box02.content.text -aspect 200 -font helvetica -justify center -textvariable message
       
        button .dialogue_box02.content.valider -text "Valider" -command {
                        wm withdraw .dialogue_box02
                        set saisie_fichier_output [.dialogue_box02.content.e get]
                        puts "Fichier cible en stream out:$saisie_fichier_output"
                        sauver
                        }
        button .dialogue_box02.content.annuler -text "Annuler" -command { wm withdraw .dialogue_box02 }                        
                        
        label .dialogue_box02.content.l -text "Chemin :"
        entry .dialogue_box02.content.e -width 20 -relief sunken -bd 2 -textvariable name
        
        pack .dialogue_box02.content.text
        pack .dialogue_box02.content.l .dialogue_box02.content.e -side left
        pack .dialogue_box02.content.valider .dialogue_box02.content -side left
        wm withdraw .dialogue_box02
}

#*********************************************************************************************************************
set message "Fichier :"
boite_dialogue_fichier_input 
boite_dialogue_fichier_output 

#makeconfirm    