import types
import Pmw
import Tkinter
+from tkMessageBox import showinfo,askyesno,showerror
# Modules Eficas
import splash
import fontes
import tooltip
import properties
+from widgets import Fenetre
VERSION="EFICAS v1.3"
"""
Cree les constituants de l'application :
- menubar
- - tollbar
+ - toolbar
- bureau
- statusbar
"""
menu=menudict.get(mname)
if not menu:continue
self.cree_menu(menu,itemlist,appli_composant)
+
+ def update_jdc_courant(self):
+ self.bureau.update_jdc_courant()
+
+ def affiche_alerte(self,titre,message):
+ f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message)
+ f.wait()
+
+
CONTEXT.unset_current_step()
J=self.cata[0].JdC(cata=self.cata,
cata_ord_dico=self.cata_ordonne_dico,
- appli=self.appli)
+ appli=self.appli,
+ rep_mat=self.appli.CONFIGURATION.rep_mat,
+ )
self.JDCName=J.nom
self.fileName=None
self.ShowJDC(J,self.JDCName)
if not hasattr(self,'JDC') : return
titre="rapport de validation du jeu de commandes courant"
cr = self.JDC.report()
+ self.update_jdc_courant()
elif mode == 'CATA':
from Noyau.N_CR import CR
cr = CR()
CONTEXT.unset_current_step()
J=self.cata[0].JdC(procedure=text,appli=self.appli,
cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
- nom = self.JDCName)
+ nom = self.JDCName,
+ rep_mat=self.appli.CONFIGURATION.rep_mat,
+ )
J.analyse()
txt_exception = J.cr.get_mess_exception()
if txt_exception :
def aideEFICAS(self):
AIDE.go(master=self.parent)
+
+ def update_jdc_courant(self):
+ self.JDCDisplay_courant.update()
+
+
import Tkinter
import Pmw
from tkFileDialog import *
-from tkMessageBox import showinfo,showerror
+from tkMessageBox import showinfo,showerror,askyesno
import traceback
# Modules Eficas
import fontes
import compooper
import convert
-from widgets import Fenetre
+from widgets import Fenetre,FenetreYesNo
#
__version__="$Name: $"
-__Id__="$Id: compomacro.py,v 1.4 2002/05/15 15:31:58 eficas Exp $"
+__Id__="$Id: compomacro.py,v 1.5 2002/09/09 10:39:06 eficas Exp $"
#
class MACROPanel(panels.OngletPanel):
Tkinter.Button(page,text='Valider',command = self.change_fichier_init).place(relx=0.3,rely=0.8)
Tkinter.Button(page,text='Browse',command = self.browse_fichier_init).place(relx=0.5,rely=0.8)
Tkinter.Button(page,text='Annuler',command = self.annule_fichier_init).place(relx=0.7,rely=0.8)
- if hasattr(self.node.item.object,'fichier_init'):\r
- if self.node.item.object.fichier_init :\r
- self.entry.insert(0,self.node.item.object.fichier_init)
+ if hasattr(self.node.item.object,'fichier_ini'):
+ if self.node.item.object.fichier_ini :
+ self.entry.insert(0,self.node.item.object.fichier_ini)
self.entry.focus()
def convert_file(self,file):
"""
Effectue le changement de fichier d'initialisation s'il est valide
"""
- if not hasattr(self.node.item.object,'fichier_init'):
- self.node.item.object.fichier_init=None
- old_fic = self.node.item.object.fichier_init
+ if not hasattr(self.node.item.object,'fichier_ini'):
+ self.node.item.object.fichier_ini=None
+ self.node.item.object.fichier_text=None
+ self.node.item.object.fichier_err="Le fichier n'est pas defini"
+ self.node.item.object.contexte_fichier_init={}
+
+ old_fic = self.node.item.object.fichier_ini
+ old_text = self.node.item.object.fichier_text
+ old_err = self.node.item.object.fichier_err
+ old_context=self.node.item.object.contexte_fichier_init
+
new_fic = self.entry.get()
if not os.path.isfile(new_fic) :
showinfo("Fichier introuvable","Le fichier que vous avez saisi\n"+
return
# On convertit le fichier
text=self.convert_file(new_fic)
- if not text:return
+ # Si probleme a la lecture-conversion on arrete le traitement
+ if not text:
+ return
+
try:
- self.node.item.object.make_contexte(new_fic,text)
- self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
+ self.node.item.object.make_contexte_include(new_fic,text)
except:
- #traceback.print_exc()
+ # Erreurs lors de l'evaluation de text dans un JDC auxiliaire
+ self.parent.appli.affiche_infos("Fichier invalide")
l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
- showinfo("Fichier invalide",
- "Erreur dans l'interprétation du nouveau fichier ...\n"+
- "L'ancien va être restauré\n"+string.join(l))
+ f=FenetreYesNo(self.parent.appli,titre="Fichier invalide : voulez vous retablir l ancien fichier ?",
+ texte="Erreur dans l'interprétation du nouveau fichier ...\n\n"+string.join(l))
+ f.wait()
+ reponse=f.result
+ if reponse:
+ # On retablit l'ancien fichier
+ self.entry.delete(0,Tkinter.END)
+ self.node.item.object.fichier_ini=old_fic
+ self.node.item.object.fichier_text=old_text
+ self.node.item.object.fichier_err=old_err
+ self.node.item.object.contexte_fichier_init=old_context
+ self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré")
+ if old_fic:
+ self.entry.insert(0,self.node.item.object.fichier_ini)
+ else:
+ # On conserve la memoire du nouveau fichier
+ # mais on n'utilise pas les etapes et concepts crees par ce fichier
+ # on met l'etape en erreur : fichier_err=string.join(l)
+ self.node.item.object.init_modif()
+ self.node.item.object.fichier_ini=new_fic
+ self.node.item.object.fichier_text=text
+ self.node.item.object.fichier_err=string.join(l)
+ self.node.item.object.etapes=[]
+ self.node.item.object.g_context={}
+ # Le contexte du parent doit etre reinitialise car les concepts produits ont changé
+ self.node.item.object.parent.reset_context()
- self.entry.delete(0,Tkinter.END)
- self.parent.appli.affiche_infos("Fichier invalide")
+ self.node.item.object.old_contexte_fichier_init=old_context
+ self.node.item.object.contexte_fichier_init={}
+ self.node.item.object.reevalue_sd_jdc()
- if old_fic:
- # On convertit le fichier
- #text=self.convert_file(old_fic)
- #if not text:return
- #self.node.item.object.make_contexte(old_fic,text)
- self.node.item.object.fichier_init=old_fic
- self.entry.insert(0,self.node.item.object.fichier_init)
- self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré")
+ self.node.item.object.fin_modif()
+ self.parent.appli.affiche_infos("Fichier invalide ... Nouveau fichier mémorisé")
+ self.node.update()
return
- # si on passe ici, c'est que le new_fic a bien été correctement
- # interprété ...
- self.node.item.object.fichier_init = new_fic
- # il faut lancer la réévaluation de tout le jdc ...
+
+ # L'evaluation de text dans un JDC auxiliaire s'est bien passé
+ # on peut poursuivre le traitement
+ self.node.item.object.init_modif()
+ self.node.item.object.fichier_ini = new_fic
+ self.node.item.object.fichier_text=text
+ self.node.item.object.fichier_err=None
+ # Le contexte du parent doit etre reinitialise car les concepts produits ont changé
+ self.node.item.object.parent.reset_context()
+
+ # Si des concepts ont disparu lors du changement de fichier, on demande leur suppression
+ self.node.item.object.old_contexte_fichier_init=old_context
self.node.item.object.reevalue_sd_jdc()
- self.node.racine.update()
+
+ self.node.item.object.fin_modif()
+ self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
+ self.node.update()
def annule_fichier_init(self,event=None):
- """ retaure dans self.entry le nom de fichier_init"""
+ """ Restaure dans self.entry le nom de fichier_init"""
self.entry.delete(0,Tkinter.END)
- self.entry.insert(0,self.node.item.object.fichier_init)
+ self.entry.insert(0,self.node.item.object.fichier_ini)
def browse_fichier_init(self,event=None):
"""
Propose à l'utilisateur une Bsf et retourne le fichier
sélectionné dans self.entry
"""
- file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom(),
- # filetypes = ( ("Aster", ".comm"),("Python", ".py")),
- # defaultextension=".comm"
- )
+ file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
if file != '' :
self.entry.delete(0,Tkinter.END)
self.entry.insert(0,file)
Retourne le nom de l'icône à afficher dans l'arbre
Ce nom dépend de la validité de l'objet
"""
- if self.object.isactif():
- if self.object.state != 'unchanged':
- # Si des modifications ont eu lieu on force le calcul des concepts de sortie
- # et celui du contexte glissant
- self.object.get_type_produit(force=1)
- self.object.parent.reset_context()
+ if not self.object.isactif():
+ return "ast-white-square"
+ else:
if self.object.isvalid():
return "ast-green-square"
else:
return "ast-red-square"
- else:
- return "ast-white-square"
def GetLabelText(self):
""" Retourne 3 valeurs :
def get_noms_sd_oper_reentrant(self):
return self.object.get_noms_sd_oper_reentrant()
-import Accas
+class INCLUDE_MATERIAUTreeItem(MACROTreeItem):
+ pass
+
treeitem=MACROTreeItem
+def treeitem(appli, labeltext, object, setfunction=None):
+ if object.nom == "INCLUDE_MATERIAU":
+ return INCLUDE_MATERIAUTreeItem(appli, labeltext, object, setfunction)
+ elif object.nom == "INCLUDE":
+ return MACROTreeItem(appli, labeltext, object, setfunction)
+ else:
+ return MACROTreeItem(appli, labeltext, object, setfunction)
+
+import Accas
objet=Accas.MACRO_ETAPE
class MacroDisplay:
nb.setnaturalsize()
# ----------------------------------------------------------------------------------------
-# Méthodes utlisées pour l'affectation de la valeur donnée par l'utilisateur
+# Méthodes utilisées pour l'affectation de la valeur donnée par l'utilisateur
# au mot-clé courant
# ----------------------------------------------------------------------------------------
if name != None:
valeur =name
else :
+ #XXX Pourquoi proceder ainsi ? Il n'est pas possible de mettre
+ # None comme valeur du mot cle.
+ # Probablement que ce debranchement permet de mettre record_valeur
+ # en call back, il faut donc aller chercher la valeur dans l'entry
valeur= self.entry.get()
self.entry.delete(0,END)
+ #XXX Pour permettre la mise a None du mot cle, on remet None si valeur == ''
+ if valeur == '':valeur=None
self.node.item.set_valeur(valeur,evaluation='non')
self.parent.appli.affiche_infos(mess)
if self.node.item.get_position()=='global':
self.node.update()
if self.node.item.isvalid():
self.node.parent.select()
+
# ----------------------------------------------------------------------------------------
-# Méthodes utlisées pour la manipulation des items dans les listes de choix
+# Méthodes utilisées pour la manipulation des items dans les listes de choix
# ----------------------------------------------------------------------------------------
def selectValeur(self,name):
self.selected_valeur = name
import traceback
# Modules Eficas
+import patches
import appli
from widgets import Fenetre
self._ulfile.setentry('')
self.dialog.deactivate(result)
self.ulfile = None
- self.text=''
+ self.text=None
def get_file(self,unite=None,fic_origine = ''):
"""
showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
return None
+ def affiche_texte(self,entete,texte):
+ """Cette methode ouvre une fenetre modale dans laquelle on affiche un texte
+ """
+ self.affiche_infos(entete)
+ f=Fenetre(self, titre=entete, texte = texte)
+ f.wait()
+
# on rend la copie à nouveau possible en libérant le flag edit
self.edit="copier"
+ def update(self):
+ """Cette methode est utilisee par le JDC associe pour
+ signaler des modifications globales du JDC
+ """
+ self.tree.update()
+
Elle est toujours dérivée.
"""
def __init__(self,parent,panneau,node) :
+ # Le parent d'un panel est un objet de la classe JDCDISPLAY ou derivee
+ # ou un objet qui a les attributs : appli (de classe APPLI ou derivee),
+ # modified et la methode init_modif
self.parent=parent
self.panneau = panneau
self.node=node
--- /dev/null
+"""
+ Ce module contient des modifications mineures du comportement
+ du noyau ou de validation
+"""
+import string
+
+if 1:
+ # Modification de la fonction justify_text de Noyau.N_CR
+ separateurs=(' ',',','/')
+ def split(ligne,cesure):
+ ligne= string.rstrip(ligne)
+ if len(ligne) <= cesure :
+ return ligne
+ else:
+ coupure=cesure
+ while ligne[coupure] not in separateurs and coupure > 0:
+ coupure = coupure - 1
+ if coupure == 0:
+ # Il faut augmenter la cesure
+ coupure =cesure
+ while ligne[coupure] not in separateurs and coupure < len(ligne)-1 :
+ coupure = coupure + 1
+ if coupure == len(ligne)-1:
+ return ligne
+ else:
+ return ligne[:coupure+1]+ '\n' + split(ligne[coupure+1:],cesure)
+
+ def justify_text(texte='',cesure=50):
+ texte = string.strip(texte)
+ liste_lignes = string.split(texte,'\n')
+ l=[split(l,cesure) for l in liste_lignes]
+ texte_justifie=string.join(l,'\n')
+ return texte_justifie
+ try:
+ import Noyau.N_CR
+ Noyau.N_CR.justify_text=justify_text
+ except:
+ pass
+
+def encadre_message(texte,motif):
+ """
+ Retourne la chaine de caractères texte entourée d'un cadre formés
+ d'éléments 'motif'
+ """
+ texte = justify_text(texte,cesure=80)
+ lignes = string.split(texte,'\n')
+ longueur = 0
+ for ligne in lignes :
+ if len(ligne)> longueur : longueur = len(ligne)
+ longueur = longueur + 4
+ txt = motif*longueur+'\n'
+ for ligne in lignes :
+ txt = txt + motif + ' '+ligne+' '*(longueur-len(motif+ligne)-2)+motif+'\n'
+ txt = txt + motif*longueur+'\n'
+ return txt
+
+if __name__ == "__main__":
+ print encadre_message(motif='!',
+texte="""- Il faut au moins un mot-clé parmi : ('DEBUT', 'POURSUITE')
+- Il faut au moins un mot-clé parmi : ('FIN',)
+- Il faut qu'au moins un objet de la liste : ('DEBUT', 'POURSUITE') soit suivi d'au moins un objet de la liste : ('FIN',)
+ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,yyyyyyyyyyyyyyyy
+""")
+
+
+
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()
#
__version__="$Name: $"
-__Id__="$Id: treewidget.py,v 1.7 2002/09/10 15:59:37 eficas Exp $"
+__Id__="$Id: treewidget.py,v 1.8 2002/10/16 13:27:35 eficas Exp $"
#
Fonte_Standard = fontes.standard
for child in self.children:
child.draw(x,lasty)
lasty = child.lasty + 15
- child.trace_ligne()
- #self.update()
self.children[0].select()
self.resizescrollregion()
child.draw(x,y)
nb = child.get_nb_children()
y = y + 20*(nb+1)
+ self.trace_ligne()
def drawtext(self):
""" Affiche les deux zones de texte après l'icône de couleur de l'objet """
nb = self.get_nb_children()
self.state = 'collapsed'
self.collapse_children()
- self.efface()
- try:
- self.move(-20*nb)
- except:
- pass
- self.draw(self.x,self.y)
+ self.redraw(-nb)
self.select()
- self.update()
-
+
def expand(self,event = None):
""" Expanse self et le retrace """
if not self.item.isactif() : return
if not self.children : self.build_children()
self.state = 'expanded'
nb = self.get_nb_children()
- self.move(20*nb)
- self.efface()
- self.draw(self.x,self.y)
+ self.redraw(nb)
self.select()
- self.update()
def redraw(self,nb):
""" Redessine self : nb est le décalage à introduire
# on efface self et on le redessine
self.efface()
self.draw(self.x,self.y)
- self.update()
+ # Il n'est pas nécessaire d'appeler update
+ # il suffit d'updater les coordonnees et de retracer les lignes
+ self.racine.update_coords()
+ self.racine.trace_ligne()
def update_coords(self):
""" Permet d'updater les coordonnes de self et de tous ses enfants"""
print child
print child.item.object
- def make_visible_OBSOLETE(self,nb):
- """ Cette méthode a pour but de rendre le noeud self (avec tous ses descendants
- affichés) visible dans le canvas """
- x = self.canvas.canvasx(self.canvas.cget('width'))
- y = self.canvas.canvasy(self.canvas.cget('height'))
- #print 'x,y =',x,y
- x0,y0,x1,y1 = self.canvas.bbox(ALL)
- #print 'x0,y1=',x0,y1
- y_deb = self.y
- nb = self.get_nb_children()
- y_fin = y_deb + 20*nb
- #print 'y_deb,y_fin=',y_deb,y_fin
-
#------------------------------------------------------------------
# Méthodes de création et destruction de noeuds
# Certaines de ces méthodes peuvent être appelées depuis l'externe
"""
if not self.children : self.build_children()
if pos == None :
- #pos = len(self.children)
if type(fils) == types.InstanceType:
pos = self.item.get_index_child(fils.nom)
else:
if child == 0 :
# on n'a pas pu créer le noeud fils
return 0
- child.displayed = 1
self.state = 'expanded'
+ child.displayed = 1
+ if child.item.isactif():
+ child.state = 'expanded'
+ if not child.children : child.build_children()
if verif == 'oui':
- if not child.children : child.build_children()
test = child.item.isMCList()
if test :
child.children[-1].verif_condition()
nbnew = self.get_nb_children()
self.redraw(nbnew-nbold)
child.select()
- child.expand()
- #child.make_visible()
if retour == 'oui': return child
def delete_node_child(self,child):
def wait(self):
self.fenetre.grab_set()
+ self.zone_texte.focus_set()
self.fenetre.wait_window(self.fenetre)
def quit(self):
else:
showinfo("Sauvegarde effectuée","Sauvegarde effectuée dans le fichier %s" %file)
+class FenetreYesNo(Fenetre):
+ def __init__(self,appli,titre="",texte=""):
+ self.appli=appli
+ self.fenetre = Toplevel()
+ self.fenetre.configure(width = 800,height=500)
+ self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
+ self.fenetre.title(titre)
+ self.texte = string.replace(texte,'\r\n','\n')
+ self.titre = titre
+ fonte=fontes.standardcourier10
+ # définition des frames
+ self.frame_texte = Frame(self.fenetre)
+ self.frame_boutons = Frame(self.fenetre)
+ self.frame_boutons.place(relx=0,rely=0, relwidth=1.,relheight=0.1)
+ self.frame_texte.place( relx=0,rely=0.1, relwidth=1, relheight=0.9)
+ # définition de la zone texte et du scrollbar
+ self.zone_texte = Text(self.frame_texte,font=fonte)
+ self.zone_texte.bind("<Key-Prior>", self.page_up)
+ self.zone_texte.bind("<Key-Next>", self.page_down)
+ self.zone_texte.bind("<Key-Up>", self.unit_up)
+ self.zone_texte.bind("<Key-Down>", self.unit_down)
+ self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
+ #self.scroll_h = Scrollbar (self.frame_texte,command = self.zone_texte.xview)
+ self.scroll_v.pack(side='right',fill ='y')
+ #self.scroll_h.pack(side='bottom',fill ='x')
+ self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
+ self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
+ # définition des boutons
+ self.but_yes = Button(self.frame_boutons,text = "Yes",command=self.yes)
+ self.but_no = Button(self.frame_boutons,text = "No",command = self.no)
+ self.but_yes.place(relx=0.4,rely=0.5,anchor='center')
+ self.but_no.place(relx=0.6,rely=0.5,anchor='center')
+ # affichage du texte
+ self.affiche_texte(self.texte)
+ centerwindow(self.fenetre)
+
+ def yes(self):
+ self.result=1
+ self.quit()
+
+ def no(self):
+ self.result=0
+ self.quit()
+
class FenetreDeSelection(Fenetre):
""" Classe dérivée de Fenêtre permettant la récupération d'une zone de texte sélectionnée.\r
Cette classe est utilisée pour affecter une liste de valeurs à un mot-clé.\r
def affiche_liste(self):
""" Affiche la liste dans la fenêtre"""
- i=0
+ liste_labels=[]
self.MCbox.config(state=NORMAL)
self.MCbox.delete(1.0,END)
for objet in self.liste :
text = mot,
fg = 'black',bg = 'gray95',justify = 'left')
self.dico_labels[mot]=label
+ liste_labels.append(label)
self.MCbox.window_create(END,
window=label,
stretch = 1)
label.bind(self.liste_commandes[0][0],lambda e,s=self,c=self.liste_commandes[0][1],x=objet,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=objet,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=objet,l=label : s.chooseitem(x,l,c))
- try :
- self.liste_marques.index(i)
- self.markitem(label)
- except:
+
+ for marque in self.liste_marques:
+ try:
+ self.markitem(liste_labels[marque])
+ except:
pass
- i=i+1
+
self.MCbox.config(state=DISABLED)
self.selection = None