;**********************************************
; Gestione Agenda Contatti
; Descrizione : questa funzione gestisce una
; semplice Rubrica contatti con AutoLISP,
; tale rubrica conterrā solo nomi, cognomi e 
; indirizzi email.
;
; Lo scopo di questa procedura č quello di
; dimostrare l'utilizzo di liste e dei file
;
; Autore : Roberto Rossi
; Versione : 1.0.0
;**********************************************
;**********************************************
;
; In questo programma viene utilizzata le
; variabili pubbliche
;
; PubLstContatti 
; PubFileContatti
;
; che conterranno rispettivamente l'elenco
; contatti e il nome del file della rubrica
;
;**********************************************

;gestisce la rubrica
;permette il caricamento, il salvataggio,
;l'aggiunta di un contatto, la rimozione di un
;contatto, la visualizzazione della rubrica
(defun c:Rubrica( / risposta)
(while (/= risposta "Fine")
 (initget 1 "Nuova Carica Salva Visualizza Aggiungi Elimina Fine")
 (if pubFileContatti
  (princ (strcat "\n File Rubrica : " pubFileContatti))
  (princ "\n File Rubrica : NESSUNO ")
 );endif
 (Setq risposta (getkword "\n Operazione da compiere Nuova/Carica/Salva/Visualizza/Aggiungi/Elimina/Fine : "))
 (cond
  ((= risposta "Nuova")
    (Rubrica_New)
  )
  ((= risposta "Carica")
    (Rubrica_Load)
  )
  ((= risposta "Salva")
    (Rubrica_Save)
  )
  ((= risposta "Visualizza")
    (Visual_Rubrica)
  )
  ((= risposta "Aggiungi")
    (add_Rubrica) 
  )
  ((= risposta "Elimina")
    (Remove_Rubrica)
  )
 );Endc
);Endw

);enddef

;inizializza una nuova rubrica
(defun Rubrica_New ( / nomeFile idf riga listaC)
  (setq PubLstContatti nil)
  (setq PubFileContatti (get_fRunbrica 1))
);enddef

;carica la rubrica
(defun Rubrica_Load ( / nomeFile idf nome cognome mail)
(setq PubLstContatti nil)
(setq PubFileContatti (get_fRunbrica 0))
(if PubFileContatti
 (progn
  (setq idf (open PubFileContatti "r"))
      (setq nome "")
      (while nome
        (setq nome (read-line idf))
        (if nome
         (progn
          (setq cognome (read-line idf))
          (setq mail (read-line idf))
          (setq PubLstContatti (cons (list nome cognome mail) PubLstContatti))
         );endp
        );endif
      );endw
    (close idf)
    (Alert "Rubrica Caricata con successo")
  );endp
);endif
(prin1)
);enddef

;salva la rubrica nel file indicato
(defun Rubrica_Save ( / idf elemento)
(if PubFileContatti
  (progn
    (setq idf (open PubFileContatti "w"))
    (foreach elemento PubLstContatti
      (write-line (car elemento) idf)
      (write-line (cadr elemento) idf)
      (write-line (caddr elemento) idf)
    );endfor
    (close idf)
    (Alert "Rubrica Salvata con successo")
  );endp
  (progn
    (alert "Nessuna Rubrica Selezionata!")
  );endp
);endif
(prin1)
);enddef

;visualizza tutti gli elementi della rubrica
(defun Visual_Rubrica ( / elemento i)
(setq i 0)
(textscr)
(foreach elemento PubLstContatti
  (princ (strcat "\n Contatto N." (itoa i)))
  (princ (strcat "\n Nome : " (car elemento)))
  (princ (strcat "\n Cognome : " (cadr elemento)))
  (princ (strcat "\n E-Mail : " (caddr elemento)))
  (princ "\n +----------")
  (setq i (1+ i))
);endfor
(princ "\n\n\n")
(prin1)
);enddef

;visualizza un elemento della rubrica
(defun Visual_Rubrica_El ( nelemento / elemento)
(setq elemento (nth nelemento PubLstContatti))
(if elemento
 (progn
  (textscr)
  (princ (strcat "\n Contatto N." (itoa nelemento)))
  (princ "\n +---------+")
  (princ (strcat "\n Nome : " (car elemento)))
  (princ (strcat "\n Cognome : " (cadr elemento)))
  (princ (strcat "\n E-Mail : " (caddr elemento)))
  (princ "\n +----------")
 );Endp
);endif
(prin1)
);enddef

;aggiunge un elemento alla rubrica
(defun add_Rubrica ( / elemento nome cognome mail)
(setq nome (getstring "\nNome : "))
(setq cognome (getstring "\nCognome : "))
(setq mail (getstring "\nE-Mail : "))
(setq PubLstContatti (cons (list nome cognome mail) PubLstContatti))
(prin1)
);enddef


;elimina l'elemento n dalla rubrica
(defun Remove_Rubrica ( / nelemento )
(setq nelemento (getint "\nIndicare il numero del contatto da rimuovere : "))
(if nelemento
  (progn
    (setq PubLstContatti (RemoveEl_fromList nelemento PubLstContatti))
  );endp
);endif
(prin1)
);enddef

;scegli il file della rubrica e ne restituisce
;nome completo di percorso
(defun get_fRunbrica ( flag / )
  (getfiled "Scelta Rubrica" "rubrica.rbl" "rbl" flag)
);enddef

;rimuove l'elemento numero nelemento dalla lista
;(il primo elemento č 0)
;ritorna la lista senza l'elemento indicato
(defun RemoveEl_fromList ( nelemento lista / newl idf)
(setq newl nil)
(setq idx 0)
(if lista
  (progn
    (foreach elemento lista
      (if (/= nelemento idx)
        (progn
          (setq newl (cons elemento newl))
        );Endp
      );endif
      (setq idx (1+ idx))
    );endif
  );endp
);Endif
newl
);enddef