X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=Editeur%2Fwidgets.py;h=30cabe747566be78ea628ca33bea2c57554fe2fc;hb=1a558db360a84dcacd7bfaf1212ef75c6e4939fd;hp=1d648f27f6cdc1731ea54d5b82eafa150227b626;hpb=e2de84a8af4248fbaa60779dcd59c633474354a0;p=tools%2Feficas.git diff --git a/Editeur/widgets.py b/Editeur/widgets.py index 1d648f27..30cabe74 100644 --- a/Editeur/widgets.py +++ b/Editeur/widgets.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- # CONFIGURATION MANAGEMENT OF EDF VERSION # ====================================================================== # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG @@ -22,6 +23,7 @@ # EFICAS # ---------------------------------------------------------- +import Tkinter from Tkinter import * import Pmw import os,sys,re,string @@ -35,6 +37,19 @@ from utils import save_in_file from centerwindow import centerwindow from Noyau.N_utils import repr_float +from Accas import AsException + +# Surcharge de la fonction askyesno qui retourne un resultat errone en Python 2.3 avec Tk 8.4 +# et Tkinter.wantobject==1 +import tkMessageBox +def askyesno(title=None, message=None, **options): + "Ask a question; return true if the answer is yes" + s = tkMessageBox._show(title, message, tkMessageBox.QUESTION, tkMessageBox.YESNO, **options) + if s == tkMessageBox.YES:return 1 + if s == tkMessageBox.NO:return 0 + if s:return 1 + return 0 + class Fenetre : """ Cette classe permet de créer une fenêtre Toplevel dans laquelle @@ -114,7 +129,7 @@ class Fenetre : #initialdir = self.appli.CONFIGURATION.rep_user, initialdir = self.appli.CONFIGURATION.initialdir, title="Sauvegarde du "+self.titre) - if file != '': + if file : if not save_in_file(file,self.texte) : showerror("Sauvegarde impossible", "Impossible de sauvegarder le texte dans le fichier spécifié\n"+ @@ -122,6 +137,12 @@ class Fenetre : else: showinfo("Sauvegarde effectuée","Sauvegarde effectuée dans le fichier %s" %file) + def destroy(self): + try : + self.fenetre.destroy() + except : + pass + class FenetreYesNo(Fenetre): def __init__(self,appli,titre="",texte="",yes="Yes",no="No"): self.appli=appli @@ -170,8 +191,14 @@ class FenetreDeSelection(Fenetre): """ Classe dérivée de Fenêtre permettant la récupération d'une zone de texte sélectionnée. Cette classe est utilisée pour affecter une liste de valeurs à un mot-clé. """ - def __init__(self,panel,item,appli,titre="",texte=""): + def __init__(self,panel,item,appli,titre="",texte="",cardinal=1): Fenetre.__init__(self,appli,titre=titre,texte=texte) + self.frame_boutons.place_forget() + self.frame_texte.place_forget() + self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.8) + self.frame_boutons.place(relheight=0.2,relx=0,rely=0.8,relwidth=1.) + + self.cardinal=cardinal self.fenetre.configure(width = 320,height=400) centerwindow(self.fenetre) self.panel = panel @@ -179,7 +206,7 @@ class FenetreDeSelection(Fenetre): self.fenetre.title(titre) self.but_save.configure(text="Ajouter",command=self.traite_selection) # séparateur par défaut - self.separateur = ";" + self.separateur = ';' # création de la zone de saisie du séparateur l_separateurs_autorises = self.get_separateurs_autorises() self.choix_sep = Pmw.ComboBox(self.frame_boutons, @@ -194,8 +221,12 @@ class FenetreDeSelection(Fenetre): # Replacement self.but_quit.place_forget() self.but_save.place_forget() - self.but_save.place(relx=0.6,rely=0.5,anchor='center') - self.but_quit.place(relx=0.8,rely=0.5,anchor='center') + self.but_all = Button(self.frame_boutons,text = "Tout Sélectionner", command=self.tout) + self.but_save.place(relx=0.6,rely=0.6,anchor='center') + self.but_quit.place(relx=0.8,rely=0.6,anchor='center') + self.but_all.place(relx=0.7,rely=0.2,anchor='center') + self.choose_separateur('espace') + def get_separateurs_autorises(self): """ @@ -212,12 +243,23 @@ class FenetreDeSelection(Fenetre): else: self.separateur = nom_sep - def traite_selection(self): + def tout(self): + liste=[] + texte=self.texte.splitlines() + for l in texte : + for mot in string.split(l,self.separateur): + if mot != '' and mot != ' ' and mot != self.separateur : + liste.append(mot) + self.traite_selection(liste) + + def traite_selection(self,liste=None): """ Cette méthode effectue tous les traitements nécessaires pour vérifier et affecter la liste de valeurs à l'objet réprésenté par self.item """ # Récupère la liste des chaines de caractères de la zone sélectionnée - message,liste = self.recupere_liste() + message="" + if liste == None: + message,liste = self.recupere_liste() if self.test_probleme(message,"Sélectionnez des données") == 0: return # Vérifie que le nombre de données est dans les limites attendues @@ -233,6 +275,24 @@ class FenetreDeSelection(Fenetre): if self.test_probleme(message,"Vérifiez le domaine des valeurs") == 0: return # Ajoute les valeurs dans la liste de valeurs du mot-clé + if self.cardinal != 1 : + nb=self.cardinal + l_valeurs=[] + # a ameliorer + if (len(liste_valeurs)%nb != 0): + message="La cardinalité n'est pas correcte" + self.test_probleme(message,"On attend des tuples") + return + for i in range(len(liste_valeurs)/nb) : + if (nb==2): + t=(liste_valeurs[i*nb], liste_valeurs[i*nb+1]) + elif (nb ==3): + t=(liste_valeurs[i*nb], liste_valeurs[i*nb+1], liste_valeurs[i*nb+2]) + else : + print "probleme : prevenir la maintenance Eficas" + return + l_valeurs.append(t) + liste_valeurs=l_valeurs self.ajouter_valeurs(liste_valeurs) self.appli.affiche_infos("Liste de valeurs acceptée") @@ -317,7 +377,7 @@ class FenetreDeSelection(Fenetre): éléments dans le type voulu en cas de succès, sinon retourne None. """ liste_valeurs = [] - message = "" + message = "" for chaine in liste: if f_conversion: try: @@ -348,6 +408,64 @@ class FenetreDeSelection(Fenetre): liste.extend(liste_valeurs) self.panel.Liste_valeurs.put_liste(liste) +class FenetreDeParametre(Fenetre) : + def __init__(self,parent,item,appli,texte): + self.parent=parent + self.appli=appli + self.fenetre = Toplevel() + self.fenetre.configure(width = 250,height=100) + self.fenetre.protocol("WM_DELETE_WINDOW", self.quit) + self.fenetre.title("Parametres") + self.titre = "Parametres" + self.texte = string.replace(texte,'\r\n','\n') + fonte=fontes.standardcourier10 + + # définition des frames + self.frame_texte = Frame(self.fenetre) + self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.7) + # définition de la zone texte et du scrollbar + self.zone_texte = Text(self.frame_texte,font=fonte) + self.zone_texte.bind("", self.page_up) + self.zone_texte.bind("", self.page_down) + self.zone_texte.bind("", self.unit_up) + self.zone_texte.bind("", self.unit_down) + self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview) + self.scroll_v.pack(side='right',fill ='y') + self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10) + self.zone_texte.configure(yscrollcommand=self.scroll_v.set) + # affichage du texte + self.affiche_texte(self.texte) + self.zone_texte.config(state="disabled") + + # définition des boutons + self.frame_boutons = Frame(self.fenetre) + self.frame_boutons.place(relheight=0.3,relx=0,rely=0.65,relwidth=1.) + self.label1 = Label(self.frame_boutons,text="surligner la") + self.label2 = Label(self.frame_boutons,text="ligne entière") + self.label1.place(relx=0.1,rely=0) + self.label2.place(relx=0.1,rely=0.5) + self.but_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit) + self.but_save = Button(self.frame_boutons,text = "Choisir",command = self.Choisir) + self.but_save.place(relx=0.6,rely=0,relheight=1) + self.but_quit.place(relx=0.8,rely=0,relheight=1) + + + def Choisir(self): + try: + selection=self.zone_texte.selection_get() + except: + showerror("Pas de donnée sélectionnée", + "Selectionner un parametre") + l_param = "" + for param in selection.splitlines(): + nomparam=param[0:param.find("=")-1] + if nomparam != '' : + l_param=l_param+nomparam+',' + self.parent.entry.delete(0,Tkinter.END) + self.parent.entry.insert(0,l_param[0:-1]) + self.parent.valid_valeur() + self.quit() + class Formulaire: """ Cette classe permet de créer une boîte Dialog dans laquelle @@ -550,7 +668,7 @@ class Formulaire: class ListeChoix : """ Cette classe est utilisée pour afficher une liste de choix passée en paramètre en passant les commandes à lancer suivant différents bindings """ - def __init__(self,parent,page,liste,liste_commandes=[],liste_marques =[],active ='oui',filtre='non',titre=''): + def __init__(self,parent,page,liste,liste_commandes=[],liste_marques =[],active ='oui',filtre='non',titre='',optionReturn=None): self.parent = parent self.page = page self.liste = liste @@ -562,6 +680,7 @@ class ListeChoix : self.active = active self.titre = titre self.filtre = filtre + self.optionReturn = optionReturn self.init() def init(self): @@ -598,6 +717,7 @@ class ListeChoix : self.MCbox.pack(fill='y',expand=1,padx=2,pady=2) self.MCbox.configure(yscrollcommand=self.MCscroll.set) + def affiche_liste(self): """ Affiche la liste dans la fenêtre""" liste_labels=[] @@ -612,8 +732,23 @@ class ListeChoix : elif type(objet) in (types.StringType,types.IntType): mot = objet elif type(objet) == types.FloatType : - #mot = repr_float(objet) - mot = str(objet) + mot = self.parent.get_valeur_texte(objet) + if mot == "" : + mot = str(objet) + elif type(objet) == types.TupleType : + mot="(" + premier=1 + for val in objet: + if (not premier): + mot=mot+"," + else: + premier=0 + valtexte = self.parent.get_valeur_texte(val) + if valtexte != "" : + mot=mot+valtexte + else: + mot=mot+str(val) + mot=mot+")" else: mot=`objet` label = Label(self.MCbox, @@ -625,6 +760,9 @@ class ListeChoix : window=label, stretch = 1) self.MCbox.insert(END,'\n') + if self.optionReturn != None : + label.bind("",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c)) + label.bind("",lambda e,s=self,x=objet,l=label : s.selectNextItem(x,l)) if self.active == 'oui': 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)) @@ -639,13 +777,59 @@ class ListeChoix : self.MCbox.config(state=DISABLED) self.selection = None + def clear_marque(self): + try: + self.dico_labels[self.arg_selected].configure(bg='gray95',fg='black') + self.arg_selected = '' + except : + pass + + def surligne(self,marque): + try : + self.highlightitem(self.dico_labels[marque]) + self.arg_selected = marque + except: + pass + + def chooseitemsurligne(self,mot,label,commande): + """ Active la méthode de choix passée en argument""" + try: + mot=self.arg_selected + commande(mot) + except AsException,e: + raison=str(e) + showerror(raison.split('\n')[0],raison) + def chooseitem(self,mot,label,commande): """ Active la méthode de choix passée en argument""" - commande(mot) + try: + commande(mot) + except AsException,e: + raison=str(e) + showerror(raison.split('\n')[0],raison) + + def selectNextItem(self,mot,label): + try : + index=self.liste.index(mot) + indexsuivant=index+1 + motsuivant=self.liste[indexsuivant] + labelsuivant=self.dico_labels[motsuivant] + self.clear_marque() + if self.selection != None : + self.deselectitem(self.selection[1],self.selection[0],self.selection[2],) + self.selection = (mot,label,self.selection[2]) + self.highlightitem(labelsuivant) + self.arg_selected=motsuivant + labelsuivant.focus_set() + # PN il faut faire quelque chose pour être dans la fenetre + except: + pass + def selectitem(self,mot,label,commande) : """ Met l'item sélectionné (représenté par son label) en surbrillance et lance la commande associée au double-clic""" + self.clear_marque() if self.selection != None : self.deselectitem(self.selection[1],self.selection[0],self.selection[2],) self.highlightitem(label) @@ -667,6 +851,17 @@ class ListeChoix : self.arg_selected = '' if commande != None : commande(mot) + def cherche_selected_item(self): + index=self.MCbox.index(self.selection[1]) + lign,col=map(int,string.split(index,'.')) + return lign + + def remove_selected_item(self): + index=self.MCbox.index(self.selection[1]) + lign,col=map(int,string.split(index,'.')) + del self.liste[lign-1] + self.affiche_liste() + 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 """ @@ -680,6 +875,10 @@ class ListeChoix : self.MCbox.see(index) self.arg_selected = arg break + try : + self.dico_labels[self.arg_selected].focus_set() + except : + pass def get_liste_old(self): return self.liste @@ -691,17 +890,17 @@ class ListeChoix : def get_liste(self): l=[] for val in self.liste: - try: - v = eval(val) - l.append(v) - except: +# try: +# v = eval(val) +# l.append(v) +# except: l.append(val) return l def put_liste(self,liste): self.liste = liste self.affiche_liste() - + class Affichage : """ Cette classe permet d'afficher au lancement d'EFICAS le message d'attente et la barre de progression""" @@ -932,6 +1131,7 @@ class ListeChoixParGroupes(ListeChoix) : 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)) for marque in self.liste_marques: try: