#!/usr/bin/ksh
#
# vim:tabstop=3:syntax=sh:
#
# ---------
## Function: menu_choix
## Version : 0.2
## Objet   : Prend des valeurs et demande laquelle on veut utiliser.
##----------------------------------------------------------------------------
# 0.1 18-fev-09 - Creation : Cedrick GAILLARD
# 0.2 19-fev-09 - menu_choix affiche maintenant une liste de choix avec
#                 plusieurs elements par ligne.
# 0.3 12-mar-09 - ajout de la variable FORCE_NB_ELEM pour n'afficher que NB
#                 elements par ligne.
#                 si le nb d'elements a afficher est < ou = au nb d'element
#                 que l'on peut afficher, il apapraissent verticalement.
# 0.4 13-mar-09 - ajout de 'argument -d $DEFAULT
#                 prise en compte de la variable $QUIET
# 0.5 06-avr-09 - ajout de l'argument -f qui force la demande de choix meme
#                 s'il n'y a qu'un choix
#                 ajout de l'argument -c pour modifier le nombre de colonnes
#                 max que l'on doit afficher
#-----------------------------------------------------------------------------
 
menu_choix () {
   # pour forcer le nombre d'elements par ligne a afficher, decommenter la ligne suivante
   #FORCE_NB_ELEM=4

   while [ "$#" -ne "0" ]
   do
      case $1
      in
         -m)   INFO=$2
               shift 2
               ;;
         -f)   # Affiche le choix meme s'il n'y en a qu'un
               VIEW=true
               shift 1
               ;;
         -c)   if [ -n "$2" -a -n "$(echo $2 |egrep "^[0-9]*.[0-9]$")" ]
                  then
                     FORCE_NB_ELEM=$2
                     shift 2
                  else
                     shift
               fi
               ;;
         -d)   if [ -n "$2" -a "$(echo $2 |cut -c1)" != "-" ]
                  then
                     DEFAULT=$2
                     shift 2
                  else
                     DEFAULT=
                     shift
               fi
               ;;
         -l)   shift 1
               LISTE="${*}"
               break
               ;;
         *)    echo "Argument $1 non reconnu"
               return 1
               ;;
      esac
   done
 
   CHOIX=
 
   [ -z "$LISTE" ] && return 1
   [ "$(echo $LISTE |wc -w)" -eq "1" -a "$VIEW" != "true" ] && {
      CHOIX=$LISTE
      return 0
   }
 
   while true
   do
      NB=0
      SIZE=0
      MESSAGE=
      MSG=
      unset TABLEAU
 
      echo ""
      echo "$INFO"
 
      for i in $LISTE
      do
         MESSAGE="$NB) $i"
 
         # La taille du message le plus grand
         M_SIZE="$(expr length "${MESSAGE}")"
         [ "$M_SIZE" -gt "$SIZE" ] && SIZE="$M_SIZE"
 
         # La liste a afficher, un choix par ligne par defaut
         MSG="$(/bin/printf "${MSG}\n${MESSAGE}")"
 
         TABLEAU[$NB]=$i
         NB="$(( $NB + 1 ))"
      done
 
      # Pour afficher une liste de choix adaptee a l'ecran
      if [ "$(tty >/dev/null ; echo $?)" = "0" ]
         then
            COLS="$(tput cols)"
 
            if [ "$?" != "0" -o -n "$(echo ${COLS} |sed 's/[0-9]//g')" ]
               then
                  echo "${MSG}"
               else
                  # On veut ajouter 4 espaces ente chaque message
                  SIZE="$(( $SIZE + 4 ))"
 
                  # Le nombre d'elememnt par ligne
                  if [ -n "$FORCE_NB_ELEM" -a "$FORCE_NB_ELEM" -gt "0" ]
                     then
                        ELEM=$FORCE_NB_ELEM
                     else
                        ELEM="$(echo "$COLS / $SIZE" |bc)"
                  fi
 
                  # On affiche les choix
                  if [ "$(echo "${MSG}" |grep -v "^$" |wc -l)" -le "$ELEM" ]
                     then
                        echo "${MSG}"
                     else
                        X=0
                        echo "${MSG}" |grep -v "^$" |while read line
                        do
                           [ "$X" -eq "$ELEM" ] && {
                              X=0
                              echo
                           }
 
                           SIZE_MSG="$(expr length "${line}")"
                           SPACE=
                           while [ "$SIZE_MSG" -ne "$SIZE" ]
                           do
                              SPACE="$SPACE "
                              SIZE_MSG="$(( $SIZE_MSG + 1 ))"
                           done
                           /bin/printf "${line}${SPACE}"
                           X="$(( $X + 1 ))"
                        done
                  fi
            fi
         else
            echo "${MSG}"
      fi
 
      echo
 
      read CHOIX?"> "
 
      [ -n "$CHOIX" -a -z "$(echo $CHOIX |tr -d "[0-9]")" ]
      if_error "Choisir une valeur dans la liste" && continue
 
      [ "$CHOIX" -lt "${#TABLEAU[*]}" ]
      if_error "Reponse incorrecte" && continue
 
      CHOIX="${TABLEAU[$CHOIX]}"
 
      [ -n "$CHOIX" ] && break
   done
 
} # -- Fin menu_choix --

