From 25956a3d3e5ceec1397957be47ee27be715d9f8a Mon Sep 17 00:00:00 2001 From: eficas <> Date: Wed, 29 May 2002 10:56:55 +0000 Subject: [PATCH] CCAR:ajout de l'aide EFICAS et desactivation modifications mots cles inconnus --- AIDE/__init__.py | 12 ++ AIDE/aide_gui.py | 212 +++++++++++++++++++++++++++++++++ AIDE/aide_objets.py | 76 ++++++++++++ AIDE/index_aide.py | 24 ++++ Aster/prefs.py | 5 + Aster/sdist.py | 2 + Editeur/bureau.py | 5 +- Editeur/fenetre_mc_inconnus.py | 13 +- 8 files changed, 342 insertions(+), 7 deletions(-) create mode 100644 AIDE/__init__.py create mode 100644 AIDE/aide_gui.py create mode 100644 AIDE/aide_objets.py create mode 100644 AIDE/index_aide.py diff --git a/AIDE/__init__.py b/AIDE/__init__.py new file mode 100644 index 00000000..e4fa4596 --- /dev/null +++ b/AIDE/__init__.py @@ -0,0 +1,12 @@ +import os +import aide_objets +import aide_gui + +def go(fichier=None,master=None): + if not fichier : + fichier=os.path.join(os.path.dirname(__file__),"index_aide.py") + index = aide_objets.INDEX(fichier) + index.build() + o = aide_gui.AIDE_GUI(index,master=master) + o.build() + return o diff --git a/AIDE/aide_gui.py b/AIDE/aide_gui.py new file mode 100644 index 00000000..50aa3ce6 --- /dev/null +++ b/AIDE/aide_gui.py @@ -0,0 +1,212 @@ +""" +Ce module génère l'IHM permettant d'accéder à l'aide en ligne d'une application(ex: EFICAS) +Il analyse l'objet index passé en argument et génére automatiquement en conséquence le menu +avec liens hyper texte +""" + +from Tkinter import * + +class AIDE_GUI: + """ + Classe définissant l'IHM de l'appli d'aide + """ + def __init__(self,objet,master=None): + self.objet = objet + self.master = master + self.init() + self.init_window() + self.init_frames() + self.init_buttons() + self.init_text() + + def init(self): + """ + Initialise les structures de données utlisées par l'objet + """ + self.padx = [0,0,0,0] + self.padx[0] = 0 + self.padx[1] = 30 + self.padx[2] = 50 + self.historique = [] + + def init_window(self): + """ + Initialise la fenêtre mère de l'appli + """ + fenetre = Toplevel() + if self.master : + self.fenetre = fenetre + else: + self.fenetre = fenetre.master + fenetre.destroy() + self.fenetre.title(self.objet.titre) + self.fenetre.geometry("700x700+50+50") + self.fenetre.resizable(1,1) + #self.fenetre.minsize(600,800) + #self.fenetre.maxsize(900,800) + self.fenetre.protocol("WM_DELETE_WINDOW",self.quit) + self.fenetre.update() + + def init_frames(self): + """ + Initialise les frames principales de l'appli + """ + self.frame1 = Frame(self.fenetre,relief='flat',bd=2) + self.frame2 = Frame(self.fenetre,relief='flat',bd=2) + self.frame1.grid(row=0,column=0,sticky='news') + self.frame2.grid(row=1,column=0,sticky='news') + self.fenetre.grid_columnconfigure(0,weight=1,minsize=0) + self.fenetre.grid_rowconfigure(1,minsize=30) + self.fenetre.grid_rowconfigure(0,weight=1,minsize=0) + + def init_buttons(self): + """ + Crée les boutons dans le bas de la fenêtre + """ + self.b_retour = Button(self.frame2,text = "Précédent",command=self.go_back) + self.b_retour.place(relx=0.33,rely=0.5,anchor='center') + Button(self.frame2,text="Fermer",command=self.quit).place(relx=0.66,rely=0.5,anchor='center') + + + def init_text(self): + """ + Construit le widget Text qui accueillera l'index et les fichiers + """ + self.scroll_v = Scrollbar(self.frame1) + self.scroll_v.grid(row=0,column=1,rowspan=2,sticky='nesw') + self.scroll_h = Scrollbar(self.frame1,orient='horizontal') + self.scroll_h.grid(row=1,column=0,rowspan=2,sticky='nesw') + self.canvas = Canvas(self.frame1, + bg='white', + relief='sunken', + scrollregion=(0,0,1000,1000), + yscrollcommand=self.scroll_v.set, + xscrollcommand=self.scroll_h.set) + self.canvas.grid(row=0,column=0,sticky='nesw') + self.scroll_v.configure(command=self.canvas.yview) + self.scroll_h.configure(command=self.canvas.xview) + self.frame1.grid_columnconfigure(0,weight=1,minsize=0) + self.frame1.grid_rowconfigure(0,weight=1,minsize=0) + self.frame1.grid_rowconfigure(1,minsize=10) + self.frame1.grid_columnconfigure(1,minsize=10) + + def build(self): + """ + Lance la construction dynamique de l'index en hyper texte + """ + self.frame1.update_idletasks() + largeur = self.frame1.winfo_width() + self.canvas.create_rectangle(0,0,1,1,outline='white') + self.y_courant = 0 + # Construction du titre encadré d'une bordure + titre = self.canvas.create_text(int(largeur/2),50,anchor='center',text=self.objet.titre,font="Helvetica 12 bold") + bbox = self.canvas.bbox(titre) + bordure = self.canvas.create_rectangle(bbox[0]-5,bbox[1]-5,bbox[2]+5,bbox[3]+5, + outline = 'black', + fill = 'grey75') + self.canvas.lower(bordure) + self.y_courant += 100 + # Construction des items + for item in self.objet.l_items : + self.build_item(item,0) + # Affichage du texte dans le fichier associé (s'il existe) + if self.objet.fichier : + try: + texte=open(self.objet.fichier,'r').read() + except: + texte="Fichier %s inaccessible" % self.objet.fichier + self.canvas.create_text(10,self.y_courant+20, + text=texte, + anchor='nw') + # Configuration dynamique des boutons + self.config_boutons() + # + self.canvas.config(scrollregion=self.canvas.bbox('all')) + + def config_boutons(self): + """ + Activation du bouton précédent s'il y a lieu + """ + if self.historique : + self.b_retour.config(state='normal') + else : + self.b_retour.config(state='disabled') + + def build_item(self,item,padx): + """ + Affiche l'item dans le menu décalé de padx + """ + l = Label(self.canvas, + text=item.titre, + foreground = 'blue', + background='white', + font="Helvetica 12 bold") + l.bind("",lambda e,s=self,o=item : s.update_objet(o)) + l.bind("",lambda e,s=self,o=l : s.select_label(o)) + l.bind("",lambda e,s=self,o=l : s.deselect_label(o)) + self.canvas.create_window(self.padx[padx],self.y_courant,window=l,anchor='w') + self.y_courant += 20 + for sub_item in item.l_items : + self.build_item(sub_item,padx+1) + + def show_file(self,fichier): + """ + Affiche le fichier passé en argument + """ + print "on veut afficher :",fichier + + def select_label(self,label): + """ + Callback invoqué lorsque le label passé en argument est sélectionné + """ + label.config(fg='white',bg='blue') + + def deselect_label(self,label): + """ + Callback invoqué lorsque le label passé en argument est sélectionné + """ + label.config(bg='white',fg='blue') + + def go_back(self): + """ + Affiche l'item précédent + """ + self.update_objet(self.historique[-1]) + self.historique = self.historique[0:-1] + # Configuration dynamique des boutons + self.config_boutons() + + def update_objet(self,new_objet): + """ + Cette méthode remplace l'objet courant par new_objet. + Elle vide le widget text et affiche le nouvel objet + """ + if not self.historique : + self.historique.append(self.objet) + elif new_objet is not self.historique[-1] : + self.historique.append(self.objet) + self.objet = new_objet + self.canvas.delete('all') + self.build() + + def quit(self): + """ + Ferme l'appli Aide + """ + self.fenetre.destroy() + + + + + + + + + + + + + + + + diff --git a/AIDE/aide_objets.py b/AIDE/aide_objets.py new file mode 100644 index 00000000..e8e923fd --- /dev/null +++ b/AIDE/aide_objets.py @@ -0,0 +1,76 @@ +""" +Ce module génère un objet INDEX par lecture et interprétation du fichier texte +le décrivant (ex : index_aide.py) +""" + +import os + +class ITEM_INDEX : + """ + Construit un objet ITEM_INDEX + """ + def __init__(self,t_item): + self.t_item = t_item + self.init() + + def init(self): + """ + Initialise les structures de données de l'item + """ + self.titre = "" + self.fichier = "" + self.l_items = [] + + def build(self): + """ + Construit les sous-items de self s'il y a lieu et retoruve le label et le fichier de l'item + dans le tuple + """ + self.titre = self.t_item[0] + self.fichier = self.t_item[1] + l_items = self.t_item[2] + if l_items : + for item in l_items : + o = ITEM_INDEX(item) + o.build() + self.l_items.append(o) + +class INDEX : + """ + Construit un objet INDEX (non graphique) à partir de l'interprétation du fichier d'index + (type index_aide.py) passé en argument + """ + def __init__(self,fichier_index): + self.fichier_index = fichier_index + self.init() + + def init(self): + """ + Initialise les structures de données propres à l'index + """ + self.titre = "" + self.fichier = None + self.l_items = [] + + def build(self): + """ + Lit le fichier index et l'interprète + """ + txt = open(self.fichier_index,'r').read() + d = {} + d['repertoire']=os.path.dirname(self.fichier_index) + #txt = "items ="+txt + #print txt + exec txt in d + items = d.get("items",None) + if items : + self.titre = items[0] + self.fichier = items[1] + l_items = items[2] + for item in l_items : + o = ITEM_INDEX(item) + o.build() + self.l_items.append(o) + + + diff --git a/AIDE/index_aide.py b/AIDE/index_aide.py new file mode 100644 index 00000000..6c462c81 --- /dev/null +++ b/AIDE/index_aide.py @@ -0,0 +1,24 @@ +""" +Contient la description des fichiers d'aide et leur structuration + +chaque panneau est un tuple de 3 éléments : + +- élément 1 : titre de la page +- élément 2 : URL du fichier à afficher quand on visualise cette page d'aide ou None si aucun +- élément 3 : tuple contenant les sous-panneaux de ce panneau (tuple de 3-tuples) ou None si aucun + +La variable repertoire est initialisee avec le chemin du repertoire local +""" + +import os + +items =("Aide en ligne EFICAS",None, + ( + ("FAQs",os.path.join(repertoire,"..","Editeur","faqs.txt"),None), + ("Install",os.path.join(repertoire,"..","INSTALL"), + ( + ("Procedure d'installation",os.path.join(repertoire,"..","README_install"),None), + ) + ), + ), + ) diff --git a/Aster/prefs.py b/Aster/prefs.py index 78c10406..816b25ca 100644 --- a/Aster/prefs.py +++ b/Aster/prefs.py @@ -41,6 +41,7 @@ ICONDIR=os.path.join(INSTALLDIR,'Editeur','icons') labels= ('Fichier','Edition','Jeu de commandes', # 'Catalogue','Browsers','Options' + 'Aide', ) extensions=['readercata','bureau', @@ -73,6 +74,10 @@ menu_defs={ 'bureau': [ ('Mots-clés inconnus','mc_inconnus'), ] ), + ('Aide',[ + ('Aide EFICAS','aideEFICAS'), + ] + ), ] } diff --git a/Aster/sdist.py b/Aster/sdist.py index 3266d6c1..1b22da3e 100644 --- a/Aster/sdist.py +++ b/Aster/sdist.py @@ -39,6 +39,8 @@ def main(): copyfiles('../Ihm',os.path.join(path_distrib,'Ihm'),['*.py']) copyfiles('../Extensions',os.path.join(path_distrib,'Extensions'),['*.py']) copyfiles('../Accas',os.path.join(path_distrib,'Accas'),['*.py']) + copyfiles('../AIDE',os.path.join(path_distrib,'AIDE'),['*.py']) + copyfiles('../AIDE/fichiers',os.path.join(path_distrib,'AIDE/fichiers'),['*']) copyfiles('../Aster',os.path.join(path_distrib,'Aster'),['prefs.py', 'editeur.ini', 'eficas_aster.py', diff --git a/Editeur/bureau.py b/Editeur/bureau.py index 92da9ad6..cbbf0194 100644 --- a/Editeur/bureau.py +++ b/Editeur/bureau.py @@ -32,6 +32,7 @@ import splash import prefs import convert import generator +import AIDE from jdcdisplay import JDCDISPLAY from utils import extension,stripPath,save_in_file from widgets import Fenetre,Ask_Format_Fichier @@ -570,6 +571,8 @@ class BUREAU: l_mc = self.JDCDisplay_courant.jdc.get_liste_mc_inconnus() o = fenetre_mc_inconnus(l_mc) l = o.wait_new_list() - print "mc_inconnus_new_list: ",l + #print "mc_inconnus_new_list: ",l #CCAR: Il n' y a pas de retour vers le JDC + def aideEFICAS(self): + AIDE.go(master=self.parent) diff --git a/Editeur/fenetre_mc_inconnus.py b/Editeur/fenetre_mc_inconnus.py index 8a36c726..e2b4cf78 100644 --- a/Editeur/fenetre_mc_inconnus.py +++ b/Editeur/fenetre_mc_inconnus.py @@ -71,7 +71,7 @@ class fenetre_mc_inconnus : Affichage du label dans la zone concernée """ txt = " Un ou plusieurs mots-clés inconnus ont été trouvés dans le fichier de commandes." - txt = txt + "En cliquant sur leur nom, vous pourrez soit corriger l'orthographe soit supprimer ce mot-clé" + #txt = txt + "En cliquant sur leur nom, vous pourrez soit corriger l'orthographe soit supprimer ce mot-clé" self.fenetre.update_idletasks() Label(self.frame1, text = txt, @@ -96,8 +96,8 @@ class fenetre_mc_inconnus : e = Entry(self.frame2) e.grid(row=i,column=0,sticky=W) e.insert(END,nom_mc) - e.bind("",lambda event,en=e,m=mc,s=self : s.select_mc(m,en)) - e.bind("",lambda e,s=self : s.modifie_mc()) + #e.bind("",lambda event,en=e,m=mc,s=self : s.select_mc(m,en)) + #e.bind("",lambda e,s=self : s.modifie_mc()) e.configure(relief='flat',state='disabled') self.widgets.append((e,lab)) i=i+1 @@ -120,9 +120,10 @@ class fenetre_mc_inconnus : self.b_quit = Button(self.frame3, text = "Fermer", command = self.quit) - self.b_mod.place(relx=0.25,rely=0.5,anchor='center') - self.b_sup.place(relx=0.50,rely=0.5,anchor='center') - self.b_quit.place(relx=0.75,rely=0.5,anchor='center') + #self.b_mod.place(relx=0.25,rely=0.5,anchor='center') + #self.b_sup.place(relx=0.50,rely=0.5,anchor='center') + #self.b_quit.place(relx=0.75,rely=0.5,anchor='center') + self.b_quit.place(relx=0.50,rely=0.5,anchor='center') def wait_new_list(self): """ -- 2.39.2