From 96014afb071588fb0cc5fcc2affb0a6a26992202 Mon Sep 17 00:00:00 2001 From: eficas <> Date: Wed, 13 Apr 2005 14:59:31 +0000 Subject: [PATCH] CCAR: modification pour ajouter les options a la ligne de commande (voir Editeur/session.py) debut de modification pour editer un include apres avoir charge le fichier de commandes principal correction de problemes avec les commandes rangees par groupe + binding des touches fleches pour deplacement. ajout du fichier de configuration utilisateur prefs.py dans Eficas_install --- Aster/eficas_aster.py | 7 +-- Aster/prefs.py | 8 ++- Editeur/appli.py | 46 ++++++++++----- Editeur/bureau.py | 17 +++--- Editeur/compojdc.py | 8 +++ Editeur/compomacro.py | 16 ++++- Editeur/eficas_go.py | 9 +-- Editeur/jdcdisplay.py | 1 + Editeur/macrodisplay.py | 50 +++++++++++++++- Editeur/panels.py | 15 +++-- Editeur/readercata.py | 29 +++++----- Editeur/treewidget.py | 3 +- Editeur/widgets.py | 119 ++++++++++++++++++++++++++++++++++---- Extensions/jdc_include.py | 13 +++++ Ihm/I_JDC.py | 20 ++++++- Ihm/I_MACRO_ETAPE.py | 32 +++++++--- 16 files changed, 313 insertions(+), 80 deletions(-) diff --git a/Aster/eficas_aster.py b/Aster/eficas_aster.py index 8d4c9e15..c5bb96b5 100755 --- a/Aster/eficas_aster.py +++ b/Aster/eficas_aster.py @@ -41,9 +41,4 @@ sys.path[:0]=[prefs.INSTALLDIR] import Editeur from Editeur import eficas_go -if len(sys.argv) > 1 : - # on veut ouvrir un fichier directement au lancement d'Eficas - eficas_go.lance_eficas(code='ASTER',fichier = sys.argv[1]) -else: - # on veut ouvrir Eficas 'vide' - eficas_go.lance_eficas(code='ASTER') +eficas_go.lance_eficas(code='ASTER') diff --git a/Aster/prefs.py b/Aster/prefs.py index 6ed3b4f5..22a0a58b 100644 --- a/Aster/prefs.py +++ b/Aster/prefs.py @@ -19,7 +19,7 @@ # # ====================================================================== -import os +import os,sys # REPINI sert à localiser le fichier editeur.ini # Obligatoire @@ -90,3 +90,9 @@ menu_defs={ 'bureau': [ ] } +userprefs=os.path.expanduser("~/Eficas_install/prefs.py") +if os.path.isfile(userprefs): + try: + execfile(userprefs) + except: + pass diff --git a/Editeur/appli.py b/Editeur/appli.py index 3b2e2d30..e85c79f8 100644 --- a/Editeur/appli.py +++ b/Editeur/appli.py @@ -40,45 +40,55 @@ import tooltip import properties from widgets import Fenetre from Misc import MakeNomComplet +import session VERSION="EFICAS v1.7" class APPLI: def __init__ (self,master,code='ASTER',fichier=None,test=0) : - self.top=master self.code=code + self.top=master self.top.protocol("WM_DELETE_WINDOW",self.exitEFICAS) self.top.minsize(900,500) self.top.geometry("900x500") self.top.title(VERSION + ' pour '+self.code) self.top.withdraw() self.initializeTk(master) + Pmw.initialise(master) + self.dict_reels={} self.liste_simp_reel=[] # L'attribut test permet d'activer les panneaux de splash et d'erreur (test=0) # Si test est different de 0, les panneaux ne sont pas activés self.test=test - Pmw.initialise(master) + + # Lecture des parametres de configuration (fichier global editeur.ini + # et utilisateur eficas.ini) self.lecture_parametres() + self.format_fichier = Tkinter.StringVar() self.message='' + # Avant la creation du bureau qui lit le catalogue + self.version_code=session.d_env.cata + + # Creation de la menubar, toolbar, messagebar self.cree_composants_graphiques() - self.load_appli_composants() # Creation du BUREAU + # Creation des autres composants graphiques dont le bureau (parametrable par prefs.py) + self.load_appli_composants() + # PN : ajout d un attribut pour indiquer si # l appli a ete lance depuis Salome self.salome=0 if (self.test == 0): splash.fini_splash() - self.affiche_FAQ() - # AY : cas ou le nom du fichier a été passé en argument - if fichier : - fich=str(MakeNomComplet.FILENAME(fichier)) - if not os.path.isfile(fich): - showerror("Fichier inexistant", "Fichier %s en argument n'existe pas" % fich) - else: - self.bureau.openJDC( fich) - # AY : fin + #self.affiche_FAQ() + cwd=os.getcwd() + # Ouverture des fichiers de commandes donnes sur la ligne de commande + for study in session.d_env.studies: + os.chdir(cwd) + d=session.get_unit(study,self) + self.bureau.openJDC(study["comm"],d) def send_message(self,message): self.message=message @@ -100,10 +110,9 @@ class APPLI: def cree_composants_graphiques(self): """ - Cree les constituants de l'application : + Cree les constituants graphiques fixes de l'application : - menubar - toolbar - - bureau - statusbar """ if (self.test == 0): @@ -121,6 +130,13 @@ class APPLI: self.statusbar=statusbar.STATUSBAR(self.top) def load_appli_composants(self): + """ + Cree les autres constituants graphiques de l'application : + - bureau + - readercata + - ... + Cette creation est parametrable par fichier prefs.py + """ if (self.test == 0): splash._splash.configure(text = "Chargement des appli_composants") for mname in self.appli_composants: @@ -136,7 +152,7 @@ class APPLI: def affiche_FAQ(self): import faq - #faq.affiche(self.top) + faq.affiche(self.top) def affiche_infos(self,message): self.statusbar.affiche_infos(message) diff --git a/Editeur/bureau.py b/Editeur/bureau.py index 86c7841b..8bcafcad 100644 --- a/Editeur/bureau.py +++ b/Editeur/bureau.py @@ -153,7 +153,7 @@ class BUREAU: self.ShowJDC(J,self.JDCName) self.appli.toolbar.active_boutons() - def ShowJDC(self,JDC,nom,label_onglet=None): + def ShowJDC(self,JDC,nom,label_onglet=None,JDCDISPLAY=JDCDISPLAY): """ Lance l'affichage du JDC cad création du JDCDisplay Rajoute le JDCDisplay à la liste des JDCDisplay si label_onglet == None cad si on crée @@ -161,9 +161,8 @@ class BUREAU: """ self.JDC=JDC self.JDCName = self.JDC.nom = nom - #XXX CCAR: pour le moment mis en commentaire - #self.JDC.set_context() if label_onglet == None : + # On veut un nouvel onglet label_onglet = self.GetLabelJDC() self.nb.add(label_onglet,tab_text = nom,tab_width=20) new = 'oui' @@ -236,7 +235,7 @@ class BUREAU: texte_cr = str(cr) self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr) - def openJDC(self,file=None): + def openJDC(self,file=None,units=None): """ Demande à l'utilisateur quel JDC existant il veut ouvrir """ @@ -249,8 +248,10 @@ class BUREAU: if not hasattr(self,'initialdir'): #self.initialdir = self.appli.CONFIGURATION.rep_user self.initialdir = self.appli.CONFIGURATION.initialdir + if file.__class__.__name__ in ('Event',): file=None + if not file : file = askopenfilename(title="Ouverture d'un fichier de commandes Aster", defaultextension=".comm", @@ -260,11 +261,9 @@ class BUREAU: self.fileName = file e=extension_fichier(file) self.JDCName=stripPath(file) - self.initialdir = os.path.dirname(file) + self.initialdir = os.path.dirname(os.path.abspath(file)) else : return - #XXX CCAR: pour le moment mis en commentaire - #if self.JDCDisplay_courant:self.JDCDisplay_courant.jdc.unset_context() format=self.appli.format_fichier.get() # Il faut convertir le contenu du fichier en fonction du format @@ -295,6 +294,10 @@ class BUREAU: nom = self.JDCName, rep_mat=self.appli.CONFIGURATION.rep_mat, ) + if units is not None: + J.recorded_units=units + J.old_recorded_units=units + J.analyse() txt_exception = J.cr.get_mess_exception() if txt_exception : diff --git a/Editeur/compojdc.py b/Editeur/compojdc.py index 66cfd986..29eccf59 100644 --- a/Editeur/compojdc.py +++ b/Editeur/compojdc.py @@ -107,10 +107,12 @@ class JDCTreeItem(Objecttreeitem.ObjectTreeItem): return range(len(self.object.etapes)) def additem(self,name,pos): + print self.object if isinstance(name,Objecttreeitem.ObjectTreeItem) : cmd=self.object.addentite(name.getObject(),pos) else : cmd = self.object.addentite(name,pos) + print cmd item = self.make_objecttreeitem(self.appli,cmd.nom + " : ", cmd) return item @@ -154,6 +156,12 @@ class JDCTreeItem(Objecttreeitem.ObjectTreeItem): """ Retourne la liste des noms des étapes de self.object""" return self.object.get_l_noms_etapes() + def get_liste_cmd(self): + print "get_liste_cmd" + print self.object.niveau.definition + listeCmd = self.object.niveau.definition.get_liste_cmd() + return listeCmd + import Accas treeitem =JDCTreeItem diff --git a/Editeur/compomacro.py b/Editeur/compomacro.py index 5f8861fa..ef087426 100644 --- a/Editeur/compomacro.py +++ b/Editeur/compomacro.py @@ -37,7 +37,7 @@ from widgets import showinfo,showerror # __version__="$Name: $" -__Id__="$Id: compomacro.py,v 1.14 2004/09/20 09:24:14 eficas Exp $" +__Id__="$Id: compomacro.py,v 1.15 2005/03/10 09:25:30 eficas Exp $" # class MACROPanel(panels.OngletPanel): @@ -144,7 +144,7 @@ class MACROPanel(panels.OngletPanel): # Si probleme a la lecture-conversion on arrete le traitement if not text: return - self.node.item.object.recorded_units={} + #self.node.item.object.recorded_units={} try: self.node.item.object.make_contexte_include(new_fic,text) @@ -236,7 +236,17 @@ class MACROTreeItem(compooper.EtapeTreeItem): panel=MACROPanel class INCLUDETreeItem(MACROTreeItem): - rmenu_specs=[("View","makeView")] + rmenu_specs=[("View","makeView"), + ("Edit","makeEdit"), + ] + + def makeEdit(self,appli): + print "makeEdit",self.object,self.object.nom + print self.object.jdc_aux,self.object.jdc_aux.nom + # On cree un nouvel onglet dans le bureau + appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom, + label_onglet=None, + JDCDISPLAY=macrodisplay.MACRODISPLAY) def makeView(self,appli): nom=self.object.nom diff --git a/Editeur/eficas_go.py b/Editeur/eficas_go.py index b1b897f8..79a1bb01 100644 --- a/Editeur/eficas_go.py +++ b/Editeur/eficas_go.py @@ -23,25 +23,26 @@ un ecran Splash pour faire patentier l'utilisateur """ # Modules Python +import sys import Tkinter # Modules Eficas import import_code import splash +import session def lance_eficas(code,fichier=None): """ Lance l'appli EFICAS """ + # Analyse des arguments de la ligne de commande + options=session.parse(sys.argv) root = Tkinter.Tk() splash.init_splash(root,code=code,titre="Lancement d'EFICAS pour %s" %code) splash._splash.configure(text="Chargement d'EFICAS en cours.\n Veuillez patienter ...") import eficas - if fichier : - eficas.EFICAS(root,code=code,fichier = fichier) - else: - eficas.EFICAS(root,code=code) + eficas.EFICAS(root,code=code) root.mainloop() diff --git a/Editeur/jdcdisplay.py b/Editeur/jdcdisplay.py index 58625dbf..8ac5a82f 100644 --- a/Editeur/jdcdisplay.py +++ b/Editeur/jdcdisplay.py @@ -162,6 +162,7 @@ class JDCDISPLAY: if hasattr(node.item,"panel"): self.panel_courant=node.item.panel(self,self.pane.pane('selected'),node) else: + print node.item raise Exception("Le noeud sélectionné n'a pas de panel associé") else: self.panel_courant = panels.Panel_Inactif(self,self.pane.pane('selected'),node) diff --git a/Editeur/macrodisplay.py b/Editeur/macrodisplay.py index 37959615..563b307f 100644 --- a/Editeur/macrodisplay.py +++ b/Editeur/macrodisplay.py @@ -30,9 +30,12 @@ import Tkinter,Pmw import images import tooltip import Objecttreeitem +import compojdc +import treewidget from widgets import Fenetre -class MACRO2TreeItem(Objecttreeitem.ObjectTreeItem): +#class MACRO2TreeItem(Objecttreeitem.ObjectTreeItem): +class MACRO2TreeItem(compojdc.JDCTreeItem): def IsExpandable(self): return 1 @@ -146,3 +149,48 @@ class MacroDisplay: def makeMacroDisplay(appli,jdc,nom_jdc): return MacroDisplay(appli,jdc,nom_jdc) +class TREEITEMINCANVAS: + def __init__(self,object,nom="",parent=None,appli=None,sel=None,rmenu=None): + print "TREEITEMINCANVAS",object + self.object=object + self.nom=nom + self.appli=appli + self.parent=parent + + self.item=MACRO2TreeItem(self.appli,self.nom,self.object) + self.canvas=Pmw.ScrolledCanvas(self.parent,borderframe=1,canvas_background='gray95') + self.canvas.pack(padx=10,pady=10,fill = 'both', expand = 1) + if not sel: + def sel(event=None): + return + self.tree=treewidget.Tree(self.appli,self.item,self.canvas,command=sel,rmenu=rmenu) + self.tree.draw() + + def mainloop(self): + self.parent.mainloop() + + def update(self): + """Cette methode est utilisee pour signaler une mise a jour des objets associes""" + self.tree.update() + +import jdcdisplay + +class MACRODISPLAY(jdcdisplay.JDCDISPLAY): + def __init__(self,jdc,nom_jdc,appli=None,parent=None): + print "MACRODISPLAY",jdc + self.jdc=jdc + self.nom_jdc=nom_jdc + self.fichier=None + self.panel_courant=None + self.appli=appli + self.parent=parent + self.node_selected = None + self.modified='n' + + self.pane=Pmw.PanedWidget(self.parent,orient='horizontal') + self.pane.add('treebrowser',min=0.4,size=0.5) + self.pane.add('selected',min=0.4) + self.pane.pack(expand=1,fill='both') + self.tree=TREEITEMINCANVAS(jdc,nom_jdc,self.pane.pane('treebrowser'), + self.appli,self.select_node,self.make_rmenu) + diff --git a/Editeur/panels.py b/Editeur/panels.py index 1229e74b..7700a2ac 100644 --- a/Editeur/panels.py +++ b/Editeur/panels.py @@ -354,8 +354,8 @@ class OngletPanel(Panel) : Liste = ListeChoix(self,frame2,liste_cmd,liste_commandes = liste_commandes, filtre='oui',titre = "Commandes",optionReturn="oui") else: - liste_groupes=self.node.item.object.niveau.definition.liste_groupes - dict_groupes=self.node.item.object.niveau.definition.dict_groupes + liste_commandes=liste_commandes+(("",self.defCmd),) + liste_groupes,dict_groupes=self.get_groups() Liste = ListeChoixParGroupes(self,frame2,liste_groupes,dict_groupes, liste_commandes = liste_commandes, filtre='oui',titre = "Commandes",optionReturn="oui") @@ -378,8 +378,8 @@ class OngletPanel(Panel) : Liste = ListeChoix(self,page,liste_cmd,liste_commandes = liste_commandes, filtre='oui',titre = "Commandes",optionReturn="oui") else: - liste_groupes=self.node.item.object.niveau.definition.liste_groupes - dict_groupes=self.node.item.object.niveau.definition.dict_groupes + liste_commandes=liste_commandes+(("",self.defCmd),) + liste_groupes,dict_groupes=self.get_groups() Liste = ListeChoixParGroupes(self,page,liste_groupes,dict_groupes, liste_commandes = liste_commandes, filtre='oui',titre = "Commandes",optionReturn="oui") @@ -475,8 +475,13 @@ class OngletPanel(Panel) : listeCmd = self.cata.listCmd() return listeCmd + def get_groups(self): + jdc=self.node.item.object.get_jdc_root() + return jdc.get_groups() + def get_liste_cmd(self): - listeCmd = self.node.item.object.niveau.definition.get_liste_cmd() + jdc=self.node.item.object.get_jdc_root() + listeCmd = jdc.get_liste_cmd() return listeCmd def deselectCmd(self,name): diff --git a/Editeur/readercata.py b/Editeur/readercata.py index 2676d25f..e9badcaf 100644 --- a/Editeur/readercata.py +++ b/Editeur/readercata.py @@ -60,6 +60,8 @@ class READERCATA: self.parent=parent self.code=self.appli.code self.appli.format_fichier.set('python') + self.version_code=self.appli.version_code + self.fic_cata=None self.OpenCata() self.cataitem=None @@ -72,33 +74,31 @@ class READERCATA: if self.appli.test == 0 : splash._splash.configure(text = message1) self.configure_barre(4) + liste_cata_possibles=[] for catalogue in self.appli.CONFIGURATION.catalogues: if catalogue[0] == self.code : liste_cata_possibles.append(catalogue) - if len(liste_cata_possibles)==1: + + if self.version_code is not None: + # La version a ete fixee + for cata in liste_cata_possibles: + if self.version_code == cata[1]: + self.fic_cata = cata[2] + self.appli.format_fichier.set(cata[3]) + elif len(liste_cata_possibles)==1: self.fic_cata = liste_cata_possibles[0][2] self.code = self.appli.CONFIGURATION.catalogues[0][0] self.version_code = liste_cata_possibles[0][1] self.appli.format_fichier.set(liste_cata_possibles[0][3]) - elif len(liste_cata_possibles)==0: - # aucun catalogue défini dans le fichier Accas/editeur.ini - if self.code == 'ASTER' : - self.fic_cata = os.path.join(prefs.CODE_PATH,'Cata','cata.py') - elif self.code == 'SATURNE' : - self.fic_cata = os.path.join(prefs.CODE_PATH,'Cata','cata_saturne.py') - elif self.code == 'DESCARTES': - self.fic_cata = os.path.join(prefs.CODE_PATH,'Cata','cata_descartes.py') - else : - print 'Code inconnu' - sys.exit(0) else: # plusieurs catalogues sont disponibles : il faut demander à l'utilisateur # lequel il veut utiliser ... self.ask_choix_catalogue() + if self.fic_cata == None : - self.parent.destroy() sys.exit(0) + # détermination de fic_cata_c et fic_cata_p self.fic_cata_c = self.fic_cata + 'c' self.fic_cata_p = os.path.splitext(self.fic_cata)[0]+'_pickled.py' @@ -171,7 +171,6 @@ class READERCATA: """ Réalise l'import du catalogue dont le chemin d'accès est donné par cata """ - import imp if self.appli.test == 0 : splash._splash.configure(text = "Chargement du catalogue") nom_cata = os.path.splitext(os.path.basename(cata))[0] @@ -179,8 +178,6 @@ class READERCATA: sys.path[:0] = [rep_cata] try : o=__import__(nom_cata) - #f,p,d = imp.find_module(nom_cata) - #o = imp.load_module(nom_cata,f,p,d) return o except Exception,e: traceback.print_exc() diff --git a/Editeur/treewidget.py b/Editeur/treewidget.py index 50c6efb5..0ae0d955 100644 --- a/Editeur/treewidget.py +++ b/Editeur/treewidget.py @@ -27,7 +27,7 @@ import images # __version__="$Name: $" -__Id__="$Id: treewidget.py,v 1.18 2004/11/17 16:08:34 eficas Exp $" +__Id__="$Id: treewidget.py,v 1.19 2005/02/25 11:38:03 eficas Exp $" # Fonte_Standard = fontes.standard @@ -599,6 +599,7 @@ class Node : Interface avec ACCAS : création de l'objet de nom name et du noeud associé. Retourne le noeud fils ainsi créé """ + print "full_creation",name,pos,self.item item = self.item.additem(name,pos) if item == None or item == 0: # impossible d'ajouter le noeud de nom : name diff --git a/Editeur/widgets.py b/Editeur/widgets.py index 30cabe74..0f47fd2a 100644 --- a/Editeur/widgets.py +++ b/Editeur/widgets.py @@ -874,11 +874,13 @@ class ListeChoix : index = self.MCbox.index(self.dico_labels[arg]) self.MCbox.see(index) self.arg_selected = arg + self.dico_labels[self.arg_selected].focus_set() break - try : - self.dico_labels[self.arg_selected].focus_set() - except : - pass + + #try : + #self.dico_labels[self.arg_selected].focus_set() + #except : + #pass def get_liste_old(self): return self.liste @@ -1076,9 +1078,16 @@ class ListeChoixParGroupes(ListeChoix) : Cette classe est utilisée pour afficher une liste de commandes classées par groupes. L'utilisateur peut réaliser des actions de selection qui déclenchent des actions spécifiées par les bindings contenus dans liste_commandes + Exemple de binding: + liste_commandes = (("",self.selectCmd), + ("",self.deselectCmd), + ("",self.defCmd)) + Il s'agit d'une liste de doublets dont le premier element est un evenement et le + deuxieme un callback a appeler sur l'evenement en question. + """ def __init__(self,parent,page,liste_groupes,dict_groupes,liste_commandes=[],liste_marques =[], - active ='oui',filtre='non',titre=''): + active ='oui',filtre='non',titre='',optionReturn=None): self.parent = parent self.page = page self.liste_groupes = liste_groupes @@ -1091,6 +1100,7 @@ class ListeChoixParGroupes(ListeChoix) : self.active = active self.titre = titre self.filtre = filtre + self.optionReturn = optionReturn self.init() def affiche_liste(self): @@ -1124,14 +1134,40 @@ class ListeChoixParGroupes(ListeChoix) : window=label, stretch = 1) self.MCbox.insert(END,'\n') + + def null(*tp,**args): return + if self.active == 'oui': - label.bind(self.liste_commandes[0][0], - lambda e,s=self,c=self.liste_commandes[0][1],x=cmd,l=label : s.selectitem(x,l,c)) - label.bind(self.liste_commandes[1][0], - lambda e,s=self,c=self.liste_commandes[1][1],x=cmd,l=label : s.deselectitem(l,x,c)) - label.bind(self.liste_commandes[2][0], - lambda e,s=self,c=self.liste_commandes[2][1],x=cmd,l=label : s.chooseitem(x,l,c)) - label.bind("", self.selectNextItem(event)) + # Traitement par defaut des evenements + label.bind("",lambda e,s=self,c=null,x=cmd,l=label: s.selectitem(x,l,c)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label: s.deselectitem(l,x,c)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x)) + + # Si des callbacks sont definis on les utilise + for event,callback in self.liste_commandes: + if event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.selectitem(x,l,c)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.deselectitem(l,x,c)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x)) + else: + label.bind(event,lambda e,s=self,c=callback,x=cmd,l=label: c()) for marque in self.liste_marques: try: @@ -1142,12 +1178,68 @@ class ListeChoixParGroupes(ListeChoix) : self.MCbox.config(state=DISABLED) self.selection = None + def selectPrevItem(self,mot,label,callback,group,cmd): + g=self.liste_groupes.index(group) + liste_commandes=self.dict_groupes[group] + c=liste_commandes.index(cmd) + if c > 0: + co=liste_commandes[c-1] + else: + # debut de liste. On passe au groupe precedent + if g > 0: + gr=self.liste_groupes[g-1] + co=self.dict_groupes[gr][-1] + else: + # debut des groupes. On ne fait rien + return + + # On a trouve l'item precedent + self.clear_marque() + labelsuivant=self.dico_labels[co] + if self.selection != None : + self.deselectitem(self.selection[1],self.selection[0],self.selection[2],) + self.selection = (co,labelsuivant,self.selection[2]) + index = self.MCbox.index(labelsuivant) + self.MCbox.see(index) + self.arg_selected=co + self.highlightitem(labelsuivant) + labelsuivant.focus_set() + callback(co) + + def selectNextItem(self,mot,label,callback,group,cmd): + g=self.liste_groupes.index(group) + liste_commandes=self.dict_groupes[group] + c=liste_commandes.index(cmd) + try: + co=liste_commandes[c+1] + except: + # fin de liste. On passe au groupe suivant + try: + gr=self.liste_groupes[g+1] + co=self.dict_groupes[gr][0] + except: + # fin des groupes. On ne fait rien + return + # On a trouve l'item suivant + self.clear_marque() + labelsuivant=self.dico_labels[co] + if self.selection != None : + self.deselectitem(self.selection[1],self.selection[0],self.selection[2],) + self.selection = (co,labelsuivant,self.selection[2]) + index = self.MCbox.index(labelsuivant) + self.MCbox.see(index) + self.arg_selected=co + self.highlightitem(labelsuivant) + labelsuivant.focus_set() + callback(co) + def entry_changed(self,event=None): """ Cette méthode est invoquée chaque fois que l'utilisateur modifie le contenu de l'entry et frappe """ if self.arg_selected != '' : self.deselectitem(self.dico_labels[self.arg_selected]) + filtre = self.entry.get()+"*" FILTRE = string.upper(filtre) # @@ -1156,10 +1248,12 @@ class ListeChoixParGroupes(ListeChoix) : # for grp in self.liste_groupes: if fnmatch.fnmatch(grp,filtre) or fnmatch.fnmatch(grp,FILTRE) : + self.highlightitem(self.dico_labels[grp]) index = self.MCbox.index(self.dico_labels[grp]) self.MCbox.see(index) # On ne selectionne pas le groupe #self.arg_selected = grp + self.dico_labels[grp].focus_set() # On a trouve un groupe on arrete la recherche return @@ -1170,6 +1264,7 @@ class ListeChoixParGroupes(ListeChoix) : index = self.MCbox.index(self.dico_labels[cmd]) self.MCbox.see(index) self.arg_selected = cmd + self.dico_labels[self.arg_selected].focus_set() # On a trouve une commande on arrete la recherche return diff --git a/Extensions/jdc_include.py b/Extensions/jdc_include.py index 65c3bf10..6f577e52 100644 --- a/Extensions/jdc_include.py +++ b/Extensions/jdc_include.py @@ -110,6 +110,19 @@ class JDC_POURSUITE(JDC): return context + def get_liste_cmd(self): + """ + Retourne la liste des commandes du catalogue + """ + return self.jdc_pere.get_liste_cmd() + + def get_groups(self): + """ + Retourne la liste des commandes du catalogue par groupes + """ + return self.jdc_pere.get_groups() + + class JDC_INCLUDE(JDC_POURSUITE): def active_etapes(self): diff --git a/Ihm/I_JDC.py b/Ihm/I_JDC.py index f7ef14c0..13ef7f64 100644 --- a/Ihm/I_JDC.py +++ b/Ihm/I_JDC.py @@ -415,6 +415,18 @@ class JDC(I_OBJECT.OBJECT): """ return [] + def get_liste_cmd(self): + """ + Retourne la liste des commandes du catalogue + """ + return self.niveau.definition.get_liste_cmd() + + def get_groups(self): + """ + Retourne la liste des groupes + """ + return self.niveau.definition.liste_groupes,self.niveau.definition.dict_groupes + def set_etape_context(self,etape): """ Positionne l'etape qui sera utilisee dans NommerSdProd pour @@ -518,16 +530,22 @@ class JDC(I_OBJECT.OBJECT): print etape.nom+".state: ",etape.state def change_unit(self,unit,etape,old_unit): - if self.recorded_units.has_key(old_unit):del self.recorded_units[old_unit] + #print "change_unit",unit,etape,old_unit + #print id(self.recorded_units),self.recorded_units + #if self.recorded_units.has_key(old_unit):del self.recorded_units[old_unit] self.record_unit(unit,etape) def record_unit(self,unit,etape): """Enregistre les unites logiques incluses et les infos relatives a l'etape""" + #print "record_unit",unit,etape if unit is None: # Cas de POURSUITE self.recorded_units[None]=(etape.fichier_ini ,etape.fichier_text,etape.recorded_units) else: self.recorded_units[unit]=(etape.fichier_ini ,etape.fichier_text,etape.recorded_units) + #print id(self.recorded_units),self.recorded_units + #print self.recorded_units.get(None,(None,"",{}))[2] + #print self.recorded_units.get(None,(None,"",{}))[2].get(None,(None,"",{})) #ATTENTION SURCHARGE : cette methode doit etre gardée en synchronisation avec celle de Noyau def register(self,etape): diff --git a/Ihm/I_MACRO_ETAPE.py b/Ihm/I_MACRO_ETAPE.py index 8f21a688..26dd673a 100644 --- a/Ihm/I_MACRO_ETAPE.py +++ b/Ihm/I_MACRO_ETAPE.py @@ -63,6 +63,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): ou leve une exception --> utilisée par ops.POURSUITE et INCLUDE """ + #print "get_contexte_jdc" try: # on essaie de créer un objet JDC auxiliaire avec un contexte initial context_ini = self.parent.get_contexte_avant(self) @@ -80,12 +81,14 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): # En principe si la memorisation est faite au bon moment il n'est pas necessaire # de prendre cette precaution mais ce n'est pas vrai partout. old_recorded_units=self.recorded_units.copy() - self.recorded_units.clear() + #print "get_contexte_jdc",id(self.recorded_units) + #self.recorded_units.clear() - j=self.JdC_aux( procedure=text,cata=self.jdc.cata, - nom=fichier, - context_ini = context_ini, + j=self.JdC_aux( procedure=text, nom=fichier, appli=self.jdc.appli, + cata=self.jdc.cata, + cata_ord_dico=self.jdc.cata_ordonne_dico, + context_ini = context_ini, jdc_pere=self.jdc,etape_include=self, prefix_include=prefix_include, recorded_units=self.recorded_units, @@ -142,6 +145,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): # On recupere le contexte courant self.current_context=j.current_context self.index_etape_courante=j.index_etape_courante + self.jdc_aux=j # XXX j.supprime() ??? # On rétablit le contexte (etape courante) à self @@ -254,6 +258,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): Cette méthode sert à créer un contexte en interprétant un texte source Python """ + #print "make_contexte_include" # on récupère le contexte d'un nouveau jdc dans lequel on interprete text contexte = self.get_contexte_jdc(fichier,text) if contexte == None : @@ -294,11 +299,13 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): les noms des fichiers Ceci suppose que les relations entre unites et noms ont été memorisees préalablement """ - + #print "update_fichier_init",unite self.fichier_err=None self.old_contexte_fichier_init=self.contexte_fichier_init - if unite != self.fichier_unite or not self.parent.recorded_units.has_key(unite): + #print self,self.parent,self.parent.recorded_units + #if unite != self.fichier_unite or not self.parent.recorded_units.has_key(unite): + if not self.parent.recorded_units.has_key(unite): # Changement d'unite ou Nouvelle unite f,text=self.get_file(unite=unite,fic_origine=self.parent.nom) units={} @@ -360,10 +367,18 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): """Retourne le nom du fichier et le source correspondant a l'unite unite Initialise en plus recorded_units """ - units={} + #print "get_file_memo",unite,fic_origine,self,self.parent + #print self.parent.old_recorded_units + #print self.parent.recorded_units + if unite is None: + units={} + else: + units=self.parent.recorded_units if self.parent.old_recorded_units.has_key(unite): f,text,units=self.parent.old_recorded_units[unite] + #print id(self.recorded_units) self.recorded_units=units + #print id(self.recorded_units) return f,text elif self.jdc : f,text=self.jdc.get_file(unite=unite,fic_origine=fic_origine) @@ -380,6 +395,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): """Retourne le nom du fichier et le source correspondant a l'unite unite Initialise en plus recorded_units """ + #print "get_file",unite units={} if self.jdc : f,text=self.jdc.get_file(unite=unite,fic_origine=fic_origine) @@ -397,7 +413,7 @@ class MACRO_ETAPE(I_ETAPE.ETAPE): Sinon on retourne None. Les concepts produits par l'INCLUDE sont pris en compte par le JDC parent lors du calcul du contexte (appel de ???) """ - + #print "make_include",unite # On supprime l'attribut unite qui bloque l'evaluation du source de l'INCLUDE # car on ne s'appuie pas sur lui dans EFICAS mais sur l'attribut fichier_ini del self.unite -- 2.39.2