Salome HOME
PN changement de la place des boutons et des lignes edit pour affichage bouton parametre
[tools/eficas.git] / Editeur / plusieursbasepanel.py
1 # -*- coding: utf-8 -*-
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
9 #
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 #
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
18 #
19 #
20 # ======================================================================
21 # Modules Python
22 import string,types,os
23 from Tkinter import *
24 import Pmw
25 from copy import copy,deepcopy
26 import traceback
27
28 # Modules Eficas
29 import Objecttreeitem
30 import prefs
31 import panels
32 import images
33 from widgets import showinfo
34 from widgets import askopenfilename
35 from widgets import ListeChoix
36 from widgets import FenetreDeSelection
37 from widgets import FenetreDeParametre
38
39 from Noyau.N_CR import justify_text
40 from utils import substract_list
41 from plusieurspanel import PLUSIEURS_Panel
42
43
44
45 class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
46   """
47   Classe définissant le panel associé aux mots-clés qui demandent
48   à l'utilisateur de donner une liste de valeurs qui ne sont pas
49   à choisir dans une liste discrètes et qui sont de type de base :
50   entier, réel, string,...
51   """
52   def makeValeurPage(self,page):
53       """
54       Crée la page de saisie d'une liste de valeurs à priori quelconques,
55       cad qui ne sont  pas à choisir dans une liste prédéfinie
56       """
57       # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
58       # et la liste des valeurs déjà affectées à l'objet courant
59       bulle_aide=self.get_bulle_aide()
60       objet_mc = self.node.item.get_definition()
61       aide = self.get_aide()
62       aide = justify_text(texte=aide)
63       min,max = self.node.item.GetMinMax()
64       l_valeurs = self.node.item.GetListeValeurs()
65
66       # création des frames globales
67       self.frame1 = Frame(page,relief='groove',bd=2)
68       self.frame2 = Frame(page)
69       self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
70       self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
71       self.frame_right = Frame(self.frame1)
72       self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
73
74       # création des frames internes
75       self.frame_valeurs = Frame(self.frame1)
76       self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
77       self.frame_boutons_fleches = Frame(self.frame_right)
78       self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
79       self.frame_choix = Frame(self.frame_right)
80       self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.8)
81       self.frame_aide = Frame(self.frame_right)
82       self.frame_aide.place(relx=0.1,rely=0.8,relwidth=0.8,relheight=0.2)
83       self.frame_boutons = Frame(self.frame2)
84       self.frame_boutons.place(relx=0.35,rely=0.,relwidth=0.3,relheight=1.)
85       for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
86                  self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
87           fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
88           fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
89
90       # création des objets dans les frames
91       liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
92                                  ("<Button-3>",self.deselectValeur),
93                                  ("<Double-Button-1>",self.sup_valeur_sans_into))
94       self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
95                                       titre="Valeur(s) actuelle(s)")
96
97       # Création de l'entry ou de la liste des SD
98       # PN : pour ajouter les validators
99       self.label = Label(self.frame_choix,text="Valeur :")
100       self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
101       self.label.place(relx=0.05,rely=0.3)
102
103       # Création d'un bouton "Importer ..." et d'un bouton "Paramatres" sur le panel.
104       bouton_valeurs_fichier = Button(self.frame_choix,
105                                       text="Importer",
106                                       command=self.select_in_file)
107       bouton_valeurs_fichier.place(relx=0.28,rely=0.4,relwidth=0.6)
108       bouton_parametres = Button(self.frame_choix, text="Parametres", command=self.affiche_parametre)
109       bouton_parametres.place(relx=0.28,rely=0.6,relwidth=0.6)
110       self.ajout_valeurs = None
111
112       # boutons Ajouter et Supprimer
113       bouton_add = Button(self.frame_boutons_fleches,
114                           image = images.get_image('arrow_left'),
115                           command = self.add_valeur_plusieurs_base)
116       bouton_sup = Button(self.frame_boutons_fleches,
117                           image = images.get_image('arrow_right'),
118                           command = self.sup_valeur_sans_into)
119       bouton_add.place(relx=0.3,rely=0.35)
120       bouton_sup.place(relx=0.3,rely=0.65)
121       # affichage de l'aide
122       self.frame_aide.update()
123       self.aide = Label(self.frame_aide,
124                         text = aide,
125                         justify='center',
126                         anchor='center',
127                         wraplength=int(self.frame_aide.winfo_width()*0.8))
128       self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
129       self.Liste_valeurs.affiche_liste()
130       # boutons Accepter et Annuler
131       bouton_accepter = Button(self.frame_boutons,
132                                text='Valider',
133                                command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
134       bouton_annuler = Button(self.frame_boutons,
135                               text = 'Annuler',
136                               command = self.annule_modifs_valeur)
137       for but in (bouton_accepter,bouton_annuler):
138           but.pack(side='left',padx=5)
139
140   def affiche_parametre(self) :
141       if self.node.item.get_liste_param_possible() != [ ]:
142          txtparam=""
143          for param in self.node.item.get_liste_param_possible():
144             txtparam=txtparam+repr(param)+"\n"
145          if txtparam=="":
146             showerror("Aucun parametre ","Pas de parametre de ce type")
147          else :
148             self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
149
150
151   def add_valeur_plusieurs_base(self,name=None):
152       if name != None :
153          valeur = name
154       else:
155          valeur,validite,commentaire=self.get_valeur()
156          if not validite :
157             self.parent.appli.affiche_infos(commentaire)
158             return
159
160       encorevalide=self.node.item.valide_item(valeur)
161       if encorevalide :
162          listecourante=self.Liste_valeurs.get_liste()
163          encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
164          if not encorevalide : encorevalide = -1
165       self.add_valeur_sans_into(valeur,encorevalide)
166     
167   def select_in_file(self):
168       """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
169       nom_fichier = askopenfilename(title="Choix fichier :")
170
171       if not nom_fichier:
172           return
173
174       try:
175           f = open(nom_fichier, "rb")
176           selection_texte = f.read()
177           f.close()
178           self.ajout_valeurs = FenetreDeSelection(self, 
179                                                   self.node.item,
180                                                   self.parent.appli,
181                                                   titre="Sélection de valeurs",
182                                                   texte=selection_texte)
183       except:
184           traceback.print_exc()
185           showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
186           
187   def get_bulle_aide(self):
188       """
189       Retourne l'aide associée au panneau courant
190       """
191       return """Taper dans la boîte de saisie de droite la valeur que
192       vous voulez affecter au mot-clé simple.
193       - Cliquez sur la flèche gauche ou pressez <Return> pour la faire glisser
194       dans la liste des valeurs que vous voulez affecter au mot-clé simple
195       - Un clic sur une valeur de la liste la sélectionne
196       - Un clic sur la flèche droite ou un double-clic retire la valeur
197       sélectionnée de la liste
198       - Cliquez sur 'Valider' pour que la nouvelle valeur désirée soit affectée
199       au mot-clé simple
200       - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
201       depuis le dernier clic sur 'Valider'"""
202
203   def get_aide(self):
204       """
205       Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
206       que saisit l'utilisateur
207       """
208       commentaire=""
209       mc = self.node.item.get_definition()
210       d_aides = { 'TXM' : 'chaînes de caractères',
211                   'R'   : 'réels',
212                   'I'   : 'entiers',
213                   'C'   : 'complexes'}
214       type = mc.type[0]
215       if not d_aides.has_key(type) : return 'Type de base inconnu'
216       if mc.min == mc.max:
217           commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min`  + " est attendue"
218       else :
219           commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
220
221       aideval=self.node.item.aide()
222       commentaire=commentaire +"\n"+aideval
223       return commentaire
224
225   def make_entry(self,frame,command):
226       """
227       Crée l'entry de saisie de la valeur souhaitée : distingue le
228       cas d'un complexe attendu, d'une autre valeur quelconque
229       """
230       if self.node.item.wait_complex():
231           self.typ_cplx=StringVar()
232           self.typ_cplx.set('RI')
233           rb1 = Radiobutton(frame, text='RI',variable=self.typ_cplx,value='RI')
234           rb2 = Radiobutton(frame, text='MP',variable=self.typ_cplx,value='MP')
235           self.entry1 = Pmw.EntryField(frame,validate='real')
236           self.entry2 = Pmw.EntryField(frame,validate='real')
237           rb1.place(relx=0.05,rely = 0.4)
238           rb2.place(relx=0.05,rely = 0.6)
239           self.entry1.component('entry').bind("<Return>",lambda e,s=self:s.entry2.component('entry').focus)
240           self.entry2.component('entry').bind("<Return>",lambda e,c=command:c())
241           self.entry1.place(relx=0.27,rely = 0.5,relwidth=0.35)
242           self.entry2.place(relx=0.65,rely = 0.5,relwidth=0.35)
243           self.entry1.focus()
244       else:
245           self.entry = Entry(frame,relief='sunken')
246           self.entry.place(relx=0.28,rely=0.2,relwidth=0.6)
247           self.entry.bind("<Return>",lambda e,c=command:c())
248           self.entry.focus()
249
250   def get_valeur(self):
251       """
252       Retourne la valeur saisie par l'utilisateur dans self.entry
253       """
254       if hasattr(self,'entry'):
255          # Traitement d'une entree unique
256          valeurentree = self.entry.get()
257          valeur,validite=self.node.item.eval_valeur(valeurentree)
258          if not validite :
259             commentaire = "impossible d'évaluer : %s " %`valeurentree`
260          else:
261             commentaire = ""
262          return valeur,validite,commentaire
263       else:
264          # Traitement d'une entree de type complexe
265          try:
266             valeur= (self.typ_cplx.get(),
267                      string.atof(self.entry1.get()),
268                      string.atof(self.entry2.get()))
269             return valeur,1,""
270          except:
271             #traceback.print_exc()
272             return None,0,"impossible d'évaluer la valeur d'entree"
273
274   def erase_valeur(self):
275       """
276       Efface la valeur donnée par l'utilisateur dans l'entry
277       """
278       if hasattr(self,'entry'):
279          self.entry.delete(0,END)
280       else:
281          self.typ_cplx.set('RI')
282          self.entry1.delete(0,END)
283          self.entry2.delete(0,END)
284
285         
286   def display_valeur(self,val=None):
287       """
288       Affiche la valeur passée en argument dans l'entry de saisie.
289       Par défaut affiche la valeur du mot-clé simple
290       """
291       if not val :
292           valeur = self.node.item.object.getval()
293       else:
294           valeur = val
295       if not valeur : return
296
297       if hasattr(self,'entry'):
298          # Traitement d'une entree unique
299          self.entry.delete(0,END)
300          self.entry.insert(0,str(valeur))
301       else:
302          # Traitement d'une entree de type complexe
303          typ_cplx,x1,x2=valeur
304          self.entry1.delete(0,END)
305          self.entry2.delete(0,END)
306          self.typ_cplx.set(typ_cplx)
307          self.entry1.setentry(x1)
308          self.entry2.setentry(x2)
309
310